summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Jansen <jansene@google.com>2020-01-21 11:16:14 -0800
committerErwin Jansen <jansene@google.com>2020-01-21 11:16:14 -0800
commit4a1f910150bed6d8afd9c7f89a437ca7060cdaee (patch)
treedce665db6f6786b345a8695140102fb6b0a545b5
parentecc65c9cc70b672486080048efbd7917e58c2a0d (diff)
parentd39d65789639a81bc264c16aee461ea367f3803b (diff)
downloadnasm-4a1f910150bed6d8afd9c7f89a437ca7060cdaee.tar.gz
Merging nasm from chromium.
This brings in nasm, which is maintained by the chrome team. Change-Id: I424de3bd2279e42f7447b8cae687ea594ca89093
-rw-r--r--.gitignore82
-rw-r--r--.travis.yml10
-rw-r--r--AUTHORS137
-rw-r--r--BUILD.gn107
-rw-r--r--CHANGES2
-rw-r--r--ChangeLog2905
-rw-r--r--INSTALL102
-rw-r--r--LICENSE29
-rw-r--r--Makefile.in529
-rw-r--r--Mkfiles/README46
-rw-r--r--Mkfiles/msvc.mak399
-rw-r--r--Mkfiles/openwcom.mak336
-rw-r--r--OWNERS4
-rw-r--r--PRESUBMIT.py31
-rw-r--r--README.chromium68
-rw-r--r--README.md19
-rw-r--r--README.patches81
-rw-r--r--SubmittingPatches116
-rw-r--r--TODO376
-rw-r--r--aclocal.m4202
-rw-r--r--asm/assemble.c3008
-rw-r--r--asm/assemble.h54
-rw-r--r--asm/directbl.c126
-rw-r--r--asm/directiv.c515
-rw-r--r--asm/directiv.dat103
-rw-r--r--asm/directiv.h77
-rw-r--r--asm/error.c222
-rw-r--r--asm/eval.c1028
-rw-r--r--asm/eval.h49
-rw-r--r--asm/exprdump.c79
-rw-r--r--asm/exprlib.c200
-rw-r--r--asm/float.c950
-rw-r--r--asm/float.h54
-rw-r--r--asm/labels.c652
-rw-r--r--asm/listing.c355
-rw-r--r--asm/listing.h113
-rw-r--r--asm/nasm.c2017
-rw-r--r--asm/parser.c1208
-rw-r--r--asm/parser.h45
-rwxr-xr-xasm/phash.pl109
-rw-r--r--asm/pptok.c511
-rw-r--r--asm/pptok.dat96
-rw-r--r--asm/pptok.h158
-rwxr-xr-xasm/pptok.pl271
-rw-r--r--asm/pragma.c274
-rw-r--r--asm/preproc-nop.c195
-rw-r--r--asm/preproc.c5427
-rw-r--r--asm/preproc.h55
-rw-r--r--asm/quote.c479
-rw-r--r--asm/quote.h44
-rw-r--r--asm/rdstrnum.c68
-rw-r--r--asm/segalloc.c51
-rw-r--r--asm/stdscan.c350
-rw-r--r--asm/stdscan.h49
-rw-r--r--asm/strfunc.c359
-rw-r--r--asm/tokens.dat135
-rw-r--r--asm/tokens.h11
-rw-r--r--asm/tokhash.c6431
-rwxr-xr-xasm/tokhash.pl284
-rwxr-xr-xautogen.sh8
-rw-r--r--codereview.settings3
-rw-r--r--common/common.c64
-rw-r--r--config/config-linux.h544
-rw-r--r--config/config-mac.h544
-rw-r--r--config/config.h11
-rw-r--r--config/msvc.h192
-rw-r--r--config/unknown.h51
-rw-r--r--config/watcom.h74
-rw-r--r--configure.ac312
-rw-r--r--contrib/MSVC6.txt25
-rw-r--r--contrib/VSrules/nasm.README16
-rw-r--r--contrib/VSrules/nasm.rules79
-rw-r--r--disasm/disasm.c1765
-rw-r--r--disasm/disasm.h49
-rw-r--r--disasm/ndisasm.c396
-rw-r--r--disasm/sync.c132
-rw-r--r--disasm/sync.h45
-rw-r--r--doc/Makefile.in90
-rw-r--r--doc/README20
-rw-r--r--doc/afmmetrics.ph102
-rw-r--r--doc/changes.src2659
-rw-r--r--doc/findfont.ph180
-rwxr-xr-xdoc/genps.pl1294
-rw-r--r--doc/head.ps401
-rw-r--r--doc/inslist.pl108
-rw-r--r--doc/internal.doc290
-rw-r--r--doc/local.css1
-rw-r--r--doc/nasmdoc.css150
-rw-r--r--doc/nasmdoc.src8442
-rw-r--r--doc/nasmlogo.eps212
-rw-r--r--doc/nasmlogw.pngbin0 -> 1699 bytes
-rw-r--r--doc/opt_var.txt116
-rw-r--r--doc/psfonts.ph53
-rwxr-xr-xdoc/pspdf.pl118
-rw-r--r--doc/pswidth.ph25
-rw-r--r--doc/rdsrc.pl1111
-rw-r--r--doc/ttfmetrics.ph63
-rwxr-xr-xfind_patches.py266
-rwxr-xr-xgenerate_nasm_sources.py69
-rw-r--r--headers/c33
-rw-r--r--headers/doc33
-rw-r--r--headers/mac33
-rw-r--r--headers/perl33
-rw-r--r--include/bytesex.h261
-rw-r--r--include/compiler.h379
-rw-r--r--include/disp8.h45
-rw-r--r--include/error.h140
-rw-r--r--include/hashtbl.h86
-rw-r--r--include/iflag.h173
-rw-r--r--include/ilog2.h204
-rw-r--r--include/insns.h132
-rw-r--r--include/labels.h74
-rw-r--r--include/md5.h21
-rw-r--r--include/nasm.h1283
-rw-r--r--include/nasmint.h219
-rw-r--r--include/nasmlib.h414
-rw-r--r--include/opflags.h299
-rw-r--r--include/perfhash.h52
-rw-r--r--include/raa.h49
-rw-r--r--include/rbtree.h51
-rw-r--r--include/rdoff.h169
-rw-r--r--include/saa.h94
-rw-r--r--include/strlist.h60
-rw-r--r--include/tables.h70
-rw-r--r--include/ver.h46
-rwxr-xr-xinstall-sh250
-rw-r--r--macros/altreg.mac107
-rw-r--r--macros/fp.mac54
-rw-r--r--macros/ifunc.mac48
-rw-r--r--macros/macros.c641
-rwxr-xr-xmacros/macros.pl294
-rw-r--r--macros/smartalign.mac189
-rw-r--r--macros/standard.mac233
-rw-r--r--misc/Doxyfile752
-rwxr-xr-xmisc/Nindent18
-rw-r--r--misc/README2
-rw-r--r--misc/c16.mac82
-rw-r--r--misc/c32.mac52
-rw-r--r--misc/crcgen.c44
-rw-r--r--misc/exebin.mac57
-rw-r--r--misc/exebin2.mac114
-rwxr-xr-xmisc/fmtinsns.pl40
-rwxr-xr-xmisc/genfma.pl63
-rw-r--r--misc/hints.txt26
-rw-r--r--misc/magic6
-rw-r--r--misc/myC32.mac121
-rw-r--r--misc/nasm.sl320
-rw-r--r--misc/nasmstab296
-rw-r--r--misc/omfdump.c517
-rw-r--r--misc/pmw.bat9
-rw-r--r--misc/proc32.ash441
-rw-r--r--misc/scitech.mac1223
-rw-r--r--misc/xcrcgen.c80
-rw-r--r--nasm.spec.in83
-rw-r--r--nasm.spec.sed3
-rw-r--r--nasm.txt306
-rw-r--r--nasm_assemble.gni172
-rw-r--r--nasm_sources.gni89
-rw-r--r--nasmlib/badenum.c43
-rw-r--r--nasmlib/bsi.c77
-rw-r--r--nasmlib/crc64.c189
-rw-r--r--nasmlib/file.c228
-rw-r--r--nasmlib/file.h128
-rw-r--r--nasmlib/filename.c63
-rw-r--r--nasmlib/hashtbl.c256
-rw-r--r--nasmlib/ilog2.c2
-rw-r--r--nasmlib/malloc.c163
-rw-r--r--nasmlib/md5c.c247
-rw-r--r--nasmlib/mmap.c139
-rw-r--r--nasmlib/path.c186
-rw-r--r--nasmlib/perfhash.c55
-rwxr-xr-xnasmlib/perfhash.pl362
-rw-r--r--nasmlib/raa.c203
-rw-r--r--nasmlib/rbtree.c119
-rw-r--r--nasmlib/readnum.c172
-rw-r--r--nasmlib/realpath.c135
-rw-r--r--nasmlib/saa.c377
-rw-r--r--nasmlib/srcfile.c122
-rw-r--r--nasmlib/string.c242
-rw-r--r--nasmlib/strlist.c93
-rw-r--r--nasmlib/ver.c50
-rw-r--r--nasmlib/zerobuf.c42
-rw-r--r--ndisasm.txt94
-rwxr-xr-xnsis/NASMMultiUser.nsh478
-rw-r--r--nsis/getpearch.pl76
-rw-r--r--nsis/nasm-un.icobin0 -> 5494 bytes
-rw-r--r--nsis/nasm.icobin0 -> 2238 bytes
-rw-r--r--nsis/nasm.nsi241
-rw-r--r--output/codeview.c826
-rw-r--r--output/dwarf.h621
-rw-r--r--output/elf.h539
-rw-r--r--output/legacy.c124
-rw-r--r--output/macho.h282
-rw-r--r--output/nulldbg.c93
-rw-r--r--output/nullout.c61
-rw-r--r--output/outaout.c932
-rw-r--r--output/outaout.mac37
-rw-r--r--output/outas86.c617
-rw-r--r--output/outas86.mac37
-rw-r--r--output/outbin.c1685
-rw-r--r--output/outbin.mac40
-rw-r--r--output/outcoff.c1215
-rw-r--r--output/outcoff.mac43
-rw-r--r--output/outdbg.c488
-rw-r--r--output/outdbg.mac53
-rw-r--r--output/outelf.c3358
-rw-r--r--output/outelf.h152
-rw-r--r--output/outelf.mac41
-rw-r--r--output/outform.c120
-rw-r--r--output/outform.h379
-rw-r--r--output/outieee.c1507
-rw-r--r--output/outlib.c58
-rw-r--r--output/outlib.h65
-rw-r--r--output/outmacho.c2409
-rw-r--r--output/outmacho.mac49
-rw-r--r--output/outobj.c2709
-rw-r--r--output/outobj.mac49
-rw-r--r--output/outrdf.mac40
-rw-r--r--output/outrdf2.c772
-rw-r--r--output/outrdf2.mac43
-rw-r--r--output/pecoff.h532
-rw-r--r--output/stabs.h150
-rw-r--r--output/strtbl.c117
-rw-r--r--output/strtbl.h57
-rw-r--r--perllib/crc64.ph158
-rwxr-xr-xperllib/gensv.pl34
-rw-r--r--perllib/phash.ph200
-rw-r--r--perllib/random_sv_vectors.ph67
-rw-r--r--rdoff/README185
-rw-r--r--rdoff/collectn.c44
-rw-r--r--rdoff/collectn.h22
-rw-r--r--rdoff/doc/Makefile37
-rw-r--r--rdoff/doc/rdoff.texi137
-rw-r--r--rdoff/doc/v1-v2.txt62
-rw-r--r--rdoff/hash.c122
-rw-r--r--rdoff/hash.h17
-rw-r--r--rdoff/ldrdf.141
-rw-r--r--rdoff/ldrdf.c1395
-rw-r--r--rdoff/ldsegs.h59
-rw-r--r--rdoff/rdf2bin.165
-rw-r--r--rdoff/rdf2bin.c431
-rw-r--r--rdoff/rdf2com.11
-rw-r--r--rdoff/rdf2ihx.11
-rw-r--r--rdoff/rdf2ith.11
-rw-r--r--rdoff/rdf2srec.11
-rw-r--r--rdoff/rdfdump.124
-rw-r--r--rdoff/rdfdump.c347
-rw-r--r--rdoff/rdflib.139
-rw-r--r--rdoff/rdflib.c437
-rw-r--r--rdoff/rdfload.c213
-rw-r--r--rdoff/rdfload.h29
-rw-r--r--rdoff/rdfutils.h165
-rw-r--r--rdoff/rdlar.c492
-rw-r--r--rdoff/rdlar.h34
-rw-r--r--rdoff/rdlib.c290
-rw-r--r--rdoff/rdlib.h62
-rw-r--r--rdoff/rdoff.c621
-rw-r--r--rdoff/rdx.121
-rw-r--r--rdoff/rdx.c90
-rw-r--r--rdoff/segtab.c172
-rw-r--r--rdoff/segtab.h45
-rw-r--r--rdoff/symtab.c159
-rw-r--r--rdoff/symtab.h55
-rw-r--r--rdoff/test/Makefile10
-rw-r--r--rdoff/test/makelib.sh14
-rw-r--r--rdoff/test/rdfseg.asm20
-rw-r--r--rdoff/test/rdfseg2.asm12
-rw-r--r--rdoff/test/rdftest1.asm54
-rw-r--r--rdoff/test/rdftest2.asm33
-rw-r--r--rdoff/test/rdtlib.asm48
-rw-r--r--rdoff/test/rdtmain.asm47
-rw-r--r--rdoff/test/testlib.asm18
-rw-r--r--stdlib/snprintf.c29
-rw-r--r--stdlib/strlcpy.c51
-rw-r--r--stdlib/strnlen.c46
-rw-r--r--stdlib/strrchrnul.c50
-rw-r--r--stdlib/vsnprintf.c50
-rw-r--r--test/Makefile106
-rw-r--r--test/_file_.asm5
-rw-r--r--test/_version.asm2
-rw-r--r--test/a32offs.asm9
-rw-r--r--test/absolute.asm41
-rw-r--r--test/addr64x.asm18
-rw-r--r--test/align13.asm19
-rw-r--r--test/align13s.asm20
-rw-r--r--test/alonesym-obj.asm166
-rw-r--r--test/andbyte.asm15
-rw-r--r--test/aoutso.asm99
-rw-r--r--test/aouttest.asm86
-rw-r--r--test/aouttest.c36
-rw-r--r--test/avx.asm46
-rw-r--r--test/avx005.asm529
-rw-r--r--test/avx2.asm1608
-rw-r--r--test/avx512cd.asm106
-rw-r--r--test/avx512er.asm144
-rw-r--r--test/avx512f.asm7000
-rw-r--r--test/avx512pf.asm88
-rw-r--r--test/bcd.asm23
-rw-r--r--test/binexe.asm35
-rw-r--r--test/bintest.asm59
-rwxr-xr-xtest/bisect.sh22
-rw-r--r--test/br1879590.asm25
-rw-r--r--test/br2003451.asm17
-rw-r--r--test/br2030823.asm7
-rw-r--r--test/br2148476.asm221
-rw-r--r--test/br2222615.asm19
-rw-r--r--test/br2496848.asm42
-rw-r--r--test/br3005117.asm26
-rw-r--r--test/br3026808.asm20
-rw-r--r--test/br3028880.asm8
-rw-r--r--test/br3041451.asm59
-rw-r--r--test/br3058845.asm14
-rw-r--r--test/br3066383.asm70
-rw-r--r--test/br3074517.asm12
-rw-r--r--test/br3092924.asm25
-rw-r--r--test/br3104312.asm11
-rw-r--r--test/br3109604.asm9
-rw-r--r--test/br3174983.asm9
-rw-r--r--test/br3187743.asm7
-rw-r--r--test/br3189064.asm7
-rw-r--r--test/br3200749.asm9
-rw-r--r--test/br3385573.asm11
-rw-r--r--test/br3392252.asm43
-rw-r--r--test/br3392259.asm8
-rw-r--r--test/br3392363.asm4
-rw-r--r--test/br3392392.asm16
-rw-r--r--test/br3392396.asm5
-rw-r--r--test/br3392411.asm22
-rw-r--r--test/br3392418.asm3
-rw-r--r--test/br3392439.asm25
-rw-r--r--test/br3392442.asm6
-rw-r--r--test/br560575.asm17
-rw-r--r--test/br560873.asm27
-rw-r--r--test/br890790.asm7
-rw-r--r--test/br890790_i.asm1
-rw-r--r--test/br978756.asm7
-rw-r--r--test/changed.asm383
-rw-r--r--test/cofftest.asm85
-rw-r--r--test/cofftest.c35
-rw-r--r--test/crc32.asm37
-rw-r--r--test/ctxlocal.asm25
-rw-r--r--test/cv8struc.asm14
-rw-r--r--test/dtbcd.asm72
-rw-r--r--test/elf64so.asm118
-rw-r--r--test/elf_visibility.asm10
-rw-r--r--test/elfso.asm100
-rw-r--r--test/elftest.asm87
-rw-r--r--test/elftest.c38
-rw-r--r--test/elftest64.c43
-rw-r--r--test/elif.asm39
-rw-r--r--test/expimp.asm90
-rw-r--r--test/far64.asm10
-rw-r--r--test/float.asm186
-rw-r--r--test/float8.asm135
-rw-r--r--test/floatb.asm35
-rw-r--r--test/floatexp.asm382
-rw-r--r--test/floatize.asm19
-rw-r--r--test/floattest.asm28
-rw-r--r--test/floatx.asm525
-rw-r--r--test/fpu.asm127
-rw-r--r--test/fwdopt.asm133
-rw-r--r--test/fwdoptpp.asm150
-rwxr-xr-xtest/gas2nasm.py104
-rw-r--r--test/gather.asm11
-rw-r--r--test/gotoff64.asm25
-rw-r--r--test/hexfp.asm25
-rw-r--r--test/hle.asm19
-rw-r--r--test/ifelse.asm46
-rw-r--r--test/ifenv.asm31
-rw-r--r--test/ifmacro.asm413
-rw-r--r--test/iftoken.asm317
-rwxr-xr-xtest/iftoken.pl32
-rw-r--r--test/ilog2.asm271
-rw-r--r--test/imacro.asm8
-rw-r--r--test/imm.asm23
-rw-r--r--test/imm64.asm61
-rw-r--r--test/immwarn.asm91
-rw-r--r--test/imul.asm117
-rw-r--r--test/inc1.asm6
-rw-r--r--test/inc2.asm8
-rw-r--r--test/incbin.asm7
-rw-r--r--test/incbin.data2
-rw-r--r--test/inctest.asm15
-rw-r--r--test/insnlbl.asm12
-rw-r--r--test/invlpga.asm11
-rw-r--r--test/jmp64.asm19
-rw-r--r--test/lar_lsl.asm124
-rw-r--r--test/larlsl.asm23
-rw-r--r--test/lnxhello.asm54
-rw-r--r--test/local.asm19
-rw-r--r--test/loopoffs.asm12
-rw-r--r--test/lwp.asm213
-rw-r--r--test/macro-defaults.asm64
-rw-r--r--test/macroerr.asm12
-rw-r--r--test/macroerr.inc3
-rw-r--r--test/mmxsize.asm38
-rw-r--r--test/movd.asm12
-rw-r--r--test/movd64.asm15
-rw-r--r--test/movimm.asm28
-rw-r--r--test/movnti.asm10
-rw-r--r--test/mpx-64.asm120
-rw-r--r--test/mpx.asm89
-rw-r--r--test/multisection.asm96
-rw-r--r--test/nasmformat.asm17
-rwxr-xr-xtest/new9
-rw-r--r--test/newrdwr.asm24
-rw-r--r--test/nop.asm17
-rw-r--r--test/nullfile.asm4
-rw-r--r--test/objexe.asm30
-rw-r--r--test/objlink.c33
-rw-r--r--test/objtest.asm87
-rw-r--r--test/optimization.asm104
-rw-r--r--test/org.asm18
-rw-r--r--test/paste.asm12
-rw-r--r--test/pcrel.asm52
-rwxr-xr-xtest/perf/label.pl18
-rwxr-xr-xtest/perf/macro.pl18
-rwxr-xr-xtest/perf/token.pl23
-rwxr-xr-xtest/performtest.pl192
-rw-r--r--test/pextrw.asm3
-rw-r--r--test/pinsr16.asm53
-rw-r--r--test/pinsr32.asm53
-rw-r--r--test/pinsr64.asm68
-rw-r--r--test/popcnt.asm32
-rw-r--r--test/ppindirect.asm42
-rw-r--r--test/pragma.asm12
-rw-r--r--test/prefix66.asm28
-rw-r--r--test/ptr.asm4
-rw-r--r--test/pushseg.asm17
-rw-r--r--test/r13.asm15
-rw-r--r--test/radix.asm54
-rw-r--r--test/rdpid.asm21
-rw-r--r--test/reldef.asm57
-rw-r--r--test/relocs.asm20
-rw-r--r--test/ret.asm56
-rw-r--r--test/riprel.asm5357
-rwxr-xr-xtest/riprel.pl29
-rw-r--r--test/riprel2.asm11
-rw-r--r--test/sha-64.asm30
-rw-r--r--test/sha.asm31
-rw-r--r--test/smartalign16.asm36
-rw-r--r--test/smartalign32.asm36
-rw-r--r--test/smartalign64.asm36
-rw-r--r--test/splitea.asm11
-rw-r--r--test/sreg.asm65
-rw-r--r--test/strlen.asm5
-rw-r--r--test/struc.asm33
-rw-r--r--test/subsection.asm38
-rw-r--r--test/test67.asm38
-rw-r--r--test/testdos.asm13
-rw-r--r--test/testnos3.asm973
-rw-r--r--test/time.asm11
-rw-r--r--test/times.asm21
-rw-r--r--test/timesneg.asm3
-rw-r--r--test/tmap.nas1447
-rw-r--r--test/uscore.asm15
-rw-r--r--test/utf.asm82
-rw-r--r--test/v4.asm12
-rw-r--r--test/vaesenc.asm22
-rw-r--r--test/vex.asm9
-rw-r--r--test/vgather.asm76
-rw-r--r--test/vmread.asm26
-rw-r--r--test/weirdpaste.asm29
-rw-r--r--test/xchg.asm96
-rw-r--r--test/xcrypt.asm24
-rw-r--r--test/xmm0.asm12
-rw-r--r--test/zerobyte.asm22
-rwxr-xr-xtools/cleanfile176
-rwxr-xr-xtools/cleanpatch258
-rwxr-xr-xtools/mkdep.pl320
-rwxr-xr-xtools/release105
-rwxr-xr-xtools/syncfiles.pl137
-rwxr-xr-xtools/tag-release58
-rw-r--r--travis/README.md104
-rwxr-xr-xtravis/nasm-t.py407
-rw-r--r--travis/test/_file_.asm4
-rw-r--r--travis/test/_file_.bin.tbin0 -> 56 bytes
-rw-r--r--travis/test/_file_.json8
-rw-r--r--travis/test/_version.json7
-rw-r--r--travis/test/_version.stdout1
-rw-r--r--travis/test/a32offs.asm7
-rw-r--r--travis/test/a32offs.bin.t1
-rw-r--r--travis/test/a32offs.json18
-rw-r--r--travis/test/absolute.asm38
-rw-r--r--travis/test/absolute.bin.t1
-rw-r--r--travis/test/absolute.json8
-rw-r--r--travis/test/addr64x.asm15
-rw-r--r--travis/test/addr64x.bin.tbin0 -> 56 bytes
-rw-r--r--travis/test/addr64x.json25
-rw-r--r--travis/test/addr64x.stderr4
-rw-r--r--travis/test/align13.asm16
-rw-r--r--travis/test/align13.json25
-rw-r--r--travis/test/align13.stderr4
-rw-r--r--travis/test/alonesym-obj.asm163
-rw-r--r--travis/test/alonesym-obj.json18
-rw-r--r--travis/test/alonesym-obj.obj.tbin0 -> 1163 bytes
-rw-r--r--travis/test/tmap.asm1448
-rw-r--r--travis/test/tmap.json10
-rw-r--r--travis/test/tmap.o.stderr1
-rw-r--r--travis/test/tmap.o.tbin0 -> 6752 bytes
-rw-r--r--travis/test/utf-error.stderr18
-rw-r--r--travis/test/utf.asm80
-rw-r--r--travis/test/utf.bin.tbin0 -> 369 bytes
-rw-r--r--travis/test/utf.json20
-rw-r--r--travis/test/weirdpaste.asm26
-rw-r--r--travis/test/weirdpaste.bin.tbin0 -> 42 bytes
-rw-r--r--travis/test/weirdpaste.i.t30
-rw-r--r--travis/test/weirdpaste.json18
-rw-r--r--version1
-rw-r--r--version.h9
-rwxr-xr-xversion.pl189
-rw-r--r--x86/disp8.c131
-rw-r--r--x86/iflag.c270
-rw-r--r--x86/iflaggen.h107
-rw-r--r--x86/insns-iflags.ph288
-rw-r--r--x86/insns.dat5543
-rwxr-xr-xx86/insns.pl1048
-rw-r--r--x86/insnsa.c16018
-rw-r--r--x86/insnsb.c5712
-rw-r--r--x86/insnsd.c24536
-rw-r--r--x86/insnsi.h1900
-rw-r--r--x86/insnsn.c1887
-rw-r--r--x86/regdis.c20
-rw-r--r--x86/regdis.h25
-rw-r--r--x86/regflags.c248
-rw-r--r--x86/regs.c246
-rw-r--r--x86/regs.dat138
-rw-r--r--x86/regs.h498
-rwxr-xr-xx86/regs.pl204
-rw-r--r--x86/regvals.c247
530 files changed, 184096 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..4d89041d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,82 @@
+*.a
+*.bin
+*.coff
+*.dbg
+*.dep
+*.exe
+*.lib
+*.i
+*.ith
+*.lst
+*.mo32
+*.mo64
+*.o
+*.o64
+*.obj
+*.obj64
+*.od
+*.orig
+*.out
+*.pdb
+*.rdf
+*.rej
+*.s
+*.srec
+*.si
+*.swp
+*.win32
+*.win64
+*.xml
+.*swo
+*~
+\#*
+.\#*
+*.bak
+*.tmp
+.git-ignore
+cscope*
+tags
+TAGS
+/*.1
+/Makefile
+/asm/pptok.ph
+/config/config.h.in
+/config.log
+/config.status
+/configure
+/autom4te.cache
+/doc/*.dip
+/doc/*.hpj
+/doc/*.pdf
+/doc/*.ps
+/doc/*.rtf
+/doc/*.texi
+/doc/*.txt
+/doc/Makefile
+/doc/html
+/doc/info
+/doc/inslist.src
+/doc/version.src
+/misc/omfdump
+/nasm
+/ndisasm
+/nasm.spec
+/nsis/arch.nsh
+/nsis/version.nsh
+/rdoff/Makefile
+/rdoff/ldrdf
+/rdoff/rdf2bin
+/rdoff/rdf2com
+/rdoff/rdf2ihx
+/rdoff/rdf2ith
+/rdoff/rdf2srec
+/rdoff/rdfdump
+/rdoff/rdflib
+/rdoff/rdx
+/test/golden
+/test/perf/*.asm
+/test/testresults
+/version.mac
+/version.mak
+/version.sed
+/patches/
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..a74ab823
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: c
+os:
+ - linux
+env:
+ - TR_ARCH=local
+script:
+ - ./autogen.sh
+ - ./configure
+ - make all
+ - python3 ./travis/nasm-t.py run
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 00000000..8a398acf
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,137 @@
+This is the AUTHORS file for the NASM project located at:
+http://nasm.sourceforge.net/
+
+Names should be inserted as follows:
+
+N: Name Here
+E: Email Here
+D: Description Here
+D: Additional Description Here.... and so on
+C: Copyright information
+
+Such is life.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+N: Julian Hall
+E: Jules@acris.co.uk
+D: Original author and co-conspirator
+
+N: Simon Tatham
+E: anakin@pobox.com
+D: Original author and co-conspirator
+
+N: Nelson Rush
+E: palisade@users.sourceforge.net
+D: Some guy.
+
+N: Frank Kotler
+E: fbkotler@users.sf.net
+D: Bug smashing.
+D: Documentation - "KATMAI" and "3DNow!" instructions supported by 0.98
+D: General coordination and moral support.
+
+N: Stephen Silver
+E: nasm@argentum.freeserve.co.uk
+D: Documentation - "3dNow!" instructions and misc.
+D: insns.dat fixes and new instructions.
+
+N: AMD Inc. (names of developers here?)
+E:
+D: 3DNow instructions
+D: New Athlon instructions
+D: Makefile.vc fix
+
+N: John Coffman
+E: johninsd@users.sourceforge.net
+D: added Jcc optimizations; CPU level checks
+D: bug fixes, compilation fixes
+
+N: Yuri Zaporozhets
+E: r_tty@yahoo.co.uk
+D: RDOFF support
+
+N: H. Peter Anvin
+E: hpa@zytor.com
+D: Primary maintainer for the 0.98, late 0.98.x and 2.x releases.
+C: Contributions since 2008-12-15 are Copyright Intel Corporation.
+
+N: John Fine
+E: johnfine@earthlink.net
+D: Preprocessor and OBJ (OMF) output format driver
+D: Organized DOS versions of 0.98 release
+
+N: Kendall Bennet
+E: KendallB@scitechsoft.com
+D: NASM enhancements
+D: macros
+D: Syntax modifications
+
+N: Gary Clark
+E:
+D: AMD 3DNow! instructions
+
+N: Andrew Crabtree
+E:
+D: Debugging support
+
+N: Rafael R. Sevilla
+E: dido@pacific.net.ph
+D: RDF2HEX utility
+
+N: Jaime Tejedor Gómez, aka Metalbrain
+E: metalbrain_coder@gmx.net
+D: jecxz bug fix
+
+N: James Seter
+E: pharos@zsnes.com
+D: --POSTFIX, --PREFIX switches
+D: ?
+
+N: Edward J. Beroset
+E: beroset@mindspring.com
+D: added %substr and %strlen
+
+N: Stanislav Karchebny, aka berkus, madfire, daemonhunter
+E: madfire@users.sourceforge.net
+D: multiple sections support for -fbin format
+D: cvs maintenance
+D: webpage at http://nasm.2y.net maintenance
+
+N: Debbie Wiles, aka debs
+E: debs@dwiles.demon.co.uk
+D: Work on docs, added undocumented instructions (esp SSE2 and 3D-Now!)
+D: Added other documentation and tidied up docs
+D: Added a few instructions to insns.dat and tidied it up.
+
+N: Trevor Woerner
+E: FIXME
+D: Quiet compiler warnings
+
+N: Michael K. Ter Louw
+E: mterlo1 "at" uic "dot" edu
+D: Multisection support for "-f bin"
+
+N: Martin Wawro
+E: FIXME
+D: stabs debug support for "-f elf"
+
+N: Alexei Frounze
+E: alexfru@users.sourceforge.net
+D: "-I" paths searched for "incbined" files
+D: bugswatting
+
+N: Keith Kanios, aka SpooK
+E: keith@kanios.net
+D: c99 Compliance
+D: General x64 Support
+D: win64 (x86-64 COFF) output format
+D: __BITS__ Standard Macro
+D: Website Maintenance @ http://nasm.sourceforge.net/
+
+N: Chuck Crayne
+E: ccrayne@users.sourceforge.net
+D: elf64 (x86_64) output format
+
+N: Cyrill Gorcunov
+E: gorcunov@gmail.com
+D: AMD XOP/FMA4/CVT16 instructions
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 00000000..dd52d884
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,107 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/compiler/compiler.gni")
+import("nasm_sources.gni")
+
+configs_to_delete = [ "//build/config/compiler:chromium_code" ]
+configs_to_add = [ "//build/config/compiler:no_chromium_code" ]
+if (is_debug) {
+ configs_to_delete += [
+ # Build with full optimizations even on debug configurations, because some
+ # yasm build steps (highbd_sad4d_sse2.asm) can take ~33 seconds or more in
+ # debug component builds on Windows. Enabling compiler optimizations saves
+ # ~5 seconds.
+ "//build/config/compiler:default_optimization",
+
+ # Don't define _DEBUG. Modest savings, but good for consistency.
+ "//build/config:debug",
+ ]
+
+ configs_to_add += [
+ "//build/config:release",
+ "//build/config/compiler:optimize_max",
+ ]
+ if (is_win) {
+ # This switches to using the release CRT. For yasm debug component builds
+ # of highbd_sad4d_sse2.asm on Windows this saved about 15 s.
+ configs_to_delete += [ "//build/config/win:default_crt" ]
+ configs_to_add += [ "//build/config/win:release_crt" ]
+
+ # Without no_default_deps, an implicit dependency on libc++ is added.
+ # libc++ may have been built referencing the debug CRT, but since we're
+ # explicitly using the release CRT, this would result in undefined symbol
+ # errors when linking, so we need to remove the implicit libc++ dependency.
+ no_default_deps = true
+ }
+}
+
+config("nasm_config") {
+ include_dirs = [
+ ".",
+ "asm",
+ "disasm",
+ "include",
+ "output",
+ "x86",
+ ]
+
+ defines = [ "HAVE_CONFIG_H" ]
+
+ if (is_clang) {
+ cflags = [
+ # The inline functions in NASM's headers flag this.
+ "-Wno-unused-function",
+
+ # NASM writes nasm_assert(!"some string literal").
+ "-Wno-string-conversion",
+
+ # NASM sometimes redefines macros from its config.h.
+ "-Wno-macro-redefined",
+
+ # NASM sometimes compares enums to unsigned integers.
+ "-Wno-sign-compare",
+ ]
+ } else if (is_win) {
+ # Please note that's a slightly different set of warnings.
+ cflags = [
+ # NASM sometimes redefines macros from its config.h.
+ "/wd4005", # macro redefinition
+
+ # NASM sometimes compares enums to unsigned integers.
+ "/wd4018", # sign compare
+
+ # char VS const char mismatch.
+ "/wd4028", # formal parameter 1 different from declaration.
+
+ # NASM comment: Uninitialized -> all zero by C spec
+ # Or sometimes one const struct is forward declared for no reason.
+ "/wd4132", # const object should be initialized
+
+ # NASM uses "(-x) & 0xFF" pattern to negate byte.
+ "/wd4146", # unary minus operator applied to unsigned type
+ ]
+ }
+}
+
+if (current_toolchain == host_toolchain) {
+ executable("nasm") {
+ sources = nasmlib_sources + nasm_sources
+ sources += [
+ "config/config-linux.h",
+ "config/config-mac.h",
+ "config/config.h",
+ "config/msvc.h",
+ ]
+
+ configs -= configs_to_delete
+ configs += configs_to_add
+ configs += [ ":nasm_config" ]
+
+ deps = [
+ # Default manifest on Windows (a no-op elsewhere).
+ "//build/win:default_exe_manifest",
+ ]
+ }
+}
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 00000000..b89696f4
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,2 @@
+The revision history has moved to the file doc/changes.src, and
+is now included in the documentation as Appendix C.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 00000000..ff3befc6
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,2905 @@
+Sat Nov 24 16:31:48 2007 -0800 H. Peter Anvin
+ * Typo fixes in documentation
+Tue Nov 20 23:37:46 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc3
+Tue Nov 20 21:45:16 2007 -0800 H. Peter Anvin
+ * Unbreak CMPSW/CMPSD/CMPSQ
+Tue Nov 20 13:23:34 2007 -0800 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Tue Nov 20 13:22:58 2007 -0800 H. Peter Anvin
+ * ndisasm: handle the case of "no more sync points"
+Mon Nov 19 23:09:31 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc2
+Mon Nov 19 23:09:24 2007 -0800 H. Peter Anvin
+ * tag-release: a simple script to tag the repository for release
+Mon Nov 19 13:14:59 2007 -0800 H. Peter Anvin
+ * Slightly faster implementation of the deadman counter
+Mon Nov 19 12:26:50 2007 -0800 H. Peter Anvin
+ * BR 812417: Deadman counter for macro expansion
+Mon Nov 19 12:02:38 2007 -0800 H. Peter Anvin
+ * BR 877583: Fix RAA memory leak
+Mon Nov 19 11:53:18 2007 -0800 H. Peter Anvin
+ * BR 863173: Fix offsets of TIMES/INCBIN in list file
+Mon Nov 19 11:45:40 2007 -0800 H. Peter Anvin
+ * BR 1834731: Remove redundant error messages for no input file
+Mon Nov 19 11:44:05 2007 -0800 H. Peter Anvin
+ * insns.pl: remove debugging output
+Sun Nov 18 22:18:09 2007 -0800 H. Peter Anvin
+ * Clean up remaining build warnings
+Sun Nov 18 21:55:26 2007 -0800 H. Peter Anvin
+ * BR 1834292: Fix multiple disassembler bugs
+Sun Nov 18 12:01:05 2007 -0800 H. Peter Anvin
+ * BR 1834056: Remove warnings in rdoff/rdoff.c
+Sun Nov 18 11:55:10 2007 -0800 H. Peter Anvin
+ * BR 1091926: Bounds checking for command line parsing
+Sat Nov 17 21:21:18 2007 -0800 H. Peter Anvin
+ * Remove FIXME from documentation
+Sat Nov 17 21:08:33 2007 -0800 Charles Crayne
+ * Check in Keith's Fixes
+Sat Nov 17 14:35:19 2007 -0800 H. Peter Anvin
+ * Make the definition for float_const() match the prototype
+Fri Nov 16 00:03:02 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc1
+Thu Nov 15 17:12:29 2007 -0800 H. Peter Anvin
+ * Clean up the command-line parsing; make -w/-W match others
+Thu Nov 15 14:38:19 2007 -0800 H. Peter Anvin
+ * BR 993895: Support zero-operand floating-point insn
+Thu Nov 15 10:25:52 2007 -0800 H. Peter Anvin
+ * Remove some vestiges of "native" RESW/RESD support
+Thu Nov 15 10:24:55 2007 -0800 H. Peter Anvin
+ * outbin.c: fix one missed change from type -> size
+Tue Nov 13 19:52:54 2007 -0800 root
+ * Support setting OSABI value in ELF header.
+Tue Nov 13 11:34:34 2007 -0800 H. Peter Anvin
+ * Enable a few warnings by default; clean up warning descriptions
+Tue Nov 13 11:31:15 2007 -0800 H. Peter Anvin
+ * Add gcc-style -W/-Wno- warning selections; -Wall; -Werror
+Tue Nov 13 10:37:23 2007 -0800 H. Peter Anvin
+ * Clean up the fwrite*() function definitions somewhat
+Tue Nov 13 09:49:51 2007 -0800 H. Peter Anvin
+ * Cast 64-bit switch expressions to (int) to keep OpenWatcom happy
+Tue Nov 13 09:46:38 2007 -0800 H. Peter Anvin
+ * x86-host-specific performance improvement
+Tue Nov 13 09:37:59 2007 -0800 H. Peter Anvin
+ * Address data is int64_t; simplify writing an address object
+Mon Nov 12 23:00:31 2007 -0800 H. Peter Anvin
+ * ndisasm: factor out the common operand-extraction code
+Mon Nov 12 22:56:07 2007 -0800 H. Peter Anvin
+ * Un-special-case "xchg rax,rax"; disassemble o64
+Mon Nov 12 22:11:46 2007 -0800 H. Peter Anvin
+ * BR 1709392: Fix alignment handling in Mach-O format
+Mon Nov 12 22:05:31 2007 -0800 H. Peter Anvin
+ * BR 1828866: fix handling of LAR/LSL
+Mon Nov 12 21:57:00 2007 -0800 H. Peter Anvin
+ * Better (but not *good!*) handling of 64-bit addressing in ndisasm
+Mon Nov 12 21:02:33 2007 -0800 H. Peter Anvin
+ * Fix disassembly of XCHG
+Mon Nov 12 20:18:33 2007 -0800 H. Peter Anvin
+ * Test of XCHG
+Mon Nov 12 20:18:05 2007 -0800 H. Peter Anvin
+ * Fix handling of XCHG in 64-bit mode
+Mon Nov 12 19:36:13 2007 -0800 H. Peter Anvin
+ * More \321 -> \324 bug fixes
+Mon Nov 12 18:26:31 2007 -0800 H. Peter Anvin
+ * float.c: all warnings and errors are pass 1 only
+Sat Nov 10 21:55:19 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives.
+Sat Nov 10 17:52:23 2007 -0800 Charles Crayne
+ * Clean up a few more 32-bit bottlenecks
+Fri Nov 9 16:37:41 2007 -0800 Charles Crayne
+ * Update documantation for stack relative directives
+Fri Nov 9 16:33:54 2007 -0800 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Fri Nov 9 16:25:43 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives
+Fri Nov 9 14:44:02 2007 -0800 H. Peter Anvin
+ * Don't combine type and size into a single argument
+Thu Nov 8 22:11:14 2007 -0800 Charles Crayne
+ * Add flat64 to %stacksize choices
+Thu Nov 8 20:43:22 2007 -0800 H. Peter Anvin
+ * Fix building under OpenWatcom
+Thu Nov 8 20:29:37 2007 -0800 H. Peter Anvin
+ * ps2pdf: remove -dOptimize=true
+Thu Nov 8 20:21:41 2007 -0800 H. Peter Anvin
+ * No binary files left in the source distro; unbreak release script
+Thu Nov 8 20:01:11 2007 -0800 H. Peter Anvin
+ * BR 1828103: Fix %arg and %local
+Thu Nov 8 19:34:01 2007 -0800 H. Peter Anvin
+ * nasmlib.c: prefix_name(): use the elements() macro
+Thu Nov 8 19:30:22 2007 -0800 H. Peter Anvin
+ * Move elements() to nasmlib.h
+Thu Nov 8 19:15:33 2007 -0800 H. Peter Anvin
+ * constipate the "str" argument to bsi() and bsii()
+Wed Nov 7 19:03:46 2007 -0800 Charles Crayne
+ * Upgrade RAA functions to hold 64-bit data.
+Tue Nov 6 21:48:12 2007 -0800 Charles Crayne
+ * Pass 64-bit instruction lengths to back-ends.
+Tue Nov 6 18:27:23 2007 -0800 Charles Crayne
+ * Prepare for 64-bit instruction lengths
+Mon Nov 5 21:49:49 2007 -0800 Charles Crayne
+ * Disambiguate error messages
+Mon Nov 5 17:19:32 2007 -0800 Charles Crayne
+ * Upgrade label functions to 64-bit
+Sun Nov 4 21:10:42 2007 -0800 H. Peter Anvin
+ * Permit opcode names as labels as long as they are followed by a colon
+Sun Nov 4 15:28:30 2007 -0800 Charles Crayne
+ * Make warning limit valid for both i386 and x86_64
+Sat Nov 3 22:06:13 2007 -0700 Charles Crayne
+ * Warn on out of bounds EA displacements
+Thu Nov 1 15:08:27 2007 -0700 H. Peter Anvin
+ * Treat info files as binary when creating xdoc distro file
+Thu Nov 1 15:07:42 2007 -0700 H. Peter Anvin
+ * Remove obsolete binary files from the distribution
+Thu Nov 1 14:53:32 2007 -0700 H. Peter Anvin
+ * Move declarations before statements
+Wed Oct 31 23:37:35 2007 -0700 H. Peter Anvin
+ * NASM 0.99.06
+Wed Oct 31 23:37:19 2007 -0700 H. Peter Anvin
+ * Script to tag the tree for release
+Wed Oct 31 10:59:26 2007 -0700 H. Peter Anvin
+ * Even more "riprel" tests
+Tue Oct 30 01:17:57 2007 -0700 H. Peter Anvin
+ * floatx.asm: add tests for "rounds up to smallest denorm"
+Tue Oct 30 01:13:27 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Tue Oct 30 01:13:09 2007 -0700 H. Peter Anvin
+ * float.c: handle round-up-to-denorm correctly.
+Tue Oct 30 00:59:27 2007 -0700 H. Peter Anvin
+ * Exhaustive test for 8-bit floating point values
+Mon Oct 29 23:12:47 2007 -0700 H. Peter Anvin
+ * Clean up the handing of operands in assemble.c
+Mon Oct 29 22:56:08 2007 -0700 H. Peter Anvin
+ * Don't warn for segmented references
+Mon Oct 29 20:20:12 2007 -0700 H. Peter Anvin
+ * Use a 32-bit floating-point limb size; support 8-bit float
+Mon Oct 29 18:24:59 2007 -0700 Charles Crayne
+ * Reduce severity of redundant prefixes from error to warning.
+Sun Oct 28 23:23:24 2007 -0700 H. Peter Anvin
+ * Test of some addressing modes in 64-bit mode.
+Sun Oct 28 23:21:46 2007 -0700 H. Peter Anvin
+ * Fix bogus flagging of effective addresses as invalid
+Sun Oct 28 23:10:34 2007 -0700 H. Peter Anvin
+ * Actually shut up the warning in rdfload.c
+Sun Oct 28 22:04:42 2007 -0700 H. Peter Anvin
+ * Clean up stealth whitespace
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * Fix warning about cast to pointer in rdfload.c
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * 64-bit addressing and prefix handling changes
+Sun Oct 28 15:29:54 2007 -0700 Charles Crayne
+ * Adjust stabs symbol index to match symbol table.
+Fri Oct 26 21:38:02 2007 -0700 H. Peter Anvin
+ * readnum(): handle prefix-suffix collision like "0h"
+Fri Oct 26 18:49:29 2007 -0700 H. Peter Anvin
+ * Better handling of platforms which hide "extended" functionality
+Wed Oct 24 15:51:40 2007 -0700 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Wed Oct 24 15:30:17 2007 -0700 Charles Crayne
+ * Update sections about debug info formats
+Wed Oct 24 15:29:51 2007 -0700 H. Peter Anvin
+ * Fix the handling of floating-point tokens in the preprocessor
+Tue Oct 23 19:28:39 2007 -0700 Charles Crayne
+ * Fix bugs item #1817677
+Tue Oct 23 00:08:58 2007 -0700 H. Peter Anvin
+ * Slightly simplify the radix-detection code
+Mon Oct 22 19:48:06 2007 -0700 H. Peter Anvin
+ * Unbreak particularly tricky hex constants
+Mon Oct 22 19:37:36 2007 -0700 H. Peter Anvin
+ * Decimal floating point can also start with 0. 0e 0E
+Mon Oct 22 17:34:10 2007 -0700 H. Peter Anvin
+ * Support binary and octal floating-point
+Mon Oct 22 16:53:48 2007 -0700 H. Peter Anvin
+ * More consistent handling of radix letters
+Sun Oct 21 15:33:01 2007 -0700 H. Peter Anvin
+ * float.c: correct exponent capping
+Sun Oct 21 14:21:43 2007 -0700 Charles Crayne
+ * Clean up elf symbol table section
+Fri Oct 19 18:33:57 2007 -0700 H. Peter Anvin
+ * Allow $-prefixed hexadecimal FP as an alternative to 0x
+Fri Oct 19 14:43:22 2007 -0700 H. Peter Anvin
+ * Scripts to remove stealth whitespace
+Fri Oct 19 14:42:29 2007 -0700 H. Peter Anvin
+ * Formatting: kill off "stealth whitespace"
+Fri Oct 19 14:26:52 2007 -0700 H. Peter Anvin
+ * test/floatx.asm: fix test case
+Fri Oct 19 14:19:52 2007 -0700 H. Peter Anvin
+ * uscore.asm: Fix test case
+Fri Oct 19 14:17:51 2007 -0700 H. Peter Anvin
+ * float.c: mark read_exponent() static
+Fri Oct 19 14:10:35 2007 -0700 H. Peter Anvin
+ * Don't confuse suffixed hexadecimal with floating-point
+Fri Oct 19 13:17:24 2007 -0700 H. Peter Anvin
+ * Anchor filename locations in .gitignore
+Fri Oct 19 13:16:51 2007 -0700 H. Peter Anvin
+ * test/Makefile: Use -Ox instead of -O999
+Fri Oct 19 13:14:06 2007 -0700 H. Peter Anvin
+ * Test of underscored constants
+Fri Oct 19 13:10:46 2007 -0700 H. Peter Anvin
+ * Allow underscores in numbers; better detection of FP
+Fri Oct 19 10:52:31 2007 -0700 H. Peter Anvin
+ * Modernize nasm.spec.in and make it closer to the Fedora version
+Thu Oct 18 23:33:06 2007 -0700 Charles Crayne
+ * Suppress datarootdir warnings from configure
+Thu Oct 18 21:17:20 2007 -0700 Charles Crayne
+ * Suppress signedness warnings in disassembler
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * Cleaner solution for MinGW handling of __STRICT_ANSI__
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * configure: Undefine __STRICT_ANSI__ for mingw's benefit
+Thu Oct 18 19:14:07 2007 -0700 H. Peter Anvin
+ * Fix invocation of readnum()
+Thu Oct 18 19:02:42 2007 -0700 Charles Crayne
+ * Suppress a few signedness warnings
+Thu Oct 18 17:04:10 2007 -0700 root
+ * Avoid unnecessary warning on redefinition of section (bug 801180)
+Wed Oct 17 17:55:45 2007 -0700 Charles Crayne
+ * Generate stabs entries for any executable section
+Tue Oct 16 22:59:09 2007 -0700 H. Peter Anvin
+ * NASM 0.99.05
+Tue Oct 16 15:46:04 2007 -0700 H. Peter Anvin
+ * Tests of obscenely large exponents
+Tue Oct 16 14:42:32 2007 -0700 H. Peter Anvin
+ * Comma-separate contents of __FLOAT__
+Tue Oct 16 14:40:27 2007 -0700 H. Peter Anvin
+ * Implement floating-point option control directive
+Tue Oct 16 11:48:07 2007 -0700 H. Peter Anvin
+ * Floating-point warning fixes; fix round-to-overflow
+Tue Oct 16 11:32:58 2007 -0700 H. Peter Anvin
+ * Handle rounding of denorms correctly; make fp overflow a warning
+Tue Oct 16 10:35:02 2007 -0700 H. Peter Anvin
+ * Additional entries for .gitignore
+Tue Oct 16 10:32:57 2007 -0700 H. Peter Anvin
+ * Refactor floating-point formatting code; fix 80-bit denorms
+Tue Oct 16 10:31:16 2007 -0700 H. Peter Anvin
+ * Add 1.5 as a test case: representative of an exact fraction
+Mon Oct 15 20:06:06 2007 -0700 H. Peter Anvin
+ * Recognize 'd', 't' and 'y' as radix suffixes
+Mon Oct 15 19:53:10 2007 -0700 H. Peter Anvin
+ * Fix FISTTP opcodes (BR 689695)
+Mon Oct 15 19:46:32 2007 -0700 H. Peter Anvin
+ * New floating-point conversion routines
+Mon Oct 15 17:48:43 2007 -0700 H. Peter Anvin
+ * Add testnos3 from the gdtoa package (floating-point test)
+Sat Oct 13 23:19:21 2007 -0700 H. Peter Anvin
+ * .gitignore file doesn't need to be in the release file
+Sat Oct 13 23:17:41 2007 -0700 H. Peter Anvin
+ * Add .gitignore file so "git status" produces something sane
+Sat Oct 13 23:12:46 2007 -0700 H. Peter Anvin
+ * autoconf: drop AC_USE_SYSTEM_EXTENSIONS to support autoconf 2.59
+Sat Oct 13 07:09:22 2007 -0700 Keith Kanios
+ * Fix 32-bit types in preproc.c and eval.c
+Thu Oct 11 20:32:33 2007 -0700 Charles Crayne
+ * Must define types before using them
+Thu Oct 11 13:42:09 2007 -0700 H. Peter Anvin
+ * preproc.c: move smacro define/undef to separate functions
+Thu Oct 11 13:38:38 2007 -0700 H. Peter Anvin
+ * preproc.c: PP_DEFINE and PP_XDEFINE are case-sensitive
+Thu Oct 11 12:52:03 2007 -0700 H. Peter Anvin
+ * preproc.c: normalize the handling of case sensitivity
+Thu Oct 11 12:51:06 2007 -0700 H. Peter Anvin
+ * Define macros necessary for <inttypes.h> on C++
+Thu Oct 11 10:12:58 2007 -0700 H. Peter Anvin
+ * More "bool" fixes
+Thu Oct 11 10:11:57 2007 -0700 H. Peter Anvin
+ * preproc.c: allow 64-bit repeat counts
+Thu Oct 11 10:06:19 2007 -0700 H. Peter Anvin
+ * preproc.c: For an SMacro, in_progress really is a boolean (no %rep)
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * Additional uses of bool and enum
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * preproc.c: MMacro.in_progress is not a boolean
+Wed Oct 10 18:07:51 2007 -0700 H. Peter Anvin
+ * saa_fread/fwrite: when seeking, must set [rw]ptr as well
+Wed Oct 10 14:58:45 2007 -0700 H. Peter Anvin
+ * Use the compiler-provided booleans if available, otherwise emulate
+Wed Oct 10 14:55:14 2007 -0700 H. Peter Anvin
+ * owlinux.mak: don't clean things we won't be able to
+Wed Oct 10 14:29:53 2007 -0700 H. Peter Anvin
+ * configure.in: looks like we need autoconf 2.61 :(
+Wed Oct 10 14:06:59 2007 -0700 H. Peter Anvin
+ * Create option -Ox to tell NASM to do unlimited passes
+Mon Oct 8 19:26:57 2007 -0700 H. Peter Anvin
+ * Revert "floatb.asm: fix broken testcase"
+Mon Oct 8 18:39:24 2007 -0700 H. Peter Anvin
+ * floatb.asm: fix broken testcase
+Mon Oct 8 12:41:00 2007 -0700 H. Peter Anvin
+ * saa_rstruct: fix overrun check
+Mon Oct 8 12:12:23 2007 -0700 H. Peter Anvin
+ * Add Frank's floattest.asm test file
+Sun Oct 7 21:13:14 2007 -0700 H. Peter Anvin
+ * saa_fpwrite: initializing "len" should be part of the loop
+Sun Oct 7 18:46:57 2007 -0700 Charles Crayne
+ * Fix infinite loop in function saa_fpwrite
+Fri Oct 5 17:44:16 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: use a real instruction to avoid confusing ndisasm
+Fri Oct 5 17:42:31 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: add test cases for non-initial \170 uses
+Fri Oct 5 17:29:01 2007 -0700 H. Peter Anvin
+ * Check in the proper zerobyte test
+Fri Oct 5 17:04:32 2007 -0700 H. Peter Anvin
+ * Emit REX prefix before literal zero (\170)
+Fri Oct 5 17:01:15 2007 -0700 H. Peter Anvin
+ * LICENSE: Break long line
+Fri Oct 5 14:36:03 2007 -0700 H. Peter Anvin
+ * Add test for problematic floats
+Thu Oct 4 23:51:08 2007 -0700 H. Peter Anvin
+ * floatx.asm: add Inf and NaN to the boundary condition tests
+Thu Oct 4 23:09:19 2007 -0700 H. Peter Anvin
+ * floatx.asm: add specific tests for exponent boundary conditions
+Thu Oct 4 22:51:08 2007 -0700 H. Peter Anvin
+ * float.c: correct the exponent
+Thu Oct 4 15:18:23 2007 -0700 H. Peter Anvin
+ * Additional rules in test/Makefile
+Thu Oct 4 13:42:56 2007 -0700 H. Peter Anvin
+ * Rewrite the handling of SAA's to allow random access
+Wed Oct 3 21:30:57 2007 -0700 H. Peter Anvin
+ * Change cloc_t to struct location, and reorder the members
+Wed Oct 3 21:24:51 2007 -0700 H. Peter Anvin
+ * BR 1352920: change loc_t -> cloc_t
+Wed Oct 3 21:22:16 2007 -0700 H. Peter Anvin
+ * BR 1352920: Handle upper case %line
+Wed Oct 3 17:40:12 2007 -0700 H. Peter Anvin
+ * Use autoconf to request feature macros
+Tue Oct 2 22:04:15 2007 -0700 H. Peter Anvin
+ * preproc.c: constipation
+Tue Oct 2 21:57:27 2007 -0700 H. Peter Anvin
+ * make alldeps
+Tue Oct 2 21:53:51 2007 -0700 H. Peter Anvin
+ * Portability fixes
+Tue Oct 2 21:13:18 2007 -0700 H. Peter Anvin
+ * Run "make alldeps".
+Tue Oct 2 17:40:00 2007 -0700 H. Peter Anvin
+ * Use the crc64 we already use as the perfect hash function prehash
+Tue Oct 2 15:09:33 2007 -0700 H. Peter Anvin
+ * insns.dat: add systematic names for the hinting NOPs (0F18-0F1F)
+Mon Oct 1 11:28:32 2007 -0700 H. Peter Anvin
+ * Unspecified files are null strings, not null pointers
+Mon Oct 1 11:26:31 2007 -0700 H. Peter Anvin
+ * Check for the most basic filename overlaps
+Sun Sep 30 22:15:36 2007 -0700 Charles Crayne
+ * modified: nasm.1 to add newer command line options
+Fri Sep 28 21:27:41 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 20:17:12 2007 -0700 H. Peter Anvin
+ * configure.in: AC_SUBST_FILE should have been AC_SUBST
+Fri Sep 28 17:17:20 2007 -0700 H. Peter Anvin
+ * Unbreak relative references to immediate addresses
+Fri Sep 28 15:16:47 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 12:01:55 2007 -0700 H. Peter Anvin
+ * lib/vsnprintf.c: correct boundary conditions
+Fri Sep 28 10:50:20 2007 -0700 H. Peter Anvin
+ * Add substitutes for snprintf() and vsnprintf()
+Fri Sep 28 02:03:41 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Thu Sep 27 21:35:04 2007 -0700 H. Peter Anvin
+ * Exclude config.h from the dependency list for the canned makefiles
+Thu Sep 27 21:12:17 2007 -0700 H. Peter Anvin
+ * version.pl: Add support for daily snapshot releases
+Thu Sep 27 19:46:55 2007 -0700 H. Peter Anvin
+ * Add Makefile for Linux -> DOS, Win32, OS/2 using OpenWatcom
+Wed Sep 26 19:57:07 2007 -0700 H. Peter Anvin
+ * Add Makefile for OpenWatcom (DOS, OS/2 or Win32 output)
+Wed Sep 26 17:00:18 2007 -0700 H. Peter Anvin
+ * Test for various addressing modes in 64-bit mode
+Wed Sep 26 15:19:28 2007 -0700 H. Peter Anvin
+ * nasm option reshuffling, -E -> -Z
+Tue Sep 25 23:57:21 2007 -0400 Frank Kotler
+ * Version 0.99.04
+Tue Sep 25 20:36:45 2007 -0700 H. Peter Anvin
+ * nasmdoc: corrections on 64-bit immediates/displacements
+Tue Sep 25 16:02:21 2007 -0700 H. Peter Anvin
+ * nasmdoc: shorten lines which are too long
+Tue Sep 25 16:01:07 2007 -0700 H. Peter Anvin
+ * Document NASM behaviour for 64-bit immediates and displacements
+Tue Sep 25 15:44:40 2007 -0700 H. Peter Anvin
+ * test/movimm.asm: add optimizable forms
+Tue Sep 25 15:41:19 2007 -0700 H. Peter Anvin
+ * assemble.c: clean up whitespace
+Tue Sep 25 15:40:36 2007 -0700 H. Peter Anvin
+ * Correct the handling of "MOV" with immediate in 64-bit mode
+Tue Sep 25 15:39:42 2007 -0700 H. Peter Anvin
+ * Test of immediate handling on 64-bit mode
+Tue Sep 25 14:27:34 2007 -0700 H. Peter Anvin
+ * Add nasm_zalloc() to nasmlib.c
+Tue Sep 25 14:26:03 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 14:11:29 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 13:34:55 2007 -0700 H. Peter Anvin
+ * Makefile.in: make "make install" create directories
+Tue Sep 25 08:48:37 2007 -0700 H. Peter Anvin
+ * Fix BR 1445441: uninitialized use of "error_file"
+Mon Sep 24 21:33:17 2007 -0700 H. Peter Anvin
+ * preproc.c: fix the loop in %undef
+Mon Sep 24 20:53:48 2007 -0700 H. Peter Anvin
+ * float.c: clear off uninitialized warning
+Mon Sep 24 17:02:41 2007 -0700 H. Peter Anvin
+ * outcoff: set the "virtual size field" to zero (BR 1351586)
+Mon Sep 24 15:56:02 2007 -0700 H. Peter Anvin
+ * insns.dat: SMINT - mark ND, DMINT - fix opcode
+Mon Sep 24 15:55:20 2007 -0700 H. Peter Anvin
+ * 0F0F is a 3Dnow! prefix; remove from prefix list
+Mon Sep 24 15:48:09 2007 -0700 H. Peter Anvin
+ * Additional compaction missed by script
+Mon Sep 24 15:42:53 2007 -0700 H. Peter Anvin
+ * insns.dat: machine-generated compaction mmx/xmmreg,mem -> mmx/xmmrm
+Mon Sep 24 13:54:00 2007 -0700 H. Peter Anvin
+ * nasmdoc: grammar fix
+Mon Sep 24 13:44:02 2007 -0700 H. Peter Anvin
+ * nasmdoc: remove stray periods
+Mon Sep 24 13:42:09 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Mon Sep 24 13:41:58 2007 -0700 H. Peter Anvin
+ * Implement the -MG option (SF RFE 1564264)
+Mon Sep 24 12:52:09 2007 -0700 H. Peter Anvin
+ * nasmdoc: clarify __float*__ example
+Mon Sep 24 12:44:38 2007 -0700 H. Peter Anvin
+ * nasmdoc: document the __float*__ operators
+Mon Sep 24 12:30:54 2007 -0700 H. Peter Anvin
+ * Support __float*__ for floating-point numbers in expressions
+Mon Sep 24 10:51:07 2007 -0700 H. Peter Anvin
+ * eval.c: replace sequence of ifs with switch
+Mon Sep 24 10:50:23 2007 -0700 H. Peter Anvin
+ * tokhash: allow a bit smarter pattern matching
+Sat Sep 22 22:35:28 2007 -0700 H. Peter Anvin
+ * Implement INVLPGA according to the documentation
+Sat Sep 22 22:02:34 2007 -0700 H. Peter Anvin
+ * Reformat insns.dat to uniform column width
+Sat Sep 22 21:50:03 2007 -0700 H. Peter Anvin
+ * Simple test for 0x67 prefixes
+Sat Sep 22 21:49:51 2007 -0700 H. Peter Anvin
+ * Auto-generate 0x67 prefixes without the need for \30x codes
+Sat Sep 22 21:47:13 2007 -0700 H. Peter Anvin
+ * Make test/Makefile a bit more useful
+Sat Sep 22 21:29:41 2007 -0700 H. Peter Anvin
+ * Add TY_OWORD for "DO" output
+Sat Sep 22 19:52:11 2007 -0700 H. Peter Anvin
+ * LDDQU needs \301 (BR 1103549)
+Sat Sep 22 19:51:13 2007 -0700 H. Peter Anvin
+ * RDTSCP and INVLPGA aren't 64-bit specific
+Sat Sep 22 19:40:37 2007 -0700 H. Peter Anvin
+ * Cyrix GX1 instructions: BBx_RESET, CPU_READ, CPU_WRITE
+Sat Sep 22 19:28:14 2007 -0700 H. Peter Anvin
+ * Centaur XSHA1, XSHA256, MONTMUL
+Sat Sep 22 19:20:56 2007 -0700 H. Peter Anvin
+ * Implement Centaur's XCRYPT instructions
+Sat Sep 22 19:13:05 2007 -0700 H. Peter Anvin
+ * Add Geode LX (AMD's Cyrix-derived core) instructions
+Sat Sep 22 19:05:11 2007 -0700 H. Peter Anvin
+ * Add the GETSEC instruction for Intel SMX
+Sat Sep 22 18:59:18 2007 -0700 H. Peter Anvin
+ * Add the AMD SSE4a and LZCNT instructions
+Sat Sep 22 18:23:20 2007 -0700 H. Peter Anvin
+ * Tag UMOV as ND (no disassembly) to avoid collision
+Sat Sep 22 18:20:49 2007 -0700 H. Peter Anvin
+ * Disallow optimizing by less than 5 passes.
+Sat Sep 22 17:45:45 2007 -0700 H. Peter Anvin
+ * BR 1783117: Document that %+ needs a space after it, and fix crash
+Sat Sep 22 16:44:56 2007 -0700 H. Peter Anvin
+ * nasm.spec.in: minor fixes
+Sat Sep 22 16:38:25 2007 -0700 H. Peter Anvin
+ * release script: handle stricter CLI parsing for "git tag"
+Sat Sep 22 16:35:11 2007 -0700 H. Peter Anvin
+ * Update nasm.spec.in and make it handle rc releases
+Sat Sep 22 16:19:19 2007 -0700 H. Peter Anvin
+ * version.pl: support version numbers of the form X.Y[.Z]rcW
+Thu Sep 20 21:33:43 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Thu Sep 20 21:12:33 2007 -0700 Charles Crayne
+ * modified: misc/release to fix bug in removing .git
+Wed Sep 19 21:41:43 2007 -0700 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Wed Sep 19 21:41:27 2007 -0700 H. Peter Anvin
+ * Update manual pages
+Wed Sep 19 21:41:02 2007 -0700 H. Peter Anvin
+ * Remove limit on number of sync points
+Wed Sep 19 21:40:37 2007 -0700 H. Peter Anvin
+ * Make nasm_malloc() et al available from inside ndisasm
+Wed Sep 19 21:07:32 2007 -0400 Frank Kotler
+ * Version 0.99.03
+Wed Sep 19 21:06:59 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Wed Sep 19 16:22:03 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/sse5'
+Wed Sep 19 16:15:22 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Tue Sep 18 22:54:40 2007 -0700 H. Peter Anvin
+ * Slightly optimize the interface to nasm_token_hash()
+Wed Sep 19 01:34:55 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Tue Sep 18 22:23:42 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 22:22:49 2007 -0700 H. Peter Anvin
+ * elf64: fix 32-bit truncations
+Tue Sep 18 22:08:04 2007 -0700 H. Peter Anvin
+ * Document Infinity and NaN
+Tue Sep 18 21:55:56 2007 -0700 H. Peter Anvin
+ * Support generating NaNs and infinities
+Tue Sep 18 19:12:26 2007 -0700 H. Peter Anvin
+ * Update documentation
+Tue Sep 18 18:37:36 2007 -0700 H. Peter Anvin
+ * Simple test for hexadecimal floating-point numbers
+Tue Sep 18 18:33:17 2007 -0700 H. Peter Anvin
+ * Fix error-reporting in hexadecimal floating-point numbers
+Tue Sep 18 18:31:26 2007 -0700 H. Peter Anvin
+ * Support C99-style hexadecimal floating point.
+Tue Sep 18 17:50:34 2007 -0700 H. Peter Anvin
+ * Unify all standard IEEE floating-point formats; add 128-bit
+Tue Sep 18 17:49:09 2007 -0700 H. Peter Anvin
+ * Fix handling of DO; support unary + for floating-point numbers
+Tue Sep 18 16:39:03 2007 -0700 H. Peter Anvin
+ * Support 16-bit IEEE floating point; used in SSE5
+Tue Sep 18 15:43:40 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 15:43:08 2007 -0700 H. Peter Anvin
+ * Add NOP with argument to the instruction list
+Tue Sep 18 15:24:38 2007 -0700 H. Peter Anvin
+ * Remove 0FC2 from list of instruction prefixes
+Tue Sep 18 15:08:20 2007 -0700 H. Peter Anvin
+ * Speed up the disassembler by allowing prefixed instruction tables
+Tue Sep 18 13:45:12 2007 -0700 H. Peter Anvin
+ * Document oword, do and reso
+Tue Sep 18 13:01:32 2007 -0700 H. Peter Anvin
+ * Implement "oword" (128 bits) as a first-class size
+Tue Sep 18 12:38:07 2007 -0700 H. Peter Anvin
+ * Change the token prehash function for better convergence
+Tue Sep 18 12:23:21 2007 -0700 H. Peter Anvin
+ * SSE5 instruction table
+Tue Sep 18 02:06:09 2007 -0400 Frank Kotler
+ * add "const" to output/outdbg.c
+Mon Sep 17 18:45:44 2007 -0700 H. Peter Anvin
+ * Disassembler support for SSE5 instructions
+Mon Sep 17 17:27:46 2007 -0700 H. Peter Anvin
+ * insns.dat: All SSE5 instructions are AMD
+Mon Sep 17 17:25:27 2007 -0700 H. Peter Anvin
+ * Actually generate SSE5 instructions
+Mon Sep 17 16:55:04 2007 -0700 H. Peter Anvin
+ * Initial support for generating DREX suffixes
+Mon Sep 17 16:31:33 2007 -0700 H. Peter Anvin
+ * Fix a few instances of missing renumbers
+Mon Sep 17 16:20:45 2007 -0700 H. Peter Anvin
+ * Enable IF_AR3
+Mon Sep 17 15:49:53 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Mon Sep 17 15:49:30 2007 -0700 H. Peter Anvin
+ * Initial support for four arguments per instruction
+Mon Sep 17 15:48:32 2007 -0700 H. Peter Anvin
+ * CLFLUSH: Neither an x64 instruction nor AMD
+Mon Sep 17 13:56:26 2007 -0700 H. Peter Anvin
+ * Sort dependency lists
+Mon Sep 17 13:53:14 2007 -0700 H. Peter Anvin
+ * Cleaner way to handle MSVC's _snprintf() underscore damage
+Mon Sep 17 13:19:25 2007 -0700 H. Peter Anvin
+ * test/r13.asm: test special-casing of rbp and r13 in 64-bit mode
+Mon Sep 17 13:03:33 2007 -0700 H. Peter Anvin
+ * Additional documentation for 64-bit programming
+Sun Sep 16 22:27:07 2007 -0700 H. Peter Anvin
+ * INSTALL: MSVC++ compilation instructions
+Sun Sep 16 22:17:29 2007 -0700 H. Peter Anvin
+ * make alldeps: change Mkfiles/Makefile.* to Mkfiles/*.mak
+Sun Sep 16 22:16:24 2007 -0700 H. Peter Anvin
+ * Fix Makefile for MSVC++ 2005, delete obsolete Makefiles
+Sun Sep 16 22:15:34 2007 -0700 H. Peter Anvin
+ * Minor fixes needed to compile with MSVC++ 2005
+Sun Sep 16 18:35:02 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Sun Sep 16 18:04:57 2007 -0700 H. Peter Anvin
+ * Switch the preprocessor over to using the hash table library
+Sun Sep 16 17:53:17 2007 -0700 H. Peter Anvin
+ * Fix the handling of local labels
+Fri Sep 14 18:36:01 2007 -0700 H. Peter Anvin
+ * preproc.c: remove unnecessary int64_t
+Fri Sep 14 18:03:29 2007 -0700 H. Peter Anvin
+ * Use the new hash table function library to store labels
+Fri Sep 14 09:24:38 2007 -0700 H. Peter Anvin
+ * Define a proper hash table library
+Thu Sep 13 18:13:20 2007 -0700 H. Peter Anvin
+ * Simple performance benchmarks: label, macro and token lookups
+Thu Sep 13 12:25:32 2007 -0700 H. Peter Anvin
+ * release script: fix final cleanup
+Thu Sep 13 12:22:00 2007 -0700 H. Peter Anvin
+ * Modify release script for a git-centric world
+Thu Sep 13 11:06:42 2007 -0700 H. Peter Anvin
+ * pptok.c: don't insist on C99 compiler behaviour
+Wed Sep 12 22:02:06 2007 -0700 H. Peter Anvin
+ * Fix literal F2 and F3 prefixes
+Wed Sep 12 21:58:51 2007 -0700 H. Peter Anvin
+ * Add (untested!) SSSE3, SSE4.1, SSE4.2 instructions
+Wed Sep 12 21:06:36 2007 -0700 H. Peter Anvin
+ * Add support for Tejas New Instructions (SSSE3)
+Wed Sep 12 21:05:06 2007 -0700 H. Peter Anvin
+ * Remove $Id$ tags (useless with git)
+Wed Sep 12 21:04:58 2007 -0700 H. Peter Anvin
+ * Use rm32 operands for VMREAD/VMWRITE
+Wed Sep 12 21:04:51 2007 -0700 H. Peter Anvin
+ * Macros for SSSE3/SSE4 instruction sets
+Wed Sep 12 21:04:39 2007 -0700 H. Peter Anvin
+ * Support r/m operands for non-integer types
+Wed Sep 12 20:27:41 2007 -0700 H. Peter Anvin
+ * Use enumerations where practical to ease debugging
+Wed Sep 12 17:02:55 2007 +0000 H. Peter Anvin
+ * pptok.c: quick-and-dirty downcasing during prehashing
+Wed Sep 12 16:55:57 2007 +0000 H. Peter Anvin
+ * phash: Tell the user when the graph is OK
+Wed Sep 12 05:18:20 2007 +0000 H. Peter Anvin
+ * pptok.c: handle holes in the pp_directives array
+Wed Sep 12 04:20:08 2007 +0000 H. Peter Anvin
+ * preproc.c: adjust whitespace
+Wed Sep 12 04:18:37 2007 +0000 H. Peter Anvin
+ * More automation in the preprocessor conditionals handling
+Wed Sep 12 02:13:39 2007 +0000 H. Peter Anvin
+ * pptok.c: fix spacing
+Wed Sep 12 02:12:07 2007 +0000 H. Peter Anvin
+ * Generate automatically correct tests for %if and %elif
+Wed Sep 12 01:34:19 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"; add dependencies missing from the previous checkin
+Wed Sep 12 01:29:43 2007 +0000 H. Peter Anvin
+ * Use a perfect hash to look up preprocessor directives
+Wed Sep 12 01:27:53 2007 +0000 H. Peter Anvin
+ * phash: Be a bit more aggressive about trying to make a small hash
+Wed Sep 12 00:22:29 2007 +0000 H. Peter Anvin
+ * Add RCXZ as a known preprocessor condition
+Tue Sep 11 23:57:23 2007 +0000 H. Peter Anvin
+ * doc: add some cross-references
+Tue Sep 11 23:52:01 2007 +0000 H. Peter Anvin
+ * Feeble attempt at updating the documentation; remove Appendix B
+Tue Sep 11 22:44:03 2007 +0000 H. Peter Anvin
+ * Handle instructions which can have both REX.W and OSP
+Tue Sep 11 22:14:18 2007 +0000 H. Peter Anvin
+ * Use enums to make debugging easier
+Tue Sep 11 22:13:17 2007 +0000 H. Peter Anvin
+ * ndisasm: handle \366 codes, prefer unprefixed instructions
+Tue Sep 11 22:00:34 2007 +0000 H. Peter Anvin
+ * Simplify tokens.dat slightly
+Tue Sep 11 04:26:44 2007 +0000 H. Peter Anvin
+ * Quiet gcc warning about uninitialized variables
+Tue Sep 11 04:16:57 2007 +0000 H. Peter Anvin
+ * Make the big instruction arrays "const"
+Mon Sep 10 23:32:05 2007 +0000 H. Peter Anvin
+ * Use an actual enum for the opcode
+Mon Sep 10 23:30:21 2007 +0000 H. Peter Anvin
+ * Fix order of token arguments
+Mon Sep 10 18:59:26 2007 +0000 H. Peter Anvin
+ * assemble.c: correct special handing of ESP/RSP
+Mon Sep 10 18:59:01 2007 +0000 H. Peter Anvin
+ * tokhash: correct duplicate-token test
+Mon Sep 10 18:58:40 2007 +0000 H. Peter Anvin
+ * tokhash: adjust table types to reduce size
+Mon Sep 10 18:55:52 2007 +0000 H. Peter Anvin
+ * Fix the MMXREG and XMMREG flags definitions.
+Wed Sep 5 06:48:38 2007 +0000 H. Peter Anvin
+ * nasm.spec.in: Copyright -> License
+Wed Sep 5 06:40:51 2007 +0000 H. Peter Anvin
+ * Fix "make tar"; useful for RPM testing
+Wed Sep 5 06:24:43 2007 +0000 H. Peter Anvin
+ * Remove obsolete Serial: construct; we shouldn't need it anyway.
+Tue Sep 4 01:29:43 2007 +0000 Chuck Crayne
+ * Provide 64-bit support for ORG directive
+Sun Sep 2 16:37:03 2007 +0000 H. Peter Anvin
+ * Fix some MMX/SSE irregularities which interact with the 64-bit support
+Sun Sep 2 14:46:00 2007 +0000 H. Peter Anvin
+ * phash.ph: yet another attempt at getting Perl to behave, arithmetically
+Sun Sep 2 06:23:29 2007 +0000 H. Peter Anvin
+ * Simple 64-bit org test
+Sun Sep 2 06:20:15 2007 +0000 H. Peter Anvin
+ * phash.ph: remove some stale code
+Sun Sep 2 01:00:34 2007 +0000 Chuck Crayne
+ * Force use of integer values for generating hash keys.
+Fri Aug 31 18:10:23 2007 +0000 H. Peter Anvin
+ * phash: don't rely on the build platform Perl version of rand()
+Fri Aug 31 07:31:51 2007 +0000 H. Peter Anvin
+ * tokhash.pl: formatting changes for readability
+Fri Aug 31 07:23:31 2007 +0000 H. Peter Anvin
+ * tokhash: Speed up the rejection of unhashed values
+Fri Aug 31 06:06:17 2007 +0000 H. Peter Anvin
+ * tokhash.pl: "ix" should have the same width as the "hash" arrays
+Fri Aug 31 00:28:35 2007 +0000 H. Peter Anvin
+ * Add "do not edit" comment to tokhash.c
+Fri Aug 31 00:23:40 2007 +0000 H. Peter Anvin
+ * Make the token hash a bit smaller by using 16-bit hash tables
+Fri Aug 31 00:16:10 2007 +0000 H. Peter Anvin
+ * Minor cleanup; remove duplication of names.c
+Thu Aug 30 23:42:39 2007 +0000 H. Peter Anvin
+ * phash.ph: use a bipartite graph to reduce the storage requirements
+Thu Aug 30 22:35:34 2007 +0000 H. Peter Anvin
+ * Finishing touches on perfect hash tokenizer; actually turn the thing on
+Thu Aug 30 21:50:20 2007 +0000 H. Peter Anvin
+ * Makefile rule for tokhash.c
+Thu Aug 30 21:47:46 2007 +0000 H. Peter Anvin
+ * tokens.dat: Data file containing alphanumeric tokens not in other .dats
+Thu Aug 30 21:45:56 2007 +0000 H. Peter Anvin
+ * Generate a perfect hash for the token parser
+Thu Aug 30 21:40:08 2007 +0000 H. Peter Anvin
+ * Fix bugs in repeated suffix handling, which led to missing r8d/r8w/r8d
+Thu Aug 30 21:39:37 2007 +0000 H. Peter Anvin
+ * phash.ph: more powerful prehashing
+Thu Aug 30 20:15:25 2007 +0000 H. Peter Anvin
+ * Make the perfect hash generator an includable module
+Wed Aug 29 20:30:31 2007 +0000 H. Peter Anvin
+ * Correct the logic for recording fs: and gs: overrides.
+Wed Aug 29 18:20:19 2007 +0000 H. Peter Anvin
+ * Generate R_X86_64_64 relocations in elf64 output
+Wed Aug 29 17:24:03 2007 +0000 H. Peter Anvin
+ * Add README file
+Wed Aug 29 17:20:09 2007 +0000 H. Peter Anvin
+ * Create a Perl library directory, and add the Graph module to it
+Wed Aug 29 17:05:17 2007 +0000 H. Peter Anvin
+ * Perfect hash generator, as a perl script
+Wed Aug 29 16:41:43 2007 +0000 H. Peter Anvin
+ * Use standard macro for the default directive
+Wed Aug 29 16:40:26 2007 +0000 H. Peter Anvin
+ * Add standard macro for [default] directive
+Wed Aug 29 16:38:47 2007 +0000 H. Peter Anvin
+ * More test cases for rel and abs addressing
+Wed Aug 29 16:38:05 2007 +0000 H. Peter Anvin
+ * Add [default] directive
+Wed Aug 29 16:25:46 2007 +0000 H. Peter Anvin
+ * nasmlib: add bsii() case-insensitive version of bsi()
+Wed Aug 29 15:49:53 2007 +0000 H. Peter Anvin
+ * Add test cases for IP-relative addressing
+Wed Aug 29 15:19:19 2007 +0000 H. Peter Anvin
+ * Suppress IP-relative only for fs: and gs: overrides
+Tue Aug 28 23:06:00 2007 +0000 H. Peter Anvin
+ * Implement REL/ABS modifiers
+Sun Aug 26 05:51:39 2007 +0000 Frank Kotler
+ * attempt to make static makefiles aware of outelf32/outelf64
+Sun Aug 26 05:48:54 2007 +0000 Frank Kotler
+ * add nasm_strsep to nasmlib, for output/outmacho.c - strtok doesn't work
+Sun Aug 26 05:41:33 2007 +0000 Frank Kotler
+ * remove "#include <unistd.h> from rdoff directory - two places - it annoyed Windows users and seems unneeded
+Sun Aug 26 05:10:24 2007 +0000 Frank Kotler
+ * finally commit Mike Frysinger's "elf-visibility" patch
+Mon Aug 20 21:03:14 2007 +0000 H. Peter Anvin
+ * regs.pl: handle dashed sequences with suffixes
+Mon Aug 20 20:10:04 2007 +0000 H. Peter Anvin
+ * sync.c: change ULONG_MAX to UINT32_MAX
+Mon Aug 20 20:09:11 2007 +0000 H. Peter Anvin
+ * Add _MIN and _MAX macros for the fixed-size types.
+Mon Aug 20 20:02:17 2007 +0000 H. Peter Anvin
+ * ldrdf: cast output of sizeof() before passing to printf(), to avoid warning.
+Sun Aug 19 18:49:26 2007 +0000 Keith Kanios
+ * Fixed RIP address processing ambiguity found by Charles Crayne.
+Fri Aug 17 07:37:52 2007 +0000 Keith Kanios
+ * Fixed issues with REX prefix effective address generation. Fixed XMM instruction output.
+Fri Aug 17 02:03:10 2007 +0000 Keith Kanios
+ * Changed MMXREG and XMMREG flags to help resolve invalid REX prefix generation for MMX instructions.
+Sat Jul 7 02:01:08 2007 +0000 H. Peter Anvin
+ * More int/int32_t confusion
+Sat Jul 7 01:59:52 2007 +0000 H. Peter Anvin
+ * regflag() should return int32_t.
+Thu Jun 21 19:00:12 2007 +0000 H. Peter Anvin
+ * Detect missing <inttypes.h> and include ersatz version if missing
+Thu Jun 21 06:24:23 2007 +0000 H. Peter Anvin
+ * inttypes.h: for older preprocessors, specify L and LL as appropriate
+Thu Jun 21 06:20:43 2007 +0000 H. Peter Anvin
+ * inttypes.h: Fix spelling of SHRT_MAX
+Thu Jun 21 06:15:42 2007 +0000 H. Peter Anvin
+ * inttypes.h: do a single ersatz <inttypes.h> based on <limits.h>
+Sun Jun 3 02:42:41 2007 +0000 Chuck Crayne
+ * Support 32-bit direct addressing in 64-bit mode without base or index regs
+Sat Jun 2 02:26:21 2007 +0000 H. Peter Anvin
+ * Fix the [U]INT*_C() creation macros
+Sat Jun 2 00:05:35 2007 +0000 H. Peter Anvin
+ * For platforms that don't have them, provide <inttypes.h> for common models.
+Wed May 30 22:21:11 2007 +0000 H. Peter Anvin
+ * Fix the handling of the \313 code.
+Wed May 30 22:20:01 2007 +0000 H. Peter Anvin
+ * Machine-generated \321->\324 corrections
+Wed May 30 21:22:33 2007 +0000 Frank Kotler
+ * update "version" to 0.99.02
+Wed May 30 20:30:15 2007 +0000 H. Peter Anvin
+ * Correct the generation of 67 prefixes.
+Wed May 30 18:30:18 2007 +0000 H. Peter Anvin
+ * Update dependencies.
+Wed May 30 16:34:29 2007 +0000 Frank Kotler
+ * update cvs server name in misc/release script
+Wed May 30 04:28:50 2007 +0000 H. Peter Anvin
+ * Avoid magic values; we have more than 124 registers now
+Wed May 30 04:27:58 2007 +0000 H. Peter Anvin
+ * Remove bogus redundant tests
+Wed May 30 03:44:50 2007 +0000 H. Peter Anvin
+ * More \321 -> \324
+Wed May 30 03:44:02 2007 +0000 H. Peter Anvin
+ * Remove bogus check for 64-bitness
+Wed May 30 03:25:21 2007 +0000 H. Peter Anvin
+ * Get rid of magic open-coded "register numbers"
+Wed May 30 02:48:51 2007 +0000 H. Peter Anvin
+ * MOV reg64,reg64 takes \324 (64 bit with REX) not \321 (32 bit)
+Wed May 30 00:18:26 2007 +0000 H. Peter Anvin
+ * Rename REGNORM to REG_EA
+Wed May 30 00:15:25 2007 +0000 H. Peter Anvin
+ * More instruction flag surgery
+Wed May 30 00:05:00 2007 +0000 H. Peter Anvin
+ * More cleanup of operand flags/register classes
+Tue May 29 23:57:12 2007 +0000 H. Peter Anvin
+ * Clean up the existing operand flag definitions, and document
+Tue May 29 21:44:55 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"
+Thu May 24 22:33:07 2007 +0000 Frank Kotler
+ * update version number to 0.99.01
+Tue May 15 04:33:43 2007 +0000 H. Peter Anvin
+ * regs.dat: fix comment
+Fri May 4 18:47:16 2007 +0000 H. Peter Anvin
+ * 16-bit relocations are standard in ELF64 (at my request, incidentally)
+Fri May 4 02:16:08 2007 +0000 Chuck Crayne
+ * Addition of elf32 and elf64 output formats.
+Wed May 2 04:21:26 2007 +0000 Chuck Crayne
+ * Allow '!' to be used in expressions with same meaning as in C.
+Wed May 2 01:59:16 2007 +0000 Chuck Crayne
+ * Add %IFN and %ELIFN as per RFE #786286
+Mon Apr 30 22:26:58 2007 +0000 Chuck Crayne
+ * Accept responsibility for support of outelf64.c
+Sun Apr 29 20:57:53 2007 +0000 Chuck Crayne
+ * Clarify comments about relocation entries.
+Sun Apr 29 00:28:24 2007 +0000 Chuck Crayne
+ * Allow ELF32 to be invoked either as -f elf or -f elf32
+Sat Apr 28 22:18:04 2007 +0000 Chuck Crayne
+ * Eliminate shift count warnings when building on 32-bit systems
+Sat Apr 28 06:18:48 2007 +0000 Chuck Crayne
+ * Initial support for ELF64
+Wed Apr 18 02:27:18 2007 +0000 H. Peter Anvin
+ * Fix the handling of \324 for computing the length
+Wed Apr 18 02:24:34 2007 +0000 Keith Kanios
+ * Fixed RDF/2 to comply with "maxbits" use.
+Tue Apr 17 20:23:11 2007 +0000 H. Peter Anvin
+ * Handle "LOCK as REX.R" for MOV CRx; fix warning for invalid 64-bit regs
+Mon Apr 16 18:16:46 2007 +0000 Keith Kanios
+ * MEM_OFFSET Instructions Fixed.
+Mon Apr 16 15:46:46 2007 +0000 Keith Kanios
+ * Fixed 64-bit Mode Segment Selection.
+Mon Apr 16 14:31:54 2007 +0000 Keith Kanios
+ * Fixed distinction between [LOCAL]SYMBOL/IMMEDIATE for RIP-relative addressing.
+Mon Apr 16 14:05:01 2007 +0000 Keith Kanios
+ * Fixed long mode MEM_OFFS issue.
+Mon Apr 16 13:54:49 2007 +0000 Keith Kanios
+ * Filled in all RIP Register Flags.
+Mon Apr 16 05:26:29 2007 +0000 H. Peter Anvin
+ * More \321 -> \324 for 64-bit instructions
+Mon Apr 16 04:56:06 2007 +0000 Keith Kanios
+ * Fixed 64-bit offset generation.
+Mon Apr 16 02:39:56 2007 +0000 H. Peter Anvin
+ * More 64-bit ndisasm fixes.
+Mon Apr 16 02:02:06 2007 +0000 H. Peter Anvin
+ * Fixes for 64-bit ndisasm.
+Mon Apr 16 01:21:29 2007 +0000 H. Peter Anvin
+ * Use + instead of * for extension; it feels cleaner with the new meaning.
+Mon Apr 16 01:18:30 2007 +0000 H. Peter Anvin
+ * Initial 64-bit support for ndisasm. Still a work in progress.
+Sun Apr 15 23:12:17 2007 +0000 H. Peter Anvin
+ * Clean up the 64-bitification of regs.dat for 64-bit ndisasm support
+Sun Apr 15 23:10:26 2007 +0000 H. Peter Anvin
+ * Remove @GCCFLAGS@
+Sun Apr 15 23:09:23 2007 +0000 H. Peter Anvin
+ * CR8 is not special in any way as far as the assembler is concerned.
+Sun Apr 15 23:03:28 2007 +0000 H. Peter Anvin Sat Nov 24 16:31:48 2007 -0800 H. Peter Anvin
+ * Typo fixes in documentation
+Tue Nov 20 23:37:46 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc3
+Tue Nov 20 21:45:16 2007 -0800 H. Peter Anvin
+ * Unbreak CMPSW/CMPSD/CMPSQ
+Tue Nov 20 13:23:34 2007 -0800 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Tue Nov 20 13:22:58 2007 -0800 H. Peter Anvin
+ * ndisasm: handle the case of "no more sync points"
+Mon Nov 19 23:09:31 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc2
+Mon Nov 19 23:09:24 2007 -0800 H. Peter Anvin
+ * tag-release: a simple script to tag the repository for release
+Mon Nov 19 13:14:59 2007 -0800 H. Peter Anvin
+ * Slightly faster implementation of the deadman counter
+Mon Nov 19 12:26:50 2007 -0800 H. Peter Anvin
+ * BR 812417: Deadman counter for macro expansion
+Mon Nov 19 12:02:38 2007 -0800 H. Peter Anvin
+ * BR 877583: Fix RAA memory leak
+Mon Nov 19 11:53:18 2007 -0800 H. Peter Anvin
+ * BR 863173: Fix offsets of TIMES/INCBIN in list file
+Mon Nov 19 11:45:40 2007 -0800 H. Peter Anvin
+ * BR 1834731: Remove redundant error messages for no input file
+Mon Nov 19 11:44:05 2007 -0800 H. Peter Anvin
+ * insns.pl: remove debugging output
+Sun Nov 18 22:18:09 2007 -0800 H. Peter Anvin
+ * Clean up remaining build warnings
+Sun Nov 18 21:55:26 2007 -0800 H. Peter Anvin
+ * BR 1834292: Fix multiple disassembler bugs
+Sun Nov 18 12:01:05 2007 -0800 H. Peter Anvin
+ * BR 1834056: Remove warnings in rdoff/rdoff.c
+Sun Nov 18 11:55:10 2007 -0800 H. Peter Anvin
+ * BR 1091926: Bounds checking for command line parsing
+Sat Nov 17 21:21:18 2007 -0800 H. Peter Anvin
+ * Remove FIXME from documentation
+Sat Nov 17 21:08:33 2007 -0800 Charles Crayne
+ * Check in Keith's Fixes
+Sat Nov 17 14:35:19 2007 -0800 H. Peter Anvin
+ * Make the definition for float_const() match the prototype
+Fri Nov 16 00:03:02 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc1
+Thu Nov 15 17:12:29 2007 -0800 H. Peter Anvin
+ * Clean up the command-line parsing; make -w/-W match others
+Thu Nov 15 14:38:19 2007 -0800 H. Peter Anvin
+ * BR 993895: Support zero-operand floating-point insn
+Thu Nov 15 10:25:52 2007 -0800 H. Peter Anvin
+ * Remove some vestiges of "native" RESW/RESD support
+Thu Nov 15 10:24:55 2007 -0800 H. Peter Anvin
+ * outbin.c: fix one missed change from type -> size
+Tue Nov 13 19:52:54 2007 -0800 root
+ * Support setting OSABI value in ELF header.
+Tue Nov 13 11:34:34 2007 -0800 H. Peter Anvin
+ * Enable a few warnings by default; clean up warning descriptions
+Tue Nov 13 11:31:15 2007 -0800 H. Peter Anvin
+ * Add gcc-style -W/-Wno- warning selections; -Wall; -Werror
+Tue Nov 13 10:37:23 2007 -0800 H. Peter Anvin
+ * Clean up the fwrite*() function definitions somewhat
+Tue Nov 13 09:49:51 2007 -0800 H. Peter Anvin
+ * Cast 64-bit switch expressions to (int) to keep OpenWatcom happy
+Tue Nov 13 09:46:38 2007 -0800 H. Peter Anvin
+ * x86-host-specific performance improvement
+Tue Nov 13 09:37:59 2007 -0800 H. Peter Anvin
+ * Address data is int64_t; simplify writing an address object
+Mon Nov 12 23:00:31 2007 -0800 H. Peter Anvin
+ * ndisasm: factor out the common operand-extraction code
+Mon Nov 12 22:56:07 2007 -0800 H. Peter Anvin
+ * Un-special-case "xchg rax,rax"; disassemble o64
+Mon Nov 12 22:11:46 2007 -0800 H. Peter Anvin
+ * BR 1709392: Fix alignment handling in Mach-O formatSat Nov 24 16:31:48 2007 -0800 H. Peter Anvin
+ * Typo fixes in documentation
+Tue Nov 20 23:37:46 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc3
+Tue Nov 20 21:45:16 2007 -0800 H. Peter Anvin
+ * Unbreak CMPSW/CMPSD/CMPSQ
+Tue Nov 20 13:23:34 2007 -0800 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Tue Nov 20 13:22:58 2007 -0800 H. Peter Anvin
+ * ndisasm: handle the case of "no more sync points"
+Mon Nov 19 23:09:31 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc2
+Mon Nov 19 23:09:24 2007 -0800 H. Peter Anvin
+ * tag-release: a simple script to tag the repository for release
+Mon Nov 19 13:14:59 2007 -0800 H. Peter Anvin
+ * Slightly faster implementation of the deadman counter
+Mon Nov 19 12:26:50 2007 -0800 H. Peter Anvin
+ * BR 812417: Deadman counter for macro expansion
+Mon Nov 19 12:02:38 2007 -0800 H. Peter Anvin
+ * BR 877583: Fix RAA memory leak
+Mon Nov 19 11:53:18 2007 -0800 H. Peter Anvin
+ * BR 863173: Fix offsets of TIMES/INCBIN in list file
+Mon Nov 19 11:45:40 2007 -0800 H. Peter Anvin
+ * BR 1834731: Remove redundant error messages for no input file
+Mon Nov 19 11:44:05 2007 -0800 H. Peter Anvin
+ * insns.pl: remove debugging output
+Sun Nov 18 22:18:09 2007 -0800 H. Peter Anvin
+ * Clean up remaining build warnings
+Sun Nov 18 21:55:26 2007 -0800 H. Peter Anvin
+ * BR 1834292: Fix multiple disassembler bugs
+Sun Nov 18 12:01:05 2007 -0800 H. Peter Anvin
+ * BR 1834056: Remove warnings in rdoff/rdoff.c
+Sun Nov 18 11:55:10 2007 -0800 H. Peter Anvin
+ * BR 1091926: Bounds checking for command line parsing
+Sat Nov 17 21:21:18 2007 -0800 H. Peter Anvin
+ * Remove FIXME from documentation
+Sat Nov 17 21:08:33 2007 -0800 Charles Crayne
+ * Check in Keith's Fixes
+Sat Nov 17 14:35:19 2007 -0800 H. Peter Anvin
+ * Make the definition for float_const() match the prototype
+Fri Nov 16 00:03:02 2007 -0800 H. Peter Anvin
+ * NASM 2.00rc1
+Thu Nov 15 17:12:29 2007 -0800 H. Peter Anvin
+ * Clean up the command-line parsing; make -w/-W match others
+Thu Nov 15 14:38:19 2007 -0800 H. Peter Anvin
+ * BR 993895: Support zero-operand floating-point insn
+Thu Nov 15 10:25:52 2007 -0800 H. Peter Anvin
+ * Remove some vestiges of "native" RESW/RESD support
+Thu Nov 15 10:24:55 2007 -0800 H. Peter Anvin
+ * outbin.c: fix one missed change from type -> size
+Tue Nov 13 19:52:54 2007 -0800 root
+ * Support setting OSABI value in ELF header.
+Tue Nov 13 11:34:34 2007 -0800 H. Peter Anvin
+ * Enable a few warnings by default; clean up warning descriptions
+Tue Nov 13 11:31:15 2007 -0800 H. Peter Anvin
+ * Add gcc-style -W/-Wno- warning selections; -Wall; -Werror
+Tue Nov 13 10:37:23 2007 -0800 H. Peter Anvin
+ * Clean up the fwrite*() function definitions somewhat
+Tue Nov 13 09:49:51 2007 -0800 H. Peter Anvin
+ * Cast 64-bit switch expressions to (int) to keep OpenWatcom happy
+Tue Nov 13 09:46:38 2007 -0800 H. Peter Anvin
+ * x86-host-specific performance improvement
+Tue Nov 13 09:37:59 2007 -0800 H. Peter Anvin
+ * Address data is int64_t; simplify writing an address object
+Mon Nov 12 23:00:31 2007 -0800 H. Peter Anvin
+ * ndisasm: factor out the common operand-extraction code
+Mon Nov 12 22:56:07 2007 -0800 H. Peter Anvin
+ * Un-special-case "xchg rax,rax"; disassemble o64
+Mon Nov 12 22:11:46 2007 -0800 H. Peter Anvin
+ * BR 1709392: Fix alignment handling in Mach-O format
+Mon Nov 12 22:05:31 2007 -0800 H. Peter Anvin
+ * BR 1828866: fix handling of LAR/LSL
+Mon Nov 12 21:57:00 2007 -0800 H. Peter Anvin
+ * Better (but not *good!*) handling of 64-bit addressing in ndisasm
+Mon Nov 12 21:02:33 2007 -0800 H. Peter Anvin
+ * Fix disassembly of XCHG
+Mon Nov 12 20:18:33 2007 -0800 H. Peter Anvin
+ * Test of XCHG
+Mon Nov 12 20:18:05 2007 -0800 H. Peter Anvin
+ * Fix handling of XCHG in 64-bit mode
+Mon Nov 12 19:36:13 2007 -0800 H. Peter Anvin
+ * More \321 -> \324 bug fixes
+Mon Nov 12 18:26:31 2007 -0800 H. Peter Anvin
+ * float.c: all warnings and errors are pass 1 only
+Sat Nov 10 21:55:19 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives.
+Sat Nov 10 17:52:23 2007 -0800 Charles Crayne
+ * Clean up a few more 32-bit bottlenecks
+Fri Nov 9 16:37:41 2007 -0800 Charles Crayne
+ * Update documantation for stack relative directives
+Fri Nov 9 16:33:54 2007 -0800 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Fri Nov 9 16:25:43 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives
+Fri Nov 9 14:44:02 2007 -0800 H. Peter Anvin
+ * Don't combine type and size into a single argument
+Thu Nov 8 22:11:14 2007 -0800 Charles Crayne
+ * Add flat64 to %stacksize choices
+Thu Nov 8 20:43:22 2007 -0800 H. Peter Anvin
+ * Fix building under OpenWatcom
+Thu Nov 8 20:29:37 2007 -0800 H. Peter Anvin
+ * ps2pdf: remove -dOptimize=true
+Thu Nov 8 20:21:41 2007 -0800 H. Peter Anvin
+ * No binary files left in the source distro; unbreak release script
+Thu Nov 8 20:01:11 2007 -0800 H. Peter Anvin
+ * BR 1828103: Fix %arg and %local
+Thu Nov 8 19:34:01 2007 -0800 H. Peter Anvin
+ * nasmlib.c: prefix_name(): use the elements() macro
+Thu Nov 8 19:30:22 2007 -0800 H. Peter Anvin
+ * Move elements() to nasmlib.h
+Thu Nov 8 19:15:33 2007 -0800 H. Peter Anvin
+ * constipate the "str" argument to bsi() and bsii()
+Wed Nov 7 19:03:46 2007 -0800 Charles Crayne
+ * Upgrade RAA functions to hold 64-bit data.
+Tue Nov 6 21:48:12 2007 -0800 Charles Crayne
+ * Pass 64-bit instruction lengths to back-ends.
+Tue Nov 6 18:27:23 2007 -0800 Charles Crayne
+ * Prepare for 64-bit instruction lengths
+Mon Nov 5 21:49:49 2007 -0800 Charles Crayne
+ * Disambiguate error messages
+Mon Nov 5 17:19:32 2007 -0800 Charles Crayne
+ * Upgrade label functions to 64-bit
+Sun Nov 4 21:10:42 2007 -0800 H. Peter Anvin
+ * Permit opcode names as labels as long as they are followed by a colon
+Sun Nov 4 15:28:30 2007 -0800 Charles Crayne
+ * Make warning limit valid for both i386 and x86_64
+Sat Nov 3 22:06:13 2007 -0700 Charles Crayne
+ * Warn on out of bounds EA displacements
+Thu Nov 1 15:08:27 2007 -0700 H. Peter Anvin
+ * Treat info files as binary when creating xdoc distro file
+Thu Nov 1 15:07:42 2007 -0700 H. Peter Anvin
+ * Remove obsolete binary files from the distribution
+Thu Nov 1 14:53:32 2007 -0700 H. Peter Anvin
+ * Move declarations before statements
+Wed Oct 31 23:37:35 2007 -0700 H. Peter Anvin
+ * NASM 0.99.06
+Wed Oct 31 23:37:19 2007 -0700 H. Peter Anvin
+ * Script to tag the tree for release
+Wed Oct 31 10:59:26 2007 -0700 H. Peter Anvin
+ * Even more "riprel" tests
+Tue Oct 30 01:17:57 2007 -0700 H. Peter Anvin
+ * floatx.asm: add tests for "rounds up to smallest denorm"
+Tue Oct 30 01:13:27 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Tue Oct 30 01:13:09 2007 -0700 H. Peter Anvin
+ * float.c: handle round-up-to-denorm correctly.
+Tue Oct 30 00:59:27 2007 -0700 H. Peter Anvin
+ * Exhaustive test for 8-bit floating point values
+Mon Oct 29 23:12:47 2007 -0700 H. Peter Anvin
+ * Clean up the handing of operands in assemble.c
+Mon Oct 29 22:56:08 2007 -0700 H. Peter Anvin
+ * Don't warn for segmented references
+Mon Oct 29 20:20:12 2007 -0700 H. Peter Anvin
+ * Use a 32-bit floating-point limb size; support 8-bit float
+Mon Oct 29 18:24:59 2007 -0700 Charles Crayne
+ * Reduce severity of redundant prefixes from error to warning.
+Sun Oct 28 23:23:24 2007 -0700 H. Peter Anvin
+ * Test of some addressing modes in 64-bit mode.
+Sun Oct 28 23:21:46 2007 -0700 H. Peter Anvin
+ * Fix bogus flagging of effective addresses as invalid
+Sun Oct 28 23:10:34 2007 -0700 H. Peter Anvin
+ * Actually shut up the warning in rdfload.c
+Sun Oct 28 22:04:42 2007 -0700 H. Peter Anvin
+ * Clean up stealth whitespace
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * Fix warning about cast to pointer in rdfload.c
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * 64-bit addressing and prefix handling changes
+Sun Oct 28 15:29:54 2007 -0700 Charles Crayne
+ * Adjust stabs symbol index to match symbol table.
+Fri Oct 26 21:38:02 2007 -0700 H. Peter Anvin
+ * readnum(): handle prefix-suffix collision like "0h"
+Fri Oct 26 18:49:29 2007 -0700 H. Peter Anvin
+ * Better handling of platforms which hide "extended" functionality
+Wed Oct 24 15:51:40 2007 -0700 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Wed Oct 24 15:30:17 2007 -0700 Charles Crayne
+ * Update sections about debug info formats
+Wed Oct 24 15:29:51 2007 -0700 H. Peter Anvin
+ * Fix the handling of floating-point tokens in the preprocessor
+Tue Oct 23 19:28:39 2007 -0700 Charles Crayne
+ * Fix bugs item #1817677
+Tue Oct 23 00:08:58 2007 -0700 H. Peter Anvin
+ * Slightly simplify the radix-detection code
+Mon Oct 22 19:48:06 2007 -0700 H. Peter Anvin
+ * Unbreak particularly tricky hex constants
+Mon Oct 22 19:37:36 2007 -0700 H. Peter Anvin
+ * Decimal floating point can also start with 0. 0e 0E
+Mon Oct 22 17:34:10 2007 -0700 H. Peter Anvin
+ * Support binary and octal floating-point
+Mon Oct 22 16:53:48 2007 -0700 H. Peter Anvin
+ * More consistent handling of radix letters
+Sun Oct 21 15:33:01 2007 -0700 H. Peter Anvin
+ * float.c: correct exponent capping
+Sun Oct 21 14:21:43 2007 -0700 Charles Crayne
+ * Clean up elf symbol table section
+Fri Oct 19 18:33:57 2007 -0700 H. Peter Anvin
+ * Allow $-prefixed hexadecimal FP as an alternative to 0x
+Fri Oct 19 14:43:22 2007 -0700 H. Peter Anvin
+ * Scripts to remove stealth whitespace
+Fri Oct 19 14:42:29 2007 -0700 H. Peter Anvin
+ * Formatting: kill off "stealth whitespace"
+Fri Oct 19 14:26:52 2007 -0700 H. Peter Anvin
+ * test/floatx.asm: fix test case
+Fri Oct 19 14:19:52 2007 -0700 H. Peter Anvin
+ * uscore.asm: Fix test case
+Fri Oct 19 14:17:51 2007 -0700 H. Peter Anvin
+ * float.c: mark read_exponent() static
+Fri Oct 19 14:10:35 2007 -0700 H. Peter Anvin
+ * Don't confuse suffixed hexadecimal with floating-point
+Fri Oct 19 13:17:24 2007 -0700 H. Peter Anvin
+ * Anchor filename locations in .gitignore
+Fri Oct 19 13:16:51 2007 -0700 H. Peter Anvin
+ * test/Makefile: Use -Ox instead of -O999
+Fri Oct 19 13:14:06 2007 -0700 H. Peter Anvin
+ * Test of underscored constants
+Fri Oct 19 13:10:46 2007 -0700 H. Peter Anvin
+ * Allow underscores in numbers; better detection of FP
+Fri Oct 19 10:52:31 2007 -0700 H. Peter Anvin
+ * Modernize nasm.spec.in and make it closer to the Fedora version
+Thu Oct 18 23:33:06 2007 -0700 Charles Crayne
+ * Suppress datarootdir warnings from configure
+Thu Oct 18 21:17:20 2007 -0700 Charles Crayne
+ * Suppress signedness warnings in disassembler
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * Cleaner solution for MinGW handling of __STRICT_ANSI__
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * configure: Undefine __STRICT_ANSI__ for mingw's benefit
+Thu Oct 18 19:14:07 2007 -0700 H. Peter Anvin
+ * Fix invocation of readnum()
+Thu Oct 18 19:02:42 2007 -0700 Charles Crayne
+ * Suppress a few signedness warnings
+Thu Oct 18 17:04:10 2007 -0700 root
+ * Avoid unnecessary warning on redefinition of section (bug 801180)
+Wed Oct 17 17:55:45 2007 -0700 Charles Crayne
+ * Generate stabs entries for any executable section
+Tue Oct 16 22:59:09 2007 -0700 H. Peter Anvin
+ * NASM 0.99.05
+Tue Oct 16 15:46:04 2007 -0700 H. Peter Anvin
+ * Tests of obscenely large exponents
+Tue Oct 16 14:42:32 2007 -0700 H. Peter Anvin
+ * Comma-separate contents of __FLOAT__
+Tue Oct 16 14:40:27 2007 -0700 H. Peter Anvin
+ * Implement floating-point option control directive
+Tue Oct 16 11:48:07 2007 -0700 H. Peter Anvin
+ * Floating-point warning fixes; fix round-to-overflow
+Tue Oct 16 11:32:58 2007 -0700 H. Peter Anvin
+ * Handle rounding of denorms correctly; make fp overflow a warning
+Tue Oct 16 10:35:02 2007 -0700 H. Peter Anvin
+ * Additional entries for .gitignore
+Tue Oct 16 10:32:57 2007 -0700 H. Peter Anvin
+ * Refactor floating-point formatting code; fix 80-bit denorms
+Tue Oct 16 10:31:16 2007 -0700 H. Peter Anvin
+ * Add 1.5 as a test case: representative of an exact fraction
+Mon Oct 15 20:06:06 2007 -0700 H. Peter Anvin
+ * Recognize 'd', 't' and 'y' as radix suffixes
+Mon Oct 15 19:53:10 2007 -0700 H. Peter Anvin
+ * Fix FISTTP opcodes (BR 689695)
+Mon Oct 15 19:46:32 2007 -0700 H. Peter Anvin
+ * New floating-point conversion routines
+Mon Oct 15 17:48:43 2007 -0700 H. Peter Anvin
+ * Add testnos3 from the gdtoa package (floating-point test)
+Sat Oct 13 23:19:21 2007 -0700 H. Peter Anvin
+ * .gitignore file doesn't need to be in the release file
+Sat Oct 13 23:17:41 2007 -0700 H. Peter Anvin
+ * Add .gitignore file so "git status" produces something sane
+Sat Oct 13 23:12:46 2007 -0700 H. Peter Anvin
+ * autoconf: drop AC_USE_SYSTEM_EXTENSIONS to support autoconf 2.59
+Sat Oct 13 07:09:22 2007 -0700 Keith Kanios
+ * Fix 32-bit types in preproc.c and eval.c
+Thu Oct 11 20:32:33 2007 -0700 Charles Crayne
+ * Must define types before using them
+Thu Oct 11 13:42:09 2007 -0700 H. Peter Anvin
+ * preproc.c: move smacro define/undef to separate functions
+Thu Oct 11 13:38:38 2007 -0700 H. Peter Anvin
+ * preproc.c: PP_DEFINE and PP_XDEFINE are case-sensitive
+Thu Oct 11 12:52:03 2007 -0700 H. Peter Anvin
+ * preproc.c: normalize the handling of case sensitivity
+Thu Oct 11 12:51:06 2007 -0700 H. Peter Anvin
+ * Define macros necessary for <inttypes.h> on C++
+Thu Oct 11 10:12:58 2007 -0700 H. Peter Anvin
+ * More "bool" fixes
+Thu Oct 11 10:11:57 2007 -0700 H. Peter Anvin
+ * preproc.c: allow 64-bit repeat counts
+Thu Oct 11 10:06:19 2007 -0700 H. Peter Anvin
+ * preproc.c: For an SMacro, in_progress really is a boolean (no %rep)
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * Additional uses of bool and enum
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * preproc.c: MMacro.in_progress is not a boolean
+Wed Oct 10 18:07:51 2007 -0700 H. Peter Anvin
+ * saa_fread/fwrite: when seeking, must set [rw]ptr as well
+Wed Oct 10 14:58:45 2007 -0700 H. Peter Anvin
+ * Use the compiler-provided booleans if available, otherwise emulate
+Wed Oct 10 14:55:14 2007 -0700 H. Peter Anvin
+ * owlinux.mak: don't clean things we won't be able to
+Wed Oct 10 14:29:53 2007 -0700 H. Peter Anvin
+ * configure.in: looks like we need autoconf 2.61 :(
+Wed Oct 10 14:06:59 2007 -0700 H. Peter Anvin
+ * Create option -Ox to tell NASM to do unlimited passes
+Mon Oct 8 19:26:57 2007 -0700 H. Peter Anvin
+ * Revert "floatb.asm: fix broken testcase"
+Mon Oct 8 18:39:24 2007 -0700 H. Peter Anvin
+ * floatb.asm: fix broken testcase
+Mon Oct 8 12:41:00 2007 -0700 H. Peter Anvin
+ * saa_rstruct: fix overrun check
+Mon Oct 8 12:12:23 2007 -0700 H. Peter Anvin
+ * Add Frank's floattest.asm test file
+Sun Oct 7 21:13:14 2007 -0700 H. Peter Anvin
+ * saa_fpwrite: initializing "len" should be part of the loop
+Sun Oct 7 18:46:57 2007 -0700 Charles Crayne
+ * Fix infinite loop in function saa_fpwrite
+Fri Oct 5 17:44:16 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: use a real instruction to avoid confusing ndisasm
+Fri Oct 5 17:42:31 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: add test cases for non-initial \170 uses
+Fri Oct 5 17:29:01 2007 -0700 H. Peter Anvin
+ * Check in the proper zerobyte test
+Fri Oct 5 17:04:32 2007 -0700 H. Peter Anvin
+ * Emit REX prefix before literal zero (\170)
+Fri Oct 5 17:01:15 2007 -0700 H. Peter Anvin
+ * LICENSE: Break long line
+Fri Oct 5 14:36:03 2007 -0700 H. Peter Anvin
+ * Add test for problematic floats
+Thu Oct 4 23:51:08 2007 -0700 H. Peter Anvin
+ * floatx.asm: add Inf and NaN to the boundary condition tests
+Thu Oct 4 23:09:19 2007 -0700 H. Peter Anvin
+ * floatx.asm: add specific tests for exponent boundary conditions
+Thu Oct 4 22:51:08 2007 -0700 H. Peter Anvin
+ * float.c: correct the exponent
+Thu Oct 4 15:18:23 2007 -0700 H. Peter Anvin
+ * Additional rules in test/Makefile
+Thu Oct 4 13:42:56 2007 -0700 H. Peter Anvin
+ * Rewrite the handling of SAA's to allow random access
+Wed Oct 3 21:30:57 2007 -0700 H. Peter Anvin
+ * Change cloc_t to struct location, and reorder the members
+Wed Oct 3 21:24:51 2007 -0700 H. Peter Anvin
+ * BR 1352920: change loc_t -> cloc_t
+Wed Oct 3 21:22:16 2007 -0700 H. Peter Anvin
+ * BR 1352920: Handle upper case %line
+Wed Oct 3 17:40:12 2007 -0700 H. Peter Anvin
+ * Use autoconf to request feature macros
+Tue Oct 2 22:04:15 2007 -0700 H. Peter Anvin
+ * preproc.c: constipation
+Tue Oct 2 21:57:27 2007 -0700 H. Peter Anvin
+ * make alldeps
+Tue Oct 2 21:53:51 2007 -0700 H. Peter Anvin
+ * Portability fixes
+Tue Oct 2 21:13:18 2007 -0700 H. Peter Anvin
+ * Run "make alldeps".
+Tue Oct 2 17:40:00 2007 -0700 H. Peter Anvin
+ * Use the crc64 we already use as the perfect hash function prehash
+Tue Oct 2 15:09:33 2007 -0700 H. Peter Anvin
+ * insns.dat: add systematic names for the hinting NOPs (0F18-0F1F)
+Mon Oct 1 11:28:32 2007 -0700 H. Peter Anvin
+ * Unspecified files are null strings, not null pointers
+Mon Oct 1 11:26:31 2007 -0700 H. Peter Anvin
+ * Check for the most basic filename overlaps
+Sun Sep 30 22:15:36 2007 -0700 Charles Crayne
+ * modified: nasm.1 to add newer command line options
+Fri Sep 28 21:27:41 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 20:17:12 2007 -0700 H. Peter Anvin
+ * configure.in: AC_SUBST_FILE should have been AC_SUBST
+Fri Sep 28 17:17:20 2007 -0700 H. Peter Anvin
+ * Unbreak relative references to immediate addresses
+Fri Sep 28 15:16:47 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 12:01:55 2007 -0700 H. Peter Anvin
+ * lib/vsnprintf.c: correct boundary conditions
+Fri Sep 28 10:50:20 2007 -0700 H. Peter Anvin
+ * Add substitutes for snprintf() and vsnprintf()
+Fri Sep 28 02:03:41 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Thu Sep 27 21:35:04 2007 -0700 H. Peter Anvin
+ * Exclude config.h from the dependency list for the canned makefiles
+Thu Sep 27 21:12:17 2007 -0700 H. Peter Anvin
+ * version.pl: Add support for daily snapshot releases
+Thu Sep 27 19:46:55 2007 -0700 H. Peter Anvin
+ * Add Makefile for Linux -> DOS, Win32, OS/2 using OpenWatcom
+Wed Sep 26 19:57:07 2007 -0700 H. Peter Anvin
+ * Add Makefile for OpenWatcom (DOS, OS/2 or Win32 output)
+Wed Sep 26 17:00:18 2007 -0700 H. Peter Anvin
+ * Test for various addressing modes in 64-bit mode
+Wed Sep 26 15:19:28 2007 -0700 H. Peter Anvin
+ * nasm option reshuffling, -E -> -Z
+Tue Sep 25 23:57:21 2007 -0400 Frank Kotler
+ * Version 0.99.04
+Tue Sep 25 20:36:45 2007 -0700 H. Peter Anvin
+ * nasmdoc: corrections on 64-bit immediates/displacements
+Tue Sep 25 16:02:21 2007 -0700 H. Peter Anvin
+ * nasmdoc: shorten lines which are too long
+Tue Sep 25 16:01:07 2007 -0700 H. Peter Anvin
+ * Document NASM behaviour for 64-bit immediates and displacements
+Tue Sep 25 15:44:40 2007 -0700 H. Peter Anvin
+ * test/movimm.asm: add optimizable forms
+Tue Sep 25 15:41:19 2007 -0700 H. Peter Anvin
+ * assemble.c: clean up whitespace
+Tue Sep 25 15:40:36 2007 -0700 H. Peter Anvin
+ * Correct the handling of "MOV" with immediate in 64-bit mode
+Tue Sep 25 15:39:42 2007 -0700 H. Peter Anvin
+ * Test of immediate handling on 64-bit mode
+Tue Sep 25 14:27:34 2007 -0700 H. Peter Anvin
+ * Add nasm_zalloc() to nasmlib.c
+Tue Sep 25 14:26:03 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 14:11:29 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 13:34:55 2007 -0700 H. Peter Anvin
+ * Makefile.in: make "make install" create directories
+Tue Sep 25 08:48:37 2007 -0700 H. Peter Anvin
+ * Fix BR 1445441: uninitialized use of "error_file"
+Mon Sep 24 21:33:17 2007 -0700 H. Peter Anvin
+ * preproc.c: fix the loop in %undef
+Mon Sep 24 20:53:48 2007 -0700 H. Peter Anvin
+ * float.c: clear off uninitialized warning
+Mon Sep 24 17:02:41 2007 -0700 H. Peter Anvin
+ * outcoff: set the "virtual size field" to zero (BR 1351586)
+Mon Sep 24 15:56:02 2007 -0700 H. Peter Anvin
+ * insns.dat: SMINT - mark ND, DMINT - fix opcode
+Mon Sep 24 15:55:20 2007 -0700 H. Peter Anvin
+ * 0F0F is a 3Dnow! prefix; remove from prefix list
+Mon Sep 24 15:48:09 2007 -0700 H. Peter Anvin
+ * Additional compaction missed by script
+Mon Sep 24 15:42:53 2007 -0700 H. Peter Anvin
+ * insns.dat: machine-generated compaction mmx/xmmreg,mem -> mmx/xmmrm
+Mon Sep 24 13:54:00 2007 -0700 H. Peter Anvin
+ * nasmdoc: grammar fix
+Mon Sep 24 13:44:02 2007 -0700 H. Peter Anvin
+ * nasmdoc: remove stray periods
+Mon Sep 24 13:42:09 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Mon Sep 24 13:41:58 2007 -0700 H. Peter Anvin
+ * Implement the -MG option (SF RFE 1564264)
+Mon Sep 24 12:52:09 2007 -0700 H. Peter Anvin
+ * nasmdoc: clarify __float*__ example
+Mon Sep 24 12:44:38 2007 -0700 H. Peter Anvin
+ * nasmdoc: document the __float*__ operators
+Mon Sep 24 12:30:54 2007 -0700 H. Peter Anvin
+ * Support __float*__ for floating-point numbers in expressions
+Mon Sep 24 10:51:07 2007 -0700 H. Peter Anvin
+ * eval.c: replace sequence of ifs with switch
+Mon Sep 24 10:50:23 2007 -0700 H. Peter Anvin
+ * tokhash: allow a bit smarter pattern matching
+Sat Sep 22 22:35:28 2007 -0700 H. Peter Anvin
+ * Implement INVLPGA according to the documentation
+Sat Sep 22 22:02:34 2007 -0700 H. Peter Anvin
+ * Reformat insns.dat to uniform column width
+Sat Sep 22 21:50:03 2007 -0700 H. Peter Anvin
+ * Simple test for 0x67 prefixes
+Sat Sep 22 21:49:51 2007 -0700 H. Peter Anvin
+ * Auto-generate 0x67 prefixes without the need for \30x codes
+Sat Sep 22 21:47:13 2007 -0700 H. Peter Anvin
+ * Make test/Makefile a bit more useful
+Sat Sep 22 21:29:41 2007 -0700 H. Peter Anvin
+ * Add TY_OWORD for "DO" output
+Sat Sep 22 19:52:11 2007 -0700 H. Peter Anvin
+ * LDDQU needs \301 (BR 1103549)
+Sat Sep 22 19:51:13 2007 -0700 H. Peter Anvin
+ * RDTSCP and INVLPGA aren't 64-bit specific
+Sat Sep 22 19:40:37 2007 -0700 H. Peter Anvin
+ * Cyrix GX1 instructions: BBx_RESET, CPU_READ, CPU_WRITE
+Sat Sep 22 19:28:14 2007 -0700 H. Peter Anvin
+ * Centaur XSHA1, XSHA256, MONTMUL
+Sat Sep 22 19:20:56 2007 -0700 H. Peter Anvin
+ * Implement Centaur's XCRYPT instructions
+Sat Sep 22 19:13:05 2007 -0700 H. Peter Anvin
+ * Add Geode LX (AMD's Cyrix-derived core) instructions
+Sat Sep 22 19:05:11 2007 -0700 H. Peter Anvin
+ * Add the GETSEC instruction for Intel SMX
+Sat Sep 22 18:59:18 2007 -0700 H. Peter Anvin
+ * Add the AMD SSE4a and LZCNT instructions
+Sat Sep 22 18:23:20 2007 -0700 H. Peter Anvin
+ * Tag UMOV as ND (no disassembly) to avoid collision
+Sat Sep 22 18:20:49 2007 -0700 H. Peter Anvin
+ * Disallow optimizing by less than 5 passes.
+Sat Sep 22 17:45:45 2007 -0700 H. Peter Anvin
+ * BR 1783117: Document that %+ needs a space after it, and fix crash
+Sat Sep 22 16:44:56 2007 -0700 H. Peter Anvin
+ * nasm.spec.in: minor fixes
+Sat Sep 22 16:38:25 2007 -0700 H. Peter Anvin
+ * release script: handle stricter CLI parsing for "git tag"
+Sat Sep 22 16:35:11 2007 -0700 H. Peter Anvin
+ * Update nasm.spec.in and make it handle rc releases
+Sat Sep 22 16:19:19 2007 -0700 H. Peter Anvin
+ * version.pl: support version numbers of the form X.Y[.Z]rcW
+Thu Sep 20 21:33:43 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Thu Sep 20 21:12:33 2007 -0700 Charles Crayne
+ * modified: misc/release to fix bug in removing .git
+Wed Sep 19 21:41:43 2007 -0700 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Wed Sep 19 21:41:27 2007 -0700 H. Peter Anvin
+ * Update manual pages
+Wed Sep 19 21:41:02 2007 -0700 H. Peter Anvin
+ * Remove limit on number of sync points
+Wed Sep 19 21:40:37 2007 -0700 H. Peter Anvin
+ * Make nasm_malloc() et al available from inside ndisasm
+Wed Sep 19 21:07:32 2007 -0400 Frank Kotler
+ * Version 0.99.03
+Wed Sep 19 21:06:59 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Wed Sep 19 16:22:03 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/sse5'
+Wed Sep 19 16:15:22 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Tue Sep 18 22:54:40 2007 -0700 H. Peter Anvin
+ * Slightly optimize the interface to nasm_token_hash()
+Wed Sep 19 01:34:55 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Tue Sep 18 22:23:42 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 22:22:49 2007 -0700 H. Peter Anvin
+ * elf64: fix 32-bit truncations
+Tue Sep 18 22:08:04 2007 -0700 H. Peter Anvin
+ * Document Infinity and NaN
+Tue Sep 18 21:55:56 2007 -0700 H. Peter Anvin
+ * Support generating NaNs and infinities
+Tue Sep 18 19:12:26 2007 -0700 H. Peter Anvin
+ * Update documentation
+Tue Sep 18 18:37:36 2007 -0700 H. Peter Anvin
+ * Simple test for hexadecimal floating-point numbers
+Tue Sep 18 18:33:17 2007 -0700 H. Peter Anvin
+ * Fix error-reporting in hexadecimal floating-point numbers
+Tue Sep 18 18:31:26 2007 -0700 H. Peter Anvin
+ * Support C99-style hexadecimal floating point.
+Tue Sep 18 17:50:34 2007 -0700 H. Peter Anvin
+ * Unify all standard IEEE floating-point formats; add 128-bit
+Tue Sep 18 17:49:09 2007 -0700 H. Peter Anvin
+ * Fix handling of DO; support unary + for floating-point numbers
+Tue Sep 18 16:39:03 2007 -0700 H. Peter Anvin
+ * Support 16-bit IEEE floating point; used in SSE5
+Tue Sep 18 15:43:40 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 15:43:08 2007 -0700 H. Peter Anvin
+ * Add NOP with argument to the instruction list
+Tue Sep 18 15:24:38 2007 -0700 H. Peter Anvin
+ * Remove 0FC2 from list of instruction prefixes
+Tue Sep 18 15:08:20 2007 -0700 H. Peter Anvin
+ * Speed up the disassembler by allowing prefixed instruction tables
+Tue Sep 18 13:45:12 2007 -0700 H. Peter Anvin
+ * Document oword, do and reso
+Tue Sep 18 13:01:32 2007 -0700 H. Peter Anvin
+ * Implement "oword" (128 bits) as a first-class size
+Tue Sep 18 12:38:07 2007 -0700 H. Peter Anvin
+ * Change the token prehash function for better convergence
+Tue Sep 18 12:23:21 2007 -0700 H. Peter Anvin
+ * SSE5 instruction table
+Tue Sep 18 02:06:09 2007 -0400 Frank Kotler
+ * add "const" to output/outdbg.c
+Mon Sep 17 18:45:44 2007 -0700 H. Peter Anvin
+ * Disassembler support for SSE5 instructions
+Mon Sep 17 17:27:46 2007 -0700 H. Peter Anvin
+ * insns.dat: All SSE5 instructions are AMD
+Mon Sep 17 17:25:27 2007 -0700 H. Peter Anvin
+ * Actually generate SSE5 instructions
+Mon Sep 17 16:55:04 2007 -0700 H. Peter Anvin
+ * Initial support for generating DREX suffixes
+Mon Sep 17 16:31:33 2007 -0700 H. Peter Anvin
+ * Fix a few instances of missing renumbers
+Mon Sep 17 16:20:45 2007 -0700 H. Peter Anvin
+ * Enable IF_AR3
+Mon Sep 17 15:49:53 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Mon Sep 17 15:49:30 2007 -0700 H. Peter Anvin
+ * Initial support for four arguments per instruction
+Mon Sep 17 15:48:32 2007 -0700 H. Peter Anvin
+ * CLFLUSH: Neither an x64 instruction nor AMD
+Mon Sep 17 13:56:26 2007 -0700 H. Peter Anvin
+ * Sort dependency lists
+Mon Sep 17 13:53:14 2007 -0700 H. Peter Anvin
+ * Cleaner way to handle MSVC's _snprintf() underscore damage
+Mon Sep 17 13:19:25 2007 -0700 H. Peter Anvin
+ * test/r13.asm: test special-casing of rbp and r13 in 64-bit mode
+Mon Sep 17 13:03:33 2007 -0700 H. Peter Anvin
+ * Additional documentation for 64-bit programming
+Sun Sep 16 22:27:07 2007 -0700 H. Peter Anvin
+ * INSTALL: MSVC++ compilation instructions
+Sun Sep 16 22:17:29 2007 -0700 H. Peter Anvin
+ * make alldeps: change Mkfiles/Makefile.* to Mkfiles/*.mak
+Sun Sep 16 22:16:24 2007 -0700 H. Peter Anvin
+ * Fix Makefile for MSVC++ 2005, delete obsolete Makefiles
+Sun Sep 16 22:15:34 2007 -0700 H. Peter Anvin
+ * Minor fixes needed to compile with MSVC++ 2005
+Sun Sep 16 18:35:02 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Sun Sep 16 18:04:57 2007 -0700 H. Peter Anvin
+ * Switch the preprocessor over to using the hash table library
+Sun Sep 16 17:53:17 2007 -0700 H. Peter Anvin
+ * Fix the handling of local labels
+Fri Sep 14 18:36:01 2007 -0700 H. Peter Anvin
+ * preproc.c: remove unnecessary int64_t
+Fri Sep 14 18:03:29 2007 -0700 H. Peter Anvin
+ * Use the new hash table function library to store labels
+Fri Sep 14 09:24:38 2007 -0700 H. Peter Anvin
+ * Define a proper hash table library
+Thu Sep 13 18:13:20 2007 -0700 H. Peter Anvin
+ * Simple performance benchmarks: label, macro and token lookups
+Thu Sep 13 12:25:32 2007 -0700 H. Peter Anvin
+ * release script: fix final cleanup
+Thu Sep 13 12:22:00 2007 -0700 H. Peter Anvin
+ * Modify release script for a git-centric world
+Thu Sep 13 11:06:42 2007 -0700 H. Peter Anvin
+ * pptok.c: don't insist on C99 compiler behaviour
+Wed Sep 12 22:02:06 2007 -0700 H. Peter Anvin
+ * Fix literal F2 and F3 prefixes
+Wed Sep 12 21:58:51 2007 -0700 H. Peter Anvin
+ * Add (untested!) SSSE3, SSE4.1, SSE4.2 instructions
+Wed Sep 12 21:06:36 2007 -0700 H. Peter Anvin
+ * Add support for Tejas New Instructions (SSSE3)
+Wed Sep 12 21:05:06 2007 -0700 H. Peter Anvin
+ * Remove $Id$ tags (useless with git)
+Wed Sep 12 21:04:58 2007 -0700 H. Peter Anvin
+ * Use rm32 operands for VMREAD/VMWRITE
+Wed Sep 12 21:04:51 2007 -0700 H. Peter Anvin
+ * Macros for SSSE3/SSE4 instruction sets
+Wed Sep 12 21:04:39 2007 -0700 H. Peter Anvin
+ * Support r/m operands for non-integer types
+Wed Sep 12 20:27:41 2007 -0700 H. Peter Anvin
+ * Use enumerations where practical to ease debugging
+Wed Sep 12 17:02:55 2007 +0000 H. Peter Anvin
+ * pptok.c: quick-and-dirty downcasing during prehashing
+Wed Sep 12 16:55:57 2007 +0000 H. Peter Anvin
+ * phash: Tell the user when the graph is OK
+Wed Sep 12 05:18:20 2007 +0000 H. Peter Anvin
+ * pptok.c: handle holes in the pp_directives array
+Wed Sep 12 04:20:08 2007 +0000 H. Peter Anvin
+ * preproc.c: adjust whitespace
+Wed Sep 12 04:18:37 2007 +0000 H. Peter Anvin
+ * More automation in the preprocessor conditionals handling
+Wed Sep 12 02:13:39 2007 +0000 H. Peter Anvin
+ * pptok.c: fix spacing
+Wed Sep 12 02:12:07 2007 +0000 H. Peter Anvin
+ * Generate automatically correct tests for %if and %elif
+Wed Sep 12 01:34:19 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"; add dependencies missing from the previous checkin
+Wed Sep 12 01:29:43 2007 +0000 H. Peter Anvin
+ * Use a perfect hash to look up preprocessor directives
+Wed Sep 12 01:27:53 2007 +0000 H. Peter Anvin
+ * phash: Be a bit more aggressive about trying to make a small hash
+Wed Sep 12 00:22:29 2007 +0000 H. Peter Anvin
+ * Add RCXZ as a known preprocessor condition
+Tue Sep 11 23:57:23 2007 +0000 H. Peter Anvin
+ * doc: add some cross-references
+Tue Sep 11 23:52:01 2007 +0000 H. Peter Anvin
+ * Feeble attempt at updating the documentation; remove Appendix B
+Tue Sep 11 22:44:03 2007 +0000 H. Peter Anvin
+ * Handle instructions which can have both REX.W and OSP
+Tue Sep 11 22:14:18 2007 +0000 H. Peter Anvin
+ * Use enums to make debugging easier
+Tue Sep 11 22:13:17 2007 +0000 H. Peter Anvin
+ * ndisasm: handle \366 codes, prefer unprefixed instructions
+Tue Sep 11 22:00:34 2007 +0000 H. Peter Anvin
+ * Simplify tokens.dat slightly
+Tue Sep 11 04:26:44 2007 +0000 H. Peter Anvin
+ * Quiet gcc warning about uninitialized variables
+Tue Sep 11 04:16:57 2007 +0000 H. Peter Anvin
+ * Make the big instruction arrays "const"
+Mon Sep 10 23:32:05 2007 +0000 H. Peter Anvin
+ * Use an actual enum for the opcode
+Mon Sep 10 23:30:21 2007 +0000 H. Peter Anvin
+ * Fix order of token arguments
+Mon Sep 10 18:59:26 2007 +0000 H. Peter Anvin
+ * assemble.c: correct special handing of ESP/RSP
+Mon Sep 10 18:59:01 2007 +0000 H. Peter Anvin
+ * tokhash: correct duplicate-token test
+Mon Sep 10 18:58:40 2007 +0000 H. Peter Anvin
+ * tokhash: adjust table types to reduce size
+Mon Sep 10 18:55:52 2007 +0000 H. Peter Anvin
+ * Fix the MMXREG and XMMREG flags definitions.
+Wed Sep 5 06:48:38 2007 +0000 H. Peter Anvin
+ * nasm.spec.in: Copyright -> License
+Wed Sep 5 06:40:51 2007 +0000 H. Peter Anvin
+ * Fix "make tar"; useful for RPM testing
+Wed Sep 5 06:24:43 2007 +0000 H. Peter Anvin
+ * Remove obsolete Serial: construct; we shouldn't need it anyway.
+Tue Sep 4 01:29:43 2007 +0000 Chuck Crayne
+ * Provide 64-bit support for ORG directive
+Sun Sep 2 16:37:03 2007 +0000 H. Peter Anvin
+ * Fix some MMX/SSE irregularities which interact with the 64-bit support
+Sun Sep 2 14:46:00 2007 +0000 H. Peter Anvin
+ * phash.ph: yet another attempt at getting Perl to behave, arithmetically
+Sun Sep 2 06:23:29 2007 +0000 H. Peter Anvin
+ * Simple 64-bit org test
+Sun Sep 2 06:20:15 2007 +0000 H. Peter Anvin
+ * phash.ph: remove some stale code
+Sun Sep 2 01:00:34 2007 +0000 Chuck Crayne
+ * Force use of integer values for generating hash keys.
+Fri Aug 31 18:10:23 2007 +0000 H. Peter Anvin
+ * phash: don't rely on the build platform Perl version of rand()
+Fri Aug 31 07:31:51 2007 +0000 H. Peter Anvin
+ * tokhash.pl: formatting changes for readability
+Fri Aug 31 07:23:31 2007 +0000 H. Peter Anvin
+ * tokhash: Speed up the rejection of unhashed values
+Fri Aug 31 06:06:17 2007 +0000 H. Peter Anvin
+ * tokhash.pl: "ix" should have the same width as the "hash" arrays
+Fri Aug 31 00:28:35 2007 +0000 H. Peter Anvin
+ * Add "do not edit" comment to tokhash.c
+Fri Aug 31 00:23:40 2007 +0000 H. Peter Anvin
+ * Make the token hash a bit smaller by using 16-bit hash tables
+Fri Aug 31 00:16:10 2007 +0000 H. Peter Anvin
+ * Minor cleanup; remove duplication of names.c
+Thu Aug 30 23:42:39 2007 +0000 H. Peter Anvin
+ * phash.ph: use a bipartite graph to reduce the storage requirements
+Thu Aug 30 22:35:34 2007 +0000 H. Peter Anvin
+ * Finishing touches on perfect hash tokenizer; actually turn the thing on
+Thu Aug 30 21:50:20 2007 +0000 H. Peter Anvin
+ * Makefile rule for tokhash.c
+Thu Aug 30 21:47:46 2007 +0000 H. Peter Anvin
+ * tokens.dat: Data file containing alphanumeric tokens not in other .dats
+Thu Aug 30 21:45:56 2007 +0000 H. Peter Anvin
+ * Generate a perfect hash for the token parser
+Thu Aug 30 21:40:08 2007 +0000 H. Peter Anvin
+ * Fix bugs in repeated suffix handling, which led to missing r8d/r8w/r8d
+Thu Aug 30 21:39:37 2007 +0000 H. Peter Anvin
+ * phash.ph: more powerful prehashing
+Thu Aug 30 20:15:25 2007 +0000 H. Peter Anvin
+ * Make the perfect hash generator an includable module
+Wed Aug 29 20:30:31 2007 +0000 H. Peter Anvin
+ * Correct the logic for recording fs: and gs: overrides.
+Wed Aug 29 18:20:19 2007 +0000 H. Peter Anvin
+ * Generate R_X86_64_64 relocations in elf64 output
+Wed Aug 29 17:24:03 2007 +0000 H. Peter Anvin
+ * Add README file
+Wed Aug 29 17:20:09 2007 +0000 H. Peter Anvin
+ * Create a Perl library directory, and add the Graph module to it
+Wed Aug 29 17:05:17 2007 +0000 H. Peter Anvin
+ * Perfect hash generator, as a perl script
+Wed Aug 29 16:41:43 2007 +0000 H. Peter Anvin
+ * Use standard macro for the default directive
+Wed Aug 29 16:40:26 2007 +0000 H. Peter Anvin
+ * Add standard macro for [default] directive
+Wed Aug 29 16:38:47 2007 +0000 H. Peter Anvin
+ * More test cases for rel and abs addressing
+Wed Aug 29 16:38:05 2007 +0000 H. Peter Anvin
+ * Add [default] directive
+Wed Aug 29 16:25:46 2007 +0000 H. Peter Anvin
+ * nasmlib: add bsii() case-insensitive version of bsi()
+Wed Aug 29 15:49:53 2007 +0000 H. Peter Anvin
+ * Add test cases for IP-relative addressing
+Wed Aug 29 15:19:19 2007 +0000 H. Peter Anvin
+ * Suppress IP-relative only for fs: and gs: overrides
+Tue Aug 28 23:06:00 2007 +0000 H. Peter Anvin
+ * Implement REL/ABS modifiers
+Sun Aug 26 05:51:39 2007 +0000 Frank Kotler
+ * attempt to make static makefiles aware of outelf32/outelf64
+Sun Aug 26 05:48:54 2007 +0000 Frank Kotler
+ * add nasm_strsep to nasmlib, for output/outmacho.c - strtok doesn't work
+Sun Aug 26 05:41:33 2007 +0000 Frank Kotler
+ * remove "#include <unistd.h> from rdoff directory - two places - it annoyed Windows users and seems unneeded
+Sun Aug 26 05:10:24 2007 +0000 Frank Kotler
+ * finally commit Mike Frysinger's "elf-visibility" patch
+Mon Aug 20 21:03:14 2007 +0000 H. Peter Anvin
+ * regs.pl: handle dashed sequences with suffixes
+Mon Aug 20 20:10:04 2007 +0000 H. Peter Anvin
+ * sync.c: change ULONG_MAX to UINT32_MAX
+Mon Aug 20 20:09:11 2007 +0000 H. Peter Anvin
+ * Add _MIN and _MAX macros for the fixed-size types.
+Mon Aug 20 20:02:17 2007 +0000 H. Peter Anvin
+ * ldrdf: cast output of sizeof() before passing to printf(), to avoid warning.
+Sun Aug 19 18:49:26 2007 +0000 Keith Kanios
+ * Fixed RIP address processing ambiguity found by Charles Crayne.
+Fri Aug 17 07:37:52 2007 +0000 Keith Kanios
+ * Fixed issues with REX prefix effective address generation. Fixed XMM instruction output.
+Fri Aug 17 02:03:10 2007 +0000 Keith Kanios
+ * Changed MMXREG and XMMREG flags to help resolve invalid REX prefix generation for MMX instructions.
+Sat Jul 7 02:01:08 2007 +0000 H. Peter Anvin
+ * More int/int32_t confusion
+Sat Jul 7 01:59:52 2007 +0000 H. Peter Anvin
+ * regflag() should return int32_t.
+Thu Jun 21 19:00:12 2007 +0000 H. Peter Anvin
+ * Detect missing <inttypes.h> and include ersatz version if missing
+Thu Jun 21 06:24:23 2007 +0000 H. Peter Anvin
+ * inttypes.h: for older preprocessors, specify L and LL as appropriate
+Thu Jun 21 06:20:43 2007 +0000 H. Peter Anvin
+ * inttypes.h: Fix spelling of SHRT_MAX
+Thu Jun 21 06:15:42 2007 +0000 H. Peter Anvin
+ * inttypes.h: do a single ersatz <inttypes.h> based on <limits.h>
+Sun Jun 3 02:42:41 2007 +0000 Chuck Crayne
+ * Support 32-bit direct addressing in 64-bit mode without base or index regs
+Sat Jun 2 02:26:21 2007 +0000 H. Peter Anvin
+ * Fix the [U]INT*_C() creation macros
+Sat Jun 2 00:05:35 2007 +0000 H. Peter Anvin
+ * For platforms that don't have them, provide <inttypes.h> for common models.
+Wed May 30 22:21:11 2007 +0000 H. Peter Anvin
+ * Fix the handling of the \313 code.
+Wed May 30 22:20:01 2007 +0000 H. Peter Anvin
+ * Machine-generated \321->\324 corrections
+Wed May 30 21:22:33 2007 +0000 Frank Kotler
+ * update "version" to 0.99.02
+Wed May 30 20:30:15 2007 +0000 H. Peter Anvin
+ * Correct the generation of 67 prefixes.
+Wed May 30 18:30:18 2007 +0000 H. Peter Anvin
+ * Update dependencies.
+Wed May 30 16:34:29 2007 +0000 Frank Kotler
+ * update cvs server name in misc/release script
+Wed May 30 04:28:50 2007 +0000 H. Peter Anvin
+ * Avoid magic values; we have more than 124 registers now
+Wed May 30 04:27:58 2007 +0000 H. Peter Anvin
+ * Remove bogus redundant tests
+Wed May 30 03:44:50 2007 +0000 H. Peter Anvin
+ * More \321 -> \324
+Wed May 30 03:44:02 2007 +0000 H. Peter Anvin
+ * Remove bogus check for 64-bitness
+Wed May 30 03:25:21 2007 +0000 H. Peter Anvin
+ * Get rid of magic open-coded "register numbers"
+Wed May 30 02:48:51 2007 +0000 H. Peter Anvin
+ * MOV reg64,reg64 takes \324 (64 bit with REX) not \321 (32 bit)
+Wed May 30 00:18:26 2007 +0000 H. Peter Anvin
+ * Rename REGNORM to REG_EA
+Wed May 30 00:15:25 2007 +0000 H. Peter Anvin
+ * More instruction flag surgery
+Wed May 30 00:05:00 2007 +0000 H. Peter Anvin
+ * More cleanup of operand flags/register classes
+Tue May 29 23:57:12 2007 +0000 H. Peter Anvin
+ * Clean up the existing operand flag definitions, and document
+Tue May 29 21:44:55 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"
+Thu May 24 22:33:07 2007 +0000 Frank Kotler
+ * update version number to 0.99.01
+Tue May 15 04:33:43 2007 +0000 H. Peter Anvin
+ * regs.dat: fix comment
+Fri May 4 18:47:16 2007 +0000 H. Peter Anvin
+ * 16-bit relocations are standard in ELF64 (at my request, incidentally)
+Fri May 4 02:16:08 2007 +0000 Chuck Crayne
+ * Addition of elf32 and elf64 output formats.
+Wed May 2 04:21:26 2007 +0000 Chuck Crayne
+ * Allow '!' to be used in expressions with same meaning as in C.
+Wed May 2 01:59:16 2007 +0000 Chuck Crayne
+ * Add %IFN and %ELIFN as per RFE #786286
+Mon Apr 30 22:26:58 2007 +0000 Chuck Crayne
+ * Accept responsibility for support of outelf64.c
+Sun Apr 29 20:57:53 2007 +0000 Chuck Crayne
+ * Clarify comments about relocation entries.
+Sun Apr 29 00:28:24 2007 +0000 Chuck Crayne
+ * Allow ELF32 to be invoked either as -f elf or -f elf32
+Sat Apr 28 22:18:04 2007 +0000 Chuck Crayne
+ * Eliminate shift count warnings when building on 32-bit systems
+Sat Apr 28 06:18:48 2007 +0000 Chuck Crayne
+ * Initial support for ELF64
+Wed Apr 18 02:27:18 2007 +0000 H. Peter Anvin
+ * Fix the handling of \324 for computing the length
+Wed Apr 18 02:24:34 2007 +0000 Keith Kanios
+ * Fixed RDF/2 to comply with "maxbits" use.
+Tue Apr 17 20:23:11 2007 +0000 H. Peter Anvin
+ * Handle "LOCK as REX.R" for MOV CRx; fix warning for invalid 64-bit regs
+Mon Apr 16 18:16:46 2007 +0000 Keith Kanios
+ * MEM_OFFSET Instructions Fixed.
+Mon Apr 16 15:46:46 2007 +0000 Keith Kanios
+ * Fixed 64-bit Mode Segment Selection.
+Mon Apr 16 14:31:54 2007 +0000 Keith Kanios
+ * Fixed distinction between [LOCAL]SYMBOL/IMMEDIATE for RIP-relative addressing.
+Mon Apr 16 14:05:01 2007 +0000 Keith Kanios
+ * Fixed long mode MEM_OFFS issue.
+Mon Apr 16 13:54:49 2007 +0000 Keith Kanios
+ * Filled in all RIP Register Flags.
+Mon Apr 16 05:26:29 2007 +0000 H. Peter Anvin
+ * More \321 -> \324 for 64-bit instructions
+Mon Apr 16 04:56:06 2007 +0000 Keith Kanios
+ * Fixed 64-bit offset generation.
+Mon Apr 16 02:39:56 2007 +0000 H. Peter Anvin
+ * More 64-bit ndisasm fixes.
+Mon Apr 16 02:02:06 2007 +0000 H. Peter Anvin
+ * Fixes for 64-bit ndisasm.
+Mon Apr 16 01:21:29 2007 +0000 H. Peter Anvin
+ * Use + instead of * for extension; it feels cleaner with the new meaning.
+Mon Apr 16 01:18:30 2007 +0000 H. Peter Anvin
+ * Initial 64-bit support for ndisasm. Still a work in progress.
+Sun Apr 15 23:12:17 2007 +0000 H. Peter Anvin
+ * Clean up the 64-bitification of regs.dat for 64-bit ndisasm support
+Sun Apr 15 23:10:26 2007 +0000 H. Peter Anvin
+ * Remove @GCCFLAGS@
+Sun Apr 15 23:09:23 2007 +0000 H. Peter Anvin
+ * CR8 is not special in any way as far as the assembler is concerned.
+Sun Apr 15 23:03:28 2007 +0000 H. Peter Anvin
+ * Get rid of @GCCFLAGS@
+Sun Apr 15 22:45:25 2007 +0000 H. Peter Anvin
+ * Cleaner way to add gcc options
+Sun Apr 15 22:08:30 2007 +0000 Keith Kanios
+ * Fixed distinction between RIP relative symbols and immediate values.
+Sun Apr 15 05:40:43 2007 +0000 H. Peter Anvin
+ * Fix the register number for CR7 (it was using the same number as CR15).
+Sun Apr 15 05:32:18 2007 +0000 H. Peter Anvin
+ * More perl-like idioms for generating regdis.c
+Sun Apr 15 01:37:13 2007 +0000 Keith Kanios
+ * Fixed regdis.c generation.
+Sat Apr 14 18:54:52 2007 +0000 Keith Kanios
+ * Added DQ constants for all BITS modes.
+Sat Apr 14 08:03:02 2007 +0000 H. Peter Anvin
+ * outmacho.c: stylistic cleanups
+Sat Apr 14 03:52:05 2007 +0000 Keith Kanios
+ * Fixed support for DQ constants in long mode.
+Sat Apr 14 03:44:31 2007 +0000 Keith Kanios
+ * Hopefully it is actually fixed this time :P
+Sat Apr 14 01:49:07 2007 +0000 Keith Kanios
+ * Fixed structure initialization issue.
+Sat Apr 14 01:44:35 2007 +0000 Keith Kanios
+ * Refixed uninitialized data.
+Sat Apr 14 01:40:24 2007 +0000 Keith Kanios
+ * Fixed uninitialized structure data.
+Sat Apr 14 01:24:14 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Sat Apr 14 00:46:25 2007 +0000 Keith Kanios
+ * Placated unreferenced types.
+Sat Apr 14 00:10:59 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Fri Apr 13 23:09:18 2007 +0000 Keith Kanios
+ * Added outmacho.* to static makefile.
+Fri Apr 13 22:24:46 2007 +0000 Keith Kanios
+ * Fixed REGRIP -> RIPREG to match regs.dat.
+Fri Apr 13 22:07:53 2007 +0000 Keith Kanios
+ * Fixed obj_fwrite() declaration to match "static" definition.
+Fri Apr 13 22:03:24 2007 +0000 Keith Kanios
+ * Added appropriate "void" prototypes.
+Fri Apr 13 22:00:42 2007 +0000 Keith Kanios
+ * Replaced str(n)casecmp with more standard str(n)icmp.
+Fri Apr 13 20:06:41 2007 +0000 H. Peter Anvin
+ * AIf we have config.h, we should actually include it!!
+Fri Apr 13 19:59:20 2007 +0000 H. Peter Anvin
+ * When compiling with gcc, compile with -W -Wall for maximum warnings.
+Fri Apr 13 19:58:42 2007 +0000 H. Peter Anvin
+ * Macroize any compiler-specific code; macros defined in "compiler.h"
+Fri Apr 13 16:47:53 2007 +0000 Keith Kanios
+ * Fixed distinction between char and int8_t data types.
+Fri Apr 13 01:17:45 2007 +0000 Keith Kanios
+ * Comment "REX.I" should have been "REX.X"
+Fri Apr 13 00:52:54 2007 +0000 Keith Kanios
+ * Fixed c99 data-types after removal of typedefs.
+Fri Apr 13 00:43:50 2007 +0000 Keith Kanios
+ * Added Dev-Cpp Makefile
+Fri Apr 13 00:38:29 2007 +0000 Keith Kanios
+ * *** empty log message ***
+Thu Apr 12 17:58:02 2007 +0000 H. Peter Anvin
+ * Remove redundant inclusion of <inttypes.h>
+Thu Apr 12 16:54:50 2007 +0000 H. Peter Anvin
+ * Remove obsolete types; add <inttypes.h> where needed; header fixes
+Thu Apr 12 16:25:58 2007 +0000 H. Peter Anvin
+ * autogen.sh script to create configure, et al.
+Thu Apr 12 16:23:11 2007 +0000 Keith Kanios
+ * Fixed c99 support for RDOFF Tools
+Thu Apr 12 16:12:09 2007 +0000 H. Peter Anvin
+ * outmacho.c: Don't assume __builtin_ctzl exists for gcc < 4
+
+Mon Nov 12 22:05:31 2007 -0800 H. Peter Anvin
+ * BR 1828866: fix handling of LAR/LSL
+Mon Nov 12 21:57:00 2007 -0800 H. Peter Anvin
+ * Better (but not *good!*) handling of 64-bit addressing in ndisasm
+Mon Nov 12 21:02:33 2007 -0800 H. Peter Anvin
+ * Fix disassembly of XCHG
+Mon Nov 12 20:18:33 2007 -0800 H. Peter Anvin
+ * Test of XCHG
+Mon Nov 12 20:18:05 2007 -0800 H. Peter Anvin
+ * Fix handling of XCHG in 64-bit mode
+Mon Nov 12 19:36:13 2007 -0800 H. Peter Anvin
+ * More \321 -> \324 bug fixes
+Mon Nov 12 18:26:31 2007 -0800 H. Peter Anvin
+ * float.c: all warnings and errors are pass 1 only
+Sat Nov 10 21:55:19 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives.
+Sat Nov 10 17:52:23 2007 -0800 Charles Crayne
+ * Clean up a few more 32-bit bottlenecks
+Fri Nov 9 16:37:41 2007 -0800 Charles Crayne
+ * Update documantation for stack relative directives
+Fri Nov 9 16:33:54 2007 -0800 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Fri Nov 9 16:25:43 2007 -0800 Charles Crayne
+ * Update documentation for stack relative directives
+Fri Nov 9 14:44:02 2007 -0800 H. Peter Anvin
+ * Don't combine type and size into a single argument
+Thu Nov 8 22:11:14 2007 -0800 Charles Crayne
+ * Add flat64 to %stacksize choices
+Thu Nov 8 20:43:22 2007 -0800 H. Peter Anvin
+ * Fix building under OpenWatcom
+Thu Nov 8 20:29:37 2007 -0800 H. Peter Anvin
+ * ps2pdf: remove -dOptimize=true
+Thu Nov 8 20:21:41 2007 -0800 H. Peter Anvin
+ * No binary files left in the source distro; unbreak release script
+Thu Nov 8 20:01:11 2007 -0800 H. Peter Anvin
+ * BR 1828103: Fix %arg and %local
+Thu Nov 8 19:34:01 2007 -0800 H. Peter Anvin
+ * nasmlib.c: prefix_name(): use the elements() macro
+Thu Nov 8 19:30:22 2007 -0800 H. Peter Anvin
+ * Move elements() to nasmlib.h
+Thu Nov 8 19:15:33 2007 -0800 H. Peter Anvin
+ * constipate the "str" argument to bsi() and bsii()
+Wed Nov 7 19:03:46 2007 -0800 Charles Crayne
+ * Upgrade RAA functions to hold 64-bit data.
+Tue Nov 6 21:48:12 2007 -0800 Charles Crayne
+ * Pass 64-bit instruction lengths to back-ends.
+Tue Nov 6 18:27:23 2007 -0800 Charles Crayne
+ * Prepare for 64-bit instruction lengths
+Mon Nov 5 21:49:49 2007 -0800 Charles Crayne
+ * Disambiguate error messages
+Mon Nov 5 17:19:32 2007 -0800 Charles Crayne
+ * Upgrade label functions to 64-bit
+Sun Nov 4 21:10:42 2007 -0800 H. Peter Anvin
+ * Permit opcode names as labels as long as they are followed by a colon
+Sun Nov 4 15:28:30 2007 -0800 Charles Crayne
+ * Make warning limit valid for both i386 and x86_64
+Sat Nov 3 22:06:13 2007 -0700 Charles Crayne
+ * Warn on out of bounds EA displacements
+Thu Nov 1 15:08:27 2007 -0700 H. Peter Anvin
+ * Treat info files as binary when creating xdoc distro file
+Thu Nov 1 15:07:42 2007 -0700 H. Peter Anvin
+ * Remove obsolete binary files from the distribution
+Thu Nov 1 14:53:32 2007 -0700 H. Peter Anvin
+ * Move declarations before statements
+Wed Oct 31 23:37:35 2007 -0700 H. Peter Anvin
+ * NASM 0.99.06
+Wed Oct 31 23:37:19 2007 -0700 H. Peter Anvin
+ * Script to tag the tree for release
+Wed Oct 31 10:59:26 2007 -0700 H. Peter Anvin
+ * Even more "riprel" tests
+Tue Oct 30 01:17:57 2007 -0700 H. Peter Anvin
+ * floatx.asm: add tests for "rounds up to smallest denorm"
+Tue Oct 30 01:13:27 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Tue Oct 30 01:13:09 2007 -0700 H. Peter Anvin
+ * float.c: handle round-up-to-denorm correctly.
+Tue Oct 30 00:59:27 2007 -0700 H. Peter Anvin
+ * Exhaustive test for 8-bit floating point values
+Mon Oct 29 23:12:47 2007 -0700 H. Peter Anvin
+ * Clean up the handing of operands in assemble.c
+Mon Oct 29 22:56:08 2007 -0700 H. Peter Anvin
+ * Don't warn for segmented references
+Mon Oct 29 20:20:12 2007 -0700 H. Peter Anvin
+ * Use a 32-bit floating-point limb size; support 8-bit float
+Mon Oct 29 18:24:59 2007 -0700 Charles Crayne
+ * Reduce severity of redundant prefixes from error to warning.
+Sun Oct 28 23:23:24 2007 -0700 H. Peter Anvin
+ * Test of some addressing modes in 64-bit mode.
+Sun Oct 28 23:21:46 2007 -0700 H. Peter Anvin
+ * Fix bogus flagging of effective addresses as invalid
+Sun Oct 28 23:10:34 2007 -0700 H. Peter Anvin
+ * Actually shut up the warning in rdfload.c
+Sun Oct 28 22:04:42 2007 -0700 H. Peter Anvin
+ * Clean up stealth whitespace
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * Fix warning about cast to pointer in rdfload.c
+Sun Oct 28 22:04:00 2007 -0700 H. Peter Anvin
+ * 64-bit addressing and prefix handling changes
+Sun Oct 28 15:29:54 2007 -0700 Charles Crayne
+ * Adjust stabs symbol index to match symbol table.
+Fri Oct 26 21:38:02 2007 -0700 H. Peter Anvin
+ * readnum(): handle prefix-suffix collision like "0h"
+Fri Oct 26 18:49:29 2007 -0700 H. Peter Anvin
+ * Better handling of platforms which hide "extended" functionality
+Wed Oct 24 15:51:40 2007 -0700 Charles Crayne
+ * Merge branch 'master' of /home/chuck/development/gitnasm/
+Wed Oct 24 15:30:17 2007 -0700 Charles Crayne
+ * Update sections about debug info formats
+Wed Oct 24 15:29:51 2007 -0700 H. Peter Anvin
+ * Fix the handling of floating-point tokens in the preprocessor
+Tue Oct 23 19:28:39 2007 -0700 Charles Crayne
+ * Fix bugs item #1817677
+Tue Oct 23 00:08:58 2007 -0700 H. Peter Anvin
+ * Slightly simplify the radix-detection code
+Mon Oct 22 19:48:06 2007 -0700 H. Peter Anvin
+ * Unbreak particularly tricky hex constants
+Mon Oct 22 19:37:36 2007 -0700 H. Peter Anvin
+ * Decimal floating point can also start with 0. 0e 0E
+Mon Oct 22 17:34:10 2007 -0700 H. Peter Anvin
+ * Support binary and octal floating-point
+Mon Oct 22 16:53:48 2007 -0700 H. Peter Anvin
+ * More consistent handling of radix letters
+Sun Oct 21 15:33:01 2007 -0700 H. Peter Anvin
+ * float.c: correct exponent capping
+Sun Oct 21 14:21:43 2007 -0700 Charles Crayne
+ * Clean up elf symbol table section
+Fri Oct 19 18:33:57 2007 -0700 H. Peter Anvin
+ * Allow $-prefixed hexadecimal FP as an alternative to 0x
+Fri Oct 19 14:43:22 2007 -0700 H. Peter Anvin
+ * Scripts to remove stealth whitespace
+Fri Oct 19 14:42:29 2007 -0700 H. Peter Anvin
+ * Formatting: kill off "stealth whitespace"
+Fri Oct 19 14:26:52 2007 -0700 H. Peter Anvin
+ * test/floatx.asm: fix test case
+Fri Oct 19 14:19:52 2007 -0700 H. Peter Anvin
+ * uscore.asm: Fix test case
+Fri Oct 19 14:17:51 2007 -0700 H. Peter Anvin
+ * float.c: mark read_exponent() static
+Fri Oct 19 14:10:35 2007 -0700 H. Peter Anvin
+ * Don't confuse suffixed hexadecimal with floating-point
+Fri Oct 19 13:17:24 2007 -0700 H. Peter Anvin
+ * Anchor filename locations in .gitignore
+Fri Oct 19 13:16:51 2007 -0700 H. Peter Anvin
+ * test/Makefile: Use -Ox instead of -O999
+Fri Oct 19 13:14:06 2007 -0700 H. Peter Anvin
+ * Test of underscored constants
+Fri Oct 19 13:10:46 2007 -0700 H. Peter Anvin
+ * Allow underscores in numbers; better detection of FP
+Fri Oct 19 10:52:31 2007 -0700 H. Peter Anvin
+ * Modernize nasm.spec.in and make it closer to the Fedora version
+Thu Oct 18 23:33:06 2007 -0700 Charles Crayne
+ * Suppress datarootdir warnings from configure
+Thu Oct 18 21:17:20 2007 -0700 Charles Crayne
+ * Suppress signedness warnings in disassembler
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * Cleaner solution for MinGW handling of __STRICT_ANSI__
+Thu Oct 18 19:14:08 2007 -0700 H. Peter Anvin
+ * configure: Undefine __STRICT_ANSI__ for mingw's benefit
+Thu Oct 18 19:14:07 2007 -0700 H. Peter Anvin
+ * Fix invocation of readnum()
+Thu Oct 18 19:02:42 2007 -0700 Charles Crayne
+ * Suppress a few signedness warnings
+Thu Oct 18 17:04:10 2007 -0700 root
+ * Avoid unnecessary warning on redefinition of section (bug 801180)
+Wed Oct 17 17:55:45 2007 -0700 Charles Crayne
+ * Generate stabs entries for any executable section
+Tue Oct 16 22:59:09 2007 -0700 H. Peter Anvin
+ * NASM 0.99.05
+Tue Oct 16 15:46:04 2007 -0700 H. Peter Anvin
+ * Tests of obscenely large exponents
+Tue Oct 16 14:42:32 2007 -0700 H. Peter Anvin
+ * Comma-separate contents of __FLOAT__
+Tue Oct 16 14:40:27 2007 -0700 H. Peter Anvin
+ * Implement floating-point option control directive
+Tue Oct 16 11:48:07 2007 -0700 H. Peter Anvin
+ * Floating-point warning fixes; fix round-to-overflow
+Tue Oct 16 11:32:58 2007 -0700 H. Peter Anvin
+ * Handle rounding of denorms correctly; make fp overflow a warning
+Tue Oct 16 10:35:02 2007 -0700 H. Peter Anvin
+ * Additional entries for .gitignore
+Tue Oct 16 10:32:57 2007 -0700 H. Peter Anvin
+ * Refactor floating-point formatting code; fix 80-bit denorms
+Tue Oct 16 10:31:16 2007 -0700 H. Peter Anvin
+ * Add 1.5 as a test case: representative of an exact fraction
+Mon Oct 15 20:06:06 2007 -0700 H. Peter Anvin
+ * Recognize 'd', 't' and 'y' as radix suffixes
+Mon Oct 15 19:53:10 2007 -0700 H. Peter Anvin
+ * Fix FISTTP opcodes (BR 689695)
+Mon Oct 15 19:46:32 2007 -0700 H. Peter Anvin
+ * New floating-point conversion routines
+Mon Oct 15 17:48:43 2007 -0700 H. Peter Anvin
+ * Add testnos3 from the gdtoa package (floating-point test)
+Sat Oct 13 23:19:21 2007 -0700 H. Peter Anvin
+ * .gitignore file doesn't need to be in the release file
+Sat Oct 13 23:17:41 2007 -0700 H. Peter Anvin
+ * Add .gitignore file so "git status" produces something sane
+Sat Oct 13 23:12:46 2007 -0700 H. Peter Anvin
+ * autoconf: drop AC_USE_SYSTEM_EXTENSIONS to support autoconf 2.59
+Sat Oct 13 07:09:22 2007 -0700 Keith Kanios
+ * Fix 32-bit types in preproc.c and eval.c
+Thu Oct 11 20:32:33 2007 -0700 Charles Crayne
+ * Must define types before using them
+Thu Oct 11 13:42:09 2007 -0700 H. Peter Anvin
+ * preproc.c: move smacro define/undef to separate functions
+Thu Oct 11 13:38:38 2007 -0700 H. Peter Anvin
+ * preproc.c: PP_DEFINE and PP_XDEFINE are case-sensitive
+Thu Oct 11 12:52:03 2007 -0700 H. Peter Anvin
+ * preproc.c: normalize the handling of case sensitivity
+Thu Oct 11 12:51:06 2007 -0700 H. Peter Anvin
+ * Define macros necessary for <inttypes.h> on C++
+Thu Oct 11 10:12:58 2007 -0700 H. Peter Anvin
+ * More "bool" fixes
+Thu Oct 11 10:11:57 2007 -0700 H. Peter Anvin
+ * preproc.c: allow 64-bit repeat counts
+Thu Oct 11 10:06:19 2007 -0700 H. Peter Anvin
+ * preproc.c: For an SMacro, in_progress really is a boolean (no %rep)
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * Additional uses of bool and enum
+Thu Oct 11 00:05:57 2007 -0700 H. Peter Anvin
+ * preproc.c: MMacro.in_progress is not a boolean
+Wed Oct 10 18:07:51 2007 -0700 H. Peter Anvin
+ * saa_fread/fwrite: when seeking, must set [rw]ptr as well
+Wed Oct 10 14:58:45 2007 -0700 H. Peter Anvin
+ * Use the compiler-provided booleans if available, otherwise emulate
+Wed Oct 10 14:55:14 2007 -0700 H. Peter Anvin
+ * owlinux.mak: don't clean things we won't be able to
+Wed Oct 10 14:29:53 2007 -0700 H. Peter Anvin
+ * configure.in: looks like we need autoconf 2.61 :(
+Wed Oct 10 14:06:59 2007 -0700 H. Peter Anvin
+ * Create option -Ox to tell NASM to do unlimited passes
+Mon Oct 8 19:26:57 2007 -0700 H. Peter Anvin
+ * Revert "floatb.asm: fix broken testcase"
+Mon Oct 8 18:39:24 2007 -0700 H. Peter Anvin
+ * floatb.asm: fix broken testcase
+Mon Oct 8 12:41:00 2007 -0700 H. Peter Anvin
+ * saa_rstruct: fix overrun check
+Mon Oct 8 12:12:23 2007 -0700 H. Peter Anvin
+ * Add Frank's floattest.asm test file
+Sun Oct 7 21:13:14 2007 -0700 H. Peter Anvin
+ * saa_fpwrite: initializing "len" should be part of the loop
+Sun Oct 7 18:46:57 2007 -0700 Charles Crayne
+ * Fix infinite loop in function saa_fpwrite
+Fri Oct 5 17:44:16 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: use a real instruction to avoid confusing ndisasm
+Fri Oct 5 17:42:31 2007 -0700 H. Peter Anvin
+ * zerobyte.asm: add test cases for non-initial \170 uses
+Fri Oct 5 17:29:01 2007 -0700 H. Peter Anvin
+ * Check in the proper zerobyte test
+Fri Oct 5 17:04:32 2007 -0700 H. Peter Anvin
+ * Emit REX prefix before literal zero (\170)
+Fri Oct 5 17:01:15 2007 -0700 H. Peter Anvin
+ * LICENSE: Break long line
+Fri Oct 5 14:36:03 2007 -0700 H. Peter Anvin
+ * Add test for problematic floats
+Thu Oct 4 23:51:08 2007 -0700 H. Peter Anvin
+ * floatx.asm: add Inf and NaN to the boundary condition tests
+Thu Oct 4 23:09:19 2007 -0700 H. Peter Anvin
+ * floatx.asm: add specific tests for exponent boundary conditions
+Thu Oct 4 22:51:08 2007 -0700 H. Peter Anvin
+ * float.c: correct the exponent
+Thu Oct 4 15:18:23 2007 -0700 H. Peter Anvin
+ * Additional rules in test/Makefile
+Thu Oct 4 13:42:56 2007 -0700 H. Peter Anvin
+ * Rewrite the handling of SAA's to allow random access
+Wed Oct 3 21:30:57 2007 -0700 H. Peter Anvin
+ * Change cloc_t to struct location, and reorder the members
+Wed Oct 3 21:24:51 2007 -0700 H. Peter Anvin
+ * BR 1352920: change loc_t -> cloc_t
+Wed Oct 3 21:22:16 2007 -0700 H. Peter Anvin
+ * BR 1352920: Handle upper case %line
+Wed Oct 3 17:40:12 2007 -0700 H. Peter Anvin
+ * Use autoconf to request feature macros
+Tue Oct 2 22:04:15 2007 -0700 H. Peter Anvin
+ * preproc.c: constipation
+Tue Oct 2 21:57:27 2007 -0700 H. Peter Anvin
+ * make alldeps
+Tue Oct 2 21:53:51 2007 -0700 H. Peter Anvin
+ * Portability fixes
+Tue Oct 2 21:13:18 2007 -0700 H. Peter Anvin
+ * Run "make alldeps".
+Tue Oct 2 17:40:00 2007 -0700 H. Peter Anvin
+ * Use the crc64 we already use as the perfect hash function prehash
+Tue Oct 2 15:09:33 2007 -0700 H. Peter Anvin
+ * insns.dat: add systematic names for the hinting NOPs (0F18-0F1F)
+Mon Oct 1 11:28:32 2007 -0700 H. Peter Anvin
+ * Unspecified files are null strings, not null pointers
+Mon Oct 1 11:26:31 2007 -0700 H. Peter Anvin
+ * Check for the most basic filename overlaps
+Sun Sep 30 22:15:36 2007 -0700 Charles Crayne
+ * modified: nasm.1 to add newer command line options
+Fri Sep 28 21:27:41 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 20:17:12 2007 -0700 H. Peter Anvin
+ * configure.in: AC_SUBST_FILE should have been AC_SUBST
+Fri Sep 28 17:17:20 2007 -0700 H. Peter Anvin
+ * Unbreak relative references to immediate addresses
+Fri Sep 28 15:16:47 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Fri Sep 28 12:01:55 2007 -0700 H. Peter Anvin
+ * lib/vsnprintf.c: correct boundary conditions
+Fri Sep 28 10:50:20 2007 -0700 H. Peter Anvin
+ * Add substitutes for snprintf() and vsnprintf()
+Fri Sep 28 02:03:41 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Thu Sep 27 21:35:04 2007 -0700 H. Peter Anvin
+ * Exclude config.h from the dependency list for the canned makefiles
+Thu Sep 27 21:12:17 2007 -0700 H. Peter Anvin
+ * version.pl: Add support for daily snapshot releases
+Thu Sep 27 19:46:55 2007 -0700 H. Peter Anvin
+ * Add Makefile for Linux -> DOS, Win32, OS/2 using OpenWatcom
+Wed Sep 26 19:57:07 2007 -0700 H. Peter Anvin
+ * Add Makefile for OpenWatcom (DOS, OS/2 or Win32 output)
+Wed Sep 26 17:00:18 2007 -0700 H. Peter Anvin
+ * Test for various addressing modes in 64-bit mode
+Wed Sep 26 15:19:28 2007 -0700 H. Peter Anvin
+ * nasm option reshuffling, -E -> -Z
+Tue Sep 25 23:57:21 2007 -0400 Frank Kotler
+ * Version 0.99.04
+Tue Sep 25 20:36:45 2007 -0700 H. Peter Anvin
+ * nasmdoc: corrections on 64-bit immediates/displacements
+Tue Sep 25 16:02:21 2007 -0700 H. Peter Anvin
+ * nasmdoc: shorten lines which are too long
+Tue Sep 25 16:01:07 2007 -0700 H. Peter Anvin
+ * Document NASM behaviour for 64-bit immediates and displacements
+Tue Sep 25 15:44:40 2007 -0700 H. Peter Anvin
+ * test/movimm.asm: add optimizable forms
+Tue Sep 25 15:41:19 2007 -0700 H. Peter Anvin
+ * assemble.c: clean up whitespace
+Tue Sep 25 15:40:36 2007 -0700 H. Peter Anvin
+ * Correct the handling of "MOV" with immediate in 64-bit mode
+Tue Sep 25 15:39:42 2007 -0700 H. Peter Anvin
+ * Test of immediate handling on 64-bit mode
+Tue Sep 25 14:27:34 2007 -0700 H. Peter Anvin
+ * Add nasm_zalloc() to nasmlib.c
+Tue Sep 25 14:26:03 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 14:11:29 2007 -0700 H. Peter Anvin
+ * Fix BR 1490407: size of the second operand of LAR/LSL
+Tue Sep 25 13:34:55 2007 -0700 H. Peter Anvin
+ * Makefile.in: make "make install" create directories
+Tue Sep 25 08:48:37 2007 -0700 H. Peter Anvin
+ * Fix BR 1445441: uninitialized use of "error_file"
+Mon Sep 24 21:33:17 2007 -0700 H. Peter Anvin
+ * preproc.c: fix the loop in %undef
+Mon Sep 24 20:53:48 2007 -0700 H. Peter Anvin
+ * float.c: clear off uninitialized warning
+Mon Sep 24 17:02:41 2007 -0700 H. Peter Anvin
+ * outcoff: set the "virtual size field" to zero (BR 1351586)
+Mon Sep 24 15:56:02 2007 -0700 H. Peter Anvin
+ * insns.dat: SMINT - mark ND, DMINT - fix opcode
+Mon Sep 24 15:55:20 2007 -0700 H. Peter Anvin
+ * 0F0F is a 3Dnow! prefix; remove from prefix list
+Mon Sep 24 15:48:09 2007 -0700 H. Peter Anvin
+ * Additional compaction missed by script
+Mon Sep 24 15:42:53 2007 -0700 H. Peter Anvin
+ * insns.dat: machine-generated compaction mmx/xmmreg,mem -> mmx/xmmrm
+Mon Sep 24 13:54:00 2007 -0700 H. Peter Anvin
+ * nasmdoc: grammar fix
+Mon Sep 24 13:44:02 2007 -0700 H. Peter Anvin
+ * nasmdoc: remove stray periods
+Mon Sep 24 13:42:09 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Mon Sep 24 13:41:58 2007 -0700 H. Peter Anvin
+ * Implement the -MG option (SF RFE 1564264)
+Mon Sep 24 12:52:09 2007 -0700 H. Peter Anvin
+ * nasmdoc: clarify __float*__ example
+Mon Sep 24 12:44:38 2007 -0700 H. Peter Anvin
+ * nasmdoc: document the __float*__ operators
+Mon Sep 24 12:30:54 2007 -0700 H. Peter Anvin
+ * Support __float*__ for floating-point numbers in expressions
+Mon Sep 24 10:51:07 2007 -0700 H. Peter Anvin
+ * eval.c: replace sequence of ifs with switch
+Mon Sep 24 10:50:23 2007 -0700 H. Peter Anvin
+ * tokhash: allow a bit smarter pattern matching
+Sat Sep 22 22:35:28 2007 -0700 H. Peter Anvin
+ * Implement INVLPGA according to the documentation
+Sat Sep 22 22:02:34 2007 -0700 H. Peter Anvin
+ * Reformat insns.dat to uniform column width
+Sat Sep 22 21:50:03 2007 -0700 H. Peter Anvin
+ * Simple test for 0x67 prefixes
+Sat Sep 22 21:49:51 2007 -0700 H. Peter Anvin
+ * Auto-generate 0x67 prefixes without the need for \30x codes
+Sat Sep 22 21:47:13 2007 -0700 H. Peter Anvin
+ * Make test/Makefile a bit more useful
+Sat Sep 22 21:29:41 2007 -0700 H. Peter Anvin
+ * Add TY_OWORD for "DO" output
+Sat Sep 22 19:52:11 2007 -0700 H. Peter Anvin
+ * LDDQU needs \301 (BR 1103549)
+Sat Sep 22 19:51:13 2007 -0700 H. Peter Anvin
+ * RDTSCP and INVLPGA aren't 64-bit specific
+Sat Sep 22 19:40:37 2007 -0700 H. Peter Anvin
+ * Cyrix GX1 instructions: BBx_RESET, CPU_READ, CPU_WRITE
+Sat Sep 22 19:28:14 2007 -0700 H. Peter Anvin
+ * Centaur XSHA1, XSHA256, MONTMUL
+Sat Sep 22 19:20:56 2007 -0700 H. Peter Anvin
+ * Implement Centaur's XCRYPT instructions
+Sat Sep 22 19:13:05 2007 -0700 H. Peter Anvin
+ * Add Geode LX (AMD's Cyrix-derived core) instructions
+Sat Sep 22 19:05:11 2007 -0700 H. Peter Anvin
+ * Add the GETSEC instruction for Intel SMX
+Sat Sep 22 18:59:18 2007 -0700 H. Peter Anvin
+ * Add the AMD SSE4a and LZCNT instructions
+Sat Sep 22 18:23:20 2007 -0700 H. Peter Anvin
+ * Tag UMOV as ND (no disassembly) to avoid collision
+Sat Sep 22 18:20:49 2007 -0700 H. Peter Anvin
+ * Disallow optimizing by less than 5 passes.
+Sat Sep 22 17:45:45 2007 -0700 H. Peter Anvin
+ * BR 1783117: Document that %+ needs a space after it, and fix crash
+Sat Sep 22 16:44:56 2007 -0700 H. Peter Anvin
+ * nasm.spec.in: minor fixes
+Sat Sep 22 16:38:25 2007 -0700 H. Peter Anvin
+ * release script: handle stricter CLI parsing for "git tag"
+Sat Sep 22 16:35:11 2007 -0700 H. Peter Anvin
+ * Update nasm.spec.in and make it handle rc releases
+Sat Sep 22 16:19:19 2007 -0700 H. Peter Anvin
+ * version.pl: support version numbers of the form X.Y[.Z]rcW
+Thu Sep 20 21:33:43 2007 -0700 Charles Crayne
+ * Merge branch 'master' of git+ssh://ccrayne@repo.or.cz/srv/git/nasm
+Thu Sep 20 21:12:33 2007 -0700 Charles Crayne
+ * modified: misc/release to fix bug in removing .git
+Wed Sep 19 21:41:43 2007 -0700 H. Peter Anvin
+ * Merge branch 'master' of git+ssh://repo.or.cz/srv/git/nasm
+Wed Sep 19 21:41:27 2007 -0700 H. Peter Anvin
+ * Update manual pages
+Wed Sep 19 21:41:02 2007 -0700 H. Peter Anvin
+ * Remove limit on number of sync points
+Wed Sep 19 21:40:37 2007 -0700 H. Peter Anvin
+ * Make nasm_malloc() et al available from inside ndisasm
+Wed Sep 19 21:07:32 2007 -0400 Frank Kotler
+ * Version 0.99.03
+Wed Sep 19 21:06:59 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Wed Sep 19 16:22:03 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/sse5'
+Wed Sep 19 16:15:22 2007 -0700 H. Peter Anvin
+ * test/Makefile: make a bit more useful
+Tue Sep 18 22:54:40 2007 -0700 H. Peter Anvin
+ * Slightly optimize the interface to nasm_token_hash()
+Wed Sep 19 01:34:55 2007 -0400 Frank Kotler
+ * Merge branch 'master' of git+ssh://fbkotler@repo.or.cz/srv/git/nasm
+Tue Sep 18 22:23:42 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 22:22:49 2007 -0700 H. Peter Anvin
+ * elf64: fix 32-bit truncations
+Tue Sep 18 22:08:04 2007 -0700 H. Peter Anvin
+ * Document Infinity and NaN
+Tue Sep 18 21:55:56 2007 -0700 H. Peter Anvin
+ * Support generating NaNs and infinities
+Tue Sep 18 19:12:26 2007 -0700 H. Peter Anvin
+ * Update documentation
+Tue Sep 18 18:37:36 2007 -0700 H. Peter Anvin
+ * Simple test for hexadecimal floating-point numbers
+Tue Sep 18 18:33:17 2007 -0700 H. Peter Anvin
+ * Fix error-reporting in hexadecimal floating-point numbers
+Tue Sep 18 18:31:26 2007 -0700 H. Peter Anvin
+ * Support C99-style hexadecimal floating point.
+Tue Sep 18 17:50:34 2007 -0700 H. Peter Anvin
+ * Unify all standard IEEE floating-point formats; add 128-bit
+Tue Sep 18 17:49:09 2007 -0700 H. Peter Anvin
+ * Fix handling of DO; support unary + for floating-point numbers
+Tue Sep 18 16:39:03 2007 -0700 H. Peter Anvin
+ * Support 16-bit IEEE floating point; used in SSE5
+Tue Sep 18 15:43:40 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Tue Sep 18 15:43:08 2007 -0700 H. Peter Anvin
+ * Add NOP with argument to the instruction list
+Tue Sep 18 15:24:38 2007 -0700 H. Peter Anvin
+ * Remove 0FC2 from list of instruction prefixes
+Tue Sep 18 15:08:20 2007 -0700 H. Peter Anvin
+ * Speed up the disassembler by allowing prefixed instruction tables
+Tue Sep 18 13:45:12 2007 -0700 H. Peter Anvin
+ * Document oword, do and reso
+Tue Sep 18 13:01:32 2007 -0700 H. Peter Anvin
+ * Implement "oword" (128 bits) as a first-class size
+Tue Sep 18 12:38:07 2007 -0700 H. Peter Anvin
+ * Change the token prehash function for better convergence
+Tue Sep 18 12:23:21 2007 -0700 H. Peter Anvin
+ * SSE5 instruction table
+Tue Sep 18 02:06:09 2007 -0400 Frank Kotler
+ * add "const" to output/outdbg.c
+Mon Sep 17 18:45:44 2007 -0700 H. Peter Anvin
+ * Disassembler support for SSE5 instructions
+Mon Sep 17 17:27:46 2007 -0700 H. Peter Anvin
+ * insns.dat: All SSE5 instructions are AMD
+Mon Sep 17 17:25:27 2007 -0700 H. Peter Anvin
+ * Actually generate SSE5 instructions
+Mon Sep 17 16:55:04 2007 -0700 H. Peter Anvin
+ * Initial support for generating DREX suffixes
+Mon Sep 17 16:31:33 2007 -0700 H. Peter Anvin
+ * Fix a few instances of missing renumbers
+Mon Sep 17 16:20:45 2007 -0700 H. Peter Anvin
+ * Enable IF_AR3
+Mon Sep 17 15:49:53 2007 -0700 H. Peter Anvin
+ * Merge commit 'origin/master' into sse5
+Mon Sep 17 15:49:30 2007 -0700 H. Peter Anvin
+ * Initial support for four arguments per instruction
+Mon Sep 17 15:48:32 2007 -0700 H. Peter Anvin
+ * CLFLUSH: Neither an x64 instruction nor AMD
+Mon Sep 17 13:56:26 2007 -0700 H. Peter Anvin
+ * Sort dependency lists
+Mon Sep 17 13:53:14 2007 -0700 H. Peter Anvin
+ * Cleaner way to handle MSVC's _snprintf() underscore damage
+Mon Sep 17 13:19:25 2007 -0700 H. Peter Anvin
+ * test/r13.asm: test special-casing of rbp and r13 in 64-bit mode
+Mon Sep 17 13:03:33 2007 -0700 H. Peter Anvin
+ * Additional documentation for 64-bit programming
+Sun Sep 16 22:27:07 2007 -0700 H. Peter Anvin
+ * INSTALL: MSVC++ compilation instructions
+Sun Sep 16 22:17:29 2007 -0700 H. Peter Anvin
+ * make alldeps: change Mkfiles/Makefile.* to Mkfiles/*.mak
+Sun Sep 16 22:16:24 2007 -0700 H. Peter Anvin
+ * Fix Makefile for MSVC++ 2005, delete obsolete Makefiles
+Sun Sep 16 22:15:34 2007 -0700 H. Peter Anvin
+ * Minor fixes needed to compile with MSVC++ 2005
+Sun Sep 16 18:35:02 2007 -0700 H. Peter Anvin
+ * Run "make alldeps"
+Sun Sep 16 18:04:57 2007 -0700 H. Peter Anvin
+ * Switch the preprocessor over to using the hash table library
+Sun Sep 16 17:53:17 2007 -0700 H. Peter Anvin
+ * Fix the handling of local labels
+Fri Sep 14 18:36:01 2007 -0700 H. Peter Anvin
+ * preproc.c: remove unnecessary int64_t
+Fri Sep 14 18:03:29 2007 -0700 H. Peter Anvin
+ * Use the new hash table function library to store labels
+Fri Sep 14 09:24:38 2007 -0700 H. Peter Anvin
+ * Define a proper hash table library
+Thu Sep 13 18:13:20 2007 -0700 H. Peter Anvin
+ * Simple performance benchmarks: label, macro and token lookups
+Thu Sep 13 12:25:32 2007 -0700 H. Peter Anvin
+ * release script: fix final cleanup
+Thu Sep 13 12:22:00 2007 -0700 H. Peter Anvin
+ * Modify release script for a git-centric world
+Thu Sep 13 11:06:42 2007 -0700 H. Peter Anvin
+ * pptok.c: don't insist on C99 compiler behaviour
+Wed Sep 12 22:02:06 2007 -0700 H. Peter Anvin
+ * Fix literal F2 and F3 prefixes
+Wed Sep 12 21:58:51 2007 -0700 H. Peter Anvin
+ * Add (untested!) SSSE3, SSE4.1, SSE4.2 instructions
+Wed Sep 12 21:06:36 2007 -0700 H. Peter Anvin
+ * Add support for Tejas New Instructions (SSSE3)
+Wed Sep 12 21:05:06 2007 -0700 H. Peter Anvin
+ * Remove $Id$ tags (useless with git)
+Wed Sep 12 21:04:58 2007 -0700 H. Peter Anvin
+ * Use rm32 operands for VMREAD/VMWRITE
+Wed Sep 12 21:04:51 2007 -0700 H. Peter Anvin
+ * Macros for SSSE3/SSE4 instruction sets
+Wed Sep 12 21:04:39 2007 -0700 H. Peter Anvin
+ * Support r/m operands for non-integer types
+Wed Sep 12 20:27:41 2007 -0700 H. Peter Anvin
+ * Use enumerations where practical to ease debugging
+Wed Sep 12 17:02:55 2007 +0000 H. Peter Anvin
+ * pptok.c: quick-and-dirty downcasing during prehashing
+Wed Sep 12 16:55:57 2007 +0000 H. Peter Anvin
+ * phash: Tell the user when the graph is OK
+Wed Sep 12 05:18:20 2007 +0000 H. Peter Anvin
+ * pptok.c: handle holes in the pp_directives array
+Wed Sep 12 04:20:08 2007 +0000 H. Peter Anvin
+ * preproc.c: adjust whitespace
+Wed Sep 12 04:18:37 2007 +0000 H. Peter Anvin
+ * More automation in the preprocessor conditionals handling
+Wed Sep 12 02:13:39 2007 +0000 H. Peter Anvin
+ * pptok.c: fix spacing
+Wed Sep 12 02:12:07 2007 +0000 H. Peter Anvin
+ * Generate automatically correct tests for %if and %elif
+Wed Sep 12 01:34:19 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"; add dependencies missing from the previous checkin
+Wed Sep 12 01:29:43 2007 +0000 H. Peter Anvin
+ * Use a perfect hash to look up preprocessor directives
+Wed Sep 12 01:27:53 2007 +0000 H. Peter Anvin
+ * phash: Be a bit more aggressive about trying to make a small hash
+Wed Sep 12 00:22:29 2007 +0000 H. Peter Anvin
+ * Add RCXZ as a known preprocessor condition
+Tue Sep 11 23:57:23 2007 +0000 H. Peter Anvin
+ * doc: add some cross-references
+Tue Sep 11 23:52:01 2007 +0000 H. Peter Anvin
+ * Feeble attempt at updating the documentation; remove Appendix B
+Tue Sep 11 22:44:03 2007 +0000 H. Peter Anvin
+ * Handle instructions which can have both REX.W and OSP
+Tue Sep 11 22:14:18 2007 +0000 H. Peter Anvin
+ * Use enums to make debugging easier
+Tue Sep 11 22:13:17 2007 +0000 H. Peter Anvin
+ * ndisasm: handle \366 codes, prefer unprefixed instructions
+Tue Sep 11 22:00:34 2007 +0000 H. Peter Anvin
+ * Simplify tokens.dat slightly
+Tue Sep 11 04:26:44 2007 +0000 H. Peter Anvin
+ * Quiet gcc warning about uninitialized variables
+Tue Sep 11 04:16:57 2007 +0000 H. Peter Anvin
+ * Make the big instruction arrays "const"
+Mon Sep 10 23:32:05 2007 +0000 H. Peter Anvin
+ * Use an actual enum for the opcode
+Mon Sep 10 23:30:21 2007 +0000 H. Peter Anvin
+ * Fix order of token arguments
+Mon Sep 10 18:59:26 2007 +0000 H. Peter Anvin
+ * assemble.c: correct special handing of ESP/RSP
+Mon Sep 10 18:59:01 2007 +0000 H. Peter Anvin
+ * tokhash: correct duplicate-token test
+Mon Sep 10 18:58:40 2007 +0000 H. Peter Anvin
+ * tokhash: adjust table types to reduce size
+Mon Sep 10 18:55:52 2007 +0000 H. Peter Anvin
+ * Fix the MMXREG and XMMREG flags definitions.
+Wed Sep 5 06:48:38 2007 +0000 H. Peter Anvin
+ * nasm.spec.in: Copyright -> License
+Wed Sep 5 06:40:51 2007 +0000 H. Peter Anvin
+ * Fix "make tar"; useful for RPM testing
+Wed Sep 5 06:24:43 2007 +0000 H. Peter Anvin
+ * Remove obsolete Serial: construct; we shouldn't need it anyway.
+Tue Sep 4 01:29:43 2007 +0000 Chuck Crayne
+ * Provide 64-bit support for ORG directive
+Sun Sep 2 16:37:03 2007 +0000 H. Peter Anvin
+ * Fix some MMX/SSE irregularities which interact with the 64-bit support
+Sun Sep 2 14:46:00 2007 +0000 H. Peter Anvin
+ * phash.ph: yet another attempt at getting Perl to behave, arithmetically
+Sun Sep 2 06:23:29 2007 +0000 H. Peter Anvin
+ * Simple 64-bit org test
+Sun Sep 2 06:20:15 2007 +0000 H. Peter Anvin
+ * phash.ph: remove some stale code
+Sun Sep 2 01:00:34 2007 +0000 Chuck Crayne
+ * Force use of integer values for generating hash keys.
+Fri Aug 31 18:10:23 2007 +0000 H. Peter Anvin
+ * phash: don't rely on the build platform Perl version of rand()
+Fri Aug 31 07:31:51 2007 +0000 H. Peter Anvin
+ * tokhash.pl: formatting changes for readability
+Fri Aug 31 07:23:31 2007 +0000 H. Peter Anvin
+ * tokhash: Speed up the rejection of unhashed values
+Fri Aug 31 06:06:17 2007 +0000 H. Peter Anvin
+ * tokhash.pl: "ix" should have the same width as the "hash" arrays
+Fri Aug 31 00:28:35 2007 +0000 H. Peter Anvin
+ * Add "do not edit" comment to tokhash.c
+Fri Aug 31 00:23:40 2007 +0000 H. Peter Anvin
+ * Make the token hash a bit smaller by using 16-bit hash tables
+Fri Aug 31 00:16:10 2007 +0000 H. Peter Anvin
+ * Minor cleanup; remove duplication of names.c
+Thu Aug 30 23:42:39 2007 +0000 H. Peter Anvin
+ * phash.ph: use a bipartite graph to reduce the storage requirements
+Thu Aug 30 22:35:34 2007 +0000 H. Peter Anvin
+ * Finishing touches on perfect hash tokenizer; actually turn the thing on
+Thu Aug 30 21:50:20 2007 +0000 H. Peter Anvin
+ * Makefile rule for tokhash.c
+Thu Aug 30 21:47:46 2007 +0000 H. Peter Anvin
+ * tokens.dat: Data file containing alphanumeric tokens not in other .dats
+Thu Aug 30 21:45:56 2007 +0000 H. Peter Anvin
+ * Generate a perfect hash for the token parser
+Thu Aug 30 21:40:08 2007 +0000 H. Peter Anvin
+ * Fix bugs in repeated suffix handling, which led to missing r8d/r8w/r8d
+Thu Aug 30 21:39:37 2007 +0000 H. Peter Anvin
+ * phash.ph: more powerful prehashing
+Thu Aug 30 20:15:25 2007 +0000 H. Peter Anvin
+ * Make the perfect hash generator an includable module
+Wed Aug 29 20:30:31 2007 +0000 H. Peter Anvin
+ * Correct the logic for recording fs: and gs: overrides.
+Wed Aug 29 18:20:19 2007 +0000 H. Peter Anvin
+ * Generate R_X86_64_64 relocations in elf64 output
+Wed Aug 29 17:24:03 2007 +0000 H. Peter Anvin
+ * Add README file
+Wed Aug 29 17:20:09 2007 +0000 H. Peter Anvin
+ * Create a Perl library directory, and add the Graph module to it
+Wed Aug 29 17:05:17 2007 +0000 H. Peter Anvin
+ * Perfect hash generator, as a perl script
+Wed Aug 29 16:41:43 2007 +0000 H. Peter Anvin
+ * Use standard macro for the default directive
+Wed Aug 29 16:40:26 2007 +0000 H. Peter Anvin
+ * Add standard macro for [default] directive
+Wed Aug 29 16:38:47 2007 +0000 H. Peter Anvin
+ * More test cases for rel and abs addressing
+Wed Aug 29 16:38:05 2007 +0000 H. Peter Anvin
+ * Add [default] directive
+Wed Aug 29 16:25:46 2007 +0000 H. Peter Anvin
+ * nasmlib: add bsii() case-insensitive version of bsi()
+Wed Aug 29 15:49:53 2007 +0000 H. Peter Anvin
+ * Add test cases for IP-relative addressing
+Wed Aug 29 15:19:19 2007 +0000 H. Peter Anvin
+ * Suppress IP-relative only for fs: and gs: overrides
+Tue Aug 28 23:06:00 2007 +0000 H. Peter Anvin
+ * Implement REL/ABS modifiers
+Sun Aug 26 05:51:39 2007 +0000 Frank Kotler
+ * attempt to make static makefiles aware of outelf32/outelf64
+Sun Aug 26 05:48:54 2007 +0000 Frank Kotler
+ * add nasm_strsep to nasmlib, for output/outmacho.c - strtok doesn't work
+Sun Aug 26 05:41:33 2007 +0000 Frank Kotler
+ * remove "#include <unistd.h> from rdoff directory - two places - it annoyed Windows users and seems unneeded
+Sun Aug 26 05:10:24 2007 +0000 Frank Kotler
+ * finally commit Mike Frysinger's "elf-visibility" patch
+Mon Aug 20 21:03:14 2007 +0000 H. Peter Anvin
+ * regs.pl: handle dashed sequences with suffixes
+Mon Aug 20 20:10:04 2007 +0000 H. Peter Anvin
+ * sync.c: change ULONG_MAX to UINT32_MAX
+Mon Aug 20 20:09:11 2007 +0000 H. Peter Anvin
+ * Add _MIN and _MAX macros for the fixed-size types.
+Mon Aug 20 20:02:17 2007 +0000 H. Peter Anvin
+ * ldrdf: cast output of sizeof() before passing to printf(), to avoid warning.
+Sun Aug 19 18:49:26 2007 +0000 Keith Kanios
+ * Fixed RIP address processing ambiguity found by Charles Crayne.
+Fri Aug 17 07:37:52 2007 +0000 Keith Kanios
+ * Fixed issues with REX prefix effective address generation. Fixed XMM instruction output.
+Fri Aug 17 02:03:10 2007 +0000 Keith Kanios
+ * Changed MMXREG and XMMREG flags to help resolve invalid REX prefix generation for MMX instructions.
+Sat Jul 7 02:01:08 2007 +0000 H. Peter Anvin
+ * More int/int32_t confusion
+Sat Jul 7 01:59:52 2007 +0000 H. Peter Anvin
+ * regflag() should return int32_t.
+Thu Jun 21 19:00:12 2007 +0000 H. Peter Anvin
+ * Detect missing <inttypes.h> and include ersatz version if missing
+Thu Jun 21 06:24:23 2007 +0000 H. Peter Anvin
+ * inttypes.h: for older preprocessors, specify L and LL as appropriate
+Thu Jun 21 06:20:43 2007 +0000 H. Peter Anvin
+ * inttypes.h: Fix spelling of SHRT_MAX
+Thu Jun 21 06:15:42 2007 +0000 H. Peter Anvin
+ * inttypes.h: do a single ersatz <inttypes.h> based on <limits.h>
+Sun Jun 3 02:42:41 2007 +0000 Chuck Crayne
+ * Support 32-bit direct addressing in 64-bit mode without base or index regs
+Sat Jun 2 02:26:21 2007 +0000 H. Peter Anvin
+ * Fix the [U]INT*_C() creation macros
+Sat Jun 2 00:05:35 2007 +0000 H. Peter Anvin
+ * For platforms that don't have them, provide <inttypes.h> for common models.
+Wed May 30 22:21:11 2007 +0000 H. Peter Anvin
+ * Fix the handling of the \313 code.
+Wed May 30 22:20:01 2007 +0000 H. Peter Anvin
+ * Machine-generated \321->\324 corrections
+Wed May 30 21:22:33 2007 +0000 Frank Kotler
+ * update "version" to 0.99.02
+Wed May 30 20:30:15 2007 +0000 H. Peter Anvin
+ * Correct the generation of 67 prefixes.
+Wed May 30 18:30:18 2007 +0000 H. Peter Anvin
+ * Update dependencies.
+Wed May 30 16:34:29 2007 +0000 Frank Kotler
+ * update cvs server name in misc/release script
+Wed May 30 04:28:50 2007 +0000 H. Peter Anvin
+ * Avoid magic values; we have more than 124 registers now
+Wed May 30 04:27:58 2007 +0000 H. Peter Anvin
+ * Remove bogus redundant tests
+Wed May 30 03:44:50 2007 +0000 H. Peter Anvin
+ * More \321 -> \324
+Wed May 30 03:44:02 2007 +0000 H. Peter Anvin
+ * Remove bogus check for 64-bitness
+Wed May 30 03:25:21 2007 +0000 H. Peter Anvin
+ * Get rid of magic open-coded "register numbers"
+Wed May 30 02:48:51 2007 +0000 H. Peter Anvin
+ * MOV reg64,reg64 takes \324 (64 bit with REX) not \321 (32 bit)
+Wed May 30 00:18:26 2007 +0000 H. Peter Anvin
+ * Rename REGNORM to REG_EA
+Wed May 30 00:15:25 2007 +0000 H. Peter Anvin
+ * More instruction flag surgery
+Wed May 30 00:05:00 2007 +0000 H. Peter Anvin
+ * More cleanup of operand flags/register classes
+Tue May 29 23:57:12 2007 +0000 H. Peter Anvin
+ * Clean up the existing operand flag definitions, and document
+Tue May 29 21:44:55 2007 +0000 H. Peter Anvin
+ * Run "make alldeps"
+Thu May 24 22:33:07 2007 +0000 Frank Kotler
+ * update version number to 0.99.01
+Tue May 15 04:33:43 2007 +0000 H. Peter Anvin
+ * regs.dat: fix comment
+Fri May 4 18:47:16 2007 +0000 H. Peter Anvin
+ * 16-bit relocations are standard in ELF64 (at my request, incidentally)
+Fri May 4 02:16:08 2007 +0000 Chuck Crayne
+ * Addition of elf32 and elf64 output formats.
+Wed May 2 04:21:26 2007 +0000 Chuck Crayne
+ * Allow '!' to be used in expressions with same meaning as in C.
+Wed May 2 01:59:16 2007 +0000 Chuck Crayne
+ * Add %IFN and %ELIFN as per RFE #786286
+Mon Apr 30 22:26:58 2007 +0000 Chuck Crayne
+ * Accept responsibility for support of outelf64.c
+Sun Apr 29 20:57:53 2007 +0000 Chuck Crayne
+ * Clarify comments about relocation entries.
+Sun Apr 29 00:28:24 2007 +0000 Chuck Crayne
+ * Allow ELF32 to be invoked either as -f elf or -f elf32
+Sat Apr 28 22:18:04 2007 +0000 Chuck Crayne
+ * Eliminate shift count warnings when building on 32-bit systems
+Sat Apr 28 06:18:48 2007 +0000 Chuck Crayne
+ * Initial support for ELF64
+Wed Apr 18 02:27:18 2007 +0000 H. Peter Anvin
+ * Fix the handling of \324 for computing the length
+Wed Apr 18 02:24:34 2007 +0000 Keith Kanios
+ * Fixed RDF/2 to comply with "maxbits" use.
+Tue Apr 17 20:23:11 2007 +0000 H. Peter Anvin
+ * Handle "LOCK as REX.R" for MOV CRx; fix warning for invalid 64-bit regs
+Mon Apr 16 18:16:46 2007 +0000 Keith Kanios
+ * MEM_OFFSET Instructions Fixed.
+Mon Apr 16 15:46:46 2007 +0000 Keith Kanios
+ * Fixed 64-bit Mode Segment Selection.
+Mon Apr 16 14:31:54 2007 +0000 Keith Kanios
+ * Fixed distinction between [LOCAL]SYMBOL/IMMEDIATE for RIP-relative addressing.
+Mon Apr 16 14:05:01 2007 +0000 Keith Kanios
+ * Fixed long mode MEM_OFFS issue.
+Mon Apr 16 13:54:49 2007 +0000 Keith Kanios
+ * Filled in all RIP Register Flags.
+Mon Apr 16 05:26:29 2007 +0000 H. Peter Anvin
+ * More \321 -> \324 for 64-bit instructions
+Mon Apr 16 04:56:06 2007 +0000 Keith Kanios
+ * Fixed 64-bit offset generation.
+Mon Apr 16 02:39:56 2007 +0000 H. Peter Anvin
+ * More 64-bit ndisasm fixes.
+Mon Apr 16 02:02:06 2007 +0000 H. Peter Anvin
+ * Fixes for 64-bit ndisasm.
+Mon Apr 16 01:21:29 2007 +0000 H. Peter Anvin
+ * Use + instead of * for extension; it feels cleaner with the new meaning.
+Mon Apr 16 01:18:30 2007 +0000 H. Peter Anvin
+ * Initial 64-bit support for ndisasm. Still a work in progress.
+Sun Apr 15 23:12:17 2007 +0000 H. Peter Anvin
+ * Clean up the 64-bitification of regs.dat for 64-bit ndisasm support
+Sun Apr 15 23:10:26 2007 +0000 H. Peter Anvin
+ * Remove @GCCFLAGS@
+Sun Apr 15 23:09:23 2007 +0000 H. Peter Anvin
+ * CR8 is not special in any way as far as the assembler is concerned.
+Sun Apr 15 23:03:28 2007 +0000 H. Peter Anvin
+ * Get rid of @GCCFLAGS@
+Sun Apr 15 22:45:25 2007 +0000 H. Peter Anvin
+ * Cleaner way to add gcc options
+Sun Apr 15 22:08:30 2007 +0000 Keith Kanios
+ * Fixed distinction between RIP relative symbols and immediate values.
+Sun Apr 15 05:40:43 2007 +0000 H. Peter Anvin
+ * Fix the register number for CR7 (it was using the same number as CR15).
+Sun Apr 15 05:32:18 2007 +0000 H. Peter Anvin
+ * More perl-like idioms for generating regdis.c
+Sun Apr 15 01:37:13 2007 +0000 Keith Kanios
+ * Fixed regdis.c generation.
+Sat Apr 14 18:54:52 2007 +0000 Keith Kanios
+ * Added DQ constants for all BITS modes.
+Sat Apr 14 08:03:02 2007 +0000 H. Peter Anvin
+ * outmacho.c: stylistic cleanups
+Sat Apr 14 03:52:05 2007 +0000 Keith Kanios
+ * Fixed support for DQ constants in long mode.
+Sat Apr 14 03:44:31 2007 +0000 Keith Kanios
+ * Hopefully it is actually fixed this time :P
+Sat Apr 14 01:49:07 2007 +0000 Keith Kanios
+ * Fixed structure initialization issue.
+Sat Apr 14 01:44:35 2007 +0000 Keith Kanios
+ * Refixed uninitialized data.
+Sat Apr 14 01:40:24 2007 +0000 Keith Kanios
+ * Fixed uninitialized structure data.
+Sat Apr 14 01:24:14 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Sat Apr 14 00:46:25 2007 +0000 Keith Kanios
+ * Placated unreferenced types.
+Sat Apr 14 00:10:59 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Fri Apr 13 23:09:18 2007 +0000 Keith Kanios
+ * Added outmacho.* to static makefile.
+Fri Apr 13 22:24:46 2007 +0000 Keith Kanios
+ * Fixed REGRIP -> RIPREG to match regs.dat.
+Fri Apr 13 22:07:53 2007 +0000 Keith Kanios
+ * Fixed obj_fwrite() declaration to match "static" definition.
+Fri Apr 13 22:03:24 2007 +0000 Keith Kanios
+ * Added appropriate "void" prototypes.
+Fri Apr 13 22:00:42 2007 +0000 Keith Kanios
+ * Replaced str(n)casecmp with more standard str(n)icmp.
+Fri Apr 13 20:06:41 2007 +0000 H. Peter Anvin
+ * AIf we have config.h, we should actually include it!!
+Fri Apr 13 19:59:20 2007 +0000 H. Peter Anvin
+ * When compiling with gcc, compile with -W -Wall for maximum warnings.
+Fri Apr 13 19:58:42 2007 +0000 H. Peter Anvin
+ * Macroize any compiler-specific code; macros defined in "compiler.h"
+Fri Apr 13 16:47:53 2007 +0000 Keith Kanios
+ * Fixed distinction between char and int8_t data types.
+Fri Apr 13 01:17:45 2007 +0000 Keith Kanios
+ * Comment "REX.I" should have been "REX.X"
+Fri Apr 13 00:52:54 2007 +0000 Keith Kanios
+ * Fixed c99 data-types after removal of typedefs.
+Fri Apr 13 00:43:50 2007 +0000 Keith Kanios
+ * Added Dev-Cpp Makefile
+Fri Apr 13 00:38:29 2007 +0000 Keith Kanios
+ * *** empty log message ***
+Thu Apr 12 17:58:02 2007 +0000 H. Peter Anvin
+ * Remove redundant inclusion of <inttypes.h>
+Thu Apr 12 16:54:50 2007 +0000 H. Peter Anvin
+ * Remove obsolete types; add <inttypes.h> where needed; header fixes
+Thu Apr 12 16:25:58 2007 +0000 H. Peter Anvin
+ * autogen.sh script to create configure, et al.
+Thu Apr 12 16:23:11 2007 +0000 Keith Kanios
+ * Fixed c99 support for RDOFF Tools
+Thu Apr 12 16:12:09 2007 +0000 H. Peter Anvin
+ * outmacho.c: Don't assume __builtin_ctzl exists for gcc < 4
+
+ * Get rid of @GCCFLAGS@
+Sun Apr 15 22:45:25 2007 +0000 H. Peter Anvin
+ * Cleaner way to add gcc options
+Sun Apr 15 22:08:30 2007 +0000 Keith Kanios
+ * Fixed distinction between RIP relative symbols and immediate values.
+Sun Apr 15 05:40:43 2007 +0000 H. Peter Anvin
+ * Fix the register number for CR7 (it was using the same number as CR15).
+Sun Apr 15 05:32:18 2007 +0000 H. Peter Anvin
+ * More perl-like idioms for generating regdis.c
+Sun Apr 15 01:37:13 2007 +0000 Keith Kanios
+ * Fixed regdis.c generation.
+Sat Apr 14 18:54:52 2007 +0000 Keith Kanios
+ * Added DQ constants for all BITS modes.
+Sat Apr 14 08:03:02 2007 +0000 H. Peter Anvin
+ * outmacho.c: stylistic cleanups
+Sat Apr 14 03:52:05 2007 +0000 Keith Kanios
+ * Fixed support for DQ constants in long mode.
+Sat Apr 14 03:44:31 2007 +0000 Keith Kanios
+ * Hopefully it is actually fixed this time :P
+Sat Apr 14 01:49:07 2007 +0000 Keith Kanios
+ * Fixed structure initialization issue.
+Sat Apr 14 01:44:35 2007 +0000 Keith Kanios
+ * Refixed uninitialized data.
+Sat Apr 14 01:40:24 2007 +0000 Keith Kanios
+ * Fixed uninitialized structure data.
+Sat Apr 14 01:24:14 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Sat Apr 14 00:46:25 2007 +0000 Keith Kanios
+ * Placated unreferenced types.
+Sat Apr 14 00:10:59 2007 +0000 Keith Kanios
+ * c99 printf/fprintf compliance.
+Fri Apr 13 23:09:18 2007 +0000 Keith Kanios
+ * Added outmacho.* to static makefile.
+Fri Apr 13 22:24:46 2007 +0000 Keith Kanios
+ * Fixed REGRIP -> RIPREG to match regs.dat.
+Fri Apr 13 22:07:53 2007 +0000 Keith Kanios
+ * Fixed obj_fwrite() declaration to match "static" definition.
+Fri Apr 13 22:03:24 2007 +0000 Keith Kanios
+ * Added appropriate "void" prototypes.
+Fri Apr 13 22:00:42 2007 +0000 Keith Kanios
+ * Replaced str(n)casecmp with more standard str(n)icmp.
+Fri Apr 13 20:06:41 2007 +0000 H. Peter Anvin
+ * AIf we have config.h, we should actually include it!!
+Fri Apr 13 19:59:20 2007 +0000 H. Peter Anvin
+ * When compiling with gcc, compile with -W -Wall for maximum warnings.
+Fri Apr 13 19:58:42 2007 +0000 H. Peter Anvin
+ * Macroize any compiler-specific code; macros defined in "compiler.h"
+Fri Apr 13 16:47:53 2007 +0000 Keith Kanios
+ * Fixed distinction between char and int8_t data types.
+Fri Apr 13 01:17:45 2007 +0000 Keith Kanios
+ * Comment "REX.I" should have been "REX.X"
+Fri Apr 13 00:52:54 2007 +0000 Keith Kanios
+ * Fixed c99 data-types after removal of typedefs.
+Fri Apr 13 00:43:50 2007 +0000 Keith Kanios
+ * Added Dev-Cpp Makefile
+Fri Apr 13 00:38:29 2007 +0000 Keith Kanios
+ * *** empty log message ***
+Thu Apr 12 17:58:02 2007 +0000 H. Peter Anvin
+ * Remove redundant inclusion of <inttypes.h>
+Thu Apr 12 16:54:50 2007 +0000 H. Peter Anvin
+ * Remove obsolete types; add <inttypes.h> where needed; header fixes
+Thu Apr 12 16:25:58 2007 +0000 H. Peter Anvin
+ * autogen.sh script to create configure, et al.
+Thu Apr 12 16:23:11 2007 +0000 Keith Kanios
+ * Fixed c99 support for RDOFF Tools
+Thu Apr 12 16:12:09 2007 +0000 H. Peter Anvin
+ * outmacho.c: Don't assume __builtin_ctzl exists for gcc < 4
+2007-04-10 Keith Kanios <keith@kanios.net>
+ * (insns.dat): updated x86-64 general+system instruction set.
+
+2007-04-09 Keith Kanios <keith@kanios.net>
+ * (outrdf.c): added support for 64-bit addressing.
+ * (outrdf2.c): added support for 64-bit addressing.
+
+2007-04-08 Keith Kanios <keith@kanios.net>
+ * (standard.mac): added entry for __BITS__ standard macro.
+ * (preproc.c): added __BITS__ to the standard macro processing.
+
+2007-04-05 Keith Kanios <keith@kanios.net>
+ * (nasm.c): added [BITS 64] for the x86-64 architecture extension.
+ * (nasm.h): added general flags to support the x86-64 architecture.
+ * (nasmlib.h): updated to support the x86-64 architecture.
+ * (nasmlib.c): revamped readnum/readlinenum to support 64-bit.
+ * (assemble.c): modified for the x86-64 architecture extension.
+ * (regs.dat): added x86-64 register extensions; revamped flags.
+ * (insns.dat): added AMD64 instruction set support.
+ * (outbin.c): added support for 64-bit addressing.
+ * (outcoff.c): added win64 (x86-64 COFF) support.
+ * (outform.h): added entry for win64.
+
+2007-03-15 Keith Kanios <keith@kanios.net>
+ * (*.c): added c99 data-type compliance and <inttypes.h> inclusion.
+ * (*.pl): added c99 data-type compliance and <inttypes.h> inclusion.
+ * (*.h): added c99 data-type compliance.
+ * (assemble.h): fixed procedure defintions to sync with respective
+ procedure declarations.
+
+2002-05-16 Ed Beroset <beroset@mindspring.com>
+ * (preproc.c): fixed unterminated macro bug error reporting
+ * (nasmlib.h): changed strdup's arg to const char *
+ * (nasmlib.c): changed strdup's arg to const char *
+
+2002-05-12 Debbie Wiles <debs@dwiles.demon.co.uk>
+ * (insns.dat): fixed incorrect processor flags
+ * (Mkfiles/Makefile.vc): added optimisation, and changed to work with 0.98.31
+ * (doc/nasmdoc.src): added %ifmacro, and tidied up format of code items.
+
+2002-05-03 H. Peter Anvin <hpa@zytor.com>
+ * (nasm.c): Change the NASM environment variable to NASMOPT.
+
+2002-05-03 H. Peter Anvin <hpa@zytor.com>
+ * (Makefile.in Mkfiles/*): use new version -> version.{h,mac}.
+ * (macros.pl): support multiple input files (standard.mac, version.mac).
+ * (standard.mac): use an explicit delimiter to end the TASM macros.
+ * (nasm-version): remove, no longer needed.
+ * (version.pl): script to produce version.h and version.mac from version.
+ * (version): contains the official NASM version.
+ * (nasm.h): include version.h.
+
+2002-05-03 H. Peter Anvin <hpa@zytor.com>
+
+ * (configure.in): create output directory.
+ * (Makefile.in): change cd ; to cd &&.
+ * (rdoff/Makefile.in): handle building in a separate obj directory
+ correctly.
+
+2002-04-29 Stanislav Karchebny <madfire@users.sourceforge.net>
+
+ * (Makefile.in): added 'strip' target to strip debug info.
+ * (INSTALL): added INSTALL file.
+ * (nasm.1): added -v option description.
+
+
+2002-04-29 Frank Kotler <fbkotler@users.sourceforge.net>
+
+ * (parser.c): fixed INCBIN bug reported by Rebel.
+
+
+2002-04-11 Stanislav Karchebny <madfire@users.sourceforge.net>
+
+ * Started ChangeLog for recording per-file changes in the project.
+ We could get away without ChangeLog at all (use CVS logs), but we
+ lose CVS so often its better to have log glued to the sources =)
+ You should record changes in CHANGES also, not for every change
+ but rather when making a release.
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 00000000..d184982f
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,102 @@
+1. Installing NASM from source (Unix, MacOS X; Windows - Cygwin;
+ Windows - MinGW; DOS - DJGPP)
+2. Installing NASM from source (Windows - MS Visual C++)
+3. Installing NASM from source (DOS, Windows, OS/2 - OpenWatcom)
+
+
+1. Installing NASM from source (Unix, MacOS X; Windows - Cygwin;
+ Windows - MinGW; DOS - DJGPP)
+================================================================
+
+Installing NASM is pretty straightforward on Unix or Unix-like systems
+with a C compiler, Make, and standard shell tools installed, including
+MinGW for Windows (with MSYS installed) and DJGPP for DOS with the
+appropriate tools. Perl is not required for compiling unmodified
+sources from a tarball, but is required to build from git or for most
+source modifications.
+
+If you checked out source from git you will need to run autoconf to
+generate configure, otherwise you don't have to.
+
+$ sh autogen.sh
+
+Then run configure to detect your platform settings and generate makefiles.
+
+$ sh configure
+
+You can get information about available configuration options by
+running `sh configure --help`.
+
+If configure fails, please file a bug report with detailed platform
+information at:
+
+ http://www.sf.net/projects/nasm/
+
+If everything went okay, type
+
+$ make
+
+to build NASM, ndisasm and rdoff tools, or
+
+$ make everything
+
+to build the former plus the docs.
+
+You can decrease the size of produces executables by stripping off
+unnecessary information, to achieve this run
+
+$ make strip
+
+If you install to a system-wide location you might need to become
+root:
+
+$ su <enter root password>
+
+then
+
+$ make install
+
+optionally followed by
+
+$ make install_rdf
+
+Or you can
+
+$ make install_everything
+
+to install everything =)
+
+
+Thats it, enjoy!
+
+
+2. Installing NASM from source (Windows - MS Visual C++)
+========================================================
+
+The recommended compiler for NASM on Windows is MinGW
+(http://www.mingw.org/), but it is also possible to compile with
+Microsoft Visual C++ (tested with Visual C++ 2005 Express Edition.)
+
+To do so, start the "Visual C++ Command Shell", go to the directory
+where the NASM source code was extracted, and run:
+
+> nmake /f Mkfiles/msvc.mak
+
+We recommend MinGW over Visual C++ 2005 as we have found it to be more
+up to date with regards to C99 compliance, and we are increasingly
+using C99 features in NASM.
+
+
+3. Installing NASM from source (DOS, Windows, OS/2 - OpenWatcom)
+================================================================
+
+NASM has been reported to build correctly with OpenWatcom 1.7 on the
+Windows and OS/2 platforms. In addition, it *should* work under DOS
+with the DOS4GW DOS extender, although the NASM developers recommend
+using DJGPP with the CWSDPMI DOS extender instead.
+
+A WMAKE make file is provided:
+
+> wmake -f Mkfiles\openwcom.mak <platform>
+
+... where <platform> is "dos", "win32" or "os2".
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..331e2600
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+NASM is now licensed under the 2-clause BSD license, also known as the
+simplified BSD license.
+
+ Copyright 1996-2010 the NASM Authors - All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following
+ conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * 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 COPYRIGHT OWNER 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.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 00000000..949d0131
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,529 @@
+#
+# Auto-configuring Makefile for the Netwide Assembler.
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the license given in the file "LICENSE"
+# distributed in the NASM archive.
+
+@SET_MAKE@
+
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+objdir = @builddir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+mandir = @mandir@
+datarootdir = @datarootdir@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+BUILD_CFLAGS = $(CPPFLAGS) $(CFLAGS) @DEFS@
+INTERNAL_CFLAGS = -I$(srcdir) -I$(objdir) \
+ -I$(srcdir)/include -I$(objdir)/include \
+ -I$(srcdir)/x86 -I$(objdir)/x86 \
+ -I$(srcdir)/asm -I$(objdir)/asm \
+ -I$(srcdir)/disasm -I$(objdir)/disasm \
+ -I$(srcdir)/output -I$(objdir)/output
+ALL_CFLAGS = $(BUILD_CFLAGS) $(INTERNAL_CFLAGS)
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+AR = @AR@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+
+PERL = perl
+PERLFLAGS = -I$(srcdir)/perllib -I$(srcdir)
+RUNPERL = $(PERL) $(PERLFLAGS)
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+NROFF = @NROFF@
+ASCIIDOC = @ASCIIDOC@
+XMLTO = @XMLTO@
+
+MAKENSIS = makensis
+
+MKDIR = mkdir -p
+RM_F = rm -f
+RM_RF = rm -rf
+LN_S = @LN_S@
+FIND = find
+
+# Binary suffixes
+O = @OBJEXT@
+X = @EXEEXT@
+A = @LIBEXT@
+
+# Debug stuff
+ifeq ($(TRACE),1)
+ CFLAGS += -DNASM_TRACE
+endif
+
+.SUFFIXES:
+.SUFFIXES: $(X) .$(O) .$(A) .xml .1 .c .i .s .txt
+
+.PHONY: all doc rdf install clean distclean cleaner spotless install_rdf test
+.PHONY: install_doc everything install_everything strip perlreq dist tags TAGS
+.PHONY: manpages nsis
+
+.c.$(O):
+ $(CC) -c $(ALL_CFLAGS) -o $@ $<
+
+.c.s:
+ $(CC) -S $(ALL_CFLAGS) -o $@ $<
+
+.c.i:
+ $(CC) -E $(ALL_CFLAGS) -o $@ $<
+
+.txt.xml:
+ $(ASCIIDOC) -b docbook -d manpage -o $@ $<
+
+.xml.1:
+ $(XMLTO) man --skip-validation $< 2>/dev/null
+
+#-- Begin File Lists --#
+NASM = asm/nasm.$(O)
+NDISASM = disasm/ndisasm.$(O)
+
+LIBOBJ = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \
+ stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) \
+ \
+ nasmlib/ver.$(O) \
+ nasmlib/crc64.$(O) nasmlib/malloc.$(O) \
+ nasmlib/md5c.$(O) nasmlib/string.$(O) \
+ nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) \
+ nasmlib/realpath.$(O) nasmlib/path.$(O) \
+ nasmlib/filename.$(O) nasmlib/srcfile.$(O) \
+ nasmlib/zerobuf.$(O) nasmlib/readnum.$(O) nasmlib/bsi.$(O) \
+ nasmlib/rbtree.$(O) nasmlib/hashtbl.$(O) \
+ nasmlib/raa.$(O) nasmlib/saa.$(O) \
+ nasmlib/strlist.$(O) \
+ nasmlib/perfhash.$(O) nasmlib/badenum.$(O) \
+ \
+ common/common.$(O) \
+ \
+ x86/insnsa.$(O) x86/insnsb.$(O) x86/insnsd.$(O) x86/insnsn.$(O) \
+ x86/regs.$(O) x86/regvals.$(O) x86/regflags.$(O) x86/regdis.$(O) \
+ x86/disp8.$(O) x86/iflag.$(O) \
+ \
+ asm/error.$(O) \
+ asm/float.$(O) \
+ asm/directiv.$(O) asm/directbl.$(O) \
+ asm/pragma.$(O) \
+ asm/assemble.$(O) asm/labels.$(O) asm/parser.$(O) \
+ asm/preproc.$(O) asm/quote.$(O) asm/pptok.$(O) \
+ asm/listing.$(O) asm/eval.$(O) asm/exprlib.$(O) asm/exprdump.$(O) \
+ asm/stdscan.$(O) \
+ asm/strfunc.$(O) asm/tokhash.$(O) \
+ asm/segalloc.$(O) \
+ asm/preproc-nop.$(O) \
+ asm/rdstrnum.$(O) \
+ \
+ macros/macros.$(O) \
+ \
+ output/outform.$(O) output/outlib.$(O) output/legacy.$(O) \
+ output/strtbl.$(O) \
+ output/nulldbg.$(O) output/nullout.$(O) \
+ output/outbin.$(O) output/outaout.$(O) output/outcoff.$(O) \
+ output/outelf.$(O) \
+ output/outobj.$(O) output/outas86.$(O) output/outrdf2.$(O) \
+ output/outdbg.$(O) output/outieee.$(O) output/outmacho.$(O) \
+ output/codeview.$(O) \
+ \
+ disasm/disasm.$(O) disasm/sync.$(O)
+
+SUBDIRS = stdlib nasmlib output asm disasm x86 common macros
+XSUBDIRS = test doc nsis rdoff
+DEPDIRS = . include config x86 rdoff $(SUBDIRS)
+#-- End File Lists --#
+
+all: nasm$(X) ndisasm$(X) rdf
+
+NASMLIB = libnasm.$(A)
+
+$(NASMLIB): $(LIBOBJ)
+ $(RM_F) $(NASMLIB)
+ $(AR) cq $(NASMLIB) $(LIBOBJ)
+ $(RANLIB) $(NASMLIB)
+
+nasm$(X): $(NASM) $(NASMLIB)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o nasm$(X) $(NASM) $(NASMLIB) $(LIBS)
+
+ndisasm$(X): $(NDISASM) $(NASMLIB)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o ndisasm$(X) $(NDISASM) $(NASMLIB) $(LIBS)
+
+#-- Begin Generated File Rules --#
+
+# These source files are automagically generated from data files using
+# Perl scripts. They're distributed, though, so it isn't necessary to
+# have Perl just to recompile NASM from the distribution.
+
+# Perl-generated source files
+PERLREQ = x86/insnsb.c x86/insnsa.c x86/insnsd.c x86/insnsi.h x86/insnsn.c \
+ x86/regs.c x86/regs.h x86/regflags.c x86/regdis.c x86/regdis.h \
+ x86/regvals.c asm/tokhash.c asm/tokens.h asm/pptok.h asm/pptok.c \
+ x86/iflag.c x86/iflaggen.h \
+ macros/macros.c \
+ asm/pptok.ph asm/directbl.c asm/directiv.h \
+ version.h version.mac version.mak nsis/version.nsh
+
+INSDEP = x86/insns.dat x86/insns.pl x86/insns-iflags.ph
+
+x86/iflag.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -fc \
+ $(srcdir)/x86/insns.dat x86/iflag.c
+x86/iflaggen.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -fh \
+ $(srcdir)/x86/insns.dat x86/iflaggen.h
+x86/insnsb.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -b \
+ $(srcdir)/x86/insns.dat x86/insnsb.c
+x86/insnsa.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -a \
+ $(srcdir)/x86/insns.dat x86/insnsa.c
+x86/insnsd.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -d \
+ $(srcdir)/x86/insns.dat x86/insnsd.c
+x86/insnsi.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -i \
+ $(srcdir)/x86/insns.dat x86/insnsi.h
+x86/insnsn.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)/x86/insns.pl -n \
+ $(srcdir)/x86/insns.dat x86/insnsn.c
+
+# These files contains all the standard macros that are derived from
+# the version number.
+version.h: version version.pl
+ $(RUNPERL) $(srcdir)/version.pl h < $(srcdir)/version > version.h
+version.mac: version version.pl
+ $(RUNPERL) $(srcdir)/version.pl mac < $(srcdir)/version > version.mac
+version.sed: version version.pl
+ $(RUNPERL) $(srcdir)/version.pl sed < $(srcdir)/version > version.sed
+version.mak: version version.pl
+ $(RUNPERL) $(srcdir)/version.pl make < $(srcdir)/version > version.mak
+nsis/version.nsh: version version.pl
+ $(RUNPERL) $(srcdir)/version.pl nsis < $(srcdir)/version > nsis/version.nsh
+
+# This source file is generated from the standard macros file
+# `standard.mac' by another Perl script. Again, it's part of the
+# standard distribution.
+macros/macros.c: macros/macros.pl asm/pptok.ph version.mac \
+ $(srcdir)/macros/*.mac $(srcdir)/output/*.mac
+ $(RUNPERL) $(srcdir)/macros/macros.pl version.mac \
+ $(srcdir)/macros/*.mac $(srcdir)/output/*.mac
+
+# These source files are generated from regs.dat by yet another
+# perl script.
+x86/regs.c: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl c \
+ $(srcdir)/x86/regs.dat > x86/regs.c
+x86/regflags.c: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl fc \
+ $(srcdir)/x86/regs.dat > x86/regflags.c
+x86/regdis.c: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl dc \
+ $(srcdir)/x86/regs.dat > x86/regdis.c
+x86/regdis.h: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl dh \
+ $(srcdir)/x86/regs.dat > x86/regdis.h
+x86/regvals.c: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl vc \
+ $(srcdir)/x86/regs.dat > x86/regvals.c
+x86/regs.h: x86/regs.dat x86/regs.pl
+ $(RUNPERL) $(srcdir)/x86/regs.pl h \
+ $(srcdir)/x86/regs.dat > x86/regs.h
+
+# Assembler token hash
+asm/tokhash.c: x86/insns.dat x86/regs.dat asm/tokens.dat asm/tokhash.pl \
+ perllib/phash.ph
+ $(RUNPERL) $(srcdir)/asm/tokhash.pl c \
+ $(srcdir)/x86/insns.dat $(srcdir)/x86/regs.dat \
+ $(srcdir)/asm/tokens.dat > asm/tokhash.c
+
+# Assembler token metadata
+asm/tokens.h: x86/insns.dat x86/regs.dat asm/tokens.dat asm/tokhash.pl \
+ perllib/phash.ph
+ $(RUNPERL) $(srcdir)/asm/tokhash.pl h \
+ $(srcdir)/x86/insns.dat $(srcdir)/x86/regs.dat \
+ $(srcdir)/asm/tokens.dat > asm/tokens.h
+
+# Preprocessor token hash
+asm/pptok.h: asm/pptok.dat asm/pptok.pl perllib/phash.ph
+ $(RUNPERL) $(srcdir)/asm/pptok.pl h \
+ $(srcdir)/asm/pptok.dat asm/pptok.h
+asm/pptok.c: asm/pptok.dat asm/pptok.pl perllib/phash.ph
+ $(RUNPERL) $(srcdir)/asm/pptok.pl c \
+ $(srcdir)/asm/pptok.dat asm/pptok.c
+asm/pptok.ph: asm/pptok.dat asm/pptok.pl perllib/phash.ph
+ $(RUNPERL) $(srcdir)/asm/pptok.pl ph \
+ $(srcdir)/asm/pptok.dat asm/pptok.ph
+
+# Directives hash
+asm/directiv.h: asm/directiv.dat nasmlib/perfhash.pl perllib/phash.ph
+ $(RUNPERL) $(srcdir)/nasmlib/perfhash.pl h \
+ $(srcdir)/asm/directiv.dat asm/directiv.h
+asm/directbl.c: asm/directiv.dat nasmlib/perfhash.pl perllib/phash.ph
+ $(RUNPERL) $(srcdir)/nasmlib/perfhash.pl c \
+ $(srcdir)/asm/directiv.dat asm/directbl.c
+
+#-- End Generated File Rules --#
+
+perlreq: $(PERLREQ)
+
+# This rule is only used for RDOFF
+.$(O)$(X):
+ $(CC) $(ALL_CFLAGS) -o $@ $< $(LDFLAGS) $(RDFLIB) $(NASMLIB) $(LIBS)
+
+RDFLN = cd rdoff && ln -s
+RDFLNPFX =
+
+#-- Begin RDOFF Shared Rules --#
+
+RDFLIBOBJ = rdoff/rdoff.$(O) rdoff/rdfload.$(O) rdoff/symtab.$(O) \
+ rdoff/collectn.$(O) rdoff/rdlib.$(O) rdoff/segtab.$(O) \
+ rdoff/hash.$(O)
+
+RDFPROGS = rdoff/rdfdump$(X) rdoff/ldrdf$(X) rdoff/rdx$(X) rdoff/rdflib$(X) \
+ rdoff/rdf2bin$(X)
+RDF2BINLINKS = rdoff/rdf2com$(X) rdoff/rdf2ith$(X) \
+ rdoff/rdf2ihx$(X) rdoff/rdf2srec$(X)
+
+RDFLIB = rdoff/librdoff.$(A)
+RDFLIBS = $(RDFLIB) $(NASMLIB)
+
+rdoff/rdfdump$(X): rdoff/rdfdump.$(O) $(RDFLIBS)
+rdoff/ldrdf$(X): rdoff/ldrdf.$(O) $(RDFLIBS)
+rdoff/rdx$(X): rdoff/rdx.$(O) $(RDFLIBS)
+rdoff/rdflib$(X): rdoff/rdflib.$(O) $(RDFLIBS)
+rdoff/rdf2bin$(X): rdoff/rdf2bin.$(O) $(RDFLIBS)
+rdoff/rdf2com$(X): rdoff/rdf2bin$(X)
+ $(RM_F) rdoff/rdf2com$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2com$(X)
+rdoff/rdf2ith$(X): rdoff/rdf2bin$(X)
+ $(RM_F) rdoff/rdf2ith$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2ith$(X)
+rdoff/rdf2ihx$(X): rdoff/rdf2bin$(X)
+ $(RM_F) rdoff/rdf2ihx$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2ihx$(X)
+rdoff/rdf2srec$(X): rdoff/rdf2bin$(X)
+ $(RM_F) rdoff/rdf2srec$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2srec$(X)
+
+#-- End RDOFF Shared Rules --#
+
+rdf: $(RDFPROGS) $(RDF2BINLINKS)
+
+$(RDFLIB): $(RDFLIBOBJ)
+ $(RM_F) $(RDFLIB)
+ $(AR) cq $(RDFLIB) $(RDFLIBOBJ)
+ $(RANLIB) $(RDFLIB)
+
+#-- Begin NSIS Rules --#
+
+# NSIS is not built except by explicit request, as it only applies to
+# Windows platforms
+nsis/arch.nsh: nsis/getpearch.pl nasm$(X)
+ $(PERL) $(srcdir)/nsis/getpearch.pl nasm$(X) > nsis/arch.nsh
+
+# Should only be done after "make everything".
+# The use of redirection here keeps makensis from moving the cwd to the
+# source directory.
+nsis: nsis/nasm.nsi nsis/arch.nsh nsis/version.nsh
+ $(MAKENSIS) -Dsrcdir="$(srcdir)" -Dobjdir="$(objdir)" - < nsis/nasm.nsi
+
+#-- End NSIS Rules --#
+
+# Generated manpages, also pregenerated for distribution
+manpages: nasm.1 ndisasm.1
+
+install: nasm$(X) ndisasm$(X)
+ $(MKDIR) $(DESTDIR)$(bindir)
+ $(INSTALL_PROGRAM) nasm$(X) $(DESTDIR)$(bindir)/nasm$(X)
+ $(INSTALL_PROGRAM) ndisasm$(X) $(DESTDIR)$(bindir)/ndisasm$(X)
+ $(MKDIR) $(DESTDIR)$(mandir)/man1
+ $(INSTALL_DATA) $(srcdir)/nasm.1 $(DESTDIR)$(mandir)/man1/nasm.1
+ $(INSTALL_DATA) $(srcdir)/ndisasm.1 $(DESTDIR)$(mandir)/man1/ndisasm.1
+
+clean:
+ for d in . $(SUBDIRS) $(XSUBDIRS); do \
+ $(RM_F) "$$d"/*.$(O) "$$d"/*.s "$$d"/*.i "$$d"/*.$(A) ; \
+ done
+ $(RM_F) nasm$(X) ndisasm$(X)
+ $(RM_F) nasm-*-installer-*.exe
+ $(RM_F) tags TAGS
+ $(RM_F) nsis/arch.nsh
+ $(RM_F) perlbreq.si
+ $(RM_F) $(RDFPROGS) $(RDF2BINLINKS)
+
+distclean: clean
+ $(RM_F) config.log config.status config/config.h
+ for d in . $(SUBDIRS) $(XSUBDIRS); do \
+ $(RM_F) "$$d"/*~ "$$d"/*.bak "$$d"/*.lst "$$d"/*.bin ; \
+ done
+ $(RM_F) test/*.$(O)
+ $(RM_RF) autom4te*.cache
+ $(RM_F) Makefile *.dep
+
+cleaner: clean
+ $(RM_F) $(PERLREQ) *.1 nasm.spec
+ $(MAKE) -C doc clean
+ $(RM_F) *.dep
+
+spotless: distclean cleaner
+ $(RM_F) doc/Makefile
+
+strip:
+ $(STRIP) --strip-unneeded nasm$(X) ndisasm$(X)
+
+TAGS:
+ $(RM_F) TAGS
+ $(FIND) . -name '*.[hcS]' -print | xargs etags -a
+
+tags:
+ $(RM_F) tags
+ $(FIND) . -name '*.[hcS]' -print | xargs ctags -a
+
+cscope:
+ $(RM_F) cscope.out cscope.files
+ $(FIND) . -name '*.[hcS]' -print > cscope.files
+ cscope -b -f cscope.out
+
+rdf_install install_rdf install_rdoff:
+ $(MKDIR) $(DESTDIR)$(bindir)
+ for f in $(RDFPROGS); do \
+ $(INSTALL_PROGRAM) "$$f" '$(DESTDIR)$(bindir)'/ ; \
+ done
+ cd '$(DESTDIR)$(bindir)' && \
+ for f in $(RDF2BINLINKS); do \
+ bn=`basename "$$f"` && $(RM_F) "$$bn" && \
+ $(LN_S) rdf2bin$(X) "$$bn" ; \
+ done
+ $(MKDIR) $(DESTDIR)$(mandir)/man1
+ $(INSTALL_DATA) $(srcdir)/rdoff/*.1 $(DESTDIR)$(mandir)/man1/
+
+doc:
+ $(MAKE) -C doc all
+
+doc_install install_doc:
+ $(MAKE) -C doc install
+
+everything: all manpages doc rdf
+
+install_everything: everything install install_doc install_rdf
+
+dist:
+ $(MAKE) alldeps
+ $(MAKE) spotless perlreq manpages spec
+ autoheader
+ autoconf
+ $(RM_RF) ./autom4te*.cache
+
+tar: dist
+ tar -cvj --exclude CVS -C .. -f ../nasm-`cat version`-`date +%Y%m%d`.tar.bz2 `basename \`pwd\``
+
+spec: nasm.spec
+
+ALLPERLSRC := $(shell find $(srcdir) -type f -name '*.p[lh]')
+
+perlbreq.si: $(ALLPERLSRC)
+ sed -n -r -e 's/^[[:space:]]*use[[:space:]]+([^[:space:];]+).*$$/BuildRequires: perl(\1)/p' $(ALLPERLSRC) | \
+ sed -r -e '/perl\((strict|warnings|Win32.*)\)/d' | \
+ sort | uniq > perlbreq.si || ( rm -f perlbreq.si ; false )
+
+nasm.spec: nasm.spec.in nasm.spec.sed version.sed perlbreq.si
+ sed -f version.sed -f nasm.spec.sed \
+ < nasm.spec.in > nasm.spec || ( rm -f nasm.spec ; false )
+
+splint:
+ splint -weak *.c
+
+test: nasm$(X)
+ cd test && $(RUNPERL) performtest.pl --nasm=../nasm *.asm
+
+golden: nasm$(X)
+ cd test && $(RUNPERL) performtest.pl --golden --nasm=../nasm *.asm
+
+#
+# Rules to run autoreconf if necessary
+#
+configure: configure.ac aclocal.m4
+ autoreconf
+
+config.status: configure
+ @if [ ! -f config.status ]; then \
+ echo "*** ERROR: Need to run configure!" 1>&2 ; \
+ exit 1; \
+ fi
+ sh config.status --recheck
+
+Makefile: config.status Makefile.in doc/Makefile.in
+ sh config.status
+
+doc/Makefile: Makefile
+
+config/config.h: config.status
+
+#
+# Does this version of this file have external dependencies? This definition
+# will be automatically updated by mkdep.pl as needed.
+#
+EXTERNAL_DEPENDENCIES = 1
+
+#
+# Generate dependency information for this Makefile only.
+# If this Makefile has external dependency information, then
+# the dependency information will remain external, so it doesn't
+# pollute the git logs.
+#
+Makefile.dep: $(PERLREQ) tools/mkdep.pl config.status
+ $(RUNPERL) tools/mkdep.pl -M Makefile.in -- $(DEPDIRS)
+
+dep: Makefile.dep
+
+#
+# This build dependencies in *ALL* makefiles, and forces all
+# dependencies to be inserted inline. For that reason, it should only
+# be invoked manually or via "make dist". It should be run before
+# creating release archives.
+#
+alldeps: $(PERLREQ) tools/syncfiles.pl tools/mkdep.pl
+ $(RUNPERL) tools/syncfiles.pl Makefile.in Mkfiles/*.mak
+ $(RUNPERL) tools/mkdep.pl -i -M Makefile.in Mkfiles/*.mak -- \
+ $(DEPDIRS)
+ $(RM_F) *.dep
+ if [ -f config.status ]; then \
+ if [ $(EXTERNAL_DEPENDENCIES) -eq 1 ]; then \
+ sh config.status --recheck; \
+ fi; \
+ sh config.status; \
+ fi
+
+# Strip internal dependency information from all Makefiles; this makes
+# the output good for git checkin
+cleandeps: $(PERLREQ) tools/syncfiles.pl tools/mkdep.pl
+ $(RUNPERL) tools/syncfiles.pl Makefile.in Mkfiles/*.mak
+ $(RUNPERL) tools/mkdep.pl -e -M Makefile.in Mkfiles/*.mak -- \
+ $(DEPDIRS)
+ $(RM_F) *.dep
+ if [ -f config.status ]; then \
+ if [ $(EXTERNAL_DEPENDENCIES) -eq 0 ]; then \
+ sh config.status --recheck; \
+ fi; \
+ sh config.status; \
+ fi
+
+#-- Magic hints to mkdep.pl --#
+# @object-ending: ".$(O)"
+# @path-separator: "/"
+# @external: "Makefile.dep"
+# @include-command: "-include"
+# @selfrule: "1"
+#-- Everything below is generated by mkdep.pl - do not edit --#
+-include Makefile.dep
diff --git a/Mkfiles/README b/Mkfiles/README
new file mode 100644
index 00000000..42d879fd
--- /dev/null
+++ b/Mkfiles/README
@@ -0,0 +1,46 @@
+These are pre-created Makefiles for various platforms, use them if
+GNU autoconf/automake packages are not supported on your system.
+
+The Makefiles are:
+
+ Filename Target Compiler Tested with
+ ---------------------------------------------------------------------------
+ msvc.mak Win32 MS Visual C++ Visual Visual Studio 2013-2017
+
+ For building on a Win32 host using Microsoft Visual C++.
+
+ Usage: nmake /f Mkfiles\msvc.mak
+
+ If the following tools are installed, the full installer package can
+ be built:
+ 1. Perl (5.6 or later), e.g. ActivePerl or StrawberryPerl
+ http://strawberryperl.com/
+ 2. Nullsoft Scriptable Install System (makensis)
+ http://nsis.sourceforge.net/Download
+ 3. Ghostscript (ps2pdf) or Acrobat Distriller (acrodist)
+ https://downloads.ghostscript.com/
+ 4. The Adobe Source Sans Pro and Source Code Pro fonts
+ https://github.com/adobe-fonts
+ 5. The Perl module Font::TTF (can usually be installed
+ via the "CPAN Client" in your Perl distribution)
+ http://search.cpan.org/~bhallissy/Font-TTF/
+ 6. The Perl module Sort::Versions (can usually be installed
+ via the "CPAN Client" in your Perl distribution)
+ http://search.cpan.org/~neilb/Sort-Versions-1.62/lib/Sort/Versions.pm
+
+ The tools need to be in your current path. To build the
+ installer package, run:
+
+ nmake /f Mkfiles\msvc.mak everything nsis
+
+ Filename Target Compiler Tested with
+ ---------------------------------------------------------------------------
+ openwcom.mak DOS,Win32,OS/2 OpenWatcom C OpenWatcom 1.7 (Win32)
+ Linux (386) OpenWatcom 1.9 (Linux)
+
+ For building on a DOS, OS/2, Win32 or Linux host using OpenWatcom.
+ OpenWatcom can be downloaded from http://www.openwatcom.org/.
+
+ Usage: wmake /f Mkfiles/openwcom.mak <target>
+
+ <target> is dos, win32, os2, or linux386.
diff --git a/Mkfiles/msvc.mak b/Mkfiles/msvc.mak
new file mode 100644
index 00000000..9aec80fc
--- /dev/null
+++ b/Mkfiles/msvc.mak
@@ -0,0 +1,399 @@
+# -*- makefile -*-
+#
+# Makefile for building NASM using Microsoft Visual C++ and NMAKE.
+# Tested on Microsoft Visual C++ 2005 Express Edition.
+#
+# Make sure to put the appropriate directories in your PATH, in
+# the case of MSVC++ 2005, they are ...\VC\bin and ...\Common7\IDE.
+#
+# This is typically done by opening the Visual Studio Command Prompt.
+#
+
+top_srcdir = .
+srcdir = .
+objdir = .
+VPATH = .
+prefix = "C:\Program Files\NASM"
+exec_prefix = $(prefix)
+bindir = $(prefix)/bin
+mandir = $(prefix)/man
+
+!IF "$(DEBUG)" == "1"
+CFLAGS = /Od /Zi
+LDFLAGS = /DEBUG
+!ELSE
+CFLAGS = /O2 /Zi
+LDFLAGS = /DEBUG /OPT:REF /OPT:ICF # (latter two undoes /DEBUG harm)
+!ENDIF
+
+CC = cl
+AR = lib
+CFLAGS = $(CFLAGS) /W2
+BUILD_CFLAGS = $(CFLAGS)
+INTERNAL_CFLAGS = /I$(srcdir) /I. \
+ /I$(srcdir)/include /I./include \
+ /I$(srcdir)/x86 /I./x86 \
+ /I$(srcdir)/asm /I./asm \
+ /I$(srcdir)/disasm /I./disasm \
+ /I$(srcdir)/output /I./output
+ALL_CFLAGS = $(BUILD_CFLAGS) $(INTERNAL_CFLAGS)
+LDFLAGS = /link $(LINKFLAGS) /SUBSYSTEM:CONSOLE /RELEASE
+LIBS =
+
+PERL = perl
+PERLFLAGS = -I$(srcdir)/perllib -I$(srcdir)
+RUNPERL = $(PERL) $(PERLFLAGS)
+
+MAKENSIS = makensis
+
+RM_F = -del /f
+LN_S = copy
+
+# Binary suffixes
+O = obj
+A = lib
+X = .exe
+.SUFFIXES:
+.SUFFIXES: $(X) .$(A) .$(O) .c .i .s .1 .man
+
+.c.obj:
+ $(CC) /c $(ALL_CFLAGS) /Fo$@ $<
+
+#-- Begin File Lists --#
+# Edit in Makefile.in, not here!
+NASM = asm\nasm.$(O)
+NDISASM = disasm\ndisasm.$(O)
+
+LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) \
+ stdlib\strnlen.$(O) stdlib\strrchrnul.$(O) \
+ \
+ nasmlib\ver.$(O) \
+ nasmlib\crc64.$(O) nasmlib\malloc.$(O) \
+ nasmlib\md5c.$(O) nasmlib\string.$(O) \
+ nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) \
+ nasmlib\realpath.$(O) nasmlib\path.$(O) \
+ nasmlib\filename.$(O) nasmlib\srcfile.$(O) \
+ nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) \
+ nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) \
+ nasmlib\raa.$(O) nasmlib\saa.$(O) \
+ nasmlib\strlist.$(O) \
+ nasmlib\perfhash.$(O) nasmlib\badenum.$(O) \
+ \
+ common\common.$(O) \
+ \
+ x86\insnsa.$(O) x86\insnsb.$(O) x86\insnsd.$(O) x86\insnsn.$(O) \
+ x86\regs.$(O) x86\regvals.$(O) x86\regflags.$(O) x86\regdis.$(O) \
+ x86\disp8.$(O) x86\iflag.$(O) \
+ \
+ asm\error.$(O) \
+ asm\float.$(O) \
+ asm\directiv.$(O) asm\directbl.$(O) \
+ asm\pragma.$(O) \
+ asm\assemble.$(O) asm\labels.$(O) asm\parser.$(O) \
+ asm\preproc.$(O) asm\quote.$(O) asm\pptok.$(O) \
+ asm\listing.$(O) asm\eval.$(O) asm\exprlib.$(O) asm\exprdump.$(O) \
+ asm\stdscan.$(O) \
+ asm\strfunc.$(O) asm\tokhash.$(O) \
+ asm\segalloc.$(O) \
+ asm\preproc-nop.$(O) \
+ asm\rdstrnum.$(O) \
+ \
+ macros\macros.$(O) \
+ \
+ output\outform.$(O) output\outlib.$(O) output\legacy.$(O) \
+ output\strtbl.$(O) \
+ output\nulldbg.$(O) output\nullout.$(O) \
+ output\outbin.$(O) output\outaout.$(O) output\outcoff.$(O) \
+ output\outelf.$(O) \
+ output\outobj.$(O) output\outas86.$(O) output\outrdf2.$(O) \
+ output\outdbg.$(O) output\outieee.$(O) output\outmacho.$(O) \
+ output\codeview.$(O) \
+ \
+ disasm\disasm.$(O) disasm\sync.$(O)
+
+SUBDIRS = stdlib nasmlib output asm disasm x86 common macros
+XSUBDIRS = test doc nsis rdoff
+DEPDIRS = . include config x86 rdoff $(SUBDIRS)
+#-- End File Lists --#
+
+NASMLIB = libnasm.$(A)
+
+all: nasm$(X) ndisasm$(X) rdf
+
+nasm$(X): $(NASM) $(NASMLIB)
+ $(CC) /Fe$@ $(NASM) $(LDFLAGS) $(NASMLIB) $(LIBS)
+
+ndisasm$(X): $(NDISASM) $(NASMLIB)
+ $(CC) /Fe$@ $(NDISASM) $(LDFLAGS) $(NASMLIB) $(LIBS)
+
+$(NASMLIB): $(LIBOBJ)
+ $(AR) $(ARFLAGS) /OUT:$@ $**
+
+#-- Begin Generated File Rules --#
+# Edit in Makefile.in, not here!
+
+# These source files are automagically generated from data files using
+# Perl scripts. They're distributed, though, so it isn't necessary to
+# have Perl just to recompile NASM from the distribution.
+
+# Perl-generated source files
+PERLREQ = x86\insnsb.c x86\insnsa.c x86\insnsd.c x86\insnsi.h x86\insnsn.c \
+ x86\regs.c x86\regs.h x86\regflags.c x86\regdis.c x86\regdis.h \
+ x86\regvals.c asm\tokhash.c asm\tokens.h asm\pptok.h asm\pptok.c \
+ x86\iflag.c x86\iflaggen.h \
+ macros\macros.c \
+ asm\pptok.ph asm\directbl.c asm\directiv.h \
+ version.h version.mac version.mak nsis\version.nsh
+
+INSDEP = x86\insns.dat x86\insns.pl x86\insns-iflags.ph
+
+x86\iflag.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -fc \
+ $(srcdir)\x86\insns.dat x86\iflag.c
+x86\iflaggen.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -fh \
+ $(srcdir)\x86\insns.dat x86\iflaggen.h
+x86\insnsb.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -b \
+ $(srcdir)\x86\insns.dat x86\insnsb.c
+x86\insnsa.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -a \
+ $(srcdir)\x86\insns.dat x86\insnsa.c
+x86\insnsd.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -d \
+ $(srcdir)\x86\insns.dat x86\insnsd.c
+x86\insnsi.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -i \
+ $(srcdir)\x86\insns.dat x86\insnsi.h
+x86\insnsn.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -n \
+ $(srcdir)\x86\insns.dat x86\insnsn.c
+
+# These files contains all the standard macros that are derived from
+# the version number.
+version.h: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl h < $(srcdir)\version > version.h
+version.mac: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl mac < $(srcdir)\version > version.mac
+version.sed: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl sed < $(srcdir)\version > version.sed
+version.mak: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl make < $(srcdir)\version > version.mak
+nsis\version.nsh: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl nsis < $(srcdir)\version > nsis\version.nsh
+
+# This source file is generated from the standard macros file
+# `standard.mac' by another Perl script. Again, it's part of the
+# standard distribution.
+macros\macros.c: macros\macros.pl asm\pptok.ph version.mac \
+ $(srcdir)\macros\*.mac $(srcdir)\output\*.mac
+ $(RUNPERL) $(srcdir)\macros\macros.pl version.mac \
+ $(srcdir)\macros\*.mac $(srcdir)\output\*.mac
+
+# These source files are generated from regs.dat by yet another
+# perl script.
+x86\regs.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl c \
+ $(srcdir)\x86\regs.dat > x86\regs.c
+x86\regflags.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl fc \
+ $(srcdir)\x86\regs.dat > x86\regflags.c
+x86\regdis.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl dc \
+ $(srcdir)\x86\regs.dat > x86\regdis.c
+x86\regdis.h: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl dh \
+ $(srcdir)\x86\regs.dat > x86\regdis.h
+x86\regvals.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl vc \
+ $(srcdir)\x86\regs.dat > x86\regvals.c
+x86\regs.h: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl h \
+ $(srcdir)\x86\regs.dat > x86\regs.h
+
+# Assembler token hash
+asm\tokhash.c: x86\insns.dat x86\regs.dat asm\tokens.dat asm\tokhash.pl \
+ perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\tokhash.pl c \
+ $(srcdir)\x86\insns.dat $(srcdir)\x86\regs.dat \
+ $(srcdir)\asm\tokens.dat > asm\tokhash.c
+
+# Assembler token metadata
+asm\tokens.h: x86\insns.dat x86\regs.dat asm\tokens.dat asm\tokhash.pl \
+ perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\tokhash.pl h \
+ $(srcdir)\x86\insns.dat $(srcdir)\x86\regs.dat \
+ $(srcdir)\asm\tokens.dat > asm\tokens.h
+
+# Preprocessor token hash
+asm\pptok.h: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl h \
+ $(srcdir)\asm\pptok.dat asm\pptok.h
+asm\pptok.c: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl c \
+ $(srcdir)\asm\pptok.dat asm\pptok.c
+asm\pptok.ph: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl ph \
+ $(srcdir)\asm\pptok.dat asm\pptok.ph
+
+# Directives hash
+asm\directiv.h: asm\directiv.dat nasmlib\perfhash.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\nasmlib\perfhash.pl h \
+ $(srcdir)\asm\directiv.dat asm\directiv.h
+asm\directbl.c: asm\directiv.dat nasmlib\perfhash.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\nasmlib\perfhash.pl c \
+ $(srcdir)\asm\directiv.dat asm\directbl.c
+
+#-- End Generated File Rules --#
+
+perlreq: $(PERLREQ)
+
+# This rule is only used for RDOFF
+.obj.exe:
+ $(CC) /Fe$@ $< $(LDFLAGS) $(RDFLIB) $(NASMLIB) $(LIBS)
+
+RDFLN = copy
+RDFLNPFX = rdoff^\
+
+#-- Begin RDOFF Shared Rules --#
+# Edit in Makefile.in, not here!
+
+RDFLIBOBJ = rdoff\rdoff.$(O) rdoff\rdfload.$(O) rdoff\symtab.$(O) \
+ rdoff\collectn.$(O) rdoff\rdlib.$(O) rdoff\segtab.$(O) \
+ rdoff\hash.$(O)
+
+RDFPROGS = rdoff\rdfdump$(X) rdoff\ldrdf$(X) rdoff\rdx$(X) rdoff\rdflib$(X) \
+ rdoff\rdf2bin$(X)
+RDF2BINLINKS = rdoff\rdf2com$(X) rdoff\rdf2ith$(X) \
+ rdoff\rdf2ihx$(X) rdoff\rdf2srec$(X)
+
+RDFLIB = rdoff\librdoff.$(A)
+RDFLIBS = $(RDFLIB) $(NASMLIB)
+
+rdoff\rdfdump$(X): rdoff\rdfdump.$(O) $(RDFLIBS)
+rdoff\ldrdf$(X): rdoff\ldrdf.$(O) $(RDFLIBS)
+rdoff\rdx$(X): rdoff\rdx.$(O) $(RDFLIBS)
+rdoff\rdflib$(X): rdoff\rdflib.$(O) $(RDFLIBS)
+rdoff\rdf2bin$(X): rdoff\rdf2bin.$(O) $(RDFLIBS)
+rdoff\rdf2com$(X): rdoff\rdf2bin$(X)
+ $(RM_F) rdoff\rdf2com$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2com$(X)
+rdoff\rdf2ith$(X): rdoff\rdf2bin$(X)
+ $(RM_F) rdoff\rdf2ith$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2ith$(X)
+rdoff\rdf2ihx$(X): rdoff\rdf2bin$(X)
+ $(RM_F) rdoff\rdf2ihx$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2ihx$(X)
+rdoff\rdf2srec$(X): rdoff\rdf2bin$(X)
+ $(RM_F) rdoff\rdf2srec$(X)
+ $(RDFLN) $(RDFLNPFX)rdf2bin$(X) $(RDFLNPFX)rdf2srec$(X)
+
+#-- End RDOFF Shared Rules --#
+
+rdf: $(RDFPROGS) $(RDF2BINLINKS)
+
+$(RDFLIB): $(RDFLIBOBJ)
+ $(AR) $(ARFLAGS) /OUT:$@ $**
+
+#-- Begin NSIS Rules --#
+# Edit in Makefile.in, not here!
+
+# NSIS is not built except by explicit request, as it only applies to
+# Windows platforms
+nsis\arch.nsh: nsis\getpearch.pl nasm$(X)
+ $(PERL) $(srcdir)\nsis\getpearch.pl nasm$(X) > nsis\arch.nsh
+
+# Should only be done after "make everything".
+# The use of redirection here keeps makensis from moving the cwd to the
+# source directory.
+nsis: nsis\nasm.nsi nsis\arch.nsh nsis\version.nsh
+ $(MAKENSIS) -Dsrcdir="$(srcdir)" -Dobjdir="$(objdir)" - < nsis\nasm.nsi
+
+#-- End NSIS Rules --#
+
+clean:
+ -del /f /s *.$(O)
+ -del /f /s *.pdb
+ -del /f /s *.s
+ -del /f /s *.i
+ -del /f $(NASMLIB) $(RDFLIB)
+ -del /f nasm$(X)
+ -del /f ndisasm$(X)
+ -del /f rdoff\*$(X)
+
+distclean: clean
+ -del /f config.h
+ -del /f config.log
+ -del /f config.status
+ -del /f Makefile
+ -del /f /s *~
+ -del /f /s *.bak
+ -del /f /s *.lst
+ -del /f /s *.bin
+ -del /f /s *.dep
+ -del /f output\*~
+ -del /f output\*.bak
+ -del /f test\*.lst
+ -del /f test\*.bin
+ -del /f test\*.$(O)
+ -del /f test\*.bin
+ -del /f/s autom4te*.cache
+ rem cd rdoff && $(MAKE) distclean
+
+cleaner: clean
+ -del /f $(PERLREQ)
+ -del /f *.man
+ -del /f nasm.spec
+ rem cd doc && $(MAKE) clean
+
+spotless: distclean cleaner
+ -del /f doc\Makefile
+ -del doc\*~
+ -del doc\*.bak
+
+strip:
+
+# Abuse doc/Makefile.in to build nasmdoc.pdf only
+docs:
+ cd doc && $(MAKE) /f Makefile.in srcdir=. top_srcdir=.. \
+ PERL=$(PERL) PDFOPT= nasmdoc.pdf
+
+everything: all docs nsis
+
+#
+# Does this version of this file have external dependencies? This definition
+# will be automatically updated by mkdep.pl as needed.
+#
+EXTERNAL_DEPENDENCIES = 1
+
+#
+# Generate dependency information for this Makefile only.
+# If this Makefile has external dependency information, then
+# the dependency information will remain external, so it doesn't
+# pollute the git logs.
+#
+msvc.dep: $(PERLREQ) tools\mkdep.pl
+ $(RUNPERL) tools\mkdep.pl -M Mkfiles\msvc.mak -- $(DEPDIRS)
+
+dep: msvc.dep
+
+# Include and/or generate msvc.dep as needed. This is too complex to
+# use the include-command feature, but we can open-code it here.
+MKDEP=0
+!IF $(EXTERNAL_DEPENDENCIES) == 1 && $(MKDEP) == 0
+!IF EXISTS(msvc.dep)
+!INCLUDE msvc.dep
+!ELSEIF [$(MAKE) /c MKDEP=1 /f Mkfiles\msvc.mak msvc.dep] == 0
+!INCLUDE msvc.dep
+!ELSE
+!ERROR Unable to rebuild dependencies file msvc.dep
+!ENDIF
+!ENDIF
+
+#-- Magic hints to mkdep.pl --#
+# @object-ending: ".$(O)"
+# @path-separator: "\"
+# @exclude: "config\config.h"
+# @external: "msvc.dep"
+# @selfrule: "1"
+#-- Everything below is generated by mkdep.pl - do not edit --#
diff --git a/Mkfiles/openwcom.mak b/Mkfiles/openwcom.mak
new file mode 100644
index 00000000..084014bb
--- /dev/null
+++ b/Mkfiles/openwcom.mak
@@ -0,0 +1,336 @@
+# -*- makefile -*-
+#
+# Makefile for building NASM using OpenWatcom
+# cross-compile on a DOS/Win32/OS2 platform host
+#
+
+top_srcdir = .
+srcdir = .
+VPATH = $(srcdir)\asm;$(srcdir)\x86;asm;x86;$(srcdir)\macros;macros;$(srcdir)\output;$(srcdir)\lib;$(srcdir)\common;$(srcdir)\stdlib;$(srcdir)\nasmlib;$(srcdir)\disasm
+prefix = C:\Program Files\NASM
+exec_prefix = $(prefix)
+bindir = $(prefix)\bin
+mandir = $(prefix)\man
+
+CC = *wcl386
+DEBUG =
+CFLAGS = -zq -6 -ox -wx -ze -fpi $(DEBUG)
+BUILD_CFLAGS = $(CFLAGS) $(%TARGET_CFLAGS)
+INTERNAL_CFLAGS = -I$(srcdir) -I. -I$(srcdir)\include -I$(srcdir)\x86 -Ix86 -I$(srcdir)\asm -Iasm -I$(srcdir)\disasm -I$(srcdir)\output
+ALL_CFLAGS = $(BUILD_CFLAGS) $(INTERNAL_CFLAGS)
+LD = *wlink
+LDEBUG =
+LDFLAGS = op quiet $(%TARGET_LFLAGS) $(LDEBUG)
+LIBS =
+STRIP = wstrip
+
+PERL = perl
+PERLFLAGS = -I$(srcdir)\perllib -I$(srcdir)
+RUNPERL = $(PERL) $(PERLFLAGS)
+
+MAKENSIS = makensis
+
+# Binary suffixes
+O = obj
+X = .exe
+
+# WMAKE errors out if a suffix is declared more than once, including
+# its own built-in declarations. Thus, we need to explicitly clear the list
+# first. Also, WMAKE only allows implicit rules that point "to the left"
+# in this list!
+.SUFFIXES:
+.SUFFIXES: .man .1 .$(O) .i .c
+
+# Needed to find C files anywhere but in the current directory
+.c : $(VPATH)
+
+.c.$(O):
+ @set INCLUDE=
+ $(CC) -c $(ALL_CFLAGS) -fo=$^@ $[@
+
+#-- Begin File Lists --#
+# Edit in Makefile.in, not here!
+NASM = asm\nasm.$(O)
+NDISASM = disasm\ndisasm.$(O)
+
+LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) &
+ stdlib\strnlen.$(O) stdlib\strrchrnul.$(O) &
+ &
+ nasmlib\ver.$(O) &
+ nasmlib\crc64.$(O) nasmlib\malloc.$(O) &
+ nasmlib\md5c.$(O) nasmlib\string.$(O) &
+ nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) &
+ nasmlib\realpath.$(O) nasmlib\path.$(O) &
+ nasmlib\filename.$(O) nasmlib\srcfile.$(O) &
+ nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) &
+ nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) &
+ nasmlib\raa.$(O) nasmlib\saa.$(O) &
+ nasmlib\strlist.$(O) &
+ nasmlib\perfhash.$(O) nasmlib\badenum.$(O) &
+ &
+ common\common.$(O) &
+ &
+ x86\insnsa.$(O) x86\insnsb.$(O) x86\insnsd.$(O) x86\insnsn.$(O) &
+ x86\regs.$(O) x86\regvals.$(O) x86\regflags.$(O) x86\regdis.$(O) &
+ x86\disp8.$(O) x86\iflag.$(O) &
+ &
+ asm\error.$(O) &
+ asm\float.$(O) &
+ asm\directiv.$(O) asm\directbl.$(O) &
+ asm\pragma.$(O) &
+ asm\assemble.$(O) asm\labels.$(O) asm\parser.$(O) &
+ asm\preproc.$(O) asm\quote.$(O) asm\pptok.$(O) &
+ asm\listing.$(O) asm\eval.$(O) asm\exprlib.$(O) asm\exprdump.$(O) &
+ asm\stdscan.$(O) &
+ asm\strfunc.$(O) asm\tokhash.$(O) &
+ asm\segalloc.$(O) &
+ asm\preproc-nop.$(O) &
+ asm\rdstrnum.$(O) &
+ &
+ macros\macros.$(O) &
+ &
+ output\outform.$(O) output\outlib.$(O) output\legacy.$(O) &
+ output\strtbl.$(O) &
+ output\nulldbg.$(O) output\nullout.$(O) &
+ output\outbin.$(O) output\outaout.$(O) output\outcoff.$(O) &
+ output\outelf.$(O) &
+ output\outobj.$(O) output\outas86.$(O) output\outrdf2.$(O) &
+ output\outdbg.$(O) output\outieee.$(O) output\outmacho.$(O) &
+ output\codeview.$(O) &
+ &
+ disasm\disasm.$(O) disasm\sync.$(O)
+
+SUBDIRS = stdlib nasmlib output asm disasm x86 common macros
+XSUBDIRS = test doc nsis rdoff
+DEPDIRS = . include config x86 rdoff $(SUBDIRS)
+#-- End File Lists --#
+
+what: .SYMBOLIC
+ @echo Please build "dos", "win32", "os2" or "linux386"
+
+dos: .SYMBOLIC
+ @set TARGET_CFLAGS=-bt=DOS -I"$(%WATCOM)\h"
+ @set TARGET_LFLAGS=sys causeway
+ @%make all
+
+win32: .SYMBOLIC
+ @set TARGET_CFLAGS=-bt=NT -I"$(%WATCOM)\h" -I"$(%WATCOM)\h\nt"
+ @set TARGET_LFLAGS=sys nt
+ @%make all
+
+os2: .SYMBOLIC
+ @set TARGET_CFLAGS=-bt=OS2 -I"$(%WATCOM)\h" -I"$(%WATCOM)\h\os2"
+ @set TARGET_LFLAGS=sys os2v2
+ @%make all
+
+linux386: .SYMBOLIC
+ @set TARGET_CFLAGS=-bt=LINUX -I"$(%WATCOM)\lh"
+ @set TARGET_LFLAGS=sys linux
+ @%make all
+
+all: perlreq nasm$(X) ndisasm$(X) .SYMBOLIC
+# cd rdoff && $(MAKE) all
+
+NASMLIB = nasm.lib
+
+nasm$(X): $(NASM) $(NASMLIB)
+ $(LD) $(LDFLAGS) name nasm$(X) libr {$(NASMLIB) $(LIBS)} file {$(NASM)}
+
+ndisasm$(X): $(NDISASM) $(LIBOBJ)
+ $(LD) $(LDFLAGS) name ndisasm$(X) libr {$(NASMLIB) $(LIBS)} file {$(NDISASM)}
+
+nasm.lib: $(LIBOBJ)
+ wlib -q -b -n $@ $(LIBOBJ)
+
+#-- Begin Generated File Rules --#
+# Edit in Makefile.in, not here!
+
+# These source files are automagically generated from data files using
+# Perl scripts. They're distributed, though, so it isn't necessary to
+# have Perl just to recompile NASM from the distribution.
+
+# Perl-generated source files
+PERLREQ = x86\insnsb.c x86\insnsa.c x86\insnsd.c x86\insnsi.h x86\insnsn.c &
+ x86\regs.c x86\regs.h x86\regflags.c x86\regdis.c x86\regdis.h &
+ x86\regvals.c asm\tokhash.c asm\tokens.h asm\pptok.h asm\pptok.c &
+ x86\iflag.c x86\iflaggen.h &
+ macros\macros.c &
+ asm\pptok.ph asm\directbl.c asm\directiv.h &
+ version.h version.mac version.mak nsis\version.nsh
+
+INSDEP = x86\insns.dat x86\insns.pl x86\insns-iflags.ph
+
+x86\iflag.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -fc &
+ $(srcdir)\x86\insns.dat x86\iflag.c
+x86\iflaggen.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -fh &
+ $(srcdir)\x86\insns.dat x86\iflaggen.h
+x86\insnsb.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -b &
+ $(srcdir)\x86\insns.dat x86\insnsb.c
+x86\insnsa.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -a &
+ $(srcdir)\x86\insns.dat x86\insnsa.c
+x86\insnsd.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -d &
+ $(srcdir)\x86\insns.dat x86\insnsd.c
+x86\insnsi.h: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -i &
+ $(srcdir)\x86\insns.dat x86\insnsi.h
+x86\insnsn.c: $(INSDEP)
+ $(RUNPERL) $(srcdir)\x86\insns.pl -n &
+ $(srcdir)\x86\insns.dat x86\insnsn.c
+
+# These files contains all the standard macros that are derived from
+# the version number.
+version.h: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl h < $(srcdir)\version > version.h
+version.mac: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl mac < $(srcdir)\version > version.mac
+version.sed: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl sed < $(srcdir)\version > version.sed
+version.mak: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl make < $(srcdir)\version > version.mak
+nsis\version.nsh: version version.pl
+ $(RUNPERL) $(srcdir)\version.pl nsis < $(srcdir)\version > nsis\version.nsh
+
+# This source file is generated from the standard macros file
+# `standard.mac' by another Perl script. Again, it's part of the
+# standard distribution.
+macros\macros.c: macros\macros.pl asm\pptok.ph version.mac &
+ $(srcdir)\macros\*.mac $(srcdir)\output\*.mac
+ $(RUNPERL) $(srcdir)\macros\macros.pl version.mac &
+ $(srcdir)\macros\*.mac $(srcdir)\output\*.mac
+
+# These source files are generated from regs.dat by yet another
+# perl script.
+x86\regs.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl c &
+ $(srcdir)\x86\regs.dat > x86\regs.c
+x86\regflags.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl fc &
+ $(srcdir)\x86\regs.dat > x86\regflags.c
+x86\regdis.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl dc &
+ $(srcdir)\x86\regs.dat > x86\regdis.c
+x86\regdis.h: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl dh &
+ $(srcdir)\x86\regs.dat > x86\regdis.h
+x86\regvals.c: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl vc &
+ $(srcdir)\x86\regs.dat > x86\regvals.c
+x86\regs.h: x86\regs.dat x86\regs.pl
+ $(RUNPERL) $(srcdir)\x86\regs.pl h &
+ $(srcdir)\x86\regs.dat > x86\regs.h
+
+# Assembler token hash
+asm\tokhash.c: x86\insns.dat x86\regs.dat asm\tokens.dat asm\tokhash.pl &
+ perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\tokhash.pl c &
+ $(srcdir)\x86\insns.dat $(srcdir)\x86\regs.dat &
+ $(srcdir)\asm\tokens.dat > asm\tokhash.c
+
+# Assembler token metadata
+asm\tokens.h: x86\insns.dat x86\regs.dat asm\tokens.dat asm\tokhash.pl &
+ perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\tokhash.pl h &
+ $(srcdir)\x86\insns.dat $(srcdir)\x86\regs.dat &
+ $(srcdir)\asm\tokens.dat > asm\tokens.h
+
+# Preprocessor token hash
+asm\pptok.h: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl h &
+ $(srcdir)\asm\pptok.dat asm\pptok.h
+asm\pptok.c: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl c &
+ $(srcdir)\asm\pptok.dat asm\pptok.c
+asm\pptok.ph: asm\pptok.dat asm\pptok.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\asm\pptok.pl ph &
+ $(srcdir)\asm\pptok.dat asm\pptok.ph
+
+# Directives hash
+asm\directiv.h: asm\directiv.dat nasmlib\perfhash.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\nasmlib\perfhash.pl h &
+ $(srcdir)\asm\directiv.dat asm\directiv.h
+asm\directbl.c: asm\directiv.dat nasmlib\perfhash.pl perllib\phash.ph
+ $(RUNPERL) $(srcdir)\nasmlib\perfhash.pl c &
+ $(srcdir)\asm\directiv.dat asm\directbl.c
+
+#-- End Generated File Rules --#
+
+perlreq: $(PERLREQ) .SYMBOLIC
+
+#-- Begin NSIS Rules --#
+# Edit in Makefile.in, not here!
+
+# NSIS is not built except by explicit request, as it only applies to
+# Windows platforms
+nsis\arch.nsh: nsis\getpearch.pl nasm$(X)
+ $(PERL) $(srcdir)\nsis\getpearch.pl nasm$(X) > nsis\arch.nsh
+
+# Should only be done after "make everything".
+# The use of redirection here keeps makensis from moving the cwd to the
+# source directory.
+nsis: nsis\nasm.nsi nsis\arch.nsh nsis\version.nsh
+ $(MAKENSIS) -Dsrcdir="$(srcdir)" -Dobjdir="$(objdir)" - < nsis\nasm.nsi
+
+#-- End NSIS Rules --#
+
+clean: .SYMBOLIC
+ rm -f *.$(O) *.s *.i
+ rm -f asm\*.$(O) asm\*.s asm\*.i
+ rm -f x86\*.$(O) x86\*.s x86\*.i
+ rm -f lib\*.$(O) lib\*.s lib\*.i
+ rm -f macros\*.$(O) macros\*.s macros\*.i
+ rm -f output\*.$(O) output\*.s output\*.i
+ rm -f common\*.$(O) common\*.s common\*.i
+ rm -f stdlib\*.$(O) stdlib\*.s stdlib\*.i
+ rm -f nasmlib\*.$(O) nasmlib\*.s nasmlib\*.i
+ rm -f disasm\*.$(O) disasm\*.s disasm\*.i
+ rm -f config.h config.log config.status
+ rm -f nasm$(X) ndisasm$(X) $(NASMLIB)
+# cd rdoff && $(MAKE) clean
+
+distclean: clean .SYMBOLIC
+ rm -f config.h config.log config.status
+ rm -f Makefile *~ *.bak *.lst *.bin
+ rm -f output\*~ output\*.bak
+ rm -f test\*.lst test\*.bin test\*.$(O) test\*.bin
+# -del \s autom4te*.cache
+# cd rdoff && $(MAKE) distclean
+
+cleaner: clean .SYMBOLIC
+ rm -f $(PERLREQ)
+ rm -f *.man
+ rm -f nasm.spec
+# cd doc && $(MAKE) clean
+
+spotless: distclean cleaner .SYMBOLIC
+ rm -f doc\Makefile doc\*~ doc\*.bak
+
+strip: .SYMBOLIC
+ $(STRIP) *.exe
+
+rdf:
+# cd rdoff && $(MAKE)
+
+doc:
+# cd doc && $(MAKE) all
+
+everything: all doc rdf
+
+#
+# This build dependencies in *ALL* makefiles. Partially for that reason,
+# it's expected to be invoked manually.
+#
+alldeps: perlreq .SYMBOLIC
+ $(PERL) syncfiles.pl Makefile.in Mkfiles\openwcom.mak
+ $(PERL) mkdep.pl -M Makefile.in Mkfiles\openwcom.mak -- . output lib
+
+#-- Magic hints to mkdep.pl --#
+# @object-ending: ".$(O)"
+# @path-separator: "\"
+# @exclude: "config/config.h"
+# @continuation: "&"
+#-- Everything below is generated by mkdep.pl - do not edit --#
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 00000000..86e0fc63
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,4 @@
+dalecurtis@chromium.org
+davidben@chromium.org
+
+# COMPONENT: Build
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
new file mode 100644
index 00000000..bcf853c2
--- /dev/null
+++ b/PRESUBMIT.py
@@ -0,0 +1,31 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Presubmit script for nasm repository."""
+
+
+def _WarnIfGitIgnoreHasSources(input_api, output_api):
+ """Warn if .gitignore has source files in it."""
+ for f in input_api.AffectedFiles():
+ if f.LocalPath().endswith('.gitignore'):
+ with open(f.LocalPath(), 'r') as f:
+ lines = f.readlines()
+
+ bad_lines = [l.strip() for l in lines if l.strip().endswith(('.c', '.h'))]
+ if not bad_lines:
+ break
+
+ return [
+ output_api.PresubmitError('\n'.join([
+ '.gitignore contains source files which may be needed for building, ',
+ 'please remove the .gitignore entries for the following lines:',
+ '\n ' + ' \n'.join(bad_lines)
+ ]))
+ ]
+ return []
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ results = []
+ results.extend(_WarnIfGitIgnoreHasSources(input_api, output_api))
+ return results
diff --git a/README.chromium b/README.chromium
new file mode 100644
index 00000000..f25e7e66
--- /dev/null
+++ b/README.chromium
@@ -0,0 +1,68 @@
+Name: Netwide Assembler
+Short Name: nasm
+URL: https://www.nasm.us/
+Version: bfa1ed0ae9cb15b54b008431d122db3c22cd45eb
+License: 2-Clause BSD
+License File: LICENSE
+Security Critical: no
+Source: https://repo.or.cz/nasm.git
+
+--[ DESCRIPTION ] ------------------
+This contains the source to NASM, the assembler used for parts of Chromium.
+
+
+--[ PATCHES ] ------------------
+* See README.patches for the full listing.
+
+If you make any changes to nasm which are not in upstream, please update the
+README.patches file with the following command:
+
+ ./find_patches.py > README.patches
+
+Note: This script only works if you have added upstream as a remote per the
+directions in updating below.
+
+
+--[ UPDATING ] ------------------
+To update, have clang in your system path (from //third_party/llvm-
+build/Release+Asserts/bin) then do the following:
+
+ git remote add upstream https://repo.or.cz/nasm.git
+ git fetch upstream
+ git merge upstream/master
+
+ # Maybe use git mergetool to resolve any conflicts with local patches.
+
+ # ***DO NOT USE*** git cl upload for this part or you will spam every author
+ # who committed something upstream with a Gerrit issue... :O You must also
+ # have the correct Gerrit permissions from one of the OWNERS to do this.
+ git push origin master
+
+ # You can safely use git cl upload for all of your own modifications past this
+ # point; I.e., once you have pushed all the commits from the git merge.
+
+ CC=clang CXX=clang++ ./autogen.sh
+ CC=clang CXX=clang++ ./configure
+ make perlreq
+ ./generate_nasm_sources.py
+ git add <any new .c/.h files which show up>
+
+ # Copy config/config.h to config-(mac|win|linux).h
+ # Revert config/config.h to the checked in version
+
+ git commit -a
+
+
+--[ CONFIG_H_ ] ------------------
+In the event any new config.h flags are added, you may need to regenerate the
+config.h for Linux and Mac. You may be able to just copy new flags into all
+platform configurations, but this may not always work.
+
+The mac configuration may need some additional changes depending on the current
+SDK version being targeted by Chrome; the following change was made for 10.9:
+/* #undef HAVE_FACCESSAT */
+
+
+--[ TODOS ] ------------------
+TODO(dalecurtis): See if there's a CFLAG that can be given to configure to avoid
+it using 10.10 features while Chrome targets 10.9 SDK.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..704fba14
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+NASM, the Netwide Assembler
+===========================
+
+[![master](https://travis-ci.org/netwide-assembler/nasm.svg?branch=master)](https://travis-ci.org/netwide-assembler/nasm)
+
+Many many developers all over the net respect NASM for what it is:
+a widespread (thus netwide), portable (thus netwide!), very flexible
+and mature assembler tool with support for many output formats (thus netwide!!).
+
+Now we have good news for you: NASM is licensed under the "simplified"
+[(2-clause) BSD license](https://opensource.org/licenses/BSD-2-Clause).
+This means its development is open to even wider society of programmers
+wishing to improve their lovely assembler.
+
+Visit our [nasm.us](https://www.nasm.us/) website for more details.
+We are gradually moving services away from Sourceforge. For our remaining
+Sourceforge services see [here](https://sourceforge.net/projects/nasm/).
+
+With best regards, the NASM crew.
diff --git a/README.patches b/README.patches
new file mode 100644
index 00000000..dffdbc0e
--- /dev/null
+++ b/README.patches
@@ -0,0 +1,81 @@
+---------------------------------------------------------------------
+-- Chromium Patches. Autogenerated by find_patches.py, do not edit --
+---------------------------------------------------------------------
+
+
+------------------------------------------------------------------
+commit 107604940bdc9787bc12fab8cdcc22ca6d53fdbb
+Author: Dale Curtis <dalecurtis@chromium.org>
+Date: Wed Oct 31 13:03:37 2018 -0700
+
+ Apply deterministic build patch.
+
+ This removes __DATE__ from a few places to ensure the build is always
+ the same. Patch originally authored by davidben at chromium.org
+
+ This is one of the initial commits preparing NASM for use in Chrome.
+
+ BUG=766721
+
+ Change-Id: I4217f9ffed1455b8f244b024dc10dbb8c5c0664d
+
+Affects:
+ asm/nasm.c
+ disasm/ndisasm.c
+ include/ver.h
+ nasmlib/ver.c
+
+------------------------------------------------------------------
+commit 4ee6a69ce33be1e96fd3c44a6e3ae3d8177453da
+Author: Dale Curtis <dalecurtis@chromium.org>
+Date: Mon Nov 19 13:52:05 2018 -0800
+
+ Remove uses of time(NULL) for build determism.
+
+ Removes cases suggested on the bug.
+
+ BUG=766721
+ TEST=none
+
+ Change-Id: I88c11d052aef8a9c4e48b3b976ad432f3b008dd6
+
+Affects:
+ asm/nasm.c
+ output/outcoff.c
+
+------------------------------------------------------------------
+commit dff67a9842e4ab6699598d75691a630df090e7f5
+Author: Reid Kleckner <rnk@google.com>
+Date: Tue Aug 6 15:16:16 2019 -0700
+
+ Fix extern_inline for MSVC and clang-cl
+
+ Prior to this change, no inline function bodies would be provided for
+ MSVC. This change fixes that, so nasm will be slightly faster.
+
+ With clang-cl, however, there would be LNK4006 warnings if the compiler
+ chooses not to inline the ilog2 functions. The easiest way to observe
+ this is with `nmake /f Mkfiles/msvc.mak CC=clang-cl DEBUG=1`. This
+ disables inlining, and I see this at the end of the link:
+ ilog2.obj : warning LNK4006: ilog2_32 already defined in outmacho.obj; second definition ignored
+ ilog2.obj : warning LNK4006: ilog2_64 already defined in eval.obj; second definition ignored
+ ilog2.obj : warning LNK4006: alignlog2_32 already defined in outmacho.obj; second definition ignored
+
+ When additional instrumentation (-fprofile-instr-generate) is enabled,
+ the warning can become an error, as we discovered in
+ https://crbug.com/989745.
+
+ MSVC and compilers pretending to be MSVC (clang-cl) implement inline in
+ C with C++ semantics. In C++, inline functions are emitted by the
+ compiler whenever they are needed and the linker discards duplicate
+ inline function definitions. This change adds a new HAVE_MSVC_INLINE
+ macro and adjusts the ifdefs to handle this mode. I chose to keep
+ ilog2.c as part of the build, and to have it emit duplicate definitions
+ of all the inline functions. An alternative solution would be to exclude
+ it from the build, but I felt it was best to solve this in source code
+ instead of the build system.
+
+Affects:
+ include/compiler.h
+ include/ilog2.h
+
diff --git a/SubmittingPatches b/SubmittingPatches
new file mode 100644
index 00000000..168ab640
--- /dev/null
+++ b/SubmittingPatches
@@ -0,0 +1,116 @@
+How to submit patches into the NASM
+===================================
+
+Actually the rules are pretty simple
+
+Obtaining the source code
+-------------------------
+
+The NASM sources are tracked by Git SCM at http://repo.or.cz/w/nasm.git
+repository. You either could download packed sources or use git tool itself
+
+ git clone git://repo.or.cz/nasm.git
+
+Changin the source code
+-----------------------
+
+When you change the NASM source code keep in mind -- we prefer tabs and
+indentations to be 4 characters width, space filled.
+
+Other "rules" could be learned from NASM sources -- just make your code
+to look similar.
+
+Producing patch
+---------------
+
+There are at least two ways to make it right.
+
+ 1) git format-patch
+
+ You might need to read documentation on Git SCM how to prepare patch
+ for mail submission. Take a look on http://book.git-scm.com/ and/or
+ http://git-scm.com/documentation for details. It should not be hard
+ at all.
+
+ 2) Use "diff -up"
+
+ Use "diff -up" or "diff -uprN" to create patches.
+
+Signing your work
+-----------------
+
+To improve tracking of who did what we've introduced a "sign-off" procedure
+on patches that are being emailed around.
+
+The sign-off is a simple line at the end of the explanation for the
+patch, which certifies that you wrote it or otherwise have the right to
+pass it on as a open-source patch. The rules are pretty simple: if you
+can certify the below:
+
+ Developer's Certificate of Origin 1.1
+
+ By making a contribution to this project, I certify that:
+
+ (a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+
+ (b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
+
+ (c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+ (d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
+
+then you just add a line saying
+
+ Signed-off-by: Random J Developer <random@developer.example.org>
+
+using your real name (please, no pseudonyms or anonymous contributions if
+it possible)
+
+An example of patch message
+---------------------------
+
+From: Random J Developer <random@developer.example.org>
+Subject: [PATCH] Short patch description
+
+Long patch description (could be skipped if patch
+is trivial enough)
+
+Signed-off-by: Random J Developer <random@developer.example.org>
+---
+Patch body here
+
+Mailing patches
+---------------
+
+The patches should be sent to NASM development mailing list
+
+ nasm-devel@lists.sourceforge.net
+
+Please make sure the email client you're using doesn't screw
+your patch (line wrapping and so on).
+
+Wait for response
+-----------------
+
+Be patient. Most NASM developers are pretty busy people so if
+there is no immediate response on your patch -- don't
+be surprised, sometimes a patch may fly around a week(s) before
+gets reviewed. But definitely the patches will not go to /dev/null.
+
+ ---
+ With best regards,
+ NASM-team
diff --git a/TODO b/TODO
new file mode 100644
index 00000000..29a1b05e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,376 @@
+NASM TODO list
+==============
+
+This, like the AUTHORS file, is intended for easy readability by both human
+and machine, thus the format.
+
+ F: feature
+ V: version you should expect it by
+ R: responsible person or - if unassigned
+ C: % complete
+ D: description
+ D: maybe on multiple lines
+
+Anything that doesn't start with /^[FVRCD]:/ should be ignored.
+
+ F:-line triggers new entry.
+ Empty V,R,C assume: V: ?, R: -, C: 0%
+
+=============
+
+F: Extended x64 Support
+D: Full FPU/MMX/SSE* instruction support for x64
+
+F: ELF64 output format
+D: Support for assembling code to the ELF64 output format
+
+F: NDISASM x64 Support
+D: Ability to disassemble respective x64 code
+
+F: General x64 Support
+V: 0.99.00
+R: Keith Kanios
+C: 99%
+D: Support for assembling 64-bit code to various output formats
+
+F: win64 (x86-64 COFF) output format
+V: 0.99.00
+R: Keith Kanios
+C: 99%
+D: Support for assembling code to the win64 output format
+
+F: c99 data-type compliance
+V: 0.99.00
+R: Keith Kanios
+C: 99%
+D: Revamped entire source-code base data-types for compliance
+D: with c99 (inttypes.h)
+
+F: __BITS__ Standard Macro
+V: 0.99.00
+R: Keith Kanios
+C: 100%
+D: __BITS__ standard macro that returns current [BITS XX] mode
+
+F: i18n via gettext
+D: kkanios: be careful about that, stick to UTF-8 if anything
+
+F: Convert shallow code model to deep code model
+D: Tired of messing between lots of unrelated files (especially .c/.h stuff)
+
+F: Automated dependency generation for Makefile
+D: Current looks awful and will break if anything changes.
+
+F: Move output modules out*.c to output/ subdir
+R: madfire
+C: 100%
+
+== THESE ARE FROM old NASM's Wishlist
+== THEY NEED SEVERE REVISING (seems they weren't updated for a couple of years or so)
+
+F: Check misc/ide.cfg into RCS as Watcom IDE enhancement thingy
+V: 0.98
+D: (nop@dlc.fi)
+
+F: Package the Linux Assembler HOWTO
+V: 0.98
+
+F: 3DNow!, SSE and other extensions need documenting
+V: 0.98
+D: hpa: Does it really make sense to have a whole instruction set
+D: reference packaged with the assembler?
+D: kkanios: Yes, for me it was a great help... and still is.
+
+F: prototypes of lrotate don't match in test/*. Fix.
+V: 0.98
+
+F: Build djgpp binaries for 0.98 onwards. Look into PMODE/W as a stub
+V: 0.98
+D: it might be a lot better than CWSDPMI. It's in PMW133.ZIP.
+
+F: %undef operator that goes along with %define
+V: ?
+C: 100%
+
+F: Fix `%error' giving error messages twice.
+V: 0.99
+D: Not especially important, as changes planned for 1.1x below will make
+D: the preprocessor be only called once.
+
+F: Sort out problems with OBJ
+V: 0.99
+D: * TLINK32 doesn't seem to like SEGDEF32 et al. So for that, we
+D: should avoid xxx32 records wherever we can.
+D: * However, didn't we change _to_ using xxx32 at some stage? Try
+D: to remember why and when.
+D: * Apparently Delphi's linker has trouble with two or more
+D: globals being defined inside a PUBDEF32. Don't even know if it
+D: _can_ cope with a PUBDEF16.
+D: * Might need extra flags. *sigh*
+
+F: Symbol table output may possibly be useful.
+V: 0.99
+D: Ken Martwick (kenm@efn.org) wants the following format:
+D: labelname type offset(hex) repetition count
+D: Possibly include xref addresses after repetition count?
+
+F: ELF fixes
+V: 0.99
+D: There are various other bugs in outelf.c that make certain kinds
+D: of relocation not work. See zbrown.asm. Looks like we may have to do
+D: a major rewrite of parts of it. Compare some NASM code output with
+D: equivalent GAS code output. Look at the ELF spec. Generally fix things.
+
+F: ELF fixes
+V: 0.99
+D: NASM is currently using a kludge in ELF that involves defining
+D: a symbol at a zero absolute offset. This isn't needed, as the
+D: documented solution to the problem that this solves is to use
+D: SHN_UNDEF.
+
+F: Debug information, in all formats it can be usefully done in.
+V: 0.99
+D: * including line-number record support.
+D: * "George C. Lindauer" <gclind01@starbase.spd.louisville.edu>
+D: wants to have some say in how this goes through.
+D: * Andrew Crabtree <andrewc@rosemail.rose.hp.com> wants to help out.
+
+F: Think about a line-continuation character.
+V: 0.99
+
+F: Consider allowing declaration of two labels on the same line,
+V: 0.99
+D: syntax 'label1[:] label2[:] ... instruction'.
+D: Need to investigate feasibility.
+
+F: Quoting of quotes by doubling them, in string and char constants.
+V: 0.99
+
+F: Two-operand syntax for SEGMENT/SECTION macro to avoid warnings
+D: of ignored section parameters on reissue of __SECT__.
+D: Or maybe skip the warning if the given parameters are identical to
+D: what was actually stored. Investigate.
+V: 0.99
+
+F: Apparently we are not missing a PSRAQ instruction, because it
+D: doesn't exist. Check that it doesn't exist as an undocumented
+D: instruction, or something stupid like that.
+V: 0.99
+
+F: Any assembled form starting 0x80 can also start 0x82.
+V: 1.00
+D: ndisasm should know this. New special code in instruction encodings, probably.
+
+F: Pointing an EQU at an external symbol now generates an error.
+V: 1.05
+D: There may be a better way of handling this; we should look into it.
+D: Ideally, the label mechanism should be changed to cope with one
+D: label being declared relative to another - that may work, but could be
+D: a pain to implement (or is it? it may be easy enough that you just
+D: need to declare a new offset in the same segment...) This should be done
+D: before v1.0 is released. There is a comment regarding this in labels.c,
+D: towards the end of the file, which discusses ways of fixing this.
+
+F: nested %rep used to cause a panic.
+V: 1.10
+D: Now a more informative error message is produced. This problem whould
+D: be fixed before v1.0.
+D: See comment in switch() statement block for PP_REP in do_directive()
+D: in preproc.c (line 1585, or thereabouts)
+
+F: Contribution
+D: zgraeme.tar contains improved hash table routines
+D: contributed by Graeme Defty <graeme@HK.Super.NET> for use in the
+D: label manager.
+
+F: Contribution
+D: zsyntax.zip contains a syntax-highlighting mode for
+D: NASM, for use with the Aurora text editor (??).
+
+F: Contribution
+D: zvim.zip contains a syntax-highlighting mode for NASM, for use with vim.
+
+F: Contribution
+D: zkendal1.zip and zkendal2.zip contain Kendall
+D: Bennett's (<KendallB@scitechsoft.com>) alternative syntax stuff,
+D: providing an alternative syntax mode for NASM which allows a macro
+D: set to be written that allows the same source files to be
+D: assembled with NASM and TASM.
+R: Kendall Bennett
+C: 100%
+
+F: Add the UD2 instruction.
+C: 100%
+
+F: Add the four instructions documented in 24368901.pdf (Intel's own document).
+C: 100%
+
+F: Some means of avoiding MOV memoffs,EAX which apparently the
+D: Pentium pairing detector thinks modifies EAX. Similar means of
+D: choosing instruction encodings where necessary.
+V: 1.10?
+
+F: The example of ..@ makes it clear that a ..@ label isn't just
+D: local, but doesn't make it clear that it isn't just global either.
+
+F: hpa wants an evaluator operator for ceil(log2(x)).
+
+F: Extra reloc types in ELF
+D: R_386_16 type 20, PC16 is 21, 8 is 22, PC8 is 23.
+D: Add support for the 16s at least.
+
+F: Lazy section creation or selective section output
+D: in COFF/win32 at least and probably other formats: don't bother to emit a section
+D: if it contains no data. Particularly the default auto-created
+D: section. We believe zero-length sections crash at least WLINK (in win32).
+
+F: Make the flags field in `struct itemplate' in insns.h a long instead of an int.
+C: 100%?
+
+F: Implement %ifref to check whether a single-line macro has ever been expanded since (last re) definition. Or maybe not. We'll see.
+
+F: add pointer to \k{insLEAVE} and \k{insENTER} in chapters about mixed-language programming.
+
+F: Some equivalent to TASM's GLOBAL directive
+D: ie something which defines a symbol as external if it doesn't end up being defined
+D: but defines it as public if it does end up being defined.
+
+F: Documentation doesn't explain about C++ name mangling.
+
+F: see if BITS can be made to do anything sensible in obj (eg set the default new-segment property to Use32).
+
+F: OBJ: coalesce consecutive offset and segment fixups for the same location into full-32bit-pointer fixups.
+D: This is apparently necessary because some twazzock in the PowerBASIC development
+D: team didn't design to support the OMF spec the way the rest of the
+D: world sees it.
+
+F: Allow % to be separated from the rest of a preproc directive, for alternative directive indentation styles.
+
+F: __DATE__, __TIME__, and text variants of __NASM_MAJOR__ and __NASM_MINOR__.
+
+F: Warn on TIMES combined with multi-line macros.
+V: 1.00
+D: TIMES gets applied to first line only - should bring to users' attention.
+
+F: Re-work the evaluator, again, with a per-object-format fixup
+D: routine, so as to be able to cope with section offsets "really"
+D: being pure numbers; should be able to allow at _least_ the two
+D: common idioms
+D: TIMES 510-$ DB 0 ; bootsector
+D: MOV AX,(PROG_END-100H)/16 ; .COM TSR
+D: Would need to call the fixup throughout the evaluator, and the
+D: fixup would have to be allowed to return UNKNOWN on pass one if it
+D: had to. (_Always_ returning UNKNOWN on pass one, though a lovely
+D: clean design, breaks the first of the above examples.)
+V: 1.10
+
+F: Preprocessor identifier concatenation?
+V: 1.10
+
+F: Arbitrary section names in `bin'.
+V: 0.98.09
+D: Is this necessary? Is it even desirable?
+D: hpa: Desirable, yes. Necessary? Probably not, but there are definitely cases where it becomes quite useful.
+R: madfire
+C: 100%
+
+F: Ability to read from a pipe.
+V: 1.10
+D: Obviously not useful under dos, so memory problems with storing
+D: entire input file aren't a problem either.
+
+F: File caching under DOS/32 bit...
+V: 1.10?
+D: maybe even implement discardable buffers that get thrown away
+D: when we get a NULL returned from malloc(). Only really useful under
+D: DOS. Think about it.
+
+F: possibly spool out the pre-processed stuff to a file, to avoid having to re-process it.
+V: 1.10?
+D: Possible problems with preprocessor values not known on pass 1? Have a look...
+
+F: Or maybe we can spool out a pre-parsed version...?
+V: 1.10
+D: Need to investigate feasibility. Does the results from the parser
+D: change from pass 1 to pass 2? Would it be feasible to alter it so that
+D: the parser returns an invariant result, and this is then processed
+D: afterwards to resolve label references, etc?
+
+F: Subsection support?
+
+F: A good ALIGN mechanism, similar to GAS's.
+V: 0.98p1
+D: GAS pads out space by means of the following (32-bit) instructions:
+D: 8DB42600000000 lea esi,[esi+0x0]
+D: 8DB600000000 lea esi,[esi+0x0]
+D: 8D742600 lea esi,[esi+0x0]
+D: 8D7600 lea esi,[esi+0x0]
+D: 8D36 lea esi,[esi]
+D: 90 nop
+D: It uses up to two of these instructions to do up to 14-byte pads;
+D: when more than 14 bytes are needed, it issues a (short) jump to
+D: the end of the padded section and then NOPs the rest. Come up with
+D: a similar scheme for 16 bit mode, and also come up with a way to
+D: use it - internal to the assembler, so that programs using ALIGN
+D: don't knock over preprocess-only mode.
+D: Also re-work the macro form so that when given one argument in a
+D: code section it calls this feature.
+R: Panos Minos
+C: 100%?
+
+F: Possibly a means whereby FP constants can be specified as immediate operands to non-FP instructions.
+D: * Possible syntax: MOV EAX,FLOAT 1.2 to get a single-precision FP
+D: constant. Then maybe MOV EAX,HI_FLOAT 1.2 and MOV EAX,LO_FLOAT
+D: 1.2 to get the two halves of a double-precision one. Best to
+D: ignore extended-precision in case it bites.
+D: * Alternatively, maybe MOV EAX,FLOAT(4,0-4,1.2) to get bytes 0-4
+D: (ie 0-3) of a 4-byte constant. Then HI_FLOAT is FLOAT(8,4-8,x)
+D: and LO_FLOAT is FLOAT(8,0-4,x). But this version allows two-byte
+D: chunks, one-byte chunks, even stranger chunks, and pieces of
+D: ten-byte reals to be bandied around as well.
+
+F: A UNION macro might be quite cool
+D: now that ABSOLUTE is sane enough to be able to handle it.
+
+F: An equivalent to gcc's ## stringify operator, plus string concatenation
+D: somehow implemented without undue ugliness, so as
+D: to be able to do `%include "/my/path/%1"' in a macro, or something
+D: similar...
+
+F: Actually _do_ something with the processor, privileged and
+D: undocumented flags in the instruction table. When this happens,
+D: consider allowing PMULHRW to map to either of the Cyrix or AMD
+D: versions?
+D: hpa: The -p option to ndisasm now uses this to some extent.
+V: 1.10
+
+F: Maybe NEC V20/V30 instructions? ?
+D: hpa: What are they? Should be trivial to implement.
+
+F: Yet more object formats.
+D: * Possibly direct support for .EXE files?
+V: 1.10
+
+F: Symbol map in binary format. Format-specific options...
+V: 1.10?
+
+F: REDESIGN: Think about EQU dependency, and about start-point specification in OBJ. Possibly re-think directive support.
+V: 1.20?
+
+F: Think about a wrapper program like gcc?
+V: 2.00?
+D: Possibly invent a _patch_ for gcc so that it can take .asm files on the command line?
+D: If a wrapper happens, think about adding an option to cause the
+D: resulting executable file to be executed immediately, thus
+D: allowing NASM source files to have #!... (probably silly)
+
+F: Multi-platform support?
+D: If so: definitely Alpha; possibly Java byte code;
+D: probably ARM/StrongARM; maybe Sparc; maybe Mips; maybe
+D: Vax. Perhaps Z80 and 6502, just for a laugh?
+
+F: Consider a 'verbose' option that prints information about the resulting object file onto stdout.
+
+F: Line numbers in the .lst file don't match the line numbers in the input.
+D: They probably should, rather than the current matching of the post-preprocessor line numbers.
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 00000000..1af2dd5d
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,202 @@
+dnl --------------------------------------------------------------------------
+dnl PA_SYM(prefix, string)
+dnl
+dnl Convert a (semi-) arbitrary string to a CPP symbol
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_SYM,
+[[$1]m4_bpatsubsts(m4_toupper([$2]),[[^ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]+],[_],[^._?\(.*\)_.$],[[\1]])])
+
+dnl --------------------------------------------------------------------------
+dnl PA_ADD_CFLAGS(flag [,actual_flag])
+dnl
+dnl Attempt to add the given option to CFLAGS, if it doesn't break
+dnl compilation. If the option to be tested is different than the
+dnl option that should actually be added, add the option to be
+dnl actually added as a second argument.
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_ADD_CFLAGS,
+[AC_MSG_CHECKING([if $CC accepts $1])
+ pa_add_cflags__old_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $1"
+ AC_TRY_LINK(AC_INCLUDES_DEFAULT,
+ [printf("Hello, World!\n");],
+ [AC_MSG_RESULT([yes])
+ CFLAGS="$pa_add_cflags__old_cflags ifelse([$2],[],[$1],[$2])"
+ AC_DEFINE(PA_SYM([CFLAG_],[$1]), 1,
+ [Define to 1 if compiled with the `$1' compiler flag])],
+ [AC_MSG_RESULT([no])
+ CFLAGS="$pa_add_cflags__old_cflags"])])
+
+dnl --------------------------------------------------------------------------
+dnl PA_ADD_CLDFLAGS(flag [,actual_flag])
+dnl
+dnl Attempt to add the given option to CFLAGS and LDFLAGS,
+dnl if it doesn't break compilation
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_ADD_CLDFLAGS,
+[AC_MSG_CHECKING([if $CC accepts $1])
+ pa_add_cldflags__old_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $1"
+ pa_add_cldflags__old_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $1"
+ AC_TRY_LINK(AC_INCLUDES_DEFAULT,
+ [printf("Hello, World!\n");],
+ [AC_MSG_RESULT([yes])
+ CFLAGS="$pa_add_cldflags__old_cflags ifelse([$2],[],[$1],[$2])"
+ LDFLAGS="$pa_add_cldflags__old_ldflags ifelse([$2],[],[$1],[$2])"
+ AC_DEFINE(PA_SYM([CFLAG_],[$1]), 1,
+ [Define to 1 if compiled with the `$1' compiler flag])],
+ [AC_MSG_RESULT([no])
+ CFLAGS="$pa_add_cldflags__old_cflags"
+ LDFLAGS="$pa_add_cldflags__old_ldflags"])])
+
+dnl --------------------------------------------------------------------------
+dnl PA_HAVE_FUNC(func_name)
+dnl
+dnl Look for a function with the specified arguments which could be
+dnl a builtin/intrinsic function.
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_HAVE_FUNC,
+[AC_MSG_CHECKING([for $1])
+ AC_LINK_IFELSE([AC_LANG_SOURCE([
+AC_INCLUDES_DEFAULT
+int main(void) {
+ (void)$1$2;
+ return 0;
+}
+ ])],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE(AS_TR_CPP([HAVE_$1]), 1,
+ [Define to 1 if you have the `$1' intrinsic function.])],
+ [AC_MSG_RESULT([no])])
+])
+
+dnl --------------------------------------------------------------------------
+dnl PA_LIBEXT
+dnl
+dnl Guess the library extension based on the object extension
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_LIBEXT,
+[AC_MSG_CHECKING([for suffix of library files])
+if test x"$LIBEXT" = x; then
+ case "$OBJEXT" in
+ obj )
+ LIBEXT=lib
+ ;;
+ *)
+ LIBEXT=a
+ ;;
+ esac
+fi
+AC_MSG_RESULT([$LIBEXT])
+AC_SUBST([LIBEXT])])
+
+dnl --------------------------------------------------------------------------
+dnl PA_FUNC_ATTRIBUTE(attribute_name)
+dnl
+dnl See if this compiler supports the equivalent of a specific gcc
+dnl attribute on a function, using the __attribute__(()) syntax.
+dnl All arguments except the attribute name are optional.
+dnl PA_FUNC_ATTRIBUTE(attribute, attribute_opts, return_type,
+dnl prototype_args, call_args)
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_FUNC_ATTRIBUTE,
+[AC_MSG_CHECKING([if $CC supports the $1 function attribute])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+AC_INCLUDES_DEFAULT
+extern ifelse([$3],[],[void *],[$3]) __attribute__(($1$2))
+ bar(ifelse([$4],[],[int],[$4]));
+ifelse([$3],[],[void *],[$3]) foo(void);
+ifelse([$3],[],[void *],[$3]) foo(void)
+{
+ ifelse([$3],[void],[],[return])
+ bar(ifelse([$5],[],[1],[$5]));
+}
+ ])],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE(PA_SYM([HAVE_FUNC_ATTRIBUTE_],[$1]), 1,
+ [Define to 1 if your compiler supports __attribute__(($1)) on functions])],
+ [AC_MSG_RESULT([no])])
+])
+
+dnl --------------------------------------------------------------------------
+dnl PA_FUNC_ATTRIBUTE_ERROR
+dnl
+dnl See if this compiler supports __attribute__((error("foo")))
+dnl The generic version of this doesn't work as it makes the compiler
+dnl throw an error by design.
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_FUNC_ATTRIBUTE_ERROR,
+[AC_MSG_CHECKING([if $CC supports the error function attribute])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+AC_INCLUDES_DEFAULT
+extern void __attribute__((error("message"))) barf(void);
+void foo(void);
+void foo(void)
+{
+ if (0)
+ barf();
+}
+ ])],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE([HAVE_FUNC_ATTRIBUTE_ERROR], 1,
+ [Define to 1 if your compiler supports __attribute__((error)) on functions])],
+ [AC_MSG_RESULT([no])])
+])
+
+dnl --------------------------------------------------------------------------
+dnl PA_ARG_ENABLED(option, helptext [,enabled_action [,disabled_action]])
+dnl PA_ARG_DISABLED(option, helptext [,disabled_action [,enabled_action]])
+dnl
+dnl Simpler-to-use versions of AC_ARG_ENABLED, that include the
+dnl test for $enableval and the AS_HELP_STRING definition
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_ARG_ENABLED,
+[AC_ARG_ENABLE([$1], [AS_HELP_STRING([--enable-$1],[$2])], [], [enableval=no])
+ AS_IF([test x"$enableval" != xno], [$3], [$4])
+])
+
+AC_DEFUN(PA_ARG_DISABLED,
+[AC_ARG_ENABLE([$1],[AS_HELP_STRING([--disable-$1],[$2])], [], [enableval=yes])
+ AS_IF([test x"$enableval" = xno], [$3], [$4])
+])
+
+dnl --------------------------------------------------------------------------
+dnl PA_ADD_HEADERS(headers...)
+dnl
+dnl Call AC_CHECK_HEADERS(), and add to ac_includes_default if found
+dnl --------------------------------------------------------------------------
+AC_DEFUN(_PA_ADD_HEADER,
+[AC_CHECK_HEADERS([$1],[ac_includes_default="$ac_includes_default
+#include <$1>"
+])])
+
+AC_DEFUN(PA_ADD_HEADERS,
+[m4_map_args_w([$1],[_PA_ADD_HEADER(],[)])])
+
+dnl --------------------------------------------------------------------------
+dnl PA_CHECK_BAD_STDC_INLINE
+dnl
+dnl Some versions of gcc seem to apply -Wmissing-prototypes to C99
+dnl inline functions, which means we need to use GNU inline syntax
+dnl --------------------------------------------------------------------------
+AC_DEFUN(PA_CHECK_BAD_STDC_INLINE,
+[AC_MSG_CHECKING([if $CC supports C99 external inlines])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+AC_INCLUDES_DEFAULT
+
+/* Don't mistake GNU inlines for c99 */
+#ifdef __GNUC_GNU_INLINE__
+# error "Using gnu inline standard"
+#endif
+
+inline int foo(int x)
+{
+ return x+1;
+}
+ ])],
+ [AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_STDC_INLINE, 1,
+ [Define to 1 if your compiler supports C99 extern inline])],
+ [AC_MSG_RESULT([no])
+ PA_ADD_CFLAGS([-fgnu89-inline])])])
diff --git a/asm/assemble.c b/asm/assemble.c
new file mode 100644
index 00000000..da58d128
--- /dev/null
+++ b/asm/assemble.c
@@ -0,0 +1,3008 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * assemble.c code generation for the Netwide Assembler
+ *
+ * Bytecode specification
+ * ----------------------
+ *
+ *
+ * Codes Mnemonic Explanation
+ *
+ * \0 terminates the code. (Unless it's a literal of course.)
+ * \1..\4 that many literal bytes follow in the code stream
+ * \5 add 4 to the primary operand number (b, low octdigit)
+ * \6 add 4 to the secondary operand number (a, middle octdigit)
+ * \7 add 4 to both the primary and the secondary operand number
+ * \10..\13 a literal byte follows in the code stream, to be added
+ * to the register value of operand 0..3
+ * \14..\17 the position of index register operand in MIB (BND insns)
+ * \20..\23 ib a byte immediate operand, from operand 0..3
+ * \24..\27 ib,u a zero-extended byte immediate operand, from operand 0..3
+ * \30..\33 iw a word immediate operand, from operand 0..3
+ * \34..\37 iwd select between \3[0-3] and \4[0-3] depending on 16/32 bit
+ * assembly mode or the operand-size override on the operand
+ * \40..\43 id a long immediate operand, from operand 0..3
+ * \44..\47 iwdq select between \3[0-3], \4[0-3] and \5[4-7]
+ * depending on the address size of the instruction.
+ * \50..\53 rel8 a byte relative operand, from operand 0..3
+ * \54..\57 iq a qword immediate operand, from operand 0..3
+ * \60..\63 rel16 a word relative operand, from operand 0..3
+ * \64..\67 rel select between \6[0-3] and \7[0-3] depending on 16/32 bit
+ * assembly mode or the operand-size override on the operand
+ * \70..\73 rel32 a long relative operand, from operand 0..3
+ * \74..\77 seg a word constant, from the _segment_ part of operand 0..3
+ * \1ab a ModRM, calculated on EA in operand a, with the spare
+ * field the register value of operand b.
+ * \172\ab the register number from operand a in bits 7..4, with
+ * the 4-bit immediate from operand b in bits 3..0.
+ * \173\xab the register number from operand a in bits 7..4, with
+ * the value b in bits 3..0.
+ * \174..\177 the register number from operand 0..3 in bits 7..4, and
+ * an arbitrary value in bits 3..0 (assembled as zero.)
+ * \2ab a ModRM, calculated on EA in operand a, with the spare
+ * field equal to digit b.
+ *
+ * \240..\243 this instruction uses EVEX rather than REX or VEX/XOP, with the
+ * V field taken from operand 0..3.
+ * \250 this instruction uses EVEX rather than REX or VEX/XOP, with the
+ * V field set to 1111b.
+ *
+ * EVEX prefixes are followed by the sequence:
+ * \cm\wlp\tup where cm is:
+ * cc 00m mmm
+ * c = 2 for EVEX and mmmm is the M field (EVEX.P0[3:0])
+ * and wlp is:
+ * 00 wwl lpp
+ * [l0] ll = 0 (.128, .lz)
+ * [l1] ll = 1 (.256)
+ * [l2] ll = 2 (.512)
+ * [lig] ll = 3 for EVEX.L'L don't care (always assembled as 0)
+ *
+ * [w0] ww = 0 for W = 0
+ * [w1] ww = 1 for W = 1
+ * [wig] ww = 2 for W don't care (always assembled as 0)
+ * [ww] ww = 3 for W used as REX.W
+ *
+ * [p0] pp = 0 for no prefix
+ * [60] pp = 1 for legacy prefix 60
+ * [f3] pp = 2
+ * [f2] pp = 3
+ *
+ * tup is tuple type for Disp8*N from %tuple_codes in insns.pl
+ * (compressed displacement encoding)
+ *
+ * \254..\257 id,s a signed 32-bit operand to be extended to 64 bits.
+ * \260..\263 this instruction uses VEX/XOP rather than REX, with the
+ * V field taken from operand 0..3.
+ * \270 this instruction uses VEX/XOP rather than REX, with the
+ * V field set to 1111b.
+ *
+ * VEX/XOP prefixes are followed by the sequence:
+ * \tmm\wlp where mm is the M field; and wlp is:
+ * 00 wwl lpp
+ * [l0] ll = 0 for L = 0 (.128, .lz)
+ * [l1] ll = 1 for L = 1 (.256)
+ * [lig] ll = 2 for L don't care (always assembled as 0)
+ *
+ * [w0] ww = 0 for W = 0
+ * [w1 ] ww = 1 for W = 1
+ * [wig] ww = 2 for W don't care (always assembled as 0)
+ * [ww] ww = 3 for W used as REX.W
+ *
+ * t = 0 for VEX (C4/C5), t = 1 for XOP (8F).
+ *
+ * \271 hlexr instruction takes XRELEASE (F3) with or without lock
+ * \272 hlenl instruction takes XACQUIRE/XRELEASE with or without lock
+ * \273 hle instruction takes XACQUIRE/XRELEASE with lock only
+ * \274..\277 ib,s a byte immediate operand, from operand 0..3, sign-extended
+ * to the operand size (if o16/o32/o64 present) or the bit size
+ * \310 a16 indicates fixed 16-bit address size, i.e. optional 0x67.
+ * \311 a32 indicates fixed 32-bit address size, i.e. optional 0x67.
+ * \312 adf (disassembler only) invalid with non-default address size.
+ * \313 a64 indicates fixed 64-bit address size, 0x67 invalid.
+ * \314 norexb (disassembler only) invalid with REX.B
+ * \315 norexx (disassembler only) invalid with REX.X
+ * \316 norexr (disassembler only) invalid with REX.R
+ * \317 norexw (disassembler only) invalid with REX.W
+ * \320 o16 indicates fixed 16-bit operand size, i.e. optional 0x66.
+ * \321 o32 indicates fixed 32-bit operand size, i.e. optional 0x66.
+ * \322 odf indicates that this instruction is only valid when the
+ * operand size is the default (instruction to disassembler,
+ * generates no code in the assembler)
+ * \323 o64nw indicates fixed 64-bit operand size, REX on extensions only.
+ * \324 o64 indicates 64-bit operand size requiring REX prefix.
+ * \325 nohi instruction which always uses spl/bpl/sil/dil
+ * \326 nof3 instruction not valid with 0xF3 REP prefix. Hint for
+ disassembler only; for SSE instructions.
+ * \330 a literal byte follows in the code stream, to be added
+ * to the condition code value of the instruction.
+ * \331 norep instruction not valid with REP prefix. Hint for
+ * disassembler only; for SSE instructions.
+ * \332 f2i REP prefix (0xF2 byte) used as opcode extension.
+ * \333 f3i REP prefix (0xF3 byte) used as opcode extension.
+ * \334 rex.l LOCK prefix used as REX.R (used in non-64-bit mode)
+ * \335 repe disassemble a rep (0xF3 byte) prefix as repe not rep.
+ * \336 mustrep force a REP(E) prefix (0xF3) even if not specified.
+ * \337 mustrepne force a REPNE prefix (0xF2) even if not specified.
+ * \336-\337 are still listed as prefixes in the disassembler.
+ * \340 resb reserve <operand 0> bytes of uninitialized storage.
+ * Operand 0 had better be a segmentless constant.
+ * \341 wait this instruction needs a WAIT "prefix"
+ * \360 np no SSE prefix (== \364\331)
+ * \361 66 SSE prefix (== \366\331)
+ * \364 !osp operand-size prefix (0x66) not permitted
+ * \365 !asp address-size prefix (0x67) not permitted
+ * \366 operand-size prefix (0x66) used as opcode extension
+ * \367 address-size prefix (0x67) used as opcode extension
+ * \370,\371 jcc8 match only if operand 0 meets byte jump criteria.
+ * jmp8 370 is used for Jcc, 371 is used for JMP.
+ * \373 jlen assemble 0x03 if bits==16, 0x05 if bits==32;
+ * used for conditional jump over longer jump
+ * \374 vsibx|vm32x|vm64x this instruction takes an XMM VSIB memory EA
+ * \375 vsiby|vm32y|vm64y this instruction takes an YMM VSIB memory EA
+ * \376 vsibz|vm32z|vm64z this instruction takes an ZMM VSIB memory EA
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "assemble.h"
+#include "insns.h"
+#include "tables.h"
+#include "disp8.h"
+#include "listing.h"
+
+enum match_result {
+ /*
+ * Matching errors. These should be sorted so that more specific
+ * errors come later in the sequence.
+ */
+ MERR_INVALOP,
+ MERR_OPSIZEMISSING,
+ MERR_OPSIZEMISMATCH,
+ MERR_BRNOTHERE,
+ MERR_BRNUMMISMATCH,
+ MERR_MASKNOTHERE,
+ MERR_DECONOTHERE,
+ MERR_BADCPU,
+ MERR_BADMODE,
+ MERR_BADHLE,
+ MERR_ENCMISMATCH,
+ MERR_BADBND,
+ MERR_BADREPNE,
+ MERR_REGSETSIZE,
+ MERR_REGSET,
+ /*
+ * Matching success; the conditional ones first
+ */
+ MOK_JUMP, /* Matching OK but needs jmp_match() */
+ MOK_GOOD /* Matching unconditionally OK */
+};
+
+typedef struct {
+ enum ea_type type; /* what kind of EA is this? */
+ int sib_present; /* is a SIB byte necessary? */
+ int bytes; /* # of bytes of offset needed */
+ int size; /* lazy - this is sib+bytes+1 */
+ uint8_t modrm, sib, rex, rip; /* the bytes themselves */
+ int8_t disp8; /* compressed displacement for EVEX */
+} ea;
+
+#define GEN_SIB(scale, index, base) \
+ (((scale) << 6) | ((index) << 3) | ((base)))
+
+#define GEN_MODRM(mod, reg, rm) \
+ (((mod) << 6) | (((reg) & 7) << 3) | ((rm) & 7))
+
+static int64_t calcsize(int32_t, int64_t, int, insn *,
+ const struct itemplate *);
+static int emit_prefix(struct out_data *data, const int bits, insn *ins);
+static void gencode(struct out_data *data, insn *ins);
+static enum match_result find_match(const struct itemplate **tempp,
+ insn *instruction,
+ int32_t segment, int64_t offset, int bits);
+static enum match_result matches(const struct itemplate *, insn *, int bits);
+static opflags_t regflag(const operand *);
+static int32_t regval(const operand *);
+static int rexflags(int, opflags_t, int);
+static int op_rexflags(const operand *, int);
+static int op_evexflags(const operand *, int, uint8_t);
+static void add_asp(insn *, int);
+
+static enum ea_type process_ea(operand *, ea *, int, int,
+ opflags_t, insn *, const char **);
+
+static inline bool absolute_op(const struct operand *o)
+{
+ return o->segment == NO_SEG && o->wrt == NO_SEG &&
+ !(o->opflags & OPFLAG_RELATIVE);
+}
+
+static int has_prefix(insn * ins, enum prefix_pos pos, int prefix)
+{
+ return ins->prefixes[pos] == prefix;
+}
+
+static void assert_no_prefix(insn * ins, enum prefix_pos pos)
+{
+ if (ins->prefixes[pos])
+ nasm_error(ERR_NONFATAL, "invalid %s prefix",
+ prefix_name(ins->prefixes[pos]));
+}
+
+static const char *size_name(int size)
+{
+ switch (size) {
+ case 1:
+ return "byte";
+ case 2:
+ return "word";
+ case 4:
+ return "dword";
+ case 8:
+ return "qword";
+ case 10:
+ return "tword";
+ case 16:
+ return "oword";
+ case 32:
+ return "yword";
+ case 64:
+ return "zword";
+ default:
+ return "???";
+ }
+}
+
+static void warn_overflow(int size)
+{
+ nasm_error(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
+ "%s data exceeds bounds", size_name(size));
+}
+
+static void warn_overflow_const(int64_t data, int size)
+{
+ if (overflow_general(data, size))
+ warn_overflow(size);
+}
+
+static void warn_overflow_out(int64_t data, int size, enum out_sign sign)
+{
+ bool err;
+
+ switch (sign) {
+ case OUT_WRAP:
+ err = overflow_general(data, size);
+ break;
+ case OUT_SIGNED:
+ err = overflow_signed(data, size);
+ break;
+ case OUT_UNSIGNED:
+ err = overflow_unsigned(data, size);
+ break;
+ default:
+ panic();
+ break;
+ }
+
+ if (err)
+ warn_overflow(size);
+}
+
+/*
+ * This routine wrappers the real output format's output routine,
+ * in order to pass a copy of the data off to the listing file
+ * generator at the same time, flatten unnecessary relocations,
+ * and verify backend compatibility.
+ */
+static void out(struct out_data *data)
+{
+ static int32_t lineno = 0; /* static!!! */
+ static const char *lnfname = NULL;
+ union {
+ uint8_t b[8];
+ uint64_t q;
+ } xdata;
+ size_t asize, amax;
+ uint64_t zeropad = 0;
+ int64_t addrval;
+ int32_t fixseg; /* Segment for which to produce fixed data */
+
+ if (!data->size)
+ return; /* Nothing to do */
+
+ /*
+ * Convert addresses to RAWDATA if possible
+ * XXX: not all backends want this for global symbols!!!!
+ */
+ switch (data->type) {
+ case OUT_ADDRESS:
+ addrval = data->toffset;
+ fixseg = NO_SEG; /* Absolute address is fixed data */
+ goto address;
+
+ case OUT_RELADDR:
+ addrval = data->toffset - data->relbase;
+ fixseg = data->segment; /* Our own segment is fixed data */
+ goto address;
+
+ address:
+ nasm_assert(data->size <= 8);
+ asize = data->size;
+ amax = ofmt->maxbits >> 3; /* Maximum address size in bytes */
+ if ((ofmt->flags & OFMT_KEEP_ADDR) == 0 && data->tsegment == fixseg &&
+ data->twrt == NO_SEG) {
+ warn_overflow_out(addrval, asize, data->sign);
+ xdata.q = cpu_to_le64(addrval);
+ data->data = xdata.b;
+ data->type = OUT_RAWDATA;
+ asize = amax = 0; /* No longer an address */
+ }
+ break;
+
+ case OUT_SEGMENT:
+ nasm_assert(data->size <= 8);
+ asize = data->size;
+ amax = 2;
+ break;
+
+ default:
+ asize = amax = 0; /* Not an address */
+ break;
+ }
+
+ /*
+ * this call to src_get determines when we call the
+ * debug-format-specific "linenum" function
+ * it updates lineno and lnfname to the current values
+ * returning 0 if "same as last time", -2 if lnfname
+ * changed, and the amount by which lineno changed,
+ * if it did. thus, these variables must be static
+ */
+
+ if (src_get(&lineno, &lnfname))
+ dfmt->linenum(lnfname, lineno, data->segment);
+
+ if (asize > amax) {
+ if (data->type == OUT_RELADDR || data->sign == OUT_SIGNED) {
+ nasm_error(ERR_NONFATAL,
+ "%u-bit signed relocation unsupported by output format %s",
+ (unsigned int)(asize << 3), ofmt->shortname);
+ } else {
+ nasm_error(ERR_WARNING | ERR_WARN_ZEXTRELOC,
+ "%u-bit %s relocation zero-extended from %u bits",
+ (unsigned int)(asize << 3),
+ data->type == OUT_SEGMENT ? "segment" : "unsigned",
+ (unsigned int)(amax << 3));
+ }
+ zeropad = data->size - amax;
+ data->size = amax;
+ }
+ lfmt->output(data);
+
+ if (likely(data->segment != NO_SEG)) {
+ ofmt->output(data);
+ } else {
+ /* Outputting to ABSOLUTE section - only reserve is permitted */
+ if (data->type != OUT_RESERVE) {
+ nasm_error(ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+ " space");
+ }
+ /* No need to push to the backend */
+ }
+
+ data->offset += data->size;
+ data->insoffs += data->size;
+
+ if (zeropad) {
+ data->type = OUT_ZERODATA;
+ data->size = zeropad;
+ lfmt->output(data);
+ ofmt->output(data);
+ data->offset += zeropad;
+ data->insoffs += zeropad;
+ data->size += zeropad; /* Restore original size value */
+ }
+}
+
+static inline void out_rawdata(struct out_data *data, const void *rawdata,
+ size_t size)
+{
+ data->type = OUT_RAWDATA;
+ data->data = rawdata;
+ data->size = size;
+ out(data);
+}
+
+static void out_rawbyte(struct out_data *data, uint8_t byte)
+{
+ data->type = OUT_RAWDATA;
+ data->data = &byte;
+ data->size = 1;
+ out(data);
+}
+
+static inline void out_reserve(struct out_data *data, uint64_t size)
+{
+ data->type = OUT_RESERVE;
+ data->size = size;
+ out(data);
+}
+
+static void out_segment(struct out_data *data, const struct operand *opx)
+{
+ if (opx->opflags & OPFLAG_RELATIVE)
+ nasm_error(ERR_NONFATAL, "segment references cannot be relative");
+
+ data->type = OUT_SEGMENT;
+ data->sign = OUT_UNSIGNED;
+ data->size = 2;
+ data->toffset = opx->offset;
+ data->tsegment = ofmt->segbase(opx->segment | 1);
+ data->twrt = opx->wrt;
+ out(data);
+}
+
+static void out_imm(struct out_data *data, const struct operand *opx,
+ int size, enum out_sign sign)
+{
+ if (opx->segment != NO_SEG && (opx->segment & 1)) {
+ /*
+ * This is actually a segment reference, but eval() has
+ * already called ofmt->segbase() for us. Sigh.
+ */
+ if (size < 2)
+ nasm_error(ERR_NONFATAL, "segment reference must be 16 bits");
+
+ data->type = OUT_SEGMENT;
+ } else {
+ data->type = (opx->opflags & OPFLAG_RELATIVE)
+ ? OUT_RELADDR : OUT_ADDRESS;
+ }
+ data->sign = sign;
+ data->toffset = opx->offset;
+ data->tsegment = opx->segment;
+ data->twrt = opx->wrt;
+ /*
+ * XXX: improve this if at some point in the future we can
+ * distinguish the subtrahend in expressions like [foo - bar]
+ * where bar is a symbol in the current segment. However, at the
+ * current point, if OPFLAG_RELATIVE is set that subtraction has
+ * already occurred.
+ */
+ data->relbase = 0;
+ data->size = size;
+ out(data);
+}
+
+static void out_reladdr(struct out_data *data, const struct operand *opx,
+ int size)
+{
+ if (opx->opflags & OPFLAG_RELATIVE)
+ nasm_error(ERR_NONFATAL, "invalid use of self-relative expression");
+
+ data->type = OUT_RELADDR;
+ data->sign = OUT_SIGNED;
+ data->size = size;
+ data->toffset = opx->offset;
+ data->tsegment = opx->segment;
+ data->twrt = opx->wrt;
+ data->relbase = data->offset + (data->inslen - data->insoffs);
+ out(data);
+}
+
+static bool jmp_match(int32_t segment, int64_t offset, int bits,
+ insn * ins, const struct itemplate *temp)
+{
+ int64_t isize;
+ const uint8_t *code = temp->code;
+ uint8_t c = code[0];
+ bool is_byte;
+
+ if (((c & ~1) != 0370) || (ins->oprs[0].type & STRICT))
+ return false;
+ if (!optimizing.level || (optimizing.flag & OPTIM_DISABLE_JMP_MATCH))
+ return false;
+ if (optimizing.level < 0 && c == 0371)
+ return false;
+
+ isize = calcsize(segment, offset, bits, ins, temp);
+
+ if (ins->oprs[0].opflags & OPFLAG_UNKNOWN)
+ /* Be optimistic in pass 1 */
+ return true;
+
+ if (ins->oprs[0].segment != segment)
+ return false;
+
+ isize = ins->oprs[0].offset - offset - isize; /* isize is delta */
+ is_byte = (isize >= -128 && isize <= 127); /* is it byte size? */
+
+ if (is_byte && c == 0371 && ins->prefixes[PPS_REP] == P_BND) {
+ /* jmp short (opcode eb) cannot be used with bnd prefix. */
+ ins->prefixes[PPS_REP] = P_none;
+ nasm_error(ERR_WARNING | ERR_WARN_BND | ERR_PASS2 ,
+ "jmp short does not init bnd regs - bnd prefix dropped.");
+ }
+
+ return is_byte;
+}
+
+/* This is totally just a wild guess what is reasonable... */
+#define INCBIN_MAX_BUF (ZERO_BUF_SIZE * 16)
+
+int64_t assemble(int32_t segment, int64_t start, int bits, insn *instruction)
+{
+ struct out_data data;
+ const struct itemplate *temp;
+ enum match_result m;
+ int64_t wsize; /* size for DB etc. */
+
+ nasm_zero(data);
+ data.offset = start;
+ data.segment = segment;
+ data.itemp = NULL;
+ data.bits = bits;
+
+ wsize = db_bytes(instruction->opcode);
+ if (wsize == -1)
+ return 0;
+
+ if (wsize) {
+ extop *e;
+
+ list_for_each(e, instruction->eops) {
+ if (e->type == EOT_DB_NUMBER) {
+ if (wsize > 8) {
+ nasm_error(ERR_NONFATAL,
+ "integer supplied to a DT, DO, DY or DZ"
+ " instruction");
+ } else {
+ data.insoffs = 0;
+ data.inslen = data.size = wsize;
+ data.toffset = e->offset;
+ data.twrt = e->wrt;
+ data.relbase = 0;
+ if (e->segment != NO_SEG && (e->segment & 1)) {
+ data.tsegment = e->segment;
+ data.type = OUT_SEGMENT;
+ data.sign = OUT_UNSIGNED;
+ } else {
+ data.tsegment = e->segment;
+ data.type = e->relative ? OUT_RELADDR : OUT_ADDRESS;
+ data.sign = OUT_WRAP;
+ }
+ out(&data);
+ }
+ } else if (e->type == EOT_DB_STRING ||
+ e->type == EOT_DB_STRING_FREE) {
+ int align = e->stringlen % wsize;
+ if (align)
+ align = wsize - align;
+
+ data.insoffs = 0;
+ data.inslen = e->stringlen + align;
+
+ out_rawdata(&data, e->stringval, e->stringlen);
+ out_rawdata(&data, zero_buffer, align);
+ }
+ }
+ } else if (instruction->opcode == I_INCBIN) {
+ const char *fname = instruction->eops->stringval;
+ FILE *fp;
+ size_t t = instruction->times; /* INCBIN handles TIMES by itself */
+ off_t base = 0;
+ off_t len;
+ const void *map = NULL;
+ char *buf = NULL;
+ size_t blk = 0; /* Buffered I/O block size */
+ size_t m = 0; /* Bytes last read */
+
+ if (!t)
+ goto done;
+
+ fp = nasm_open_read(fname, NF_BINARY|NF_FORMAP);
+ if (!fp) {
+ nasm_error(ERR_NONFATAL, "`incbin': unable to open file `%s'",
+ fname);
+ goto done;
+ }
+
+ len = nasm_file_size(fp);
+
+ if (len == (off_t)-1) {
+ nasm_error(ERR_NONFATAL, "`incbin': unable to get length of file `%s'",
+ fname);
+ goto close_done;
+ }
+
+ if (instruction->eops->next) {
+ base = instruction->eops->next->offset;
+ if (base >= len) {
+ len = 0;
+ } else {
+ len -= base;
+ if (instruction->eops->next->next &&
+ len > (off_t)instruction->eops->next->next->offset)
+ len = (off_t)instruction->eops->next->next->offset;
+ }
+ }
+
+ lfmt->set_offset(data.offset);
+ lfmt->uplevel(LIST_INCBIN);
+
+ if (!len)
+ goto end_incbin;
+
+ /* Try to map file data */
+ map = nasm_map_file(fp, base, len);
+ if (!map) {
+ blk = len < (off_t)INCBIN_MAX_BUF ? (size_t)len : INCBIN_MAX_BUF;
+ buf = nasm_malloc(blk);
+ }
+
+ while (t--) {
+ /*
+ * Consider these irrelevant for INCBIN, since it is fully
+ * possible that these might be (way) bigger than an int
+ * can hold; there is, however, no reason to widen these
+ * types just for INCBIN. data.inslen == 0 signals to the
+ * backend that these fields are meaningless, if at all
+ * needed.
+ */
+ data.insoffs = 0;
+ data.inslen = 0;
+
+ if (map) {
+ out_rawdata(&data, map, len);
+ } else if ((off_t)m == len) {
+ out_rawdata(&data, buf, len);
+ } else {
+ off_t l = len;
+
+ if (fseeko(fp, base, SEEK_SET) < 0 || ferror(fp)) {
+ nasm_error(ERR_NONFATAL,
+ "`incbin': unable to seek on file `%s'",
+ fname);
+ goto end_incbin;
+ }
+ while (l > 0) {
+ m = fread(buf, 1, l < (off_t)blk ? (size_t)l : blk, fp);
+ if (!m || feof(fp)) {
+ /*
+ * This shouldn't happen unless the file
+ * actually changes while we are reading
+ * it.
+ */
+ nasm_error(ERR_NONFATAL,
+ "`incbin': unexpected EOF while"
+ " reading file `%s'", fname);
+ goto end_incbin;
+ }
+ out_rawdata(&data, buf, m);
+ l -= m;
+ }
+ }
+ }
+ end_incbin:
+ lfmt->downlevel(LIST_INCBIN);
+ if (instruction->times > 1) {
+ lfmt->uplevel(LIST_TIMES);
+ lfmt->downlevel(LIST_TIMES);
+ }
+ if (ferror(fp)) {
+ nasm_error(ERR_NONFATAL,
+ "`incbin': error while"
+ " reading file `%s'", fname);
+ }
+ close_done:
+ if (buf)
+ nasm_free(buf);
+ if (map)
+ nasm_unmap_file(map, len);
+ fclose(fp);
+ done:
+ instruction->times = 1; /* Tell the upper layer not to iterate */
+ ;
+ } else {
+ /* "Real" instruction */
+
+ /* Check to see if we need an address-size prefix */
+ add_asp(instruction, bits);
+
+ m = find_match(&temp, instruction, data.segment, data.offset, bits);
+
+ if (m == MOK_GOOD) {
+ /* Matches! */
+ int64_t insn_size = calcsize(data.segment, data.offset,
+ bits, instruction, temp);
+ nasm_assert(insn_size >= 0);
+
+ data.itemp = temp;
+ data.bits = bits;
+ data.insoffs = 0;
+ data.inslen = insn_size;
+
+ gencode(&data, instruction);
+ nasm_assert(data.insoffs == insn_size);
+ } else {
+ /* No match */
+ switch (m) {
+ case MERR_OPSIZEMISSING:
+ nasm_error(ERR_NONFATAL, "operation size not specified");
+ break;
+ case MERR_OPSIZEMISMATCH:
+ nasm_error(ERR_NONFATAL, "mismatch in operand sizes");
+ break;
+ case MERR_BRNOTHERE:
+ nasm_error(ERR_NONFATAL,
+ "broadcast not permitted on this operand");
+ break;
+ case MERR_BRNUMMISMATCH:
+ nasm_error(ERR_NONFATAL,
+ "mismatch in the number of broadcasting elements");
+ break;
+ case MERR_MASKNOTHERE:
+ nasm_error(ERR_NONFATAL,
+ "mask not permitted on this operand");
+ break;
+ case MERR_DECONOTHERE:
+ nasm_error(ERR_NONFATAL, "unsupported mode decorator for instruction");
+ break;
+ case MERR_BADCPU:
+ nasm_error(ERR_NONFATAL, "no instruction for this cpu level");
+ break;
+ case MERR_BADMODE:
+ nasm_error(ERR_NONFATAL, "instruction not supported in %d-bit mode",
+ bits);
+ break;
+ case MERR_ENCMISMATCH:
+ nasm_error(ERR_NONFATAL, "specific encoding scheme not available");
+ break;
+ case MERR_BADBND:
+ nasm_error(ERR_NONFATAL, "bnd prefix is not allowed");
+ break;
+ case MERR_BADREPNE:
+ nasm_error(ERR_NONFATAL, "%s prefix is not allowed",
+ (has_prefix(instruction, PPS_REP, P_REPNE) ?
+ "repne" : "repnz"));
+ break;
+ case MERR_REGSETSIZE:
+ nasm_error(ERR_NONFATAL, "invalid register set size");
+ break;
+ case MERR_REGSET:
+ nasm_error(ERR_NONFATAL, "register set not valid for operand");
+ break;
+ default:
+ nasm_error(ERR_NONFATAL,
+ "invalid combination of opcode and operands");
+ break;
+ }
+
+ instruction->times = 1; /* Avoid repeated error messages */
+ }
+ }
+ return data.offset - start;
+}
+
+int64_t insn_size(int32_t segment, int64_t offset, int bits, insn *instruction)
+{
+ const struct itemplate *temp;
+ enum match_result m;
+
+ if (instruction->opcode == I_none)
+ return 0;
+
+ if (opcode_is_db(instruction->opcode)) {
+ extop *e;
+ int32_t isize, osize, wsize;
+
+ isize = 0;
+ wsize = db_bytes(instruction->opcode);
+ nasm_assert(wsize > 0);
+
+ list_for_each(e, instruction->eops) {
+ int32_t align;
+
+ osize = 0;
+ if (e->type == EOT_DB_NUMBER) {
+ osize = 1;
+ warn_overflow_const(e->offset, wsize);
+ } else if (e->type == EOT_DB_STRING ||
+ e->type == EOT_DB_STRING_FREE)
+ osize = e->stringlen;
+
+ align = (-osize) % wsize;
+ if (align < 0)
+ align += wsize;
+ isize += osize + align;
+ }
+ return isize;
+ }
+
+ if (instruction->opcode == I_INCBIN) {
+ const char *fname = instruction->eops->stringval;
+ off_t len;
+
+ len = nasm_file_size_by_path(fname);
+ if (len == (off_t)-1) {
+ nasm_error(ERR_NONFATAL, "`incbin': unable to get length of file `%s'",
+ fname);
+ return 0;
+ }
+
+ if (instruction->eops->next) {
+ if (len <= (off_t)instruction->eops->next->offset) {
+ len = 0;
+ } else {
+ len -= instruction->eops->next->offset;
+ if (instruction->eops->next->next &&
+ len > (off_t)instruction->eops->next->next->offset) {
+ len = (off_t)instruction->eops->next->next->offset;
+ }
+ }
+ }
+
+ len *= instruction->times;
+ instruction->times = 1; /* Tell the upper layer to not iterate */
+
+ return len;
+ }
+
+ /* Check to see if we need an address-size prefix */
+ add_asp(instruction, bits);
+
+ m = find_match(&temp, instruction, segment, offset, bits);
+ if (m == MOK_GOOD) {
+ /* we've matched an instruction. */
+ return calcsize(segment, offset, bits, instruction, temp);
+ } else {
+ return -1; /* didn't match any instruction */
+ }
+}
+
+static void bad_hle_warn(const insn * ins, uint8_t hleok)
+{
+ enum prefixes rep_pfx = ins->prefixes[PPS_REP];
+ enum whatwarn { w_none, w_lock, w_inval } ww;
+ static const enum whatwarn warn[2][4] =
+ {
+ { w_inval, w_inval, w_none, w_lock }, /* XACQUIRE */
+ { w_inval, w_none, w_none, w_lock }, /* XRELEASE */
+ };
+ unsigned int n;
+
+ n = (unsigned int)rep_pfx - P_XACQUIRE;
+ if (n > 1)
+ return; /* Not XACQUIRE/XRELEASE */
+
+ ww = warn[n][hleok];
+ if (!is_class(MEMORY, ins->oprs[0].type))
+ ww = w_inval; /* HLE requires operand 0 to be memory */
+
+ switch (ww) {
+ case w_none:
+ break;
+
+ case w_lock:
+ if (ins->prefixes[PPS_LOCK] != P_LOCK) {
+ nasm_error(ERR_WARNING | ERR_WARN_HLE | ERR_PASS2,
+ "%s with this instruction requires lock",
+ prefix_name(rep_pfx));
+ }
+ break;
+
+ case w_inval:
+ nasm_error(ERR_WARNING | ERR_WARN_HLE | ERR_PASS2,
+ "%s invalid with this instruction",
+ prefix_name(rep_pfx));
+ break;
+ }
+}
+
+/* Common construct */
+#define case3(x) case (x): case (x)+1: case (x)+2
+#define case4(x) case3(x): case (x)+3
+
+static int64_t calcsize(int32_t segment, int64_t offset, int bits,
+ insn * ins, const struct itemplate *temp)
+{
+ const uint8_t *codes = temp->code;
+ int64_t length = 0;
+ uint8_t c;
+ int rex_mask = ~0;
+ int op1, op2;
+ struct operand *opx;
+ uint8_t opex = 0;
+ enum ea_type eat;
+ uint8_t hleok = 0;
+ bool lockcheck = true;
+ enum reg_enum mib_index = R_none; /* For a separate index MIB reg form */
+ const char *errmsg;
+
+ ins->rex = 0; /* Ensure REX is reset */
+ eat = EA_SCALAR; /* Expect a scalar EA */
+ memset(ins->evex_p, 0, 3); /* Ensure EVEX is reset */
+
+ if (ins->prefixes[PPS_OSIZE] == P_O64)
+ ins->rex |= REX_W;
+
+ (void)segment; /* Don't warn that this parameter is unused */
+ (void)offset; /* Don't warn that this parameter is unused */
+
+ while (*codes) {
+ c = *codes++;
+ op1 = (c & 3) + ((opex & 1) << 2);
+ op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
+ opx = &ins->oprs[op1];
+ opex = 0; /* For the next iteration */
+
+ switch (c) {
+ case4(01):
+ codes += c, length += c;
+ break;
+
+ case3(05):
+ opex = c;
+ break;
+
+ case4(010):
+ ins->rex |=
+ op_rexflags(opx, REX_B|REX_H|REX_P|REX_W);
+ codes++, length++;
+ break;
+
+ case4(014):
+ /* this is an index reg of MIB operand */
+ mib_index = opx->basereg;
+ break;
+
+ case4(020):
+ case4(024):
+ length++;
+ break;
+
+ case4(030):
+ length += 2;
+ break;
+
+ case4(034):
+ if (opx->type & (BITS16 | BITS32 | BITS64))
+ length += (opx->type & BITS16) ? 2 : 4;
+ else
+ length += (bits == 16) ? 2 : 4;
+ break;
+
+ case4(040):
+ length += 4;
+ break;
+
+ case4(044):
+ length += ins->addr_size >> 3;
+ break;
+
+ case4(050):
+ length++;
+ break;
+
+ case4(054):
+ length += 8; /* MOV reg64/imm */
+ break;
+
+ case4(060):
+ length += 2;
+ break;
+
+ case4(064):
+ if (opx->type & (BITS16 | BITS32 | BITS64))
+ length += (opx->type & BITS16) ? 2 : 4;
+ else
+ length += (bits == 16) ? 2 : 4;
+ break;
+
+ case4(070):
+ length += 4;
+ break;
+
+ case4(074):
+ length += 2;
+ break;
+
+ case 0172:
+ case 0173:
+ codes++;
+ length++;
+ break;
+
+ case4(0174):
+ length++;
+ break;
+
+ case4(0240):
+ ins->rex |= REX_EV;
+ ins->vexreg = regval(opx);
+ ins->evex_p[2] |= op_evexflags(opx, EVEX_P2VP, 2); /* High-16 NDS */
+ ins->vex_cm = *codes++;
+ ins->vex_wlp = *codes++;
+ ins->evex_tuple = (*codes++ - 0300);
+ break;
+
+ case 0250:
+ ins->rex |= REX_EV;
+ ins->vexreg = 0;
+ ins->vex_cm = *codes++;
+ ins->vex_wlp = *codes++;
+ ins->evex_tuple = (*codes++ - 0300);
+ break;
+
+ case4(0254):
+ length += 4;
+ break;
+
+ case4(0260):
+ ins->rex |= REX_V;
+ ins->vexreg = regval(opx);
+ ins->vex_cm = *codes++;
+ ins->vex_wlp = *codes++;
+ break;
+
+ case 0270:
+ ins->rex |= REX_V;
+ ins->vexreg = 0;
+ ins->vex_cm = *codes++;
+ ins->vex_wlp = *codes++;
+ break;
+
+ case3(0271):
+ hleok = c & 3;
+ break;
+
+ case4(0274):
+ length++;
+ break;
+
+ case4(0300):
+ break;
+
+ case 0310:
+ if (bits == 64)
+ return -1;
+ length += (bits != 16) && !has_prefix(ins, PPS_ASIZE, P_A16);
+ break;
+
+ case 0311:
+ length += (bits != 32) && !has_prefix(ins, PPS_ASIZE, P_A32);
+ break;
+
+ case 0312:
+ break;
+
+ case 0313:
+ if (bits != 64 || has_prefix(ins, PPS_ASIZE, P_A16) ||
+ has_prefix(ins, PPS_ASIZE, P_A32))
+ return -1;
+ break;
+
+ case4(0314):
+ break;
+
+ case 0320:
+ {
+ enum prefixes pfx = ins->prefixes[PPS_OSIZE];
+ if (pfx == P_O16)
+ break;
+ if (pfx != P_none)
+ nasm_error(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
+ else
+ ins->prefixes[PPS_OSIZE] = P_O16;
+ break;
+ }
+
+ case 0321:
+ {
+ enum prefixes pfx = ins->prefixes[PPS_OSIZE];
+ if (pfx == P_O32)
+ break;
+ if (pfx != P_none)
+ nasm_error(ERR_WARNING | ERR_PASS2, "invalid operand size prefix");
+ else
+ ins->prefixes[PPS_OSIZE] = P_O32;
+ break;
+ }
+
+ case 0322:
+ break;
+
+ case 0323:
+ rex_mask &= ~REX_W;
+ break;
+
+ case 0324:
+ ins->rex |= REX_W;
+ break;
+
+ case 0325:
+ ins->rex |= REX_NH;
+ break;
+
+ case 0326:
+ break;
+
+ case 0330:
+ codes++, length++;
+ break;
+
+ case 0331:
+ break;
+
+ case 0332:
+ case 0333:
+ length++;
+ break;
+
+ case 0334:
+ ins->rex |= REX_L;
+ break;
+
+ case 0335:
+ break;
+
+ case 0336:
+ if (!ins->prefixes[PPS_REP])
+ ins->prefixes[PPS_REP] = P_REP;
+ break;
+
+ case 0337:
+ if (!ins->prefixes[PPS_REP])
+ ins->prefixes[PPS_REP] = P_REPNE;
+ break;
+
+ case 0340:
+ if (!absolute_op(&ins->oprs[0]))
+ nasm_error(ERR_NONFATAL, "attempt to reserve non-constant"
+ " quantity of BSS space");
+ else if (ins->oprs[0].opflags & OPFLAG_FORWARD)
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "forward reference in RESx can have unpredictable results");
+ else
+ length += ins->oprs[0].offset;
+ break;
+
+ case 0341:
+ if (!ins->prefixes[PPS_WAIT])
+ ins->prefixes[PPS_WAIT] = P_WAIT;
+ break;
+
+ case 0360:
+ break;
+
+ case 0361:
+ length++;
+ break;
+
+ case 0364:
+ case 0365:
+ break;
+
+ case 0366:
+ case 0367:
+ length++;
+ break;
+
+ case 0370:
+ case 0371:
+ break;
+
+ case 0373:
+ length++;
+ break;
+
+ case 0374:
+ eat = EA_XMMVSIB;
+ break;
+
+ case 0375:
+ eat = EA_YMMVSIB;
+ break;
+
+ case 0376:
+ eat = EA_ZMMVSIB;
+ break;
+
+ case4(0100):
+ case4(0110):
+ case4(0120):
+ case4(0130):
+ case4(0200):
+ case4(0204):
+ case4(0210):
+ case4(0214):
+ case4(0220):
+ case4(0224):
+ case4(0230):
+ case4(0234):
+ {
+ ea ea_data;
+ int rfield;
+ opflags_t rflags;
+ struct operand *opy = &ins->oprs[op2];
+ struct operand *op_er_sae;
+
+ ea_data.rex = 0; /* Ensure ea.REX is initially 0 */
+
+ if (c <= 0177) {
+ /* pick rfield from operand b (opx) */
+ rflags = regflag(opx);
+ rfield = nasm_regvals[opx->basereg];
+ } else {
+ rflags = 0;
+ rfield = c & 7;
+ }
+
+ /* EVEX.b1 : evex_brerop contains the operand position */
+ op_er_sae = (ins->evex_brerop >= 0 ?
+ &ins->oprs[ins->evex_brerop] : NULL);
+
+ if (op_er_sae && (op_er_sae->decoflags & (ER | SAE))) {
+ /* set EVEX.b */
+ ins->evex_p[2] |= EVEX_P2B;
+ if (op_er_sae->decoflags & ER) {
+ /* set EVEX.RC (rounding control) */
+ ins->evex_p[2] |= ((ins->evex_rm - BRC_RN) << 5)
+ & EVEX_P2RC;
+ }
+ } else {
+ /* set EVEX.L'L (vector length) */
+ ins->evex_p[2] |= ((ins->vex_wlp << (5 - 2)) & EVEX_P2LL);
+ ins->evex_p[1] |= ((ins->vex_wlp << (7 - 4)) & EVEX_P1W);
+ if (opy->decoflags & BRDCAST_MASK) {
+ /* set EVEX.b */
+ ins->evex_p[2] |= EVEX_P2B;
+ }
+ }
+
+ if (itemp_has(temp, IF_MIB)) {
+ opy->eaflags |= EAF_MIB;
+ /*
+ * if a separate form of MIB (ICC style) is used,
+ * the index reg info is merged into mem operand
+ */
+ if (mib_index != R_none) {
+ opy->indexreg = mib_index;
+ opy->scale = 1;
+ opy->hintbase = mib_index;
+ opy->hinttype = EAH_NOTBASE;
+ }
+ }
+
+ if (process_ea(opy, &ea_data, bits,
+ rfield, rflags, ins, &errmsg) != eat) {
+ nasm_error(ERR_NONFATAL, "%s", errmsg);
+ return -1;
+ } else {
+ ins->rex |= ea_data.rex;
+ length += ea_data.size;
+ }
+ }
+ break;
+
+ default:
+ nasm_panic("internal instruction table corrupt"
+ ": instruction code \\%o (0x%02X) given", c, c);
+ break;
+ }
+ }
+
+ ins->rex &= rex_mask;
+
+ if (ins->rex & REX_NH) {
+ if (ins->rex & REX_H) {
+ nasm_error(ERR_NONFATAL, "instruction cannot use high registers");
+ return -1;
+ }
+ ins->rex &= ~REX_P; /* Don't force REX prefix due to high reg */
+ }
+
+ switch (ins->prefixes[PPS_VEX]) {
+ case P_EVEX:
+ if (!(ins->rex & REX_EV))
+ return -1;
+ break;
+ case P_VEX3:
+ case P_VEX2:
+ if (!(ins->rex & REX_V))
+ return -1;
+ break;
+ default:
+ break;
+ }
+
+ if (ins->rex & (REX_V | REX_EV)) {
+ int bad32 = REX_R|REX_W|REX_X|REX_B;
+
+ if (ins->rex & REX_H) {
+ nasm_error(ERR_NONFATAL, "cannot use high register in AVX instruction");
+ return -1;
+ }
+ switch (ins->vex_wlp & 060) {
+ case 000:
+ case 040:
+ ins->rex &= ~REX_W;
+ break;
+ case 020:
+ ins->rex |= REX_W;
+ bad32 &= ~REX_W;
+ break;
+ case 060:
+ /* Follow REX_W */
+ break;
+ }
+
+ if (bits != 64 && ((ins->rex & bad32) || ins->vexreg > 7)) {
+ nasm_error(ERR_NONFATAL, "invalid operands in non-64-bit mode");
+ return -1;
+ } else if (!(ins->rex & REX_EV) &&
+ ((ins->vexreg > 15) || (ins->evex_p[0] & 0xf0))) {
+ nasm_error(ERR_NONFATAL, "invalid high-16 register in non-AVX-512");
+ return -1;
+ }
+ if (ins->rex & REX_EV)
+ length += 4;
+ else if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B)) ||
+ ins->prefixes[PPS_VEX] == P_VEX3)
+ length += 3;
+ else
+ length += 2;
+ } else if (ins->rex & REX_MASK) {
+ if (ins->rex & REX_H) {
+ nasm_error(ERR_NONFATAL, "cannot use high register in rex instruction");
+ return -1;
+ } else if (bits == 64) {
+ length++;
+ } else if ((ins->rex & REX_L) &&
+ !(ins->rex & (REX_P|REX_W|REX_X|REX_B)) &&
+ iflag_cpu_level_ok(&cpu, IF_X86_64)) {
+ /* LOCK-as-REX.R */
+ assert_no_prefix(ins, PPS_LOCK);
+ lockcheck = false; /* Already errored, no need for warning */
+ length++;
+ } else {
+ nasm_error(ERR_NONFATAL, "invalid operands in non-64-bit mode");
+ return -1;
+ }
+ }
+
+ if (has_prefix(ins, PPS_LOCK, P_LOCK) && lockcheck &&
+ (!itemp_has(temp,IF_LOCK) || !is_class(MEMORY, ins->oprs[0].type))) {
+ nasm_error(ERR_WARNING | ERR_WARN_LOCK | ERR_PASS2 ,
+ "instruction is not lockable");
+ }
+
+ bad_hle_warn(ins, hleok);
+
+ /*
+ * when BND prefix is set by DEFAULT directive,
+ * BND prefix is added to every appropriate instruction line
+ * unless it is overridden by NOBND prefix.
+ */
+ if (globalbnd &&
+ (itemp_has(temp, IF_BND) && !has_prefix(ins, PPS_REP, P_NOBND)))
+ ins->prefixes[PPS_REP] = P_BND;
+
+ /*
+ * Add length of legacy prefixes
+ */
+ length += emit_prefix(NULL, bits, ins);
+
+ return length;
+}
+
+static inline void emit_rex(struct out_data *data, insn *ins)
+{
+ if (data->bits == 64) {
+ if ((ins->rex & REX_MASK) &&
+ !(ins->rex & (REX_V | REX_EV)) &&
+ !ins->rex_done) {
+ uint8_t rex = (ins->rex & REX_MASK) | REX_P;
+ out_rawbyte(data, rex);
+ ins->rex_done = true;
+ }
+ }
+}
+
+static int emit_prefix(struct out_data *data, const int bits, insn *ins)
+{
+ int bytes = 0;
+ int j;
+
+ for (j = 0; j < MAXPREFIX; j++) {
+ uint8_t c = 0;
+ switch (ins->prefixes[j]) {
+ case P_WAIT:
+ c = 0x9B;
+ break;
+ case P_LOCK:
+ c = 0xF0;
+ break;
+ case P_REPNE:
+ case P_REPNZ:
+ case P_XACQUIRE:
+ case P_BND:
+ c = 0xF2;
+ break;
+ case P_REPE:
+ case P_REPZ:
+ case P_REP:
+ case P_XRELEASE:
+ c = 0xF3;
+ break;
+ case R_CS:
+ if (bits == 64) {
+ nasm_error(ERR_WARNING | ERR_PASS2,
+ "cs segment base generated, but will be ignored in 64-bit mode");
+ }
+ c = 0x2E;
+ break;
+ case R_DS:
+ if (bits == 64) {
+ nasm_error(ERR_WARNING | ERR_PASS2,
+ "ds segment base generated, but will be ignored in 64-bit mode");
+ }
+ c = 0x3E;
+ break;
+ case R_ES:
+ if (bits == 64) {
+ nasm_error(ERR_WARNING | ERR_PASS2,
+ "es segment base generated, but will be ignored in 64-bit mode");
+ }
+ c = 0x26;
+ break;
+ case R_FS:
+ c = 0x64;
+ break;
+ case R_GS:
+ c = 0x65;
+ break;
+ case R_SS:
+ if (bits == 64) {
+ nasm_error(ERR_WARNING | ERR_PASS2,
+ "ss segment base generated, but will be ignored in 64-bit mode");
+ }
+ c = 0x36;
+ break;
+ case R_SEGR6:
+ case R_SEGR7:
+ nasm_error(ERR_NONFATAL,
+ "segr6 and segr7 cannot be used as prefixes");
+ break;
+ case P_A16:
+ if (bits == 64) {
+ nasm_error(ERR_NONFATAL,
+ "16-bit addressing is not supported "
+ "in 64-bit mode");
+ } else if (bits != 16)
+ c = 0x67;
+ break;
+ case P_A32:
+ if (bits != 32)
+ c = 0x67;
+ break;
+ case P_A64:
+ if (bits != 64) {
+ nasm_error(ERR_NONFATAL,
+ "64-bit addressing is only supported "
+ "in 64-bit mode");
+ }
+ break;
+ case P_ASP:
+ c = 0x67;
+ break;
+ case P_O16:
+ if (bits != 16)
+ c = 0x66;
+ break;
+ case P_O32:
+ if (bits == 16)
+ c = 0x66;
+ break;
+ case P_O64:
+ /* REX.W */
+ break;
+ case P_OSP:
+ c = 0x66;
+ break;
+ case P_EVEX:
+ case P_VEX3:
+ case P_VEX2:
+ case P_NOBND:
+ case P_none:
+ break;
+ default:
+ nasm_panic("invalid instruction prefix");
+ }
+ if (c) {
+ if (data)
+ out_rawbyte(data, c);
+ bytes++;
+ }
+ }
+ return bytes;
+}
+
+static void gencode(struct out_data *data, insn *ins)
+{
+ uint8_t c;
+ uint8_t bytes[4];
+ int64_t size;
+ int op1, op2;
+ struct operand *opx;
+ const uint8_t *codes = data->itemp->code;
+ uint8_t opex = 0;
+ enum ea_type eat = EA_SCALAR;
+ int r;
+ const int bits = data->bits;
+ const char *errmsg;
+
+ ins->rex_done = false;
+
+ emit_prefix(data, bits, ins);
+
+ while (*codes) {
+ c = *codes++;
+ op1 = (c & 3) + ((opex & 1) << 2);
+ op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
+ opx = &ins->oprs[op1];
+ opex = 0; /* For the next iteration */
+
+
+ switch (c) {
+ case 01:
+ case 02:
+ case 03:
+ case 04:
+ emit_rex(data, ins);
+ out_rawdata(data, codes, c);
+ codes += c;
+ break;
+
+ case 05:
+ case 06:
+ case 07:
+ opex = c;
+ break;
+
+ case4(010):
+ emit_rex(data, ins);
+ out_rawbyte(data, *codes++ + (regval(opx) & 7));
+ break;
+
+ case4(014):
+ break;
+
+ case4(020):
+ out_imm(data, opx, 1, OUT_WRAP);
+ break;
+
+ case4(024):
+ out_imm(data, opx, 1, OUT_UNSIGNED);
+ break;
+
+ case4(030):
+ out_imm(data, opx, 2, OUT_WRAP);
+ break;
+
+ case4(034):
+ if (opx->type & (BITS16 | BITS32))
+ size = (opx->type & BITS16) ? 2 : 4;
+ else
+ size = (bits == 16) ? 2 : 4;
+ out_imm(data, opx, size, OUT_WRAP);
+ break;
+
+ case4(040):
+ out_imm(data, opx, 4, OUT_WRAP);
+ break;
+
+ case4(044):
+ size = ins->addr_size >> 3;
+ out_imm(data, opx, size, OUT_WRAP);
+ break;
+
+ case4(050):
+ if (opx->segment == data->segment) {
+ int64_t delta = opx->offset - data->offset
+ - (data->inslen - data->insoffs);
+ if (delta > 127 || delta < -128)
+ nasm_error(ERR_NONFATAL, "short jump is out of range");
+ }
+ out_reladdr(data, opx, 1);
+ break;
+
+ case4(054):
+ out_imm(data, opx, 8, OUT_WRAP);
+ break;
+
+ case4(060):
+ out_reladdr(data, opx, 2);
+ break;
+
+ case4(064):
+ if (opx->type & (BITS16 | BITS32 | BITS64))
+ size = (opx->type & BITS16) ? 2 : 4;
+ else
+ size = (bits == 16) ? 2 : 4;
+
+ out_reladdr(data, opx, size);
+ break;
+
+ case4(070):
+ out_reladdr(data, opx, 4);
+ break;
+
+ case4(074):
+ if (opx->segment == NO_SEG)
+ nasm_error(ERR_NONFATAL, "value referenced by FAR is not"
+ " relocatable");
+ out_segment(data, opx);
+ break;
+
+ case 0172:
+ {
+ int mask = ins->prefixes[PPS_VEX] == P_EVEX ? 7 : 15;
+ const struct operand *opy;
+
+ c = *codes++;
+ opx = &ins->oprs[c >> 3];
+ opy = &ins->oprs[c & 7];
+ if (!absolute_op(opy)) {
+ nasm_error(ERR_NONFATAL,
+ "non-absolute expression not permitted as argument %d",
+ c & 7);
+ } else if (opy->offset & ~mask) {
+ nasm_error(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
+ "is4 argument exceeds bounds");
+ }
+ c = opy->offset & mask;
+ goto emit_is4;
+ }
+
+ case 0173:
+ c = *codes++;
+ opx = &ins->oprs[c >> 4];
+ c &= 15;
+ goto emit_is4;
+
+ case4(0174):
+ c = 0;
+ emit_is4:
+ r = nasm_regvals[opx->basereg];
+ out_rawbyte(data, (r << 4) | ((r & 0x10) >> 1) | c);
+ break;
+
+ case4(0254):
+ if (absolute_op(opx) &&
+ (int32_t)opx->offset != (int64_t)opx->offset) {
+ nasm_error(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
+ "signed dword immediate exceeds bounds");
+ }
+ out_imm(data, opx, 4, OUT_SIGNED);
+ break;
+
+ case4(0240):
+ case 0250:
+ codes += 3;
+ ins->evex_p[2] |= op_evexflags(&ins->oprs[0],
+ EVEX_P2Z | EVEX_P2AAA, 2);
+ ins->evex_p[2] ^= EVEX_P2VP; /* 1's complement */
+ bytes[0] = 0x62;
+ /* EVEX.X can be set by either REX or EVEX for different reasons */
+ bytes[1] = ((((ins->rex & 7) << 5) |
+ (ins->evex_p[0] & (EVEX_P0X | EVEX_P0RP))) ^ 0xf0) |
+ (ins->vex_cm & EVEX_P0MM);
+ bytes[2] = ((ins->rex & REX_W) << (7 - 3)) |
+ ((~ins->vexreg & 15) << 3) |
+ (1 << 2) | (ins->vex_wlp & 3);
+ bytes[3] = ins->evex_p[2];
+ out_rawdata(data, bytes, 4);
+ break;
+
+ case4(0260):
+ case 0270:
+ codes += 2;
+ if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B)) ||
+ ins->prefixes[PPS_VEX] == P_VEX3) {
+ bytes[0] = (ins->vex_cm >> 6) ? 0x8f : 0xc4;
+ bytes[1] = (ins->vex_cm & 31) | ((~ins->rex & 7) << 5);
+ bytes[2] = ((ins->rex & REX_W) << (7-3)) |
+ ((~ins->vexreg & 15)<< 3) | (ins->vex_wlp & 07);
+ out_rawdata(data, bytes, 3);
+ } else {
+ bytes[0] = 0xc5;
+ bytes[1] = ((~ins->rex & REX_R) << (7-2)) |
+ ((~ins->vexreg & 15) << 3) | (ins->vex_wlp & 07);
+ out_rawdata(data, bytes, 2);
+ }
+ break;
+
+ case 0271:
+ case 0272:
+ case 0273:
+ break;
+
+ case4(0274):
+ {
+ uint64_t uv, um;
+ int s;
+
+ if (absolute_op(opx)) {
+ if (ins->rex & REX_W)
+ s = 64;
+ else if (ins->prefixes[PPS_OSIZE] == P_O16)
+ s = 16;
+ else if (ins->prefixes[PPS_OSIZE] == P_O32)
+ s = 32;
+ else
+ s = bits;
+
+ um = (uint64_t)2 << (s-1);
+ uv = opx->offset;
+
+ if (uv > 127 && uv < (uint64_t)-128 &&
+ (uv < um-128 || uv > um-1)) {
+ /* If this wasn't explicitly byte-sized, warn as though we
+ * had fallen through to the imm16/32/64 case.
+ */
+ nasm_error(ERR_WARNING | ERR_PASS2 | ERR_WARN_NOV,
+ "%s value exceeds bounds",
+ (opx->type & BITS8) ? "signed byte" :
+ s == 16 ? "word" :
+ s == 32 ? "dword" :
+ "signed dword");
+ }
+
+ /* Output as a raw byte to avoid byte overflow check */
+ out_rawbyte(data, (uint8_t)uv);
+ } else {
+ out_imm(data, opx, 1, OUT_WRAP); /* XXX: OUT_SIGNED? */
+ }
+ break;
+ }
+
+ case4(0300):
+ break;
+
+ case 0310:
+ if (bits == 32 && !has_prefix(ins, PPS_ASIZE, P_A16))
+ out_rawbyte(data, 0x67);
+ break;
+
+ case 0311:
+ if (bits != 32 && !has_prefix(ins, PPS_ASIZE, P_A32))
+ out_rawbyte(data, 0x67);
+ break;
+
+ case 0312:
+ break;
+
+ case 0313:
+ ins->rex = 0;
+ break;
+
+ case4(0314):
+ break;
+
+ case 0320:
+ case 0321:
+ break;
+
+ case 0322:
+ case 0323:
+ break;
+
+ case 0324:
+ ins->rex |= REX_W;
+ break;
+
+ case 0325:
+ break;
+
+ case 0326:
+ break;
+
+ case 0330:
+ out_rawbyte(data, *codes++ ^ get_cond_opcode(ins->condition));
+ break;
+
+ case 0331:
+ break;
+
+ case 0332:
+ case 0333:
+ out_rawbyte(data, c - 0332 + 0xF2);
+ break;
+
+ case 0334:
+ if (ins->rex & REX_R)
+ out_rawbyte(data, 0xF0);
+ ins->rex &= ~(REX_L|REX_R);
+ break;
+
+ case 0335:
+ break;
+
+ case 0336:
+ case 0337:
+ break;
+
+ case 0340:
+ if (ins->oprs[0].segment != NO_SEG)
+ nasm_panic("non-constant BSS size in pass two");
+
+ out_reserve(data, ins->oprs[0].offset);
+ break;
+
+ case 0341:
+ break;
+
+ case 0360:
+ break;
+
+ case 0361:
+ out_rawbyte(data, 0x66);
+ break;
+
+ case 0364:
+ case 0365:
+ break;
+
+ case 0366:
+ case 0367:
+ out_rawbyte(data, c - 0366 + 0x66);
+ break;
+
+ case3(0370):
+ break;
+
+ case 0373:
+ out_rawbyte(data, bits == 16 ? 3 : 5);
+ break;
+
+ case 0374:
+ eat = EA_XMMVSIB;
+ break;
+
+ case 0375:
+ eat = EA_YMMVSIB;
+ break;
+
+ case 0376:
+ eat = EA_ZMMVSIB;
+ break;
+
+ case4(0100):
+ case4(0110):
+ case4(0120):
+ case4(0130):
+ case4(0200):
+ case4(0204):
+ case4(0210):
+ case4(0214):
+ case4(0220):
+ case4(0224):
+ case4(0230):
+ case4(0234):
+ {
+ ea ea_data;
+ int rfield;
+ opflags_t rflags;
+ uint8_t *p;
+ struct operand *opy = &ins->oprs[op2];
+
+ if (c <= 0177) {
+ /* pick rfield from operand b (opx) */
+ rflags = regflag(opx);
+ rfield = nasm_regvals[opx->basereg];
+ } else {
+ /* rfield is constant */
+ rflags = 0;
+ rfield = c & 7;
+ }
+
+ if (process_ea(opy, &ea_data, bits,
+ rfield, rflags, ins, &errmsg) != eat)
+ nasm_error(ERR_NONFATAL, "%s", errmsg);
+
+ p = bytes;
+ *p++ = ea_data.modrm;
+ if (ea_data.sib_present)
+ *p++ = ea_data.sib;
+ out_rawdata(data, bytes, p - bytes);
+
+ /*
+ * Make sure the address gets the right offset in case
+ * the line breaks in the .lst file (BR 1197827)
+ */
+
+ if (ea_data.bytes) {
+ /* use compressed displacement, if available */
+ if (ea_data.disp8) {
+ out_rawbyte(data, ea_data.disp8);
+ } else if (ea_data.rip) {
+ out_reladdr(data, opy, ea_data.bytes);
+ } else {
+ int asize = ins->addr_size >> 3;
+
+ if (overflow_general(opy->offset, asize) ||
+ signed_bits(opy->offset, ins->addr_size) !=
+ signed_bits(opy->offset, ea_data.bytes << 3))
+ warn_overflow(ea_data.bytes);
+
+ out_imm(data, opy, ea_data.bytes,
+ (asize > ea_data.bytes)
+ ? OUT_SIGNED : OUT_WRAP);
+ }
+ }
+ }
+ break;
+
+ default:
+ nasm_panic("internal instruction table corrupt"
+ ": instruction code \\%o (0x%02X) given", c, c);
+ break;
+ }
+ }
+}
+
+static opflags_t regflag(const operand * o)
+{
+ if (!is_register(o->basereg))
+ nasm_panic("invalid operand passed to regflag()");
+ return nasm_reg_flags[o->basereg];
+}
+
+static int32_t regval(const operand * o)
+{
+ if (!is_register(o->basereg))
+ nasm_panic("invalid operand passed to regval()");
+ return nasm_regvals[o->basereg];
+}
+
+static int op_rexflags(const operand * o, int mask)
+{
+ opflags_t flags;
+ int val;
+
+ if (!is_register(o->basereg))
+ nasm_panic("invalid operand passed to op_rexflags()");
+
+ flags = nasm_reg_flags[o->basereg];
+ val = nasm_regvals[o->basereg];
+
+ return rexflags(val, flags, mask);
+}
+
+static int rexflags(int val, opflags_t flags, int mask)
+{
+ int rex = 0;
+
+ if (val >= 0 && (val & 8))
+ rex |= REX_B|REX_X|REX_R;
+ if (flags & BITS64)
+ rex |= REX_W;
+ if (!(REG_HIGH & ~flags)) /* AH, CH, DH, BH */
+ rex |= REX_H;
+ else if (!(REG8 & ~flags) && val >= 4) /* SPL, BPL, SIL, DIL */
+ rex |= REX_P;
+
+ return rex & mask;
+}
+
+static int evexflags(int val, decoflags_t deco,
+ int mask, uint8_t byte)
+{
+ int evex = 0;
+
+ switch (byte) {
+ case 0:
+ if (val >= 0 && (val & 16))
+ evex |= (EVEX_P0RP | EVEX_P0X);
+ break;
+ case 2:
+ if (val >= 0 && (val & 16))
+ evex |= EVEX_P2VP;
+ if (deco & Z)
+ evex |= EVEX_P2Z;
+ if (deco & OPMASK_MASK)
+ evex |= deco & EVEX_P2AAA;
+ break;
+ }
+ return evex & mask;
+}
+
+static int op_evexflags(const operand * o, int mask, uint8_t byte)
+{
+ int val;
+
+ val = nasm_regvals[o->basereg];
+
+ return evexflags(val, o->decoflags, mask, byte);
+}
+
+static enum match_result find_match(const struct itemplate **tempp,
+ insn *instruction,
+ int32_t segment, int64_t offset, int bits)
+{
+ const struct itemplate *temp;
+ enum match_result m, merr;
+ opflags_t xsizeflags[MAX_OPERANDS];
+ bool opsizemissing = false;
+ int8_t broadcast = instruction->evex_brerop;
+ int i;
+
+ /* broadcasting uses a different data element size */
+ for (i = 0; i < instruction->operands; i++)
+ if (i == broadcast)
+ xsizeflags[i] = instruction->oprs[i].decoflags & BRSIZE_MASK;
+ else
+ xsizeflags[i] = instruction->oprs[i].type & SIZE_MASK;
+
+ merr = MERR_INVALOP;
+
+ for (temp = nasm_instructions[instruction->opcode];
+ temp->opcode != I_none; temp++) {
+ m = matches(temp, instruction, bits);
+ if (m == MOK_JUMP) {
+ if (jmp_match(segment, offset, bits, instruction, temp))
+ m = MOK_GOOD;
+ else
+ m = MERR_INVALOP;
+ } else if (m == MERR_OPSIZEMISSING && !itemp_has(temp, IF_SX)) {
+ /*
+ * Missing operand size and a candidate for fuzzy matching...
+ */
+ for (i = 0; i < temp->operands; i++)
+ if (i == broadcast)
+ xsizeflags[i] |= temp->deco[i] & BRSIZE_MASK;
+ else
+ xsizeflags[i] |= temp->opd[i] & SIZE_MASK;
+ opsizemissing = true;
+ }
+ if (m > merr)
+ merr = m;
+ if (merr == MOK_GOOD)
+ goto done;
+ }
+
+ /* No match, but see if we can get a fuzzy operand size match... */
+ if (!opsizemissing)
+ goto done;
+
+ for (i = 0; i < instruction->operands; i++) {
+ /*
+ * We ignore extrinsic operand sizes on registers, so we should
+ * never try to fuzzy-match on them. This also resolves the case
+ * when we have e.g. "xmmrm128" in two different positions.
+ */
+ if (is_class(REGISTER, instruction->oprs[i].type))
+ continue;
+
+ /* This tests if xsizeflags[i] has more than one bit set */
+ if ((xsizeflags[i] & (xsizeflags[i]-1)))
+ goto done; /* No luck */
+
+ if (i == broadcast) {
+ instruction->oprs[i].decoflags |= xsizeflags[i];
+ instruction->oprs[i].type |= (xsizeflags[i] == BR_BITS32 ?
+ BITS32 : BITS64);
+ } else {
+ instruction->oprs[i].type |= xsizeflags[i]; /* Set the size */
+ }
+ }
+
+ /* Try matching again... */
+ for (temp = nasm_instructions[instruction->opcode];
+ temp->opcode != I_none; temp++) {
+ m = matches(temp, instruction, bits);
+ if (m == MOK_JUMP) {
+ if (jmp_match(segment, offset, bits, instruction, temp))
+ m = MOK_GOOD;
+ else
+ m = MERR_INVALOP;
+ }
+ if (m > merr)
+ merr = m;
+ if (merr == MOK_GOOD)
+ goto done;
+ }
+
+done:
+ *tempp = temp;
+ return merr;
+}
+
+static uint8_t get_broadcast_num(opflags_t opflags, opflags_t brsize)
+{
+ unsigned int opsize = (opflags & SIZE_MASK) >> SIZE_SHIFT;
+ uint8_t brcast_num;
+
+ if (brsize > BITS64)
+ nasm_error(ERR_FATAL,
+ "size of broadcasting element is greater than 64 bits");
+
+ /*
+ * The shift term is to take care of the extra BITS80 inserted
+ * between BITS64 and BITS128.
+ */
+ brcast_num = ((opsize / (BITS64 >> SIZE_SHIFT)) * (BITS64 / brsize))
+ >> (opsize > (BITS64 >> SIZE_SHIFT));
+
+ return brcast_num;
+}
+
+static enum match_result matches(const struct itemplate *itemp,
+ insn *instruction, int bits)
+{
+ opflags_t size[MAX_OPERANDS], asize;
+ bool opsizemissing = false;
+ int i, oprs;
+
+ /*
+ * Check the opcode
+ */
+ if (itemp->opcode != instruction->opcode)
+ return MERR_INVALOP;
+
+ /*
+ * Count the operands
+ */
+ if (itemp->operands != instruction->operands)
+ return MERR_INVALOP;
+
+ /*
+ * Is it legal?
+ */
+ if (!(optimizing.level > 0) && itemp_has(itemp, IF_OPT))
+ return MERR_INVALOP;
+
+ /*
+ * {evex} available?
+ */
+ switch (instruction->prefixes[PPS_VEX]) {
+ case P_EVEX:
+ if (!itemp_has(itemp, IF_EVEX))
+ return MERR_ENCMISMATCH;
+ break;
+ case P_VEX3:
+ case P_VEX2:
+ if (!itemp_has(itemp, IF_VEX))
+ return MERR_ENCMISMATCH;
+ break;
+ default:
+ break;
+ }
+
+ /*
+ * Check that no spurious colons or TOs are present
+ */
+ for (i = 0; i < itemp->operands; i++)
+ if (instruction->oprs[i].type & ~itemp->opd[i] & (COLON | TO))
+ return MERR_INVALOP;
+
+ /*
+ * Process size flags
+ */
+ switch (itemp_smask(itemp)) {
+ case IF_GENBIT(IF_SB):
+ asize = BITS8;
+ break;
+ case IF_GENBIT(IF_SW):
+ asize = BITS16;
+ break;
+ case IF_GENBIT(IF_SD):
+ asize = BITS32;
+ break;
+ case IF_GENBIT(IF_SQ):
+ asize = BITS64;
+ break;
+ case IF_GENBIT(IF_SO):
+ asize = BITS128;
+ break;
+ case IF_GENBIT(IF_SY):
+ asize = BITS256;
+ break;
+ case IF_GENBIT(IF_SZ):
+ asize = BITS512;
+ break;
+ case IF_GENBIT(IF_SIZE):
+ switch (bits) {
+ case 16:
+ asize = BITS16;
+ break;
+ case 32:
+ asize = BITS32;
+ break;
+ case 64:
+ asize = BITS64;
+ break;
+ default:
+ asize = 0;
+ break;
+ }
+ break;
+ default:
+ asize = 0;
+ break;
+ }
+
+ if (itemp_armask(itemp)) {
+ /* S- flags only apply to a specific operand */
+ i = itemp_arg(itemp);
+ memset(size, 0, sizeof size);
+ size[i] = asize;
+ } else {
+ /* S- flags apply to all operands */
+ for (i = 0; i < MAX_OPERANDS; i++)
+ size[i] = asize;
+ }
+
+ /*
+ * Check that the operand flags all match up,
+ * it's a bit tricky so lets be verbose:
+ *
+ * 1) Find out the size of operand. If instruction
+ * doesn't have one specified -- we're trying to
+ * guess it either from template (IF_S* flag) or
+ * from code bits.
+ *
+ * 2) If template operand do not match the instruction OR
+ * template has an operand size specified AND this size differ
+ * from which instruction has (perhaps we got it from code bits)
+ * we are:
+ * a) Check that only size of instruction and operand is differ
+ * other characteristics do match
+ * b) Perhaps it's a register specified in instruction so
+ * for such a case we just mark that operand as "size
+ * missing" and this will turn on fuzzy operand size
+ * logic facility (handled by a caller)
+ */
+ for (i = 0; i < itemp->operands; i++) {
+ opflags_t type = instruction->oprs[i].type;
+ decoflags_t deco = instruction->oprs[i].decoflags;
+ decoflags_t ideco = itemp->deco[i];
+ bool is_broadcast = deco & BRDCAST_MASK;
+ uint8_t brcast_num = 0;
+ opflags_t template_opsize, insn_opsize;
+
+ if (!(type & SIZE_MASK))
+ type |= size[i];
+
+ insn_opsize = type & SIZE_MASK;
+ if (!is_broadcast) {
+ template_opsize = itemp->opd[i] & SIZE_MASK;
+ } else {
+ decoflags_t deco_brsize = ideco & BRSIZE_MASK;
+
+ if (~ideco & BRDCAST_MASK)
+ return MERR_BRNOTHERE;
+
+ /*
+ * when broadcasting, the element size depends on
+ * the instruction type. decorator flag should match.
+ */
+ if (deco_brsize) {
+ template_opsize = (deco_brsize == BR_BITS32 ? BITS32 : BITS64);
+ /* calculate the proper number : {1to<brcast_num>} */
+ brcast_num = get_broadcast_num(itemp->opd[i], template_opsize);
+ } else {
+ template_opsize = 0;
+ }
+ }
+
+ if (~ideco & deco & OPMASK_MASK)
+ return MERR_MASKNOTHERE;
+
+ if (~ideco & deco & (Z_MASK|STATICRND_MASK|SAE_MASK))
+ return MERR_DECONOTHERE;
+
+ if (itemp->opd[i] & ~type & ~(SIZE_MASK|REGSET_MASK))
+ return MERR_INVALOP;
+
+ if (~itemp->opd[i] & type & REGSET_MASK)
+ return (itemp->opd[i] & REGSET_MASK)
+ ? MERR_REGSETSIZE : MERR_REGSET;
+
+ if (template_opsize) {
+ if (template_opsize != insn_opsize) {
+ if (insn_opsize) {
+ return MERR_INVALOP;
+ } else if (!is_class(REGISTER, type)) {
+ /*
+ * Note: we don't honor extrinsic operand sizes for registers,
+ * so "missing operand size" for a register should be
+ * considered a wildcard match rather than an error.
+ */
+ opsizemissing = true;
+ }
+ } else if (is_broadcast &&
+ (brcast_num !=
+ (2U << ((deco & BRNUM_MASK) >> BRNUM_SHIFT)))) {
+ /*
+ * broadcasting opsize matches but the number of repeated memory
+ * element does not match.
+ * if 64b double precision float is broadcasted to ymm (256b),
+ * broadcasting decorator must be {1to4}.
+ */
+ return MERR_BRNUMMISMATCH;
+ }
+ }
+ }
+
+ if (opsizemissing)
+ return MERR_OPSIZEMISSING;
+
+ /*
+ * Check operand sizes
+ */
+ if (itemp_has(itemp, IF_SM) || itemp_has(itemp, IF_SM2)) {
+ oprs = (itemp_has(itemp, IF_SM2) ? 2 : itemp->operands);
+ for (i = 0; i < oprs; i++) {
+ asize = itemp->opd[i] & SIZE_MASK;
+ if (asize) {
+ for (i = 0; i < oprs; i++)
+ size[i] = asize;
+ break;
+ }
+ }
+ } else {
+ oprs = itemp->operands;
+ }
+
+ for (i = 0; i < itemp->operands; i++) {
+ if (!(itemp->opd[i] & SIZE_MASK) &&
+ (instruction->oprs[i].type & SIZE_MASK & ~size[i]))
+ return MERR_OPSIZEMISMATCH;
+ }
+
+ /*
+ * Check template is okay at the set cpu level
+ */
+ if (iflag_cmp_cpu_level(&insns_flags[itemp->iflag_idx], &cpu) > 0)
+ return MERR_BADCPU;
+
+ /*
+ * Verify the appropriate long mode flag.
+ */
+ if (itemp_has(itemp, (bits == 64 ? IF_NOLONG : IF_LONG)))
+ return MERR_BADMODE;
+
+ /*
+ * If we have a HLE prefix, look for the NOHLE flag
+ */
+ if (itemp_has(itemp, IF_NOHLE) &&
+ (has_prefix(instruction, PPS_REP, P_XACQUIRE) ||
+ has_prefix(instruction, PPS_REP, P_XRELEASE)))
+ return MERR_BADHLE;
+
+ /*
+ * Check if special handling needed for Jumps
+ */
+ if ((itemp->code[0] & ~1) == 0370)
+ return MOK_JUMP;
+
+ /*
+ * Check if BND prefix is allowed.
+ * Other 0xF2 (REPNE/REPNZ) prefix is prohibited.
+ */
+ if (!itemp_has(itemp, IF_BND) &&
+ (has_prefix(instruction, PPS_REP, P_BND) ||
+ has_prefix(instruction, PPS_REP, P_NOBND)))
+ return MERR_BADBND;
+ else if (itemp_has(itemp, IF_BND) &&
+ (has_prefix(instruction, PPS_REP, P_REPNE) ||
+ has_prefix(instruction, PPS_REP, P_REPNZ)))
+ return MERR_BADREPNE;
+
+ return MOK_GOOD;
+}
+
+/*
+ * Check if ModR/M.mod should/can be 01.
+ * - EAF_BYTEOFFS is set
+ * - offset can fit in a byte when EVEX is not used
+ * - offset can be compressed when EVEX is used
+ */
+#define IS_MOD_01() (!(input->eaflags & EAF_WORDOFFS) && \
+ (ins->rex & REX_EV ? seg == NO_SEG && !forw_ref && \
+ is_disp8n(input, ins, &output->disp8) : \
+ input->eaflags & EAF_BYTEOFFS || (o >= -128 && \
+ o <= 127 && seg == NO_SEG && !forw_ref)))
+
+static enum ea_type process_ea(operand *input, ea *output, int bits,
+ int rfield, opflags_t rflags, insn *ins,
+ const char **errmsg)
+{
+ bool forw_ref = !!(input->opflags & OPFLAG_UNKNOWN);
+ int addrbits = ins->addr_size;
+ int eaflags = input->eaflags;
+
+ *errmsg = "invalid effective address"; /* Default error message */
+
+ output->type = EA_SCALAR;
+ output->rip = false;
+ output->disp8 = 0;
+
+ /* REX flags for the rfield operand */
+ output->rex |= rexflags(rfield, rflags, REX_R | REX_P | REX_W | REX_H);
+ /* EVEX.R' flag for the REG operand */
+ ins->evex_p[0] |= evexflags(rfield, 0, EVEX_P0RP, 0);
+
+ if (is_class(REGISTER, input->type)) {
+ /*
+ * It's a direct register.
+ */
+ if (!is_register(input->basereg))
+ goto err;
+
+ if (!is_reg_class(REG_EA, input->basereg))
+ goto err;
+
+ /* broadcasting is not available with a direct register operand. */
+ if (input->decoflags & BRDCAST_MASK) {
+ *errmsg = "broadcast not allowed with register operand";
+ goto err;
+ }
+
+ output->rex |= op_rexflags(input, REX_B | REX_P | REX_W | REX_H);
+ ins->evex_p[0] |= op_evexflags(input, EVEX_P0X, 0);
+ output->sib_present = false; /* no SIB necessary */
+ output->bytes = 0; /* no offset necessary either */
+ output->modrm = GEN_MODRM(3, rfield, nasm_regvals[input->basereg]);
+ } else {
+ /*
+ * It's a memory reference.
+ */
+
+ /* Embedded rounding or SAE is not available with a mem ref operand. */
+ if (input->decoflags & (ER | SAE)) {
+ *errmsg = "embedded rounding is available only with "
+ "register-register operations";
+ goto err;
+ }
+
+ if (input->basereg == -1 &&
+ (input->indexreg == -1 || input->scale == 0)) {
+ /*
+ * It's a pure offset.
+ */
+ if (bits == 64 && ((input->type & IP_REL) == IP_REL)) {
+ if (input->segment == NO_SEG ||
+ (input->opflags & OPFLAG_RELATIVE)) {
+ nasm_error(ERR_WARNING | ERR_PASS2,
+ "absolute address can not be RIP-relative");
+ input->type &= ~IP_REL;
+ input->type |= MEMORY;
+ }
+ }
+
+ if (bits == 64 &&
+ !(IP_REL & ~input->type) && (eaflags & EAF_MIB)) {
+ *errmsg = "RIP-relative addressing is prohibited for MIB";
+ goto err;
+ }
+
+ if (eaflags & EAF_BYTEOFFS ||
+ (eaflags & EAF_WORDOFFS &&
+ input->disp_size != (addrbits != 16 ? 32 : 16))) {
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "displacement size ignored on absolute address");
+ }
+
+ if (bits == 64 && (~input->type & IP_REL)) {
+ output->sib_present = true;
+ output->sib = GEN_SIB(0, 4, 5);
+ output->bytes = 4;
+ output->modrm = GEN_MODRM(0, rfield, 4);
+ output->rip = false;
+ } else {
+ output->sib_present = false;
+ output->bytes = (addrbits != 16 ? 4 : 2);
+ output->modrm = GEN_MODRM(0, rfield,
+ (addrbits != 16 ? 5 : 6));
+ output->rip = bits == 64;
+ }
+ } else {
+ /*
+ * It's an indirection.
+ */
+ int i = input->indexreg, b = input->basereg, s = input->scale;
+ int32_t seg = input->segment;
+ int hb = input->hintbase, ht = input->hinttype;
+ int t, it, bt; /* register numbers */
+ opflags_t x, ix, bx; /* register flags */
+
+ if (s == 0)
+ i = -1; /* make this easy, at least */
+
+ if (is_register(i)) {
+ it = nasm_regvals[i];
+ ix = nasm_reg_flags[i];
+ } else {
+ it = -1;
+ ix = 0;
+ }
+
+ if (is_register(b)) {
+ bt = nasm_regvals[b];
+ bx = nasm_reg_flags[b];
+ } else {
+ bt = -1;
+ bx = 0;
+ }
+
+ /* if either one are a vector register... */
+ if ((ix|bx) & (XMMREG|YMMREG|ZMMREG) & ~REG_EA) {
+ opflags_t sok = BITS32 | BITS64;
+ int32_t o = input->offset;
+ int mod, scale, index, base;
+
+ /*
+ * For a vector SIB, one has to be a vector and the other,
+ * if present, a GPR. The vector must be the index operand.
+ */
+ if (it == -1 || (bx & (XMMREG|YMMREG|ZMMREG) & ~REG_EA)) {
+ if (s == 0)
+ s = 1;
+ else if (s != 1)
+ goto err;
+
+ t = bt, bt = it, it = t;
+ x = bx, bx = ix, ix = x;
+ }
+
+ if (bt != -1) {
+ if (REG_GPR & ~bx)
+ goto err;
+ if (!(REG64 & ~bx) || !(REG32 & ~bx))
+ sok &= bx;
+ else
+ goto err;
+ }
+
+ /*
+ * While we're here, ensure the user didn't specify
+ * WORD or QWORD
+ */
+ if (input->disp_size == 16 || input->disp_size == 64)
+ goto err;
+
+ if (addrbits == 16 ||
+ (addrbits == 32 && !(sok & BITS32)) ||
+ (addrbits == 64 && !(sok & BITS64)))
+ goto err;
+
+ output->type = ((ix & ZMMREG & ~REG_EA) ? EA_ZMMVSIB
+ : ((ix & YMMREG & ~REG_EA)
+ ? EA_YMMVSIB : EA_XMMVSIB));
+
+ output->rex |= rexflags(it, ix, REX_X);
+ output->rex |= rexflags(bt, bx, REX_B);
+ ins->evex_p[2] |= evexflags(it, 0, EVEX_P2VP, 2);
+
+ index = it & 7; /* it is known to be != -1 */
+
+ switch (s) {
+ case 1:
+ scale = 0;
+ break;
+ case 2:
+ scale = 1;
+ break;
+ case 4:
+ scale = 2;
+ break;
+ case 8:
+ scale = 3;
+ break;
+ default: /* then what the smeg is it? */
+ goto err; /* panic */
+ }
+
+ if (bt == -1) {
+ base = 5;
+ mod = 0;
+ } else {
+ base = (bt & 7);
+ if (base != REG_NUM_EBP && o == 0 &&
+ seg == NO_SEG && !forw_ref &&
+ !(eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
+ mod = 0;
+ else if (IS_MOD_01())
+ mod = 1;
+ else
+ mod = 2;
+ }
+
+ output->sib_present = true;
+ output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
+ output->modrm = GEN_MODRM(mod, rfield, 4);
+ output->sib = GEN_SIB(scale, index, base);
+ } else if ((ix|bx) & (BITS32|BITS64)) {
+ /*
+ * it must be a 32/64-bit memory reference. Firstly we have
+ * to check that all registers involved are type E/Rxx.
+ */
+ opflags_t sok = BITS32 | BITS64;
+ int32_t o = input->offset;
+
+ if (it != -1) {
+ if (!(REG64 & ~ix) || !(REG32 & ~ix))
+ sok &= ix;
+ else
+ goto err;
+ }
+
+ if (bt != -1) {
+ if (REG_GPR & ~bx)
+ goto err; /* Invalid register */
+ if (~sok & bx & SIZE_MASK)
+ goto err; /* Invalid size */
+ sok &= bx;
+ }
+
+ /*
+ * While we're here, ensure the user didn't specify
+ * WORD or QWORD
+ */
+ if (input->disp_size == 16 || input->disp_size == 64)
+ goto err;
+
+ if (addrbits == 16 ||
+ (addrbits == 32 && !(sok & BITS32)) ||
+ (addrbits == 64 && !(sok & BITS64)))
+ goto err;
+
+ /* now reorganize base/index */
+ if (s == 1 && bt != it && bt != -1 && it != -1 &&
+ ((hb == b && ht == EAH_NOTBASE) ||
+ (hb == i && ht == EAH_MAKEBASE))) {
+ /* swap if hints say so */
+ t = bt, bt = it, it = t;
+ x = bx, bx = ix, ix = x;
+ }
+
+ if (bt == -1 && s == 1 && !(hb == i && ht == EAH_NOTBASE)) {
+ /* make single reg base, unless hint */
+ bt = it, bx = ix, it = -1, ix = 0;
+ }
+ if (eaflags & EAF_MIB) {
+ /* only for mib operands */
+ if (it == -1 && (hb == b && ht == EAH_NOTBASE)) {
+ /*
+ * make a single reg index [reg*1].
+ * gas uses this form for an explicit index register.
+ */
+ it = bt, ix = bx, bt = -1, bx = 0, s = 1;
+ }
+ if ((ht == EAH_SUMMED) && bt == -1) {
+ /* separate once summed index into [base, index] */
+ bt = it, bx = ix, s--;
+ }
+ } else {
+ if (((s == 2 && it != REG_NUM_ESP &&
+ (!(eaflags & EAF_TIMESTWO) || (ht == EAH_SUMMED))) ||
+ s == 3 || s == 5 || s == 9) && bt == -1) {
+ /* convert 3*EAX to EAX+2*EAX */
+ bt = it, bx = ix, s--;
+ }
+ if (it == -1 && (bt & 7) != REG_NUM_ESP &&
+ (eaflags & EAF_TIMESTWO) &&
+ (hb == b && ht == EAH_NOTBASE)) {
+ /*
+ * convert [NOSPLIT EAX*1]
+ * to sib format with 0x0 displacement - [EAX*1+0].
+ */
+ it = bt, ix = bx, bt = -1, bx = 0, s = 1;
+ }
+ }
+ if (s == 1 && it == REG_NUM_ESP) {
+ /* swap ESP into base if scale is 1 */
+ t = it, it = bt, bt = t;
+ x = ix, ix = bx, bx = x;
+ }
+ if (it == REG_NUM_ESP ||
+ (s != 1 && s != 2 && s != 4 && s != 8 && it != -1))
+ goto err; /* wrong, for various reasons */
+
+ output->rex |= rexflags(it, ix, REX_X);
+ output->rex |= rexflags(bt, bx, REX_B);
+
+ if (it == -1 && (bt & 7) != REG_NUM_ESP) {
+ /* no SIB needed */
+ int mod, rm;
+
+ if (bt == -1) {
+ rm = 5;
+ mod = 0;
+ } else {
+ rm = (bt & 7);
+ if (rm != REG_NUM_EBP && o == 0 &&
+ seg == NO_SEG && !forw_ref &&
+ !(eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
+ mod = 0;
+ else if (IS_MOD_01())
+ mod = 1;
+ else
+ mod = 2;
+ }
+
+ output->sib_present = false;
+ output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
+ output->modrm = GEN_MODRM(mod, rfield, rm);
+ } else {
+ /* we need a SIB */
+ int mod, scale, index, base;
+
+ if (it == -1)
+ index = 4, s = 1;
+ else
+ index = (it & 7);
+
+ switch (s) {
+ case 1:
+ scale = 0;
+ break;
+ case 2:
+ scale = 1;
+ break;
+ case 4:
+ scale = 2;
+ break;
+ case 8:
+ scale = 3;
+ break;
+ default: /* then what the smeg is it? */
+ goto err; /* panic */
+ }
+
+ if (bt == -1) {
+ base = 5;
+ mod = 0;
+ } else {
+ base = (bt & 7);
+ if (base != REG_NUM_EBP && o == 0 &&
+ seg == NO_SEG && !forw_ref &&
+ !(eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
+ mod = 0;
+ else if (IS_MOD_01())
+ mod = 1;
+ else
+ mod = 2;
+ }
+
+ output->sib_present = true;
+ output->bytes = (bt == -1 || mod == 2 ? 4 : mod);
+ output->modrm = GEN_MODRM(mod, rfield, 4);
+ output->sib = GEN_SIB(scale, index, base);
+ }
+ } else { /* it's 16-bit */
+ int mod, rm;
+ int16_t o = input->offset;
+
+ /* check for 64-bit long mode */
+ if (addrbits == 64)
+ goto err;
+
+ /* check all registers are BX, BP, SI or DI */
+ if ((b != -1 && b != R_BP && b != R_BX && b != R_SI && b != R_DI) ||
+ (i != -1 && i != R_BP && i != R_BX && i != R_SI && i != R_DI))
+ goto err;
+
+ /* ensure the user didn't specify DWORD/QWORD */
+ if (input->disp_size == 32 || input->disp_size == 64)
+ goto err;
+
+ if (s != 1 && i != -1)
+ goto err; /* no can do, in 16-bit EA */
+ if (b == -1 && i != -1) {
+ int tmp = b;
+ b = i;
+ i = tmp;
+ } /* swap */
+ if ((b == R_SI || b == R_DI) && i != -1) {
+ int tmp = b;
+ b = i;
+ i = tmp;
+ }
+ /* have BX/BP as base, SI/DI index */
+ if (b == i)
+ goto err; /* shouldn't ever happen, in theory */
+ if (i != -1 && b != -1 &&
+ (i == R_BP || i == R_BX || b == R_SI || b == R_DI))
+ goto err; /* invalid combinations */
+ if (b == -1) /* pure offset: handled above */
+ goto err; /* so if it gets to here, panic! */
+
+ rm = -1;
+ if (i != -1)
+ switch (i * 256 + b) {
+ case R_SI * 256 + R_BX:
+ rm = 0;
+ break;
+ case R_DI * 256 + R_BX:
+ rm = 1;
+ break;
+ case R_SI * 256 + R_BP:
+ rm = 2;
+ break;
+ case R_DI * 256 + R_BP:
+ rm = 3;
+ break;
+ } else
+ switch (b) {
+ case R_SI:
+ rm = 4;
+ break;
+ case R_DI:
+ rm = 5;
+ break;
+ case R_BP:
+ rm = 6;
+ break;
+ case R_BX:
+ rm = 7;
+ break;
+ }
+ if (rm == -1) /* can't happen, in theory */
+ goto err; /* so panic if it does */
+
+ if (o == 0 && seg == NO_SEG && !forw_ref && rm != 6 &&
+ !(eaflags & (EAF_BYTEOFFS | EAF_WORDOFFS)))
+ mod = 0;
+ else if (IS_MOD_01())
+ mod = 1;
+ else
+ mod = 2;
+
+ output->sib_present = false; /* no SIB - it's 16-bit */
+ output->bytes = mod; /* bytes of offset needed */
+ output->modrm = GEN_MODRM(mod, rfield, rm);
+ }
+ }
+ }
+
+ output->size = 1 + output->sib_present + output->bytes;
+ return output->type;
+
+err:
+ return output->type = EA_INVALID;
+}
+
+static void add_asp(insn *ins, int addrbits)
+{
+ int j, valid;
+ int defdisp;
+
+ valid = (addrbits == 64) ? 64|32 : 32|16;
+
+ switch (ins->prefixes[PPS_ASIZE]) {
+ case P_A16:
+ valid &= 16;
+ break;
+ case P_A32:
+ valid &= 32;
+ break;
+ case P_A64:
+ valid &= 64;
+ break;
+ case P_ASP:
+ valid &= (addrbits == 32) ? 16 : 32;
+ break;
+ default:
+ break;
+ }
+
+ for (j = 0; j < ins->operands; j++) {
+ if (is_class(MEMORY, ins->oprs[j].type)) {
+ opflags_t i, b;
+
+ /* Verify as Register */
+ if (!is_register(ins->oprs[j].indexreg))
+ i = 0;
+ else
+ i = nasm_reg_flags[ins->oprs[j].indexreg];
+
+ /* Verify as Register */
+ if (!is_register(ins->oprs[j].basereg))
+ b = 0;
+ else
+ b = nasm_reg_flags[ins->oprs[j].basereg];
+
+ if (ins->oprs[j].scale == 0)
+ i = 0;
+
+ if (!i && !b) {
+ int ds = ins->oprs[j].disp_size;
+ if ((addrbits != 64 && ds > 8) ||
+ (addrbits == 64 && ds == 16))
+ valid &= ds;
+ } else {
+ if (!(REG16 & ~b))
+ valid &= 16;
+ if (!(REG32 & ~b))
+ valid &= 32;
+ if (!(REG64 & ~b))
+ valid &= 64;
+
+ if (!(REG16 & ~i))
+ valid &= 16;
+ if (!(REG32 & ~i))
+ valid &= 32;
+ if (!(REG64 & ~i))
+ valid &= 64;
+ }
+ }
+ }
+
+ if (valid & addrbits) {
+ ins->addr_size = addrbits;
+ } else if (valid & ((addrbits == 32) ? 16 : 32)) {
+ /* Add an address size prefix */
+ ins->prefixes[PPS_ASIZE] = (addrbits == 32) ? P_A16 : P_A32;;
+ ins->addr_size = (addrbits == 32) ? 16 : 32;
+ } else {
+ /* Impossible... */
+ nasm_error(ERR_NONFATAL, "impossible combination of address sizes");
+ ins->addr_size = addrbits; /* Error recovery */
+ }
+
+ defdisp = ins->addr_size == 16 ? 16 : 32;
+
+ for (j = 0; j < ins->operands; j++) {
+ if (!(MEM_OFFS & ~ins->oprs[j].type) &&
+ (ins->oprs[j].disp_size ? ins->oprs[j].disp_size : defdisp) != ins->addr_size) {
+ /*
+ * mem_offs sizes must match the address size; if not,
+ * strip the MEM_OFFS bit and match only EA instructions
+ */
+ ins->oprs[j].type &= ~(MEM_OFFS & ~MEMORY);
+ }
+ }
+}
diff --git a/asm/assemble.h b/asm/assemble.h
new file mode 100644
index 00000000..f47ae032
--- /dev/null
+++ b/asm/assemble.h
@@ -0,0 +1,54 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * assemble.h - header file for stuff private to the assembler
+ */
+
+#ifndef NASM_ASSEMBLE_H
+#define NASM_ASSEMBLE_H
+
+#include "nasm.h"
+#include "iflag.h"
+
+extern iflag_t cpu;
+extern bool in_absolute; /* Are we in an absolute segment? */
+extern struct location absolute;
+
+int64_t insn_size(int32_t segment, int64_t offset, int bits, insn *instruction);
+int64_t assemble(int32_t segment, int64_t offset, int bits, insn *instruction);
+
+bool process_directives(char *);
+void process_pragma(char *);
+
+#endif
diff --git a/asm/directbl.c b/asm/directbl.c
new file mode 100644
index 00000000..cf6caa5d
--- /dev/null
+++ b/asm/directbl.c
@@ -0,0 +1,126 @@
+/*
+ * This file is generated from ./asm/directiv.dat
+ * by perfhash.pl; do not edit.
+ */
+
+#include "directiv.h"
+
+const char * const directive_tbl[38] = {
+ "absolute",
+ "bits",
+ "common",
+ "cpu",
+ "debug",
+ "default",
+ "extern",
+ "float",
+ "global",
+ "static",
+ "list",
+ "section",
+ "segment",
+ "warning",
+ "sectalign",
+ "pragma",
+ "export",
+ "group",
+ "import",
+ "library",
+ "map",
+ "module",
+ "org",
+ "osabi",
+ "safeseh",
+ "uppercase",
+ "prefix",
+ "suffix",
+ "gprefix",
+ "gsuffix",
+ "lprefix",
+ "lsuffix",
+ "limit",
+ "subsections_via_symbols",
+ "no_dead_strip",
+ "maxdump",
+ "nodepend",
+ "noseclabels"
+};
+
+#define UNUSED (65536/3)
+
+static const int16_t directive_hashvals[64] = {
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ 26,
+ -4,
+ 0,
+ 11,
+ 0,
+ 8,
+ UNUSED,
+ UNUSED,
+ 0,
+ -5,
+ 28,
+ 15,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -16,
+ UNUSED,
+ 2,
+ 19,
+ -3,
+ -22,
+ 16,
+ UNUSED,
+ 6,
+ 11,
+ -20,
+ 16,
+ -13,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 6,
+ 0,
+ 22,
+ 2,
+ -28,
+ 32,
+ 12,
+ 23,
+ 3,
+ UNUSED,
+ 26,
+ UNUSED,
+ 12,
+ 29,
+ 10,
+ 17,
+ 28,
+ 34,
+ UNUSED,
+ UNUSED,
+ 1,
+ 9,
+ 27,
+ UNUSED,
+ 19,
+ 14
+};
+
+const struct perfect_hash directive_hash = {
+ UINT64_C(0x076259c3e291c26c),
+ UINT32_C(0x1f),
+ UINT32_C(38),
+ 3,
+ (D_unknown),
+ directive_hashvals,
+ directive_tbl
+};
diff --git a/asm/directiv.c b/asm/directiv.c
new file mode 100644
index 00000000..d2c5e9c3
--- /dev/null
+++ b/asm/directiv.c
@@ -0,0 +1,515 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Parse and handle assembler directives
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "ilog2.h"
+#include "error.h"
+#include "float.h"
+#include "stdscan.h"
+#include "preproc.h"
+#include "eval.h"
+#include "assemble.h"
+#include "outform.h"
+#include "listing.h"
+#include "labels.h"
+#include "iflag.h"
+
+struct cpunames {
+ const char *name;
+ unsigned int level;
+ /* Eventually a table of features */
+};
+
+static iflag_t get_cpu(const char *value)
+{
+ iflag_t r;
+ const struct cpunames *cpu;
+ static const struct cpunames cpunames[] = {
+ { "8086", IF_8086 },
+ { "186", IF_186 },
+ { "286", IF_286 },
+ { "386", IF_386 },
+ { "486", IF_486 },
+ { "586", IF_PENT },
+ { "pentium", IF_PENT },
+ { "pentiummmx", IF_PENT },
+ { "686", IF_P6 },
+ { "p6", IF_P6 },
+ { "ppro", IF_P6 },
+ { "pentiumpro", IF_P6 },
+ { "p2", IF_P6 }, /* +MMX */
+ { "pentiumii", IF_P6 },
+ { "p3", IF_KATMAI },
+ { "katmai", IF_KATMAI },
+ { "p4", IF_WILLAMETTE },
+ { "willamette", IF_WILLAMETTE },
+ { "prescott", IF_PRESCOTT },
+ { "x64", IF_X86_64 },
+ { "x86-64", IF_X86_64 },
+ { "ia64", IF_IA64 },
+ { "ia-64", IF_IA64 },
+ { "itanium", IF_IA64 },
+ { "itanic", IF_IA64 },
+ { "merced", IF_IA64 },
+ { "any", IF_PLEVEL },
+ { "default", IF_PLEVEL },
+ { "all", IF_PLEVEL },
+ { NULL, IF_PLEVEL } /* Error and final default entry */
+ };
+
+ iflag_clear_all(&r);
+
+ for (cpu = cpunames; cpu->name; cpu++) {
+ if (!nasm_stricmp(value, cpu->name))
+ break;
+ }
+
+ if (!cpu->name) {
+ nasm_error(pass0 < 2 ? ERR_NONFATAL : ERR_FATAL,
+ "unknown 'cpu' type '%s'", value);
+ }
+
+ iflag_set_cpu(&r, cpu->level);
+ return r;
+}
+
+static int get_bits(const char *value)
+{
+ int i = atoi(value);
+
+ switch (i) {
+ case 16:
+ break; /* Always safe */
+ case 32:
+ if (!iflag_cpu_level_ok(&cpu, IF_386)) {
+ nasm_error(ERR_NONFATAL,
+ "cannot specify 32-bit segment on processor below a 386");
+ i = 16;
+ }
+ break;
+ case 64:
+ if (!iflag_cpu_level_ok(&cpu, IF_X86_64)) {
+ nasm_error(ERR_NONFATAL,
+ "cannot specify 64-bit segment on processor below an x86-64");
+ i = 16;
+ }
+ break;
+ default:
+ nasm_error(pass0 < 2 ? ERR_NONFATAL : ERR_FATAL,
+ "`%s' is not a valid segment size; must be 16, 32 or 64",
+ value);
+ i = 16;
+ break;
+ }
+ return i;
+}
+
+static enum directive parse_directive_line(char **directive, char **value)
+{
+ char *p, *q, *buf;
+
+ buf = nasm_skip_spaces(*directive);
+
+ /*
+ * It should be enclosed in [ ].
+ * XXX: we don't check there is nothing else on the remainder of the
+ * line, except a possible comment.
+ */
+ if (*buf != '[')
+ return D_none;
+ q = strchr(buf, ']');
+ if (!q)
+ return D_corrupt;
+
+ /*
+ * Strip off the comments. XXX: this doesn't account for quoted
+ * strings inside a directive. We should really strip the
+ * comments in generic code, not here. While we're at it, it
+ * would be better to pass the backend a series of tokens instead
+ * of a raw string, and actually process quoted strings for it,
+ * like of like argv is handled in C.
+ */
+ p = strchr(buf, ';');
+ if (p) {
+ if (p < q) /* ouch! somewhere inside */
+ return D_corrupt;
+ *p = '\0';
+ }
+
+ /* no brace, no trailing spaces */
+ *q = '\0';
+ nasm_zap_spaces_rev(--q);
+
+ /* directive */
+ p = nasm_skip_spaces(++buf);
+ q = nasm_skip_word(p);
+ if (!q)
+ return D_corrupt; /* sigh... no value there */
+ *q = '\0';
+ *directive = p;
+
+ /* and value finally */
+ p = nasm_skip_spaces(++q);
+ *value = p;
+
+ return directive_find(*directive);
+}
+
+/*
+ * Process a line from the assembler and try to handle it if it
+ * is a directive. Return true if the line was handled (including
+ * if it was an error), false otherwise.
+ */
+bool process_directives(char *directive)
+{
+ enum directive d;
+ char *value, *p, *q, *special;
+ struct tokenval tokval;
+ bool bad_param = false;
+ int pass2 = passn > 1 ? 2 : 1;
+ enum label_type type;
+
+ d = parse_directive_line(&directive, &value);
+
+ switch (d) {
+ case D_none:
+ return D_none; /* Not a directive */
+
+ case D_corrupt:
+ nasm_error(ERR_NONFATAL, "invalid directive line");
+ break;
+
+ default: /* It's a backend-specific directive */
+ switch (ofmt->directive(d, value, pass2)) {
+ case DIRR_UNKNOWN:
+ goto unknown;
+ case DIRR_OK:
+ case DIRR_ERROR:
+ break;
+ case DIRR_BADPARAM:
+ bad_param = true;
+ break;
+ default:
+ panic();
+ }
+ break;
+
+ case D_unknown:
+ unknown:
+ nasm_error(pass0 < 2 ? ERR_NONFATAL : ERR_PANIC,
+ "unrecognised directive [%s]", directive);
+ break;
+
+ case D_SEGMENT: /* [SEGMENT n] */
+ case D_SECTION:
+ {
+ int sb = globalbits;
+ int32_t seg = ofmt->section(value, pass2, &sb);
+
+ if (seg == NO_SEG) {
+ nasm_error(pass0 < 2 ? ERR_NONFATAL : ERR_PANIC,
+ "segment name `%s' not recognized", value);
+ } else {
+ globalbits = sb;
+ switch_segment(seg);
+ }
+ break;
+ }
+
+ case D_SECTALIGN: /* [SECTALIGN n] */
+ {
+ expr *e;
+
+ if (*value) {
+ stdscan_reset();
+ stdscan_set(value);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, pass2, NULL);
+ if (e) {
+ uint64_t align = e->value;
+
+ if (!is_power2(e->value)) {
+ nasm_error(ERR_NONFATAL,
+ "segment alignment `%s' is not power of two",
+ value);
+ } else if (align > UINT64_C(0x7fffffff)) {
+ /*
+ * FIXME: Please make some sane message here
+ * ofmt should have some 'check' method which
+ * would report segment alignment bounds.
+ */
+ nasm_error(ERR_NONFATAL,
+ "absurdly large segment alignment `%s' (2^%d)",
+ value, ilog2_64(align));
+ }
+
+ /* callee should be able to handle all details */
+ if (location.segment != NO_SEG)
+ ofmt->sectalign(location.segment, align);
+ }
+ }
+ break;
+ }
+
+ case D_BITS: /* [BITS bits] */
+ globalbits = get_bits(value);
+ break;
+
+ case D_GLOBAL: /* [GLOBAL|STATIC|EXTERN|COMMON symbol:special] */
+ type = LBL_GLOBAL;
+ goto symdef;
+ case D_STATIC:
+ type = LBL_STATIC;
+ goto symdef;
+ case D_EXTERN:
+ type = LBL_EXTERN;
+ goto symdef;
+ case D_COMMON:
+ type = LBL_COMMON;
+ goto symdef;
+
+ symdef:
+ {
+ bool validid = true;
+ int64_t size = 0;
+ char *sizestr;
+ bool rn_error;
+
+ if (*value == '$')
+ value++; /* skip initial $ if present */
+
+ q = value;
+ if (!isidstart(*q)) {
+ validid = false;
+ } else {
+ q++;
+ while (*q && *q != ':' && !nasm_isspace(*q)) {
+ if (!isidchar(*q))
+ validid = false;
+ q++;
+ }
+ }
+ if (!validid) {
+ nasm_error(ERR_NONFATAL,
+ "identifier expected after %s, got `%s'",
+ directive, value);
+ break;
+ }
+
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ sizestr = q = nasm_skip_spaces(q);
+ q = strchr(q, ':');
+ } else {
+ sizestr = NULL;
+ }
+
+ if (q && *q == ':') {
+ *q++ = '\0';
+ special = q;
+ } else {
+ special = NULL;
+ }
+
+ if (type == LBL_COMMON) {
+ if (sizestr)
+ size = readnum(sizestr, &rn_error);
+ if (!sizestr || rn_error)
+ nasm_error(ERR_NONFATAL,
+ "%s size specified in common declaration",
+ sizestr ? "invalid" : "no");
+ } else if (sizestr) {
+ nasm_error(ERR_NONFATAL, "invalid syntax in %s declaration",
+ directive);
+ }
+
+ if (!declare_label(value, type, special))
+ break;
+
+ if (type == LBL_COMMON || type == LBL_EXTERN)
+ define_label(value, 0, size, false);
+
+ break;
+ }
+
+ case D_ABSOLUTE: /* [ABSOLUTE address] */
+ {
+ expr *e;
+
+ stdscan_reset();
+ stdscan_set(value);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, pass2, NULL);
+ if (e) {
+ if (!is_reloc(e))
+ nasm_error(pass0 ==
+ 1 ? ERR_NONFATAL : ERR_PANIC,
+ "cannot use non-relocatable expression as "
+ "ABSOLUTE address");
+ else {
+ absolute.segment = reloc_seg(e);
+ absolute.offset = reloc_value(e);
+ }
+ } else if (passn == 1)
+ absolute.offset = 0x100; /* don't go near zero in case of / */
+ else
+ nasm_panic("invalid ABSOLUTE address "
+ "in pass two");
+ in_absolute = true;
+ location.segment = NO_SEG;
+ location.offset = absolute.offset;
+ break;
+ }
+
+ case D_DEBUG: /* [DEBUG] */
+ {
+ bool badid, overlong;
+ char debugid[128];
+
+ p = value;
+ q = debugid;
+ badid = overlong = false;
+ if (!isidstart(*p)) {
+ badid = true;
+ } else {
+ while (*p && !nasm_isspace(*p)) {
+ if (q >= debugid + sizeof debugid - 1) {
+ overlong = true;
+ break;
+ }
+ if (!isidchar(*p))
+ badid = true;
+ *q++ = *p++;
+ }
+ *q = 0;
+ }
+ if (badid) {
+ nasm_error(passn == 1 ? ERR_NONFATAL : ERR_PANIC,
+ "identifier expected after DEBUG");
+ break;
+ }
+ if (overlong) {
+ nasm_error(passn == 1 ? ERR_NONFATAL : ERR_PANIC,
+ "DEBUG identifier too long");
+ break;
+ }
+ p = nasm_skip_spaces(p);
+ if (pass0 == 2)
+ dfmt->debug_directive(debugid, p);
+ break;
+ }
+
+ case D_WARNING: /* [WARNING {+|-|*}warn-name] */
+ if (!set_warning_status(value)) {
+ nasm_error(ERR_WARNING|ERR_WARN_UNK_WARNING,
+ "unknown warning option: %s", value);
+ }
+ break;
+
+ case D_CPU: /* [CPU] */
+ cpu = get_cpu(value);
+ break;
+
+ case D_LIST: /* [LIST {+|-}] */
+ value = nasm_skip_spaces(value);
+ if (*value == '+') {
+ user_nolist = false;
+ } else {
+ if (*value == '-') {
+ user_nolist = true;
+ } else {
+ bad_param = true;
+ }
+ }
+ break;
+
+ case D_DEFAULT: /* [DEFAULT] */
+ stdscan_reset();
+ stdscan_set(value);
+ tokval.t_type = TOKEN_INVALID;
+ if (stdscan(NULL, &tokval) != TOKEN_INVALID) {
+ switch (tokval.t_integer) {
+ case S_REL:
+ globalrel = 1;
+ break;
+ case S_ABS:
+ globalrel = 0;
+ break;
+ case P_BND:
+ globalbnd = 1;
+ break;
+ case P_NOBND:
+ globalbnd = 0;
+ break;
+ default:
+ bad_param = true;
+ break;
+ }
+ } else {
+ bad_param = true;
+ }
+ break;
+
+ case D_FLOAT:
+ if (float_option(value)) {
+ nasm_error(pass0 < 2 ? ERR_NONFATAL : ERR_PANIC,
+ "unknown 'float' directive: %s", value);
+ }
+ break;
+
+ case D_PRAGMA:
+ process_pragma(value);
+ break;
+ }
+
+
+ /* A common error message */
+ if (bad_param) {
+ nasm_error(ERR_NONFATAL, "invalid parameter to [%s] directive",
+ directive);
+ }
+
+ return d != D_none;
+}
diff --git a/asm/directiv.dat b/asm/directiv.dat
new file mode 100644
index 00000000..185568a6
--- /dev/null
+++ b/asm/directiv.dat
@@ -0,0 +1,103 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+;;
+;; List of global NASM directives and pragma operations codes
+;;
+;; ALL directives, including backend-specific, need to be added here.
+;;
+;; %pragma operation keywords (the second word, after facility) MAY
+;; be added here too to assist in parsing, but it is not required.
+;; See the definition of struct pragma in include/nasm.h.
+;;
+;; The same keyword can be used as a directive and as a pragma
+;; operation, or as pragma operations in different namespaces. The
+;; same D_ constant will be used for both, and this is perfectly
+;; acceptable.
+;;
+
+; --- General configuration
+#name directive
+#prefix D_
+#errval D_unknown
+#header directiv.h
+
+; --- Special enum values
+#special none = 0 ; Must be zero
+#special unknown
+#special corrupt
+
+; --- Global directives
+absolute
+bits
+common
+cpu
+debug
+default
+extern
+float
+global
+static
+list
+section
+segment
+warning
+sectalign
+pragma
+
+; --- Format-specific directives
+export ; outcoff, outobj
+group ; outobj
+import ; outobj
+library ; outrdf2
+map ; outbin
+module ; outrdf2
+org ; outbin
+osabi ; outelf
+safeseh ; outcoff
+uppercase ; outieee, outobj
+
+; --- Assembler pragmas
+prefix
+suffix
+gprefix
+gsuffix
+lprefix
+lsuffix
+limit
+
+; --- Pragma operations
+subsections_via_symbols ; macho
+no_dead_strip ; macho
+maxdump ; dbg
+nodepend ; obj
+noseclabels ; dbg
diff --git a/asm/directiv.h b/asm/directiv.h
new file mode 100644
index 00000000..20a6424e
--- /dev/null
+++ b/asm/directiv.h
@@ -0,0 +1,77 @@
+/*
+ * This file is generated from ./asm/directiv.dat
+ * by perfhash.pl; do not edit.
+ */
+
+#ifndef DIRECTIV_H
+#define DIRECTIV_H 1
+
+#include "perfhash.h"
+
+enum directive {
+ D_none,
+ D_unknown,
+ D_corrupt,
+ D_ABSOLUTE,
+ D_BITS,
+ D_COMMON,
+ D_CPU,
+ D_DEBUG,
+ D_DEFAULT,
+ D_EXTERN,
+ D_FLOAT,
+ D_GLOBAL,
+ D_STATIC,
+ D_LIST,
+ D_SECTION,
+ D_SEGMENT,
+ D_WARNING,
+ D_SECTALIGN,
+ D_PRAGMA,
+ D_EXPORT,
+ D_GROUP,
+ D_IMPORT,
+ D_LIBRARY,
+ D_MAP,
+ D_MODULE,
+ D_ORG,
+ D_OSABI,
+ D_SAFESEH,
+ D_UPPERCASE,
+ D_PREFIX,
+ D_SUFFIX,
+ D_GPREFIX,
+ D_GSUFFIX,
+ D_LPREFIX,
+ D_LSUFFIX,
+ D_LIMIT,
+ D_SUBSECTIONS_VIA_SYMBOLS,
+ D_NO_DEAD_STRIP,
+ D_MAXDUMP,
+ D_NODEPEND,
+ D_NOSECLABELS
+};
+
+extern const struct perfect_hash directive_hash;
+extern const char * const directive_tbl[38];
+
+static inline enum directive directive_find(const char *str)
+{
+ return perfhash_find(&directive_hash, str);
+}
+
+static inline const char * directive_name(enum directive x)
+{
+ size_t ix = (size_t)x - (3);
+ if (ix >= 38)
+ return NULL;
+ return directive_tbl[ix];
+}
+
+static inline const char * directive_dname(enum directive x)
+{
+ const char *y = directive_name(x);
+ return y ? y : invalid_enum_str(x);
+}
+
+#endif /* DIRECTIV_H */
diff --git a/asm/error.c b/asm/error.c
new file mode 100644
index 00000000..0c7aa64b
--- /dev/null
+++ b/asm/error.c
@@ -0,0 +1,222 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * error.c - error message handling routines for the assembler
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+
+#include "nasmlib.h"
+#include "error.h"
+
+/*
+ * Description of the suppressible warnings for the command line and
+ * the [warning] directive.
+ */
+const struct warning warnings[ERR_WARN_ALL+1] = {
+ {"other", "any warning not specifially mentioned below", true},
+ {"macro-params", "macro calls with wrong parameter count", true},
+ {"macro-selfref", "cyclic macro references", false},
+ {"macro-defaults", "macros with more default than optional parameters", true},
+ {"orphan-labels", "labels alone on lines without trailing `:'", true},
+ {"number-overflow", "numeric constant does not fit", true},
+ {"gnu-elf-extensions", "using 8- or 16-bit relocation in ELF32, a GNU extension", false},
+ {"float-overflow", "floating point overflow", true},
+ {"float-denorm", "floating point denormal", false},
+ {"float-underflow", "floating point underflow", false},
+ {"float-toolong", "too many digits in floating-point number", true},
+ {"user", "%warning directives", true},
+ {"lock", "lock prefix on unlockable instructions", true},
+ {"hle", "invalid hle prefixes", true},
+ {"bnd", "invalid bnd prefixes", true},
+ {"zext-reloc", "relocation zero-extended to match output format", true},
+ {"ptr", "non-NASM keyword used in other assemblers", true},
+ {"bad-pragma", "empty or malformed %pragma", false},
+ {"unknown-pragma", "unknown %pragma facility or directive", false},
+ {"not-my-pragma", "%pragma not applicable to this compilation", false},
+ {"unknown-warning", "unknown warning in -W/-w or warning directive", false},
+ {"negative-rep", "regative %rep count", true},
+ {"phase", "phase error during stabilization", false},
+
+ /* THIS ENTRY MUST COME LAST */
+ {"all", "all possible warnings", false}
+};
+
+uint8_t warning_state[ERR_WARN_ALL];/* Current state */
+uint8_t warning_state_init[ERR_WARN_ALL]; /* Command-line state, for reset */
+
+vefunc nasm_verror; /* Global error handling function */
+
+void nasm_error(int severity, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nasm_verror(severity, fmt, ap);
+ va_end(ap);
+}
+
+fatal_func nasm_fatal(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nasm_verror(ERR_FATAL, fmt, ap);
+ abort(); /* We should never get here */
+}
+
+fatal_func nasm_fatal_fl(int flags, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nasm_verror(flags | ERR_FATAL, fmt, ap);
+ abort(); /* We should never get here */
+}
+
+fatal_func nasm_panic(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nasm_verror(ERR_PANIC, fmt, ap);
+ abort(); /* We should never get here */
+}
+
+fatal_func nasm_panic_fl(int flags, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nasm_verror(flags | ERR_PANIC, fmt, ap);
+ abort(); /* We should never get here */
+}
+
+fatal_func nasm_panic_from_macro(const char *file, int line)
+{
+ nasm_panic("internal error at %s:%d\n", file, line);
+}
+
+fatal_func nasm_assert_failed(const char *file, int line, const char *msg)
+{
+ nasm_panic("assertion %s failed at %s:%d", msg, file, line);
+}
+
+/*
+ * This is called when processing a -w or -W option, or a warning directive.
+ * Returns true if if the action was successful.
+ */
+bool set_warning_status(const char *value)
+{
+ enum warn_action { WID_OFF, WID_ON, WID_RESET };
+ enum warn_action action;
+ uint8_t mask;
+ int i;
+ bool ok = false;
+
+ value = nasm_skip_spaces(value);
+ switch (*value) {
+ case '-':
+ action = WID_OFF;
+ value++;
+ break;
+ case '+':
+ action = WID_ON;
+ value++;
+ break;
+ case '*':
+ action = WID_RESET;
+ value++;
+ break;
+ case 'N':
+ case 'n':
+ if (!nasm_strnicmp(value, "no-", 3)) {
+ action = WID_OFF;
+ value += 3;
+ break;
+ } else if (!nasm_stricmp(value, "none")) {
+ action = WID_OFF;
+ value = NULL;
+ break;
+ }
+ /* else fall through */
+ default:
+ action = WID_ON;
+ break;
+ }
+
+ mask = WARN_ST_ENABLED;
+
+ if (value && !nasm_strnicmp(value, "error", 5)) {
+ switch (value[5]) {
+ case '=':
+ mask = WARN_ST_ERROR;
+ value += 6;
+ break;
+ case '\0':
+ mask = WARN_ST_ERROR;
+ value = NULL;
+ break;
+ default:
+ /* Just an accidental prefix? */
+ break;
+ }
+ }
+
+ if (value && !nasm_stricmp(value, "all"))
+ value = NULL;
+
+ /* This is inefficient, but it shouldn't matter... */
+ for (i = 0; i < ERR_WARN_ALL; i++) {
+ if (!value || !nasm_stricmp(value, warnings[i].name)) {
+ ok = true; /* At least one action taken */
+ switch (action) {
+ case WID_OFF:
+ warning_state[i] &= ~mask;
+ break;
+ case WID_ON:
+ warning_state[i] |= mask;
+ break;
+ case WID_RESET:
+ warning_state[i] &= ~mask;
+ warning_state[i] |= warning_state_init[i] & mask;
+ break;
+ }
+ }
+ }
+
+ return ok;
+}
diff --git a/asm/eval.c b/asm/eval.c
new file mode 100644
index 00000000..7c519046
--- /dev/null
+++ b/asm/eval.c
@@ -0,0 +1,1028 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * eval.c expression evaluator for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "ilog2.h"
+#include "error.h"
+#include "eval.h"
+#include "labels.h"
+#include "float.h"
+#include "assemble.h"
+
+#define TEMPEXPRS_DELTA 128
+#define TEMPEXPR_DELTA 8
+
+static scanner scan; /* Address of scanner routine */
+
+static expr **tempexprs = NULL;
+static int ntempexprs;
+static int tempexprs_size = 0;
+
+static expr *tempexpr;
+static int ntempexpr;
+static int tempexpr_size;
+
+static struct tokenval *tokval; /* The current token */
+static int i; /* The t_type of tokval */
+
+static void *scpriv;
+static int *opflags;
+
+static struct eval_hints *hint;
+static int64_t deadman;
+
+
+/*
+ * Unimportant cleanup is done to avoid confusing people who are trying
+ * to debug real memory leaks
+ */
+void eval_cleanup(void)
+{
+ while (ntempexprs)
+ nasm_free(tempexprs[--ntempexprs]);
+ nasm_free(tempexprs);
+}
+
+/*
+ * Construct a temporary expression.
+ */
+static void begintemp(void)
+{
+ tempexpr = NULL;
+ tempexpr_size = ntempexpr = 0;
+}
+
+static void addtotemp(int32_t type, int64_t value)
+{
+ while (ntempexpr >= tempexpr_size) {
+ tempexpr_size += TEMPEXPR_DELTA;
+ tempexpr = nasm_realloc(tempexpr,
+ tempexpr_size * sizeof(*tempexpr));
+ }
+ tempexpr[ntempexpr].type = type;
+ tempexpr[ntempexpr++].value = value;
+}
+
+static expr *finishtemp(void)
+{
+ addtotemp(0L, 0L); /* terminate */
+ while (ntempexprs >= tempexprs_size) {
+ tempexprs_size += TEMPEXPRS_DELTA;
+ tempexprs = nasm_realloc(tempexprs,
+ tempexprs_size * sizeof(*tempexprs));
+ }
+ return tempexprs[ntempexprs++] = tempexpr;
+}
+
+/*
+ * Add two vector datatypes. We have some bizarre behaviour on far-
+ * absolute segment types: we preserve them during addition _only_
+ * if one of the segments is a truly pure scalar.
+ */
+static expr *add_vectors(expr * p, expr * q)
+{
+ int preserve;
+
+ preserve = is_really_simple(p) || is_really_simple(q);
+
+ begintemp();
+
+ while (p->type && q->type &&
+ p->type < EXPR_SEGBASE + SEG_ABS &&
+ q->type < EXPR_SEGBASE + SEG_ABS) {
+ int lasttype;
+
+ if (p->type > q->type) {
+ addtotemp(q->type, q->value);
+ lasttype = q++->type;
+ } else if (p->type < q->type) {
+ addtotemp(p->type, p->value);
+ lasttype = p++->type;
+ } else { /* *p and *q have same type */
+ int64_t sum = p->value + q->value;
+ if (sum) {
+ addtotemp(p->type, sum);
+ if (hint)
+ hint->type = EAH_SUMMED;
+ }
+ lasttype = p->type;
+ p++, q++;
+ }
+ if (lasttype == EXPR_UNKNOWN) {
+ return finishtemp();
+ }
+ }
+ while (p->type && (preserve || p->type < EXPR_SEGBASE + SEG_ABS)) {
+ addtotemp(p->type, p->value);
+ p++;
+ }
+ while (q->type && (preserve || q->type < EXPR_SEGBASE + SEG_ABS)) {
+ addtotemp(q->type, q->value);
+ q++;
+ }
+
+ return finishtemp();
+}
+
+/*
+ * Multiply a vector by a scalar. Strip far-absolute segment part
+ * if present.
+ *
+ * Explicit treatment of UNKNOWN is not required in this routine,
+ * since it will silently do the Right Thing anyway.
+ *
+ * If `affect_hints' is set, we also change the hint type to
+ * NOTBASE if a MAKEBASE hint points at a register being
+ * multiplied. This allows [eax*1+ebx] to hint EBX rather than EAX
+ * as the base register.
+ */
+static expr *scalar_mult(expr * vect, int64_t scalar, int affect_hints)
+{
+ expr *p = vect;
+
+ while (p->type && p->type < EXPR_SEGBASE + SEG_ABS) {
+ p->value = scalar * (p->value);
+ if (hint && hint->type == EAH_MAKEBASE &&
+ p->type == hint->base && affect_hints)
+ hint->type = EAH_NOTBASE;
+ p++;
+ }
+ p->type = 0;
+
+ return vect;
+}
+
+static expr *scalarvect(int64_t scalar)
+{
+ begintemp();
+ addtotemp(EXPR_SIMPLE, scalar);
+ return finishtemp();
+}
+
+static expr *unknown_expr(void)
+{
+ begintemp();
+ addtotemp(EXPR_UNKNOWN, 1L);
+ return finishtemp();
+}
+
+/*
+ * The SEG operator: calculate the segment part of a relocatable
+ * value. Return NULL, as usual, if an error occurs. Report the
+ * error too.
+ */
+static expr *segment_part(expr * e)
+{
+ int32_t seg;
+
+ if (is_unknown(e))
+ return unknown_expr();
+
+ if (!is_reloc(e)) {
+ nasm_error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
+ return NULL;
+ }
+
+ seg = reloc_seg(e);
+ if (seg == NO_SEG) {
+ nasm_error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
+ return NULL;
+ } else if (seg & SEG_ABS) {
+ return scalarvect(seg & ~SEG_ABS);
+ } else if (seg & 1) {
+ nasm_error(ERR_NONFATAL, "SEG applied to something which"
+ " is already a segment base");
+ return NULL;
+ } else {
+ int32_t base = ofmt->segbase(seg + 1);
+
+ begintemp();
+ addtotemp((base == NO_SEG ? EXPR_UNKNOWN : EXPR_SEGBASE + base),
+ 1L);
+ return finishtemp();
+ }
+}
+
+/*
+ * Recursive-descent parser. Called with a single boolean operand,
+ * which is true if the evaluation is critical (i.e. unresolved
+ * symbols are an error condition). Must update the global `i' to
+ * reflect the token after the parsed string. May return NULL.
+ *
+ * evaluate() should report its own errors: on return it is assumed
+ * that if NULL has been returned, the error has already been
+ * reported.
+ */
+
+/*
+ * Grammar parsed is:
+ *
+ * expr : bexpr [ WRT expr6 ]
+ * bexpr : rexp0 or expr0 depending on relative-mode setting
+ * rexp0 : rexp1 [ {||} rexp1...]
+ * rexp1 : rexp2 [ {^^} rexp2...]
+ * rexp2 : rexp3 [ {&&} rexp3...]
+ * rexp3 : expr0 [ {=,==,<>,!=,<,>,<=,>=} expr0 ]
+ * expr0 : expr1 [ {|} expr1...]
+ * expr1 : expr2 [ {^} expr2...]
+ * expr2 : expr3 [ {&} expr3...]
+ * expr3 : expr4 [ {<<,>>} expr4...]
+ * expr4 : expr5 [ {+,-} expr5...]
+ * expr5 : expr6 [ {*,/,%,//,%%} expr6...]
+ * expr6 : { ~,+,-,IFUNC,SEG } expr6
+ * | (bexpr)
+ * | symbol
+ * | $
+ * | number
+ */
+
+static expr *rexp0(int), *rexp1(int), *rexp2(int), *rexp3(int);
+
+static expr *expr0(int), *expr1(int), *expr2(int), *expr3(int);
+static expr *expr4(int), *expr5(int), *expr6(int);
+
+static expr *(*bexpr) (int);
+
+static expr *rexp0(int critical)
+{
+ expr *e, *f;
+
+ e = rexp1(critical);
+ if (!e)
+ return NULL;
+
+ while (i == TOKEN_DBL_OR) {
+ i = scan(scpriv, tokval);
+ f = rexp1(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`|' operator may only be applied to"
+ " scalar values");
+ }
+
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect((int64_t)(reloc_value(e) || reloc_value(f)));
+ }
+ return e;
+}
+
+static expr *rexp1(int critical)
+{
+ expr *e, *f;
+
+ e = rexp2(critical);
+ if (!e)
+ return NULL;
+
+ while (i == TOKEN_DBL_XOR) {
+ i = scan(scpriv, tokval);
+ f = rexp2(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`^' operator may only be applied to"
+ " scalar values");
+ }
+
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect((int64_t)(!reloc_value(e) ^ !reloc_value(f)));
+ }
+ return e;
+}
+
+static expr *rexp2(int critical)
+{
+ expr *e, *f;
+
+ e = rexp3(critical);
+ if (!e)
+ return NULL;
+ while (i == TOKEN_DBL_AND) {
+ i = scan(scpriv, tokval);
+ f = rexp3(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`&' operator may only be applied to"
+ " scalar values");
+ }
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect((int64_t)(reloc_value(e) && reloc_value(f)));
+ }
+ return e;
+}
+
+static expr *rexp3(int critical)
+{
+ expr *e, *f;
+ int64_t v;
+
+ e = expr0(critical);
+ if (!e)
+ return NULL;
+
+ while (i == TOKEN_EQ || i == TOKEN_LT || i == TOKEN_GT ||
+ i == TOKEN_NE || i == TOKEN_LE || i == TOKEN_GE) {
+ int j = i;
+ i = scan(scpriv, tokval);
+ f = expr0(critical);
+ if (!f)
+ return NULL;
+
+ e = add_vectors(e, scalar_mult(f, -1L, false));
+
+ switch (j) {
+ case TOKEN_EQ:
+ case TOKEN_NE:
+ if (is_unknown(e))
+ v = -1; /* means unknown */
+ else if (!is_really_simple(e) || reloc_value(e) != 0)
+ v = (j == TOKEN_NE); /* unequal, so return true if NE */
+ else
+ v = (j == TOKEN_EQ); /* equal, so return true if EQ */
+ break;
+ default:
+ if (is_unknown(e))
+ v = -1; /* means unknown */
+ else if (!is_really_simple(e)) {
+ nasm_error(ERR_NONFATAL,
+ "`%s': operands differ by a non-scalar",
+ (j == TOKEN_LE ? "<=" : j == TOKEN_LT ? "<" : j ==
+ TOKEN_GE ? ">=" : ">"));
+ v = 0; /* must set it to _something_ */
+ } else {
+ int64_t vv = reloc_value(e);
+ if (vv == 0)
+ v = (j == TOKEN_LE || j == TOKEN_GE);
+ else if (vv > 0)
+ v = (j == TOKEN_GE || j == TOKEN_GT);
+ else /* vv < 0 */
+ v = (j == TOKEN_LE || j == TOKEN_LT);
+ }
+ break;
+ }
+
+ if (v == -1)
+ e = unknown_expr();
+ else
+ e = scalarvect(v);
+ }
+ return e;
+}
+
+static expr *expr0(int critical)
+{
+ expr *e, *f;
+
+ e = expr1(critical);
+ if (!e)
+ return NULL;
+
+ while (i == '|') {
+ i = scan(scpriv, tokval);
+ f = expr1(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`|' operator may only be applied to"
+ " scalar values");
+ }
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(reloc_value(e) | reloc_value(f));
+ }
+ return e;
+}
+
+static expr *expr1(int critical)
+{
+ expr *e, *f;
+
+ e = expr2(critical);
+ if (!e)
+ return NULL;
+
+ while (i == '^') {
+ i = scan(scpriv, tokval);
+ f = expr2(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`^' operator may only be applied to"
+ " scalar values");
+ }
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(reloc_value(e) ^ reloc_value(f));
+ }
+ return e;
+}
+
+static expr *expr2(int critical)
+{
+ expr *e, *f;
+
+ e = expr3(critical);
+ if (!e)
+ return NULL;
+
+ while (i == '&') {
+ i = scan(scpriv, tokval);
+ f = expr3(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "`&' operator may only be applied to"
+ " scalar values");
+ }
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(reloc_value(e) & reloc_value(f));
+ }
+ return e;
+}
+
+static expr *expr3(int critical)
+{
+ expr *e, *f;
+
+ e = expr4(critical);
+ if (!e)
+ return NULL;
+
+ while (i == TOKEN_SHL || i == TOKEN_SHR || i == TOKEN_SAR) {
+ int j = i;
+ i = scan(scpriv, tokval);
+ f = expr4(critical);
+ if (!f)
+ return NULL;
+ if (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f))) {
+ nasm_error(ERR_NONFATAL, "shift operator may only be applied to"
+ " scalar values");
+ } else if (is_just_unknown(e) || is_just_unknown(f)) {
+ e = unknown_expr();
+ } else {
+ switch (j) {
+ case TOKEN_SHL:
+ e = scalarvect(reloc_value(e) << reloc_value(f));
+ break;
+ case TOKEN_SHR:
+ e = scalarvect(((uint64_t)reloc_value(e)) >>
+ reloc_value(f));
+ break;
+ case TOKEN_SAR:
+ e = scalarvect(((int64_t)reloc_value(e)) >>
+ reloc_value(f));
+ break;
+ }
+ }
+ }
+ return e;
+}
+
+static expr *expr4(int critical)
+{
+ expr *e, *f;
+
+ e = expr5(critical);
+ if (!e)
+ return NULL;
+ while (i == '+' || i == '-') {
+ int j = i;
+ i = scan(scpriv, tokval);
+ f = expr5(critical);
+ if (!f)
+ return NULL;
+ switch (j) {
+ case '+':
+ e = add_vectors(e, f);
+ break;
+ case '-':
+ e = add_vectors(e, scalar_mult(f, -1L, false));
+ break;
+ }
+ }
+ return e;
+}
+
+static expr *expr5(int critical)
+{
+ expr *e, *f;
+
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ while (i == '*' || i == '/' || i == '%' ||
+ i == TOKEN_SDIV || i == TOKEN_SMOD) {
+ int j = i;
+ i = scan(scpriv, tokval);
+ f = expr6(critical);
+ if (!f)
+ return NULL;
+ if (j != '*' && (!(is_simple(e) || is_just_unknown(e)) ||
+ !(is_simple(f) || is_just_unknown(f)))) {
+ nasm_error(ERR_NONFATAL, "division operator may only be applied to"
+ " scalar values");
+ return NULL;
+ }
+ if (j != '*' && !is_just_unknown(f) && reloc_value(f) == 0) {
+ nasm_error(ERR_NONFATAL, "division by zero");
+ return NULL;
+ }
+ switch (j) {
+ case '*':
+ if (is_simple(e))
+ e = scalar_mult(f, reloc_value(e), true);
+ else if (is_simple(f))
+ e = scalar_mult(e, reloc_value(f), true);
+ else if (is_just_unknown(e) && is_just_unknown(f))
+ e = unknown_expr();
+ else {
+ nasm_error(ERR_NONFATAL, "unable to multiply two "
+ "non-scalar objects");
+ return NULL;
+ }
+ break;
+ case '/':
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(((uint64_t)reloc_value(e)) /
+ ((uint64_t)reloc_value(f)));
+ break;
+ case '%':
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(((uint64_t)reloc_value(e)) %
+ ((uint64_t)reloc_value(f)));
+ break;
+ case TOKEN_SDIV:
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(((int64_t)reloc_value(e)) /
+ ((int64_t)reloc_value(f)));
+ break;
+ case TOKEN_SMOD:
+ if (is_just_unknown(e) || is_just_unknown(f))
+ e = unknown_expr();
+ else
+ e = scalarvect(((int64_t)reloc_value(e)) %
+ ((int64_t)reloc_value(f)));
+ break;
+ }
+ }
+ return e;
+}
+
+static expr *eval_floatize(enum floatize type)
+{
+ uint8_t result[16], *p; /* Up to 128 bits */
+ static const struct {
+ int bytes, start, len;
+ } formats[] = {
+ { 1, 0, 1 }, /* FLOAT_8 */
+ { 2, 0, 2 }, /* FLOAT_16 */
+ { 4, 0, 4 }, /* FLOAT_32 */
+ { 8, 0, 8 }, /* FLOAT_64 */
+ { 10, 0, 8 }, /* FLOAT_80M */
+ { 10, 8, 2 }, /* FLOAT_80E */
+ { 16, 0, 8 }, /* FLOAT_128L */
+ { 16, 8, 8 }, /* FLOAT_128H */
+ };
+ int sign = 1;
+ int64_t val;
+ int j;
+
+ i = scan(scpriv, tokval);
+ if (i != '(') {
+ nasm_error(ERR_NONFATAL, "expecting `('");
+ return NULL;
+ }
+ i = scan(scpriv, tokval);
+ if (i == '-' || i == '+') {
+ sign = (i == '-') ? -1 : 1;
+ i = scan(scpriv, tokval);
+ }
+ if (i != TOKEN_FLOAT) {
+ nasm_error(ERR_NONFATAL, "expecting floating-point number");
+ return NULL;
+ }
+ if (!float_const(tokval->t_charptr, sign, result, formats[type].bytes))
+ return NULL;
+ i = scan(scpriv, tokval);
+ if (i != ')') {
+ nasm_error(ERR_NONFATAL, "expecting `)'");
+ return NULL;
+ }
+
+ p = result+formats[type].start+formats[type].len;
+ val = 0;
+ for (j = formats[type].len; j; j--) {
+ p--;
+ val = (val << 8) + *p;
+ }
+
+ begintemp();
+ addtotemp(EXPR_SIMPLE, val);
+
+ i = scan(scpriv, tokval);
+ return finishtemp();
+}
+
+static expr *eval_strfunc(enum strfunc type)
+{
+ char *string;
+ size_t string_len;
+ int64_t val;
+ bool parens, rn_warn;
+
+ parens = false;
+ i = scan(scpriv, tokval);
+ if (i == '(') {
+ parens = true;
+ i = scan(scpriv, tokval);
+ }
+ if (i != TOKEN_STR) {
+ nasm_error(ERR_NONFATAL, "expecting string");
+ return NULL;
+ }
+ string_len = string_transform(tokval->t_charptr, tokval->t_inttwo,
+ &string, type);
+ if (string_len == (size_t)-1) {
+ nasm_error(ERR_NONFATAL, "invalid string for transform");
+ return NULL;
+ }
+
+ val = readstrnum(string, string_len, &rn_warn);
+ if (parens) {
+ i = scan(scpriv, tokval);
+ if (i != ')') {
+ nasm_error(ERR_NONFATAL, "expecting `)'");
+ return NULL;
+ }
+ }
+
+ if (rn_warn)
+ nasm_error(ERR_WARNING|ERR_PASS1, "character constant too long");
+
+ begintemp();
+ addtotemp(EXPR_SIMPLE, val);
+
+ i = scan(scpriv, tokval);
+ return finishtemp();
+}
+
+static int64_t eval_ifunc(int64_t val, enum ifunc func)
+{
+ int errtype;
+ uint64_t uval = (uint64_t)val;
+ int64_t rv;
+
+ switch (func) {
+ case IFUNC_ILOG2E:
+ case IFUNC_ILOG2W:
+ errtype = (func == IFUNC_ILOG2E) ? ERR_NONFATAL : ERR_WARNING;
+
+ if (!is_power2(uval))
+ nasm_error(errtype, "ilog2 argument is not a power of two");
+ /* fall through */
+ case IFUNC_ILOG2F:
+ rv = ilog2_64(uval);
+ break;
+
+ case IFUNC_ILOG2C:
+ rv = (uval < 2) ? 0 : ilog2_64(uval-1) + 1;
+ break;
+
+ default:
+ nasm_panic("invalid IFUNC token %d", func);
+ rv = 0;
+ break;
+ }
+
+ return rv;
+}
+
+static expr *expr6(int critical)
+{
+ int32_t type;
+ expr *e;
+ int32_t label_seg;
+ int64_t label_ofs;
+ int64_t tmpval;
+ bool rn_warn;
+ const char *scope;
+
+ if (++deadman > nasm_limit[LIMIT_EVAL]) {
+ nasm_error(ERR_NONFATAL, "expression too long");
+ return NULL;
+ }
+
+ switch (i) {
+ case '-':
+ i = scan(scpriv, tokval);
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ return scalar_mult(e, -1L, false);
+
+ case '+':
+ i = scan(scpriv, tokval);
+ return expr6(critical);
+
+ case '~':
+ i = scan(scpriv, tokval);
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ if (is_just_unknown(e))
+ return unknown_expr();
+ else if (!is_simple(e)) {
+ nasm_error(ERR_NONFATAL, "`~' operator may only be applied to"
+ " scalar values");
+ return NULL;
+ }
+ return scalarvect(~reloc_value(e));
+
+ case '!':
+ i = scan(scpriv, tokval);
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ if (is_just_unknown(e))
+ return unknown_expr();
+ else if (!is_simple(e)) {
+ nasm_error(ERR_NONFATAL, "`!' operator may only be applied to"
+ " scalar values");
+ return NULL;
+ }
+ return scalarvect(!reloc_value(e));
+
+ case TOKEN_IFUNC:
+ {
+ enum ifunc func = tokval->t_integer;
+ i = scan(scpriv, tokval);
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ if (is_just_unknown(e))
+ return unknown_expr();
+ else if (!is_simple(e)) {
+ nasm_error(ERR_NONFATAL, "function may only be applied to"
+ " scalar values");
+ return NULL;
+ }
+ return scalarvect(eval_ifunc(reloc_value(e), func));
+ }
+
+ case TOKEN_SEG:
+ i = scan(scpriv, tokval);
+ e = expr6(critical);
+ if (!e)
+ return NULL;
+ e = segment_part(e);
+ if (!e)
+ return NULL;
+ if (is_unknown(e) && critical) {
+ nasm_error(ERR_NONFATAL, "unable to determine segment base");
+ return NULL;
+ }
+ return e;
+
+ case TOKEN_FLOATIZE:
+ return eval_floatize(tokval->t_integer);
+
+ case TOKEN_STRFUNC:
+ return eval_strfunc(tokval->t_integer);
+
+ case '(':
+ i = scan(scpriv, tokval);
+ e = bexpr(critical);
+ if (!e)
+ return NULL;
+ if (i != ')') {
+ nasm_error(ERR_NONFATAL, "expecting `)'");
+ return NULL;
+ }
+ i = scan(scpriv, tokval);
+ return e;
+
+ case TOKEN_NUM:
+ case TOKEN_STR:
+ case TOKEN_REG:
+ case TOKEN_ID:
+ case TOKEN_INSN: /* Opcodes that occur here are really labels */
+ case TOKEN_HERE:
+ case TOKEN_BASE:
+ case TOKEN_DECORATOR:
+ begintemp();
+ switch (i) {
+ case TOKEN_NUM:
+ addtotemp(EXPR_SIMPLE, tokval->t_integer);
+ break;
+ case TOKEN_STR:
+ tmpval = readstrnum(tokval->t_charptr, tokval->t_inttwo, &rn_warn);
+ if (rn_warn)
+ nasm_error(ERR_WARNING|ERR_PASS1, "character constant too long");
+ addtotemp(EXPR_SIMPLE, tmpval);
+ break;
+ case TOKEN_REG:
+ addtotemp(tokval->t_integer, 1L);
+ if (hint && hint->type == EAH_NOHINT)
+ hint->base = tokval->t_integer, hint->type = EAH_MAKEBASE;
+ break;
+ case TOKEN_ID:
+ case TOKEN_INSN:
+ case TOKEN_HERE:
+ case TOKEN_BASE:
+ /*
+ * If !location.known, this indicates that no
+ * symbol, Here or Base references are valid because we
+ * are in preprocess-only mode.
+ */
+ if (!location.known) {
+ nasm_error(ERR_NONFATAL,
+ "%s not supported in preprocess-only mode",
+ (i == TOKEN_HERE ? "`$'" :
+ i == TOKEN_BASE ? "`$$'" :
+ "symbol references"));
+ addtotemp(EXPR_UNKNOWN, 1L);
+ break;
+ }
+
+ type = EXPR_SIMPLE; /* might get overridden by UNKNOWN */
+ if (i == TOKEN_BASE) {
+ label_seg = in_absolute ? absolute.segment : location.segment;
+ label_ofs = 0;
+ } else if (i == TOKEN_HERE) {
+ label_seg = in_absolute ? absolute.segment : location.segment;
+ label_ofs = in_absolute ? absolute.offset : location.offset;
+ } else {
+ if (!lookup_label(tokval->t_charptr, &label_seg, &label_ofs)) {
+ scope = local_scope(tokval->t_charptr);
+ if (critical == 2) {
+ nasm_error(ERR_NONFATAL, "symbol `%s%s' undefined",
+ scope,tokval->t_charptr);
+ return NULL;
+ } else if (critical == 1) {
+ nasm_error(ERR_NONFATAL,
+ "symbol `%s%s' not defined before use",
+ scope,tokval->t_charptr);
+ return NULL;
+ } else {
+ if (opflags)
+ *opflags |= OPFLAG_FORWARD;
+ type = EXPR_UNKNOWN;
+ label_seg = NO_SEG;
+ label_ofs = 1;
+ }
+ }
+ if (opflags && is_extern(tokval->t_charptr))
+ *opflags |= OPFLAG_EXTERN;
+ }
+ addtotemp(type, label_ofs);
+ if (label_seg != NO_SEG)
+ addtotemp(EXPR_SEGBASE + label_seg, 1L);
+ break;
+ case TOKEN_DECORATOR:
+ addtotemp(EXPR_RDSAE, tokval->t_integer);
+ break;
+ }
+ i = scan(scpriv, tokval);
+ return finishtemp();
+
+ default:
+ nasm_error(ERR_NONFATAL, "expression syntax error");
+ return NULL;
+ }
+}
+
+expr *evaluate(scanner sc, void *scprivate, struct tokenval *tv,
+ int *fwref, int critical, struct eval_hints *hints)
+{
+ expr *e;
+ expr *f = NULL;
+
+ deadman = 0;
+
+ hint = hints;
+ if (hint)
+ hint->type = EAH_NOHINT;
+
+ if (critical & CRITICAL) {
+ critical &= ~CRITICAL;
+ bexpr = rexp0;
+ } else
+ bexpr = expr0;
+
+ scan = sc;
+ scpriv = scprivate;
+ tokval = tv;
+ opflags = fwref;
+
+ if (tokval->t_type == TOKEN_INVALID)
+ i = scan(scpriv, tokval);
+ else
+ i = tokval->t_type;
+
+ while (ntempexprs) /* initialize temporary storage */
+ nasm_free(tempexprs[--ntempexprs]);
+
+ e = bexpr(critical);
+ if (!e)
+ return NULL;
+
+ if (i == TOKEN_WRT) {
+ i = scan(scpriv, tokval); /* eat the WRT */
+ f = expr6(critical);
+ if (!f)
+ return NULL;
+ }
+ e = scalar_mult(e, 1L, false); /* strip far-absolute segment part */
+ if (f) {
+ expr *g;
+ if (is_just_unknown(f))
+ g = unknown_expr();
+ else {
+ int64_t value;
+ begintemp();
+ if (!is_reloc(f)) {
+ nasm_error(ERR_NONFATAL, "invalid right-hand operand to WRT");
+ return NULL;
+ }
+ value = reloc_seg(f);
+ if (value == NO_SEG)
+ value = reloc_value(f) | SEG_ABS;
+ else if (!(value & SEG_ABS) && !(value % 2) && critical) {
+ nasm_error(ERR_NONFATAL, "invalid right-hand operand to WRT");
+ return NULL;
+ }
+ addtotemp(EXPR_WRT, value);
+ g = finishtemp();
+ }
+ e = add_vectors(e, g);
+ }
+ return e;
+}
diff --git a/asm/eval.h b/asm/eval.h
new file mode 100644
index 00000000..7af17eb8
--- /dev/null
+++ b/asm/eval.h
@@ -0,0 +1,49 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * eval.h header file for eval.c
+ */
+
+#ifndef NASM_EVAL_H
+#define NASM_EVAL_H
+
+/*
+ * The evaluator itself.
+ */
+expr *evaluate(scanner sc, void *scprivate, struct tokenval *tv,
+ int *fwref, int critical, struct eval_hints *hints);
+
+void eval_cleanup(void);
+
+#endif
diff --git a/asm/exprdump.c b/asm/exprdump.c
new file mode 100644
index 00000000..68a9b670
--- /dev/null
+++ b/asm/exprdump.c
@@ -0,0 +1,79 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * exprdump.c
+ *
+ * Debugging code to dump the contents of an expression vector to stdout
+ */
+
+#include "nasm.h"
+
+static const char *expr_type(int32_t type)
+{
+ static char seg_str[64];
+
+ switch (type) {
+ case 0:
+ return "null";
+ case EXPR_UNKNOWN:
+ return "unknown";
+ case EXPR_SIMPLE:
+ return "simple";
+ case EXPR_WRT:
+ return "wrt";
+ case EXPR_RDSAE:
+ return "sae";
+ default:
+ break;
+ }
+
+ if (type >= EXPR_REG_START && type <= EXPR_REG_END) {
+ return nasm_reg_names[type - EXPR_REG_START];
+ } else if (type >= EXPR_SEGBASE) {
+ snprintf(seg_str, sizeof seg_str, "%sseg %d",
+ (type - EXPR_SEGBASE) == location.segment ? "this " : "",
+ type - EXPR_SEGBASE);
+ return seg_str;
+ } else {
+ return "ERR";
+ }
+}
+
+void dump_expr(const expr *e)
+{
+ printf("[");
+ for (; e->type; e++)
+ printf("<%s(%d),%"PRId64">", expr_type(e->type), e->type, e->value);
+ printf("]\n");
+}
diff --git a/asm/exprlib.c b/asm/exprlib.c
new file mode 100644
index 00000000..f7cfbcee
--- /dev/null
+++ b/asm/exprlib.c
@@ -0,0 +1,200 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * exprlib.c
+ *
+ * Library routines to manipulate expression data types.
+ */
+
+#include "nasm.h"
+
+/*
+ * Return true if the argument is a simple scalar. (Or a far-
+ * absolute, which counts.)
+ */
+bool is_simple(const expr *vect)
+{
+ while (vect->type && !vect->value)
+ vect++;
+ if (!vect->type)
+ return true;
+ if (vect->type != EXPR_SIMPLE)
+ return false;
+ do {
+ vect++;
+ } while (vect->type && !vect->value);
+ if (vect->type && vect->type < EXPR_SEGBASE + SEG_ABS)
+ return false;
+ return true;
+}
+
+/*
+ * Return true if the argument is a simple scalar, _NOT_ a far-
+ * absolute.
+ */
+bool is_really_simple(const expr *vect)
+{
+ while (vect->type && !vect->value)
+ vect++;
+ if (!vect->type)
+ return true;
+ if (vect->type != EXPR_SIMPLE)
+ return false;
+ do {
+ vect++;
+ } while (vect->type && !vect->value);
+ if (vect->type)
+ return false;
+ return true;
+}
+
+/*
+ * Return true if the argument is relocatable (i.e. a simple
+ * scalar, plus at most one segment-base, possibly a subtraction
+ * of the current segment base, plus possibly a WRT).
+ */
+bool is_reloc(const expr *vect)
+{
+ bool has_rel = false; /* Has a self-segment-subtract */
+ bool has_seg = false; /* Has a segment base */
+
+ for (; vect->type; vect++) {
+ if (!vect->value) {
+ /* skip value-0 terms */
+ continue;
+ } else if (vect->type < EXPR_SIMPLE) {
+ /* false if a register is present */
+ return false;
+ } else if (vect->type == EXPR_SIMPLE) {
+ /* skip over a pure number term... */
+ continue;
+ } else if (vect->type == EXPR_WRT) {
+ /* skip over a WRT term... */
+ continue;
+ } else if (vect->type < EXPR_SEGBASE) {
+ /* other special type -> problem */
+ return false;
+ } else if (vect->value == 1) {
+ if (has_seg)
+ return false; /* only one segbase allowed */
+ has_seg = true;
+ } else if (vect->value == -1) {
+ if (vect->type != location.segment + EXPR_SEGBASE)
+ return false; /* can only subtract current segment */
+ if (has_rel)
+ return false; /* already is relative */
+ has_rel = true;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Return true if the argument contains an `unknown' part.
+ */
+bool is_unknown(const expr *vect)
+{
+ while (vect->type && vect->type < EXPR_UNKNOWN)
+ vect++;
+ return (vect->type == EXPR_UNKNOWN);
+}
+
+/*
+ * Return true if the argument contains nothing but an `unknown'
+ * part.
+ */
+bool is_just_unknown(const expr *vect)
+{
+ while (vect->type && !vect->value)
+ vect++;
+ return (vect->type == EXPR_UNKNOWN);
+}
+
+/*
+ * Return the scalar part of a relocatable vector. (Including
+ * simple scalar vectors - those qualify as relocatable.)
+ */
+int64_t reloc_value(const expr *vect)
+{
+ while (vect->type && !vect->value)
+ vect++;
+ if (!vect->type)
+ return 0;
+ if (vect->type == EXPR_SIMPLE)
+ return vect->value;
+ else
+ return 0;
+}
+
+/*
+ * Return the segment number of a relocatable vector, or NO_SEG for
+ * simple scalars.
+ */
+int32_t reloc_seg(const expr *vect)
+{
+ for (; vect->type; vect++) {
+ if (vect->type >= EXPR_SEGBASE && vect->value == 1)
+ return vect->type - EXPR_SEGBASE;
+ }
+
+ return NO_SEG;
+}
+
+/*
+ * Return the WRT segment number of a relocatable vector, or NO_SEG
+ * if no WRT part is present.
+ */
+int32_t reloc_wrt(const expr *vect)
+{
+ while (vect->type && vect->type < EXPR_WRT)
+ vect++;
+ if (vect->type == EXPR_WRT) {
+ return vect->value;
+ } else
+ return NO_SEG;
+}
+
+/*
+ * Return true if this expression contains a subtraction of the location
+ */
+bool is_self_relative(const expr *vect)
+{
+ for (; vect->type; vect++) {
+ if (vect->type == location.segment + EXPR_SEGBASE && vect->value == -1)
+ return true;
+ }
+
+ return false;
+}
diff --git a/asm/float.c b/asm/float.c
new file mode 100644
index 00000000..ff3d9c8f
--- /dev/null
+++ b/asm/float.c
@@ -0,0 +1,950 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * float.c floating-point constant support for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "nasm.h"
+#include "float.h"
+#include "error.h"
+
+/*
+ * -----------------
+ * local variables
+ * -----------------
+ */
+static bool daz = false; /* denormals as zero */
+static enum float_round rc = FLOAT_RC_NEAR; /* rounding control */
+
+/*
+ * -----------
+ * constants
+ * -----------
+ */
+
+/* "A limb is like a digit but bigger */
+typedef uint32_t fp_limb;
+typedef uint64_t fp_2limb;
+
+#define LIMB_BITS 32
+#define LIMB_BYTES (LIMB_BITS/8)
+#define LIMB_TOP_BIT ((fp_limb)1 << (LIMB_BITS-1))
+#define LIMB_MASK ((fp_limb)(~0))
+#define LIMB_ALL_BYTES ((fp_limb)0x01010101)
+#define LIMB_BYTE(x) ((x)*LIMB_ALL_BYTES)
+
+/* 112 bits + 64 bits for accuracy + 16 bits for rounding */
+#define MANT_LIMBS 6
+
+/* 52 digits fit in 176 bits because 10^53 > 2^176 > 10^52 */
+#define MANT_DIGITS 52
+
+/* the format and the argument list depend on MANT_LIMBS */
+#define MANT_FMT "%08x_%08x_%08x_%08x_%08x_%08x"
+#define MANT_ARG SOME_ARG(mant, 0)
+
+#define SOME_ARG(a,i) (a)[(i)+0], (a)[(i)+1], (a)[(i)+2], \
+ (a)[(i)+3], (a)[(i)+4], (a)[(i)+5]
+
+/*
+ * ---------------------------------------------------------------------------
+ * emit a printf()-like debug message... but only if DEBUG_FLOAT was defined
+ * ---------------------------------------------------------------------------
+ */
+
+#ifdef DEBUG_FLOAT
+#define dprintf(x) printf x
+#else
+#define dprintf(x) do { } while (0)
+#endif
+
+/*
+ * ---------------------------------------------------------------------------
+ * multiply
+ * ---------------------------------------------------------------------------
+ */
+static int float_multiply(fp_limb *to, fp_limb *from)
+{
+ fp_2limb temp[MANT_LIMBS * 2];
+ int i, j;
+
+ /*
+ * guaranteed that top bit of 'from' is set -- so we only have
+ * to worry about _one_ bit shift to the left
+ */
+ dprintf(("%s=" MANT_FMT "\n", "mul1", SOME_ARG(to, 0)));
+ dprintf(("%s=" MANT_FMT "\n", "mul2", SOME_ARG(from, 0)));
+
+ memset(temp, 0, sizeof temp);
+
+ for (i = 0; i < MANT_LIMBS; i++) {
+ for (j = 0; j < MANT_LIMBS; j++) {
+ fp_2limb n;
+ n = (fp_2limb) to[i] * (fp_2limb) from[j];
+ temp[i + j] += n >> LIMB_BITS;
+ temp[i + j + 1] += (fp_limb)n;
+ }
+ }
+
+ for (i = MANT_LIMBS * 2; --i;) {
+ temp[i - 1] += temp[i] >> LIMB_BITS;
+ temp[i] &= LIMB_MASK;
+ }
+
+ dprintf(("%s=" MANT_FMT "_" MANT_FMT "\n", "temp", SOME_ARG(temp, 0),
+ SOME_ARG(temp, MANT_LIMBS)));
+
+ if (temp[0] & LIMB_TOP_BIT) {
+ for (i = 0; i < MANT_LIMBS; i++) {
+ to[i] = temp[i] & LIMB_MASK;
+ }
+ dprintf(("%s=" MANT_FMT " (%i)\n", "prod", SOME_ARG(to, 0), 0));
+ return 0;
+ } else {
+ for (i = 0; i < MANT_LIMBS; i++) {
+ to[i] = (temp[i] << 1) + !!(temp[i + 1] & LIMB_TOP_BIT);
+ }
+ dprintf(("%s=" MANT_FMT " (%i)\n", "prod", SOME_ARG(to, 0), -1));
+ return -1;
+ }
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * read an exponent; returns INT32_MAX on error
+ * ---------------------------------------------------------------------------
+ */
+static int32_t read_exponent(const char *string, int32_t max)
+{
+ int32_t i = 0;
+ bool neg = false;
+
+ if (*string == '+') {
+ string++;
+ } else if (*string == '-') {
+ neg = true;
+ string++;
+ }
+ while (*string) {
+ if (*string >= '0' && *string <= '9') {
+ i = (i * 10) + (*string - '0');
+
+ /*
+ * To ensure that underflows and overflows are
+ * handled properly we must avoid wraparounds of
+ * the signed integer value that is used to hold
+ * the exponent. Therefore we cap the exponent at
+ * +/-5000, which is slightly more/less than
+ * what's required for normal and denormal numbers
+ * in single, double, and extended precision, but
+ * sufficient to avoid signed integer wraparound.
+ */
+ if (i > max)
+ i = max;
+ } else if (*string == '_') {
+ /* do nothing */
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "invalid character in floating-point constant %s: '%c'",
+ "exponent", *string);
+ return INT32_MAX;
+ }
+ string++;
+ }
+
+ return neg ? -i : i;
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * convert
+ * ---------------------------------------------------------------------------
+ */
+static bool ieee_flconvert(const char *string, fp_limb *mant,
+ int32_t * exponent)
+{
+ char digits[MANT_DIGITS];
+ char *p, *q, *r;
+ fp_limb mult[MANT_LIMBS], bit;
+ fp_limb *m;
+ int32_t tenpwr, twopwr;
+ int32_t extratwos;
+ bool started, seendot, warned;
+
+ warned = false;
+ p = digits;
+ tenpwr = 0;
+ started = seendot = false;
+
+ while (*string && *string != 'E' && *string != 'e') {
+ if (*string == '.') {
+ if (!seendot) {
+ seendot = true;
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "too many periods in floating-point constant");
+ return false;
+ }
+ } else if (*string >= '0' && *string <= '9') {
+ if (*string == '0' && !started) {
+ if (seendot) {
+ tenpwr--;
+ }
+ } else {
+ started = true;
+ if (p < digits + sizeof(digits)) {
+ *p++ = *string - '0';
+ } else {
+ if (!warned) {
+ nasm_error(ERR_WARNING|ERR_WARN_FL_TOOLONG|ERR_PASS2,
+ "floating-point constant significand contains "
+ "more than %i digits", MANT_DIGITS);
+ warned = true;
+ }
+ }
+ if (!seendot) {
+ tenpwr++;
+ }
+ }
+ } else if (*string == '_') {
+ /* do nothing */
+ } else {
+ nasm_error(ERR_NONFATAL|ERR_PASS2,
+ "invalid character in floating-point constant %s: '%c'",
+ "significand", *string);
+ return false;
+ }
+ string++;
+ }
+
+ if (*string) {
+ int32_t e;
+
+ string++; /* eat the E */
+ e = read_exponent(string, 5000);
+ if (e == INT32_MAX)
+ return false;
+ tenpwr += e;
+ }
+
+ /*
+ * At this point, the memory interval [digits,p) contains a
+ * series of decimal digits zzzzzzz, such that our number X
+ * satisfies X = 0.zzzzzzz * 10^tenpwr.
+ */
+ q = digits;
+ dprintf(("X = 0."));
+ while (q < p) {
+ dprintf(("%c", *q + '0'));
+ q++;
+ }
+ dprintf((" * 10^%i\n", tenpwr));
+
+ /*
+ * Now convert [digits,p) to our internal representation.
+ */
+ bit = LIMB_TOP_BIT;
+ for (m = mant; m < mant + MANT_LIMBS; m++) {
+ *m = 0;
+ }
+ m = mant;
+ q = digits;
+ started = false;
+ twopwr = 0;
+ while (m < mant + MANT_LIMBS) {
+ fp_limb carry = 0;
+ while (p > q && !p[-1]) {
+ p--;
+ }
+ if (p <= q) {
+ break;
+ }
+ for (r = p; r-- > q;) {
+ int32_t i;
+ i = 2 * *r + carry;
+ if (i >= 10) {
+ carry = 1;
+ i -= 10;
+ } else {
+ carry = 0;
+ }
+ *r = i;
+ }
+ if (carry) {
+ *m |= bit;
+ started = true;
+ }
+ if (started) {
+ if (bit == 1) {
+ bit = LIMB_TOP_BIT;
+ m++;
+ } else {
+ bit >>= 1;
+ }
+ } else {
+ twopwr--;
+ }
+ }
+ twopwr += tenpwr;
+
+ /*
+ * At this point, the 'mant' array contains the first frac-
+ * tional places of a base-2^16 real number which when mul-
+ * tiplied by 2^twopwr and 5^tenpwr gives X.
+ */
+ dprintf(("X = " MANT_FMT " * 2^%i * 5^%i\n", MANT_ARG, twopwr,
+ tenpwr));
+
+ /*
+ * Now multiply 'mant' by 5^tenpwr.
+ */
+ if (tenpwr < 0) { /* mult = 5^-1 = 0.2 */
+ for (m = mult; m < mult + MANT_LIMBS - 1; m++) {
+ *m = LIMB_BYTE(0xcc);
+ }
+ mult[MANT_LIMBS - 1] = LIMB_BYTE(0xcc)+1;
+ extratwos = -2;
+ tenpwr = -tenpwr;
+
+ /*
+ * If tenpwr was 1000...000b, then it becomes 1000...000b. See
+ * the "ANSI C" comment below for more details on that case.
+ *
+ * Because we already truncated tenpwr to +5000...-5000 inside
+ * the exponent parsing code, this shouldn't happen though.
+ */
+ } else if (tenpwr > 0) { /* mult = 5^+1 = 5.0 */
+ mult[0] = (fp_limb)5 << (LIMB_BITS-3); /* 0xA000... */
+ for (m = mult + 1; m < mult + MANT_LIMBS; m++) {
+ *m = 0;
+ }
+ extratwos = 3;
+ } else {
+ extratwos = 0;
+ }
+ while (tenpwr) {
+ dprintf(("loop=" MANT_FMT " * 2^%i * 5^%i (%i)\n", MANT_ARG,
+ twopwr, tenpwr, extratwos));
+ if (tenpwr & 1) {
+ dprintf(("mant*mult\n"));
+ twopwr += extratwos + float_multiply(mant, mult);
+ }
+ dprintf(("mult*mult\n"));
+ extratwos = extratwos * 2 + float_multiply(mult, mult);
+ tenpwr >>= 1;
+
+ /*
+ * In ANSI C, the result of right-shifting a signed integer is
+ * considered implementation-specific. To ensure that the loop
+ * terminates even if tenpwr was 1000...000b to begin with, we
+ * manually clear the MSB, in case a 1 was shifted in.
+ *
+ * Because we already truncated tenpwr to +5000...-5000 inside
+ * the exponent parsing code, this shouldn't matter; neverthe-
+ * less it is the right thing to do here.
+ */
+ tenpwr &= (uint32_t) - 1 >> 1;
+ }
+
+ /*
+ * At this point, the 'mant' array contains the first frac-
+ * tional places of a base-2^16 real number in [0.5,1) that
+ * when multiplied by 2^twopwr gives X. Or it contains zero
+ * of course. We are done.
+ */
+ *exponent = twopwr;
+ return true;
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * operations of specific bits
+ * ---------------------------------------------------------------------------
+ */
+
+/* Set a bit, using *bigendian* bit numbering (0 = MSB) */
+static void set_bit(fp_limb *mant, int bit)
+{
+ mant[bit/LIMB_BITS] |= LIMB_TOP_BIT >> (bit & (LIMB_BITS-1));
+}
+
+/* Test a single bit */
+static int test_bit(const fp_limb *mant, int bit)
+{
+ return (mant[bit/LIMB_BITS] >> (~bit & (LIMB_BITS-1))) & 1;
+}
+
+/* Report if the mantissa value is all zero */
+static bool is_zero(const fp_limb *mant)
+{
+ int i;
+
+ for (i = 0; i < MANT_LIMBS; i++)
+ if (mant[i])
+ return false;
+
+ return true;
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * round a mantissa off after i words
+ * ---------------------------------------------------------------------------
+ */
+
+#define ROUND_COLLECT_BITS \
+ do { \
+ m = mant[i] & (2*bit-1); \
+ for (j = i+1; j < MANT_LIMBS; j++) \
+ m = m | mant[j]; \
+ } while (0)
+
+#define ROUND_ABS_DOWN \
+ do { \
+ mant[i] &= ~(bit-1); \
+ for (j = i+1; j < MANT_LIMBS; j++) \
+ mant[j] = 0; \
+ return false; \
+ } while (0)
+
+#define ROUND_ABS_UP \
+ do { \
+ mant[i] = (mant[i] & ~(bit-1)) + bit; \
+ for (j = i+1; j < MANT_LIMBS; j++) \
+ mant[j] = 0; \
+ while (i > 0 && !mant[i]) \
+ ++mant[--i]; \
+ return !mant[0]; \
+ } while (0)
+
+static bool ieee_round(bool minus, fp_limb *mant, int bits)
+{
+ fp_limb m = 0;
+ int32_t j;
+ int i = bits / LIMB_BITS;
+ int p = bits % LIMB_BITS;
+ fp_limb bit = LIMB_TOP_BIT >> p;
+
+ if (rc == FLOAT_RC_NEAR) {
+ if (mant[i] & bit) {
+ mant[i] &= ~bit;
+ ROUND_COLLECT_BITS;
+ mant[i] |= bit;
+ if (m) {
+ ROUND_ABS_UP;
+ } else {
+ if (test_bit(mant, bits-1)) {
+ ROUND_ABS_UP;
+ } else {
+ ROUND_ABS_DOWN;
+ }
+ }
+ } else {
+ ROUND_ABS_DOWN;
+ }
+ } else if (rc == FLOAT_RC_ZERO ||
+ rc == (minus ? FLOAT_RC_UP : FLOAT_RC_DOWN)) {
+ ROUND_ABS_DOWN;
+ } else {
+ /* rc == (minus ? FLOAT_RC_DOWN : FLOAT_RC_UP) */
+ /* Round toward +/- infinity */
+ ROUND_COLLECT_BITS;
+ if (m) {
+ ROUND_ABS_UP;
+ } else {
+ ROUND_ABS_DOWN;
+ }
+ }
+ return false;
+}
+
+/* Returns a value >= 16 if not a valid hex digit */
+static unsigned int hexval(char c)
+{
+ unsigned int v = (unsigned char) c;
+
+ if (v >= '0' && v <= '9')
+ return v - '0';
+ else
+ return (v|0x20) - 'a' + 10;
+}
+
+/* Handle floating-point numbers with radix 2^bits and binary exponent */
+static bool ieee_flconvert_bin(const char *string, int bits,
+ fp_limb *mant, int32_t *exponent)
+{
+ static const int log2tbl[16] =
+ { -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 };
+ fp_limb mult[MANT_LIMBS + 1], *mp;
+ int ms;
+ int32_t twopwr;
+ bool seendot, seendigit;
+ unsigned char c;
+ const int radix = 1 << bits;
+ fp_limb v;
+
+ twopwr = 0;
+ seendot = seendigit = false;
+ ms = 0;
+ mp = NULL;
+
+ memset(mult, 0, sizeof mult);
+
+ while ((c = *string++) != '\0') {
+ if (c == '.') {
+ if (!seendot)
+ seendot = true;
+ else {
+ nasm_error(ERR_NONFATAL,
+ "too many periods in floating-point constant");
+ return false;
+ }
+ } else if ((v = hexval(c)) < (unsigned int)radix) {
+ if (!seendigit && v) {
+ int l = log2tbl[v];
+
+ seendigit = true;
+ mp = mult;
+ ms = (LIMB_BITS-1)-l;
+
+ twopwr += l+1-bits;
+ }
+
+ if (seendigit) {
+ if (ms <= 0) {
+ *mp |= v >> -ms;
+ mp++;
+ if (mp > &mult[MANT_LIMBS])
+ mp = &mult[MANT_LIMBS]; /* Guard slot */
+ ms += LIMB_BITS;
+ }
+ *mp |= v << ms;
+ ms -= bits;
+
+ if (!seendot)
+ twopwr += bits;
+ } else {
+ if (seendot)
+ twopwr -= bits;
+ }
+ } else if (c == 'p' || c == 'P') {
+ int32_t e;
+ e = read_exponent(string, 20000);
+ if (e == INT32_MAX)
+ return false;
+ twopwr += e;
+ break;
+ } else if (c == '_') {
+ /* ignore */
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "floating-point constant: `%c' is invalid character", c);
+ return false;
+ }
+ }
+
+ if (!seendigit) {
+ memset(mant, 0, MANT_LIMBS*sizeof(fp_limb)); /* Zero */
+ *exponent = 0;
+ } else {
+ memcpy(mant, mult, MANT_LIMBS*sizeof(fp_limb));
+ *exponent = twopwr;
+ }
+
+ return true;
+}
+
+/*
+ * Shift a mantissa to the right by i bits.
+ */
+static void ieee_shr(fp_limb *mant, int i)
+{
+ fp_limb n, m;
+ int j = 0;
+ int sr, sl, offs;
+
+ sr = i % LIMB_BITS; sl = LIMB_BITS-sr;
+ offs = i/LIMB_BITS;
+
+ if (sr == 0) {
+ if (offs)
+ for (j = MANT_LIMBS-1; j >= offs; j--)
+ mant[j] = mant[j-offs];
+ } else if (MANT_LIMBS-1-offs < 0) {
+ j = MANT_LIMBS-1;
+ } else {
+ n = mant[MANT_LIMBS-1-offs] >> sr;
+ for (j = MANT_LIMBS-1; j > offs; j--) {
+ m = mant[j-offs-1];
+ mant[j] = (m << sl) | n;
+ n = m >> sr;
+ }
+ mant[j--] = n;
+ }
+ while (j >= 0)
+ mant[j--] = 0;
+}
+
+/* Produce standard IEEE formats, with implicit or explicit integer
+ bit; this makes the following assumptions:
+
+ - the sign bit is the MSB, followed by the exponent,
+ followed by the integer bit if present.
+ - the sign bit plus exponent fit in 16 bits.
+ - the exponent bias is 2^(n-1)-1 for an n-bit exponent */
+
+struct ieee_format {
+ int bytes;
+ int mantissa; /* Fractional bits in the mantissa */
+ int explicit; /* Explicit integer */
+ int exponent; /* Bits in the exponent */
+};
+
+/*
+ * The 16- and 128-bit formats are expected to be in IEEE 754r.
+ * AMD SSE5 uses the 16-bit format.
+ *
+ * The 32- and 64-bit formats are the original IEEE 754 formats.
+ *
+ * The 80-bit format is x87-specific, but widely used.
+ *
+ * The 8-bit format appears to be the consensus 8-bit floating-point
+ * format. It is apparently used in graphics applications.
+ */
+static const struct ieee_format ieee_8 = { 1, 3, 0, 4 };
+static const struct ieee_format ieee_16 = { 2, 10, 0, 5 };
+static const struct ieee_format ieee_32 = { 4, 23, 0, 8 };
+static const struct ieee_format ieee_64 = { 8, 52, 0, 11 };
+static const struct ieee_format ieee_80 = { 10, 63, 1, 15 };
+static const struct ieee_format ieee_128 = { 16, 112, 0, 15 };
+
+/* Types of values we can generate */
+enum floats {
+ FL_ZERO,
+ FL_DENORMAL,
+ FL_NORMAL,
+ FL_INFINITY,
+ FL_QNAN,
+ FL_SNAN
+};
+
+static int to_packed_bcd(const char *str, const char *p,
+ int s, uint8_t *result,
+ const struct ieee_format *fmt)
+{
+ int n = 0;
+ char c;
+ int tv = -1;
+
+ if (fmt != &ieee_80) {
+ nasm_error(ERR_NONFATAL,
+ "packed BCD requires an 80-bit format");
+ return 0;
+ }
+
+ while (p >= str) {
+ c = *p--;
+ if (c >= '0' && c <= '9') {
+ if (tv < 0) {
+ if (n == 9) {
+ nasm_error(ERR_WARNING|ERR_PASS2,
+ "packed BCD truncated to 18 digits");
+ }
+ tv = c-'0';
+ } else {
+ if (n < 9)
+ *result++ = tv + ((c-'0') << 4);
+ n++;
+ tv = -1;
+ }
+ } else if (c == '_') {
+ /* do nothing */
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "invalid character `%c' in packed BCD constant", c);
+ return 0;
+ }
+ }
+ if (tv >= 0) {
+ if (n < 9)
+ *result++ = tv;
+ n++;
+ }
+ while (n < 9) {
+ *result++ = 0;
+ n++;
+ }
+ *result = (s < 0) ? 0x80 : 0;
+
+ return 1; /* success */
+}
+
+static int to_float(const char *str, int s, uint8_t *result,
+ const struct ieee_format *fmt)
+{
+ fp_limb mant[MANT_LIMBS];
+ int32_t exponent = 0;
+ const int32_t expmax = 1 << (fmt->exponent - 1);
+ fp_limb one_mask = LIMB_TOP_BIT >>
+ ((fmt->exponent+fmt->explicit) % LIMB_BITS);
+ const int one_pos = (fmt->exponent+fmt->explicit)/LIMB_BITS;
+ int i;
+ int shift;
+ enum floats type;
+ bool ok;
+ const bool minus = s < 0;
+ const int bits = fmt->bytes * 8;
+ const char *strend;
+
+ nasm_assert(str[0]);
+
+ strend = strchr(str, '\0');
+ if (strend[-1] == 'P' || strend[-1] == 'p')
+ return to_packed_bcd(str, strend-2, s, result, fmt);
+
+ if (str[0] == '_') {
+ /* Special tokens */
+
+ switch (str[2]) {
+ case 'n': /* __nan__ */
+ case 'N':
+ case 'q': /* __qnan__ */
+ case 'Q':
+ type = FL_QNAN;
+ break;
+ case 's': /* __snan__ */
+ case 'S':
+ type = FL_SNAN;
+ break;
+ case 'i': /* __infinity__ */
+ case 'I':
+ type = FL_INFINITY;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL,
+ "internal error: unknown FP constant token `%s'\n", str);
+ type = FL_QNAN;
+ break;
+ }
+ } else {
+ if (str[0] == '0') {
+ switch (str[1]) {
+ case 'x': case 'X':
+ case 'h': case 'H':
+ ok = ieee_flconvert_bin(str+2, 4, mant, &exponent);
+ break;
+ case 'o': case 'O':
+ case 'q': case 'Q':
+ ok = ieee_flconvert_bin(str+2, 3, mant, &exponent);
+ break;
+ case 'b': case 'B':
+ case 'y': case 'Y':
+ ok = ieee_flconvert_bin(str+2, 1, mant, &exponent);
+ break;
+ case 'd': case 'D':
+ case 't': case 'T':
+ ok = ieee_flconvert(str+2, mant, &exponent);
+ break;
+ case 'p': case 'P':
+ return to_packed_bcd(str+2, strend-1, s, result, fmt);
+ default:
+ /* Leading zero was just a zero? */
+ ok = ieee_flconvert(str, mant, &exponent);
+ break;
+ }
+ } else if (str[0] == '$') {
+ ok = ieee_flconvert_bin(str+1, 4, mant, &exponent);
+ } else {
+ ok = ieee_flconvert(str, mant, &exponent);
+ }
+
+ if (!ok) {
+ type = FL_QNAN;
+ } else if (mant[0] & LIMB_TOP_BIT) {
+ /*
+ * Non-zero.
+ */
+ exponent--;
+ if (exponent >= 2 - expmax && exponent <= expmax) {
+ type = FL_NORMAL;
+ } else if (exponent > 0) {
+ if (pass0 == 1)
+ nasm_error(ERR_WARNING|ERR_WARN_FL_OVERFLOW|ERR_PASS2,
+ "overflow in floating-point constant");
+ type = FL_INFINITY;
+ } else {
+ /* underflow or denormal; the denormal code handles
+ actual underflow. */
+ type = FL_DENORMAL;
+ }
+ } else {
+ /* Zero */
+ type = FL_ZERO;
+ }
+ }
+
+ switch (type) {
+ case FL_ZERO:
+ zero:
+ memset(mant, 0, sizeof mant);
+ break;
+
+ case FL_DENORMAL:
+ {
+ shift = -(exponent + expmax - 2 - fmt->exponent)
+ + fmt->explicit;
+ ieee_shr(mant, shift);
+ ieee_round(minus, mant, bits);
+ if (mant[one_pos] & one_mask) {
+ /* One's position is set, we rounded up into normal range */
+ exponent = 1;
+ if (!fmt->explicit)
+ mant[one_pos] &= ~one_mask; /* remove explicit one */
+ mant[0] |= exponent << (LIMB_BITS-1 - fmt->exponent);
+ } else {
+ if (daz || is_zero(mant)) {
+ /* Flush denormals to zero */
+ nasm_error(ERR_WARNING|ERR_WARN_FL_UNDERFLOW|ERR_PASS2,
+ "underflow in floating-point constant");
+ goto zero;
+ } else {
+ nasm_error(ERR_WARNING|ERR_WARN_FL_DENORM|ERR_PASS2,
+ "denormal floating-point constant");
+ }
+ }
+ break;
+ }
+
+ case FL_NORMAL:
+ exponent += expmax - 1;
+ ieee_shr(mant, fmt->exponent+fmt->explicit);
+ ieee_round(minus, mant, bits);
+ /* did we scale up by one? */
+ if (test_bit(mant, fmt->exponent+fmt->explicit-1)) {
+ ieee_shr(mant, 1);
+ exponent++;
+ if (exponent >= (expmax << 1)-1) {
+ nasm_error(ERR_WARNING|ERR_WARN_FL_OVERFLOW|ERR_PASS2,
+ "overflow in floating-point constant");
+ type = FL_INFINITY;
+ goto overflow;
+ }
+ }
+
+ if (!fmt->explicit)
+ mant[one_pos] &= ~one_mask; /* remove explicit one */
+ mant[0] |= exponent << (LIMB_BITS-1 - fmt->exponent);
+ break;
+
+ case FL_INFINITY:
+ case FL_QNAN:
+ case FL_SNAN:
+ overflow:
+ memset(mant, 0, sizeof mant);
+ mant[0] = (((fp_limb)1 << fmt->exponent)-1)
+ << (LIMB_BITS-1 - fmt->exponent);
+ if (fmt->explicit)
+ mant[one_pos] |= one_mask;
+ if (type == FL_QNAN)
+ set_bit(mant, fmt->exponent+fmt->explicit+1);
+ else if (type == FL_SNAN)
+ set_bit(mant, fmt->exponent+fmt->explicit+fmt->mantissa);
+ break;
+ }
+
+ mant[0] |= minus ? LIMB_TOP_BIT : 0;
+
+ for (i = fmt->bytes - 1; i >= 0; i--)
+ *result++ = mant[i/LIMB_BYTES] >> (((LIMB_BYTES-1)-(i%LIMB_BYTES))*8);
+
+ return 1; /* success */
+}
+
+int float_const(const char *number, int sign, uint8_t *result, int bytes)
+{
+ switch (bytes) {
+ case 1:
+ return to_float(number, sign, result, &ieee_8);
+ case 2:
+ return to_float(number, sign, result, &ieee_16);
+ case 4:
+ return to_float(number, sign, result, &ieee_32);
+ case 8:
+ return to_float(number, sign, result, &ieee_64);
+ case 10:
+ return to_float(number, sign, result, &ieee_80);
+ case 16:
+ return to_float(number, sign, result, &ieee_128);
+ default:
+ nasm_panic("strange value %d passed to float_const", bytes);
+ return 0;
+ }
+}
+
+/* Set floating-point options */
+int float_option(const char *option)
+{
+ if (!nasm_stricmp(option, "daz")) {
+ daz = true;
+ return 0;
+ } else if (!nasm_stricmp(option, "nodaz")) {
+ daz = false;
+ return 0;
+ } else if (!nasm_stricmp(option, "near")) {
+ rc = FLOAT_RC_NEAR;
+ return 0;
+ } else if (!nasm_stricmp(option, "down")) {
+ rc = FLOAT_RC_DOWN;
+ return 0;
+ } else if (!nasm_stricmp(option, "up")) {
+ rc = FLOAT_RC_UP;
+ return 0;
+ } else if (!nasm_stricmp(option, "zero")) {
+ rc = FLOAT_RC_ZERO;
+ return 0;
+ } else if (!nasm_stricmp(option, "default")) {
+ rc = FLOAT_RC_NEAR;
+ daz = false;
+ return 0;
+ } else {
+ return -1; /* Unknown option */
+ }
+}
diff --git a/asm/float.h b/asm/float.h
new file mode 100644
index 00000000..b07e542a
--- /dev/null
+++ b/asm/float.h
@@ -0,0 +1,54 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * float.h header file for the floating-point constant module of
+ * the Netwide Assembler
+ */
+
+#ifndef NASM_FLOAT_H
+#define NASM_FLOAT_H
+
+#include "nasm.h"
+
+enum float_round {
+ FLOAT_RC_NEAR,
+ FLOAT_RC_ZERO,
+ FLOAT_RC_DOWN,
+ FLOAT_RC_UP
+};
+
+int float_const(const char *string, int sign, uint8_t *result, int bytes);
+int float_option(const char *option);
+
+#endif
diff --git a/asm/labels.c b/asm/labels.c
new file mode 100644
index 00000000..c00d6e5b
--- /dev/null
+++ b/asm/labels.c
@@ -0,0 +1,652 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * labels.c label handling for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "hashtbl.h"
+#include "labels.h"
+
+/*
+ * A dot-local label is one that begins with exactly one period. Things
+ * that begin with _two_ periods are NASM-specific things.
+ *
+ * If TASM compatibility is enabled, a local label can also begin with
+ * @@.
+ */
+static bool islocal(const char *l)
+{
+ if (tasm_compatible_mode) {
+ if (l[0] == '@' && l[1] == '@')
+ return true;
+ }
+
+ return (l[0] == '.' && l[1] != '.');
+}
+
+/*
+ * Return true if this falls into NASM's '..' namespace
+ */
+static bool ismagic(const char *l)
+{
+ return l[0] == '.' && l[1] == '.' && l[2] != '@';
+}
+
+/*
+ * Return true if we should update the local label base
+ * as a result of this symbol. We must exclude local labels
+ * as well as any kind of special labels, including ..@ ones.
+ */
+static bool set_prevlabel(const char *l)
+{
+ if (tasm_compatible_mode) {
+ if (l[0] == '@' && l[1] == '@')
+ return false;
+ }
+
+ return l[0] != '.';
+}
+
+#define LABEL_BLOCK 128 /* no. of labels/block */
+#define LBLK_SIZE (LABEL_BLOCK * sizeof(union label))
+
+#define END_LIST -3 /* don't clash with NO_SEG! */
+#define END_BLOCK -2
+
+#define PERMTS_SIZE 16384 /* size of text blocks */
+#if (PERMTS_SIZE < IDLEN_MAX)
+ #error "IPERMTS_SIZE must be greater than or equal to IDLEN_MAX"
+#endif
+
+/* string values for enum label_type */
+static const char * const types[] =
+{"local", "global", "static", "extern", "common", "special",
+ "output format special"};
+
+union label { /* actual label structures */
+ struct {
+ int32_t segment;
+ int32_t subsection; /* Available for ofmt->herelabel() */
+ int64_t offset;
+ int64_t size;
+ char *label, *mangled, *special;
+ enum label_type type, mangled_type;
+ bool defined;
+ } defn;
+ struct {
+ int32_t movingon;
+ int64_t dummy;
+ union label *next;
+ } admin;
+};
+
+struct permts { /* permanent text storage */
+ struct permts *next; /* for the linked list */
+ unsigned int size, usage; /* size and used space in ... */
+ char data[PERMTS_SIZE]; /* ... the data block itself */
+};
+#define PERMTS_HEADER offsetof(struct permts, data)
+
+uint64_t global_offset_changed; /* counter for global offset changes */
+
+static struct hash_table ltab; /* labels hash table */
+static union label *ldata; /* all label data blocks */
+static union label *lfree; /* labels free block */
+static struct permts *perm_head; /* start of perm. text storage */
+static struct permts *perm_tail; /* end of perm. text storage */
+
+static void init_block(union label *blk);
+static char *perm_alloc(size_t len);
+static char *perm_copy(const char *string);
+static char *perm_copy3(const char *s1, const char *s2, const char *s3);
+static const char *mangle_label_name(union label *lptr);
+
+static const char *prevlabel;
+
+static bool initialized = false;
+
+/*
+ * Emit a symdef to the output and the debug format backends.
+ */
+static void out_symdef(union label *lptr)
+{
+ int backend_type;
+ int64_t backend_offset;
+
+ /* Backend-defined special segments are passed to symdef immediately */
+ if (pass0 == 2) {
+ /* Emit special fixups for globals and commons */
+ switch (lptr->defn.type) {
+ case LBL_GLOBAL:
+ case LBL_EXTERN:
+ case LBL_COMMON:
+ if (lptr->defn.special)
+ ofmt->symdef(lptr->defn.mangled, 0, 0, 3, lptr->defn.special);
+ break;
+ default:
+ break;
+ }
+ return;
+ }
+
+ if (pass0 != 1 && lptr->defn.type != LBL_BACKEND)
+ return;
+
+ /* Clean up this hack... */
+ switch(lptr->defn.type) {
+ case LBL_GLOBAL:
+ case LBL_EXTERN:
+ backend_type = 1;
+ backend_offset = lptr->defn.offset;
+ break;
+ case LBL_COMMON:
+ backend_type = 2;
+ backend_offset = lptr->defn.size;
+ break;
+ default:
+ backend_type = 0;
+ backend_offset = lptr->defn.offset;
+ break;
+ }
+
+ /* Might be necessary for a backend symbol */
+ mangle_label_name(lptr);
+
+ ofmt->symdef(lptr->defn.mangled, lptr->defn.segment,
+ backend_offset, backend_type,
+ lptr->defn.special);
+
+ /*
+ * NASM special symbols are not passed to the debug format; none
+ * of the current backends want to see them.
+ */
+ if (lptr->defn.type == LBL_SPECIAL || lptr->defn.type == LBL_BACKEND)
+ return;
+
+ dfmt->debug_deflabel(lptr->defn.mangled, lptr->defn.segment,
+ lptr->defn.offset, backend_type,
+ lptr->defn.special);
+}
+
+/*
+ * Internal routine: finds the `union label' corresponding to the
+ * given label name. Creates a new one, if it isn't found, and if
+ * `create' is true.
+ */
+static union label *find_label(const char *label, bool create, bool *created)
+{
+ union label *lptr, **lpp;
+ char *label_str = NULL;
+ struct hash_insert ip;
+
+ nasm_assert(label != NULL);
+
+ if (islocal(label))
+ label = label_str = nasm_strcat(prevlabel, label);
+
+ lpp = (union label **) hash_find(&ltab, label, &ip);
+ lptr = lpp ? *lpp : NULL;
+
+ if (lptr || !create) {
+ if (created)
+ *created = false;
+ return lptr;
+ }
+
+ /* Create a new label... */
+ if (lfree->admin.movingon == END_BLOCK) {
+ /*
+ * must allocate a new block
+ */
+ lfree->admin.next = nasm_malloc(LBLK_SIZE);
+ lfree = lfree->admin.next;
+ init_block(lfree);
+ }
+
+ if (created)
+ *created = true;
+
+ nasm_zero(*lfree);
+ lfree->defn.label = perm_copy(label);
+ lfree->defn.subsection = NO_SEG;
+ if (label_str)
+ nasm_free(label_str);
+
+ hash_add(&ip, lfree->defn.label, lfree);
+ return lfree++;
+}
+
+bool lookup_label(const char *label, int32_t *segment, int64_t *offset)
+{
+ union label *lptr;
+
+ if (!initialized)
+ return false;
+
+ lptr = find_label(label, false, NULL);
+ if (lptr && lptr->defn.defined) {
+ *segment = lptr->defn.segment;
+ *offset = lptr->defn.offset;
+ return true;
+ }
+
+ return false;
+}
+
+bool is_extern(const char *label)
+{
+ union label *lptr;
+
+ if (!initialized)
+ return false;
+
+ lptr = find_label(label, false, NULL);
+ return lptr && lptr->defn.type == LBL_EXTERN;
+}
+
+static const char *mangle_strings[] = {"", "", "", ""};
+static bool mangle_string_set[ARRAY_SIZE(mangle_strings)];
+
+/*
+ * Set a prefix or suffix
+ */
+void set_label_mangle(enum mangle_index which, const char *what)
+{
+ if (mangle_string_set[which])
+ return; /* Once set, do not change */
+
+ mangle_strings[which] = perm_copy(what);
+ mangle_string_set[which] = true;
+}
+
+/*
+ * Format a label name with appropriate prefixes and suffixes
+ */
+static const char *mangle_label_name(union label *lptr)
+{
+ const char *prefix;
+ const char *suffix;
+
+ if (likely(lptr->defn.mangled &&
+ lptr->defn.mangled_type == lptr->defn.type))
+ return lptr->defn.mangled; /* Already mangled */
+
+ switch (lptr->defn.type) {
+ case LBL_GLOBAL:
+ case LBL_STATIC:
+ case LBL_EXTERN:
+ prefix = mangle_strings[LM_GPREFIX];
+ suffix = mangle_strings[LM_GSUFFIX];
+ break;
+ case LBL_BACKEND:
+ case LBL_SPECIAL:
+ prefix = suffix = "";
+ break;
+ default:
+ prefix = mangle_strings[LM_LPREFIX];
+ suffix = mangle_strings[LM_LSUFFIX];
+ break;
+ }
+
+ lptr->defn.mangled_type = lptr->defn.type;
+
+ if (!(*prefix) && !(*suffix))
+ lptr->defn.mangled = lptr->defn.label;
+ else
+ lptr->defn.mangled = perm_copy3(prefix, lptr->defn.label, suffix);
+
+ return lptr->defn.mangled;
+}
+
+static void
+handle_herelabel(union label *lptr, int32_t *segment, int64_t *offset)
+{
+ int32_t oldseg;
+
+ if (likely(!ofmt->herelabel))
+ return;
+
+ if (unlikely(location.segment == NO_SEG))
+ return;
+
+ oldseg = *segment;
+
+ if (oldseg == location.segment && *offset == location.offset) {
+ /* This label is defined at this location */
+ int32_t newseg;
+ bool copyoffset = false;
+
+ nasm_assert(lptr->defn.mangled);
+ newseg = ofmt->herelabel(lptr->defn.mangled, lptr->defn.type,
+ oldseg, &lptr->defn.subsection, &copyoffset);
+ if (likely(newseg == oldseg))
+ return;
+
+ *segment = newseg;
+ if (copyoffset) {
+ /* Maintain the offset from the old to the new segment */
+ switch_segment(newseg);
+ location.offset = *offset;
+ } else {
+ /* Keep a separate offset for the new segment */
+ *offset = switch_segment(newseg);
+ }
+ }
+}
+
+static bool declare_label_lptr(union label *lptr,
+ enum label_type type, const char *special)
+{
+ if (special && !special[0])
+ special = NULL;
+
+ if (lptr->defn.type == type ||
+ (pass0 == 0 && lptr->defn.type == LBL_LOCAL)) {
+ lptr->defn.type = type;
+ if (special) {
+ if (!lptr->defn.special)
+ lptr->defn.special = perm_copy(special);
+ else if (nasm_stricmp(lptr->defn.special, special))
+ nasm_error(ERR_NONFATAL,
+ "symbol `%s' has inconsistent attributes `%s' and `%s'",
+ lptr->defn.label, lptr->defn.special, special);
+ }
+ return true;
+ }
+
+ /* EXTERN can be replaced with GLOBAL or COMMON */
+ if (lptr->defn.type == LBL_EXTERN &&
+ (type == LBL_GLOBAL || type == LBL_COMMON)) {
+ lptr->defn.type = type;
+ /* Override special unconditionally */
+ if (special)
+ lptr->defn.special = perm_copy(special);
+ return true;
+ }
+
+ /* GLOBAL or COMMON ignore subsequent EXTERN */
+ if ((lptr->defn.type == LBL_GLOBAL || lptr->defn.type == LBL_COMMON) &&
+ type == LBL_EXTERN) {
+ if (!lptr->defn.special)
+ lptr->defn.special = perm_copy(special);
+ return false; /* Don't call define_label() after this! */
+ }
+
+ nasm_error(ERR_NONFATAL, "symbol `%s' declared both as %s and %s",
+ lptr->defn.label, types[lptr->defn.type], types[type]);
+
+ return false;
+}
+
+bool declare_label(const char *label, enum label_type type, const char *special)
+{
+ union label *lptr = find_label(label, true, NULL);
+ return declare_label_lptr(lptr, type, special);
+}
+
+/*
+ * The "normal" argument decides if we should update the local segment
+ * base name or not.
+ */
+void define_label(const char *label, int32_t segment,
+ int64_t offset, bool normal)
+{
+ union label *lptr;
+ bool created, changed;
+ int64_t size;
+
+ /*
+ * Phase errors here can be one of two types: a new label appears,
+ * or the offset changes. Increment global_offset_changed when that
+ * happens, to tell the assembler core to make another pass.
+ */
+ lptr = find_label(label, true, &created);
+
+ if (segment) {
+ /* We are actually defining this label */
+ if (lptr->defn.type == LBL_EXTERN) /* auto-promote EXTERN to GLOBAL */
+ lptr->defn.type = LBL_GLOBAL;
+ } else {
+ /* It's a pseudo-segment (extern, common) */
+ segment = lptr->defn.segment ? lptr->defn.segment : seg_alloc();
+ }
+
+ if (lptr->defn.defined || lptr->defn.type == LBL_BACKEND) {
+ /* We have seen this on at least one previous pass */
+ mangle_label_name(lptr);
+ handle_herelabel(lptr, &segment, &offset);
+ }
+
+ if (ismagic(label) && lptr->defn.type == LBL_LOCAL)
+ lptr->defn.type = LBL_SPECIAL;
+
+ if (set_prevlabel(label) && normal)
+ prevlabel = lptr->defn.label;
+
+ if (lptr->defn.type == LBL_COMMON) {
+ size = offset;
+ offset = 0;
+ } else {
+ size = 0; /* This is a hack... */
+ }
+
+ changed = created || !lptr->defn.defined ||
+ lptr->defn.segment != segment ||
+ lptr->defn.offset != offset || lptr->defn.size != size;
+ global_offset_changed += changed;
+
+ /*
+ * This probably should be ERR_NONFATAL, but not quite yet. As a
+ * special case, LBL_SPECIAL symbols are allowed to be changed
+ * even during the last pass.
+ */
+ if (changed && pass0 > 1 && lptr->defn.type != LBL_SPECIAL) {
+ nasm_error(ERR_WARNING, "label `%s' %s during code generation",
+ lptr->defn.label,
+ created ? "defined" : "changed");
+ }
+
+ lptr->defn.segment = segment;
+ lptr->defn.offset = offset;
+ lptr->defn.size = size;
+ lptr->defn.defined = true;
+
+ out_symdef(lptr);
+}
+
+/*
+ * Define a special backend label
+ */
+void backend_label(const char *label, int32_t segment, int64_t offset)
+{
+ if (!declare_label(label, LBL_BACKEND, NULL))
+ return;
+
+ define_label(label, segment, offset, false);
+}
+
+int init_labels(void)
+{
+ hash_init(&ltab, HASH_LARGE);
+
+ ldata = lfree = nasm_malloc(LBLK_SIZE);
+ init_block(lfree);
+
+ perm_head = perm_tail =
+ nasm_malloc(sizeof(struct permts));
+
+ perm_head->next = NULL;
+ perm_head->size = PERMTS_SIZE;
+ perm_head->usage = 0;
+
+ prevlabel = "";
+
+ initialized = true;
+
+ return 0;
+}
+
+void cleanup_labels(void)
+{
+ union label *lptr, *lhold;
+
+ initialized = false;
+
+ hash_free(&ltab);
+
+ lptr = lhold = ldata;
+ while (lptr) {
+ lptr = &lptr[LABEL_BLOCK-1];
+ lptr = lptr->admin.next;
+ nasm_free(lhold);
+ lhold = lptr;
+ }
+
+ while (perm_head) {
+ perm_tail = perm_head;
+ perm_head = perm_head->next;
+ nasm_free(perm_tail);
+ }
+}
+
+static void init_block(union label *blk)
+{
+ int j;
+
+ for (j = 0; j < LABEL_BLOCK - 1; j++)
+ blk[j].admin.movingon = END_LIST;
+ blk[LABEL_BLOCK - 1].admin.movingon = END_BLOCK;
+ blk[LABEL_BLOCK - 1].admin.next = NULL;
+}
+
+static char * safe_alloc perm_alloc(size_t len)
+{
+ char *p;
+
+ if (perm_tail->size - perm_tail->usage < len) {
+ size_t alloc_len = (len > PERMTS_SIZE) ? len : PERMTS_SIZE;
+ perm_tail->next = nasm_malloc(PERMTS_HEADER + alloc_len);
+ perm_tail = perm_tail->next;
+ perm_tail->next = NULL;
+ perm_tail->size = alloc_len;
+ perm_tail->usage = 0;
+ }
+ p = perm_tail->data + perm_tail->usage;
+ perm_tail->usage += len;
+ return p;
+}
+
+static char *perm_copy(const char *string)
+{
+ char *p;
+ size_t len;
+
+ if (!string)
+ return NULL;
+
+ len = strlen(string)+1; /* Include final NUL */
+
+ p = perm_alloc(len);
+ memcpy(p, string, len);
+
+ return p;
+}
+
+static char *
+perm_copy3(const char *s1, const char *s2, const char *s3)
+{
+ char *p;
+ size_t l1 = strlen(s1);
+ size_t l2 = strlen(s2);
+ size_t l3 = strlen(s3)+1; /* Include final NUL */
+
+ p = perm_alloc(l1+l2+l3);
+ memcpy(p, s1, l1);
+ memcpy(p+l1, s2, l2);
+ memcpy(p+l1+l2, s3, l3);
+
+ return p;
+}
+
+const char *local_scope(const char *label)
+{
+ return islocal(label) ? prevlabel : "";
+}
+
+/*
+ * Notes regarding bug involving redefinition of external segments.
+ *
+ * Up to and including v0.97, the following code didn't work. From 0.97
+ * developers release 2 onwards, it will generate an error.
+ *
+ * EXTERN extlabel
+ * newlabel EQU extlabel + 1
+ *
+ * The results of allowing this code through are that two import records
+ * are generated, one for 'extlabel' and one for 'newlabel'.
+ *
+ * The reason for this is an inadequacy in the defined interface between
+ * the label manager and the output formats. The problem lies in how the
+ * output format driver tells that a label is an external label for which
+ * a label import record must be produced. Most (all except bin?) produce
+ * the record if the segment number of the label is not one of the internal
+ * segments that the output driver is producing.
+ *
+ * A simple fix to this would be to make the output formats keep track of
+ * which symbols they've produced import records for, and make them not
+ * produce import records for segments that are already defined.
+ *
+ * The best way, which is slightly harder but reduces duplication of code
+ * and should therefore make the entire system smaller and more stable is
+ * to change the interface between assembler, define_label(), and
+ * the output module. The changes that are needed are:
+ *
+ * The semantics of the 'isextern' flag passed to define_label() need
+ * examining. This information may or may not tell us what we need to
+ * know (ie should we be generating an import record at this point for this
+ * label). If these aren't the semantics, the semantics should be changed
+ * to this.
+ *
+ * The output module interface needs changing, so that the `isextern' flag
+ * is passed to the module, so that it can be easily tested for.
+ */
diff --git a/asm/listing.c b/asm/listing.c
new file mode 100644
index 00000000..6c459e13
--- /dev/null
+++ b/asm/listing.c
@@ -0,0 +1,355 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * listing.c listing file generator for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "listing.h"
+
+#define LIST_MAX_LEN 216 /* something sensible */
+#define LIST_INDENT 40
+#define LIST_HEXBIT 18
+
+typedef struct MacroInhibit MacroInhibit;
+
+static struct MacroInhibit {
+ MacroInhibit *next;
+ int level;
+ int inhibiting;
+} *mistack;
+
+static char xdigit[] = "0123456789ABCDEF";
+
+#define HEX(a,b) (*(a)=xdigit[((b)>>4)&15],(a)[1]=xdigit[(b)&15]);
+
+static char listline[LIST_MAX_LEN];
+static bool listlinep;
+
+static char listerror[LIST_MAX_LEN];
+
+static char listdata[2 * LIST_INDENT]; /* we need less than that actually */
+static int32_t listoffset;
+
+static int32_t listlineno;
+
+static int32_t listp;
+
+static int suppress; /* for INCBIN & TIMES special cases */
+
+static int listlevel, listlevel_e;
+
+static FILE *listfp;
+
+static void list_emit(void)
+{
+ int i;
+
+ if (!listlinep && !listdata[0])
+ return;
+
+ fprintf(listfp, "%6"PRId32" ", listlineno);
+
+ if (listdata[0])
+ fprintf(listfp, "%08"PRIX32" %-*s", listoffset, LIST_HEXBIT + 1,
+ listdata);
+ else
+ fprintf(listfp, "%*s", LIST_HEXBIT + 10, "");
+
+ if (listlevel_e)
+ fprintf(listfp, "%s<%d>", (listlevel < 10 ? " " : ""),
+ listlevel_e);
+ else if (listlinep)
+ fprintf(listfp, " ");
+
+ if (listlinep)
+ fprintf(listfp, " %s", listline);
+
+ putc('\n', listfp);
+ listlinep = false;
+ listdata[0] = '\0';
+
+ if (listerror[0]) {
+ fprintf(listfp, "%6"PRId32" ", listlineno);
+ for (i = 0; i < LIST_HEXBIT; i++)
+ putc('*', listfp);
+
+ if (listlevel_e)
+ fprintf(listfp, " %s<%d>", (listlevel < 10 ? " " : ""),
+ listlevel_e);
+ else
+ fprintf(listfp, " ");
+
+ fprintf(listfp, " %s\n", listerror);
+ listerror[0] = '\0';
+ }
+}
+
+static void list_init(const char *fname)
+{
+ if (!fname || fname[0] == '\0') {
+ listfp = NULL;
+ return;
+ }
+
+ listfp = nasm_open_write(fname, NF_TEXT);
+ if (!listfp) {
+ nasm_error(ERR_NONFATAL, "unable to open listing file `%s'",
+ fname);
+ return;
+ }
+
+ *listline = '\0';
+ listlineno = 0;
+ *listerror = '\0';
+ listp = true;
+ listlevel = 0;
+ suppress = 0;
+ mistack = nasm_malloc(sizeof(MacroInhibit));
+ mistack->next = NULL;
+ mistack->level = 0;
+ mistack->inhibiting = true;
+}
+
+static void list_cleanup(void)
+{
+ if (!listp)
+ return;
+
+ while (mistack) {
+ MacroInhibit *temp = mistack;
+ mistack = temp->next;
+ nasm_free(temp);
+ }
+
+ list_emit();
+ fclose(listfp);
+}
+
+static void list_out(int64_t offset, char *str)
+{
+ if (strlen(listdata) + strlen(str) > LIST_HEXBIT) {
+ strcat(listdata, "-");
+ list_emit();
+ }
+ if (!listdata[0])
+ listoffset = offset;
+ strcat(listdata, str);
+}
+
+static void list_address(int64_t offset, const char *brackets,
+ int64_t addr, int size)
+{
+ char q[20];
+ char *r = q;
+
+ nasm_assert(size <= 8);
+
+ *r++ = brackets[0];
+ while (size--) {
+ HEX(r, addr);
+ addr >>= 8;
+ r += 2;
+ }
+ *r++ = brackets[1];
+ *r = '\0';
+ list_out(offset, q);
+}
+
+static void list_output(const struct out_data *data)
+{
+ char q[24];
+ uint64_t size = data->size;
+ uint64_t offset = data->offset;
+ const uint8_t *p = data->data;
+
+
+ if (!listp || suppress || user_nolist)
+ return;
+
+ switch (data->type) {
+ case OUT_ZERODATA:
+ if (size > 16) {
+ snprintf(q, sizeof(q), "<zero %08"PRIX64">", size);
+ list_out(offset, q);
+ break;
+ } else {
+ p = zero_buffer;
+ }
+ /* fall through */
+ case OUT_RAWDATA:
+ {
+ if (size == 0 && !listdata[0])
+ listoffset = data->offset;
+ while (size--) {
+ HEX(q, *p);
+ q[2] = '\0';
+ list_out(offset++, q);
+ p++;
+ }
+ break;
+ }
+ case OUT_ADDRESS:
+ list_address(offset, "[]", data->toffset, size);
+ break;
+ case OUT_SEGMENT:
+ q[0] = '[';
+ memset(q+1, 's', size << 1);
+ q[(size << 1)+1] = ']';
+ q[(size << 1)+2] = '\0';
+ list_out(offset, q);
+ offset += size;
+ break;
+ case OUT_RELADDR:
+ list_address(offset, "()", data->toffset, size);
+ break;
+ case OUT_RESERVE:
+ {
+ snprintf(q, sizeof(q), "<res %08"PRIX64">", size);
+ list_out(offset, q);
+ break;
+ }
+ default:
+ panic();
+ }
+}
+
+static void list_line(int type, char *line)
+{
+ if (!listp)
+ return;
+
+ if (user_nolist)
+ return;
+
+ if (mistack && mistack->inhibiting) {
+ if (type == LIST_MACRO)
+ return;
+ else { /* pop the m i stack */
+ MacroInhibit *temp = mistack;
+ mistack = temp->next;
+ nasm_free(temp);
+ }
+ }
+ list_emit();
+ listlineno = src_get_linnum();
+ listlinep = true;
+ strncpy(listline, line, LIST_MAX_LEN - 1);
+ listline[LIST_MAX_LEN - 1] = '\0';
+ listlevel_e = listlevel;
+}
+
+static void list_uplevel(int type)
+{
+ if (!listp)
+ return;
+ if (type == LIST_INCBIN || type == LIST_TIMES) {
+ suppress |= (type == LIST_INCBIN ? 1 : 2);
+ list_out(listoffset, type == LIST_INCBIN ? "<incbin>" : "<rept>");
+ return;
+ }
+
+ listlevel++;
+
+ if (mistack && mistack->inhibiting && type == LIST_INCLUDE) {
+ MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit));
+ temp->next = mistack;
+ temp->level = listlevel;
+ temp->inhibiting = false;
+ mistack = temp;
+ } else if (type == LIST_MACRO_NOLIST) {
+ MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit));
+ temp->next = mistack;
+ temp->level = listlevel;
+ temp->inhibiting = true;
+ mistack = temp;
+ }
+}
+
+static void list_downlevel(int type)
+{
+ if (!listp)
+ return;
+
+ if (type == LIST_INCBIN || type == LIST_TIMES) {
+ suppress &= ~(type == LIST_INCBIN ? 1 : 2);
+ return;
+ }
+
+ listlevel--;
+ while (mistack && mistack->level > listlevel) {
+ MacroInhibit *temp = mistack;
+ mistack = temp->next;
+ nasm_free(temp);
+ }
+}
+
+static void list_error(int severity, const char *pfx, const char *msg)
+{
+ if (!listfp)
+ return;
+
+ snprintf(listerror, sizeof listerror, "%s%s", pfx, msg);
+
+ if ((severity & ERR_MASK) >= ERR_FATAL)
+ list_emit();
+}
+
+static void list_set_offset(uint64_t offset)
+{
+ listoffset = offset;
+}
+
+static const struct lfmt nasm_list = {
+ list_init,
+ list_cleanup,
+ list_output,
+ list_line,
+ list_uplevel,
+ list_downlevel,
+ list_error,
+ list_set_offset
+};
+
+const struct lfmt *lfmt = &nasm_list;
diff --git a/asm/listing.h b/asm/listing.h
new file mode 100644
index 00000000..df88e8a8
--- /dev/null
+++ b/asm/listing.h
@@ -0,0 +1,113 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * listing.h header file for listing.c
+ */
+
+#ifndef NASM_LISTING_H
+#define NASM_LISTING_H
+
+/*
+ * List-file generators should look like this:
+ */
+struct lfmt {
+ /*
+ * Called to initialize the listing file generator. Before this
+ * is called, the other routines will silently do nothing when
+ * called. The `char *' parameter is the file name to write the
+ * listing to.
+ */
+ void (*init)(const char *fname);
+
+ /*
+ * Called to clear stuff up and close the listing file.
+ */
+ void (*cleanup)(void);
+
+ /*
+ * Called to output binary data. Parameters are: the offset;
+ * the data; the data type. Data types are similar to the
+ * output-format interface, only OUT_ADDRESS will _always_ be
+ * displayed as if it's relocatable, so ensure that any non-
+ * relocatable address has been converted to OUT_RAWDATA by
+ * then.
+ */
+ void (*output)(const struct out_data *data);
+
+ /*
+ * Called to send a text line to the listing generator. The
+ * `int' parameter is LIST_READ or LIST_MACRO depending on
+ * whether the line came directly from an input file or is the
+ * result of a multi-line macro expansion.
+ */
+ void (*line)(int type, char *line);
+
+ /*
+ * Called to change one of the various levelled mechanisms in
+ * the listing generator. LIST_INCLUDE and LIST_MACRO can be
+ * used to increase the nesting level of include files and
+ * macro expansions; LIST_TIMES and LIST_INCBIN switch on the
+ * two binary-output-suppression mechanisms for large-scale
+ * pseudo-instructions.
+ *
+ * LIST_MACRO_NOLIST is synonymous with LIST_MACRO except that
+ * it indicates the beginning of the expansion of a `nolist'
+ * macro, so anything under that level won't be expanded unless
+ * it includes another file.
+ */
+ void (*uplevel)(int type);
+
+ /*
+ * Reverse the effects of uplevel.
+ */
+ void (*downlevel)(int type);
+
+ /*
+ * Called on a warning or error, with the error message.
+ */
+ void (*error)(int severity, const char *pfx, const char *msg);
+
+ /*
+ * Update the current offset. Used to give the listing generator
+ * an offset to work with when doing things like
+ * uplevel(LIST_TIMES) or uplevel(LIST_INCBIN); see
+ * list_set_offset();
+ */
+ void (*set_offset)(uint64_t offset);
+};
+
+extern const struct lfmt *lfmt;
+extern bool user_nolist;
+
+#endif
diff --git a/asm/nasm.c b/asm/nasm.c
new file mode 100644
index 00000000..ad05e44f
--- /dev/null
+++ b/asm/nasm.c
@@ -0,0 +1,2017 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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 Netwide Assembler main program module
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "float.h"
+#include "stdscan.h"
+#include "insns.h"
+#include "preproc.h"
+#include "parser.h"
+#include "eval.h"
+#include "assemble.h"
+#include "labels.h"
+#include "outform.h"
+#include "listing.h"
+#include "iflag.h"
+#include "ver.h"
+
+/*
+ * This is the maximum number of optimization passes to do. If we ever
+ * find a case where the optimizer doesn't naturally converge, we might
+ * have to drop this value so the assembler doesn't appear to just hang.
+ */
+#define MAX_OPTIMIZE (INT_MAX >> 1)
+
+struct forwrefinfo { /* info held on forward refs. */
+ int lineno;
+ int operand;
+};
+
+static void parse_cmdline(int, char **, int);
+static void assemble_file(const char *, StrList *);
+static bool is_suppressed_warning(int severity);
+static bool skip_this_pass(int severity);
+static void nasm_verror_gnu(int severity, const char *fmt, va_list args);
+static void nasm_verror_vc(int severity, const char *fmt, va_list args);
+static void nasm_verror_common(int severity, const char *fmt, va_list args);
+static void usage(void);
+static void help(char xopt);
+
+static bool using_debug_info, opt_verbose_info;
+static const char *debug_format;
+
+#ifndef ABORT_ON_PANIC
+# define ABORT_ON_PANIC 0
+#endif
+static bool abort_on_panic = ABORT_ON_PANIC;
+static bool keep_all;
+
+bool tasm_compatible_mode = false;
+int pass0;
+int64_t passn;
+static int pass1, pass2; /* XXX: Get rid of these, they are redundant */
+int globalrel = 0;
+int globalbnd = 0;
+
+struct compile_time official_compile_time;
+
+const char *inname;
+const char *outname;
+static const char *listname;
+static const char *errname;
+
+static int64_t globallineno; /* for forward-reference tracking */
+
+/* static int pass = 0; */
+const struct ofmt *ofmt = &OF_DEFAULT;
+const struct ofmt_alias *ofmt_alias = NULL;
+const struct dfmt *dfmt;
+
+static FILE *error_file; /* Where to write error messages */
+
+FILE *ofile = NULL;
+struct optimization optimizing =
+ { MAX_OPTIMIZE, OPTIM_ALL_ENABLED }; /* number of optimization passes to take */
+static int cmd_sb = 16; /* by default */
+
+iflag_t cpu;
+static iflag_t cmd_cpu;
+
+struct location location;
+bool in_absolute; /* Flag we are in ABSOLUTE seg */
+struct location absolute; /* Segment/offset inside ABSOLUTE */
+
+static struct RAA *offsets;
+
+static struct SAA *forwrefs; /* keep track of forward references */
+static const struct forwrefinfo *forwref;
+
+static const struct preproc_ops *preproc;
+
+#define OP_NORMAL (1u << 0)
+#define OP_PREPROCESS (1u << 1)
+#define OP_DEPEND (1u << 2)
+
+static unsigned int operating_mode;
+
+/* Dependency flags */
+static bool depend_emit_phony = false;
+static bool depend_missing_ok = false;
+static const char *depend_target = NULL;
+static const char *depend_file = NULL;
+StrList *depend_list;
+
+static bool want_usage;
+static bool terminate_after_phase;
+bool user_nolist = false;
+
+static char *quote_for_pmake(const char *str);
+static char *quote_for_wmake(const char *str);
+static char *(*quote_for_make)(const char *) = quote_for_pmake;
+
+/*
+ * Execution limits that can be set via a command-line option or %pragma
+ */
+
+#define LIMIT_MAX_VAL (INT64_MAX >> 1) /* Effectively unlimited */
+
+int64_t nasm_limit[LIMIT_MAX+1] =
+{ LIMIT_MAX_VAL, 1000, 1000000, 1000000, 1000000, 2000000000 };
+
+struct limit_info {
+ const char *name;
+ const char *help;
+};
+static const struct limit_info limit_info[LIMIT_MAX+1] = {
+ { "passes", "total number of passes" },
+ { "stalled-passes", "number of passes without forward progress" },
+ { "macro-levels", "levels of macro expansion"},
+ { "rep", "%rep count" },
+ { "eval", "expression evaluation descent"},
+ { "lines", "total source lines processed"}
+};
+
+enum directive_result
+nasm_set_limit(const char *limit, const char *valstr)
+{
+ int i;
+ int64_t val;
+ bool rn_error;
+ int errlevel;
+
+ for (i = 0; i <= LIMIT_MAX; i++) {
+ if (!nasm_stricmp(limit, limit_info[i].name))
+ break;
+ }
+ if (i > LIMIT_MAX) {
+ if (passn == 0)
+ errlevel = ERR_WARNING|ERR_NOFILE|ERR_USAGE;
+ else
+ errlevel = ERR_WARNING|ERR_PASS1|ERR_WARN_UNKNOWN_PRAGMA;
+ nasm_error(errlevel, "unknown limit: `%s'", limit);
+ return DIRR_ERROR;
+ }
+
+ if (!nasm_stricmp(valstr, "unlimited")) {
+ val = LIMIT_MAX_VAL;
+ } else {
+ val = readnum(valstr, &rn_error);
+ if (rn_error || val < 0) {
+ if (passn == 0)
+ errlevel = ERR_WARNING|ERR_NOFILE|ERR_USAGE;
+ else
+ errlevel = ERR_WARNING|ERR_PASS1|ERR_WARN_BAD_PRAGMA;
+ nasm_error(errlevel, "invalid limit value: `%s'", limit);
+ return DIRR_ERROR;
+ }
+ if (val > LIMIT_MAX_VAL)
+ val = LIMIT_MAX_VAL;
+ }
+
+ nasm_limit[i] = val;
+ return DIRR_OK;
+}
+
+int64_t switch_segment(int32_t segment)
+{
+ location.segment = segment;
+ if (segment == NO_SEG) {
+ location.offset = absolute.offset;
+ in_absolute = true;
+ } else {
+ location.offset = raa_read(offsets, segment);
+ in_absolute = false;
+ }
+ return location.offset;
+}
+
+static void set_curr_offs(int64_t l_off)
+{
+ if (in_absolute)
+ absolute.offset = l_off;
+ else
+ offsets = raa_write(offsets, location.segment, l_off);
+}
+
+static void increment_offset(int64_t delta)
+{
+ if (unlikely(delta == 0))
+ return;
+
+ location.offset += delta;
+ set_curr_offs(location.offset);
+}
+
+static void nasm_fputs(const char *line, FILE * outfile)
+{
+ if (outfile) {
+ fputs(line, outfile);
+ putc('\n', outfile);
+ } else
+ puts(line);
+}
+
+static void define_macros_early(void)
+{
+ const struct compile_time * const oct = &official_compile_time;
+ char temp[128];
+
+ if (oct->have_local) {
+ strftime(temp, sizeof temp, "__DATE__=\"%Y-%m-%d\"", &oct->local);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__DATE_NUM__=%Y%m%d", &oct->local);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__TIME__=\"%H:%M:%S\"", &oct->local);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__TIME_NUM__=%H%M%S", &oct->local);
+ preproc->pre_define(temp);
+ }
+
+ if (oct->have_gm) {
+ strftime(temp, sizeof temp, "__UTC_DATE__=\"%Y-%m-%d\"", &oct->gm);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__UTC_DATE_NUM__=%Y%m%d", &oct->gm);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__UTC_TIME__=\"%H:%M:%S\"", &oct->gm);
+ preproc->pre_define(temp);
+ strftime(temp, sizeof temp, "__UTC_TIME_NUM__=%H%M%S", &oct->gm);
+ preproc->pre_define(temp);
+ }
+
+ if (oct->have_posix) {
+ snprintf(temp, sizeof temp, "__POSIX_TIME__=%"PRId64, oct->posix);
+ preproc->pre_define(temp);
+ }
+}
+
+static void define_macros_late(void)
+{
+ char temp[128];
+
+ /*
+ * In case if output format is defined by alias
+ * we have to put shortname of the alias itself here
+ * otherwise ABI backward compatibility gets broken.
+ */
+ snprintf(temp, sizeof(temp), "__OUTPUT_FORMAT__=%s",
+ ofmt_alias ? ofmt_alias->shortname : ofmt->shortname);
+ preproc->pre_define(temp);
+}
+
+static void emit_dependencies(StrList *list)
+{
+ FILE *deps;
+ int linepos, len;
+ bool wmake = (quote_for_make == quote_for_wmake);
+ const char *wrapstr, *nulltarget;
+ struct strlist_entry *l;
+
+ if (!list)
+ return;
+
+ wrapstr = wmake ? " &\n " : " \\\n ";
+ nulltarget = wmake ? "\t%null\n" : "";
+
+ if (depend_file && strcmp(depend_file, "-")) {
+ deps = nasm_open_write(depend_file, NF_TEXT);
+ if (!deps) {
+ nasm_error(ERR_NONFATAL|ERR_NOFILE|ERR_USAGE,
+ "unable to write dependency file `%s'", depend_file);
+ return;
+ }
+ } else {
+ deps = stdout;
+ }
+
+ linepos = fprintf(deps, "%s :", depend_target);
+ list_for_each(l, list->head) {
+ char *file = quote_for_make(l->str);
+ len = strlen(file);
+ if (linepos + len > 62 && linepos > 1) {
+ fputs(wrapstr, deps);
+ linepos = 1;
+ }
+ fprintf(deps, " %s", file);
+ linepos += len+1;
+ nasm_free(file);
+ }
+ fprintf(deps, "\n\n");
+
+ list_for_each(l, list->head) {
+ if (depend_emit_phony) {
+ char *file = quote_for_make(l->str);
+ fprintf(deps, "%s :\n%s\n", file, nulltarget);
+ nasm_free(file);
+ }
+ }
+
+ strlist_free(list);
+
+ if (deps != stdout)
+ fclose(deps);
+}
+
+/* Convert a struct tm to a POSIX-style time constant */
+static int64_t make_posix_time(const struct tm *tm)
+{
+ int64_t t;
+ int64_t y = tm->tm_year;
+
+ /* See IEEE 1003.1:2004, section 4.14 */
+
+ t = (y-70)*365 + (y-69)/4 - (y-1)/100 + (y+299)/400;
+ t += tm->tm_yday;
+ t *= 24;
+ t += tm->tm_hour;
+ t *= 60;
+ t += tm->tm_min;
+ t *= 60;
+ t += tm->tm_sec;
+
+ return t;
+}
+
+static void timestamp(void)
+{
+ struct compile_time * const oct = &official_compile_time;
+#if 1
+ // Chromium patch: Builds should be deterministic and not embed timestamps.
+ memset(oct, 0, sizeof(official_compile_time));
+#else
+ const struct tm *tp, *best_gm;
+
+ time(&oct->t);
+
+ best_gm = NULL;
+
+ tp = localtime(&oct->t);
+ if (tp) {
+ oct->local = *tp;
+ best_gm = &oct->local;
+ oct->have_local = true;
+ }
+
+ tp = gmtime(&oct->t);
+ if (tp) {
+ oct->gm = *tp;
+ best_gm = &oct->gm;
+ oct->have_gm = true;
+ if (!oct->have_local)
+ oct->local = oct->gm;
+ } else {
+ oct->gm = oct->local;
+ }
+
+ if (best_gm) {
+ oct->posix = make_posix_time(best_gm);
+ oct->have_posix = true;
+ }
+#endif
+}
+
+int main(int argc, char **argv)
+{
+ timestamp();
+
+ iflag_set_default_cpu(&cpu);
+ iflag_set_default_cpu(&cmd_cpu);
+
+ pass0 = 0;
+ want_usage = terminate_after_phase = false;
+ nasm_set_verror(nasm_verror_gnu);
+
+ error_file = stderr;
+
+ tolower_init();
+ src_init();
+
+ /*
+ * We must call init_labels() before the command line parsing,
+ * because we may be setting prefixes/suffixes from the command
+ * line.
+ */
+ init_labels();
+
+ offsets = raa_init();
+ forwrefs = saa_init((int32_t)sizeof(struct forwrefinfo));
+
+ preproc = &nasmpp;
+ operating_mode = OP_NORMAL;
+
+ parse_cmdline(argc, argv, 1);
+ if (terminate_after_phase) {
+ if (want_usage)
+ usage();
+ return 1;
+ }
+
+ /*
+ * Define some macros dependent on the runtime, but not
+ * on the command line (as those are scanned in cmdline pass 2.)
+ */
+ preproc->init();
+ define_macros_early();
+
+ parse_cmdline(argc, argv, 2);
+ if (terminate_after_phase) {
+ if (want_usage)
+ usage();
+ return 1;
+ }
+
+ /* Save away the default state of warnings */
+ memcpy(warning_state_init, warning_state, sizeof warning_state);
+
+ if (!using_debug_info) {
+ /* No debug info, redirect to the null backend (empty stubs) */
+ dfmt = &null_debug_form;
+ } else if (!debug_format) {
+ /* Default debug format for this backend */
+ dfmt = ofmt->default_dfmt;
+ } else {
+ dfmt = dfmt_find(ofmt, debug_format);
+ if (!dfmt) {
+ nasm_fatal_fl(ERR_NOFILE | ERR_USAGE,
+ "unrecognized debug format `%s' for"
+ " output format `%s'",
+ debug_format, ofmt->shortname);
+ }
+ }
+
+ if (ofmt->stdmac)
+ preproc->extra_stdmac(ofmt->stdmac);
+
+ /*
+ * If no output file name provided and this
+ * is a preprocess mode, we're perfectly
+ * fine to output into stdout.
+ */
+ if (!outname) {
+ if (!(operating_mode & OP_PREPROCESS))
+ outname = filename_set_extension(inname, ofmt->extension);
+ }
+
+ /* define some macros dependent of command-line */
+ define_macros_late();
+
+ if (depend_file || (operating_mode & OP_DEPEND))
+ depend_list = strlist_allocate();
+
+ if (!depend_target)
+ depend_target = quote_for_make(outname);
+
+ if (operating_mode & OP_DEPEND) {
+ char *line;
+
+ if (depend_missing_ok)
+ preproc->include_path(NULL); /* "assume generated" */
+
+ preproc->reset(inname, 0, depend_list);
+ ofile = NULL;
+ while ((line = preproc->getline()))
+ nasm_free(line);
+ preproc->cleanup(0);
+ } else if (operating_mode & OP_PREPROCESS) {
+ char *line;
+ const char *file_name = NULL;
+ int32_t prior_linnum = 0;
+ int lineinc = 0;
+
+ if (outname) {
+ ofile = nasm_open_write(outname, NF_TEXT);
+ if (!ofile)
+ nasm_fatal_fl(ERR_NOFILE,
+ "unable to open output file `%s'",
+ outname);
+ } else
+ ofile = NULL;
+
+ location.known = false;
+
+ /* pass = 1; */
+ preproc->reset(inname, 3, depend_list);
+
+ /* Revert all warnings to the default state */
+ memcpy(warning_state, warning_state_init, sizeof warning_state);
+
+ while ((line = preproc->getline())) {
+ /*
+ * We generate %line directives if needed for later programs
+ */
+ int32_t linnum = prior_linnum += lineinc;
+ int altline = src_get(&linnum, &file_name);
+ if (altline) {
+ if (altline == 1 && lineinc == 1)
+ nasm_fputs("", ofile);
+ else {
+ lineinc = (altline != -1 || lineinc != 1);
+ fprintf(ofile ? ofile : stdout,
+ "%%line %"PRId32"+%d %s\n", linnum, lineinc,
+ file_name);
+ }
+ prior_linnum = linnum;
+ }
+ nasm_fputs(line, ofile);
+ nasm_free(line);
+ }
+ preproc->cleanup(0);
+ if (ofile)
+ fclose(ofile);
+ if (ofile && terminate_after_phase && !keep_all)
+ remove(outname);
+ ofile = NULL;
+ }
+
+ if (operating_mode & OP_NORMAL) {
+ ofile = nasm_open_write(outname, (ofmt->flags & OFMT_TEXT) ? NF_TEXT : NF_BINARY);
+ if (!ofile)
+ nasm_fatal_fl(ERR_NOFILE,
+ "unable to open output file `%s'", outname);
+
+ ofmt->init();
+ dfmt->init();
+
+ assemble_file(inname, depend_list);
+
+ if (!terminate_after_phase) {
+ ofmt->cleanup();
+ cleanup_labels();
+ fflush(ofile);
+ if (ferror(ofile)) {
+ nasm_error(ERR_NONFATAL|ERR_NOFILE,
+ "write error on output file `%s'", outname);
+ terminate_after_phase = true;
+ }
+ }
+
+ if (ofile) {
+ fclose(ofile);
+ if (terminate_after_phase && !keep_all)
+ remove(outname);
+ ofile = NULL;
+ }
+ }
+
+ if (depend_list && !terminate_after_phase)
+ emit_dependencies(depend_list);
+
+ if (want_usage)
+ usage();
+
+ raa_free(offsets);
+ saa_free(forwrefs);
+ eval_cleanup();
+ stdscan_cleanup();
+ src_free();
+
+ return terminate_after_phase;
+}
+
+/*
+ * Get a parameter for a command line option.
+ * First arg must be in the form of e.g. -f...
+ */
+static char *get_param(char *p, char *q, bool *advance)
+{
+ *advance = false;
+ if (p[2]) /* the parameter's in the option */
+ return nasm_skip_spaces(p + 2);
+ if (q && q[0]) {
+ *advance = true;
+ return q;
+ }
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "option `-%c' requires an argument", p[1]);
+ return NULL;
+}
+
+/*
+ * Copy a filename
+ */
+static void copy_filename(const char **dst, const char *src, const char *what)
+{
+ if (*dst)
+ nasm_fatal("more than one %s file specified: %s\n", what, src);
+
+ *dst = nasm_strdup(src);
+}
+
+/*
+ * Convert a string to a POSIX make-safe form
+ */
+static char *quote_for_pmake(const char *str)
+{
+ const char *p;
+ char *os, *q;
+
+ size_t n = 1; /* Terminating zero */
+ size_t nbs = 0;
+
+ if (!str)
+ return NULL;
+
+ for (p = str; *p; p++) {
+ switch (*p) {
+ case ' ':
+ case '\t':
+ /* Convert N backslashes + ws -> 2N+1 backslashes + ws */
+ n += nbs + 2;
+ nbs = 0;
+ break;
+ case '$':
+ case '#':
+ nbs = 0;
+ n += 2;
+ break;
+ case '\\':
+ nbs++;
+ n++;
+ break;
+ default:
+ nbs = 0;
+ n++;
+ break;
+ }
+ }
+
+ /* Convert N backslashes at the end of filename to 2N backslashes */
+ if (nbs)
+ n += nbs;
+
+ os = q = nasm_malloc(n);
+
+ nbs = 0;
+ for (p = str; *p; p++) {
+ switch (*p) {
+ case ' ':
+ case '\t':
+ while (nbs--)
+ *q++ = '\\';
+ *q++ = '\\';
+ *q++ = *p;
+ break;
+ case '$':
+ *q++ = *p;
+ *q++ = *p;
+ nbs = 0;
+ break;
+ case '#':
+ *q++ = '\\';
+ *q++ = *p;
+ nbs = 0;
+ break;
+ case '\\':
+ *q++ = *p;
+ nbs++;
+ break;
+ default:
+ *q++ = *p;
+ nbs = 0;
+ break;
+ }
+ }
+ while (nbs--)
+ *q++ = '\\';
+
+ *q = '\0';
+
+ return os;
+}
+
+/*
+ * Convert a string to a Watcom make-safe form
+ */
+static char *quote_for_wmake(const char *str)
+{
+ const char *p;
+ char *os, *q;
+ bool quote = false;
+
+ size_t n = 1; /* Terminating zero */
+
+ if (!str)
+ return NULL;
+
+ for (p = str; *p; p++) {
+ switch (*p) {
+ case ' ':
+ case '\t':
+ case '&':
+ quote = true;
+ n++;
+ break;
+ case '\"':
+ quote = true;
+ n += 2;
+ break;
+ case '$':
+ case '#':
+ n += 2;
+ break;
+ default:
+ n++;
+ break;
+ }
+ }
+
+ if (quote)
+ n += 2;
+
+ os = q = nasm_malloc(n);
+
+ if (quote)
+ *q++ = '\"';
+
+ for (p = str; *p; p++) {
+ switch (*p) {
+ case '$':
+ case '#':
+ *q++ = '$';
+ *q++ = *p;
+ break;
+ case '\"':
+ *q++ = *p;
+ *q++ = *p;
+ break;
+ default:
+ *q++ = *p;
+ break;
+ }
+ }
+
+ if (quote)
+ *q++ = '\"';
+
+ *q = '\0';
+
+ return os;
+}
+
+enum text_options {
+ OPT_BOGUS,
+ OPT_VERSION,
+ OPT_HELP,
+ OPT_ABORT_ON_PANIC,
+ OPT_MANGLE,
+ OPT_INCLUDE,
+ OPT_PRAGMA,
+ OPT_BEFORE,
+ OPT_LIMIT,
+ OPT_KEEP_ALL
+};
+struct textargs {
+ const char *label;
+ enum text_options opt;
+ bool need_arg;
+ int pvt;
+};
+static const struct textargs textopts[] = {
+ {"v", OPT_VERSION, false, 0},
+ {"version", OPT_VERSION, false, 0},
+ {"help", OPT_HELP, false, 0},
+ {"abort-on-panic", OPT_ABORT_ON_PANIC, false, 0},
+ {"prefix", OPT_MANGLE, true, LM_GPREFIX},
+ {"postfix", OPT_MANGLE, true, LM_GSUFFIX},
+ {"gprefix", OPT_MANGLE, true, LM_GPREFIX},
+ {"gpostfix", OPT_MANGLE, true, LM_GSUFFIX},
+ {"lprefix", OPT_MANGLE, true, LM_LPREFIX},
+ {"lpostfix", OPT_MANGLE, true, LM_LSUFFIX},
+ {"include", OPT_INCLUDE, true, 0},
+ {"pragma", OPT_PRAGMA, true, 0},
+ {"before", OPT_BEFORE, true, 0},
+ {"limit-", OPT_LIMIT, true, 0},
+ {"keep-all", OPT_KEEP_ALL, false, 0},
+ {NULL, OPT_BOGUS, false, 0}
+};
+
+static void show_version(void)
+{
+ printf("NASM version %s%s\n",
+ nasm_version, nasm_compile_options);
+ exit(0);
+}
+
+static bool stopoptions = false;
+static bool process_arg(char *p, char *q, int pass)
+{
+ char *param;
+ bool advance = false;
+
+ if (!p || !p[0])
+ return false;
+
+ if (p[0] == '-' && !stopoptions) {
+ if (strchr("oOfpPdDiIlFXuUZwW", p[1])) {
+ /* These parameters take values */
+ if (!(param = get_param(p, q, &advance)))
+ return advance;
+ }
+
+ switch (p[1]) {
+ case 's':
+ if (pass == 1)
+ error_file = stdout;
+ break;
+
+ case 'o': /* output file */
+ if (pass == 2)
+ copy_filename(&outname, param, "output");
+ break;
+
+ case 'f': /* output format */
+ if (pass == 1) {
+ ofmt = ofmt_find(param, &ofmt_alias);
+ if (!ofmt) {
+ nasm_fatal_fl(ERR_NOFILE | ERR_USAGE,
+ "unrecognised output format `%s' - "
+ "use -hf for a list", param);
+ }
+ }
+ break;
+
+ case 'O': /* Optimization level */
+ if (pass == 2) {
+ int opt;
+
+ if (!*param) {
+ /* Naked -O == -Ox */
+ optimizing.level = MAX_OPTIMIZE;
+ } else {
+ while (*param) {
+ switch (*param) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ opt = strtoul(param, &param, 10);
+
+ /* -O0 -> optimizing.level == -1, 0.98 behaviour */
+ /* -O1 -> optimizing.level == 0, 0.98.09 behaviour */
+ if (opt < 2)
+ optimizing.level = opt - 1;
+ else
+ optimizing.level = opt;
+ break;
+
+ case 'v':
+ case '+':
+ param++;
+ opt_verbose_info = true;
+ break;
+
+ case 'x':
+ param++;
+ optimizing.level = MAX_OPTIMIZE;
+ break;
+
+ default:
+ nasm_fatal("unknown optimization option -O%c\n",
+ *param);
+ break;
+ }
+ }
+ if (optimizing.level > MAX_OPTIMIZE)
+ optimizing.level = MAX_OPTIMIZE;
+ }
+ }
+ break;
+
+ case 'p': /* pre-include */
+ case 'P':
+ if (pass == 2)
+ preproc->pre_include(param);
+ break;
+
+ case 'd': /* pre-define */
+ case 'D':
+ if (pass == 2)
+ preproc->pre_define(param);
+ break;
+
+ case 'u': /* un-define */
+ case 'U':
+ if (pass == 2)
+ preproc->pre_undefine(param);
+ break;
+
+ case 'i': /* include search path */
+ case 'I':
+ if (pass == 2)
+ preproc->include_path(param);
+ break;
+
+ case 'l': /* listing file */
+ if (pass == 2)
+ copy_filename(&listname, param, "listing");
+ break;
+
+ case 'Z': /* error messages file */
+ if (pass == 1)
+ copy_filename(&errname, param, "error");
+ break;
+
+ case 'F': /* specify debug format */
+ if (pass == 2) {
+ using_debug_info = true;
+ debug_format = param;
+ }
+ break;
+
+ case 'X': /* specify error reporting format */
+ if (pass == 1) {
+ if (nasm_stricmp("vc", param) == 0)
+ nasm_set_verror(nasm_verror_vc);
+ else if (nasm_stricmp("gnu", param) == 0)
+ nasm_set_verror(nasm_verror_gnu);
+ else
+ nasm_fatal_fl(ERR_NOFILE | ERR_USAGE,
+ "unrecognized error reporting format `%s'",
+ param);
+ }
+ break;
+
+ case 'g':
+ if (pass == 2) {
+ using_debug_info = true;
+ if (p[2])
+ debug_format = nasm_skip_spaces(p + 2);
+ }
+ break;
+
+ case 'h':
+ help(p[2]);
+ exit(0); /* never need usage message here */
+ break;
+
+ case 'y':
+ printf("\nvalid debug formats for '%s' output format are"
+ " ('*' denotes default):\n", ofmt->shortname);
+ dfmt_list(ofmt, stdout);
+ exit(0);
+ break;
+
+ case 't':
+ if (pass == 2)
+ tasm_compatible_mode = true;
+ break;
+
+ case 'v':
+ show_version();
+ break;
+
+ case 'e': /* preprocess only */
+ case 'E':
+ if (pass == 1)
+ operating_mode = OP_PREPROCESS;
+ break;
+
+ case 'a': /* assemble only - don't preprocess */
+ if (pass == 1)
+ preproc = &preproc_nop;
+ break;
+
+ case 'w':
+ case 'W':
+ if (pass == 2) {
+ if (!set_warning_status(param)) {
+ nasm_error(ERR_WARNING|ERR_NOFILE|ERR_WARN_UNK_WARNING,
+ "unknown warning option: %s", param);
+ }
+ }
+ break;
+
+ case 'M':
+ if (pass == 1) {
+ switch (p[2]) {
+ case 'W':
+ quote_for_make = quote_for_wmake;
+ break;
+ case 'D':
+ case 'F':
+ case 'T':
+ case 'Q':
+ advance = true;
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (p[2]) {
+ case 0:
+ operating_mode = OP_DEPEND;
+ break;
+ case 'G':
+ operating_mode = OP_DEPEND;
+ depend_missing_ok = true;
+ break;
+ case 'P':
+ depend_emit_phony = true;
+ break;
+ case 'D':
+ operating_mode = OP_NORMAL;
+ depend_file = q;
+ advance = true;
+ break;
+ case 'F':
+ depend_file = q;
+ advance = true;
+ break;
+ case 'T':
+ depend_target = q;
+ advance = true;
+ break;
+ case 'Q':
+ depend_target = quote_for_make(q);
+ advance = true;
+ break;
+ case 'W':
+ /* handled in pass 1 */
+ break;
+ default:
+ nasm_error(ERR_NONFATAL|ERR_NOFILE|ERR_USAGE,
+ "unknown dependency option `-M%c'", p[2]);
+ break;
+ }
+ }
+ if (advance && (!q || !q[0])) {
+ nasm_error(ERR_NONFATAL|ERR_NOFILE|ERR_USAGE,
+ "option `-M%c' requires a parameter", p[2]);
+ break;
+ }
+ break;
+
+ case '-':
+ {
+ const struct textargs *tx;
+ size_t olen, plen;
+ char *eqsave;
+
+ p += 2;
+
+ if (!*p) { /* -- => stop processing options */
+ stopoptions = true;
+ break;
+ }
+
+ plen = strlen(p);
+ for (tx = textopts; tx->label; tx++) {
+ olen = strlen(tx->label);
+
+ if (olen > plen)
+ continue;
+
+ if (nasm_memicmp(p, tx->label, olen))
+ continue;
+
+ if (tx->label[olen-1] == '-')
+ break; /* Incomplete option */
+
+ if (!p[olen] || p[olen] == '=')
+ break; /* Complete option */
+ }
+
+ if (!tx->label) {
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "unrecognized option `--%s'", p);
+ }
+
+ eqsave = param = strchr(p+olen, '=');
+ if (param)
+ *param++ = '\0';
+
+ if (tx->need_arg) {
+ if (!param) {
+ param = q;
+ advance = true;
+ }
+
+ /* Note: a null string is a valid parameter */
+ if (!param) {
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "option `--%s' requires an argument",
+ p);
+ break;
+ }
+ } else {
+ if (param) {
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "option `--%s' does not take an argument",
+ p);
+
+ }
+ }
+
+ switch (tx->opt) {
+ case OPT_VERSION:
+ show_version();
+ break;
+ case OPT_ABORT_ON_PANIC:
+ abort_on_panic = true;
+ break;
+ case OPT_MANGLE:
+ if (pass == 2)
+ set_label_mangle(tx->pvt, param);
+ break;
+ case OPT_INCLUDE:
+ if (pass == 2)
+ preproc->pre_include(q);
+ break;
+ case OPT_PRAGMA:
+ if (pass == 2)
+ preproc->pre_command("pragma", param);
+ break;
+ case OPT_BEFORE:
+ if (pass == 2)
+ preproc->pre_command(NULL, param);
+ break;
+ case OPT_LIMIT:
+ if (pass == 2)
+ nasm_set_limit(p+olen, param);
+ break;
+ case OPT_KEEP_ALL:
+ keep_all = true;
+ break;
+ case OPT_HELP:
+ help(0);
+ exit(0);
+ default:
+ panic();
+ }
+
+ if (eqsave)
+ *eqsave = '='; /* Restore = argument separator */
+
+ break;
+ }
+
+ default:
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "unrecognised option `-%c'", p[1]);
+ break;
+ }
+ } else if (pass == 2) {
+ /* In theory we could allow multiple input files... */
+ copy_filename(&inname, p, "input");
+ }
+
+ return advance;
+}
+
+#define ARG_BUF_DELTA 128
+
+static void process_respfile(FILE * rfile, int pass)
+{
+ char *buffer, *p, *q, *prevarg;
+ int bufsize, prevargsize;
+
+ bufsize = prevargsize = ARG_BUF_DELTA;
+ buffer = nasm_malloc(ARG_BUF_DELTA);
+ prevarg = nasm_malloc(ARG_BUF_DELTA);
+ prevarg[0] = '\0';
+
+ while (1) { /* Loop to handle all lines in file */
+ p = buffer;
+ while (1) { /* Loop to handle long lines */
+ q = fgets(p, bufsize - (p - buffer), rfile);
+ if (!q)
+ break;
+ p += strlen(p);
+ if (p > buffer && p[-1] == '\n')
+ break;
+ if (p - buffer > bufsize - 10) {
+ int offset;
+ offset = p - buffer;
+ bufsize += ARG_BUF_DELTA;
+ buffer = nasm_realloc(buffer, bufsize);
+ p = buffer + offset;
+ }
+ }
+
+ if (!q && p == buffer) {
+ if (prevarg[0])
+ process_arg(prevarg, NULL, pass);
+ nasm_free(buffer);
+ nasm_free(prevarg);
+ return;
+ }
+
+ /*
+ * Play safe: remove CRs, LFs and any spurious ^Zs, if any of
+ * them are present at the end of the line.
+ */
+ *(p = &buffer[strcspn(buffer, "\r\n\032")]) = '\0';
+
+ while (p > buffer && nasm_isspace(p[-1]))
+ *--p = '\0';
+
+ p = nasm_skip_spaces(buffer);
+
+ if (process_arg(prevarg, p, pass))
+ *p = '\0';
+
+ if ((int) strlen(p) > prevargsize - 10) {
+ prevargsize += ARG_BUF_DELTA;
+ prevarg = nasm_realloc(prevarg, prevargsize);
+ }
+ strncpy(prevarg, p, prevargsize);
+ }
+}
+
+/* Function to process args from a string of args, rather than the
+ * argv array. Used by the environment variable and response file
+ * processing.
+ */
+static void process_args(char *args, int pass)
+{
+ char *p, *q, *arg, *prevarg;
+ char separator = ' ';
+
+ p = args;
+ if (*p && *p != '-')
+ separator = *p++;
+ arg = NULL;
+ while (*p) {
+ q = p;
+ while (*p && *p != separator)
+ p++;
+ while (*p == separator)
+ *p++ = '\0';
+ prevarg = arg;
+ arg = q;
+ if (process_arg(prevarg, arg, pass))
+ arg = NULL;
+ }
+ if (arg)
+ process_arg(arg, NULL, pass);
+}
+
+static void process_response_file(const char *file, int pass)
+{
+ char str[2048];
+ FILE *f = nasm_open_read(file, NF_TEXT);
+ if (!f) {
+ perror(file);
+ exit(-1);
+ }
+ while (fgets(str, sizeof str, f)) {
+ process_args(str, pass);
+ }
+ fclose(f);
+}
+
+static void parse_cmdline(int argc, char **argv, int pass)
+{
+ FILE *rfile;
+ char *envreal, *envcopy = NULL, *p;
+ int i;
+
+ /* Initialize all the warnings to their default state */
+ for (i = 0; i < ERR_WARN_ALL; i++) {
+ warning_state_init[i] = warning_state[i] =
+ warnings[i].enabled ? WARN_ST_ENABLED : 0;
+ }
+
+ /*
+ * First, process the NASMENV environment variable.
+ */
+ envreal = getenv("NASMENV");
+ if (envreal) {
+ envcopy = nasm_strdup(envreal);
+ process_args(envcopy, pass);
+ nasm_free(envcopy);
+ }
+
+ /*
+ * Now process the actual command line.
+ */
+ while (--argc) {
+ bool advance;
+ argv++;
+ if (argv[0][0] == '@') {
+ /*
+ * We have a response file, so process this as a set of
+ * arguments like the environment variable. This allows us
+ * to have multiple arguments on a single line, which is
+ * different to the -@resp file processing below for regular
+ * NASM.
+ */
+ process_response_file(argv[0]+1, pass);
+ argc--;
+ argv++;
+ }
+ if (!stopoptions && argv[0][0] == '-' && argv[0][1] == '@') {
+ p = get_param(argv[0], argc > 1 ? argv[1] : NULL, &advance);
+ if (p) {
+ rfile = nasm_open_read(p, NF_TEXT);
+ if (rfile) {
+ process_respfile(rfile, pass);
+ fclose(rfile);
+ } else
+ nasm_error(ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+ "unable to open response file `%s'", p);
+ }
+ } else
+ advance = process_arg(argv[0], argc > 1 ? argv[1] : NULL, pass);
+ argv += advance, argc -= advance;
+ }
+
+ /*
+ * Look for basic command line typos. This definitely doesn't
+ * catch all errors, but it might help cases of fumbled fingers.
+ */
+ if (pass != 2)
+ return;
+
+ if (!inname)
+ nasm_fatal_fl(ERR_NOFILE | ERR_USAGE, "no input file specified");
+
+ else if ((errname && !strcmp(inname, errname)) ||
+ (outname && !strcmp(inname, outname)) ||
+ (listname && !strcmp(inname, listname)) ||
+ (depend_file && !strcmp(inname, depend_file)))
+ nasm_fatal_fl(ERR_USAGE, "will not overwrite input file");
+
+ if (errname) {
+ error_file = nasm_open_write(errname, NF_TEXT);
+ if (!error_file) {
+ error_file = stderr; /* Revert to default! */
+ nasm_fatal_fl(ERR_NOFILE | ERR_USAGE,
+ "cannot open file `%s' for error messages",
+ errname);
+ }
+ }
+}
+
+static void assemble_file(const char *fname, StrList *depend_list)
+{
+ char *line;
+ insn output_ins;
+ int i;
+ uint64_t prev_offset_changed;
+ int64_t stall_count = 0; /* Make sure we make forward progress... */
+
+ switch (cmd_sb) {
+ case 16:
+ break;
+ case 32:
+ if (!iflag_cpu_level_ok(&cmd_cpu, IF_386))
+ nasm_fatal("command line: 32-bit segment size requires a higher cpu");
+ break;
+ case 64:
+ if (!iflag_cpu_level_ok(&cmd_cpu, IF_X86_64))
+ nasm_fatal("command line: 64-bit segment size requires a higher cpu");
+ break;
+ default:
+ panic();
+ break;
+ }
+
+ prev_offset_changed = nasm_limit[LIMIT_PASSES];
+ for (passn = 1; pass0 <= 2; passn++) {
+ pass1 = pass0 == 2 ? 2 : 1; /* 1, 1, 1, ..., 1, 2 */
+ pass2 = passn > 1 ? 2 : 1; /* 1, 2, 2, ..., 2, 2 */
+ /* pass0 0, 0, 0, ..., 1, 2 */
+
+ globalbits = cmd_sb; /* set 'bits' to command line default */
+ cpu = cmd_cpu;
+ if (pass0 == 2) {
+ lfmt->init(listname);
+ } else if (passn == 1 && listname && !keep_all) {
+ /* Remove the list file in case we die before the output pass */
+ remove(listname);
+ }
+ in_absolute = false;
+ global_offset_changed = 0; /* set by redefine_label */
+ if (passn > 1) {
+ saa_rewind(forwrefs);
+ forwref = saa_rstruct(forwrefs);
+ raa_free(offsets);
+ offsets = raa_init();
+ }
+ location.segment = NO_SEG;
+ location.offset = 0;
+ if (passn == 1)
+ location.known = true;
+ ofmt->reset();
+ switch_segment(ofmt->section(NULL, pass2, &globalbits));
+ preproc->reset(fname, pass1, pass1 == 2 ? depend_list : NULL);
+
+ /* Revert all warnings to the default state */
+ memcpy(warning_state, warning_state_init, sizeof warning_state);
+
+ globallineno = 0;
+
+ while ((line = preproc->getline())) {
+ if (++globallineno > nasm_limit[LIMIT_LINES])
+ nasm_fatal("overall line count exceeds the maximum %"PRId64"\n",
+ nasm_limit[LIMIT_LINES]);
+
+ /*
+ * Here we parse our directives; this is not handled by the
+ * main parser.
+ */
+ if (process_directives(line))
+ goto end_of_line; /* Just do final cleanup */
+
+ /* Not a directive, or even something that starts with [ */
+ parse_line(pass1, line, &output_ins);
+
+ if (optimizing.level > 0) {
+ if (forwref != NULL && globallineno == forwref->lineno) {
+ output_ins.forw_ref = true;
+ do {
+ output_ins.oprs[forwref->operand].opflags |= OPFLAG_FORWARD;
+ forwref = saa_rstruct(forwrefs);
+ } while (forwref != NULL
+ && forwref->lineno == globallineno);
+ } else
+ output_ins.forw_ref = false;
+
+ if (output_ins.forw_ref) {
+ if (passn == 1) {
+ for (i = 0; i < output_ins.operands; i++) {
+ if (output_ins.oprs[i].opflags & OPFLAG_FORWARD) {
+ struct forwrefinfo *fwinf = (struct forwrefinfo *)saa_wstruct(forwrefs);
+ fwinf->lineno = globallineno;
+ fwinf->operand = i;
+ }
+ }
+ }
+ }
+ }
+
+ /* forw_ref */
+ if (output_ins.opcode == I_EQU) {
+ if (!output_ins.label) {
+ nasm_error(ERR_NONFATAL, "EQU not preceded by label");
+ } else if (output_ins.operands == 1 &&
+ (output_ins.oprs[0].type & IMMEDIATE) &&
+ output_ins.oprs[0].wrt == NO_SEG) {
+ define_label(output_ins.label,
+ output_ins.oprs[0].segment,
+ output_ins.oprs[0].offset, false);
+ } else if (output_ins.operands == 2
+ && (output_ins.oprs[0].type & IMMEDIATE)
+ && (output_ins.oprs[0].type & COLON)
+ && output_ins.oprs[0].segment == NO_SEG
+ && output_ins.oprs[0].wrt == NO_SEG
+ && (output_ins.oprs[1].type & IMMEDIATE)
+ && output_ins.oprs[1].segment == NO_SEG
+ && output_ins.oprs[1].wrt == NO_SEG) {
+ define_label(output_ins.label,
+ output_ins.oprs[0].offset | SEG_ABS,
+ output_ins.oprs[1].offset, false);
+ } else {
+ nasm_error(ERR_NONFATAL, "bad syntax for EQU");
+ }
+ } else { /* instruction isn't an EQU */
+ int32_t n;
+
+ nasm_assert(output_ins.times >= 0);
+
+ for (n = 1; n <= output_ins.times; n++) {
+ if (pass1 == 1) {
+ int64_t l = insn_size(location.segment,
+ location.offset,
+ globalbits, &output_ins);
+
+ /* if (using_debug_info) && output_ins.opcode != -1) */
+ if (using_debug_info)
+ { /* fbk 03/25/01 */
+ /* this is done here so we can do debug type info */
+ int32_t typeinfo =
+ TYS_ELEMENTS(output_ins.operands);
+ switch (output_ins.opcode) {
+ case I_RESB:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_BYTE;
+ break;
+ case I_RESW:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_WORD;
+ break;
+ case I_RESD:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_DWORD;
+ break;
+ case I_RESQ:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_QWORD;
+ break;
+ case I_REST:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_TBYTE;
+ break;
+ case I_RESO:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_OWORD;
+ break;
+ case I_RESY:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_YWORD;
+ break;
+ case I_RESZ:
+ typeinfo =
+ TYS_ELEMENTS(output_ins.oprs[0].offset) | TY_ZWORD;
+ break;
+ case I_DB:
+ typeinfo |= TY_BYTE;
+ break;
+ case I_DW:
+ typeinfo |= TY_WORD;
+ break;
+ case I_DD:
+ if (output_ins.eops_float)
+ typeinfo |= TY_FLOAT;
+ else
+ typeinfo |= TY_DWORD;
+ break;
+ case I_DQ:
+ typeinfo |= TY_QWORD;
+ break;
+ case I_DT:
+ typeinfo |= TY_TBYTE;
+ break;
+ case I_DO:
+ typeinfo |= TY_OWORD;
+ break;
+ case I_DY:
+ typeinfo |= TY_YWORD;
+ break;
+ case I_DZ:
+ typeinfo |= TY_ZWORD;
+ break;
+ default:
+ typeinfo = TY_LABEL;
+ break;
+ }
+
+ dfmt->debug_typevalue(typeinfo);
+ }
+
+ /*
+ * For INCBIN, let the code in assemble
+ * handle TIMES, so we don't have to read the
+ * input file over and over.
+ */
+ if (l != -1) {
+ increment_offset(l);
+ }
+ /*
+ * else l == -1 => invalid instruction, which will be
+ * flagged as an error on pass 2
+ */
+ } else {
+ if (n == 2)
+ lfmt->uplevel(LIST_TIMES);
+ increment_offset(assemble(location.segment,
+ location.offset,
+ globalbits, &output_ins));
+ }
+ } /* not an EQU */
+ }
+ if (output_ins.times > 1)
+ lfmt->downlevel(LIST_TIMES);
+
+ cleanup_insn(&output_ins);
+
+ end_of_line:
+ nasm_free(line);
+ } /* end while (line = preproc->getline... */
+
+ if (global_offset_changed && !terminate_after_phase) {
+ switch (pass0) {
+ case 1:
+ nasm_error(ERR_WARNING|ERR_WARN_PHASE,
+ "phase error during stabilization pass, hoping for the best");
+ break;
+
+ case 2:
+ nasm_error(ERR_NONFATAL,
+ "phase error during code generation pass");
+ break;
+
+ default:
+ /* This is normal, we'll keep going... */
+ break;
+ }
+ }
+
+ if (pass1 == 1)
+ preproc->cleanup(1);
+
+ /*
+ * Always run at least two optimization passes (pass0 == 0);
+ * things like subsections will fail miserably without that.
+ * Once we commit to a stabilization pass (pass0 == 1), we can't
+ * go back, and if something goes bad, we can only hope
+ * that we don't end up with a phase error at the end.
+ */
+ if ((passn > 1 && !global_offset_changed) || pass0 > 0) {
+ pass0++;
+ } else if (global_offset_changed &&
+ global_offset_changed < prev_offset_changed) {
+ prev_offset_changed = global_offset_changed;
+ stall_count = 0;
+ } else {
+ stall_count++;
+ }
+
+ if (terminate_after_phase)
+ break;
+
+ if ((stall_count > nasm_limit[LIMIT_STALLED]) ||
+ (passn >= nasm_limit[LIMIT_PASSES])) {
+ /* We get here if the labels don't converge
+ * Example: FOO equ FOO + 1
+ */
+ nasm_error(ERR_NONFATAL,
+ "Can't find valid values for all labels "
+ "after %"PRId64" passes, giving up.", passn);
+ nasm_error(ERR_NONFATAL,
+ "Possible causes: recursive EQUs, macro abuse.");
+ break;
+ }
+ }
+
+ preproc->cleanup(0);
+ lfmt->cleanup();
+ if (!terminate_after_phase && opt_verbose_info) {
+ /* -On and -Ov switches */
+ fprintf(stdout, "info: assembly required 1+%"PRId64"+1 passes\n",
+ passn-3);
+ }
+}
+
+/**
+ * gnu style error reporting
+ * This function prints an error message to error_file in the
+ * style used by GNU. An example would be:
+ * file.asm:50: error: blah blah blah
+ * where file.asm is the name of the file, 50 is the line number on
+ * which the error occurs (or is detected) and "error:" is one of
+ * the possible optional diagnostics -- it can be "error" or "warning"
+ * or something else. Finally the line terminates with the actual
+ * error message.
+ *
+ * @param severity the severity of the warning or error
+ * @param fmt the printf style format string
+ */
+static void nasm_verror_gnu(int severity, const char *fmt, va_list ap)
+{
+ const char *currentfile = NULL;
+ int32_t lineno = 0;
+
+ if (is_suppressed_warning(severity))
+ return;
+
+ if (!(severity & ERR_NOFILE)) {
+ src_get(&lineno, &currentfile);
+ if (!currentfile || (severity & ERR_TOPFILE)) {
+ currentfile = inname[0] ? inname : outname[0] ? outname : NULL;
+ lineno = 0;
+ }
+ }
+
+ if (!skip_this_pass(severity)) {
+ if (!lineno)
+ fprintf(error_file, "%s:", currentfile ? currentfile : "nasm");
+ else
+ fprintf(error_file, "%s:%"PRId32": ", currentfile, lineno);
+ }
+
+ nasm_verror_common(severity, fmt, ap);
+}
+
+/**
+ * MS style error reporting
+ * This function prints an error message to error_file in the
+ * style used by Visual C and some other Microsoft tools. An example
+ * would be:
+ * file.asm(50) : error: blah blah blah
+ * where file.asm is the name of the file, 50 is the line number on
+ * which the error occurs (or is detected) and "error:" is one of
+ * the possible optional diagnostics -- it can be "error" or "warning"
+ * or something else. Finally the line terminates with the actual
+ * error message.
+ *
+ * @param severity the severity of the warning or error
+ * @param fmt the printf style format string
+ */
+static void nasm_verror_vc(int severity, const char *fmt, va_list ap)
+{
+ const char *currentfile = NULL;
+ int32_t lineno = 0;
+
+ if (is_suppressed_warning(severity))
+ return;
+
+ if (!(severity & ERR_NOFILE))
+ src_get(&lineno, &currentfile);
+
+ if (!skip_this_pass(severity)) {
+ if (currentfile) {
+ fprintf(error_file, "%s(%"PRId32") : ", currentfile, lineno);
+ } else {
+ fputs("nasm: ", error_file);
+ }
+ }
+
+ nasm_verror_common(severity, fmt, ap);
+}
+
+/*
+ * check to see if this is a suppressable warning
+ */
+static inline bool is_valid_warning(int severity)
+{
+ /* Not a warning at all */
+ if ((severity & ERR_MASK) != ERR_WARNING)
+ return false;
+
+ return WARN_IDX(severity) < ERR_WARN_ALL;
+}
+
+/**
+ * check for suppressed warning
+ * checks for suppressed warning or pass one only warning and we're
+ * not in pass 1
+ *
+ * @param severity the severity of the warning or error
+ * @return true if we should abort error/warning printing
+ */
+static bool is_suppressed_warning(int severity)
+{
+ /* Might be a warning but suppresed explicitly */
+ if (is_valid_warning(severity) && !(severity & ERR_USAGE))
+ return !(warning_state[WARN_IDX(severity)] & WARN_ST_ENABLED);
+ else
+ return false;
+}
+
+static bool warning_is_error(int severity)
+{
+ if (is_valid_warning(severity))
+ return !!(warning_state[WARN_IDX(severity)] & WARN_ST_ERROR);
+ else
+ return false;
+}
+
+static bool skip_this_pass(int severity)
+{
+ /*
+ * See if it's a pass-specific error or warning which should be skipped.
+ * We cannot skip errors stronger than ERR_NONFATAL as by definition
+ * they cannot be resumed from.
+ */
+ if ((severity & ERR_MASK) > ERR_NONFATAL)
+ return false;
+
+ /*
+ * passn is 1 on the very first pass only.
+ * pass0 is 2 on the code-generation (final) pass only.
+ * These are the passes we care about in this case.
+ */
+ return (((severity & ERR_PASS1) && passn != 1) ||
+ ((severity & ERR_PASS2) && pass0 != 2));
+}
+
+/**
+ * common error reporting
+ * This is the common back end of the error reporting schemes currently
+ * implemented. It prints the nature of the warning and then the
+ * specific error message to error_file and may or may not return. It
+ * doesn't return if the error severity is a "panic" or "debug" type.
+ *
+ * @param severity the severity of the warning or error
+ * @param fmt the printf style format string
+ */
+static void nasm_verror_common(int severity, const char *fmt, va_list args)
+{
+ char msg[1024];
+ const char *pfx;
+
+ switch (severity & (ERR_MASK|ERR_NO_SEVERITY)) {
+ case ERR_WARNING:
+ pfx = "warning: ";
+ break;
+ case ERR_NONFATAL:
+ pfx = "error: ";
+ break;
+ case ERR_FATAL:
+ pfx = "fatal: ";
+ break;
+ case ERR_PANIC:
+ pfx = "panic: ";
+ break;
+ case ERR_DEBUG:
+ pfx = "debug: ";
+ break;
+ default:
+ pfx = "";
+ break;
+ }
+
+ vsnprintf(msg, sizeof msg - 64, fmt, args);
+ if (is_valid_warning(severity) && WARN_IDX(severity) != ERR_WARN_OTHER) {
+ char *p = strchr(msg, '\0');
+ snprintf(p, 64, " [-w+%s]", warnings[WARN_IDX(severity)].name);
+ }
+
+ if (!skip_this_pass(severity))
+ fprintf(error_file, "%s%s\n", pfx, msg);
+
+ /* Are we recursing from error_list_macros? */
+ if (severity & ERR_PP_LISTMACRO)
+ return;
+
+ /*
+ * Don't suppress this with skip_this_pass(), or we don't get
+ * pass1 or preprocessor warnings in the list file
+ */
+ lfmt->error(severity, pfx, msg);
+
+ if (skip_this_pass(severity))
+ return;
+
+ if (severity & ERR_USAGE)
+ want_usage = true;
+
+ preproc->error_list_macros(severity);
+
+ switch (severity & ERR_MASK) {
+ case ERR_DEBUG:
+ /* no further action, by definition */
+ break;
+ case ERR_WARNING:
+ /* Treat warnings as errors */
+ if (warning_is_error(severity))
+ terminate_after_phase = true;
+ break;
+ case ERR_NONFATAL:
+ terminate_after_phase = true;
+ break;
+ case ERR_FATAL:
+ if (ofile) {
+ fclose(ofile);
+ if (!keep_all)
+ remove(outname);
+ ofile = NULL;
+ }
+ if (want_usage)
+ usage();
+ exit(1); /* instantly die */
+ break; /* placate silly compilers */
+ case ERR_PANIC:
+ fflush(NULL);
+
+ if (abort_on_panic)
+ abort(); /* halt, catch fire, dump core/stop debugger */
+
+ if (ofile) {
+ fclose(ofile);
+ if (!keep_all)
+ remove(outname);
+ ofile = NULL;
+ }
+ exit(3);
+ break;
+ }
+}
+
+static void usage(void)
+{
+ fputs("type `nasm -h' for help\n", error_file);
+}
+
+static void help(const char xopt)
+{
+ int i;
+
+ printf
+ ("usage: nasm [-@ response file] [-o outfile] [-f format] "
+ "[-l listfile]\n"
+ " [options...] [--] filename\n"
+ " or nasm -v (or --v) for version info\n\n"
+ "\n"
+ "Response files should contain command line parameters,\n"
+ "one per line.\n"
+ "\n"
+ " -t assemble in SciTech TASM compatible mode\n");
+ printf
+ (" -E (or -e) preprocess only (writes output to stdout by default)\n"
+ " -a don't preprocess (assemble only)\n"
+ " -M generate Makefile dependencies on stdout\n"
+ " -MG d:o, missing files assumed generated\n"
+ " -MF file set Makefile dependency file\n"
+ " -MD file assemble and generate dependencies\n"
+ " -MT file dependency target name\n"
+ " -MQ file dependency target name (quoted)\n"
+ " -MP emit phony target\n\n"
+ " -Zfile redirect error messages to file\n"
+ " -s redirect error messages to stdout\n\n"
+ " -g generate debugging information\n\n"
+ " -F format select a debugging format\n\n"
+ " -gformat same as -g -F format\n\n"
+ " -o outfile write output to an outfile\n\n"
+ " -f format select an output format\n\n"
+ " -l listfile write listing to a listfile\n\n"
+ " -Ipath add a pathname to the include file path\n");
+ printf
+ (" -Olevel optimize opcodes, immediates and branch offsets\n"
+ " -O0 no optimization\n"
+ " -O1 minimal optimization\n"
+ " -Ox multipass optimization (default)\n"
+ " -Pfile pre-include a file (also --include)\n"
+ " -Dmacro[=str] pre-define a macro\n"
+ " -Umacro undefine a macro\n"
+ " -Xformat specifiy error reporting format (gnu or vc)\n"
+ " -w+foo enable warning foo (equiv. -Wfoo)\n"
+ " -w-foo disable warning foo (equiv. -Wno-foo)\n"
+ " -w[+-]error[=foo]\n"
+ " promote [specific] warnings to errors\n"
+ " -h show invocation summary and exit (also --help)\n\n"
+ " --pragma str pre-executes a specific %%pragma\n"
+ " --before str add line (usually a preprocessor statement) before the input\n"
+ " --prefix str prepend the given string to all the given string\n"
+ " to all extern, common and global symbols (also --gprefix)\n"
+ " --postfix str append the given string to all the given string\n"
+ " to all extern, common and global symbols (also --gpostfix)\n"
+ " --lprefix str prepend the given string to all other symbols\n"
+ " --lpostfix str append the given string to all other symbols\n"
+ " --keep-all output files will not be removed even if an error happens\n"
+ " --limit-X val set execution limit X\n");
+
+ for (i = 0; i <= LIMIT_MAX; i++) {
+ printf(" %-15s %s (default ",
+ limit_info[i].name, limit_info[i].help);
+ if (nasm_limit[i] < LIMIT_MAX_VAL) {
+ printf("%"PRId64")\n", nasm_limit[i]);
+ } else {
+ printf("unlimited)\n");
+ }
+ }
+
+ printf("\nWarnings for the -W/-w options:\n");
+
+ for (i = 0; i <= ERR_WARN_ALL; i++)
+ printf(" %-23s %s%s\n",
+ warnings[i].name, warnings[i].help,
+ i == ERR_WARN_ALL ? "\n" :
+ warnings[i].enabled ? " (default on)" :
+ " (default off)");
+
+ if (xopt == 'f') {
+ printf("valid output formats for -f are"
+ " (`*' denotes default):\n");
+ ofmt_list(ofmt, stdout);
+ } else {
+ printf("For a list of valid output formats, use -hf.\n");
+ printf("For a list of debug formats, use -f <format> -y.\n");
+ }
+}
diff --git a/asm/parser.c b/asm/parser.c
new file mode 100644
index 00000000..78f347fa
--- /dev/null
+++ b/asm/parser.c
@@ -0,0 +1,1208 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * parser.c source line parser for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "insns.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "stdscan.h"
+#include "eval.h"
+#include "parser.h"
+#include "float.h"
+#include "assemble.h"
+#include "tables.h"
+
+
+static int is_comma_next(void);
+
+static struct tokenval tokval;
+
+static int prefix_slot(int prefix)
+{
+ switch (prefix) {
+ case P_WAIT:
+ return PPS_WAIT;
+ case R_CS:
+ case R_DS:
+ case R_SS:
+ case R_ES:
+ case R_FS:
+ case R_GS:
+ return PPS_SEG;
+ case P_LOCK:
+ return PPS_LOCK;
+ case P_REP:
+ case P_REPE:
+ case P_REPZ:
+ case P_REPNE:
+ case P_REPNZ:
+ case P_XACQUIRE:
+ case P_XRELEASE:
+ case P_BND:
+ case P_NOBND:
+ return PPS_REP;
+ case P_O16:
+ case P_O32:
+ case P_O64:
+ case P_OSP:
+ return PPS_OSIZE;
+ case P_A16:
+ case P_A32:
+ case P_A64:
+ case P_ASP:
+ return PPS_ASIZE;
+ case P_EVEX:
+ case P_VEX3:
+ case P_VEX2:
+ return PPS_VEX;
+ default:
+ nasm_panic("Invalid value %d passed to prefix_slot()", prefix);
+ return -1;
+ }
+}
+
+static void process_size_override(insn *result, operand *op)
+{
+ if (tasm_compatible_mode) {
+ switch (tokval.t_integer) {
+ /* For TASM compatibility a size override inside the
+ * brackets changes the size of the operand, not the
+ * address type of the operand as it does in standard
+ * NASM syntax. Hence:
+ *
+ * mov eax,[DWORD val]
+ *
+ * is valid syntax in TASM compatibility mode. Note that
+ * you lose the ability to override the default address
+ * type for the instruction, but we never use anything
+ * but 32-bit flat model addressing in our code.
+ */
+ case S_BYTE:
+ op->type |= BITS8;
+ break;
+ case S_WORD:
+ op->type |= BITS16;
+ break;
+ case S_DWORD:
+ case S_LONG:
+ op->type |= BITS32;
+ break;
+ case S_QWORD:
+ op->type |= BITS64;
+ break;
+ case S_TWORD:
+ op->type |= BITS80;
+ break;
+ case S_OWORD:
+ op->type |= BITS128;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL,
+ "invalid operand size specification");
+ break;
+ }
+ } else {
+ /* Standard NASM compatible syntax */
+ switch (tokval.t_integer) {
+ case S_NOSPLIT:
+ op->eaflags |= EAF_TIMESTWO;
+ break;
+ case S_REL:
+ op->eaflags |= EAF_REL;
+ break;
+ case S_ABS:
+ op->eaflags |= EAF_ABS;
+ break;
+ case S_BYTE:
+ op->disp_size = 8;
+ op->eaflags |= EAF_BYTEOFFS;
+ break;
+ case P_A16:
+ case P_A32:
+ case P_A64:
+ if (result->prefixes[PPS_ASIZE] &&
+ result->prefixes[PPS_ASIZE] != tokval.t_integer)
+ nasm_error(ERR_NONFATAL,
+ "conflicting address size specifications");
+ else
+ result->prefixes[PPS_ASIZE] = tokval.t_integer;
+ break;
+ case S_WORD:
+ op->disp_size = 16;
+ op->eaflags |= EAF_WORDOFFS;
+ break;
+ case S_DWORD:
+ case S_LONG:
+ op->disp_size = 32;
+ op->eaflags |= EAF_WORDOFFS;
+ break;
+ case S_QWORD:
+ op->disp_size = 64;
+ op->eaflags |= EAF_WORDOFFS;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid size specification in"
+ " effective address");
+ break;
+ }
+ }
+}
+
+/*
+ * Brace decorators are are parsed here. opmask and zeroing
+ * decorators can be placed in any order. e.g. zmm1 {k2}{z} or zmm2
+ * {z}{k3} decorator(s) are placed at the end of an operand.
+ */
+static bool parse_braces(decoflags_t *decoflags)
+{
+ int i, j;
+
+ i = tokval.t_type;
+
+ while (true) {
+ switch (i) {
+ case TOKEN_OPMASK:
+ if (*decoflags & OPMASK_MASK) {
+ nasm_error(ERR_NONFATAL,
+ "opmask k%"PRIu64" is already set",
+ *decoflags & OPMASK_MASK);
+ *decoflags &= ~OPMASK_MASK;
+ }
+ *decoflags |= VAL_OPMASK(nasm_regvals[tokval.t_integer]);
+ break;
+ case TOKEN_DECORATOR:
+ j = tokval.t_integer;
+ switch (j) {
+ case BRC_Z:
+ *decoflags |= Z_MASK;
+ break;
+ case BRC_1TO2:
+ case BRC_1TO4:
+ case BRC_1TO8:
+ case BRC_1TO16:
+ *decoflags |= BRDCAST_MASK | VAL_BRNUM(j - BRC_1TO2);
+ break;
+ default:
+ nasm_error(ERR_NONFATAL,
+ "{%s} is not an expected decorator",
+ tokval.t_charptr);
+ break;
+ }
+ break;
+ case ',':
+ case TOKEN_EOS:
+ return false;
+ default:
+ nasm_error(ERR_NONFATAL,
+ "only a series of valid decorators expected");
+ return true;
+ }
+ i = stdscan(NULL, &tokval);
+ }
+}
+
+static int parse_mref(operand *op, const expr *e)
+{
+ int b, i, s; /* basereg, indexreg, scale */
+ int64_t o; /* offset */
+
+ b = i = -1;
+ o = s = 0;
+ op->segment = op->wrt = NO_SEG;
+
+ if (e->type && e->type <= EXPR_REG_END) { /* this bit's a register */
+ bool is_gpr = is_class(REG_GPR,nasm_reg_flags[e->type]);
+
+ if (is_gpr && e->value == 1)
+ b = e->type; /* It can be basereg */
+ else /* No, it has to be indexreg */
+ i = e->type, s = e->value;
+ e++;
+ }
+ if (e->type && e->type <= EXPR_REG_END) { /* it's a 2nd register */
+ bool is_gpr = is_class(REG_GPR,nasm_reg_flags[e->type]);
+
+ if (b != -1) /* If the first was the base, ... */
+ i = e->type, s = e->value; /* second has to be indexreg */
+
+ else if (!is_gpr || e->value != 1) {
+ /* If both want to be index */
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: two index registers");
+ return -1;
+ } else
+ b = e->type;
+ e++;
+ }
+
+ if (e->type) { /* is there an offset? */
+ if (e->type <= EXPR_REG_END) { /* in fact, is there an error? */
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: impossible register");
+ return -1;
+ } else {
+ if (e->type == EXPR_UNKNOWN) {
+ op->opflags |= OPFLAG_UNKNOWN;
+ o = 0; /* doesn't matter what */
+ while (e->type)
+ e++; /* go to the end of the line */
+ } else {
+ if (e->type == EXPR_SIMPLE) {
+ o = e->value;
+ e++;
+ }
+ if (e->type == EXPR_WRT) {
+ op->wrt = e->value;
+ e++;
+ }
+ /*
+ * Look for a segment base type.
+ */
+ for (; e->type; e++) {
+ if (!e->value)
+ continue;
+
+ if (e->type <= EXPR_REG_END) {
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: too many registers");
+ return -1;
+ } else if (e->type < EXPR_SEGBASE) {
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: bad subexpression type");
+ return -1;
+ } else if (e->value == 1) {
+ if (op->segment != NO_SEG) {
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: multiple base segments");
+ return -1;
+ }
+ op->segment = e->type - EXPR_SEGBASE;
+ } else if (e->value == -1 &&
+ e->type == location.segment + EXPR_SEGBASE &&
+ !(op->opflags & OPFLAG_RELATIVE)) {
+ op->opflags |= OPFLAG_RELATIVE;
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "invalid effective address: impossible segment base multiplier");
+ return -1;
+ }
+ }
+ }
+ }
+ }
+
+ nasm_assert(!e->type); /* We should be at the end */
+
+ op->basereg = b;
+ op->indexreg = i;
+ op->scale = s;
+ op->offset = o;
+ return 0;
+}
+
+static void mref_set_optype(operand *op)
+{
+ int b = op->basereg;
+ int i = op->indexreg;
+ int s = op->scale;
+
+ /* It is memory, but it can match any r/m operand */
+ op->type |= MEMORY_ANY;
+
+ if (b == -1 && (i == -1 || s == 0)) {
+ int is_rel = globalbits == 64 &&
+ !(op->eaflags & EAF_ABS) &&
+ ((globalrel &&
+ !(op->eaflags & EAF_FSGS)) ||
+ (op->eaflags & EAF_REL));
+
+ op->type |= is_rel ? IP_REL : MEM_OFFS;
+ }
+
+ if (i != -1) {
+ opflags_t iclass = nasm_reg_flags[i];
+
+ if (is_class(XMMREG,iclass))
+ op->type |= XMEM;
+ else if (is_class(YMMREG,iclass))
+ op->type |= YMEM;
+ else if (is_class(ZMMREG,iclass))
+ op->type |= ZMEM;
+ }
+}
+
+/*
+ * Convert an expression vector returned from evaluate() into an
+ * extop structure. Return zero on success.
+ */
+static int value_to_extop(expr * vect, extop *eop, int32_t myseg)
+{
+ eop->type = EOT_DB_NUMBER;
+ eop->offset = 0;
+ eop->segment = eop->wrt = NO_SEG;
+ eop->relative = false;
+
+ for (; vect->type; vect++) {
+ if (!vect->value) /* zero term, safe to ignore */
+ continue;
+
+ if (vect->type <= EXPR_REG_END) /* false if a register is present */
+ return -1;
+
+ if (vect->type == EXPR_UNKNOWN) /* something we can't resolve yet */
+ return 0;
+
+ if (vect->type == EXPR_SIMPLE) {
+ /* Simple number expression */
+ eop->offset += vect->value;
+ continue;
+ }
+ if (eop->wrt == NO_SEG && !eop->relative && vect->type == EXPR_WRT) {
+ /* WRT term */
+ eop->wrt = vect->value;
+ continue;
+ }
+
+ if (!eop->relative &&
+ vect->type == EXPR_SEGBASE + myseg && vect->value == -1) {
+ /* Expression of the form: foo - $ */
+ eop->relative = true;
+ continue;
+ }
+
+ if (eop->segment == NO_SEG && vect->type >= EXPR_SEGBASE &&
+ vect->value == 1) {
+ eop->segment = vect->type - EXPR_SEGBASE;
+ continue;
+ }
+
+ /* Otherwise, badness */
+ return -1;
+ }
+
+ /* We got to the end and it was all okay */
+ return 0;
+}
+
+insn *parse_line(int pass, char *buffer, insn *result)
+{
+ bool insn_is_label = false;
+ struct eval_hints hints;
+ int opnum;
+ int critical;
+ bool first;
+ bool recover;
+ int i;
+
+ nasm_static_assert(P_none == 0);
+
+restart_parse:
+ first = true;
+ result->forw_ref = false;
+
+ stdscan_reset();
+ stdscan_set(buffer);
+ i = stdscan(NULL, &tokval);
+
+ memset(result->prefixes, P_none, sizeof(result->prefixes));
+ result->times = 1; /* No TIMES either yet */
+ result->label = NULL; /* Assume no label */
+ result->eops = NULL; /* must do this, whatever happens */
+ result->operands = 0; /* must initialize this */
+ result->evex_rm = 0; /* Ensure EVEX rounding mode is reset */
+ result->evex_brerop = -1; /* Reset EVEX broadcasting/ER op position */
+
+ /* Ignore blank lines */
+ if (i == TOKEN_EOS)
+ goto fail;
+
+ if (i != TOKEN_ID &&
+ i != TOKEN_INSN &&
+ i != TOKEN_PREFIX &&
+ (i != TOKEN_REG || !IS_SREG(tokval.t_integer))) {
+ nasm_error(ERR_NONFATAL,
+ "label or instruction expected at start of line");
+ goto fail;
+ }
+
+ if (i == TOKEN_ID || (insn_is_label && i == TOKEN_INSN)) {
+ /* there's a label here */
+ first = false;
+ result->label = tokval.t_charptr;
+ i = stdscan(NULL, &tokval);
+ if (i == ':') { /* skip over the optional colon */
+ i = stdscan(NULL, &tokval);
+ } else if (i == 0) {
+ nasm_error(ERR_WARNING | ERR_WARN_OL | ERR_PASS1,
+ "label alone on a line without a colon might be in error");
+ }
+ if (i != TOKEN_INSN || tokval.t_integer != I_EQU) {
+ /*
+ * FIXME: location.segment could be NO_SEG, in which case
+ * it is possible we should be passing 'absolute.segment'. Look into this.
+ * Work out whether that is *really* what we should be doing.
+ * Generally fix things. I think this is right as it is, but
+ * am still not certain.
+ */
+ define_label(result->label,
+ in_absolute ? absolute.segment : location.segment,
+ location.offset, true);
+ }
+ }
+
+ /* Just a label here */
+ if (i == TOKEN_EOS)
+ goto fail;
+
+ while (i == TOKEN_PREFIX ||
+ (i == TOKEN_REG && IS_SREG(tokval.t_integer))) {
+ first = false;
+
+ /*
+ * Handle special case: the TIMES prefix.
+ */
+ if (i == TOKEN_PREFIX && tokval.t_integer == P_TIMES) {
+ expr *value;
+
+ i = stdscan(NULL, &tokval);
+ value = evaluate(stdscan, NULL, &tokval, NULL, pass0, NULL);
+ i = tokval.t_type;
+ if (!value) /* Error in evaluator */
+ goto fail;
+ if (!is_simple(value)) {
+ nasm_error(ERR_NONFATAL,
+ "non-constant argument supplied to TIMES");
+ result->times = 1L;
+ } else {
+ result->times = value->value;
+ if (value->value < 0) {
+ nasm_error(ERR_NONFATAL|ERR_PASS2, "TIMES value %"PRId64" is negative", value->value);
+ result->times = 0;
+ }
+ }
+ } else {
+ int slot = prefix_slot(tokval.t_integer);
+ if (result->prefixes[slot]) {
+ if (result->prefixes[slot] == tokval.t_integer)
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "instruction has redundant prefixes");
+ else
+ nasm_error(ERR_NONFATAL,
+ "instruction has conflicting prefixes");
+ }
+ result->prefixes[slot] = tokval.t_integer;
+ i = stdscan(NULL, &tokval);
+ }
+ }
+
+ if (i != TOKEN_INSN) {
+ int j;
+ enum prefixes pfx;
+
+ for (j = 0; j < MAXPREFIX; j++) {
+ if ((pfx = result->prefixes[j]) != P_none)
+ break;
+ }
+
+ if (i == 0 && pfx != P_none) {
+ /*
+ * Instruction prefixes are present, but no actual
+ * instruction. This is allowed: at this point we
+ * invent a notional instruction of RESB 0.
+ */
+ result->opcode = I_RESB;
+ result->operands = 1;
+ nasm_zero(result->oprs);
+ result->oprs[0].type = IMMEDIATE;
+ result->oprs[0].offset = 0L;
+ result->oprs[0].segment = result->oprs[0].wrt = NO_SEG;
+ return result;
+ } else {
+ nasm_error(ERR_NONFATAL, "parser: instruction expected");
+ goto fail;
+ }
+ }
+
+ result->opcode = tokval.t_integer;
+ result->condition = tokval.t_inttwo;
+
+ /*
+ * INCBIN cannot be satisfied with incorrectly
+ * evaluated operands, since the correct values _must_ be known
+ * on the first pass. Hence, even in pass one, we set the
+ * `critical' flag on calling evaluate(), so that it will bomb
+ * out on undefined symbols.
+ */
+ if (result->opcode == I_INCBIN) {
+ critical = (pass0 < 2 ? 1 : 2);
+
+ } else
+ critical = (pass == 2 ? 2 : 0);
+
+ if (opcode_is_db(result->opcode) || result->opcode == I_INCBIN) {
+ extop *eop, **tail = &result->eops, **fixptr;
+ int oper_num = 0;
+ int32_t sign;
+
+ result->eops_float = false;
+
+ /*
+ * Begin to read the DB/DW/DD/DQ/DT/DO/DY/DZ/INCBIN operands.
+ */
+ while (1) {
+ i = stdscan(NULL, &tokval);
+ if (i == TOKEN_EOS)
+ break;
+ else if (first && i == ':') {
+ insn_is_label = true;
+ goto restart_parse;
+ }
+ first = false;
+ fixptr = tail;
+ eop = *tail = nasm_malloc(sizeof(extop));
+ tail = &eop->next;
+ eop->next = NULL;
+ eop->type = EOT_NOTHING;
+ oper_num++;
+ sign = +1;
+
+ /*
+ * is_comma_next() here is to distinguish this from
+ * a string used as part of an expression...
+ */
+ if (i == TOKEN_STR && is_comma_next()) {
+ eop->type = EOT_DB_STRING;
+ eop->stringval = tokval.t_charptr;
+ eop->stringlen = tokval.t_inttwo;
+ i = stdscan(NULL, &tokval); /* eat the comma */
+ } else if (i == TOKEN_STRFUNC) {
+ bool parens = false;
+ const char *funcname = tokval.t_charptr;
+ enum strfunc func = tokval.t_integer;
+ i = stdscan(NULL, &tokval);
+ if (i == '(') {
+ parens = true;
+ i = stdscan(NULL, &tokval);
+ }
+ if (i != TOKEN_STR) {
+ nasm_error(ERR_NONFATAL,
+ "%s must be followed by a string constant",
+ funcname);
+ eop->type = EOT_NOTHING;
+ } else {
+ eop->type = EOT_DB_STRING_FREE;
+ eop->stringlen =
+ string_transform(tokval.t_charptr, tokval.t_inttwo,
+ &eop->stringval, func);
+ if (eop->stringlen == (size_t)-1) {
+ nasm_error(ERR_NONFATAL, "invalid string for transform");
+ eop->type = EOT_NOTHING;
+ }
+ }
+ if (parens && i && i != ')') {
+ i = stdscan(NULL, &tokval);
+ if (i != ')') {
+ nasm_error(ERR_NONFATAL, "unterminated %s function",
+ funcname);
+ }
+ }
+ if (i && i != ',')
+ i = stdscan(NULL, &tokval);
+ } else if (i == '-' || i == '+') {
+ char *save = stdscan_get();
+ int token = i;
+ sign = (i == '-') ? -1 : 1;
+ i = stdscan(NULL, &tokval);
+ if (i != TOKEN_FLOAT) {
+ stdscan_set(save);
+ i = tokval.t_type = token;
+ goto is_expression;
+ } else {
+ goto is_float;
+ }
+ } else if (i == TOKEN_FLOAT) {
+is_float:
+ eop->type = EOT_DB_STRING;
+ result->eops_float = true;
+
+ eop->stringlen = db_bytes(result->opcode);
+ if (eop->stringlen > 16) {
+ nasm_error(ERR_NONFATAL, "floating-point constant"
+ " encountered in DY or DZ instruction");
+ eop->stringlen = 0;
+ } else if (eop->stringlen < 1) {
+ nasm_error(ERR_NONFATAL, "floating-point constant"
+ " encountered in unknown instruction");
+ /*
+ * fix suggested by Pedro Gimeno... original line was:
+ * eop->type = EOT_NOTHING;
+ */
+ eop->stringlen = 0;
+ }
+
+ eop = nasm_realloc(eop, sizeof(extop) + eop->stringlen);
+ tail = &eop->next;
+ *fixptr = eop;
+ eop->stringval = (char *)eop + sizeof(extop);
+ if (!eop->stringlen ||
+ !float_const(tokval.t_charptr, sign,
+ (uint8_t *)eop->stringval, eop->stringlen))
+ eop->type = EOT_NOTHING;
+ i = stdscan(NULL, &tokval); /* eat the comma */
+ } else {
+ /* anything else, assume it is an expression */
+ expr *value;
+
+is_expression:
+ value = evaluate(stdscan, NULL, &tokval, NULL,
+ critical, NULL);
+ i = tokval.t_type;
+ if (!value) /* Error in evaluator */
+ goto fail;
+ if (value_to_extop(value, eop, location.segment)) {
+ nasm_error(ERR_NONFATAL,
+ "operand %d: expression is not simple or relocatable",
+ oper_num);
+ }
+ }
+
+ /*
+ * We're about to call stdscan(), which will eat the
+ * comma that we're currently sitting on between
+ * arguments. However, we'd better check first that it
+ * _is_ a comma.
+ */
+ if (i == TOKEN_EOS) /* also could be EOL */
+ break;
+ if (i != ',') {
+ nasm_error(ERR_NONFATAL, "comma expected after operand %d",
+ oper_num);
+ goto fail;
+ }
+ }
+
+ if (result->opcode == I_INCBIN) {
+ /*
+ * Correct syntax for INCBIN is that there should be
+ * one string operand, followed by one or two numeric
+ * operands.
+ */
+ if (!result->eops || result->eops->type != EOT_DB_STRING)
+ nasm_error(ERR_NONFATAL, "`incbin' expects a file name");
+ else if (result->eops->next &&
+ result->eops->next->type != EOT_DB_NUMBER)
+ nasm_error(ERR_NONFATAL, "`incbin': second parameter is"
+ " non-numeric");
+ else if (result->eops->next && result->eops->next->next &&
+ result->eops->next->next->type != EOT_DB_NUMBER)
+ nasm_error(ERR_NONFATAL, "`incbin': third parameter is"
+ " non-numeric");
+ else if (result->eops->next && result->eops->next->next &&
+ result->eops->next->next->next)
+ nasm_error(ERR_NONFATAL,
+ "`incbin': more than three parameters");
+ else
+ return result;
+ /*
+ * If we reach here, one of the above errors happened.
+ * Throw the instruction away.
+ */
+ goto fail;
+ } else /* DB ... */ if (oper_num == 0)
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "no operand for data declaration");
+ else
+ result->operands = oper_num;
+
+ return result;
+ }
+
+ /*
+ * Now we begin to parse the operands. There may be up to four
+ * of these, separated by commas, and terminated by a zero token.
+ */
+
+ for (opnum = 0; opnum < MAX_OPERANDS; opnum++) {
+ operand *op = &result->oprs[opnum];
+ expr *value; /* used most of the time */
+ bool mref; /* is this going to be a memory ref? */
+ bool bracket; /* is it a [] mref, or a & mref? */
+ bool mib; /* compound (mib) mref? */
+ int setsize = 0;
+ decoflags_t brace_flags = 0; /* flags for decorators in braces */
+
+ op->disp_size = 0; /* have to zero this whatever */
+ op->eaflags = 0; /* and this */
+ op->opflags = 0;
+ op->decoflags = 0;
+
+ i = stdscan(NULL, &tokval);
+ if (i == TOKEN_EOS)
+ break; /* end of operands: get out of here */
+ else if (first && i == ':') {
+ insn_is_label = true;
+ goto restart_parse;
+ }
+ first = false;
+ op->type = 0; /* so far, no override */
+ while (i == TOKEN_SPECIAL) { /* size specifiers */
+ switch (tokval.t_integer) {
+ case S_BYTE:
+ if (!setsize) /* we want to use only the first */
+ op->type |= BITS8;
+ setsize = 1;
+ break;
+ case S_WORD:
+ if (!setsize)
+ op->type |= BITS16;
+ setsize = 1;
+ break;
+ case S_DWORD:
+ case S_LONG:
+ if (!setsize)
+ op->type |= BITS32;
+ setsize = 1;
+ break;
+ case S_QWORD:
+ if (!setsize)
+ op->type |= BITS64;
+ setsize = 1;
+ break;
+ case S_TWORD:
+ if (!setsize)
+ op->type |= BITS80;
+ setsize = 1;
+ break;
+ case S_OWORD:
+ if (!setsize)
+ op->type |= BITS128;
+ setsize = 1;
+ break;
+ case S_YWORD:
+ if (!setsize)
+ op->type |= BITS256;
+ setsize = 1;
+ break;
+ case S_ZWORD:
+ if (!setsize)
+ op->type |= BITS512;
+ setsize = 1;
+ break;
+ case S_TO:
+ op->type |= TO;
+ break;
+ case S_STRICT:
+ op->type |= STRICT;
+ break;
+ case S_FAR:
+ op->type |= FAR;
+ break;
+ case S_NEAR:
+ op->type |= NEAR;
+ break;
+ case S_SHORT:
+ op->type |= SHORT;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid operand size specification");
+ }
+ i = stdscan(NULL, &tokval);
+ }
+
+ if (i == '[' || i == '&') { /* memory reference */
+ mref = true;
+ bracket = (i == '[');
+ i = stdscan(NULL, &tokval); /* then skip the colon */
+ while (i == TOKEN_SPECIAL || i == TOKEN_PREFIX) {
+ process_size_override(result, op);
+ i = stdscan(NULL, &tokval);
+ }
+ /* when a comma follows an opening bracket - [ , eax*4] */
+ if (i == ',') {
+ /* treat as if there is a zero displacement virtually */
+ tokval.t_type = TOKEN_NUM;
+ tokval.t_integer = 0;
+ stdscan_set(stdscan_get() - 1); /* rewind the comma */
+ }
+ } else { /* immediate operand, or register */
+ mref = false;
+ bracket = false; /* placate optimisers */
+ }
+
+ if ((op->type & FAR) && !mref &&
+ result->opcode != I_JMP && result->opcode != I_CALL) {
+ nasm_error(ERR_NONFATAL, "invalid use of FAR operand specifier");
+ }
+
+ value = evaluate(stdscan, NULL, &tokval,
+ &op->opflags, critical, &hints);
+ i = tokval.t_type;
+ if (op->opflags & OPFLAG_FORWARD) {
+ result->forw_ref = true;
+ }
+ if (!value) /* Error in evaluator */
+ goto fail;
+ if (i == ':' && mref) { /* it was seg:offset */
+ /*
+ * Process the segment override.
+ */
+ if (value[1].type != 0 ||
+ value->value != 1 ||
+ !IS_SREG(value->type))
+ nasm_error(ERR_NONFATAL, "invalid segment override");
+ else if (result->prefixes[PPS_SEG])
+ nasm_error(ERR_NONFATAL,
+ "instruction has conflicting segment overrides");
+ else {
+ result->prefixes[PPS_SEG] = value->type;
+ if (IS_FSGS(value->type))
+ op->eaflags |= EAF_FSGS;
+ }
+
+ i = stdscan(NULL, &tokval); /* then skip the colon */
+ while (i == TOKEN_SPECIAL || i == TOKEN_PREFIX) {
+ process_size_override(result, op);
+ i = stdscan(NULL, &tokval);
+ }
+ value = evaluate(stdscan, NULL, &tokval,
+ &op->opflags, critical, &hints);
+ i = tokval.t_type;
+ if (op->opflags & OPFLAG_FORWARD) {
+ result->forw_ref = true;
+ }
+ /* and get the offset */
+ if (!value) /* Error in evaluator */
+ goto fail;
+ }
+
+ mib = false;
+ if (mref && bracket && i == ',') {
+ /* [seg:base+offset,index*scale] syntax (mib) */
+
+ operand o1, o2; /* Partial operands */
+
+ if (parse_mref(&o1, value))
+ goto fail;
+
+ i = stdscan(NULL, &tokval); /* Eat comma */
+ value = evaluate(stdscan, NULL, &tokval, &op->opflags,
+ critical, &hints);
+ i = tokval.t_type;
+ if (!value)
+ goto fail;
+
+ if (parse_mref(&o2, value))
+ goto fail;
+
+ if (o2.basereg != -1 && o2.indexreg == -1) {
+ o2.indexreg = o2.basereg;
+ o2.scale = 1;
+ o2.basereg = -1;
+ }
+
+ if (o1.indexreg != -1 || o2.basereg != -1 || o2.offset != 0 ||
+ o2.segment != NO_SEG || o2.wrt != NO_SEG) {
+ nasm_error(ERR_NONFATAL, "invalid mib expression");
+ goto fail;
+ }
+
+ op->basereg = o1.basereg;
+ op->indexreg = o2.indexreg;
+ op->scale = o2.scale;
+ op->offset = o1.offset;
+ op->segment = o1.segment;
+ op->wrt = o1.wrt;
+
+ if (op->basereg != -1) {
+ op->hintbase = op->basereg;
+ op->hinttype = EAH_MAKEBASE;
+ } else if (op->indexreg != -1) {
+ op->hintbase = op->indexreg;
+ op->hinttype = EAH_NOTBASE;
+ } else {
+ op->hintbase = -1;
+ op->hinttype = EAH_NOHINT;
+ }
+
+ mib = true;
+ }
+
+ recover = false;
+ if (mref && bracket) { /* find ] at the end */
+ if (i != ']') {
+ nasm_error(ERR_NONFATAL, "parser: expecting ]");
+ recover = true;
+ } else { /* we got the required ] */
+ i = stdscan(NULL, &tokval);
+ if (i == TOKEN_DECORATOR || i == TOKEN_OPMASK) {
+ /* parse opmask (and zeroing) after an operand */
+ recover = parse_braces(&brace_flags);
+ i = tokval.t_type;
+ }
+ if (i != 0 && i != ',') {
+ nasm_error(ERR_NONFATAL, "comma or end of line expected");
+ recover = true;
+ }
+ }
+ } else { /* immediate operand */
+ if (i != 0 && i != ',' && i != ':' &&
+ i != TOKEN_DECORATOR && i != TOKEN_OPMASK) {
+ nasm_error(ERR_NONFATAL, "comma, colon, decorator or end of "
+ "line expected after operand");
+ recover = true;
+ } else if (i == ':') {
+ op->type |= COLON;
+ } else if (i == TOKEN_DECORATOR || i == TOKEN_OPMASK) {
+ /* parse opmask (and zeroing) after an operand */
+ recover = parse_braces(&brace_flags);
+ }
+ }
+ if (recover) {
+ do { /* error recovery */
+ i = stdscan(NULL, &tokval);
+ } while (i != 0 && i != ',');
+ }
+
+ /*
+ * now convert the exprs returned from evaluate()
+ * into operand descriptions...
+ */
+ op->decoflags |= brace_flags;
+
+ if (mref) { /* it's a memory reference */
+ /* A mib reference was fully parsed already */
+ if (!mib) {
+ if (parse_mref(op, value))
+ goto fail;
+ op->hintbase = hints.base;
+ op->hinttype = hints.type;
+ }
+ mref_set_optype(op);
+ } else { /* it's not a memory reference */
+ if (is_just_unknown(value)) { /* it's immediate but unknown */
+ op->type |= IMMEDIATE;
+ op->opflags |= OPFLAG_UNKNOWN;
+ op->offset = 0; /* don't care */
+ op->segment = NO_SEG; /* don't care again */
+ op->wrt = NO_SEG; /* still don't care */
+
+ if(optimizing.level >= 0 && !(op->type & STRICT)) {
+ /* Be optimistic */
+ op->type |=
+ UNITY | SBYTEWORD | SBYTEDWORD | UDWORD | SDWORD;
+ }
+ } else if (is_reloc(value)) { /* it's immediate */
+ uint64_t n = reloc_value(value);
+
+ op->type |= IMMEDIATE;
+ op->offset = n;
+ op->segment = reloc_seg(value);
+ op->wrt = reloc_wrt(value);
+ op->opflags |= is_self_relative(value) ? OPFLAG_RELATIVE : 0;
+
+ if (is_simple(value)) {
+ if (n == 1)
+ op->type |= UNITY;
+ if (optimizing.level >= 0 && !(op->type & STRICT)) {
+ if ((uint32_t) (n + 128) <= 255)
+ op->type |= SBYTEDWORD;
+ if ((uint16_t) (n + 128) <= 255)
+ op->type |= SBYTEWORD;
+ if (n <= UINT64_C(0xFFFFFFFF))
+ op->type |= UDWORD;
+ if (n + UINT64_C(0x80000000) <= UINT64_C(0xFFFFFFFF))
+ op->type |= SDWORD;
+ }
+ }
+ } else if (value->type == EXPR_RDSAE) {
+ /*
+ * it's not an operand but a rounding or SAE decorator.
+ * put the decorator information in the (opflag_t) type field
+ * of previous operand.
+ */
+ opnum--; op--;
+ switch (value->value) {
+ case BRC_RN:
+ case BRC_RU:
+ case BRC_RD:
+ case BRC_RZ:
+ case BRC_SAE:
+ op->decoflags |= (value->value == BRC_SAE ? SAE : ER);
+ result->evex_rm = value->value;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid decorator");
+ break;
+ }
+ } else { /* it's a register */
+ opflags_t rs;
+ uint64_t regset_size = 0;
+
+ if (value->type >= EXPR_SIMPLE || value->value != 1) {
+ nasm_error(ERR_NONFATAL, "invalid operand type");
+ goto fail;
+ }
+
+ /*
+ * We do not allow any kind of expression, except for
+ * reg+value in which case it is a register set.
+ */
+ for (i = 1; value[i].type; i++) {
+ if (!value[i].value)
+ continue;
+
+ switch (value[i].type) {
+ case EXPR_SIMPLE:
+ if (!regset_size) {
+ regset_size = value[i].value + 1;
+ break;
+ }
+ /* fallthrough */
+ default:
+ nasm_error(ERR_NONFATAL, "invalid operand type");
+ goto fail;
+ }
+ }
+
+ if ((regset_size & (regset_size - 1)) ||
+ regset_size >= (UINT64_C(1) << REGSET_BITS)) {
+ nasm_error(ERR_NONFATAL | ERR_PASS2,
+ "invalid register set size");
+ regset_size = 0;
+ }
+
+ /* clear overrides, except TO which applies to FPU regs */
+ if (op->type & ~TO) {
+ /*
+ * we want to produce a warning iff the specified size
+ * is different from the register size
+ */
+ rs = op->type & SIZE_MASK;
+ } else {
+ rs = 0;
+ }
+
+ /*
+ * Make sure we're not out of nasm_reg_flags, still
+ * probably this should be fixed when we're defining
+ * the label.
+ *
+ * An easy trigger is
+ *
+ * e equ 0x80000000:0
+ * pshufw word e-0
+ *
+ */
+ if (value->type < EXPR_REG_START ||
+ value->type > EXPR_REG_END) {
+ nasm_error(ERR_NONFATAL, "invalid operand type");
+ goto fail;
+ }
+
+ op->type &= TO;
+ op->type |= REGISTER;
+ op->type |= nasm_reg_flags[value->type];
+ op->type |= (regset_size >> 1) << REGSET_SHIFT;
+ op->decoflags |= brace_flags;
+ op->basereg = value->type;
+
+ if (rs && (op->type & SIZE_MASK) != rs)
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "register size specification ignored");
+ }
+ }
+
+ /* remember the position of operand having broadcasting/ER mode */
+ if (op->decoflags & (BRDCAST_MASK | ER | SAE))
+ result->evex_brerop = opnum;
+ }
+
+ result->operands = opnum; /* set operand count */
+
+ /* clear remaining operands */
+ while (opnum < MAX_OPERANDS)
+ result->oprs[opnum++].type = 0;
+
+ /*
+ * Transform RESW, RESD, RESQ, REST, RESO, RESY, RESZ into RESB.
+ */
+ if (opcode_is_resb(result->opcode)) {
+ result->oprs[0].offset *= resb_bytes(result->opcode);
+ result->oprs[0].offset *= result->times;
+ result->times = 1;
+ result->opcode = I_RESB;
+ }
+
+ return result;
+
+fail:
+ result->opcode = I_none;
+ return result;
+}
+
+static int is_comma_next(void)
+{
+ struct tokenval tv;
+ char *p;
+ int i;
+
+ p = stdscan_get();
+ i = stdscan(NULL, &tv);
+ stdscan_set(p);
+
+ return (i == ',' || i == ';' || !i);
+}
+
+void cleanup_insn(insn * i)
+{
+ extop *e;
+
+ while ((e = i->eops)) {
+ i->eops = e->next;
+ if (e->type == EOT_DB_STRING_FREE)
+ nasm_free(e->stringval);
+ nasm_free(e);
+ }
+}
diff --git a/asm/parser.h b/asm/parser.h
new file mode 100644
index 00000000..cd2d1362
--- /dev/null
+++ b/asm/parser.h
@@ -0,0 +1,45 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * parser.h header file for the parser module of the Netwide
+ * Assembler
+ */
+
+#ifndef NASM_PARSER_H
+#define NASM_PARSER_H
+
+insn *parse_line(int pass, char *buffer, insn *result);
+void cleanup_insn(insn *instruction);
+
+#endif
diff --git a/asm/phash.pl b/asm/phash.pl
new file mode 100755
index 00000000..3ef6e714
--- /dev/null
+++ b/asm/phash.pl
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 the NASM Authors - All rights reserved.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Perfect Minimal Hash Generator written in Perl, which produces
+# C output.
+#
+
+require 'phash.ph';
+
+#
+# Read input file
+#
+sub read_input() {
+ my $key,$val;
+ my %out;
+ my $x = 0;
+
+ while (defined($l = <STDIN>)) {
+ chomp $l;
+ $l =~ s/\s*(\#.*|)$//;
+
+ next if ($l eq '');
+
+ if ($l =~ /^([^=]+)\=([^=]+)$/) {
+ $out{$1} = $2;
+ $x = $2;
+ } else {
+ $out{$l} = $x;
+ }
+ $x++;
+ }
+
+ return %out;
+}
+
+#
+# Main program
+#
+sub main() {
+ my $n;
+ my %data;
+ my @hashinfo;
+ my $x, $i;
+
+ %data = read_input();
+ @hashinfo = gen_perfect_hash(\%data);
+
+ if (!@hashinfo) {
+ die "$0: no hash found\n";
+ }
+
+ verify_hash_table(\%data, \@hashinfo);
+
+ ($n, $sv, $f1, $f2, $g) = @hashinfo;
+
+ print "static int HASHNAME_fg1[$n] =\n";
+ print "{\n";
+ for ($i = 0; $i < $n; $i++) {
+ print "\t", ${$g}[${$f1}[$i]], "\n";
+ }
+ print "};\n\n";
+
+ print "static int HASHNAME_fg2[$n] =\n";
+ print "{\n";
+ for ($i = 0; $i < $n; $i++) {
+ print "\t", ${$g}[${$f2}[$i]], "\n";
+ }
+ print "};\n\n";
+
+ print "struct p_hash HASHNAME =\n";
+ print "{\n";
+ print "\t$n\n";
+ print "\t$sv\n";
+ print "\tHASHNAME_fg1,\n";
+ print "\tHASHNAME_fg2,\n";
+ print "};\n";
+}
+
+main();
diff --git a/asm/pptok.c b/asm/pptok.c
new file mode 100644
index 00000000..51a008ce
--- /dev/null
+++ b/asm/pptok.c
@@ -0,0 +1,511 @@
+/* Automatically generated from ./asm/pptok.dat by ./asm/pptok.pl */
+/* Do not edit */
+
+#include "compiler.h"
+#include <ctype.h>
+#include "nasmlib.h"
+#include "hashtbl.h"
+#include "preproc.h"
+
+const char * const pp_directives[109] = {
+ "%elif",
+ "%elifn",
+ "%elifctx",
+ "%elifnctx",
+ "%elifdef",
+ "%elifndef",
+ "%elifempty",
+ "%elifnempty",
+ "%elifenv",
+ "%elifnenv",
+ "%elifid",
+ "%elifnid",
+ "%elifidn",
+ "%elifnidn",
+ "%elifidni",
+ "%elifnidni",
+ "%elifmacro",
+ "%elifnmacro",
+ "%elifnum",
+ "%elifnnum",
+ "%elifstr",
+ "%elifnstr",
+ "%eliftoken",
+ "%elifntoken",
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ "%if",
+ "%ifn",
+ "%ifctx",
+ "%ifnctx",
+ "%ifdef",
+ "%ifndef",
+ "%ifempty",
+ "%ifnempty",
+ "%ifenv",
+ "%ifnenv",
+ "%ifid",
+ "%ifnid",
+ "%ifidn",
+ "%ifnidn",
+ "%ifidni",
+ "%ifnidni",
+ "%ifmacro",
+ "%ifnmacro",
+ "%ifnum",
+ "%ifnnum",
+ "%ifstr",
+ "%ifnstr",
+ "%iftoken",
+ "%ifntoken",
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ "%arg",
+ "%assign",
+ "%clear",
+ "%define",
+ "%defstr",
+ "%deftok",
+ "%depend",
+ "%else",
+ "%endif",
+ "%endm",
+ "%endmacro",
+ "%endrep",
+ "%error",
+ "%exitmacro",
+ "%exitrep",
+ "%fatal",
+ "%iassign",
+ "%idefine",
+ "%idefstr",
+ "%ideftok",
+ "%imacro",
+ "%include",
+ "%irmacro",
+ "%ixdefine",
+ "%line",
+ "%local",
+ "%macro",
+ "%pathsearch",
+ "%pop",
+ "%pragma",
+ "%push",
+ "%rep",
+ "%repl",
+ "%rmacro",
+ "%rotate",
+ "%stacksize",
+ "%strcat",
+ "%strlen",
+ "%substr",
+ "%undef",
+ "%unimacro",
+ "%unmacro",
+ "%use",
+ "%warning",
+ "%xdefine",
+};
+const uint8_t pp_directives_len[109] = {
+ 5,
+ 6,
+ 8,
+ 9,
+ 8,
+ 9,
+ 10,
+ 11,
+ 8,
+ 9,
+ 7,
+ 8,
+ 8,
+ 9,
+ 9,
+ 10,
+ 10,
+ 11,
+ 8,
+ 9,
+ 8,
+ 9,
+ 10,
+ 11,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3,
+ 4,
+ 6,
+ 7,
+ 6,
+ 7,
+ 8,
+ 9,
+ 6,
+ 7,
+ 5,
+ 6,
+ 6,
+ 7,
+ 7,
+ 8,
+ 8,
+ 9,
+ 6,
+ 7,
+ 6,
+ 7,
+ 8,
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 7,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 5,
+ 6,
+ 5,
+ 9,
+ 7,
+ 6,
+ 10,
+ 8,
+ 6,
+ 8,
+ 8,
+ 8,
+ 8,
+ 7,
+ 8,
+ 8,
+ 9,
+ 5,
+ 6,
+ 6,
+ 11,
+ 4,
+ 7,
+ 5,
+ 4,
+ 5,
+ 7,
+ 7,
+ 10,
+ 7,
+ 7,
+ 7,
+ 6,
+ 9,
+ 8,
+ 4,
+ 8,
+ 8,
+};
+enum preproc_token pp_token_hash(const char *token)
+{
+#define UNUSED (65535/3)
+ static const int16_t hash1[128] = {
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ -45,
+ UNUSED,
+ 0,
+ UNUSED,
+ -60,
+ 0,
+ UNUSED,
+ UNUSED,
+ -42,
+ UNUSED,
+ UNUSED,
+ -49,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 48,
+ UNUSED,
+ UNUSED,
+ 49,
+ 5,
+ UNUSED,
+ -53,
+ 65,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 38,
+ UNUSED,
+ 31,
+ 0,
+ UNUSED,
+ 6,
+ 35,
+ UNUSED,
+ UNUSED,
+ 60,
+ 33,
+ UNUSED,
+ 136,
+ UNUSED,
+ -87,
+ -12,
+ 42,
+ 17,
+ 0,
+ 130,
+ -85,
+ UNUSED,
+ UNUSED,
+ 82,
+ 0,
+ UNUSED,
+ 16,
+ 98,
+ -66,
+ -100,
+ 0,
+ -10,
+ -76,
+ UNUSED,
+ 84,
+ UNUSED,
+ 1,
+ UNUSED,
+ 0,
+ 12,
+ UNUSED,
+ -145,
+ 41,
+ 106,
+ UNUSED,
+ 85,
+ UNUSED,
+ 43,
+ 85,
+ UNUSED,
+ 23,
+ 0,
+ -14,
+ UNUSED,
+ UNUSED,
+ 77,
+ -2,
+ UNUSED,
+ UNUSED,
+ 11,
+ 91,
+ -7,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 107,
+ 44,
+ UNUSED,
+ };
+ static const int16_t hash2[128] = {
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 80,
+ 0,
+ 64,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 64,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 121,
+ 0,
+ UNUSED,
+ 22,
+ 100,
+ 63,
+ UNUSED,
+ 114,
+ UNUSED,
+ 178,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ -40,
+ UNUSED,
+ 88,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 87,
+ UNUSED,
+ 42,
+ UNUSED,
+ UNUSED,
+ 141,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 103,
+ UNUSED,
+ 46,
+ 106,
+ 149,
+ UNUSED,
+ 23,
+ 53,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 33,
+ 0,
+ 0,
+ 92,
+ UNUSED,
+ 50,
+ 72,
+ UNUSED,
+ 7,
+ 43,
+ 66,
+ UNUSED,
+ UNUSED,
+ 113,
+ 52,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 99,
+ 101,
+ 71,
+ UNUSED,
+ 20,
+ 63,
+ 32,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 97,
+ 18,
+ 84,
+ 132,
+ UNUSED,
+ 37,
+ UNUSED,
+ 9,
+ 20,
+ UNUSED,
+ UNUSED,
+ 75,
+ 98,
+ UNUSED,
+ };
+ uint32_t k1, k2;
+ uint64_t crc;
+ uint16_t ix;
+
+ crc = crc64i(UINT64_C(0xaee7ac5ccabdec91), token);
+ k1 = (uint32_t)crc;
+ k2 = (uint32_t)(crc >> 32);
+
+ ix = hash1[k1 & 0x7f] + hash2[k2 & 0x7f];
+ if (ix >= 109)
+ return PP_INVALID;
+
+ if (!pp_directives[ix] || nasm_stricmp(pp_directives[ix], token))
+ return PP_INVALID;
+
+ return ix;
+}
diff --git a/asm/pptok.dat b/asm/pptok.dat
new file mode 100644
index 00000000..a2c64d0a
--- /dev/null
+++ b/asm/pptok.dat
@@ -0,0 +1,96 @@
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2016 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# A * at the end indicates a condition; the list of conditions are
+# on lines starting with *; the negatives are auto-generated
+#
+*
+*ctx
+*def
+*empty
+*env
+*id
+*idn
+*idni
+*macro
+*num
+*str
+*token
+%arg
+%assign
+%clear
+%define
+%defstr
+%deftok
+%depend
+%elif*
+%else
+%endif
+%endm
+%endmacro
+%endrep
+%error
+%exitmacro
+%exitrep
+%fatal
+%iassign
+%idefine
+%idefstr
+%ideftok
+%if*
+%imacro
+%irmacro
+%include
+%ixdefine
+%line
+%local
+%macro
+%pathsearch
+%pop
+%pragma
+%push
+%rep
+%repl
+%rmacro
+%rotate
+%stacksize
+%strcat
+%strlen
+%substr
+%undef
+%unimacro
+%unmacro
+%use
+%warning
+%xdefine
diff --git a/asm/pptok.h b/asm/pptok.h
new file mode 100644
index 00000000..9bbc8d11
--- /dev/null
+++ b/asm/pptok.h
@@ -0,0 +1,158 @@
+/* Automatically generated from ./asm/pptok.dat by ./asm/pptok.pl */
+/* Do not edit */
+
+enum preproc_token {
+ PP_ELIF = 0,
+ PP_ELIFN = 1,
+ PP_ELIFCTX = 2,
+ PP_ELIFNCTX = 3,
+ PP_ELIFDEF = 4,
+ PP_ELIFNDEF = 5,
+ PP_ELIFEMPTY = 6,
+ PP_ELIFNEMPTY = 7,
+ PP_ELIFENV = 8,
+ PP_ELIFNENV = 9,
+ PP_ELIFID = 10,
+ PP_ELIFNID = 11,
+ PP_ELIFIDN = 12,
+ PP_ELIFNIDN = 13,
+ PP_ELIFIDNI = 14,
+ PP_ELIFNIDNI = 15,
+ PP_ELIFMACRO = 16,
+ PP_ELIFNMACRO = 17,
+ PP_ELIFNUM = 18,
+ PP_ELIFNNUM = 19,
+ PP_ELIFSTR = 20,
+ PP_ELIFNSTR = 21,
+ PP_ELIFTOKEN = 22,
+ PP_ELIFNTOKEN = 23,
+ PP_IF = 32,
+ PP_IFN = 33,
+ PP_IFCTX = 34,
+ PP_IFNCTX = 35,
+ PP_IFDEF = 36,
+ PP_IFNDEF = 37,
+ PP_IFEMPTY = 38,
+ PP_IFNEMPTY = 39,
+ PP_IFENV = 40,
+ PP_IFNENV = 41,
+ PP_IFID = 42,
+ PP_IFNID = 43,
+ PP_IFIDN = 44,
+ PP_IFNIDN = 45,
+ PP_IFIDNI = 46,
+ PP_IFNIDNI = 47,
+ PP_IFMACRO = 48,
+ PP_IFNMACRO = 49,
+ PP_IFNUM = 50,
+ PP_IFNNUM = 51,
+ PP_IFSTR = 52,
+ PP_IFNSTR = 53,
+ PP_IFTOKEN = 54,
+ PP_IFNTOKEN = 55,
+ PP_ARG = 64,
+ PP_ASSIGN = 65,
+ PP_CLEAR = 66,
+ PP_DEFINE = 67,
+ PP_DEFSTR = 68,
+ PP_DEFTOK = 69,
+ PP_DEPEND = 70,
+ PP_ELSE = 71,
+ PP_ENDIF = 72,
+ PP_ENDM = 73,
+ PP_ENDMACRO = 74,
+ PP_ENDREP = 75,
+ PP_ERROR = 76,
+ PP_EXITMACRO = 77,
+ PP_EXITREP = 78,
+ PP_FATAL = 79,
+ PP_IASSIGN = 80,
+ PP_IDEFINE = 81,
+ PP_IDEFSTR = 82,
+ PP_IDEFTOK = 83,
+ PP_IMACRO = 84,
+ PP_INCLUDE = 85,
+ PP_IRMACRO = 86,
+ PP_IXDEFINE = 87,
+ PP_LINE = 88,
+ PP_LOCAL = 89,
+ PP_MACRO = 90,
+ PP_PATHSEARCH = 91,
+ PP_POP = 92,
+ PP_PRAGMA = 93,
+ PP_PUSH = 94,
+ PP_REP = 95,
+ PP_REPL = 96,
+ PP_RMACRO = 97,
+ PP_ROTATE = 98,
+ PP_STACKSIZE = 99,
+ PP_STRCAT = 100,
+ PP_STRLEN = 101,
+ PP_SUBSTR = 102,
+ PP_UNDEF = 103,
+ PP_UNIMACRO = 104,
+ PP_UNMACRO = 105,
+ PP_USE = 106,
+ PP_WARNING = 107,
+ PP_XDEFINE = 108,
+ PP_INVALID = -1
+};
+
+enum pp_conditional {
+ PPC_IF = 0, PPC_IFCTX = 2, PPC_IFDEF = 4, PPC_IFEMPTY = 6, PPC_IFENV = 8, PPC_IFID = 10, PPC_IFIDN = 12, PPC_IFIDNI = 14, PPC_IFMACRO = 16, PPC_IFNUM = 18, PPC_IFSTR = 20, PPC_IFTOKEN = 22
+};
+
+#define PP_COND(x) ((enum pp_conditional)((x) & 0x1e))
+#define PP_IS_COND(x) ((unsigned int)(x) < PP_ARG)
+#define PP_NEGATIVE(x) ((x) & 1)
+
+#define CASE_PP_ELIF \
+ case PP_ELIF: \
+ case PP_ELIFN:\
+ case PP_ELIFCTX: \
+ case PP_ELIFNCTX:\
+ case PP_ELIFDEF: \
+ case PP_ELIFNDEF:\
+ case PP_ELIFEMPTY: \
+ case PP_ELIFNEMPTY:\
+ case PP_ELIFENV: \
+ case PP_ELIFNENV:\
+ case PP_ELIFID: \
+ case PP_ELIFNID:\
+ case PP_ELIFIDN: \
+ case PP_ELIFNIDN:\
+ case PP_ELIFIDNI: \
+ case PP_ELIFNIDNI:\
+ case PP_ELIFMACRO: \
+ case PP_ELIFNMACRO:\
+ case PP_ELIFNUM: \
+ case PP_ELIFNNUM:\
+ case PP_ELIFSTR: \
+ case PP_ELIFNSTR:\
+ case PP_ELIFTOKEN: \
+ case PP_ELIFNTOKEN
+#define CASE_PP_IF \
+ case PP_IF: \
+ case PP_IFN:\
+ case PP_IFCTX: \
+ case PP_IFNCTX:\
+ case PP_IFDEF: \
+ case PP_IFNDEF:\
+ case PP_IFEMPTY: \
+ case PP_IFNEMPTY:\
+ case PP_IFENV: \
+ case PP_IFNENV:\
+ case PP_IFID: \
+ case PP_IFNID:\
+ case PP_IFIDN: \
+ case PP_IFNIDN:\
+ case PP_IFIDNI: \
+ case PP_IFNIDNI:\
+ case PP_IFMACRO: \
+ case PP_IFNMACRO:\
+ case PP_IFNUM: \
+ case PP_IFNNUM:\
+ case PP_IFSTR: \
+ case PP_IFNSTR:\
+ case PP_IFTOKEN: \
+ case PP_IFNTOKEN
diff --git a/asm/pptok.pl b/asm/pptok.pl
new file mode 100755
index 00000000..41f5f9fc
--- /dev/null
+++ b/asm/pptok.pl
@@ -0,0 +1,271 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Produce pptok.c, pptok.h and pptok.ph from pptok.dat
+#
+
+require 'phash.ph';
+
+my($what, $in, $out) = @ARGV;
+
+#
+# Read pptok.dat
+#
+open(IN, '<', $in) or die "$0: cannot open: $in\n";
+while (defined($line = <IN>)) {
+ $line =~ s/\r?\n$//; # Remove trailing \r\n or \n
+ $line =~ s/^\s+//; # Remove leading whitespace
+ $line =~ s/\s*\#.*$//; # Remove comments and trailing whitespace
+ next if ($line eq '');
+
+ if ($line =~ /^\%(.*)\*$/) {
+ push(@cctok, $1);
+ } elsif ($line =~ /^\%(.*)$/) {
+ push(@pptok, $1);
+ } elsif ($line =~ /^\*(.*)$/) {
+ push(@cond, $1);
+ }
+}
+close(IN);
+
+@cctok = sort @cctok;
+@cond = sort @cond;
+@pptok = sort @pptok;
+
+# Generate the expanded list including conditionals. The conditionals
+# are at the beginning, padded to a power of 2, with the inverses
+# interspersed; this allows a simple mask to pick out the condition.
+
+while ((scalar @cond) & (scalar @cond)-1) {
+ push(@cond, undef);
+}
+
+@cptok = ();
+foreach $ct (@cctok) {
+ foreach $cc (@cond) {
+ if (defined($cc)) {
+ push(@cptok, $ct.$cc);
+ push(@cptok, $ct.'n'.$cc);
+ } else {
+ push(@cptok, undef, undef);
+ }
+ }
+}
+$first_uncond = $pptok[0];
+@pptok = (@cptok, @pptok);
+
+open(OUT, '>', $out) or die "$0: cannot open: $out\n";
+
+#
+# Output pptok.h
+#
+if ($what eq 'h') {
+ print OUT "/* Automatically generated from $in by $0 */\n";
+ print OUT "/* Do not edit */\n";
+ print OUT "\n";
+
+ print OUT "enum preproc_token {\n";
+ $n = 0;
+ foreach $pt (@pptok) {
+ if (defined($pt)) {
+ printf OUT " %-16s = %3d,\n", "PP_\U$pt\E", $n;
+ }
+ $n++;
+ }
+ printf OUT " %-16s = %3d\n", 'PP_INVALID', -1;
+ print OUT "};\n";
+ print OUT "\n";
+
+ print OUT "enum pp_conditional {\n";
+ $n = 0;
+ $c = '';
+ foreach $cc (@cond) {
+ if (defined($cc)) {
+ printf OUT "$c %-16s = %3d", "PPC_IF\U$cc\E", $n;
+ $c = ',';
+ }
+ $n += 2;
+ }
+ print OUT "\n};\n\n";
+
+ printf OUT "#define PP_COND(x) ((enum pp_conditional)((x) & 0x%x))\n",
+ (scalar(@cond)-1) << 1;
+ print OUT "#define PP_IS_COND(x) ((unsigned int)(x) < PP_\U$first_uncond\E)\n";
+ print OUT "#define PP_NEGATIVE(x) ((x) & 1)\n";
+ print OUT "\n";
+
+ foreach $ct (@cctok) {
+ print OUT "#define CASE_PP_\U$ct\E";
+ $pref = " \\\n";
+ foreach $cc (@cond) {
+ if (defined($cc)) {
+ print OUT "$pref\tcase PP_\U${ct}${cc}\E: \\\n";
+ print OUT "\tcase PP_\U${ct}N${cc}\E";
+ $pref = ":\\\n";
+ }
+ }
+ print OUT "\n"; # No colon or newline on the last one
+ }
+}
+
+#
+# Output pptok.c
+#
+if ($what eq 'c') {
+ print OUT "/* Automatically generated from $in by $0 */\n";
+ print OUT "/* Do not edit */\n";
+ print OUT "\n";
+
+ my %tokens = ();
+ my @tokendata = ();
+
+ my $n = 0;
+ foreach $pt (@pptok) {
+ if (defined($pt)) {
+ $tokens{'%'.$pt} = $n;
+ if ($pt =~ /[\@\[\]\\_]/) {
+ # Fail on characters which look like upper-case letters
+ # to the quick-and-dirty downcasing in the prehash
+ # (see below)
+ die "$in: invalid character in token: $pt";
+ }
+ }
+ $n++;
+ }
+
+ my @hashinfo = gen_perfect_hash(\%tokens);
+ if (!@hashinfo) {
+ die "$0: no hash found\n";
+ }
+
+ # Paranoia...
+ verify_hash_table(\%tokens, \@hashinfo);
+
+ ($n, $sv, $g) = @hashinfo;
+ $sv2 = $sv+2;
+
+ die if ($n & ($n-1));
+
+ print OUT "#include \"compiler.h\"\n";
+ print OUT "#include <ctype.h>\n";
+ print OUT "#include \"nasmlib.h\"\n";
+ print OUT "#include \"hashtbl.h\"\n";
+ print OUT "#include \"preproc.h\"\n";
+ print OUT "\n";
+
+ # Note that this is global.
+ printf OUT "const char * const pp_directives[%d] = {\n", scalar(@pptok);
+ foreach $d (@pptok) {
+ if (defined($d)) {
+ print OUT " \"%$d\",\n";
+ } else {
+ print OUT " NULL,\n";
+ }
+ }
+ print OUT "};\n";
+
+ printf OUT "const uint8_t pp_directives_len[%d] = {\n", scalar(@pptok);
+ foreach $d (@pptok) {
+ printf OUT " %d,\n", defined($d) ? length($d)+1 : 0;
+ }
+ print OUT "};\n";
+
+ print OUT "enum preproc_token pp_token_hash(const char *token)\n";
+ print OUT "{\n";
+
+ # Put a large value in unused slots. This makes it extremely unlikely
+ # that any combination that involves unused slot will pass the range test.
+ # This speeds up rejection of unrecognized tokens, i.e. identifiers.
+ print OUT "#define UNUSED (65535/3)\n";
+
+ print OUT " static const int16_t hash1[$n] = {\n";
+ for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+0];
+ print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
+ }
+ print OUT " };\n";
+
+ print OUT " static const int16_t hash2[$n] = {\n";
+ for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+1];
+ print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
+ }
+ print OUT " };\n";
+
+ print OUT " uint32_t k1, k2;\n";
+ print OUT " uint64_t crc;\n";
+ # For correct overflow behavior, "ix" should be unsigned of the same
+ # width as the hash arrays.
+ print OUT " uint16_t ix;\n";
+ print OUT "\n";
+
+ printf OUT " crc = crc64i(UINT64_C(0x%08x%08x), token);\n",
+ $$sv[0], $$sv[1];
+ print OUT " k1 = (uint32_t)crc;\n";
+ print OUT " k2 = (uint32_t)(crc >> 32);\n";
+ print OUT "\n";
+ printf OUT " ix = hash1[k1 & 0x%x] + hash2[k2 & 0x%x];\n", $n-1, $n-1;
+ printf OUT " if (ix >= %d)\n", scalar(@pptok);
+ print OUT " return PP_INVALID;\n";
+ print OUT "\n";
+
+ print OUT " if (!pp_directives[ix] || nasm_stricmp(pp_directives[ix], token))\n";
+ print OUT " return PP_INVALID;\n";
+ print OUT "\n";
+ print OUT " return ix;\n";
+ print OUT "}\n";
+}
+
+#
+# Output pptok.ph
+#
+if ($what eq 'ph') {
+ print OUT "# Automatically generated from $in by $0\n";
+ print OUT "# Do not edit\n";
+ print OUT "\n";
+
+ print OUT "%pptok_hash = (\n";
+ $n = 0;
+ foreach $tok (@pptok) {
+ if (defined($tok)) {
+ printf OUT " '%%%s' => %d,\n", $tok, $n;
+ }
+ $n++;
+ }
+ print OUT ");\n";
+ print OUT "1;\n";
+}
+
+
diff --git a/asm/pragma.c b/asm/pragma.c
new file mode 100644
index 00000000..a4e76094
--- /dev/null
+++ b/asm/pragma.c
@@ -0,0 +1,274 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Parse and handle [pragma] directives. The preprocessor handles
+ * %pragma preproc directives separately, all other namespaces are
+ * simply converted to [pragma].
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "assemble.h"
+#include "error.h"
+
+static enum directive_result output_pragma(const struct pragma *pragma);
+static enum directive_result limit_pragma(const struct pragma *pragma);
+
+/*
+ * Handle [pragma] directives. [pragma] is generally produced by
+ * the %pragma preprocessor directive, which simply passes on any
+ * string that it finds *except* %pragma preproc. The idea is
+ * that pragmas are of the form:
+ *
+ * %pragma <facility> <opname> [<options>...]
+ *
+ * ... where "facility" can be either a generic facility or a backend
+ * name.
+ *
+ * The following names are currently reserved for global facilities;
+ * so far none of these have any defined pragmas at all:
+ *
+ * preproc - preprocessor
+ * limit - limit setting
+ * asm - assembler
+ * list - listing generator
+ * file - generic file handling
+ * input - input file handling
+ * output - backend-independent output handling
+ * debug - backend-independent debug handling
+ * ignore - dummy pragma (can be used to "comment out")
+ *
+ * This function should generally not error out if it doesn't understand
+ * what a pragma is for, for unknown arguments, etc; the whole point of
+ * a pragma is that future releases might add new ones that should be
+ * ignored rather than be an error. Erroring out is acceptable for
+ * known pragmas suffering from parsing errors and so on.
+ *
+ * Adding default-suppressed warnings would, however, be a good idea
+ * at some point.
+ */
+static struct pragma_facility global_pragmas[] =
+{
+ { "asm", NULL },
+ { "limit", limit_pragma },
+ { "list", NULL },
+ { "file", NULL },
+ { "input", NULL },
+
+ /* None of these should actually happen due to special handling */
+ { "preproc", NULL }, /* Handled in the preprocessor by necessity */
+ { "output", NULL },
+ { "debug", NULL },
+ { "ignore", NULL },
+ { NULL, NULL }
+};
+
+/*
+ * Search a pragma list for a known pragma facility and if so, invoke
+ * the handler. Return true if processing is complete.
+ * The "default name", if set, matches the final NULL entry (used
+ * for backends, so multiple backends can share the same list under
+ * some circumstances.)
+ */
+static bool search_pragma_list(const struct pragma_facility *list,
+ const char *default_name,
+ pragma_handler generic_handler,
+ struct pragma *pragma)
+{
+ const struct pragma_facility *pf;
+ enum directive_result rv;
+
+ if (!list)
+ return false;
+
+ for (pf = list; pf->name; pf++) {
+ if (!nasm_stricmp(pragma->facility_name, pf->name))
+ goto found_it;
+ }
+
+ if (default_name && !nasm_stricmp(pragma->facility_name, default_name))
+ goto found_it;
+
+ return false;
+
+found_it:
+ pragma->facility = pf;
+
+ /* If the handler is NULL all pragmas are unknown... */
+ if (pf->handler)
+ rv = pf->handler(pragma);
+ else
+ rv = DIRR_UNKNOWN;
+
+ /* Is there an additional, applicable generic handler? */
+ if (rv == DIRR_UNKNOWN && generic_handler)
+ rv = generic_handler(pragma);
+
+ switch (rv) {
+ case DIRR_UNKNOWN:
+ switch (pragma->opcode) {
+ case D_none:
+ nasm_error(ERR_WARNING|ERR_PASS2|ERR_WARN_BAD_PRAGMA,
+ "empty %%pragma %s", pragma->facility_name);
+ break;
+ default:
+ nasm_error(ERR_WARNING|ERR_PASS2|ERR_WARN_UNKNOWN_PRAGMA,
+ "unknown %%pragma %s %s",
+ pragma->facility_name, pragma->opname);
+ break;
+ }
+ break;
+
+ case DIRR_OK:
+ case DIRR_ERROR:
+ break; /* Nothing to do */
+
+ case DIRR_BADPARAM:
+ /*
+ * This one is an error. Don't use it if forward compatibility
+ * would be compromised, as opposed to an inherent error.
+ */
+ nasm_error(ERR_NONFATAL, "bad argument to %%pragma %s %s",
+ pragma->facility_name, pragma->opname);
+ break;
+
+ default:
+ panic();
+ }
+ return true;
+}
+
+void process_pragma(char *str)
+{
+ struct pragma pragma;
+ char *p;
+
+ nasm_zero(pragma);
+
+ pragma.facility_name = nasm_get_word(str, &p);
+ if (!pragma.facility_name) {
+ nasm_error(ERR_WARNING|ERR_PASS2|ERR_WARN_BAD_PRAGMA,
+ "empty pragma directive");
+ return; /* Empty pragma */
+ }
+
+ /*
+ * The facility "ignore" means just that; don't even complain of
+ * the absence of an operation.
+ */
+ if (!nasm_stricmp(pragma.facility_name, "ignore"))
+ return;
+
+ /*
+ * The "output" and "debug" facilities are aliases for the
+ * current output and debug formats, respectively.
+ */
+ if (!nasm_stricmp(pragma.facility_name, "output"))
+ pragma.facility_name = ofmt->shortname;
+ if (!nasm_stricmp(pragma.facility_name, "debug"))
+ pragma.facility_name = dfmt->shortname;
+
+ pragma.opname = nasm_get_word(p, &p);
+ if (!pragma.opname)
+ pragma.opcode = D_none;
+ else
+ pragma.opcode = directive_find(pragma.opname);
+
+ pragma.tail = nasm_trim_spaces(p);
+
+ /* Look for a global pragma namespace */
+ if (search_pragma_list(global_pragmas, NULL, NULL, &pragma))
+ return;
+
+ /* Look to see if it is an output backend pragma */
+ if (search_pragma_list(ofmt->pragmas, ofmt->shortname,
+ output_pragma, &pragma))
+ return;
+
+ /* Look to see if it is a debug format pragma */
+ if (search_pragma_list(dfmt->pragmas, dfmt->shortname, NULL, &pragma))
+ return;
+
+ /*
+ * Note: it would be nice to warn for an unknown namespace,
+ * but in order to do so we need to walk *ALL* the backends
+ * in order to make sure we aren't dealing with a pragma that
+ * is for another backend. On the other hand, that could
+ * also be a warning with a separate warning flag.
+ *
+ * Leave this for the future, however, the warning classes are
+ * already defined for future compatibility.
+ */
+}
+
+/*
+ * Generic pragmas that apply to all output backends; these are handled
+ * specially so they can be made selective based on the output format.
+ */
+static enum directive_result output_pragma(const struct pragma *pragma)
+{
+ switch (pragma->opcode) {
+ case D_PREFIX:
+ case D_GPREFIX:
+ set_label_mangle(LM_GPREFIX, pragma->tail);
+ return DIRR_OK;
+ case D_SUFFIX:
+ case D_GSUFFIX:
+ set_label_mangle(LM_GSUFFIX, pragma->tail);
+ return DIRR_OK;
+ case D_LPREFIX:
+ set_label_mangle(LM_LPREFIX, pragma->tail);
+ return DIRR_OK;
+ case D_LSUFFIX:
+ set_label_mangle(LM_LSUFFIX, pragma->tail);
+ return DIRR_OK;
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+/*
+ * %pragma limit to set resource limits
+ */
+static enum directive_result limit_pragma(const struct pragma *pragma)
+{
+ return nasm_set_limit(pragma->opname, pragma->tail);
+}
diff --git a/asm/preproc-nop.c b/asm/preproc-nop.c
new file mode 100644
index 00000000..94614dd1
--- /dev/null
+++ b/asm/preproc-nop.c
@@ -0,0 +1,195 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * This is a null preprocessor which just copies lines from input
+ * to output. It's used when someone explicitly requests that NASM
+ * not preprocess their source file.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <time.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "preproc.h"
+#include "listing.h"
+
+#define BUF_DELTA 512
+
+static FILE *nop_fp;
+static int32_t nop_lineinc;
+
+static void nop_init(void)
+{
+ /* Nothing to do */
+}
+
+static void nop_reset(const char *file, int pass, StrList *deplist)
+{
+ src_set(0, file);
+ nop_lineinc = 1;
+ nop_fp = nasm_open_read(file, NF_TEXT);
+
+ if (!nop_fp)
+ nasm_fatal_fl(ERR_NOFILE, "unable to open input file `%s'", file);
+ (void)pass; /* placate compilers */
+
+ strlist_add_string(deplist, file);
+}
+
+static char *nop_getline(void)
+{
+ char *buffer, *p, *q;
+ int bufsize;
+
+ bufsize = BUF_DELTA;
+ buffer = nasm_malloc(BUF_DELTA);
+ src_set_linnum(src_get_linnum() + nop_lineinc);
+
+ while (1) { /* Loop to handle %line */
+
+ p = buffer;
+ while (1) { /* Loop to handle long lines */
+ q = fgets(p, bufsize - (p - buffer), nop_fp);
+ if (!q)
+ break;
+ p += strlen(p);
+ if (p > buffer && p[-1] == '\n')
+ break;
+ if (p - buffer > bufsize - 10) {
+ int offset;
+ offset = p - buffer;
+ bufsize += BUF_DELTA;
+ buffer = nasm_realloc(buffer, bufsize);
+ p = buffer + offset;
+ }
+ }
+
+ if (!q && p == buffer) {
+ nasm_free(buffer);
+ return NULL;
+ }
+
+ /*
+ * Play safe: remove CRs, LFs and any spurious ^Zs, if any of
+ * them are present at the end of the line.
+ */
+ buffer[strcspn(buffer, "\r\n\032")] = '\0';
+
+ if (!nasm_strnicmp(buffer, "%line", 5)) {
+ int32_t ln;
+ int li;
+ char *nm = nasm_malloc(strlen(buffer));
+ if (sscanf(buffer + 5, "%"PRId32"+%d %s", &ln, &li, nm) == 3) {
+ src_set(ln, nm);
+ nop_lineinc = li;
+ nasm_free(nm);
+ continue;
+ }
+ nasm_free(nm);
+ }
+ break;
+ }
+
+ lfmt->line(LIST_READ, buffer);
+
+ return buffer;
+}
+
+static void nop_cleanup(int pass)
+{
+ (void)pass; /* placate GCC */
+ if (nop_fp) {
+ fclose(nop_fp);
+ nop_fp = NULL;
+ }
+}
+
+static void nop_extra_stdmac(macros_t *macros)
+{
+ (void)macros;
+}
+
+static void nop_pre_define(char *definition)
+{
+ (void)definition;
+}
+
+static void nop_pre_undefine(char *definition)
+{
+ (void)definition;
+}
+
+static void nop_pre_include(char *fname)
+{
+ (void)fname;
+}
+
+static void nop_pre_command(const char *what, char *string)
+{
+ (void)what;
+ (void)string;
+}
+
+static void nop_include_path(const char *path)
+{
+ (void)path;
+}
+
+static void nop_error_list_macros(int severity)
+{
+ (void)severity;
+}
+
+const struct preproc_ops preproc_nop = {
+ nop_init,
+ nop_reset,
+ nop_getline,
+ nop_cleanup,
+ nop_extra_stdmac,
+ nop_pre_define,
+ nop_pre_undefine,
+ nop_pre_include,
+ nop_pre_command,
+ nop_include_path,
+ nop_error_list_macros,
+};
diff --git a/asm/preproc.c b/asm/preproc.c
new file mode 100644
index 00000000..0ae712a9
--- /dev/null
+++ b/asm/preproc.c
@@ -0,0 +1,5427 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * preproc.c macro preprocessor for the Netwide Assembler
+ */
+
+/* Typical flow of text through preproc
+ *
+ * pp_getline gets tokenized lines, either
+ *
+ * from a macro expansion
+ *
+ * or
+ * {
+ * read_line gets raw text from stdmacpos, or predef, or current input file
+ * tokenize converts to tokens
+ * }
+ *
+ * expand_mmac_params is used to expand %1 etc., unless a macro is being
+ * defined or a false conditional is being processed
+ * (%0, %1, %+1, %-1, %%foo
+ *
+ * do_directive checks for directives
+ *
+ * expand_smacro is used to expand single line macros
+ *
+ * expand_mmacro is used to expand multi-line macros
+ *
+ * detoken is used to convert the line back to text
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "preproc.h"
+#include "hashtbl.h"
+#include "quote.h"
+#include "stdscan.h"
+#include "eval.h"
+#include "tokens.h"
+#include "tables.h"
+#include "listing.h"
+
+typedef struct SMacro SMacro;
+typedef struct MMacro MMacro;
+typedef struct MMacroInvocation MMacroInvocation;
+typedef struct Context Context;
+typedef struct Token Token;
+typedef struct Blocks Blocks;
+typedef struct Line Line;
+typedef struct Include Include;
+typedef struct Cond Cond;
+
+/*
+ * Note on the storage of both SMacro and MMacros: the hash table
+ * indexes them case-insensitively, and we then have to go through a
+ * linked list of potential case aliases (and, for MMacros, parameter
+ * ranges); this is to preserve the matching semantics of the earlier
+ * code. If the number of case aliases for a specific macro is a
+ * performance issue, you may want to reconsider your coding style.
+ */
+
+/*
+ * Store the definition of a single-line macro.
+ */
+struct SMacro {
+ SMacro *next;
+ char *name;
+ bool casesense;
+ bool in_progress;
+ unsigned int nparam;
+ Token *expansion;
+};
+
+/*
+ * Store the definition of a multi-line macro. This is also used to
+ * store the interiors of `%rep...%endrep' blocks, which are
+ * effectively self-re-invoking multi-line macros which simply
+ * don't have a name or bother to appear in the hash tables. %rep
+ * blocks are signified by having a NULL `name' field.
+ *
+ * In a MMacro describing a `%rep' block, the `in_progress' field
+ * isn't merely boolean, but gives the number of repeats left to
+ * run.
+ *
+ * The `next' field is used for storing MMacros in hash tables; the
+ * `next_active' field is for stacking them on istk entries.
+ *
+ * When a MMacro is being expanded, `params', `iline', `nparam',
+ * `paramlen', `rotate' and `unique' are local to the invocation.
+ */
+struct MMacro {
+ MMacro *next;
+ MMacroInvocation *prev; /* previous invocation */
+ char *name;
+ int nparam_min, nparam_max;
+ bool casesense;
+ bool plus; /* is the last parameter greedy? */
+ bool nolist; /* is this macro listing-inhibited? */
+ int64_t in_progress; /* is this macro currently being expanded? */
+ int32_t max_depth; /* maximum number of recursive expansions allowed */
+ Token *dlist; /* All defaults as one list */
+ Token **defaults; /* Parameter default pointers */
+ int ndefs; /* number of default parameters */
+ Line *expansion;
+
+ MMacro *next_active;
+ MMacro *rep_nest; /* used for nesting %rep */
+ Token **params; /* actual parameters */
+ Token *iline; /* invocation line */
+ unsigned int nparam, rotate;
+ int *paramlen;
+ uint64_t unique;
+ int lineno; /* Current line number on expansion */
+ uint64_t condcnt; /* number of if blocks... */
+
+ const char *fname; /* File where defined */
+ int32_t xline; /* First line in macro */
+};
+
+
+/* Store the definition of a multi-line macro, as defined in a
+ * previous recursive macro expansion.
+ */
+struct MMacroInvocation {
+ MMacroInvocation *prev; /* previous invocation */
+ Token **params; /* actual parameters */
+ Token *iline; /* invocation line */
+ unsigned int nparam, rotate;
+ int *paramlen;
+ uint64_t unique;
+ uint64_t condcnt;
+};
+
+
+/*
+ * The context stack is composed of a linked list of these.
+ */
+struct Context {
+ Context *next;
+ char *name;
+ struct hash_table localmac;
+ uint32_t number;
+};
+
+/*
+ * This is the internal form which we break input lines up into.
+ * Typically stored in linked lists.
+ *
+ * Note that `type' serves a double meaning: TOK_SMAC_PARAM is not
+ * necessarily used as-is, but is intended to denote the number of
+ * the substituted parameter. So in the definition
+ *
+ * %define a(x,y) ( (x) & ~(y) )
+ *
+ * the token representing `x' will have its type changed to
+ * TOK_SMAC_PARAM, but the one representing `y' will be
+ * TOK_SMAC_PARAM+1.
+ *
+ * TOK_INTERNAL_STRING is a dirty hack: it's a single string token
+ * which doesn't need quotes around it. Used in the pre-include
+ * mechanism as an alternative to trying to find a sensible type of
+ * quote to use on the filename we were passed.
+ */
+enum pp_token_type {
+ TOK_NONE = 0, TOK_WHITESPACE, TOK_COMMENT, TOK_ID,
+ TOK_PREPROC_ID, TOK_STRING,
+ TOK_NUMBER, TOK_FLOAT, TOK_SMAC_END, TOK_OTHER,
+ TOK_INTERNAL_STRING,
+ TOK_PREPROC_Q, TOK_PREPROC_QQ,
+ TOK_PASTE, /* %+ */
+ TOK_INDIRECT, /* %[...] */
+ TOK_SMAC_PARAM, /* MUST BE LAST IN THE LIST!!! */
+ TOK_MAX = INT_MAX /* Keep compiler from reducing the range */
+};
+
+#define PP_CONCAT_MASK(x) (1 << (x))
+#define PP_CONCAT_MATCH(t, mask) (PP_CONCAT_MASK((t)->type) & mask)
+
+struct tokseq_match {
+ int mask_head;
+ int mask_tail;
+};
+
+struct Token {
+ Token *next;
+ char *text;
+ union {
+ SMacro *mac; /* associated macro for TOK_SMAC_END */
+ size_t len; /* scratch length field */
+ } a; /* Auxiliary data */
+ enum pp_token_type type;
+};
+
+/*
+ * Multi-line macro definitions are stored as a linked list of
+ * these, which is essentially a container to allow several linked
+ * lists of Tokens.
+ *
+ * Note that in this module, linked lists are treated as stacks
+ * wherever possible. For this reason, Lines are _pushed_ on to the
+ * `expansion' field in MMacro structures, so that the linked list,
+ * if walked, would give the macro lines in reverse order; this
+ * means that we can walk the list when expanding a macro, and thus
+ * push the lines on to the `expansion' field in _istk_ in reverse
+ * order (so that when popped back off they are in the right
+ * order). It may seem cockeyed, and it relies on my design having
+ * an even number of steps in, but it works...
+ *
+ * Some of these structures, rather than being actual lines, are
+ * markers delimiting the end of the expansion of a given macro.
+ * This is for use in the cycle-tracking and %rep-handling code.
+ * Such structures have `finishes' non-NULL, and `first' NULL. All
+ * others have `finishes' NULL, but `first' may still be NULL if
+ * the line is blank.
+ */
+struct Line {
+ Line *next;
+ MMacro *finishes;
+ Token *first;
+};
+
+/*
+ * To handle an arbitrary level of file inclusion, we maintain a
+ * stack (ie linked list) of these things.
+ */
+struct Include {
+ Include *next;
+ FILE *fp;
+ Cond *conds;
+ Line *expansion;
+ const char *fname;
+ int lineno, lineinc;
+ MMacro *mstk; /* stack of active macros/reps */
+};
+
+/*
+ * File real name hash, so we don't have to re-search the include
+ * path for every pass (and potentially more than that if a file
+ * is used more than once.)
+ */
+struct hash_table FileHash;
+
+/*
+ * Conditional assembly: we maintain a separate stack of these for
+ * each level of file inclusion. (The only reason we keep the
+ * stacks separate is to ensure that a stray `%endif' in a file
+ * included from within the true branch of a `%if' won't terminate
+ * it and cause confusion: instead, rightly, it'll cause an error.)
+ */
+struct Cond {
+ Cond *next;
+ int state;
+};
+enum {
+ /*
+ * These states are for use just after %if or %elif: IF_TRUE
+ * means the condition has evaluated to truth so we are
+ * currently emitting, whereas IF_FALSE means we are not
+ * currently emitting but will start doing so if a %else comes
+ * up. In these states, all directives are admissible: %elif,
+ * %else and %endif. (And of course %if.)
+ */
+ COND_IF_TRUE, COND_IF_FALSE,
+ /*
+ * These states come up after a %else: ELSE_TRUE means we're
+ * emitting, and ELSE_FALSE means we're not. In ELSE_* states,
+ * any %elif or %else will cause an error.
+ */
+ COND_ELSE_TRUE, COND_ELSE_FALSE,
+ /*
+ * These states mean that we're not emitting now, and also that
+ * nothing until %endif will be emitted at all. COND_DONE is
+ * used when we've had our moment of emission
+ * and have now started seeing %elifs. COND_NEVER is used when
+ * the condition construct in question is contained within a
+ * non-emitting branch of a larger condition construct,
+ * or if there is an error.
+ */
+ COND_DONE, COND_NEVER
+};
+#define emitting(x) ( (x) == COND_IF_TRUE || (x) == COND_ELSE_TRUE )
+
+/*
+ * These defines are used as the possible return values for do_directive
+ */
+#define NO_DIRECTIVE_FOUND 0
+#define DIRECTIVE_FOUND 1
+
+/* max reps */
+#define REP_LIMIT ((INT64_C(1) << 62))
+
+/*
+ * Condition codes. Note that we use c_ prefix not C_ because C_ is
+ * used in nasm.h for the "real" condition codes. At _this_ level,
+ * we treat CXZ and ECXZ as condition codes, albeit non-invertible
+ * ones, so we need a different enum...
+ */
+static const char * const conditions[] = {
+ "a", "ae", "b", "be", "c", "cxz", "e", "ecxz", "g", "ge", "l", "le",
+ "na", "nae", "nb", "nbe", "nc", "ne", "ng", "nge", "nl", "nle", "no",
+ "np", "ns", "nz", "o", "p", "pe", "po", "rcxz", "s", "z"
+};
+enum pp_conds {
+ c_A, c_AE, c_B, c_BE, c_C, c_CXZ, c_E, c_ECXZ, c_G, c_GE, c_L, c_LE,
+ c_NA, c_NAE, c_NB, c_NBE, c_NC, c_NE, c_NG, c_NGE, c_NL, c_NLE, c_NO,
+ c_NP, c_NS, c_NZ, c_O, c_P, c_PE, c_PO, c_RCXZ, c_S, c_Z,
+ c_none = -1
+};
+static const enum pp_conds inverse_ccs[] = {
+ c_NA, c_NAE, c_NB, c_NBE, c_NC, -1, c_NE, -1, c_NG, c_NGE, c_NL, c_NLE,
+ c_A, c_AE, c_B, c_BE, c_C, c_E, c_G, c_GE, c_L, c_LE, c_O, c_P, c_S,
+ c_Z, c_NO, c_NP, c_PO, c_PE, -1, c_NS, c_NZ
+};
+
+/*
+ * Directive names.
+ */
+/* If this is a an IF, ELIF, ELSE or ENDIF keyword */
+static int is_condition(enum preproc_token arg)
+{
+ return PP_IS_COND(arg) || (arg == PP_ELSE) || (arg == PP_ENDIF);
+}
+
+/* For TASM compatibility we need to be able to recognise TASM compatible
+ * conditional compilation directives. Using the NASM pre-processor does
+ * not work, so we look for them specifically from the following list and
+ * then jam in the equivalent NASM directive into the input stream.
+ */
+
+enum {
+ TM_ARG, TM_ELIF, TM_ELSE, TM_ENDIF, TM_IF, TM_IFDEF, TM_IFDIFI,
+ TM_IFNDEF, TM_INCLUDE, TM_LOCAL
+};
+
+static const char * const tasm_directives[] = {
+ "arg", "elif", "else", "endif", "if", "ifdef", "ifdifi",
+ "ifndef", "include", "local"
+};
+
+static int StackSize = 4;
+static const char *StackPointer = "ebp";
+static int ArgOffset = 8;
+static int LocalOffset = 0;
+
+static Context *cstk;
+static Include *istk;
+static StrList *ipath;
+
+static int pass; /* HACK: pass 0 = generate dependencies only */
+static StrList *deplist;
+
+static uint64_t unique; /* unique identifier numbers */
+
+static Line *predef = NULL;
+static bool do_predef;
+
+/*
+ * The current set of multi-line macros we have defined.
+ */
+static struct hash_table mmacros;
+
+/*
+ * The current set of single-line macros we have defined.
+ */
+static struct hash_table smacros;
+
+/*
+ * The multi-line macro we are currently defining, or the %rep
+ * block we are currently reading, if any.
+ */
+static MMacro *defining;
+
+static uint64_t nested_mac_count;
+static uint64_t nested_rep_count;
+
+/*
+ * The number of macro parameters to allocate space for at a time.
+ */
+#define PARAM_DELTA 16
+
+/*
+ * The standard macro set: defined in macros.c in a set of arrays.
+ * This gives our position in any macro set, while we are processing it.
+ * The stdmacset is an array of such macro sets.
+ */
+static macros_t *stdmacpos;
+static macros_t **stdmacnext;
+static macros_t *stdmacros[8];
+static macros_t *extrastdmac;
+
+/*
+ * Tokens are allocated in blocks to improve speed
+ */
+#define TOKEN_BLOCKSIZE 4096
+static Token *freeTokens = NULL;
+struct Blocks {
+ Blocks *next;
+ void *chunk;
+};
+
+static Blocks blocks = { NULL, NULL };
+
+/*
+ * Forward declarations.
+ */
+static void pp_add_stdmac(macros_t *macros);
+static Token *expand_mmac_params(Token * tline);
+static Token *expand_smacro(Token * tline);
+static Token *expand_id(Token * tline);
+static Context *get_ctx(const char *name, const char **namep);
+static void make_tok_num(Token * tok, int64_t val);
+static void pp_verror(int severity, const char *fmt, va_list ap);
+static vefunc real_verror;
+static void *new_Block(size_t size);
+static void delete_Blocks(void);
+static Token *new_Token(Token * next, enum pp_token_type type,
+ const char *text, int txtlen);
+static Token *delete_Token(Token * t);
+
+/*
+ * Macros for safe checking of token pointers, avoid *(NULL)
+ */
+#define tok_type_(x,t) ((x) && (x)->type == (t))
+#define skip_white_(x) if (tok_type_((x), TOK_WHITESPACE)) (x)=(x)->next
+#define tok_is_(x,v) (tok_type_((x), TOK_OTHER) && !strcmp((x)->text,(v)))
+#define tok_isnt_(x,v) ((x) && ((x)->type!=TOK_OTHER || strcmp((x)->text,(v))))
+
+/*
+ * nasm_unquote with error if the string contains NUL characters.
+ * If the string contains NUL characters, issue an error and return
+ * the C len, i.e. truncate at the NUL.
+ */
+static size_t nasm_unquote_cstr(char *qstr, enum preproc_token directive)
+{
+ size_t len = nasm_unquote(qstr, NULL);
+ size_t clen = strlen(qstr);
+
+ if (len != clen)
+ nasm_error(ERR_NONFATAL, "NUL character in `%s' directive",
+ pp_directives[directive]);
+
+ return clen;
+}
+
+/*
+ * In-place reverse a list of tokens.
+ */
+static Token *reverse_tokens(Token *t)
+{
+ Token *prev = NULL;
+ Token *next;
+
+ while (t) {
+ next = t->next;
+ t->next = prev;
+ prev = t;
+ t = next;
+ }
+
+ return prev;
+}
+
+/*
+ * Handle TASM specific directives, which do not contain a % in
+ * front of them. We do it here because I could not find any other
+ * place to do it for the moment, and it is a hack (ideally it would
+ * be nice to be able to use the NASM pre-processor to do it).
+ */
+static char *check_tasm_directive(char *line)
+{
+ int32_t i, j, k, m, len;
+ char *p, *q, *oldline, oldchar;
+
+ p = nasm_skip_spaces(line);
+
+ /* Binary search for the directive name */
+ i = -1;
+ j = ARRAY_SIZE(tasm_directives);
+ q = nasm_skip_word(p);
+ len = q - p;
+ if (len) {
+ oldchar = p[len];
+ p[len] = 0;
+ while (j - i > 1) {
+ k = (j + i) / 2;
+ m = nasm_stricmp(p, tasm_directives[k]);
+ if (m == 0) {
+ /* We have found a directive, so jam a % in front of it
+ * so that NASM will then recognise it as one if it's own.
+ */
+ p[len] = oldchar;
+ len = strlen(p);
+ oldline = line;
+ line = nasm_malloc(len + 2);
+ line[0] = '%';
+ if (k == TM_IFDIFI) {
+ /*
+ * NASM does not recognise IFDIFI, so we convert
+ * it to %if 0. This is not used in NASM
+ * compatible code, but does need to parse for the
+ * TASM macro package.
+ */
+ strcpy(line + 1, "if 0");
+ } else {
+ memcpy(line + 1, p, len + 1);
+ }
+ nasm_free(oldline);
+ return line;
+ } else if (m < 0) {
+ j = k;
+ } else
+ i = k;
+ }
+ p[len] = oldchar;
+ }
+ return line;
+}
+
+/*
+ * The pre-preprocessing stage... This function translates line
+ * number indications as they emerge from GNU cpp (`# lineno "file"
+ * flags') into NASM preprocessor line number indications (`%line
+ * lineno file').
+ */
+static char *prepreproc(char *line)
+{
+ int lineno, fnlen;
+ char *fname, *oldline;
+
+ if (line[0] == '#' && line[1] == ' ') {
+ oldline = line;
+ fname = oldline + 2;
+ lineno = atoi(fname);
+ fname += strspn(fname, "0123456789 ");
+ if (*fname == '"')
+ fname++;
+ fnlen = strcspn(fname, "\"");
+ line = nasm_malloc(20 + fnlen);
+ snprintf(line, 20 + fnlen, "%%line %d %.*s", lineno, fnlen, fname);
+ nasm_free(oldline);
+ }
+ if (tasm_compatible_mode)
+ return check_tasm_directive(line);
+ return line;
+}
+
+/*
+ * Free a linked list of tokens.
+ */
+static void free_tlist(Token * list)
+{
+ while (list)
+ list = delete_Token(list);
+}
+
+/*
+ * Free a linked list of lines.
+ */
+static void free_llist(Line * list)
+{
+ Line *l, *tmp;
+ list_for_each_safe(l, tmp, list) {
+ free_tlist(l->first);
+ nasm_free(l);
+ }
+}
+
+/*
+ * Free an MMacro
+ */
+static void free_mmacro(MMacro * m)
+{
+ nasm_free(m->name);
+ free_tlist(m->dlist);
+ nasm_free(m->defaults);
+ free_llist(m->expansion);
+ nasm_free(m);
+}
+
+/*
+ * Free all currently defined macros, and free the hash tables
+ */
+static void free_smacro_table(struct hash_table *smt)
+{
+ SMacro *s, *tmp;
+ const char *key;
+ struct hash_tbl_node *it = NULL;
+
+ while ((s = hash_iterate(smt, &it, &key)) != NULL) {
+ nasm_free((void *)key);
+ list_for_each_safe(s, tmp, s) {
+ nasm_free(s->name);
+ free_tlist(s->expansion);
+ nasm_free(s);
+ }
+ }
+ hash_free(smt);
+}
+
+static void free_mmacro_table(struct hash_table *mmt)
+{
+ MMacro *m, *tmp;
+ const char *key;
+ struct hash_tbl_node *it = NULL;
+
+ it = NULL;
+ while ((m = hash_iterate(mmt, &it, &key)) != NULL) {
+ nasm_free((void *)key);
+ list_for_each_safe(m ,tmp, m)
+ free_mmacro(m);
+ }
+ hash_free(mmt);
+}
+
+static void free_macros(void)
+{
+ free_smacro_table(&smacros);
+ free_mmacro_table(&mmacros);
+}
+
+/*
+ * Initialize the hash tables
+ */
+static void init_macros(void)
+{
+ hash_init(&smacros, HASH_LARGE);
+ hash_init(&mmacros, HASH_LARGE);
+}
+
+/*
+ * Pop the context stack.
+ */
+static void ctx_pop(void)
+{
+ Context *c = cstk;
+
+ cstk = cstk->next;
+ free_smacro_table(&c->localmac);
+ nasm_free(c->name);
+ nasm_free(c);
+}
+
+/*
+ * Search for a key in the hash index; adding it if necessary
+ * (in which case we initialize the data pointer to NULL.)
+ */
+static void **
+hash_findi_add(struct hash_table *hash, const char *str)
+{
+ struct hash_insert hi;
+ void **r;
+ char *strx;
+
+ r = hash_findi(hash, str, &hi);
+ if (r)
+ return r;
+
+ strx = nasm_strdup(str); /* Use a more efficient allocator here? */
+ return hash_add(&hi, strx, NULL);
+}
+
+/*
+ * Like hash_findi, but returns the data element rather than a pointer
+ * to it. Used only when not adding a new element, hence no third
+ * argument.
+ */
+static void *
+hash_findix(struct hash_table *hash, const char *str)
+{
+ void **p;
+
+ p = hash_findi(hash, str, NULL);
+ return p ? *p : NULL;
+}
+
+/*
+ * read line from standart macros set,
+ * if there no more left -- return NULL
+ */
+static char *line_from_stdmac(void)
+{
+ unsigned char c;
+ const unsigned char *p = stdmacpos;
+ char *line, *q;
+ size_t len = 0;
+
+ if (!stdmacpos)
+ return NULL;
+
+ while ((c = *p++)) {
+ if (c >= 0x80)
+ len += pp_directives_len[c - 0x80] + 1;
+ else
+ len++;
+ }
+
+ line = nasm_malloc(len + 1);
+ q = line;
+ while ((c = *stdmacpos++)) {
+ if (c >= 0x80) {
+ memcpy(q, pp_directives[c - 0x80], pp_directives_len[c - 0x80]);
+ q += pp_directives_len[c - 0x80];
+ *q++ = ' ';
+ } else {
+ *q++ = c;
+ }
+ }
+ stdmacpos = p;
+ *q = '\0';
+
+ if (!*stdmacpos) {
+ /* This was the last of this particular macro set */
+ stdmacpos = NULL;
+ if (*stdmacnext) {
+ stdmacpos = *stdmacnext++;
+ } else if (do_predef) {
+ Line *pd, *l;
+ Token *head, **tail, *t;
+
+ /*
+ * Nasty hack: here we push the contents of
+ * `predef' on to the top-level expansion stack,
+ * since this is the most convenient way to
+ * implement the pre-include and pre-define
+ * features.
+ */
+ list_for_each(pd, predef) {
+ head = NULL;
+ tail = &head;
+ list_for_each(t, pd->first) {
+ *tail = new_Token(NULL, t->type, t->text, 0);
+ tail = &(*tail)->next;
+ }
+
+ l = nasm_malloc(sizeof(Line));
+ l->next = istk->expansion;
+ l->first = head;
+ l->finishes = NULL;
+
+ istk->expansion = l;
+ }
+ do_predef = false;
+ }
+ }
+
+ return line;
+}
+
+static char *read_line(void)
+{
+ unsigned int size, c, next;
+ const unsigned int delta = 512;
+ const unsigned int pad = 8;
+ unsigned int nr_cont = 0;
+ bool cont = false;
+ char *buffer, *p;
+
+ /* Standart macros set (predefined) goes first */
+ p = line_from_stdmac();
+ if (p)
+ return p;
+
+ size = delta;
+ p = buffer = nasm_malloc(size);
+
+ for (;;) {
+ c = fgetc(istk->fp);
+ if ((int)(c) == EOF) {
+ p[0] = 0;
+ break;
+ }
+
+ switch (c) {
+ case '\r':
+ next = fgetc(istk->fp);
+ if (next != '\n')
+ ungetc(next, istk->fp);
+ if (cont) {
+ cont = false;
+ continue;
+ }
+ break;
+
+ case '\n':
+ if (cont) {
+ cont = false;
+ continue;
+ }
+ break;
+
+ case '\\':
+ next = fgetc(istk->fp);
+ ungetc(next, istk->fp);
+ if (next == '\r' || next == '\n') {
+ cont = true;
+ nr_cont++;
+ continue;
+ }
+ break;
+ }
+
+ if (c == '\r' || c == '\n') {
+ *p++ = 0;
+ break;
+ }
+
+ if (p >= (buffer + size - pad)) {
+ buffer = nasm_realloc(buffer, size + delta);
+ p = buffer + size - pad;
+ size += delta;
+ }
+
+ *p++ = (unsigned char)c;
+ }
+
+ if (p == buffer) {
+ nasm_free(buffer);
+ return NULL;
+ }
+
+ src_set_linnum(src_get_linnum() + istk->lineinc +
+ (nr_cont * istk->lineinc));
+
+ /*
+ * Handle spurious ^Z, which may be inserted into source files
+ * by some file transfer utilities.
+ */
+ buffer[strcspn(buffer, "\032")] = '\0';
+
+ lfmt->line(LIST_READ, buffer);
+
+ return buffer;
+}
+
+/*
+ * Tokenize a line of text. This is a very simple process since we
+ * don't need to parse the value out of e.g. numeric tokens: we
+ * simply split one string into many.
+ */
+static Token *tokenize(char *line)
+{
+ char c, *p = line;
+ enum pp_token_type type;
+ Token *list = NULL;
+ Token *t, **tail = &list;
+
+ while (*line) {
+ p = line;
+ if (*p == '%') {
+ p++;
+ if (*p == '+' && !nasm_isdigit(p[1])) {
+ p++;
+ type = TOK_PASTE;
+ } else if (nasm_isdigit(*p) ||
+ ((*p == '-' || *p == '+') && nasm_isdigit(p[1]))) {
+ do {
+ p++;
+ }
+ while (nasm_isdigit(*p));
+ type = TOK_PREPROC_ID;
+ } else if (*p == '{') {
+ p++;
+ while (*p) {
+ if (*p == '}')
+ break;
+ p[-1] = *p;
+ p++;
+ }
+ if (*p != '}')
+ nasm_error(ERR_WARNING | ERR_PASS1,
+ "unterminated %%{ construct");
+ p[-1] = '\0';
+ if (*p)
+ p++;
+ type = TOK_PREPROC_ID;
+ } else if (*p == '[') {
+ int lvl = 1;
+ line += 2; /* Skip the leading %[ */
+ p++;
+ while (lvl && (c = *p++)) {
+ switch (c) {
+ case ']':
+ lvl--;
+ break;
+ case '%':
+ if (*p == '[')
+ lvl++;
+ break;
+ case '\'':
+ case '\"':
+ case '`':
+ p = nasm_skip_string(p - 1);
+ if (*p)
+ p++;
+ break;
+ default:
+ break;
+ }
+ }
+ p--;
+ if (*p)
+ *p++ = '\0';
+ if (lvl)
+ nasm_error(ERR_NONFATAL|ERR_PASS1,
+ "unterminated %%[ construct");
+ type = TOK_INDIRECT;
+ } else if (*p == '?') {
+ type = TOK_PREPROC_Q; /* %? */
+ p++;
+ if (*p == '?') {
+ type = TOK_PREPROC_QQ; /* %?? */
+ p++;
+ }
+ } else if (*p == '!') {
+ type = TOK_PREPROC_ID;
+ p++;
+ if (isidchar(*p)) {
+ do {
+ p++;
+ }
+ while (isidchar(*p));
+ } else if (*p == '\'' || *p == '\"' || *p == '`') {
+ p = nasm_skip_string(p);
+ if (*p)
+ p++;
+ else
+ nasm_error(ERR_NONFATAL|ERR_PASS1,
+ "unterminated %%! string");
+ } else {
+ /* %! without string or identifier */
+ type = TOK_OTHER; /* Legacy behavior... */
+ }
+ } else if (isidchar(*p) ||
+ ((*p == '!' || *p == '%' || *p == '$') &&
+ isidchar(p[1]))) {
+ do {
+ p++;
+ }
+ while (isidchar(*p));
+ type = TOK_PREPROC_ID;
+ } else {
+ type = TOK_OTHER;
+ if (*p == '%')
+ p++;
+ }
+ } else if (isidstart(*p) || (*p == '$' && isidstart(p[1]))) {
+ type = TOK_ID;
+ p++;
+ while (*p && isidchar(*p))
+ p++;
+ } else if (*p == '\'' || *p == '"' || *p == '`') {
+ /*
+ * A string token.
+ */
+ type = TOK_STRING;
+ p = nasm_skip_string(p);
+
+ if (*p) {
+ p++;
+ } else {
+ nasm_error(ERR_WARNING|ERR_PASS1, "unterminated string");
+ /* Handling unterminated strings by UNV */
+ /* type = -1; */
+ }
+ } else if (p[0] == '$' && p[1] == '$') {
+ type = TOK_OTHER; /* TOKEN_BASE */
+ p += 2;
+ } else if (isnumstart(*p)) {
+ bool is_hex = false;
+ bool is_float = false;
+ bool has_e = false;
+ char c, *r;
+
+ /*
+ * A numeric token.
+ */
+
+ if (*p == '$') {
+ p++;
+ is_hex = true;
+ }
+
+ for (;;) {
+ c = *p++;
+
+ if (!is_hex && (c == 'e' || c == 'E')) {
+ has_e = true;
+ if (*p == '+' || *p == '-') {
+ /*
+ * e can only be followed by +/- if it is either a
+ * prefixed hex number or a floating-point number
+ */
+ p++;
+ is_float = true;
+ }
+ } else if (c == 'H' || c == 'h' || c == 'X' || c == 'x') {
+ is_hex = true;
+ } else if (c == 'P' || c == 'p') {
+ is_float = true;
+ if (*p == '+' || *p == '-')
+ p++;
+ } else if (isnumchar(c))
+ ; /* just advance */
+ else if (c == '.') {
+ /*
+ * we need to deal with consequences of the legacy
+ * parser, like "1.nolist" being two tokens
+ * (TOK_NUMBER, TOK_ID) here; at least give it
+ * a shot for now. In the future, we probably need
+ * a flex-based scanner with proper pattern matching
+ * to do it as well as it can be done. Nothing in
+ * the world is going to help the person who wants
+ * 0x123.p16 interpreted as two tokens, though.
+ */
+ r = p;
+ while (*r == '_')
+ r++;
+
+ if (nasm_isdigit(*r) || (is_hex && nasm_isxdigit(*r)) ||
+ (!is_hex && (*r == 'e' || *r == 'E')) ||
+ (*r == 'p' || *r == 'P')) {
+ p = r;
+ is_float = true;
+ } else
+ break; /* Terminate the token */
+ } else
+ break;
+ }
+ p--; /* Point to first character beyond number */
+
+ if (p == line+1 && *line == '$') {
+ type = TOK_OTHER; /* TOKEN_HERE */
+ } else {
+ if (has_e && !is_hex) {
+ /* 1e13 is floating-point, but 1e13h is not */
+ is_float = true;
+ }
+
+ type = is_float ? TOK_FLOAT : TOK_NUMBER;
+ }
+ } else if (nasm_isspace(*p)) {
+ type = TOK_WHITESPACE;
+ p = nasm_skip_spaces(p);
+ /*
+ * Whitespace just before end-of-line is discarded by
+ * pretending it's a comment; whitespace just before a
+ * comment gets lumped into the comment.
+ */
+ if (!*p || *p == ';') {
+ type = TOK_COMMENT;
+ while (*p)
+ p++;
+ }
+ } else if (*p == ';') {
+ type = TOK_COMMENT;
+ while (*p)
+ p++;
+ } else {
+ /*
+ * Anything else is an operator of some kind. We check
+ * for all the double-character operators (>>, <<, //,
+ * %%, <=, >=, ==, !=, <>, &&, ||, ^^), but anything
+ * else is a single-character operator.
+ */
+ type = TOK_OTHER;
+ if ((p[0] == '>' && p[1] == '>') ||
+ (p[0] == '<' && p[1] == '<') ||
+ (p[0] == '/' && p[1] == '/') ||
+ (p[0] == '<' && p[1] == '=') ||
+ (p[0] == '>' && p[1] == '=') ||
+ (p[0] == '=' && p[1] == '=') ||
+ (p[0] == '!' && p[1] == '=') ||
+ (p[0] == '<' && p[1] == '>') ||
+ (p[0] == '&' && p[1] == '&') ||
+ (p[0] == '|' && p[1] == '|') ||
+ (p[0] == '^' && p[1] == '^')) {
+ p++;
+ }
+ p++;
+ }
+
+ /* Handling unterminated string by UNV */
+ /*if (type == -1)
+ {
+ *tail = t = new_Token(NULL, TOK_STRING, line, p-line+1);
+ t->text[p-line] = *line;
+ tail = &t->next;
+ }
+ else */
+ if (type != TOK_COMMENT) {
+ *tail = t = new_Token(NULL, type, line, p - line);
+ tail = &t->next;
+ }
+ line = p;
+ }
+ return list;
+}
+
+/*
+ * this function allocates a new managed block of memory and
+ * returns a pointer to the block. The managed blocks are
+ * deleted only all at once by the delete_Blocks function.
+ */
+static void *new_Block(size_t size)
+{
+ Blocks *b = &blocks;
+
+ /* first, get to the end of the linked list */
+ while (b->next)
+ b = b->next;
+ /* now allocate the requested chunk */
+ b->chunk = nasm_malloc(size);
+
+ /* now allocate a new block for the next request */
+ b->next = nasm_zalloc(sizeof(Blocks));
+ return b->chunk;
+}
+
+/*
+ * this function deletes all managed blocks of memory
+ */
+static void delete_Blocks(void)
+{
+ Blocks *a, *b = &blocks;
+
+ /*
+ * keep in mind that the first block, pointed to by blocks
+ * is a static and not dynamically allocated, so we don't
+ * free it.
+ */
+ while (b) {
+ if (b->chunk)
+ nasm_free(b->chunk);
+ a = b;
+ b = b->next;
+ if (a != &blocks)
+ nasm_free(a);
+ }
+ memset(&blocks, 0, sizeof(blocks));
+}
+
+/*
+ * this function creates a new Token and passes a pointer to it
+ * back to the caller. It sets the type and text elements, and
+ * also the a.mac and next elements to NULL.
+ */
+static Token *new_Token(Token * next, enum pp_token_type type,
+ const char *text, int txtlen)
+{
+ Token *t;
+ int i;
+
+ if (!freeTokens) {
+ freeTokens = (Token *) new_Block(TOKEN_BLOCKSIZE * sizeof(Token));
+ for (i = 0; i < TOKEN_BLOCKSIZE - 1; i++)
+ freeTokens[i].next = &freeTokens[i + 1];
+ freeTokens[i].next = NULL;
+ }
+ t = freeTokens;
+ freeTokens = t->next;
+ t->next = next;
+ t->a.mac = NULL;
+ t->type = type;
+ if (type == TOK_WHITESPACE || !text) {
+ t->text = NULL;
+ } else {
+ if (txtlen == 0)
+ txtlen = strlen(text);
+ t->text = nasm_malloc(txtlen+1);
+ memcpy(t->text, text, txtlen);
+ t->text[txtlen] = '\0';
+ }
+ return t;
+}
+
+static Token *delete_Token(Token * t)
+{
+ Token *next = t->next;
+ nasm_free(t->text);
+ t->next = freeTokens;
+ freeTokens = t;
+ return next;
+}
+
+/*
+ * Convert a line of tokens back into text.
+ * If expand_locals is not zero, identifiers of the form "%$*xxx"
+ * will be transformed into ..@ctxnum.xxx
+ */
+static char *detoken(Token * tlist, bool expand_locals)
+{
+ Token *t;
+ char *line, *p;
+ const char *q;
+ int len = 0;
+
+ list_for_each(t, tlist) {
+ if (t->type == TOK_PREPROC_ID && t->text &&
+ t->text[0] && t->text[1] == '!') {
+ char *v;
+ char *q = t->text;
+
+ v = t->text + 2;
+ if (*v == '\'' || *v == '\"' || *v == '`') {
+ size_t len = nasm_unquote(v, NULL);
+ size_t clen = strlen(v);
+
+ if (len != clen) {
+ nasm_error(ERR_NONFATAL | ERR_PASS1,
+ "NUL character in %%! string");
+ v = NULL;
+ }
+ }
+
+ if (v) {
+ char *p = getenv(v);
+ if (!p) {
+ nasm_error(ERR_NONFATAL | ERR_PASS1,
+ "nonexistent environment variable `%s'", v);
+ /*
+ * FIXME We better should investigate if accessing
+ * ->text[1] without ->text[0] is safe enough.
+ */
+ t->text = nasm_zalloc(2);
+ } else
+ t->text = nasm_strdup(p);
+ nasm_free(q);
+ }
+ }
+
+ /* Expand local macros here and not during preprocessing */
+ if (expand_locals &&
+ t->type == TOK_PREPROC_ID && t->text &&
+ t->text[0] == '%' && t->text[1] == '$') {
+ const char *q;
+ char *p;
+ Context *ctx = get_ctx(t->text, &q);
+ if (ctx) {
+ char buffer[40];
+ snprintf(buffer, sizeof(buffer), "..@%"PRIu32".", ctx->number);
+ p = nasm_strcat(buffer, q);
+ nasm_free(t->text);
+ t->text = p;
+ }
+ }
+ if (t->type == TOK_WHITESPACE)
+ len++;
+ else if (t->text)
+ len += strlen(t->text);
+ }
+
+ p = line = nasm_malloc(len + 1);
+
+ list_for_each(t, tlist) {
+ if (t->type == TOK_WHITESPACE) {
+ *p++ = ' ';
+ } else if (t->text) {
+ q = t->text;
+ while (*q)
+ *p++ = *q++;
+ }
+ }
+ *p = '\0';
+
+ return line;
+}
+
+/*
+ * A scanner, suitable for use by the expression evaluator, which
+ * operates on a line of Tokens. Expects a pointer to a pointer to
+ * the first token in the line to be passed in as its private_data
+ * field.
+ *
+ * FIX: This really needs to be unified with stdscan.
+ */
+static int ppscan(void *private_data, struct tokenval *tokval)
+{
+ Token **tlineptr = private_data;
+ Token *tline;
+ char ourcopy[MAX_KEYWORD+1], *p, *r, *s;
+
+ do {
+ tline = *tlineptr;
+ *tlineptr = tline ? tline->next : NULL;
+ } while (tline && (tline->type == TOK_WHITESPACE ||
+ tline->type == TOK_COMMENT));
+
+ if (!tline)
+ return tokval->t_type = TOKEN_EOS;
+
+ tokval->t_charptr = tline->text;
+
+ if (tline->text[0] == '$' && !tline->text[1])
+ return tokval->t_type = TOKEN_HERE;
+ if (tline->text[0] == '$' && tline->text[1] == '$' && !tline->text[2])
+ return tokval->t_type = TOKEN_BASE;
+
+ if (tline->type == TOK_ID) {
+ p = tokval->t_charptr = tline->text;
+ if (p[0] == '$') {
+ tokval->t_charptr++;
+ return tokval->t_type = TOKEN_ID;
+ }
+
+ for (r = p, s = ourcopy; *r; r++) {
+ if (r >= p+MAX_KEYWORD)
+ return tokval->t_type = TOKEN_ID; /* Not a keyword */
+ *s++ = nasm_tolower(*r);
+ }
+ *s = '\0';
+ /* right, so we have an identifier sitting in temp storage. now,
+ * is it actually a register or instruction name, or what? */
+ return nasm_token_hash(ourcopy, tokval);
+ }
+
+ if (tline->type == TOK_NUMBER) {
+ bool rn_error;
+ tokval->t_integer = readnum(tline->text, &rn_error);
+ tokval->t_charptr = tline->text;
+ if (rn_error)
+ return tokval->t_type = TOKEN_ERRNUM;
+ else
+ return tokval->t_type = TOKEN_NUM;
+ }
+
+ if (tline->type == TOK_FLOAT) {
+ return tokval->t_type = TOKEN_FLOAT;
+ }
+
+ if (tline->type == TOK_STRING) {
+ char bq, *ep;
+
+ bq = tline->text[0];
+ tokval->t_charptr = tline->text;
+ tokval->t_inttwo = nasm_unquote(tline->text, &ep);
+
+ if (ep[0] != bq || ep[1] != '\0')
+ return tokval->t_type = TOKEN_ERRSTR;
+ else
+ return tokval->t_type = TOKEN_STR;
+ }
+
+ if (tline->type == TOK_OTHER) {
+ if (!strcmp(tline->text, "<<"))
+ return tokval->t_type = TOKEN_SHL;
+ if (!strcmp(tline->text, ">>"))
+ return tokval->t_type = TOKEN_SHR;
+ if (!strcmp(tline->text, "//"))
+ return tokval->t_type = TOKEN_SDIV;
+ if (!strcmp(tline->text, "%%"))
+ return tokval->t_type = TOKEN_SMOD;
+ if (!strcmp(tline->text, "=="))
+ return tokval->t_type = TOKEN_EQ;
+ if (!strcmp(tline->text, "<>"))
+ return tokval->t_type = TOKEN_NE;
+ if (!strcmp(tline->text, "!="))
+ return tokval->t_type = TOKEN_NE;
+ if (!strcmp(tline->text, "<="))
+ return tokval->t_type = TOKEN_LE;
+ if (!strcmp(tline->text, ">="))
+ return tokval->t_type = TOKEN_GE;
+ if (!strcmp(tline->text, "&&"))
+ return tokval->t_type = TOKEN_DBL_AND;
+ if (!strcmp(tline->text, "^^"))
+ return tokval->t_type = TOKEN_DBL_XOR;
+ if (!strcmp(tline->text, "||"))
+ return tokval->t_type = TOKEN_DBL_OR;
+ }
+
+ /*
+ * We have no other options: just return the first character of
+ * the token text.
+ */
+ return tokval->t_type = tline->text[0];
+}
+
+/*
+ * Compare a string to the name of an existing macro; this is a
+ * simple wrapper which calls either strcmp or nasm_stricmp
+ * depending on the value of the `casesense' parameter.
+ */
+static int mstrcmp(const char *p, const char *q, bool casesense)
+{
+ return casesense ? strcmp(p, q) : nasm_stricmp(p, q);
+}
+
+/*
+ * Compare a string to the name of an existing macro; this is a
+ * simple wrapper which calls either strcmp or nasm_stricmp
+ * depending on the value of the `casesense' parameter.
+ */
+static int mmemcmp(const char *p, const char *q, size_t l, bool casesense)
+{
+ return casesense ? memcmp(p, q, l) : nasm_memicmp(p, q, l);
+}
+
+/*
+ * Return the Context structure associated with a %$ token. Return
+ * NULL, having _already_ reported an error condition, if the
+ * context stack isn't deep enough for the supplied number of $
+ * signs.
+ *
+ * If "namep" is non-NULL, set it to the pointer to the macro name
+ * tail, i.e. the part beyond %$...
+ */
+static Context *get_ctx(const char *name, const char **namep)
+{
+ Context *ctx;
+ int i;
+
+ if (namep)
+ *namep = name;
+
+ if (!name || name[0] != '%' || name[1] != '$')
+ return NULL;
+
+ if (!cstk) {
+ nasm_error(ERR_NONFATAL, "`%s': context stack is empty", name);
+ return NULL;
+ }
+
+ name += 2;
+ ctx = cstk;
+ i = 0;
+ while (ctx && *name == '$') {
+ name++;
+ i++;
+ ctx = ctx->next;
+ }
+ if (!ctx) {
+ nasm_error(ERR_NONFATAL, "`%s': context stack is only"
+ " %d level%s deep", name, i, (i == 1 ? "" : "s"));
+ return NULL;
+ }
+
+ if (namep)
+ *namep = name;
+
+ return ctx;
+}
+
+/*
+ * Open an include file. This routine must always return a valid
+ * file pointer if it returns - it's responsible for throwing an
+ * ERR_FATAL and bombing out completely if not. It should also try
+ * the include path one by one until it finds the file or reaches
+ * the end of the path.
+ *
+ * Note: for INC_PROBE the function returns NULL at all times;
+ * instead look for the
+ */
+enum incopen_mode {
+ INC_NEEDED, /* File must exist */
+ INC_OPTIONAL, /* Missing is OK */
+ INC_PROBE /* Only an existence probe */
+};
+
+/* This is conducts a full pathname search */
+static FILE *inc_fopen_search(const char *file, char **slpath,
+ enum incopen_mode omode, enum file_flags fmode)
+{
+ FILE *fp;
+ const char *prefix = "";
+ const struct strlist_entry *ip = ipath->head;
+ char *sp;
+ bool found;
+
+ while (1) {
+ sp = nasm_catfile(prefix, file);
+ if (omode == INC_PROBE) {
+ fp = NULL;
+ found = nasm_file_exists(sp);
+ } else {
+ fp = nasm_open_read(sp, fmode);
+ found = (fp != NULL);
+ }
+ if (found) {
+ *slpath = sp;
+ return fp;
+ }
+
+ nasm_free(sp);
+
+ if (!ip) {
+ *slpath = NULL;
+ return NULL;
+ }
+
+ prefix = ip->str;
+ ip = ip->next;
+ }
+}
+
+/*
+ * Open a file, or test for the presence of one (depending on omode),
+ * considering the include path.
+ */
+static FILE *inc_fopen(const char *file,
+ StrList *dhead,
+ const char **found_path,
+ enum incopen_mode omode,
+ enum file_flags fmode)
+{
+ struct hash_insert hi;
+ void **hp;
+ char *path;
+ FILE *fp = NULL;
+
+ hp = hash_find(&FileHash, file, &hi);
+ if (hp) {
+ path = *hp;
+ if (path || omode != INC_NEEDED) {
+ strlist_add_string(dhead, path ? path : file);
+ }
+ } else {
+ /* Need to do the actual path search */
+ fp = inc_fopen_search(file, &path, omode, fmode);
+
+ /* Positive or negative result */
+ hash_add(&hi, nasm_strdup(file), path);
+
+ /*
+ * Add file to dependency path.
+ */
+ if (path || omode != INC_NEEDED)
+ strlist_add_string(dhead, file);
+ }
+
+ if (!path) {
+ if (omode == INC_NEEDED)
+ nasm_fatal("unable to open include file `%s'", file);
+ } else {
+ if (!fp && omode != INC_PROBE)
+ fp = nasm_open_read(path, fmode);
+ }
+
+ if (found_path)
+ *found_path = path;
+
+ return fp;
+}
+
+/*
+ * Opens an include or input file. Public version, for use by modules
+ * that get a file:lineno pair and need to look at the file again
+ * (e.g. the CodeView debug backend). Returns NULL on failure.
+ */
+FILE *pp_input_fopen(const char *filename, enum file_flags mode)
+{
+ return inc_fopen(filename, NULL, NULL, INC_OPTIONAL, mode);
+}
+
+/*
+ * Determine if we should warn on defining a single-line macro of
+ * name `name', with `nparam' parameters. If nparam is 0 or -1, will
+ * return true if _any_ single-line macro of that name is defined.
+ * Otherwise, will return true if a single-line macro with either
+ * `nparam' or no parameters is defined.
+ *
+ * If a macro with precisely the right number of parameters is
+ * defined, or nparam is -1, the address of the definition structure
+ * will be returned in `defn'; otherwise NULL will be returned. If `defn'
+ * is NULL, no action will be taken regarding its contents, and no
+ * error will occur.
+ *
+ * Note that this is also called with nparam zero to resolve
+ * `ifdef'.
+ *
+ * If you already know which context macro belongs to, you can pass
+ * the context pointer as first parameter; if you won't but name begins
+ * with %$ the context will be automatically computed. If all_contexts
+ * is true, macro will be searched in outer contexts as well.
+ */
+static bool
+smacro_defined(Context * ctx, const char *name, int nparam, SMacro ** defn,
+ bool nocase)
+{
+ struct hash_table *smtbl;
+ SMacro *m;
+
+ if (ctx) {
+ smtbl = &ctx->localmac;
+ } else if (name[0] == '%' && name[1] == '$') {
+ if (cstk)
+ ctx = get_ctx(name, &name);
+ if (!ctx)
+ return false; /* got to return _something_ */
+ smtbl = &ctx->localmac;
+ } else {
+ smtbl = &smacros;
+ }
+ m = (SMacro *) hash_findix(smtbl, name);
+
+ while (m) {
+ if (!mstrcmp(m->name, name, m->casesense && nocase) &&
+ (nparam <= 0 || m->nparam == 0 || nparam == (int) m->nparam)) {
+ if (defn) {
+ if (nparam == (int) m->nparam || nparam == -1)
+ *defn = m;
+ else
+ *defn = NULL;
+ }
+ return true;
+ }
+ m = m->next;
+ }
+
+ return false;
+}
+
+/*
+ * Count and mark off the parameters in a multi-line macro call.
+ * This is called both from within the multi-line macro expansion
+ * code, and also to mark off the default parameters when provided
+ * in a %macro definition line.
+ */
+static void count_mmac_params(Token * t, int *nparam, Token *** params)
+{
+ int paramsize, brace;
+
+ *nparam = paramsize = 0;
+ *params = NULL;
+ while (t) {
+ /* +1: we need space for the final NULL */
+ if (*nparam+1 >= paramsize) {
+ paramsize += PARAM_DELTA;
+ *params = nasm_realloc(*params, sizeof(**params) * paramsize);
+ }
+ skip_white_(t);
+ brace = 0;
+ if (tok_is_(t, "{"))
+ brace++;
+ (*params)[(*nparam)++] = t;
+ if (brace) {
+ while (brace && (t = t->next) != NULL) {
+ if (tok_is_(t, "{"))
+ brace++;
+ else if (tok_is_(t, "}"))
+ brace--;
+ }
+
+ if (t) {
+ /*
+ * Now we've found the closing brace, look further
+ * for the comma.
+ */
+ t = t->next;
+ skip_white_(t);
+ if (tok_isnt_(t, ",")) {
+ nasm_error(ERR_NONFATAL,
+ "braces do not enclose all of macro parameter");
+ while (tok_isnt_(t, ","))
+ t = t->next;
+ }
+ }
+ } else {
+ while (tok_isnt_(t, ","))
+ t = t->next;
+ }
+ if (t) { /* got a comma/brace */
+ t = t->next; /* eat the comma */
+ }
+ }
+}
+
+/*
+ * Determine whether one of the various `if' conditions is true or
+ * not.
+ *
+ * We must free the tline we get passed.
+ */
+static bool if_condition(Token * tline, enum preproc_token ct)
+{
+ enum pp_conditional i = PP_COND(ct);
+ bool j;
+ Token *t, *tt, **tptr, *origline;
+ struct tokenval tokval;
+ expr *evalresult;
+ enum pp_token_type needtype;
+ char *p;
+
+ origline = tline;
+
+ switch (i) {
+ case PPC_IFCTX:
+ j = false; /* have we matched yet? */
+ while (true) {
+ skip_white_(tline);
+ if (!tline)
+ break;
+ if (tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects context identifiers", pp_directives[ct]);
+ free_tlist(origline);
+ return -1;
+ }
+ if (cstk && cstk->name && !nasm_stricmp(tline->text, cstk->name))
+ j = true;
+ tline = tline->next;
+ }
+ break;
+
+ case PPC_IFDEF:
+ j = false; /* have we matched yet? */
+ while (tline) {
+ skip_white_(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects macro identifiers", pp_directives[ct]);
+ goto fail;
+ }
+ if (smacro_defined(NULL, tline->text, 0, NULL, true))
+ j = true;
+ tline = tline->next;
+ }
+ break;
+
+ case PPC_IFENV:
+ tline = expand_smacro(tline);
+ j = false; /* have we matched yet? */
+ while (tline) {
+ skip_white_(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ tline->type != TOK_STRING &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '!'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects environment variable names",
+ pp_directives[ct]);
+ goto fail;
+ }
+ p = tline->text;
+ if (tline->type == TOK_PREPROC_ID)
+ p += 2; /* Skip leading %! */
+ if (*p == '\'' || *p == '\"' || *p == '`')
+ nasm_unquote_cstr(p, ct);
+ if (getenv(p))
+ j = true;
+ tline = tline->next;
+ }
+ break;
+
+ case PPC_IFIDN:
+ case PPC_IFIDNI:
+ tline = expand_smacro(tline);
+ t = tt = tline;
+ while (tok_isnt_(tt, ","))
+ tt = tt->next;
+ if (!tt) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects two comma-separated arguments",
+ pp_directives[ct]);
+ goto fail;
+ }
+ tt = tt->next;
+ j = true; /* assume equality unless proved not */
+ while ((t->type != TOK_OTHER || strcmp(t->text, ",")) && tt) {
+ if (tt->type == TOK_OTHER && !strcmp(tt->text, ",")) {
+ nasm_error(ERR_NONFATAL, "`%s': more than one comma on line",
+ pp_directives[ct]);
+ goto fail;
+ }
+ if (t->type == TOK_WHITESPACE) {
+ t = t->next;
+ continue;
+ }
+ if (tt->type == TOK_WHITESPACE) {
+ tt = tt->next;
+ continue;
+ }
+ if (tt->type != t->type) {
+ j = false; /* found mismatching tokens */
+ break;
+ }
+ /* When comparing strings, need to unquote them first */
+ if (t->type == TOK_STRING) {
+ size_t l1 = nasm_unquote(t->text, NULL);
+ size_t l2 = nasm_unquote(tt->text, NULL);
+
+ if (l1 != l2) {
+ j = false;
+ break;
+ }
+ if (mmemcmp(t->text, tt->text, l1, i == PPC_IFIDN)) {
+ j = false;
+ break;
+ }
+ } else if (mstrcmp(tt->text, t->text, i == PPC_IFIDN) != 0) {
+ j = false; /* found mismatching tokens */
+ break;
+ }
+
+ t = t->next;
+ tt = tt->next;
+ }
+ if ((t->type != TOK_OTHER || strcmp(t->text, ",")) || tt)
+ j = false; /* trailing gunk on one end or other */
+ break;
+
+ case PPC_IFMACRO:
+ {
+ bool found = false;
+ MMacro searching, *mmac;
+
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tok_type_(tline, TOK_ID)) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects a macro name", pp_directives[ct]);
+ goto fail;
+ }
+ searching.name = nasm_strdup(tline->text);
+ searching.casesense = true;
+ searching.plus = false;
+ searching.nolist = false;
+ searching.in_progress = 0;
+ searching.max_depth = 0;
+ searching.rep_nest = NULL;
+ searching.nparam_min = 0;
+ searching.nparam_max = INT_MAX;
+ tline = expand_smacro(tline->next);
+ skip_white_(tline);
+ if (!tline) {
+ } else if (!tok_type_(tline, TOK_NUMBER)) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects a parameter count or nothing",
+ pp_directives[ct]);
+ } else {
+ searching.nparam_min = searching.nparam_max =
+ readnum(tline->text, &j);
+ if (j)
+ nasm_error(ERR_NONFATAL,
+ "unable to parse parameter count `%s'",
+ tline->text);
+ }
+ if (tline && tok_is_(tline->next, "-")) {
+ tline = tline->next->next;
+ if (tok_is_(tline, "*"))
+ searching.nparam_max = INT_MAX;
+ else if (!tok_type_(tline, TOK_NUMBER))
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects a parameter count after `-'",
+ pp_directives[ct]);
+ else {
+ searching.nparam_max = readnum(tline->text, &j);
+ if (j)
+ nasm_error(ERR_NONFATAL,
+ "unable to parse parameter count `%s'",
+ tline->text);
+ if (searching.nparam_min > searching.nparam_max) {
+ nasm_error(ERR_NONFATAL,
+ "minimum parameter count exceeds maximum");
+ searching.nparam_max = searching.nparam_min;
+ }
+ }
+ }
+ if (tline && tok_is_(tline->next, "+")) {
+ tline = tline->next;
+ searching.plus = true;
+ }
+ mmac = (MMacro *) hash_findix(&mmacros, searching.name);
+ while (mmac) {
+ if (!strcmp(mmac->name, searching.name) &&
+ (mmac->nparam_min <= searching.nparam_max
+ || searching.plus)
+ && (searching.nparam_min <= mmac->nparam_max
+ || mmac->plus)) {
+ found = true;
+ break;
+ }
+ mmac = mmac->next;
+ }
+ if (tline && tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after %%ifmacro ignored");
+ nasm_free(searching.name);
+ j = found;
+ break;
+ }
+
+ case PPC_IFID:
+ needtype = TOK_ID;
+ goto iftype;
+ case PPC_IFNUM:
+ needtype = TOK_NUMBER;
+ goto iftype;
+ case PPC_IFSTR:
+ needtype = TOK_STRING;
+ goto iftype;
+
+iftype:
+ t = tline = expand_smacro(tline);
+
+ while (tok_type_(t, TOK_WHITESPACE) ||
+ (needtype == TOK_NUMBER &&
+ tok_type_(t, TOK_OTHER) &&
+ (t->text[0] == '-' || t->text[0] == '+') &&
+ !t->text[1]))
+ t = t->next;
+
+ j = tok_type_(t, needtype);
+ break;
+
+ case PPC_IFTOKEN:
+ t = tline = expand_smacro(tline);
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+
+ j = false;
+ if (t) {
+ t = t->next; /* Skip the actual token */
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+ j = !t; /* Should be nothing left */
+ }
+ break;
+
+ case PPC_IFEMPTY:
+ t = tline = expand_smacro(tline);
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+
+ j = !t; /* Should be empty */
+ break;
+
+ case PPC_IF:
+ t = tline = expand_smacro(tline);
+ tptr = &t;
+ tokval.t_type = TOKEN_INVALID;
+ evalresult = evaluate(ppscan, tptr, &tokval,
+ NULL, pass | CRITICAL, NULL);
+ if (!evalresult)
+ return -1;
+ if (tokval.t_type)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after expression ignored");
+ if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL,
+ "non-constant value given to `%s'", pp_directives[ct]);
+ goto fail;
+ }
+ j = reloc_value(evalresult) != 0;
+ break;
+
+ default:
+ nasm_error(ERR_FATAL,
+ "preprocessor directive `%s' not yet implemented",
+ pp_directives[ct]);
+ goto fail;
+ }
+
+ free_tlist(origline);
+ return j ^ PP_NEGATIVE(ct);
+
+fail:
+ free_tlist(origline);
+ return -1;
+}
+
+/*
+ * Common code for defining an smacro
+ */
+static bool define_smacro(Context *ctx, const char *mname, bool casesense,
+ int nparam, Token *expansion)
+{
+ SMacro *smac, **smhead;
+ struct hash_table *smtbl;
+
+ if (smacro_defined(ctx, mname, nparam, &smac, casesense)) {
+ if (!smac) {
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "single-line macro `%s' defined both with and"
+ " without parameters", mname);
+ /*
+ * Some instances of the old code considered this a failure,
+ * some others didn't. What is the right thing to do here?
+ */
+ free_tlist(expansion);
+ return false; /* Failure */
+ } else {
+ /*
+ * We're redefining, so we have to take over an
+ * existing SMacro structure. This means freeing
+ * what was already in it.
+ */
+ nasm_free(smac->name);
+ free_tlist(smac->expansion);
+ }
+ } else {
+ smtbl = ctx ? &ctx->localmac : &smacros;
+ smhead = (SMacro **) hash_findi_add(smtbl, mname);
+ smac = nasm_malloc(sizeof(SMacro));
+ smac->next = *smhead;
+ *smhead = smac;
+ }
+ smac->name = nasm_strdup(mname);
+ smac->casesense = casesense;
+ smac->nparam = nparam;
+ smac->expansion = expansion;
+ smac->in_progress = false;
+ return true; /* Success */
+}
+
+/*
+ * Undefine an smacro
+ */
+static void undef_smacro(Context *ctx, const char *mname)
+{
+ SMacro **smhead, *s, **sp;
+ struct hash_table *smtbl;
+
+ smtbl = ctx ? &ctx->localmac : &smacros;
+ smhead = (SMacro **)hash_findi(smtbl, mname, NULL);
+
+ if (smhead) {
+ /*
+ * We now have a macro name... go hunt for it.
+ */
+ sp = smhead;
+ while ((s = *sp) != NULL) {
+ if (!mstrcmp(s->name, mname, s->casesense)) {
+ *sp = s->next;
+ nasm_free(s->name);
+ free_tlist(s->expansion);
+ nasm_free(s);
+ } else {
+ sp = &s->next;
+ }
+ }
+ }
+}
+
+/*
+ * Parse a mmacro specification.
+ */
+static bool parse_mmacro_spec(Token *tline, MMacro *def, const char *directive)
+{
+ bool err;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tok_type_(tline, TOK_ID)) {
+ nasm_error(ERR_NONFATAL, "`%s' expects a macro name", directive);
+ return false;
+ }
+
+ def->prev = NULL;
+ def->name = nasm_strdup(tline->text);
+ def->plus = false;
+ def->nolist = false;
+ def->in_progress = 0;
+ def->rep_nest = NULL;
+ def->nparam_min = 0;
+ def->nparam_max = 0;
+
+ tline = expand_smacro(tline->next);
+ skip_white_(tline);
+ if (!tok_type_(tline, TOK_NUMBER)) {
+ nasm_error(ERR_NONFATAL, "`%s' expects a parameter count", directive);
+ } else {
+ def->nparam_min = def->nparam_max =
+ readnum(tline->text, &err);
+ if (err)
+ nasm_error(ERR_NONFATAL,
+ "unable to parse parameter count `%s'", tline->text);
+ }
+ if (tline && tok_is_(tline->next, "-")) {
+ tline = tline->next->next;
+ if (tok_is_(tline, "*")) {
+ def->nparam_max = INT_MAX;
+ } else if (!tok_type_(tline, TOK_NUMBER)) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects a parameter count after `-'", directive);
+ } else {
+ def->nparam_max = readnum(tline->text, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL, "unable to parse parameter count `%s'",
+ tline->text);
+ }
+ if (def->nparam_min > def->nparam_max) {
+ nasm_error(ERR_NONFATAL, "minimum parameter count exceeds maximum");
+ def->nparam_max = def->nparam_min;
+ }
+ }
+ }
+ if (tline && tok_is_(tline->next, "+")) {
+ tline = tline->next;
+ def->plus = true;
+ }
+ if (tline && tok_type_(tline->next, TOK_ID) &&
+ !nasm_stricmp(tline->next->text, ".nolist")) {
+ tline = tline->next;
+ def->nolist = true;
+ }
+
+ /*
+ * Handle default parameters.
+ */
+ if (tline && tline->next) {
+ def->dlist = tline->next;
+ tline->next = NULL;
+ count_mmac_params(def->dlist, &def->ndefs, &def->defaults);
+ } else {
+ def->dlist = NULL;
+ def->defaults = NULL;
+ }
+ def->expansion = NULL;
+
+ if (def->defaults && def->ndefs > def->nparam_max - def->nparam_min &&
+ !def->plus)
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_WARN_MDP,
+ "too many default macro parameters");
+
+ return true;
+}
+
+
+/*
+ * Decode a size directive
+ */
+static int parse_size(const char *str) {
+ static const char *size_names[] =
+ { "byte", "dword", "oword", "qword", "tword", "word", "yword" };
+ static const int sizes[] =
+ { 0, 1, 4, 16, 8, 10, 2, 32 };
+ return str ? sizes[bsii(str, size_names, ARRAY_SIZE(size_names))+1] : 0;
+}
+
+/*
+ * Process a preprocessor %pragma directive. Currently there are none.
+ * Gets passed the token list starting with the "preproc" token from
+ * "%pragma preproc".
+ */
+static void do_pragma_preproc(Token *tline)
+{
+ /* Skip to the real stuff */
+ tline = tline->next;
+ skip_white_(tline);
+ if (!tline)
+ return;
+
+ (void)tline; /* Nothing else to do at present */
+}
+
+/**
+ * find and process preprocessor directive in passed line
+ * Find out if a line contains a preprocessor directive, and deal
+ * with it if so.
+ *
+ * If a directive _is_ found, it is the responsibility of this routine
+ * (and not the caller) to free_tlist() the line.
+ *
+ * @param tline a pointer to the current tokeninzed line linked list
+ * @param output if this directive generated output
+ * @return DIRECTIVE_FOUND or NO_DIRECTIVE_FOUND
+ *
+ */
+static int do_directive(Token *tline, char **output)
+{
+ enum preproc_token i;
+ int j;
+ bool err;
+ int nparam;
+ bool nolist;
+ bool casesense;
+ int k, m;
+ int offset;
+ char *p, *pp;
+ const char *found_path;
+ const char *mname;
+ Include *inc;
+ Context *ctx;
+ Cond *cond;
+ MMacro *mmac, **mmhead;
+ Token *t = NULL, *tt, *param_start, *macro_start, *last, **tptr, *origline;
+ Line *l;
+ struct tokenval tokval;
+ expr *evalresult;
+ MMacro *tmp_defining; /* Used when manipulating rep_nest */
+ int64_t count;
+ size_t len;
+ int severity;
+
+ *output = NULL; /* No output generated */
+ origline = tline;
+
+ skip_white_(tline);
+ if (!tline || !tok_type_(tline, TOK_PREPROC_ID) ||
+ (tline->text[1] == '%' || tline->text[1] == '$'
+ || tline->text[1] == '!'))
+ return NO_DIRECTIVE_FOUND;
+
+ i = pp_token_hash(tline->text);
+
+ /*
+ * FIXME: We zap execution of PP_RMACRO, PP_IRMACRO, PP_EXITMACRO
+ * since they are known to be buggy at moment, we need to fix them
+ * in future release (2.09-2.10)
+ */
+ if (i == PP_RMACRO || i == PP_IRMACRO || i == PP_EXITMACRO) {
+ nasm_error(ERR_NONFATAL, "unknown preprocessor directive `%s'",
+ tline->text);
+ return NO_DIRECTIVE_FOUND;
+ }
+
+ /*
+ * If we're in a non-emitting branch of a condition construct,
+ * or walking to the end of an already terminated %rep block,
+ * we should ignore all directives except for condition
+ * directives.
+ */
+ if (((istk->conds && !emitting(istk->conds->state)) ||
+ (istk->mstk && !istk->mstk->in_progress)) && !is_condition(i)) {
+ return NO_DIRECTIVE_FOUND;
+ }
+
+ /*
+ * If we're defining a macro or reading a %rep block, we should
+ * ignore all directives except for %macro/%imacro (which nest),
+ * %endm/%endmacro, and (only if we're in a %rep block) %endrep.
+ * If we're in a %rep block, another %rep nests, so should be let through.
+ */
+ if (defining && i != PP_MACRO && i != PP_IMACRO &&
+ i != PP_RMACRO && i != PP_IRMACRO &&
+ i != PP_ENDMACRO && i != PP_ENDM &&
+ (defining->name || (i != PP_ENDREP && i != PP_REP))) {
+ return NO_DIRECTIVE_FOUND;
+ }
+
+ if (defining) {
+ if (i == PP_MACRO || i == PP_IMACRO ||
+ i == PP_RMACRO || i == PP_IRMACRO) {
+ nested_mac_count++;
+ return NO_DIRECTIVE_FOUND;
+ } else if (nested_mac_count > 0) {
+ if (i == PP_ENDMACRO) {
+ nested_mac_count--;
+ return NO_DIRECTIVE_FOUND;
+ }
+ }
+ if (!defining->name) {
+ if (i == PP_REP) {
+ nested_rep_count++;
+ return NO_DIRECTIVE_FOUND;
+ } else if (nested_rep_count > 0) {
+ if (i == PP_ENDREP) {
+ nested_rep_count--;
+ return NO_DIRECTIVE_FOUND;
+ }
+ }
+ }
+ }
+
+ switch (i) {
+ case PP_INVALID:
+ nasm_error(ERR_NONFATAL, "unknown preprocessor directive `%s'",
+ tline->text);
+ return NO_DIRECTIVE_FOUND; /* didn't get it */
+
+ case PP_PRAGMA:
+ /*
+ * %pragma namespace options...
+ *
+ * The namespace "preproc" is reserved for the preprocessor;
+ * all other namespaces generate a [pragma] assembly directive.
+ *
+ * Invalid %pragmas are ignored and may have different
+ * meaning in future versions of NASM.
+ */
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_smacro(tline);
+ if (tok_type_(tline, TOK_ID)) {
+ if (!nasm_stricmp(tline->text, "preproc")) {
+ /* Preprocessor pragma */
+ do_pragma_preproc(tline);
+ } else {
+ /* Build the assembler directive */
+ t = new_Token(NULL, TOK_OTHER, "[", 1);
+ t->next = new_Token(NULL, TOK_ID, "pragma", 6);
+ t->next->next = new_Token(tline, TOK_WHITESPACE, NULL, 0);
+ tline = t;
+ for (t = tline; t->next; t = t->next)
+ ;
+ t->next = new_Token(NULL, TOK_OTHER, "]", 1);
+ /* true here can be revisited in the future */
+ *output = detoken(tline, true);
+ }
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_STACKSIZE:
+ /* Directive to tell NASM what the default stack size is. The
+ * default is for a 16-bit stack, and this can be overriden with
+ * %stacksize large.
+ */
+ tline = tline->next;
+ if (tline && tline->type == TOK_WHITESPACE)
+ tline = tline->next;
+ if (!tline || tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL, "`%%stacksize' missing size parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ if (nasm_stricmp(tline->text, "flat") == 0) {
+ /* All subsequent ARG directives are for a 32-bit stack */
+ StackSize = 4;
+ StackPointer = "ebp";
+ ArgOffset = 8;
+ LocalOffset = 0;
+ } else if (nasm_stricmp(tline->text, "flat64") == 0) {
+ /* All subsequent ARG directives are for a 64-bit stack */
+ StackSize = 8;
+ StackPointer = "rbp";
+ ArgOffset = 16;
+ LocalOffset = 0;
+ } else if (nasm_stricmp(tline->text, "large") == 0) {
+ /* All subsequent ARG directives are for a 16-bit stack,
+ * far function call.
+ */
+ StackSize = 2;
+ StackPointer = "bp";
+ ArgOffset = 4;
+ LocalOffset = 0;
+ } else if (nasm_stricmp(tline->text, "small") == 0) {
+ /* All subsequent ARG directives are for a 16-bit stack,
+ * far function call. We don't support near functions.
+ */
+ StackSize = 2;
+ StackPointer = "bp";
+ ArgOffset = 6;
+ LocalOffset = 0;
+ } else {
+ nasm_error(ERR_NONFATAL, "`%%stacksize' invalid size type");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_ARG:
+ /* TASM like ARG directive to define arguments to functions, in
+ * the following form:
+ *
+ * ARG arg1:WORD, arg2:DWORD, arg4:QWORD
+ */
+ offset = ArgOffset;
+ do {
+ char *arg, directive[256];
+ int size = StackSize;
+
+ /* Find the argument name */
+ tline = tline->next;
+ if (tline && tline->type == TOK_WHITESPACE)
+ tline = tline->next;
+ if (!tline || tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL, "`%%arg' missing argument parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ arg = tline->text;
+
+ /* Find the argument size type */
+ tline = tline->next;
+ if (!tline || tline->type != TOK_OTHER
+ || tline->text[0] != ':') {
+ nasm_error(ERR_NONFATAL,
+ "Syntax error processing `%%arg' directive");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ tline = tline->next;
+ if (!tline || tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL, "`%%arg' missing size type parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ /* Allow macro expansion of type parameter */
+ tt = tokenize(tline->text);
+ tt = expand_smacro(tt);
+ size = parse_size(tt->text);
+ if (!size) {
+ nasm_error(ERR_NONFATAL,
+ "Invalid size type for `%%arg' missing directive");
+ free_tlist(tt);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ free_tlist(tt);
+
+ /* Round up to even stack slots */
+ size = ALIGN(size, StackSize);
+
+ /* Now define the macro for the argument */
+ snprintf(directive, sizeof(directive), "%%define %s (%s+%d)",
+ arg, StackPointer, offset);
+ do_directive(tokenize(directive), output);
+ offset += size;
+
+ /* Move to the next argument in the list */
+ tline = tline->next;
+ if (tline && tline->type == TOK_WHITESPACE)
+ tline = tline->next;
+ } while (tline && tline->type == TOK_OTHER && tline->text[0] == ',');
+ ArgOffset = offset;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_LOCAL:
+ /* TASM like LOCAL directive to define local variables for a
+ * function, in the following form:
+ *
+ * LOCAL local1:WORD, local2:DWORD, local4:QWORD = LocalSize
+ *
+ * The '= LocalSize' at the end is ignored by NASM, but is
+ * required by TASM to define the local parameter size (and used
+ * by the TASM macro package).
+ */
+ offset = LocalOffset;
+ do {
+ char *local, directive[256];
+ int size = StackSize;
+
+ /* Find the argument name */
+ tline = tline->next;
+ if (tline && tline->type == TOK_WHITESPACE)
+ tline = tline->next;
+ if (!tline || tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL,
+ "`%%local' missing argument parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ local = tline->text;
+
+ /* Find the argument size type */
+ tline = tline->next;
+ if (!tline || tline->type != TOK_OTHER
+ || tline->text[0] != ':') {
+ nasm_error(ERR_NONFATAL,
+ "Syntax error processing `%%local' directive");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ tline = tline->next;
+ if (!tline || tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL,
+ "`%%local' missing size type parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ /* Allow macro expansion of type parameter */
+ tt = tokenize(tline->text);
+ tt = expand_smacro(tt);
+ size = parse_size(tt->text);
+ if (!size) {
+ nasm_error(ERR_NONFATAL,
+ "Invalid size type for `%%local' missing directive");
+ free_tlist(tt);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ free_tlist(tt);
+
+ /* Round up to even stack slots */
+ size = ALIGN(size, StackSize);
+
+ offset += size; /* Negative offset, increment before */
+
+ /* Now define the macro for the argument */
+ snprintf(directive, sizeof(directive), "%%define %s (%s-%d)",
+ local, StackPointer, offset);
+ do_directive(tokenize(directive), output);
+
+ /* Now define the assign to setup the enter_c macro correctly */
+ snprintf(directive, sizeof(directive),
+ "%%assign %%$localsize %%$localsize+%d", size);
+ do_directive(tokenize(directive), output);
+
+ /* Move to the next argument in the list */
+ tline = tline->next;
+ if (tline && tline->type == TOK_WHITESPACE)
+ tline = tline->next;
+ } while (tline && tline->type == TOK_OTHER && tline->text[0] == ',');
+ LocalOffset = offset;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_CLEAR:
+ if (tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%%clear' ignored");
+ free_macros();
+ init_macros();
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_DEPEND:
+ t = tline->next = expand_smacro(tline->next);
+ skip_white_(t);
+ if (!t || (t->type != TOK_STRING &&
+ t->type != TOK_INTERNAL_STRING)) {
+ nasm_error(ERR_NONFATAL, "`%%depend' expects a file name");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND; /* but we did _something_ */
+ }
+ if (t->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%%depend' ignored");
+ p = t->text;
+ if (t->type != TOK_INTERNAL_STRING)
+ nasm_unquote_cstr(p, i);
+ strlist_add_string(deplist, p);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_INCLUDE:
+ t = tline->next = expand_smacro(tline->next);
+ skip_white_(t);
+
+ if (!t || (t->type != TOK_STRING &&
+ t->type != TOK_INTERNAL_STRING)) {
+ nasm_error(ERR_NONFATAL, "`%%include' expects a file name");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND; /* but we did _something_ */
+ }
+ if (t->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%%include' ignored");
+ p = t->text;
+ if (t->type != TOK_INTERNAL_STRING)
+ nasm_unquote_cstr(p, i);
+ inc = nasm_malloc(sizeof(Include));
+ inc->next = istk;
+ inc->conds = NULL;
+ found_path = NULL;
+ inc->fp = inc_fopen(p, deplist, &found_path,
+ pass == 0 ? INC_OPTIONAL : INC_NEEDED, NF_TEXT);
+ if (!inc->fp) {
+ /* -MG given but file not found */
+ nasm_free(inc);
+ } else {
+ inc->fname = src_set_fname(found_path ? found_path : p);
+ inc->lineno = src_set_linnum(0);
+ inc->lineinc = 1;
+ inc->expansion = NULL;
+ inc->mstk = NULL;
+ istk = inc;
+ lfmt->uplevel(LIST_INCLUDE);
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_USE:
+ {
+ static macros_t *use_pkg;
+ const char *pkg_macro = NULL;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+
+ if (!tline || (tline->type != TOK_STRING &&
+ tline->type != TOK_INTERNAL_STRING &&
+ tline->type != TOK_ID)) {
+ nasm_error(ERR_NONFATAL, "`%%use' expects a package name");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND; /* but we did _something_ */
+ }
+ if (tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%%use' ignored");
+ if (tline->type == TOK_STRING)
+ nasm_unquote_cstr(tline->text, i);
+ use_pkg = nasm_stdmac_find_package(tline->text);
+ if (!use_pkg)
+ nasm_error(ERR_NONFATAL, "unknown `%%use' package: %s", tline->text);
+ else
+ pkg_macro = (char *)use_pkg + 1; /* The first string will be <%define>__USE_*__ */
+ if (use_pkg && ! smacro_defined(NULL, pkg_macro, 0, NULL, true)) {
+ /* Not already included, go ahead and include it */
+ stdmacpos = use_pkg;
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ case PP_PUSH:
+ case PP_REPL:
+ case PP_POP:
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (tline) {
+ if (!tok_type_(tline, TOK_ID)) {
+ nasm_error(ERR_NONFATAL, "`%s' expects a context identifier",
+ pp_directives[i]);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND; /* but we did _something_ */
+ }
+ if (tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%s' ignored",
+ pp_directives[i]);
+ p = nasm_strdup(tline->text);
+ } else {
+ p = NULL; /* Anonymous */
+ }
+
+ if (i == PP_PUSH) {
+ ctx = nasm_malloc(sizeof(Context));
+ ctx->next = cstk;
+ hash_init(&ctx->localmac, HASH_SMALL);
+ ctx->name = p;
+ ctx->number = unique++;
+ cstk = ctx;
+ } else {
+ /* %pop or %repl */
+ if (!cstk) {
+ nasm_error(ERR_NONFATAL, "`%s': context stack is empty",
+ pp_directives[i]);
+ } else if (i == PP_POP) {
+ if (p && (!cstk->name || nasm_stricmp(p, cstk->name)))
+ nasm_error(ERR_NONFATAL, "`%%pop' in wrong context: %s, "
+ "expected %s",
+ cstk->name ? cstk->name : "anonymous", p);
+ else
+ ctx_pop();
+ } else {
+ /* i == PP_REPL */
+ nasm_free(cstk->name);
+ cstk->name = p;
+ p = NULL;
+ }
+ nasm_free(p);
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ case PP_FATAL:
+ severity = ERR_FATAL;
+ goto issue_error;
+ case PP_ERROR:
+ severity = ERR_NONFATAL;
+ goto issue_error;
+ case PP_WARNING:
+ severity = ERR_WARNING|ERR_WARN_USER;
+ goto issue_error;
+
+issue_error:
+ {
+ /* Only error out if this is the final pass */
+ if (pass != 2 && i != PP_FATAL)
+ return DIRECTIVE_FOUND;
+
+ tline->next = expand_smacro(tline->next);
+ tline = tline->next;
+ skip_white_(tline);
+ t = tline ? tline->next : NULL;
+ skip_white_(t);
+ if (tok_type_(tline, TOK_STRING) && !t) {
+ /* The line contains only a quoted string */
+ p = tline->text;
+ nasm_unquote(p, NULL); /* Ignore NUL character truncation */
+ nasm_error(severity, "%s", p);
+ } else {
+ /* Not a quoted string, or more than a quoted string */
+ p = detoken(tline, false);
+ nasm_error(severity, "%s", p);
+ nasm_free(p);
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ CASE_PP_IF:
+ if (istk->conds && !emitting(istk->conds->state))
+ j = COND_NEVER;
+ else {
+ j = if_condition(tline->next, i);
+ tline->next = NULL; /* it got freed */
+ j = j < 0 ? COND_NEVER : j ? COND_IF_TRUE : COND_IF_FALSE;
+ }
+ cond = nasm_malloc(sizeof(Cond));
+ cond->next = istk->conds;
+ cond->state = j;
+ istk->conds = cond;
+ if(istk->mstk)
+ istk->mstk->condcnt ++;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ CASE_PP_ELIF:
+ if (!istk->conds)
+ nasm_error(ERR_FATAL, "`%s': no matching `%%if'", pp_directives[i]);
+ switch(istk->conds->state) {
+ case COND_IF_TRUE:
+ istk->conds->state = COND_DONE;
+ break;
+
+ case COND_DONE:
+ case COND_NEVER:
+ break;
+
+ case COND_ELSE_TRUE:
+ case COND_ELSE_FALSE:
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_PP_PRECOND,
+ "`%%elif' after `%%else' ignored");
+ istk->conds->state = COND_NEVER;
+ break;
+
+ case COND_IF_FALSE:
+ /*
+ * IMPORTANT: In the case of %if, we will already have
+ * called expand_mmac_params(); however, if we're
+ * processing an %elif we must have been in a
+ * non-emitting mode, which would have inhibited
+ * the normal invocation of expand_mmac_params().
+ * Therefore, we have to do it explicitly here.
+ */
+ j = if_condition(expand_mmac_params(tline->next), i);
+ tline->next = NULL; /* it got freed */
+ istk->conds->state =
+ j < 0 ? COND_NEVER : j ? COND_IF_TRUE : COND_IF_FALSE;
+ break;
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_ELSE:
+ if (tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_PP_PRECOND,
+ "trailing garbage after `%%else' ignored");
+ if (!istk->conds)
+ nasm_fatal("`%%else: no matching `%%if'");
+ switch(istk->conds->state) {
+ case COND_IF_TRUE:
+ case COND_DONE:
+ istk->conds->state = COND_ELSE_FALSE;
+ break;
+
+ case COND_NEVER:
+ break;
+
+ case COND_IF_FALSE:
+ istk->conds->state = COND_ELSE_TRUE;
+ break;
+
+ case COND_ELSE_TRUE:
+ case COND_ELSE_FALSE:
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_PP_PRECOND,
+ "`%%else' after `%%else' ignored.");
+ istk->conds->state = COND_NEVER;
+ break;
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_ENDIF:
+ if (tline->next)
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_PP_PRECOND,
+ "trailing garbage after `%%endif' ignored");
+ if (!istk->conds)
+ nasm_error(ERR_FATAL, "`%%endif': no matching `%%if'");
+ cond = istk->conds;
+ istk->conds = cond->next;
+ nasm_free(cond);
+ if(istk->mstk)
+ istk->mstk->condcnt --;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_RMACRO:
+ case PP_IRMACRO:
+ case PP_MACRO:
+ case PP_IMACRO:
+ if (defining) {
+ nasm_error(ERR_FATAL, "`%s': already defining a macro",
+ pp_directives[i]);
+ return DIRECTIVE_FOUND;
+ }
+ defining = nasm_zalloc(sizeof(MMacro));
+ defining->max_depth = ((i == PP_RMACRO) || (i == PP_IRMACRO))
+ ? nasm_limit[LIMIT_MACROS] : 0;
+ defining->casesense = (i == PP_MACRO) || (i == PP_RMACRO);
+ if (!parse_mmacro_spec(tline, defining, pp_directives[i])) {
+ nasm_free(defining);
+ defining = NULL;
+ return DIRECTIVE_FOUND;
+ }
+
+ src_get(&defining->xline, &defining->fname);
+
+ mmac = (MMacro *) hash_findix(&mmacros, defining->name);
+ while (mmac) {
+ if (!strcmp(mmac->name, defining->name) &&
+ (mmac->nparam_min <= defining->nparam_max
+ || defining->plus)
+ && (defining->nparam_min <= mmac->nparam_max
+ || mmac->plus)) {
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "redefining multi-line macro `%s'", defining->name);
+ return DIRECTIVE_FOUND;
+ }
+ mmac = mmac->next;
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_ENDM:
+ case PP_ENDMACRO:
+ if (! (defining && defining->name)) {
+ nasm_error(ERR_NONFATAL, "`%s': not defining a macro", tline->text);
+ return DIRECTIVE_FOUND;
+ }
+ mmhead = (MMacro **) hash_findi_add(&mmacros, defining->name);
+ defining->next = *mmhead;
+ *mmhead = defining;
+ defining = NULL;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_EXITMACRO:
+ /*
+ * We must search along istk->expansion until we hit a
+ * macro-end marker for a macro with a name. Then we
+ * bypass all lines between exitmacro and endmacro.
+ */
+ list_for_each(l, istk->expansion)
+ if (l->finishes && l->finishes->name)
+ break;
+
+ if (l) {
+ /*
+ * Remove all conditional entries relative to this
+ * macro invocation. (safe to do in this context)
+ */
+ for ( ; l->finishes->condcnt > 0; l->finishes->condcnt --) {
+ cond = istk->conds;
+ istk->conds = cond->next;
+ nasm_free(cond);
+ }
+ istk->expansion = l;
+ } else {
+ nasm_error(ERR_NONFATAL, "`%%exitmacro' not within `%%macro' block");
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_UNMACRO:
+ case PP_UNIMACRO:
+ {
+ MMacro **mmac_p;
+ MMacro spec;
+
+ spec.casesense = (i == PP_UNMACRO);
+ if (!parse_mmacro_spec(tline, &spec, pp_directives[i])) {
+ return DIRECTIVE_FOUND;
+ }
+ mmac_p = (MMacro **) hash_findi(&mmacros, spec.name, NULL);
+ while (mmac_p && *mmac_p) {
+ mmac = *mmac_p;
+ if (mmac->casesense == spec.casesense &&
+ !mstrcmp(mmac->name, spec.name, spec.casesense) &&
+ mmac->nparam_min == spec.nparam_min &&
+ mmac->nparam_max == spec.nparam_max &&
+ mmac->plus == spec.plus) {
+ *mmac_p = mmac->next;
+ free_mmacro(mmac);
+ } else {
+ mmac_p = &mmac->next;
+ }
+ }
+ free_tlist(origline);
+ free_tlist(spec.dlist);
+ return DIRECTIVE_FOUND;
+ }
+
+ case PP_ROTATE:
+ if (tline->next && tline->next->type == TOK_WHITESPACE)
+ tline = tline->next;
+ if (!tline->next) {
+ free_tlist(origline);
+ nasm_error(ERR_NONFATAL, "`%%rotate' missing rotate count");
+ return DIRECTIVE_FOUND;
+ }
+ t = expand_smacro(tline->next);
+ tline->next = NULL;
+ free_tlist(origline);
+ tline = t;
+ tptr = &t;
+ tokval.t_type = TOKEN_INVALID;
+ evalresult =
+ evaluate(ppscan, tptr, &tokval, NULL, pass, NULL);
+ free_tlist(tline);
+ if (!evalresult)
+ return DIRECTIVE_FOUND;
+ if (tokval.t_type)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after expression ignored");
+ if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL, "non-constant value given to `%%rotate'");
+ return DIRECTIVE_FOUND;
+ }
+ mmac = istk->mstk;
+ while (mmac && !mmac->name) /* avoid mistaking %reps for macros */
+ mmac = mmac->next_active;
+ if (!mmac) {
+ nasm_error(ERR_NONFATAL, "`%%rotate' invoked outside a macro call");
+ } else if (mmac->nparam == 0) {
+ nasm_error(ERR_NONFATAL,
+ "`%%rotate' invoked within macro without parameters");
+ } else {
+ int rotate = mmac->rotate + reloc_value(evalresult);
+
+ rotate %= (int)mmac->nparam;
+ if (rotate < 0)
+ rotate += mmac->nparam;
+
+ mmac->rotate = rotate;
+ }
+ return DIRECTIVE_FOUND;
+
+ case PP_REP:
+ nolist = false;
+ do {
+ tline = tline->next;
+ } while (tok_type_(tline, TOK_WHITESPACE));
+
+ if (tok_type_(tline, TOK_ID) &&
+ nasm_stricmp(tline->text, ".nolist") == 0) {
+ nolist = true;
+ do {
+ tline = tline->next;
+ } while (tok_type_(tline, TOK_WHITESPACE));
+ }
+
+ if (tline) {
+ t = expand_smacro(tline);
+ tptr = &t;
+ tokval.t_type = TOKEN_INVALID;
+ evalresult =
+ evaluate(ppscan, tptr, &tokval, NULL, pass, NULL);
+ if (!evalresult) {
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ if (tokval.t_type)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after expression ignored");
+ if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL, "non-constant value given to `%%rep'");
+ return DIRECTIVE_FOUND;
+ }
+ count = reloc_value(evalresult);
+ if (count > nasm_limit[LIMIT_REP]) {
+ nasm_error(ERR_NONFATAL,
+ "`%%rep' count %"PRId64" exceeds limit (currently %"PRId64")",
+ count, nasm_limit[LIMIT_REP]);
+ count = 0;
+ } else if (count < 0) {
+ nasm_error(ERR_WARNING|ERR_PASS2|ERR_WARN_NEG_REP,
+ "negative `%%rep' count: %"PRId64, count);
+ count = 0;
+ } else {
+ count++;
+ }
+ } else {
+ nasm_error(ERR_NONFATAL, "`%%rep' expects a repeat count");
+ count = 0;
+ }
+ free_tlist(origline);
+
+ tmp_defining = defining;
+ defining = nasm_malloc(sizeof(MMacro));
+ defining->prev = NULL;
+ defining->name = NULL; /* flags this macro as a %rep block */
+ defining->casesense = false;
+ defining->plus = false;
+ defining->nolist = nolist;
+ defining->in_progress = count;
+ defining->max_depth = 0;
+ defining->nparam_min = defining->nparam_max = 0;
+ defining->defaults = NULL;
+ defining->dlist = NULL;
+ defining->expansion = NULL;
+ defining->next_active = istk->mstk;
+ defining->rep_nest = tmp_defining;
+ return DIRECTIVE_FOUND;
+
+ case PP_ENDREP:
+ if (!defining || defining->name) {
+ nasm_error(ERR_NONFATAL, "`%%endrep': no matching `%%rep'");
+ return DIRECTIVE_FOUND;
+ }
+
+ /*
+ * Now we have a "macro" defined - although it has no name
+ * and we won't be entering it in the hash tables - we must
+ * push a macro-end marker for it on to istk->expansion.
+ * After that, it will take care of propagating itself (a
+ * macro-end marker line for a macro which is really a %rep
+ * block will cause the macro to be re-expanded, complete
+ * with another macro-end marker to ensure the process
+ * continues) until the whole expansion is forcibly removed
+ * from istk->expansion by a %exitrep.
+ */
+ l = nasm_malloc(sizeof(Line));
+ l->next = istk->expansion;
+ l->finishes = defining;
+ l->first = NULL;
+ istk->expansion = l;
+
+ istk->mstk = defining;
+
+ lfmt->uplevel(defining->nolist ? LIST_MACRO_NOLIST : LIST_MACRO);
+ tmp_defining = defining;
+ defining = defining->rep_nest;
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_EXITREP:
+ /*
+ * We must search along istk->expansion until we hit a
+ * macro-end marker for a macro with no name. Then we set
+ * its `in_progress' flag to 0.
+ */
+ list_for_each(l, istk->expansion)
+ if (l->finishes && !l->finishes->name)
+ break;
+
+ if (l)
+ l->finishes->in_progress = 1;
+ else
+ nasm_error(ERR_NONFATAL, "`%%exitrep' not within `%%rep' block");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_XDEFINE:
+ case PP_IXDEFINE:
+ case PP_DEFINE:
+ case PP_IDEFINE:
+ casesense = (i == PP_DEFINE || i == PP_XDEFINE);
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL, "`%s' expects a macro identifier",
+ pp_directives[i]);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ param_start = tline = tline->next;
+ nparam = 0;
+
+ /* Expand the macro definition now for %xdefine and %ixdefine */
+ if ((i == PP_XDEFINE) || (i == PP_IXDEFINE))
+ tline = expand_smacro(tline);
+
+ if (tok_is_(tline, "(")) {
+ /*
+ * This macro has parameters.
+ */
+
+ tline = tline->next;
+ while (1) {
+ skip_white_(tline);
+ if (!tline) {
+ nasm_error(ERR_NONFATAL, "parameter identifier expected");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ if (tline->type != TOK_ID) {
+ nasm_error(ERR_NONFATAL,
+ "`%s': parameter identifier expected",
+ tline->text);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ tline->type = TOK_SMAC_PARAM + nparam++;
+ tline = tline->next;
+ skip_white_(tline);
+ if (tok_is_(tline, ",")) {
+ tline = tline->next;
+ } else {
+ if (!tok_is_(tline, ")")) {
+ nasm_error(ERR_NONFATAL,
+ "`)' expected to terminate macro template");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ break;
+ }
+ }
+ last = tline;
+ tline = tline->next;
+ }
+ if (tok_type_(tline, TOK_WHITESPACE))
+ last = tline, tline = tline->next;
+ macro_start = NULL;
+ last->next = NULL;
+ t = tline;
+ while (t) {
+ if (t->type == TOK_ID) {
+ list_for_each(tt, param_start)
+ if (tt->type >= TOK_SMAC_PARAM &&
+ !strcmp(tt->text, t->text))
+ t->type = tt->type;
+ }
+ tt = t->next;
+ t->next = macro_start;
+ macro_start = t;
+ t = tt;
+ }
+ /*
+ * Good. We now have a macro name, a parameter count, and a
+ * token list (in reverse order) for an expansion. We ought
+ * to be OK just to create an SMacro, store it, and let
+ * free_tlist have the rest of the line (which we have
+ * carefully re-terminated after chopping off the expansion
+ * from the end).
+ */
+ define_smacro(ctx, mname, casesense, nparam, macro_start);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_UNDEF:
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL, "`%%undef' expects a macro identifier");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ if (tline->next) {
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after macro name ignored");
+ }
+
+ /* Find the context that symbol belongs to */
+ ctx = get_ctx(tline->text, &mname);
+ undef_smacro(ctx, mname);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_DEFSTR:
+ case PP_IDEFSTR:
+ casesense = (i == PP_DEFSTR);
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL, "`%s' expects a macro identifier",
+ pp_directives[i]);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ while (tok_type_(tline, TOK_WHITESPACE))
+ tline = delete_Token(tline);
+
+ p = detoken(tline, false);
+ macro_start = nasm_malloc(sizeof(*macro_start));
+ macro_start->next = NULL;
+ macro_start->text = nasm_quote(p, strlen(p));
+ macro_start->type = TOK_STRING;
+ macro_start->a.mac = NULL;
+ nasm_free(p);
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a string token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_DEFTOK:
+ case PP_IDEFTOK:
+ casesense = (i == PP_DEFTOK);
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%s' expects a macro identifier as first parameter",
+ pp_directives[i]);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ t = tline;
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+ /* t should now point to the string */
+ if (!tok_type_(t, TOK_STRING)) {
+ nasm_error(ERR_NONFATAL,
+ "`%s` requires string as second parameter",
+ pp_directives[i]);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ /*
+ * Convert the string to a token stream. Note that smacros
+ * are stored with the token stream reversed, so we have to
+ * reverse the output of tokenize().
+ */
+ nasm_unquote_cstr(t->text, i);
+ macro_start = reverse_tokens(tokenize(t->text));
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a numeric token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_PATHSEARCH:
+ {
+ const char *found_path;
+
+ casesense = true;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%%pathsearch' expects a macro identifier as first parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ t = tline;
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+
+ if (!t || (t->type != TOK_STRING &&
+ t->type != TOK_INTERNAL_STRING)) {
+ nasm_error(ERR_NONFATAL, "`%%pathsearch' expects a file name");
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND; /* but we did _something_ */
+ }
+ if (t->next)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after `%%pathsearch' ignored");
+ p = t->text;
+ if (t->type != TOK_INTERNAL_STRING)
+ nasm_unquote(p, NULL);
+
+ inc_fopen(p, NULL, &found_path, INC_PROBE, NF_BINARY);
+ if (!found_path)
+ found_path = p;
+ macro_start = nasm_malloc(sizeof(*macro_start));
+ macro_start->next = NULL;
+ macro_start->text = nasm_quote(found_path, strlen(found_path));
+ macro_start->type = TOK_STRING;
+ macro_start->a.mac = NULL;
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a string token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ case PP_STRLEN:
+ casesense = true;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%%strlen' expects a macro identifier as first parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ t = tline;
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+ /* t should now point to the string */
+ if (!tok_type_(t, TOK_STRING)) {
+ nasm_error(ERR_NONFATAL,
+ "`%%strlen` requires string as second parameter");
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ macro_start = nasm_malloc(sizeof(*macro_start));
+ macro_start->next = NULL;
+ make_tok_num(macro_start, nasm_unquote(t->text, NULL));
+ macro_start->a.mac = NULL;
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a numeric token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_STRCAT:
+ casesense = true;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%%strcat' expects a macro identifier as first parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ len = 0;
+ list_for_each(t, tline) {
+ switch (t->type) {
+ case TOK_WHITESPACE:
+ break;
+ case TOK_STRING:
+ len += t->a.len = nasm_unquote(t->text, NULL);
+ break;
+ case TOK_OTHER:
+ if (!strcmp(t->text, ",")) /* permit comma separators */
+ break;
+ /* else fall through */
+ default:
+ nasm_error(ERR_NONFATAL,
+ "non-string passed to `%%strcat' (%d)", t->type);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ }
+
+ p = pp = nasm_malloc(len);
+ list_for_each(t, tline) {
+ if (t->type == TOK_STRING) {
+ memcpy(p, t->text, t->a.len);
+ p += t->a.len;
+ }
+ }
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a numeric token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ macro_start = new_Token(NULL, TOK_STRING, NULL, 0);
+ macro_start->text = nasm_quote(pp, len);
+ nasm_free(pp);
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_SUBSTR:
+ {
+ int64_t start, count;
+ size_t len;
+
+ casesense = true;
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%%substr' expects a macro identifier as first parameter");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ if (tline) /* skip expanded id */
+ t = tline->next;
+ while (tok_type_(t, TOK_WHITESPACE))
+ t = t->next;
+
+ /* t should now point to the string */
+ if (!tok_type_(t, TOK_STRING)) {
+ nasm_error(ERR_NONFATAL,
+ "`%%substr` requires string as second parameter");
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ tt = t->next;
+ tptr = &tt;
+ tokval.t_type = TOKEN_INVALID;
+ evalresult = evaluate(ppscan, tptr, &tokval, NULL, pass, NULL);
+ if (!evalresult) {
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ } else if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL, "non-constant value given to `%%substr`");
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ start = evalresult->value - 1;
+
+ while (tok_type_(tt, TOK_WHITESPACE))
+ tt = tt->next;
+ if (!tt) {
+ count = 1; /* Backwards compatibility: one character */
+ } else {
+ tokval.t_type = TOKEN_INVALID;
+ evalresult = evaluate(ppscan, tptr, &tokval, NULL, pass, NULL);
+ if (!evalresult) {
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ } else if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL, "non-constant value given to `%%substr`");
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ count = evalresult->value;
+ }
+
+ len = nasm_unquote(t->text, NULL);
+
+ /* make start and count being in range */
+ if (start < 0)
+ start = 0;
+ if (count < 0)
+ count = len + count + 1 - start;
+ if (start + count > (int64_t)len)
+ count = len - start;
+ if (!len || count < 0 || start >=(int64_t)len)
+ start = -1, count = 0; /* empty string */
+
+ macro_start = nasm_malloc(sizeof(*macro_start));
+ macro_start->next = NULL;
+ macro_start->text = nasm_quote((start < 0) ? "" : t->text + start, count);
+ macro_start->type = TOK_STRING;
+ macro_start->a.mac = NULL;
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a numeric token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(tline);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ case PP_ASSIGN:
+ case PP_IASSIGN:
+ casesense = (i == PP_ASSIGN);
+
+ tline = tline->next;
+ skip_white_(tline);
+ tline = expand_id(tline);
+ if (!tline || (tline->type != TOK_ID &&
+ (tline->type != TOK_PREPROC_ID ||
+ tline->text[1] != '$'))) {
+ nasm_error(ERR_NONFATAL,
+ "`%%%sassign' expects a macro identifier",
+ (i == PP_IASSIGN ? "i" : ""));
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ ctx = get_ctx(tline->text, &mname);
+ last = tline;
+ tline = expand_smacro(tline->next);
+ last->next = NULL;
+
+ t = tline;
+ tptr = &t;
+ tokval.t_type = TOKEN_INVALID;
+ evalresult = evaluate(ppscan, tptr, &tokval, NULL, pass, NULL);
+ free_tlist(tline);
+ if (!evalresult) {
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ if (tokval.t_type)
+ nasm_error(ERR_WARNING|ERR_PASS1,
+ "trailing garbage after expression ignored");
+
+ if (!is_simple(evalresult)) {
+ nasm_error(ERR_NONFATAL,
+ "non-constant value given to `%%%sassign'",
+ (i == PP_IASSIGN ? "i" : ""));
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+
+ macro_start = nasm_malloc(sizeof(*macro_start));
+ macro_start->next = NULL;
+ make_tok_num(macro_start, reloc_value(evalresult));
+ macro_start->a.mac = NULL;
+
+ /*
+ * We now have a macro name, an implicit parameter count of
+ * zero, and a numeric token to use as an expansion. Create
+ * and store an SMacro.
+ */
+ define_smacro(ctx, mname, casesense, 0, macro_start);
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ case PP_LINE:
+ /*
+ * Syntax is `%line nnn[+mmm] [filename]'
+ */
+ tline = tline->next;
+ skip_white_(tline);
+ if (!tok_type_(tline, TOK_NUMBER)) {
+ nasm_error(ERR_NONFATAL, "`%%line' expects line number");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ k = readnum(tline->text, &err);
+ m = 1;
+ tline = tline->next;
+ if (tok_is_(tline, "+")) {
+ tline = tline->next;
+ if (!tok_type_(tline, TOK_NUMBER)) {
+ nasm_error(ERR_NONFATAL, "`%%line' expects line increment");
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+ }
+ m = readnum(tline->text, &err);
+ tline = tline->next;
+ }
+ skip_white_(tline);
+ src_set_linnum(k);
+ istk->lineinc = m;
+ if (tline) {
+ char *fname = detoken(tline, false);
+ src_set_fname(fname);
+ nasm_free(fname);
+ }
+ free_tlist(origline);
+ return DIRECTIVE_FOUND;
+
+ default:
+ nasm_error(ERR_FATAL,
+ "preprocessor directive `%s' not yet implemented",
+ pp_directives[i]);
+ return DIRECTIVE_FOUND;
+ }
+}
+
+/*
+ * Ensure that a macro parameter contains a condition code and
+ * nothing else. Return the condition code index if so, or -1
+ * otherwise.
+ */
+static int find_cc(Token * t)
+{
+ Token *tt;
+
+ if (!t)
+ return -1; /* Probably a %+ without a space */
+
+ skip_white_(t);
+ if (!t)
+ return -1;
+ if (t->type != TOK_ID)
+ return -1;
+ tt = t->next;
+ skip_white_(tt);
+ if (tt && (tt->type != TOK_OTHER || strcmp(tt->text, ",")))
+ return -1;
+
+ return bsii(t->text, (const char **)conditions, ARRAY_SIZE(conditions));
+}
+
+/*
+ * This routines walks over tokens strem and hadnles tokens
+ * pasting, if @handle_explicit passed then explicit pasting
+ * term is handled, otherwise -- implicit pastings only.
+ */
+static bool paste_tokens(Token **head, const struct tokseq_match *m,
+ size_t mnum, bool handle_explicit)
+{
+ Token *tok, *next, **prev_next, **prev_nonspace;
+ bool pasted = false;
+ char *buf, *p;
+ size_t len, i;
+
+ /*
+ * The last token before pasting. We need it
+ * to be able to connect new handled tokens.
+ * In other words if there were a tokens stream
+ *
+ * A -> B -> C -> D
+ *
+ * and we've joined tokens B and C, the resulting
+ * stream should be
+ *
+ * A -> BC -> D
+ */
+ tok = *head;
+ prev_next = NULL;
+
+ if (!tok_type_(tok, TOK_WHITESPACE) && !tok_type_(tok, TOK_PASTE))
+ prev_nonspace = head;
+ else
+ prev_nonspace = NULL;
+
+ while (tok && (next = tok->next)) {
+
+ switch (tok->type) {
+ case TOK_WHITESPACE:
+ /* Zap redundant whitespaces */
+ while (tok_type_(next, TOK_WHITESPACE))
+ next = delete_Token(next);
+ tok->next = next;
+ break;
+
+ case TOK_PASTE:
+ /* Explicit pasting */
+ if (!handle_explicit)
+ break;
+ next = delete_Token(tok);
+
+ while (tok_type_(next, TOK_WHITESPACE))
+ next = delete_Token(next);
+
+ if (!pasted)
+ pasted = true;
+
+ /* Left pasting token is start of line */
+ if (!prev_nonspace)
+ nasm_error(ERR_FATAL, "No lvalue found on pasting");
+
+ /*
+ * No ending token, this might happen in two
+ * cases
+ *
+ * 1) There indeed no right token at all
+ * 2) There is a bare "%define ID" statement,
+ * and @ID does expand to whitespace.
+ *
+ * So technically we need to do a grammar analysis
+ * in another stage of parsing, but for now lets don't
+ * change the behaviour people used to. Simply allow
+ * whitespace after paste token.
+ */
+ if (!next) {
+ /*
+ * Zap ending space tokens and that's all.
+ */
+ tok = (*prev_nonspace)->next;
+ while (tok_type_(tok, TOK_WHITESPACE))
+ tok = delete_Token(tok);
+ tok = *prev_nonspace;
+ tok->next = NULL;
+ break;
+ }
+
+ tok = *prev_nonspace;
+ while (tok_type_(tok, TOK_WHITESPACE))
+ tok = delete_Token(tok);
+ len = strlen(tok->text);
+ len += strlen(next->text);
+
+ p = buf = nasm_malloc(len + 1);
+ strcpy(p, tok->text);
+ p = strchr(p, '\0');
+ strcpy(p, next->text);
+
+ delete_Token(tok);
+
+ tok = tokenize(buf);
+ nasm_free(buf);
+
+ *prev_nonspace = tok;
+ while (tok && tok->next)
+ tok = tok->next;
+
+ tok->next = delete_Token(next);
+
+ /* Restart from pasted tokens head */
+ tok = *prev_nonspace;
+ break;
+
+ default:
+ /* implicit pasting */
+ for (i = 0; i < mnum; i++) {
+ if (!(PP_CONCAT_MATCH(tok, m[i].mask_head)))
+ continue;
+
+ len = 0;
+ while (next && PP_CONCAT_MATCH(next, m[i].mask_tail)) {
+ len += strlen(next->text);
+ next = next->next;
+ }
+
+ /* No match or no text to process */
+ if (tok == next || len == 0)
+ break;
+
+ len += strlen(tok->text);
+ p = buf = nasm_malloc(len + 1);
+
+ strcpy(p, tok->text);
+ p = strchr(p, '\0');
+ tok = delete_Token(tok);
+
+ while (tok != next) {
+ if (PP_CONCAT_MATCH(tok, m[i].mask_tail)) {
+ strcpy(p, tok->text);
+ p = strchr(p, '\0');
+ }
+ tok = delete_Token(tok);
+ }
+
+ tok = tokenize(buf);
+ nasm_free(buf);
+
+ if (prev_next)
+ *prev_next = tok;
+ else
+ *head = tok;
+
+ /*
+ * Connect pasted into original stream,
+ * ie A -> new-tokens -> B
+ */
+ while (tok && tok->next)
+ tok = tok->next;
+ tok->next = next;
+
+ if (!pasted)
+ pasted = true;
+
+ /* Restart from pasted tokens head */
+ tok = prev_next ? *prev_next : *head;
+ }
+
+ break;
+ }
+
+ prev_next = &tok->next;
+
+ if (tok->next &&
+ !tok_type_(tok->next, TOK_WHITESPACE) &&
+ !tok_type_(tok->next, TOK_PASTE))
+ prev_nonspace = prev_next;
+
+ tok = tok->next;
+ }
+
+ return pasted;
+}
+
+/*
+ * expands to a list of tokens from %{x:y}
+ */
+static Token *expand_mmac_params_range(MMacro *mac, Token *tline, Token ***last)
+{
+ Token *t = tline, **tt, *tm, *head;
+ char *pos;
+ int fst, lst, j, i;
+
+ pos = strchr(tline->text, ':');
+ nasm_assert(pos);
+
+ lst = atoi(pos + 1);
+ fst = atoi(tline->text + 1);
+
+ /*
+ * only macros params are accounted so
+ * if someone passes %0 -- we reject such
+ * value(s)
+ */
+ if (lst == 0 || fst == 0)
+ goto err;
+
+ /* the values should be sane */
+ if ((fst > (int)mac->nparam || fst < (-(int)mac->nparam)) ||
+ (lst > (int)mac->nparam || lst < (-(int)mac->nparam)))
+ goto err;
+
+ fst = fst < 0 ? fst + (int)mac->nparam + 1: fst;
+ lst = lst < 0 ? lst + (int)mac->nparam + 1: lst;
+
+ /* counted from zero */
+ fst--, lst--;
+
+ /*
+ * It will be at least one token. Note we
+ * need to scan params until separator, otherwise
+ * only first token will be passed.
+ */
+ tm = mac->params[(fst + mac->rotate) % mac->nparam];
+ if (!tm)
+ goto err;
+ head = new_Token(NULL, tm->type, tm->text, 0);
+ tt = &head->next, tm = tm->next;
+ while (tok_isnt_(tm, ",")) {
+ t = new_Token(NULL, tm->type, tm->text, 0);
+ *tt = t, tt = &t->next, tm = tm->next;
+ }
+
+ if (fst < lst) {
+ for (i = fst + 1; i <= lst; i++) {
+ t = new_Token(NULL, TOK_OTHER, ",", 0);
+ *tt = t, tt = &t->next;
+ j = (i + mac->rotate) % mac->nparam;
+ tm = mac->params[j];
+ while (tok_isnt_(tm, ",")) {
+ t = new_Token(NULL, tm->type, tm->text, 0);
+ *tt = t, tt = &t->next, tm = tm->next;
+ }
+ }
+ } else {
+ for (i = fst - 1; i >= lst; i--) {
+ t = new_Token(NULL, TOK_OTHER, ",", 0);
+ *tt = t, tt = &t->next;
+ j = (i + mac->rotate) % mac->nparam;
+ tm = mac->params[j];
+ while (tok_isnt_(tm, ",")) {
+ t = new_Token(NULL, tm->type, tm->text, 0);
+ *tt = t, tt = &t->next, tm = tm->next;
+ }
+ }
+ }
+
+ *last = tt;
+ return head;
+
+err:
+ nasm_error(ERR_NONFATAL, "`%%{%s}': macro parameters out of range",
+ &tline->text[1]);
+ return tline;
+}
+
+/*
+ * Expand MMacro-local things: parameter references (%0, %n, %+n,
+ * %-n) and MMacro-local identifiers (%%foo) as well as
+ * macro indirection (%[...]) and range (%{..:..}).
+ */
+static Token *expand_mmac_params(Token * tline)
+{
+ Token *t, *tt, **tail, *thead;
+ bool changed = false;
+ char *pos;
+
+ tail = &thead;
+ thead = NULL;
+
+ while (tline) {
+ if (tline->type == TOK_PREPROC_ID &&
+ (((tline->text[1] == '+' || tline->text[1] == '-') && tline->text[2]) ||
+ (tline->text[1] >= '0' && tline->text[1] <= '9') ||
+ tline->text[1] == '%')) {
+ char *text = NULL;
+ int type = 0, cc; /* type = 0 to placate optimisers */
+ char tmpbuf[30];
+ unsigned int n;
+ int i;
+ MMacro *mac;
+
+ t = tline;
+ tline = tline->next;
+
+ mac = istk->mstk;
+ while (mac && !mac->name) /* avoid mistaking %reps for macros */
+ mac = mac->next_active;
+ if (!mac) {
+ nasm_error(ERR_NONFATAL, "`%s': not in a macro call", t->text);
+ } else {
+ pos = strchr(t->text, ':');
+ if (!pos) {
+ switch (t->text[1]) {
+ /*
+ * We have to make a substitution of one of the
+ * forms %1, %-1, %+1, %%foo, %0.
+ */
+ case '0':
+ type = TOK_NUMBER;
+ snprintf(tmpbuf, sizeof(tmpbuf), "%d", mac->nparam);
+ text = nasm_strdup(tmpbuf);
+ break;
+ case '%':
+ type = TOK_ID;
+ snprintf(tmpbuf, sizeof(tmpbuf), "..@%"PRIu64".",
+ mac->unique);
+ text = nasm_strcat(tmpbuf, t->text + 2);
+ break;
+ case '-':
+ n = atoi(t->text + 2) - 1;
+ if (n >= mac->nparam)
+ tt = NULL;
+ else {
+ if (mac->nparam > 1)
+ n = (n + mac->rotate) % mac->nparam;
+ tt = mac->params[n];
+ }
+ cc = find_cc(tt);
+ if (cc == -1) {
+ nasm_error(ERR_NONFATAL,
+ "macro parameter %d is not a condition code",
+ n + 1);
+ text = NULL;
+ } else {
+ type = TOK_ID;
+ if (inverse_ccs[cc] == -1) {
+ nasm_error(ERR_NONFATAL,
+ "condition code `%s' is not invertible",
+ conditions[cc]);
+ text = NULL;
+ } else
+ text = nasm_strdup(conditions[inverse_ccs[cc]]);
+ }
+ break;
+ case '+':
+ n = atoi(t->text + 2) - 1;
+ if (n >= mac->nparam)
+ tt = NULL;
+ else {
+ if (mac->nparam > 1)
+ n = (n + mac->rotate) % mac->nparam;
+ tt = mac->params[n];
+ }
+ cc = find_cc(tt);
+ if (cc == -1) {
+ nasm_error(ERR_NONFATAL,
+ "macro parameter %d is not a condition code",
+ n + 1);
+ text = NULL;
+ } else {
+ type = TOK_ID;
+ text = nasm_strdup(conditions[cc]);
+ }
+ break;
+ default:
+ n = atoi(t->text + 1) - 1;
+ if (n >= mac->nparam)
+ tt = NULL;
+ else {
+ if (mac->nparam > 1)
+ n = (n + mac->rotate) % mac->nparam;
+ tt = mac->params[n];
+ }
+ if (tt) {
+ for (i = 0; i < mac->paramlen[n]; i++) {
+ *tail = new_Token(NULL, tt->type, tt->text, 0);
+ tail = &(*tail)->next;
+ tt = tt->next;
+ }
+ }
+ text = NULL; /* we've done it here */
+ break;
+ }
+ } else {
+ /*
+ * seems we have a parameters range here
+ */
+ Token *head, **last;
+ head = expand_mmac_params_range(mac, t, &last);
+ if (head != t) {
+ *tail = head;
+ *last = tline;
+ tline = head;
+ text = NULL;
+ }
+ }
+ }
+ if (!text) {
+ delete_Token(t);
+ } else {
+ *tail = t;
+ tail = &t->next;
+ t->type = type;
+ nasm_free(t->text);
+ t->text = text;
+ t->a.mac = NULL;
+ }
+ changed = true;
+ continue;
+ } else if (tline->type == TOK_INDIRECT) {
+ t = tline;
+ tline = tline->next;
+ tt = tokenize(t->text);
+ tt = expand_mmac_params(tt);
+ tt = expand_smacro(tt);
+ *tail = tt;
+ while (tt) {
+ tt->a.mac = NULL; /* Necessary? */
+ tail = &tt->next;
+ tt = tt->next;
+ }
+ delete_Token(t);
+ changed = true;
+ } else {
+ t = *tail = tline;
+ tline = tline->next;
+ t->a.mac = NULL;
+ tail = &t->next;
+ }
+ }
+ *tail = NULL;
+
+ if (changed) {
+ const struct tokseq_match t[] = {
+ {
+ PP_CONCAT_MASK(TOK_ID) |
+ PP_CONCAT_MASK(TOK_FLOAT), /* head */
+ PP_CONCAT_MASK(TOK_ID) |
+ PP_CONCAT_MASK(TOK_NUMBER) |
+ PP_CONCAT_MASK(TOK_FLOAT) |
+ PP_CONCAT_MASK(TOK_OTHER) /* tail */
+ },
+ {
+ PP_CONCAT_MASK(TOK_NUMBER), /* head */
+ PP_CONCAT_MASK(TOK_NUMBER) /* tail */
+ }
+ };
+ paste_tokens(&thead, t, ARRAY_SIZE(t), false);
+ }
+
+ return thead;
+}
+
+/*
+ * Expand all single-line macro calls made in the given line.
+ * Return the expanded version of the line. The original is deemed
+ * to be destroyed in the process. (In reality we'll just move
+ * Tokens from input to output a lot of the time, rather than
+ * actually bothering to destroy and replicate.)
+ */
+
+static Token *expand_smacro(Token * tline)
+{
+ Token *t, *tt, *mstart, **tail, *thead;
+ SMacro *head = NULL, *m;
+ Token **params;
+ int *paramsize;
+ unsigned int nparam, sparam;
+ int brackets;
+ Token *org_tline = tline;
+ Context *ctx;
+ const char *mname;
+ int64_t deadman = nasm_limit[LIMIT_MACROS];
+ bool expanded;
+
+ /*
+ * Trick: we should avoid changing the start token pointer since it can
+ * be contained in "next" field of other token. Because of this
+ * we allocate a copy of first token and work with it; at the end of
+ * routine we copy it back
+ */
+ if (org_tline) {
+ tline = new_Token(org_tline->next, org_tline->type,
+ org_tline->text, 0);
+ tline->a.mac = org_tline->a.mac;
+ nasm_free(org_tline->text);
+ org_tline->text = NULL;
+ }
+
+ expanded = true; /* Always expand %+ at least once */
+
+again:
+ thead = NULL;
+ tail = &thead;
+
+ while (tline) { /* main token loop */
+ if (!--deadman) {
+ nasm_error(ERR_NONFATAL, "interminable macro recursion");
+ goto err;
+ }
+
+ if ((mname = tline->text)) {
+ /* if this token is a local macro, look in local context */
+ if (tline->type == TOK_ID) {
+ head = (SMacro *)hash_findix(&smacros, mname);
+ } else if (tline->type == TOK_PREPROC_ID) {
+ ctx = get_ctx(mname, &mname);
+ head = ctx ? (SMacro *)hash_findix(&ctx->localmac, mname) : NULL;
+ } else
+ head = NULL;
+
+ /*
+ * We've hit an identifier. As in is_mmacro below, we first
+ * check whether the identifier is a single-line macro at
+ * all, then think about checking for parameters if
+ * necessary.
+ */
+ list_for_each(m, head)
+ if (!mstrcmp(m->name, mname, m->casesense))
+ break;
+ if (m) {
+ mstart = tline;
+ params = NULL;
+ paramsize = NULL;
+ if (m->nparam == 0) {
+ /*
+ * Simple case: the macro is parameterless. Discard the
+ * one token that the macro call took, and push the
+ * expansion back on the to-do stack.
+ */
+ if (!m->expansion) {
+ if (!strcmp("__FILE__", m->name)) {
+ const char *file = src_get_fname();
+ /* nasm_free(tline->text); here? */
+ tline->text = nasm_quote(file, strlen(file));
+ tline->type = TOK_STRING;
+ continue;
+ }
+ if (!strcmp("__LINE__", m->name)) {
+ nasm_free(tline->text);
+ make_tok_num(tline, src_get_linnum());
+ continue;
+ }
+ if (!strcmp("__BITS__", m->name)) {
+ nasm_free(tline->text);
+ make_tok_num(tline, globalbits);
+ continue;
+ }
+ tline = delete_Token(tline);
+ continue;
+ }
+ } else {
+ /*
+ * Complicated case: at least one macro with this name
+ * exists and takes parameters. We must find the
+ * parameters in the call, count them, find the SMacro
+ * that corresponds to that form of the macro call, and
+ * substitute for the parameters when we expand. What a
+ * pain.
+ */
+ /*tline = tline->next;
+ skip_white_(tline); */
+ do {
+ t = tline->next;
+ while (tok_type_(t, TOK_SMAC_END)) {
+ t->a.mac->in_progress = false;
+ t->text = NULL;
+ t = tline->next = delete_Token(t);
+ }
+ tline = t;
+ } while (tok_type_(tline, TOK_WHITESPACE));
+ if (!tok_is_(tline, "(")) {
+ /*
+ * This macro wasn't called with parameters: ignore
+ * the call. (Behaviour borrowed from gnu cpp.)
+ */
+ tline = mstart;
+ m = NULL;
+ } else {
+ int paren = 0;
+ int white = 0;
+ brackets = 0;
+ nparam = 0;
+ sparam = PARAM_DELTA;
+ params = nasm_malloc(sparam * sizeof(Token *));
+ params[0] = tline->next;
+ paramsize = nasm_malloc(sparam * sizeof(int));
+ paramsize[0] = 0;
+ while (true) { /* parameter loop */
+ /*
+ * For some unusual expansions
+ * which concatenates function call
+ */
+ t = tline->next;
+ while (tok_type_(t, TOK_SMAC_END)) {
+ t->a.mac->in_progress = false;
+ t->text = NULL;
+ t = tline->next = delete_Token(t);
+ }
+ tline = t;
+
+ if (!tline) {
+ nasm_error(ERR_NONFATAL,
+ "macro call expects terminating `)'");
+ break;
+ }
+ if (tline->type == TOK_WHITESPACE
+ && brackets <= 0) {
+ if (paramsize[nparam])
+ white++;
+ else
+ params[nparam] = tline->next;
+ continue; /* parameter loop */
+ }
+ if (tline->type == TOK_OTHER
+ && tline->text[1] == 0) {
+ char ch = tline->text[0];
+ if (ch == ',' && !paren && brackets <= 0) {
+ if (++nparam >= sparam) {
+ sparam += PARAM_DELTA;
+ params = nasm_realloc(params,
+ sparam * sizeof(Token *));
+ paramsize = nasm_realloc(paramsize,
+ sparam * sizeof(int));
+ }
+ params[nparam] = tline->next;
+ paramsize[nparam] = 0;
+ white = 0;
+ continue; /* parameter loop */
+ }
+ if (ch == '{' &&
+ (brackets > 0 || (brackets == 0 &&
+ !paramsize[nparam])))
+ {
+ if (!(brackets++)) {
+ params[nparam] = tline->next;
+ continue; /* parameter loop */
+ }
+ }
+ if (ch == '}' && brackets > 0)
+ if (--brackets == 0) {
+ brackets = -1;
+ continue; /* parameter loop */
+ }
+ if (ch == '(' && !brackets)
+ paren++;
+ if (ch == ')' && brackets <= 0)
+ if (--paren < 0)
+ break;
+ }
+ if (brackets < 0) {
+ brackets = 0;
+ nasm_error(ERR_NONFATAL, "braces do not "
+ "enclose all of macro parameter");
+ }
+ paramsize[nparam] += white + 1;
+ white = 0;
+ } /* parameter loop */
+ nparam++;
+ while (m && (m->nparam != nparam ||
+ mstrcmp(m->name, mname,
+ m->casesense)))
+ m = m->next;
+ if (!m)
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_WARN_MNP,
+ "macro `%s' exists, "
+ "but not taking %d parameters",
+ mstart->text, nparam);
+ }
+ }
+ if (m && m->in_progress)
+ m = NULL;
+ if (!m) { /* in progess or didn't find '(' or wrong nparam */
+ /*
+ * Design question: should we handle !tline, which
+ * indicates missing ')' here, or expand those
+ * macros anyway, which requires the (t) test a few
+ * lines down?
+ */
+ nasm_free(params);
+ nasm_free(paramsize);
+ tline = mstart;
+ } else {
+ /*
+ * Expand the macro: we are placed on the last token of the
+ * call, so that we can easily split the call from the
+ * following tokens. We also start by pushing an SMAC_END
+ * token for the cycle removal.
+ */
+ t = tline;
+ if (t) {
+ tline = t->next;
+ t->next = NULL;
+ }
+ tt = new_Token(tline, TOK_SMAC_END, NULL, 0);
+ tt->a.mac = m;
+ m->in_progress = true;
+ tline = tt;
+ list_for_each(t, m->expansion) {
+ if (t->type >= TOK_SMAC_PARAM) {
+ Token *pcopy = tline, **ptail = &pcopy;
+ Token *ttt, *pt;
+ int i;
+
+ ttt = params[t->type - TOK_SMAC_PARAM];
+ i = paramsize[t->type - TOK_SMAC_PARAM];
+ while (--i >= 0) {
+ pt = *ptail = new_Token(tline, ttt->type,
+ ttt->text, 0);
+ ptail = &pt->next;
+ ttt = ttt->next;
+ if (!ttt && i > 0) {
+ /*
+ * FIXME: Need to handle more gracefully,
+ * exiting early on agruments analysis.
+ */
+ nasm_error(ERR_FATAL,
+ "macro `%s' expects %d args",
+ mstart->text,
+ (int)paramsize[t->type - TOK_SMAC_PARAM]);
+ }
+ }
+ tline = pcopy;
+ } else if (t->type == TOK_PREPROC_Q) {
+ tt = new_Token(tline, TOK_ID, mname, 0);
+ tline = tt;
+ } else if (t->type == TOK_PREPROC_QQ) {
+ tt = new_Token(tline, TOK_ID, m->name, 0);
+ tline = tt;
+ } else {
+ tt = new_Token(tline, t->type, t->text, 0);
+ tline = tt;
+ }
+ }
+
+ /*
+ * Having done that, get rid of the macro call, and clean
+ * up the parameters.
+ */
+ nasm_free(params);
+ nasm_free(paramsize);
+ free_tlist(mstart);
+ expanded = true;
+ continue; /* main token loop */
+ }
+ }
+ }
+
+ if (tline->type == TOK_SMAC_END) {
+ /* On error path it might already be dropped */
+ if (tline->a.mac)
+ tline->a.mac->in_progress = false;
+ tline = delete_Token(tline);
+ } else {
+ t = *tail = tline;
+ tline = tline->next;
+ t->a.mac = NULL;
+ t->next = NULL;
+ tail = &t->next;
+ }
+ }
+
+ /*
+ * Now scan the entire line and look for successive TOK_IDs that resulted
+ * after expansion (they can't be produced by tokenize()). The successive
+ * TOK_IDs should be concatenated.
+ * Also we look for %+ tokens and concatenate the tokens before and after
+ * them (without white spaces in between).
+ */
+ if (expanded) {
+ const struct tokseq_match t[] = {
+ {
+ PP_CONCAT_MASK(TOK_ID) |
+ PP_CONCAT_MASK(TOK_PREPROC_ID), /* head */
+ PP_CONCAT_MASK(TOK_ID) |
+ PP_CONCAT_MASK(TOK_PREPROC_ID) |
+ PP_CONCAT_MASK(TOK_NUMBER) /* tail */
+ }
+ };
+ if (paste_tokens(&thead, t, ARRAY_SIZE(t), true)) {
+ /*
+ * If we concatenated something, *and* we had previously expanded
+ * an actual macro, scan the lines again for macros...
+ */
+ tline = thead;
+ expanded = false;
+ goto again;
+ }
+ }
+
+err:
+ if (org_tline) {
+ if (thead) {
+ *org_tline = *thead;
+ /* since we just gave text to org_line, don't free it */
+ thead->text = NULL;
+ delete_Token(thead);
+ } else {
+ /* the expression expanded to empty line;
+ we can't return NULL for some reasons
+ we just set the line to a single WHITESPACE token. */
+ memset(org_tline, 0, sizeof(*org_tline));
+ org_tline->text = NULL;
+ org_tline->type = TOK_WHITESPACE;
+ }
+ thead = org_tline;
+ }
+
+ return thead;
+}
+
+/*
+ * Similar to expand_smacro but used exclusively with macro identifiers
+ * right before they are fetched in. The reason is that there can be
+ * identifiers consisting of several subparts. We consider that if there
+ * are more than one element forming the name, user wants a expansion,
+ * otherwise it will be left as-is. Example:
+ *
+ * %define %$abc cde
+ *
+ * the identifier %$abc will be left as-is so that the handler for %define
+ * will suck it and define the corresponding value. Other case:
+ *
+ * %define _%$abc cde
+ *
+ * In this case user wants name to be expanded *before* %define starts
+ * working, so we'll expand %$abc into something (if it has a value;
+ * otherwise it will be left as-is) then concatenate all successive
+ * PP_IDs into one.
+ */
+static Token *expand_id(Token * tline)
+{
+ Token *cur, *oldnext = NULL;
+
+ if (!tline || !tline->next)
+ return tline;
+
+ cur = tline;
+ while (cur->next &&
+ (cur->next->type == TOK_ID ||
+ cur->next->type == TOK_PREPROC_ID
+ || cur->next->type == TOK_NUMBER))
+ cur = cur->next;
+
+ /* If identifier consists of just one token, don't expand */
+ if (cur == tline)
+ return tline;
+
+ if (cur) {
+ oldnext = cur->next; /* Detach the tail past identifier */
+ cur->next = NULL; /* so that expand_smacro stops here */
+ }
+
+ tline = expand_smacro(tline);
+
+ if (cur) {
+ /* expand_smacro possibly changhed tline; re-scan for EOL */
+ cur = tline;
+ while (cur && cur->next)
+ cur = cur->next;
+ if (cur)
+ cur->next = oldnext;
+ }
+
+ return tline;
+}
+
+/*
+ * Determine whether the given line constitutes a multi-line macro
+ * call, and return the MMacro structure called if so. Doesn't have
+ * to check for an initial label - that's taken care of in
+ * expand_mmacro - but must check numbers of parameters. Guaranteed
+ * to be called with tline->type == TOK_ID, so the putative macro
+ * name is easy to find.
+ */
+static MMacro *is_mmacro(Token * tline, Token *** params_array)
+{
+ MMacro *head, *m;
+ Token **params;
+ int nparam;
+
+ head = (MMacro *) hash_findix(&mmacros, tline->text);
+
+ /*
+ * Efficiency: first we see if any macro exists with the given
+ * name. If not, we can return NULL immediately. _Then_ we
+ * count the parameters, and then we look further along the
+ * list if necessary to find the proper MMacro.
+ */
+ list_for_each(m, head)
+ if (!mstrcmp(m->name, tline->text, m->casesense))
+ break;
+ if (!m)
+ return NULL;
+
+ /*
+ * OK, we have a potential macro. Count and demarcate the
+ * parameters.
+ */
+ count_mmac_params(tline->next, &nparam, &params);
+
+ /*
+ * So we know how many parameters we've got. Find the MMacro
+ * structure that handles this number.
+ */
+ while (m) {
+ if (m->nparam_min <= nparam
+ && (m->plus || nparam <= m->nparam_max)) {
+ /*
+ * This one is right. Just check if cycle removal
+ * prohibits us using it before we actually celebrate...
+ */
+ if (m->in_progress > m->max_depth) {
+ if (m->max_depth > 0) {
+ nasm_error(ERR_WARNING,
+ "reached maximum recursion depth of %i",
+ m->max_depth);
+ }
+ nasm_free(params);
+ return NULL;
+ }
+ /*
+ * It's right, and we can use it. Add its default
+ * parameters to the end of our list if necessary.
+ */
+ if (m->defaults && nparam < m->nparam_min + m->ndefs) {
+ params =
+ nasm_realloc(params,
+ ((m->nparam_min + m->ndefs +
+ 1) * sizeof(*params)));
+ while (nparam < m->nparam_min + m->ndefs) {
+ params[nparam] = m->defaults[nparam - m->nparam_min];
+ nparam++;
+ }
+ }
+ /*
+ * If we've gone over the maximum parameter count (and
+ * we're in Plus mode), ignore parameters beyond
+ * nparam_max.
+ */
+ if (m->plus && nparam > m->nparam_max)
+ nparam = m->nparam_max;
+ /*
+ * Then terminate the parameter list, and leave.
+ */
+ if (!params) { /* need this special case */
+ params = nasm_malloc(sizeof(*params));
+ nparam = 0;
+ }
+ params[nparam] = NULL;
+ *params_array = params;
+ return m;
+ }
+ /*
+ * This one wasn't right: look for the next one with the
+ * same name.
+ */
+ list_for_each(m, m->next)
+ if (!mstrcmp(m->name, tline->text, m->casesense))
+ break;
+ }
+
+ /*
+ * After all that, we didn't find one with the right number of
+ * parameters. Issue a warning, and fail to expand the macro.
+ */
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_WARN_MNP,
+ "macro `%s' exists, but not taking %d parameters",
+ tline->text, nparam);
+ nasm_free(params);
+ return NULL;
+}
+
+
+/*
+ * Save MMacro invocation specific fields in
+ * preparation for a recursive macro expansion
+ */
+static void push_mmacro(MMacro *m)
+{
+ MMacroInvocation *i;
+
+ i = nasm_malloc(sizeof(MMacroInvocation));
+ i->prev = m->prev;
+ i->params = m->params;
+ i->iline = m->iline;
+ i->nparam = m->nparam;
+ i->rotate = m->rotate;
+ i->paramlen = m->paramlen;
+ i->unique = m->unique;
+ i->condcnt = m->condcnt;
+ m->prev = i;
+}
+
+
+/*
+ * Restore MMacro invocation specific fields that were
+ * saved during a previous recursive macro expansion
+ */
+static void pop_mmacro(MMacro *m)
+{
+ MMacroInvocation *i;
+
+ if (m->prev) {
+ i = m->prev;
+ m->prev = i->prev;
+ m->params = i->params;
+ m->iline = i->iline;
+ m->nparam = i->nparam;
+ m->rotate = i->rotate;
+ m->paramlen = i->paramlen;
+ m->unique = i->unique;
+ m->condcnt = i->condcnt;
+ nasm_free(i);
+ }
+}
+
+
+/*
+ * Expand the multi-line macro call made by the given line, if
+ * there is one to be expanded. If there is, push the expansion on
+ * istk->expansion and return 1. Otherwise return 0.
+ */
+static int expand_mmacro(Token * tline)
+{
+ Token *startline = tline;
+ Token *label = NULL;
+ int dont_prepend = 0;
+ Token **params, *t, *tt;
+ MMacro *m;
+ Line *l, *ll;
+ int i, nparam, *paramlen;
+ const char *mname;
+
+ t = tline;
+ skip_white_(t);
+ /* if (!tok_type_(t, TOK_ID)) Lino 02/25/02 */
+ if (!tok_type_(t, TOK_ID) && !tok_type_(t, TOK_PREPROC_ID))
+ return 0;
+ m = is_mmacro(t, &params);
+ if (m) {
+ mname = t->text;
+ } else {
+ Token *last;
+ /*
+ * We have an id which isn't a macro call. We'll assume
+ * it might be a label; we'll also check to see if a
+ * colon follows it. Then, if there's another id after
+ * that lot, we'll check it again for macro-hood.
+ */
+ label = last = t;
+ t = t->next;
+ if (tok_type_(t, TOK_WHITESPACE))
+ last = t, t = t->next;
+ if (tok_is_(t, ":")) {
+ dont_prepend = 1;
+ last = t, t = t->next;
+ if (tok_type_(t, TOK_WHITESPACE))
+ last = t, t = t->next;
+ }
+ if (!tok_type_(t, TOK_ID) || !(m = is_mmacro(t, &params)))
+ return 0;
+ last->next = NULL;
+ mname = t->text;
+ tline = t;
+ }
+
+ /*
+ * Fix up the parameters: this involves stripping leading and
+ * trailing whitespace, then stripping braces if they are
+ * present.
+ */
+ for (nparam = 0; params[nparam]; nparam++) ;
+ paramlen = nparam ? nasm_malloc(nparam * sizeof(*paramlen)) : NULL;
+
+ for (i = 0; params[i]; i++) {
+ int brace = 0;
+ int comma = (!m->plus || i < nparam - 1);
+
+ t = params[i];
+ skip_white_(t);
+ if (tok_is_(t, "{"))
+ t = t->next, brace++, comma = false;
+ params[i] = t;
+ paramlen[i] = 0;
+ while (t) {
+ if (comma && t->type == TOK_OTHER && !strcmp(t->text, ","))
+ break; /* ... because we have hit a comma */
+ if (comma && t->type == TOK_WHITESPACE
+ && tok_is_(t->next, ","))
+ break; /* ... or a space then a comma */
+ if (brace && t->type == TOK_OTHER) {
+ if (t->text[0] == '{')
+ brace++; /* ... or a nested opening brace */
+ else if (t->text[0] == '}')
+ if (!--brace)
+ break; /* ... or a brace */
+ }
+ t = t->next;
+ paramlen[i]++;
+ }
+ if (brace)
+ nasm_error(ERR_NONFATAL, "macro params should be enclosed in braces");
+ }
+
+ /*
+ * OK, we have a MMacro structure together with a set of
+ * parameters. We must now go through the expansion and push
+ * copies of each Line on to istk->expansion. Substitution of
+ * parameter tokens and macro-local tokens doesn't get done
+ * until the single-line macro substitution process; this is
+ * because delaying them allows us to change the semantics
+ * later through %rotate.
+ *
+ * First, push an end marker on to istk->expansion, mark this
+ * macro as in progress, and set up its invocation-specific
+ * variables.
+ */
+ ll = nasm_malloc(sizeof(Line));
+ ll->next = istk->expansion;
+ ll->finishes = m;
+ ll->first = NULL;
+ istk->expansion = ll;
+
+ /*
+ * Save the previous MMacro expansion in the case of
+ * macro recursion
+ */
+ if (m->max_depth && m->in_progress)
+ push_mmacro(m);
+
+ m->in_progress ++;
+ m->params = params;
+ m->iline = tline;
+ m->nparam = nparam;
+ m->rotate = 0;
+ m->paramlen = paramlen;
+ m->unique = unique++;
+ m->lineno = 0;
+ m->condcnt = 0;
+
+ m->next_active = istk->mstk;
+ istk->mstk = m;
+
+ list_for_each(l, m->expansion) {
+ Token **tail;
+
+ ll = nasm_malloc(sizeof(Line));
+ ll->finishes = NULL;
+ ll->next = istk->expansion;
+ istk->expansion = ll;
+ tail = &ll->first;
+
+ list_for_each(t, l->first) {
+ Token *x = t;
+ switch (t->type) {
+ case TOK_PREPROC_Q:
+ tt = *tail = new_Token(NULL, TOK_ID, mname, 0);
+ break;
+ case TOK_PREPROC_QQ:
+ tt = *tail = new_Token(NULL, TOK_ID, m->name, 0);
+ break;
+ case TOK_PREPROC_ID:
+ if (t->text[1] == '0' && t->text[2] == '0') {
+ dont_prepend = -1;
+ x = label;
+ if (!x)
+ continue;
+ }
+ /* fall through */
+ default:
+ tt = *tail = new_Token(NULL, x->type, x->text, 0);
+ break;
+ }
+ tail = &tt->next;
+ }
+ *tail = NULL;
+ }
+
+ /*
+ * If we had a label, push it on as the first line of
+ * the macro expansion.
+ */
+ if (label) {
+ if (dont_prepend < 0)
+ free_tlist(startline);
+ else {
+ ll = nasm_malloc(sizeof(Line));
+ ll->finishes = NULL;
+ ll->next = istk->expansion;
+ istk->expansion = ll;
+ ll->first = startline;
+ if (!dont_prepend) {
+ while (label->next)
+ label = label->next;
+ label->next = tt = new_Token(NULL, TOK_OTHER, ":", 0);
+ }
+ }
+ }
+
+ lfmt->uplevel(m->nolist ? LIST_MACRO_NOLIST : LIST_MACRO);
+
+ return 1;
+}
+
+/*
+ * This function adds macro names to error messages, and suppresses
+ * them if necessary.
+ */
+static void pp_verror(int severity, const char *fmt, va_list arg)
+{
+ char buff[BUFSIZ];
+ MMacro *mmac = NULL;
+ int delta = 0;
+
+ /*
+ * If we're in a dead branch of IF or something like it, ignore the error.
+ * However, because %else etc are evaluated in the state context
+ * of the previous branch, errors might get lost:
+ * %if 0 ... %else trailing garbage ... %endif
+ * So %else etc should set the ERR_PP_PRECOND flag.
+ */
+ if ((severity & ERR_MASK) < ERR_FATAL &&
+ istk && istk->conds &&
+ ((severity & ERR_PP_PRECOND) ?
+ istk->conds->state == COND_NEVER :
+ !emitting(istk->conds->state)))
+ return;
+
+ /* get %macro name */
+ if (!(severity & ERR_NOFILE) && istk && istk->mstk) {
+ mmac = istk->mstk;
+ /* but %rep blocks should be skipped */
+ while (mmac && !mmac->name)
+ mmac = mmac->next_active, delta++;
+ }
+
+ if (mmac) {
+ vsnprintf(buff, sizeof(buff), fmt, arg);
+
+ nasm_set_verror(real_verror);
+ nasm_error(severity, "(%s:%d) %s",
+ mmac->name, mmac->lineno - delta, buff);
+ nasm_set_verror(pp_verror);
+ } else {
+ real_verror(severity, fmt, arg);
+ }
+}
+
+static void
+pp_reset(const char *file, int apass, StrList *dep_list)
+{
+ Token *t;
+
+ cstk = NULL;
+ istk = nasm_malloc(sizeof(Include));
+ istk->next = NULL;
+ istk->conds = NULL;
+ istk->expansion = NULL;
+ istk->mstk = NULL;
+ istk->fp = nasm_open_read(file, NF_TEXT);
+ istk->fname = NULL;
+ src_set(0, file);
+ istk->lineinc = 1;
+ if (!istk->fp)
+ nasm_fatal_fl(ERR_NOFILE, "unable to open input file `%s'", file);
+ defining = NULL;
+ nested_mac_count = 0;
+ nested_rep_count = 0;
+ init_macros();
+ unique = 0;
+ deplist = dep_list;
+
+ if (tasm_compatible_mode)
+ pp_add_stdmac(nasm_stdmac_tasm);
+
+ pp_add_stdmac(nasm_stdmac_nasm);
+ pp_add_stdmac(nasm_stdmac_version);
+
+ if (extrastdmac)
+ pp_add_stdmac(extrastdmac);
+
+ stdmacpos = stdmacros[0];
+ stdmacnext = &stdmacros[1];
+
+ do_predef = true;
+
+ /*
+ * 0 for dependencies, 1 for preparatory passes, 2 for final pass.
+ * The caller, however, will also pass in 3 for preprocess-only so
+ * we can set __PASS__ accordingly.
+ */
+ pass = apass > 2 ? 2 : apass;
+
+ strlist_add_string(deplist, file);
+
+ /*
+ * Define the __PASS__ macro. This is defined here unlike
+ * all the other builtins, because it is special -- it varies between
+ * passes.
+ */
+ t = nasm_malloc(sizeof(*t));
+ t->next = NULL;
+ make_tok_num(t, apass);
+ t->a.mac = NULL;
+ define_smacro(NULL, "__PASS__", true, 0, t);
+}
+
+static void pp_init(void)
+{
+ hash_init(&FileHash, HASH_MEDIUM);
+ ipath = strlist_allocate();
+}
+
+static char *pp_getline(void)
+{
+ char *line;
+ Token *tline;
+
+ real_verror = nasm_set_verror(pp_verror);
+
+ while (1) {
+ /*
+ * Fetch a tokenized line, either from the macro-expansion
+ * buffer or from the input file.
+ */
+ tline = NULL;
+ while (istk->expansion && istk->expansion->finishes) {
+ Line *l = istk->expansion;
+ if (!l->finishes->name && l->finishes->in_progress > 1) {
+ Line *ll;
+
+ /*
+ * This is a macro-end marker for a macro with no
+ * name, which means it's not really a macro at all
+ * but a %rep block, and the `in_progress' field is
+ * more than 1, meaning that we still need to
+ * repeat. (1 means the natural last repetition; 0
+ * means termination by %exitrep.) We have
+ * therefore expanded up to the %endrep, and must
+ * push the whole block on to the expansion buffer
+ * again. We don't bother to remove the macro-end
+ * marker: we'd only have to generate another one
+ * if we did.
+ */
+ l->finishes->in_progress--;
+ list_for_each(l, l->finishes->expansion) {
+ Token *t, *tt, **tail;
+
+ ll = nasm_malloc(sizeof(Line));
+ ll->next = istk->expansion;
+ ll->finishes = NULL;
+ ll->first = NULL;
+ tail = &ll->first;
+
+ list_for_each(t, l->first) {
+ if (t->text || t->type == TOK_WHITESPACE) {
+ tt = *tail = new_Token(NULL, t->type, t->text, 0);
+ tail = &tt->next;
+ }
+ }
+
+ istk->expansion = ll;
+ }
+ } else {
+ /*
+ * Check whether a `%rep' was started and not ended
+ * within this macro expansion. This can happen and
+ * should be detected. It's a fatal error because
+ * I'm too confused to work out how to recover
+ * sensibly from it.
+ */
+ if (defining) {
+ if (defining->name)
+ nasm_panic("defining with name in expansion");
+ else if (istk->mstk->name)
+ nasm_fatal("`%%rep' without `%%endrep' within"
+ " expansion of macro `%s'",
+ istk->mstk->name);
+ }
+
+ /*
+ * FIXME: investigate the relationship at this point between
+ * istk->mstk and l->finishes
+ */
+ {
+ MMacro *m = istk->mstk;
+ istk->mstk = m->next_active;
+ if (m->name) {
+ /*
+ * This was a real macro call, not a %rep, and
+ * therefore the parameter information needs to
+ * be freed.
+ */
+ if (m->prev) {
+ pop_mmacro(m);
+ l->finishes->in_progress --;
+ } else {
+ nasm_free(m->params);
+ free_tlist(m->iline);
+ nasm_free(m->paramlen);
+ l->finishes->in_progress = 0;
+ }
+ }
+
+ /*
+ * FIXME It is incorrect to always free_mmacro here.
+ * It leads to usage-after-free.
+ *
+ * https://bugzilla.nasm.us/show_bug.cgi?id=3392414
+ */
+#if 0
+ else
+ free_mmacro(m);
+#endif
+ }
+ istk->expansion = l->next;
+ nasm_free(l);
+ lfmt->downlevel(LIST_MACRO);
+ }
+ }
+ while (1) { /* until we get a line we can use */
+
+ if (istk->expansion) { /* from a macro expansion */
+ char *p;
+ Line *l = istk->expansion;
+ if (istk->mstk)
+ istk->mstk->lineno++;
+ tline = l->first;
+ istk->expansion = l->next;
+ nasm_free(l);
+ p = detoken(tline, false);
+ lfmt->line(LIST_MACRO, p);
+ nasm_free(p);
+ break;
+ }
+ line = read_line();
+ if (line) { /* from the current input file */
+ line = prepreproc(line);
+ tline = tokenize(line);
+ nasm_free(line);
+ break;
+ }
+ /*
+ * The current file has ended; work down the istk
+ */
+ {
+ Include *i = istk;
+ fclose(i->fp);
+ if (i->conds) {
+ /* nasm_error can't be conditionally suppressed */
+ nasm_fatal("expected `%%endif' before end of file");
+ }
+ /* only set line and file name if there's a next node */
+ if (i->next)
+ src_set(i->lineno, i->fname);
+ istk = i->next;
+ lfmt->downlevel(LIST_INCLUDE);
+ nasm_free(i);
+ if (!istk) {
+ line = NULL;
+ goto done;
+ }
+ if (istk->expansion && istk->expansion->finishes)
+ break;
+ }
+ }
+
+ /*
+ * We must expand MMacro parameters and MMacro-local labels
+ * _before_ we plunge into directive processing, to cope
+ * with things like `%define something %1' such as STRUC
+ * uses. Unless we're _defining_ a MMacro, in which case
+ * those tokens should be left alone to go into the
+ * definition; and unless we're in a non-emitting
+ * condition, in which case we don't want to meddle with
+ * anything.
+ */
+ if (!defining && !(istk->conds && !emitting(istk->conds->state))
+ && !(istk->mstk && !istk->mstk->in_progress)) {
+ tline = expand_mmac_params(tline);
+ }
+
+ /*
+ * Check the line to see if it's a preprocessor directive.
+ */
+ if (do_directive(tline, &line) == DIRECTIVE_FOUND) {
+ if (line)
+ break; /* Directive generated output */
+ else
+ continue;
+ } else if (defining) {
+ /*
+ * We're defining a multi-line macro. We emit nothing
+ * at all, and just
+ * shove the tokenized line on to the macro definition.
+ */
+ Line *l = nasm_malloc(sizeof(Line));
+ l->next = defining->expansion;
+ l->first = tline;
+ l->finishes = NULL;
+ defining->expansion = l;
+ continue;
+ } else if (istk->conds && !emitting(istk->conds->state)) {
+ /*
+ * We're in a non-emitting branch of a condition block.
+ * Emit nothing at all, not even a blank line: when we
+ * emerge from the condition we'll give a line-number
+ * directive so we keep our place correctly.
+ */
+ free_tlist(tline);
+ continue;
+ } else if (istk->mstk && !istk->mstk->in_progress) {
+ /*
+ * We're in a %rep block which has been terminated, so
+ * we're walking through to the %endrep without
+ * emitting anything. Emit nothing at all, not even a
+ * blank line: when we emerge from the %rep block we'll
+ * give a line-number directive so we keep our place
+ * correctly.
+ */
+ free_tlist(tline);
+ continue;
+ } else {
+ tline = expand_smacro(tline);
+ if (!expand_mmacro(tline)) {
+ /*
+ * De-tokenize the line again, and emit it.
+ */
+ line = detoken(tline, true);
+ free_tlist(tline);
+ break;
+ } else {
+ continue; /* expand_mmacro calls free_tlist */
+ }
+ }
+ }
+
+done:
+ nasm_set_verror(real_verror);
+ return line;
+}
+
+static void pp_cleanup(int pass)
+{
+ real_verror = nasm_set_verror(pp_verror);
+
+ if (defining) {
+ if (defining->name) {
+ nasm_error(ERR_NONFATAL,
+ "end of file while still defining macro `%s'",
+ defining->name);
+ } else {
+ nasm_error(ERR_NONFATAL, "end of file while still in %%rep");
+ }
+
+ free_mmacro(defining);
+ defining = NULL;
+ }
+
+ nasm_set_verror(real_verror);
+
+ while (cstk)
+ ctx_pop();
+ free_macros();
+ while (istk) {
+ Include *i = istk;
+ istk = istk->next;
+ fclose(i->fp);
+ nasm_free(i);
+ }
+ while (cstk)
+ ctx_pop();
+ src_set_fname(NULL);
+ if (pass == 0) {
+ free_llist(predef);
+ predef = NULL;
+ delete_Blocks();
+ freeTokens = NULL;
+ strlist_free(ipath);
+ }
+}
+
+static void pp_include_path(const char *path)
+{
+ if (!path)
+ path = "";
+
+ strlist_add_string(ipath, path);
+}
+
+static void pp_pre_include(char *fname)
+{
+ Token *inc, *space, *name;
+ Line *l;
+
+ name = new_Token(NULL, TOK_INTERNAL_STRING, fname, 0);
+ space = new_Token(name, TOK_WHITESPACE, NULL, 0);
+ inc = new_Token(space, TOK_PREPROC_ID, "%include", 0);
+
+ l = nasm_malloc(sizeof(Line));
+ l->next = predef;
+ l->first = inc;
+ l->finishes = NULL;
+ predef = l;
+}
+
+static void pp_pre_define(char *definition)
+{
+ Token *def, *space;
+ Line *l;
+ char *equals;
+
+ real_verror = nasm_set_verror(pp_verror);
+
+ equals = strchr(definition, '=');
+ space = new_Token(NULL, TOK_WHITESPACE, NULL, 0);
+ def = new_Token(space, TOK_PREPROC_ID, "%define", 0);
+ if (equals)
+ *equals = ' ';
+ space->next = tokenize(definition);
+ if (equals)
+ *equals = '=';
+
+ if (space->next->type != TOK_PREPROC_ID &&
+ space->next->type != TOK_ID)
+ nasm_error(ERR_WARNING, "pre-defining non ID `%s\'\n", definition);
+
+ l = nasm_malloc(sizeof(Line));
+ l->next = predef;
+ l->first = def;
+ l->finishes = NULL;
+ predef = l;
+
+ nasm_set_verror(real_verror);
+}
+
+static void pp_pre_undefine(char *definition)
+{
+ Token *def, *space;
+ Line *l;
+
+ space = new_Token(NULL, TOK_WHITESPACE, NULL, 0);
+ def = new_Token(space, TOK_PREPROC_ID, "%undef", 0);
+ space->next = tokenize(definition);
+
+ l = nasm_malloc(sizeof(Line));
+ l->next = predef;
+ l->first = def;
+ l->finishes = NULL;
+ predef = l;
+}
+
+/* Insert an early preprocessor command that doesn't need special handling */
+static void pp_pre_command(const char *what, char *string)
+{
+ char *cmd;
+ Token *def, *space;
+ Line *l;
+
+ def = tokenize(string);
+ if (what) {
+ cmd = nasm_strcat(what[0] == '%' ? "" : "%", what);
+ space = new_Token(def, TOK_WHITESPACE, NULL, 0);
+ def = new_Token(space, TOK_PREPROC_ID, cmd, 0);
+ }
+
+ l = nasm_malloc(sizeof(Line));
+ l->next = predef;
+ l->first = def;
+ l->finishes = NULL;
+ predef = l;
+}
+
+static void pp_add_stdmac(macros_t *macros)
+{
+ macros_t **mp;
+
+ /* Find the end of the list and avoid duplicates */
+ for (mp = stdmacros; *mp; mp++) {
+ if (*mp == macros)
+ return; /* Nothing to do */
+ }
+
+ nasm_assert(mp < &stdmacros[ARRAY_SIZE(stdmacros)-1]);
+
+ *mp = macros;
+}
+
+static void pp_extra_stdmac(macros_t *macros)
+{
+ extrastdmac = macros;
+}
+
+static void make_tok_num(Token * tok, int64_t val)
+{
+ char numbuf[32];
+ snprintf(numbuf, sizeof(numbuf), "%"PRId64"", val);
+ tok->text = nasm_strdup(numbuf);
+ tok->type = TOK_NUMBER;
+}
+
+static void pp_list_one_macro(MMacro *m, int severity)
+{
+ if (!m)
+ return;
+
+ /* We need to print the next_active list in reverse order */
+ pp_list_one_macro(m->next_active, severity);
+
+ if (m->name && !m->nolist) {
+ src_set(m->xline + m->lineno, m->fname);
+ nasm_error(severity, "... from macro `%s' defined here", m->name);
+ }
+}
+
+static void pp_error_list_macros(int severity)
+{
+ int32_t saved_line;
+ const char *saved_fname = NULL;
+
+ severity |= ERR_PP_LISTMACRO | ERR_NO_SEVERITY;
+ src_get(&saved_line, &saved_fname);
+
+ if (istk)
+ pp_list_one_macro(istk->mstk, severity);
+
+ src_set(saved_line, saved_fname);
+}
+
+const struct preproc_ops nasmpp = {
+ pp_init,
+ pp_reset,
+ pp_getline,
+ pp_cleanup,
+ pp_extra_stdmac,
+ pp_pre_define,
+ pp_pre_undefine,
+ pp_pre_include,
+ pp_pre_command,
+ pp_include_path,
+ pp_error_list_macros,
+};
diff --git a/asm/preproc.h b/asm/preproc.h
new file mode 100644
index 00000000..fcf8695b
--- /dev/null
+++ b/asm/preproc.h
@@ -0,0 +1,55 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * preproc.h header file for preproc.c
+ */
+
+#ifndef NASM_PREPROC_H
+#define NASM_PREPROC_H
+
+#include "nasmlib.h"
+#include "pptok.h"
+
+extern const char * const pp_directives[];
+extern const uint8_t pp_directives_len[];
+
+/* Pointer to a macro chain */
+typedef const unsigned char macros_t;
+
+enum preproc_token pp_token_hash(const char *token);
+
+/* Opens an include file or input file. This uses the include path. */
+FILE *pp_input_fopen(const char *filename, enum file_flags mode);
+
+#endif
diff --git a/asm/quote.c b/asm/quote.c
new file mode 100644
index 00000000..75a93726
--- /dev/null
+++ b/asm/quote.c
@@ -0,0 +1,479 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * quote.c
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+
+#include "nasmlib.h"
+#include "quote.h"
+
+char *nasm_quote(const char *str, size_t len)
+{
+ const char *p, *ep;
+ char c, c1, *q, *nstr;
+ unsigned char uc;
+ bool sq_ok, dq_ok;
+ size_t qlen;
+
+ sq_ok = dq_ok = true;
+ ep = str+len;
+ qlen = 0; /* Length if we need `...` quotes */
+ for (p = str; p < ep; p++) {
+ c = *p;
+ switch (c) {
+ case '\'':
+ sq_ok = false;
+ qlen++;
+ break;
+ case '\"':
+ dq_ok = false;
+ qlen++;
+ break;
+ case '`':
+ case '\\':
+ qlen += 2;
+ break;
+ default:
+ if (c < ' ' || c > '~') {
+ sq_ok = dq_ok = false;
+ switch (c) {
+ case '\a':
+ case '\b':
+ case '\t':
+ case '\n':
+ case '\v':
+ case '\f':
+ case '\r':
+ case 27:
+ qlen += 2;
+ break;
+ default:
+ c1 = (p+1 < ep) ? p[1] : 0;
+ if (c1 >= '0' && c1 <= '7')
+ uc = 0377; /* Must use the full form */
+ else
+ uc = c;
+ if (uc > 077)
+ qlen++;
+ if (uc > 07)
+ qlen++;
+ qlen += 2;
+ break;
+ }
+ } else {
+ qlen++;
+ }
+ break;
+ }
+ }
+
+ if (sq_ok || dq_ok) {
+ /* Use '...' or "..." */
+ nstr = nasm_malloc(len+3);
+ nstr[0] = nstr[len+1] = sq_ok ? '\'' : '\"';
+ nstr[len+2] = '\0';
+ if (len > 0)
+ memcpy(nstr+1, str, len);
+ } else {
+ /* Need to use `...` quoted syntax */
+ nstr = nasm_malloc(qlen+3);
+ q = nstr;
+ *q++ = '`';
+ for (p = str; p < ep; p++) {
+ c = *p;
+ switch (c) {
+ case '`':
+ case '\\':
+ *q++ = '\\';
+ *q++ = c;
+ break;
+ case 7:
+ *q++ = '\\';
+ *q++ = 'a';
+ break;
+ case 8:
+ *q++ = '\\';
+ *q++ = 'b';
+ break;
+ case 9:
+ *q++ = '\\';
+ *q++ = 't';
+ break;
+ case 10:
+ *q++ = '\\';
+ *q++ = 'n';
+ break;
+ case 11:
+ *q++ = '\\';
+ *q++ = 'v';
+ break;
+ case 12:
+ *q++ = '\\';
+ *q++ = 'f';
+ break;
+ case 13:
+ *q++ = '\\';
+ *q++ = 'r';
+ break;
+ case 27:
+ *q++ = '\\';
+ *q++ = 'e';
+ break;
+ default:
+ if (c < ' ' || c > '~') {
+ c1 = (p+1 < ep) ? p[1] : 0;
+ if (c1 >= '0' && c1 <= '7')
+ uc = 0377; /* Must use the full form */
+ else
+ uc = c;
+ *q++ = '\\';
+ if (uc > 077)
+ *q++ = ((unsigned char)c >> 6) + '0';
+ if (uc > 07)
+ *q++ = (((unsigned char)c >> 3) & 7) + '0';
+ *q++ = ((unsigned char)c & 7) + '0';
+ break;
+ } else {
+ *q++ = c;
+ }
+ break;
+ }
+ }
+ *q++ = '`';
+ *q++ = '\0';
+ nasm_assert((size_t)(q-nstr) == qlen+3);
+ }
+ return nstr;
+}
+
+static char *emit_utf8(char *q, int32_t v)
+{
+ if (v < 0) {
+ /* Impossible - do nothing */
+ } else if (v <= 0x7f) {
+ *q++ = v;
+ } else if (v <= 0x000007ff) {
+ *q++ = 0xc0 | (v >> 6);
+ *q++ = 0x80 | (v & 63);
+ } else if (v <= 0x0000ffff) {
+ *q++ = 0xe0 | (v >> 12);
+ *q++ = 0x80 | ((v >> 6) & 63);
+ *q++ = 0x80 | (v & 63);
+ } else if (v <= 0x001fffff) {
+ *q++ = 0xf0 | (v >> 18);
+ *q++ = 0x80 | ((v >> 12) & 63);
+ *q++ = 0x80 | ((v >> 6) & 63);
+ *q++ = 0x80 | (v & 63);
+ } else if (v <= 0x03ffffff) {
+ *q++ = 0xf8 | (v >> 24);
+ *q++ = 0x80 | ((v >> 18) & 63);
+ *q++ = 0x80 | ((v >> 12) & 63);
+ *q++ = 0x80 | ((v >> 6) & 63);
+ *q++ = 0x80 | (v & 63);
+ } else {
+ *q++ = 0xfc | (v >> 30);
+ *q++ = 0x80 | ((v >> 24) & 63);
+ *q++ = 0x80 | ((v >> 18) & 63);
+ *q++ = 0x80 | ((v >> 12) & 63);
+ *q++ = 0x80 | ((v >> 6) & 63);
+ *q++ = 0x80 | (v & 63);
+ }
+ return q;
+}
+
+/*
+ * Do an *in-place* dequoting of the specified string, returning the
+ * resulting length (which may be containing embedded nulls.)
+ *
+ * In-place replacement is possible since the unquoted length is always
+ * shorter than or equal to the quoted length.
+ *
+ * *ep points to the final quote, or to the null if improperly quoted.
+ */
+size_t nasm_unquote(char *str, char **ep)
+{
+ char bq;
+ char *p, *q;
+ char *escp = NULL;
+ char c;
+ enum unq_state {
+ st_start,
+ st_backslash,
+ st_hex,
+ st_oct,
+ st_ucs
+ } state;
+ int ndig = 0;
+ int32_t nval = 0;
+
+ p = q = str;
+
+ bq = *p++;
+ if (!bq)
+ return 0;
+
+ switch (bq) {
+ case '\'':
+ case '\"':
+ /* '...' or "..." string */
+ while ((c = *p) && c != bq) {
+ p++;
+ *q++ = c;
+ }
+ *q = '\0';
+ break;
+
+ case '`':
+ /* `...` string */
+ state = st_start;
+
+ while ((c = *p)) {
+ p++;
+ switch (state) {
+ case st_start:
+ switch (c) {
+ case '\\':
+ state = st_backslash;
+ break;
+ case '`':
+ p--;
+ goto out;
+ default:
+ *q++ = c;
+ break;
+ }
+ break;
+
+ case st_backslash:
+ state = st_start;
+ escp = p; /* Beginning of argument sequence */
+ nval = 0;
+ switch (c) {
+ case 'a':
+ *q++ = 7;
+ break;
+ case 'b':
+ *q++ = 8;
+ break;
+ case 'e':
+ *q++ = 27;
+ break;
+ case 'f':
+ *q++ = 12;
+ break;
+ case 'n':
+ *q++ = 10;
+ break;
+ case 'r':
+ *q++ = 13;
+ break;
+ case 't':
+ *q++ = 9;
+ break;
+ case 'u':
+ state = st_ucs;
+ ndig = 4;
+ break;
+ case 'U':
+ state = st_ucs;
+ ndig = 8;
+ break;
+ case 'v':
+ *q++ = 11;
+ break;
+ case 'x':
+ case 'X':
+ state = st_hex;
+ ndig = 2;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ state = st_oct;
+ ndig = 2; /* Up to two more digits */
+ nval = c - '0';
+ break;
+ default:
+ *q++ = c;
+ break;
+ }
+ break;
+
+ case st_oct:
+ if (c >= '0' && c <= '7') {
+ nval = (nval << 3) + (c - '0');
+ if (!--ndig) {
+ *q++ = nval;
+ state = st_start;
+ }
+ } else {
+ p--; /* Process this character again */
+ *q++ = nval;
+ state = st_start;
+ }
+ break;
+
+ case st_hex:
+ if ((c >= '0' && c <= '9') ||
+ (c >= 'A' && c <= 'F') ||
+ (c >= 'a' && c <= 'f')) {
+ nval = (nval << 4) + numvalue(c);
+ if (!--ndig) {
+ *q++ = nval;
+ state = st_start;
+ }
+ } else {
+ p--; /* Process this character again */
+ *q++ = (p > escp) ? nval : escp[-1];
+ state = st_start;
+ }
+ break;
+
+ case st_ucs:
+ if ((c >= '0' && c <= '9') ||
+ (c >= 'A' && c <= 'F') ||
+ (c >= 'a' && c <= 'f')) {
+ nval = (nval << 4) + numvalue(c);
+ if (!--ndig) {
+ q = emit_utf8(q, nval);
+ state = st_start;
+ }
+ } else {
+ p--; /* Process this character again */
+ if (p > escp)
+ q = emit_utf8(q, nval);
+ else
+ *q++ = escp[-1];
+ state = st_start;
+ }
+ break;
+ }
+ }
+ switch (state) {
+ case st_start:
+ case st_backslash:
+ break;
+ case st_oct:
+ *q++ = nval;
+ break;
+ case st_hex:
+ *q++ = (p > escp) ? nval : escp[-1];
+ break;
+ case st_ucs:
+ if (p > escp)
+ q = emit_utf8(q, nval);
+ else
+ *q++ = escp[-1];
+ break;
+ }
+ out:
+ break;
+
+ default:
+ /* Not a quoted string, just return the input... */
+ p = q = strchr(str, '\0');
+ break;
+ }
+
+ if (ep)
+ *ep = p;
+ return q-str;
+}
+
+/*
+ * Find the end of a quoted string; returns the pointer to the terminating
+ * character (either the ending quote or the null character, if unterminated.)
+ */
+char *nasm_skip_string(char *str)
+{
+ char bq;
+ char *p;
+ char c;
+ enum unq_state {
+ st_start,
+ st_backslash
+ } state;
+
+ bq = str[0];
+ if (bq == '\'' || bq == '\"') {
+ /* '...' or "..." string */
+ for (p = str+1; *p && *p != bq; p++)
+ ;
+ return p;
+ } else if (bq == '`') {
+ /* `...` string */
+ state = st_start;
+ p = str+1;
+ if (!*p)
+ return p;
+
+ while ((c = *p++)) {
+ switch (state) {
+ case st_start:
+ switch (c) {
+ case '\\':
+ state = st_backslash;
+ break;
+ case '`':
+ return p-1; /* Found the end */
+ default:
+ break;
+ }
+ break;
+
+ case st_backslash:
+ /*
+ * Note: for the purpose of finding the end of the string,
+ * all successor states to st_backslash are functionally
+ * equivalent to st_start, since either a backslash or
+ * a backquote will force a return to the st_start state.
+ */
+ state = st_start;
+ break;
+ }
+ }
+ return p-1; /* Unterminated string... */
+ } else {
+ return str; /* Not a string... */
+ }
+}
diff --git a/asm/quote.h b/asm/quote.h
new file mode 100644
index 00000000..2d8ce87b
--- /dev/null
+++ b/asm/quote.h
@@ -0,0 +1,44 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_QUOTE_H
+#define NASM_QUOTE_H
+
+#include "compiler.h"
+
+char *nasm_quote(const char *str, size_t len);
+size_t nasm_unquote(char *str, char **endptr);
+char *nasm_skip_string(char *str);
+
+#endif /* NASM_QUOTE_H */
+
diff --git a/asm/rdstrnum.c b/asm/rdstrnum.c
new file mode 100644
index 00000000..d9d2a69f
--- /dev/null
+++ b/asm/rdstrnum.c
@@ -0,0 +1,68 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdstrnum.c
+ *
+ * This converts a NASM string to an integer, used when a string
+ * is used in an integer constant context. This is a binary conversion,
+ * not a conversion from a numeric constant in text form.
+ */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "nasm.h"
+
+int64_t readstrnum(char *str, int length, bool *warn)
+{
+ int64_t charconst = 0;
+ int i;
+
+ *warn = false;
+
+ str += length;
+ if (globalbits == 64) {
+ for (i = 0; i < length; i++) {
+ if (charconst & UINT64_C(0xFF00000000000000))
+ *warn = true;
+ charconst = (charconst << 8) + (uint8_t)*--str;
+ }
+ } else {
+ for (i = 0; i < length; i++) {
+ if (charconst & 0xFF000000UL)
+ *warn = true;
+ charconst = (charconst << 8) + (uint8_t)*--str;
+ }
+ }
+ return charconst;
+}
diff --git a/asm/segalloc.c b/asm/segalloc.c
new file mode 100644
index 00000000..6d7a4202
--- /dev/null
+++ b/asm/segalloc.c
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+#include "nasm.h"
+#include "nasmlib.h"
+#include "insns.h"
+
+static int32_t next_seg = 2;
+
+int32_t seg_alloc(void)
+{
+ int32_t this_seg = next_seg;
+
+ next_seg += 2;
+ return this_seg;
+}
diff --git a/asm/stdscan.c b/asm/stdscan.c
new file mode 100644
index 00000000..24f9b9c4
--- /dev/null
+++ b/asm/stdscan.c
@@ -0,0 +1,350 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "quote.h"
+#include "stdscan.h"
+#include "insns.h"
+
+/*
+ * Standard scanner routine used by parser.c and some output
+ * formats. It keeps a succession of temporary-storage strings in
+ * stdscan_tempstorage, which can be cleared using stdscan_reset.
+ */
+static char *stdscan_bufptr = NULL;
+static char **stdscan_tempstorage = NULL;
+static int stdscan_tempsize = 0, stdscan_templen = 0;
+#define STDSCAN_TEMP_DELTA 256
+
+void stdscan_set(char *str)
+{
+ stdscan_bufptr = str;
+}
+
+char *stdscan_get(void)
+{
+ return stdscan_bufptr;
+}
+
+static void stdscan_pop(void)
+{
+ nasm_free(stdscan_tempstorage[--stdscan_templen]);
+}
+
+void stdscan_reset(void)
+{
+ while (stdscan_templen > 0)
+ stdscan_pop();
+}
+
+/*
+ * Unimportant cleanup is done to avoid confusing people who are trying
+ * to debug real memory leaks
+ */
+void stdscan_cleanup(void)
+{
+ stdscan_reset();
+ nasm_free(stdscan_tempstorage);
+}
+
+static char *stdscan_copy(char *p, int len)
+{
+ char *text;
+
+ text = nasm_malloc(len + 1);
+ memcpy(text, p, len);
+ text[len] = '\0';
+
+ if (stdscan_templen >= stdscan_tempsize) {
+ stdscan_tempsize += STDSCAN_TEMP_DELTA;
+ stdscan_tempstorage = nasm_realloc(stdscan_tempstorage,
+ stdscan_tempsize *
+ sizeof(char *));
+ }
+ stdscan_tempstorage[stdscan_templen++] = text;
+
+ return text;
+}
+
+/*
+ * a token is enclosed with braces. proper token type will be assigned
+ * accordingly with the token flag.
+ */
+static int stdscan_handle_brace(struct tokenval *tv)
+{
+ if (!(tv->t_flag & TFLAG_BRC_ANY)) {
+ /* invalid token is put inside braces */
+ nasm_error(ERR_NONFATAL,
+ "`%s' is not a valid decorator with braces", tv->t_charptr);
+ tv->t_type = TOKEN_INVALID;
+ } else if (tv->t_flag & TFLAG_BRC_OPT) {
+ if (is_reg_class(OPMASKREG, tv->t_integer)) {
+ /* within braces, opmask register is now used as a mask */
+ tv->t_type = TOKEN_OPMASK;
+ }
+ }
+
+ return tv->t_type;
+}
+
+int stdscan(void *private_data, struct tokenval *tv)
+{
+ char ourcopy[MAX_KEYWORD + 1], *r, *s;
+
+ (void)private_data; /* Don't warn that this parameter is unused */
+
+ stdscan_bufptr = nasm_skip_spaces(stdscan_bufptr);
+ if (!*stdscan_bufptr)
+ return tv->t_type = TOKEN_EOS;
+
+ /* we have a token; either an id, a number or a char */
+ if (isidstart(*stdscan_bufptr) ||
+ (*stdscan_bufptr == '$' && isidstart(stdscan_bufptr[1]))) {
+ /* now we've got an identifier */
+ bool is_sym = false;
+ int token_type;
+
+ if (*stdscan_bufptr == '$') {
+ is_sym = true;
+ stdscan_bufptr++;
+ }
+
+ r = stdscan_bufptr++;
+ /* read the entire buffer to advance the buffer pointer but... */
+ while (isidchar(*stdscan_bufptr))
+ stdscan_bufptr++;
+
+ /* ... copy only up to IDLEN_MAX-1 characters */
+ tv->t_charptr = stdscan_copy(r, stdscan_bufptr - r < IDLEN_MAX ?
+ stdscan_bufptr - r : IDLEN_MAX - 1);
+
+ if (is_sym || stdscan_bufptr - r > MAX_KEYWORD)
+ return tv->t_type = TOKEN_ID; /* bypass all other checks */
+
+ for (s = tv->t_charptr, r = ourcopy; *s; s++)
+ *r++ = nasm_tolower(*s);
+ *r = '\0';
+ /* right, so we have an identifier sitting in temp storage. now,
+ * is it actually a register or instruction name, or what? */
+ token_type = nasm_token_hash(ourcopy, tv);
+
+ if (unlikely(tv->t_flag & TFLAG_WARN)) {
+ nasm_error(ERR_WARNING|ERR_PASS1|ERR_WARN_PTR,
+ "`%s' is not a NASM keyword", tv->t_charptr);
+ }
+
+ if (likely(!(tv->t_flag & TFLAG_BRC))) {
+ /* most of the tokens fall into this case */
+ return token_type;
+ } else {
+ return tv->t_type = TOKEN_ID;
+ }
+ } else if (*stdscan_bufptr == '$' && !isnumchar(stdscan_bufptr[1])) {
+ /*
+ * It's a $ sign with no following hex number; this must
+ * mean it's a Here token ($), evaluating to the current
+ * assembly location, or a Base token ($$), evaluating to
+ * the base of the current segment.
+ */
+ stdscan_bufptr++;
+ if (*stdscan_bufptr == '$') {
+ stdscan_bufptr++;
+ return tv->t_type = TOKEN_BASE;
+ }
+ return tv->t_type = TOKEN_HERE;
+ } else if (isnumstart(*stdscan_bufptr)) { /* now we've got a number */
+ bool rn_error;
+ bool is_hex = false;
+ bool is_float = false;
+ bool has_e = false;
+ char c;
+
+ r = stdscan_bufptr;
+
+ if (*stdscan_bufptr == '$') {
+ stdscan_bufptr++;
+ is_hex = true;
+ }
+
+ for (;;) {
+ c = *stdscan_bufptr++;
+
+ if (!is_hex && (c == 'e' || c == 'E')) {
+ has_e = true;
+ if (*stdscan_bufptr == '+' || *stdscan_bufptr == '-') {
+ /*
+ * e can only be followed by +/- if it is either a
+ * prefixed hex number or a floating-point number
+ */
+ is_float = true;
+ stdscan_bufptr++;
+ }
+ } else if (c == 'H' || c == 'h' || c == 'X' || c == 'x') {
+ is_hex = true;
+ } else if (c == 'P' || c == 'p') {
+ is_float = true;
+ if (*stdscan_bufptr == '+' || *stdscan_bufptr == '-')
+ stdscan_bufptr++;
+ } else if (isnumchar(c))
+ ; /* just advance */
+ else if (c == '.')
+ is_float = true;
+ else
+ break;
+ }
+ stdscan_bufptr--; /* Point to first character beyond number */
+
+ if (has_e && !is_hex) {
+ /* 1e13 is floating-point, but 1e13h is not */
+ is_float = true;
+ }
+
+ if (is_float) {
+ tv->t_charptr = stdscan_copy(r, stdscan_bufptr - r);
+ return tv->t_type = TOKEN_FLOAT;
+ } else {
+ r = stdscan_copy(r, stdscan_bufptr - r);
+ tv->t_integer = readnum(r, &rn_error);
+ stdscan_pop();
+ if (rn_error) {
+ /* some malformation occurred */
+ return tv->t_type = TOKEN_ERRNUM;
+ }
+ tv->t_charptr = NULL;
+ return tv->t_type = TOKEN_NUM;
+ }
+ } else if (*stdscan_bufptr == '\'' || *stdscan_bufptr == '"' ||
+ *stdscan_bufptr == '`') {
+ /* a quoted string */
+ char start_quote = *stdscan_bufptr;
+ tv->t_charptr = stdscan_bufptr;
+ tv->t_inttwo = nasm_unquote(tv->t_charptr, &stdscan_bufptr);
+ if (*stdscan_bufptr != start_quote)
+ return tv->t_type = TOKEN_ERRSTR;
+ stdscan_bufptr++; /* Skip final quote */
+ return tv->t_type = TOKEN_STR;
+ } else if (*stdscan_bufptr == '{') {
+ /* now we've got a decorator */
+ int token_len;
+
+ stdscan_bufptr = nasm_skip_spaces(stdscan_bufptr);
+
+ r = ++stdscan_bufptr;
+ /*
+ * read the entire buffer to advance the buffer pointer
+ * {rn-sae}, {rd-sae}, {ru-sae}, {rz-sae} contain '-' in tokens.
+ */
+ while (isbrcchar(*stdscan_bufptr))
+ stdscan_bufptr++;
+
+ token_len = stdscan_bufptr - r;
+
+ /* ... copy only up to DECOLEN_MAX-1 characters */
+ tv->t_charptr = stdscan_copy(r, token_len < DECOLEN_MAX ?
+ token_len : DECOLEN_MAX - 1);
+
+ stdscan_bufptr = nasm_skip_spaces(stdscan_bufptr);
+ /* if brace is not closed properly or token is too long */
+ if ((*stdscan_bufptr != '}') || (token_len > MAX_KEYWORD)) {
+ nasm_error(ERR_NONFATAL,
+ "invalid decorator token inside braces");
+ return tv->t_type = TOKEN_INVALID;
+ }
+
+ stdscan_bufptr++; /* skip closing brace */
+
+ for (s = tv->t_charptr, r = ourcopy; *s; s++)
+ *r++ = nasm_tolower(*s);
+ *r = '\0';
+
+ /* right, so we have a decorator sitting in temp storage. */
+ nasm_token_hash(ourcopy, tv);
+
+ /* handle tokens inside braces */
+ return stdscan_handle_brace(tv);
+ } else if (*stdscan_bufptr == ';') {
+ /* a comment has happened - stay */
+ return tv->t_type = TOKEN_EOS;
+ } else if (stdscan_bufptr[0] == '>' && stdscan_bufptr[1] == '>') {
+ if (stdscan_bufptr[2] == '>') {
+ stdscan_bufptr += 3;
+ return tv->t_type = TOKEN_SAR;
+ } else {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_SHR;
+ }
+ } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '<') {
+ stdscan_bufptr += stdscan_bufptr[2] == '<' ? 3 : 2;
+ return tv->t_type = TOKEN_SHL;
+ } else if (stdscan_bufptr[0] == '/' && stdscan_bufptr[1] == '/') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_SDIV;
+ } else if (stdscan_bufptr[0] == '%' && stdscan_bufptr[1] == '%') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_SMOD;
+ } else if (stdscan_bufptr[0] == '=' && stdscan_bufptr[1] == '=') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_EQ;
+ } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '>') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_NE;
+ } else if (stdscan_bufptr[0] == '!' && stdscan_bufptr[1] == '=') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_NE;
+ } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '=') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_LE;
+ } else if (stdscan_bufptr[0] == '>' && stdscan_bufptr[1] == '=') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_GE;
+ } else if (stdscan_bufptr[0] == '&' && stdscan_bufptr[1] == '&') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_DBL_AND;
+ } else if (stdscan_bufptr[0] == '^' && stdscan_bufptr[1] == '^') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_DBL_XOR;
+ } else if (stdscan_bufptr[0] == '|' && stdscan_bufptr[1] == '|') {
+ stdscan_bufptr += 2;
+ return tv->t_type = TOKEN_DBL_OR;
+ } else /* just an ordinary char */
+ return tv->t_type = (uint8_t)(*stdscan_bufptr++);
+}
diff --git a/asm/stdscan.h b/asm/stdscan.h
new file mode 100644
index 00000000..8dbc2d03
--- /dev/null
+++ b/asm/stdscan.h
@@ -0,0 +1,49 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * stdscan.h header file for stdscan.c
+ */
+
+#ifndef NASM_STDSCAN_H
+#define NASM_STDSCAN_H
+
+/* Standard scanner */
+void stdscan_set(char *str);
+char *stdscan_get(void);
+void stdscan_reset(void);
+int stdscan(void *private_data, struct tokenval *tv);
+int nasm_token_hash(const char *token, struct tokenval *tv);
+void stdscan_cleanup(void);
+
+#endif
diff --git a/asm/strfunc.c b/asm/strfunc.c
new file mode 100644
index 00000000..236b9d2f
--- /dev/null
+++ b/asm/strfunc.c
@@ -0,0 +1,359 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * strfunc.c
+ *
+ * String transformation functions
+ */
+
+#include "nasmlib.h"
+#include "nasm.h"
+
+/*
+ * Convert a string in UTF-8 format to UTF-16LE
+ */
+static size_t utf8_to_16le(uint8_t *str, size_t len, char *op)
+{
+#define EMIT(x) do { if (op) { WRITESHORT(op,x); } outlen++; } while(0)
+
+ size_t outlen = 0;
+ int expect = 0;
+ uint8_t c;
+ uint32_t v = 0, vmin = 0;
+
+ while (len--) {
+ c = *str++;
+
+ if (expect) {
+ if ((c & 0xc0) != 0x80) {
+ expect = 0;
+ return -1;
+ } else {
+ v = (v << 6) | (c & 0x3f);
+ if (!--expect) {
+ if (v < vmin || v > 0x10ffff ||
+ (v >= 0xd800 && v <= 0xdfff)) {
+ return -1;
+ } else if (v > 0xffff) {
+ v -= 0x10000;
+ EMIT(0xd800 | (v >> 10));
+ EMIT(0xdc00 | (v & 0x3ff));
+ } else {
+ EMIT(v);
+ }
+ }
+ continue;
+ }
+ }
+
+ if (c < 0x80) {
+ EMIT(c);
+ } else if (c < 0xc0 || c >= 0xfe) {
+ /* Invalid UTF-8 */
+ return -1;
+ } else if (c < 0xe0) {
+ v = c & 0x1f;
+ expect = 1;
+ vmin = 0x80;
+ } else if (c < 0xf0) {
+ v = c & 0x0f;
+ expect = 2;
+ vmin = 0x800;
+ } else if (c < 0xf8) {
+ v = c & 0x07;
+ expect = 3;
+ vmin = 0x10000;
+ } else if (c < 0xfc) {
+ v = c & 0x03;
+ expect = 4;
+ vmin = 0x200000;
+ } else {
+ v = c & 0x01;
+ expect = 5;
+ vmin = 0x4000000;
+ }
+ }
+
+ return expect ? (size_t)-1 : outlen << 1;
+
+#undef EMIT
+}
+
+/*
+ * Convert a string in UTF-8 format to UTF-16BE
+ */
+static size_t utf8_to_16be(uint8_t *str, size_t len, char *op)
+{
+#define EMIT(x) \
+ do { \
+ uint16_t _y = (x); \
+ if (op) { \
+ WRITECHAR(op, _y >> 8); \
+ WRITECHAR(op, _y); \
+ } \
+ outlen++; \
+ } while (0) \
+
+ size_t outlen = 0;
+ int expect = 0;
+ uint8_t c;
+ uint32_t v = 0, vmin = 0;
+
+ while (len--) {
+ c = *str++;
+
+ if (expect) {
+ if ((c & 0xc0) != 0x80) {
+ expect = 0;
+ return -1;
+ } else {
+ v = (v << 6) | (c & 0x3f);
+ if (!--expect) {
+ if (v < vmin || v > 0x10ffff ||
+ (v >= 0xd800 && v <= 0xdfff)) {
+ return -1;
+ } else if (v > 0xffff) {
+ v -= 0x10000;
+ EMIT(0xdc00 | (v & 0x3ff));
+ EMIT(0xd800 | (v >> 10));
+ } else {
+ EMIT(v);
+ }
+ }
+ continue;
+ }
+ }
+
+ if (c < 0x80) {
+ EMIT(c);
+ } else if (c < 0xc0 || c >= 0xfe) {
+ /* Invalid UTF-8 */
+ return -1;
+ } else if (c < 0xe0) {
+ v = c & 0x1f;
+ expect = 1;
+ vmin = 0x80;
+ } else if (c < 0xf0) {
+ v = c & 0x0f;
+ expect = 2;
+ vmin = 0x800;
+ } else if (c < 0xf8) {
+ v = c & 0x07;
+ expect = 3;
+ vmin = 0x10000;
+ } else if (c < 0xfc) {
+ v = c & 0x03;
+ expect = 4;
+ vmin = 0x200000;
+ } else {
+ v = c & 0x01;
+ expect = 5;
+ vmin = 0x4000000;
+ }
+ }
+
+ return expect ? (size_t)-1 : outlen << 1;
+
+#undef EMIT
+}
+
+/*
+ * Convert a string in UTF-8 format to UTF-32LE
+ */
+static size_t utf8_to_32le(uint8_t *str, size_t len, char *op)
+{
+#define EMIT(x) do { if (op) { WRITELONG(op,x); } outlen++; } while(0)
+
+ size_t outlen = 0;
+ int expect = 0;
+ uint8_t c;
+ uint32_t v = 0, vmin = 0;
+
+ while (len--) {
+ c = *str++;
+
+ if (expect) {
+ if ((c & 0xc0) != 0x80) {
+ return -1;
+ } else {
+ v = (v << 6) | (c & 0x3f);
+ if (!--expect) {
+ if (v < vmin || (v >= 0xd800 && v <= 0xdfff)) {
+ return -1;
+ } else {
+ EMIT(v);
+ }
+ }
+ continue;
+ }
+ }
+
+ if (c < 0x80) {
+ EMIT(c);
+ } else if (c < 0xc0 || c >= 0xfe) {
+ /* Invalid UTF-8 */
+ return -1;
+ } else if (c < 0xe0) {
+ v = c & 0x1f;
+ expect = 1;
+ vmin = 0x80;
+ } else if (c < 0xf0) {
+ v = c & 0x0f;
+ expect = 2;
+ vmin = 0x800;
+ } else if (c < 0xf8) {
+ v = c & 0x07;
+ expect = 3;
+ vmin = 0x10000;
+ } else if (c < 0xfc) {
+ v = c & 0x03;
+ expect = 4;
+ vmin = 0x200000;
+ } else {
+ v = c & 0x01;
+ expect = 5;
+ vmin = 0x4000000;
+ }
+ }
+
+ return expect ? (size_t)-1 : outlen << 2;
+
+#undef EMIT
+}
+
+/*
+ * Convert a string in UTF-8 format to UTF-32BE
+ */
+static size_t utf8_to_32be(uint8_t *str, size_t len, char *op)
+{
+#define EMIT(x) \
+ do { \
+ uint32_t _y = (x); \
+ if (op) { \
+ WRITECHAR(op,_y >> 24); \
+ WRITECHAR(op,_y >> 16); \
+ WRITECHAR(op,_y >> 8); \
+ WRITECHAR(op,_y); \
+ } \
+ outlen++; \
+ } while (0)
+
+ size_t outlen = 0;
+ int expect = 0;
+ uint8_t c;
+ uint32_t v = 0, vmin = 0;
+
+ while (len--) {
+ c = *str++;
+
+ if (expect) {
+ if ((c & 0xc0) != 0x80) {
+ return -1;
+ } else {
+ v = (v << 6) | (c & 0x3f);
+ if (!--expect) {
+ if (v < vmin || (v >= 0xd800 && v <= 0xdfff)) {
+ return -1;
+ } else {
+ EMIT(v);
+ }
+ }
+ continue;
+ }
+ }
+
+ if (c < 0x80) {
+ EMIT(c);
+ } else if (c < 0xc0 || c >= 0xfe) {
+ /* Invalid UTF-8 */
+ return -1;
+ } else if (c < 0xe0) {
+ v = c & 0x1f;
+ expect = 1;
+ vmin = 0x80;
+ } else if (c < 0xf0) {
+ v = c & 0x0f;
+ expect = 2;
+ vmin = 0x800;
+ } else if (c < 0xf8) {
+ v = c & 0x07;
+ expect = 3;
+ vmin = 0x10000;
+ } else if (c < 0xfc) {
+ v = c & 0x03;
+ expect = 4;
+ vmin = 0x200000;
+ } else {
+ v = c & 0x01;
+ expect = 5;
+ vmin = 0x4000000;
+ }
+ }
+
+ return expect ? (size_t)-1 : outlen << 2;
+
+#undef EMIT
+}
+
+typedef size_t (*transform_func)(uint8_t *, size_t, char *);
+
+/*
+ * Apply a specific string transform and return it in a nasm_malloc'd
+ * buffer, returning the length. On error, returns (size_t)-1 and no
+ * buffer is allocated.
+ */
+size_t string_transform(char *str, size_t len, char **out, enum strfunc func)
+{
+ /* This should match enum strfunc in nasm.h */
+ static const transform_func str_transforms[] = {
+ utf8_to_16le,
+ utf8_to_16le,
+ utf8_to_16be,
+ utf8_to_32le,
+ utf8_to_32le,
+ utf8_to_32be,
+ };
+ transform_func transform = str_transforms[func];
+ size_t outlen;
+ uint8_t *s = (uint8_t *)str;
+ char *buf;
+
+ outlen = transform(s, len, NULL);
+ if (outlen == (size_t)-1)
+ return -1;
+
+ *out = buf = nasm_malloc(outlen+1);
+ buf[outlen] = '\0'; /* Forcibly null-terminate the buffer */
+ return transform(s, len, buf);
+}
diff --git a/asm/tokens.dat b/asm/tokens.dat
new file mode 100644
index 00000000..528f2431
--- /dev/null
+++ b/asm/tokens.dat
@@ -0,0 +1,135 @@
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2016 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Tokens other than instructions and registers
+#
+
+% TOKEN_PREFIX, 0, 0, P_*
+a16
+a32
+a64
+asp
+lock
+o16
+o32
+o64
+osp
+rep
+repe
+repne
+repnz
+repz
+times
+wait
+xacquire
+xrelease
+bnd
+nobnd
+
+% TOKEN_SPECIAL, 0, 0, S_*
+abs
+byte
+dword
+far
+long
+near
+nosplit
+oword
+qword
+rel
+short
+strict
+to
+tword
+word
+yword
+zword
+
+% TOKEN_ID, 0, TFLAG_WARN, 0
+ptr
+
+% TOKEN_FLOAT, 0, 0, 0
+__infinity__
+__nan__
+__qnan__
+__snan__
+
+% TOKEN_FLOATIZE, 0, 0, FLOAT_{__float*__}
+__float8__
+__float16__
+__float32__
+__float64__
+__float80m__
+__float80e__
+__float128l__
+__float128h__
+
+% TOKEN_STRFUNC, 0, 0, STRFUNC_{__*__}
+__utf16__
+__utf16le__
+__utf16be__
+__utf32__
+__utf32le__
+__utf32be__
+
+% TOKEN_IFUNC, 0, 0, IFUNC_{__*__}
+__ilog2e__
+__ilog2w__
+__ilog2f__
+__ilog2c__
+
+% TOKEN_*, 0, 0, 0
+seg
+wrt
+
+% TOKEN_DECORATOR, 0, TFLAG_BRC | TFLAG_BRDCAST , BRC_1TO{1to*}
+1to2
+1to4
+1to8
+1to16
+
+% TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_{*-sae}
+rn-sae
+rd-sae
+ru-sae
+rz-sae
+
+% TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_*
+sae
+z
+
+% TOKEN_PREFIX, 0, TFLAG_BRC, P_*
+evex
+vex3
+vex2
diff --git a/asm/tokens.h b/asm/tokens.h
new file mode 100644
index 00000000..b0e9887a
--- /dev/null
+++ b/asm/tokens.h
@@ -0,0 +1,11 @@
+/*
+ * This file is generated from insns.dat, regs.dat and token.dat
+ * by tokhash.pl; do not edit.
+ */
+
+#ifndef NASM_TOKENS_H
+#define NASM_TOKENS_H
+
+#define MAX_KEYWORD 17 /* length of longest keyword */
+
+#endif /* NASM_TOKENS_H */
diff --git a/asm/tokhash.c b/asm/tokhash.c
new file mode 100644
index 00000000..9a5620e9
--- /dev/null
+++ b/asm/tokhash.c
@@ -0,0 +1,6431 @@
+/*
+ * This file is generated from insns.dat, regs.dat and token.dat
+ * by tokhash.pl; do not edit.
+ */
+
+#include "compiler.h"
+#include <string.h>
+#include "nasm.h"
+#include "hashtbl.h"
+#include "insns.h"
+#include "stdscan.h"
+
+struct tokendata {
+ const char *string;
+ int16_t tokentype;
+ int8_t aux;
+ int8_t tokflag;
+ int32_t num;
+};
+
+int nasm_token_hash(const char *token, struct tokenval *tv)
+{
+#define UNUSED (65535/3)
+ static const int16_t hash1[2048] = {
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 6769,
+ 3411,
+ UNUSED,
+ 7328,
+ 0,
+ 5695,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ 3082,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 6709,
+ -830,
+ 5546,
+ 0,
+ 0,
+ 0,
+ 5038,
+ UNUSED,
+ 0,
+ 6444,
+ 0,
+ 0,
+ UNUSED,
+ 198,
+ 120,
+ 0,
+ 8767,
+ 0,
+ 0,
+ 11326,
+ 0,
+ -1516,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ 2211,
+ UNUSED,
+ 0,
+ 2034,
+ 10643,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 6349,
+ 0,
+ 11029,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 5764,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ 7690,
+ 4268,
+ -874,
+ 0,
+ UNUSED,
+ 8958,
+ 0,
+ 2777,
+ 1402,
+ 8375,
+ 1225,
+ UNUSED,
+ 7450,
+ 0,
+ UNUSED,
+ 2462,
+ 0,
+ 8935,
+ 3727,
+ 1901,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 7671,
+ UNUSED,
+ -276,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 8400,
+ 0,
+ UNUSED,
+ 403,
+ -122,
+ -907,
+ 7539,
+ 8821,
+ 0,
+ 0,
+ 373,
+ 11447,
+ -53,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 433,
+ 7215,
+ 265,
+ 0,
+ 4892,
+ 0,
+ 0,
+ 1155,
+ UNUSED,
+ UNUSED,
+ 1932,
+ UNUSED,
+ -811,
+ 6943,
+ UNUSED,
+ -1638,
+ UNUSED,
+ 687,
+ 0,
+ 0,
+ 6991,
+ 2858,
+ 0,
+ 1946,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 451,
+ 2522,
+ UNUSED,
+ -3714,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1064,
+ 1480,
+ 113,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 7672,
+ 6243,
+ UNUSED,
+ -2187,
+ 0,
+ UNUSED,
+ 6543,
+ 0,
+ 1664,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 406,
+ UNUSED,
+ 6862,
+ UNUSED,
+ UNUSED,
+ 2745,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 4663,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 7678,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ -2208,
+ 0,
+ 1565,
+ 0,
+ 0,
+ 66,
+ 8962,
+ UNUSED,
+ 0,
+ -589,
+ UNUSED,
+ -2123,
+ 0,
+ 0,
+ 1774,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ 2426,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 358,
+ UNUSED,
+ -1771,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 7417,
+ 8800,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 730,
+ 844,
+ 4783,
+ 0,
+ UNUSED,
+ 878,
+ 1112,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1442,
+ UNUSED,
+ 0,
+ UNUSED,
+ -1327,
+ UNUSED,
+ 6137,
+ -2278,
+ UNUSED,
+ 0,
+ 931,
+ UNUSED,
+ 838,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ 2201,
+ UNUSED,
+ 860,
+ 0,
+ 7689,
+ 1193,
+ UNUSED,
+ 1589,
+ 2616,
+ UNUSED,
+ 0,
+ 5534,
+ 592,
+ 1265,
+ 8352,
+ 8886,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ -2269,
+ 0,
+ 3460,
+ 2057,
+ 586,
+ 107,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ 201,
+ 0,
+ -299,
+ 1298,
+ 0,
+ UNUSED,
+ 0,
+ -1239,
+ 0,
+ UNUSED,
+ 0,
+ 7281,
+ 9022,
+ -547,
+ UNUSED,
+ 1158,
+ -3689,
+ 0,
+ 63,
+ 0,
+ 8750,
+ 4275,
+ 0,
+ -1229,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 6366,
+ 804,
+ UNUSED,
+ 2374,
+ 689,
+ -4609,
+ 0,
+ 69,
+ -4542,
+ 1282,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 1703,
+ 5791,
+ 2855,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ -2019,
+ UNUSED,
+ UNUSED,
+ -542,
+ 8880,
+ 9411,
+ UNUSED,
+ 2078,
+ -3135,
+ 9751,
+ 1723,
+ 741,
+ 1509,
+ 0,
+ 963,
+ 1795,
+ UNUSED,
+ 0,
+ UNUSED,
+ 7349,
+ 0,
+ 1094,
+ 0,
+ 0,
+ 3344,
+ 11061,
+ -826,
+ UNUSED,
+ UNUSED,
+ -2625,
+ 347,
+ 379,
+ 307,
+ UNUSED,
+ 800,
+ 3863,
+ 0,
+ 0,
+ 860,
+ UNUSED,
+ UNUSED,
+ 4615,
+ 0,
+ UNUSED,
+ 0,
+ 3716,
+ 473,
+ 0,
+ 0,
+ 3013,
+ 6441,
+ -182,
+ UNUSED,
+ UNUSED,
+ 1252,
+ UNUSED,
+ 1142,
+ UNUSED,
+ 3525,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 11150,
+ 2366,
+ UNUSED,
+ UNUSED,
+ 6977,
+ 599,
+ UNUSED,
+ 1300,
+ 1224,
+ UNUSED,
+ 302,
+ 3140,
+ 1146,
+ -695,
+ 1250,
+ 1965,
+ 7990,
+ UNUSED,
+ 10394,
+ UNUSED,
+ 4383,
+ 702,
+ 9729,
+ UNUSED,
+ 1273,
+ UNUSED,
+ 93,
+ UNUSED,
+ 268,
+ UNUSED,
+ 10323,
+ -2155,
+ 1646,
+ -217,
+ 7271,
+ -263,
+ 0,
+ UNUSED,
+ UNUSED,
+ 3604,
+ -170,
+ 523,
+ 6655,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1579,
+ -854,
+ -6,
+ 1711,
+ 5204,
+ 5807,
+ 849,
+ 7226,
+ UNUSED,
+ 9487,
+ 3614,
+ -1057,
+ 603,
+ 7138,
+ UNUSED,
+ 0,
+ 8498,
+ 4475,
+ UNUSED,
+ 0,
+ 0,
+ 10377,
+ 1826,
+ UNUSED,
+ 10867,
+ -2483,
+ 0,
+ -1572,
+ 1364,
+ UNUSED,
+ 0,
+ 8527,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 1509,
+ 1456,
+ -1077,
+ UNUSED,
+ 3590,
+ 0,
+ UNUSED,
+ -1468,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 751,
+ 394,
+ -392,
+ UNUSED,
+ UNUSED,
+ 0,
+ 108,
+ 1324,
+ UNUSED,
+ -2998,
+ UNUSED,
+ 3761,
+ 0,
+ 1607,
+ 0,
+ 211,
+ UNUSED,
+ UNUSED,
+ 1938,
+ -1836,
+ 135,
+ 542,
+ 0,
+ 905,
+ 1447,
+ 7709,
+ 0,
+ UNUSED,
+ UNUSED,
+ -1633,
+ 5737,
+ 6667,
+ 0,
+ 867,
+ UNUSED,
+ 921,
+ UNUSED,
+ UNUSED,
+ 9745,
+ 1482,
+ UNUSED,
+ UNUSED,
+ 1491,
+ 5301,
+ 11196,
+ 0,
+ UNUSED,
+ 2247,
+ 0,
+ UNUSED,
+ 1432,
+ 0,
+ 10676,
+ 0,
+ 1057,
+ UNUSED,
+ 2542,
+ UNUSED,
+ -279,
+ UNUSED,
+ UNUSED,
+ 18,
+ UNUSED,
+ 0,
+ -1422,
+ UNUSED,
+ -3092,
+ UNUSED,
+ -423,
+ UNUSED,
+ 650,
+ UNUSED,
+ 4900,
+ 0,
+ 5414,
+ -545,
+ -13,
+ 510,
+ 6540,
+ UNUSED,
+ -1586,
+ 6572,
+ UNUSED,
+ 972,
+ UNUSED,
+ UNUSED,
+ -129,
+ 2112,
+ 902,
+ UNUSED,
+ 3218,
+ 0,
+ 6551,
+ 2147,
+ 912,
+ 1625,
+ 6896,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 8024,
+ UNUSED,
+ 4180,
+ UNUSED,
+ 916,
+ 649,
+ UNUSED,
+ 1706,
+ -1841,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1271,
+ 11257,
+ UNUSED,
+ 7478,
+ -585,
+ 1814,
+ 6356,
+ UNUSED,
+ -1173,
+ 2156,
+ UNUSED,
+ 0,
+ 1311,
+ 12458,
+ UNUSED,
+ 0,
+ 10272,
+ -457,
+ 5048,
+ 0,
+ UNUSED,
+ 6794,
+ 0,
+ 190,
+ 8954,
+ UNUSED,
+ 1588,
+ 2046,
+ 1133,
+ 1155,
+ 0,
+ 6665,
+ 2202,
+ -265,
+ 0,
+ 157,
+ 11069,
+ 5199,
+ 7725,
+ -482,
+ -1299,
+ 10509,
+ 11176,
+ UNUSED,
+ 63,
+ -1250,
+ -3442,
+ 724,
+ UNUSED,
+ UNUSED,
+ 1852,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ -1793,
+ UNUSED,
+ -969,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 1792,
+ 0,
+ UNUSED,
+ 1276,
+ 9907,
+ 1154,
+ 426,
+ 230,
+ -280,
+ 0,
+ 8123,
+ 985,
+ 2978,
+ 5563,
+ -472,
+ 0,
+ 7659,
+ 0,
+ 4,
+ 0,
+ UNUSED,
+ -94,
+ -1317,
+ 763,
+ 1808,
+ UNUSED,
+ 844,
+ 3780,
+ UNUSED,
+ 5395,
+ UNUSED,
+ 1478,
+ 4845,
+ -4307,
+ 2426,
+ 0,
+ 1241,
+ 0,
+ UNUSED,
+ UNUSED,
+ 2598,
+ 0,
+ 4882,
+ 2278,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5726,
+ 901,
+ 933,
+ 9683,
+ UNUSED,
+ 1519,
+ UNUSED,
+ 0,
+ 8452,
+ 3188,
+ 5667,
+ 0,
+ 2175,
+ UNUSED,
+ 7093,
+ 0,
+ 834,
+ UNUSED,
+ 840,
+ 3042,
+ 9154,
+ 1689,
+ UNUSED,
+ 0,
+ 0,
+ 430,
+ 2036,
+ -5039,
+ 3829,
+ 2377,
+ -2335,
+ UNUSED,
+ 9561,
+ 14811,
+ 1906,
+ 278,
+ 2300,
+ 2195,
+ -565,
+ 6644,
+ UNUSED,
+ 1088,
+ UNUSED,
+ UNUSED,
+ 1237,
+ UNUSED,
+ 1269,
+ UNUSED,
+ UNUSED,
+ 382,
+ 3666,
+ -756,
+ 1291,
+ 0,
+ 2138,
+ 0,
+ 7715,
+ 1967,
+ 1936,
+ UNUSED,
+ 0,
+ 7836,
+ UNUSED,
+ 9574,
+ 92,
+ UNUSED,
+ 7139,
+ UNUSED,
+ UNUSED,
+ 182,
+ 0,
+ 9819,
+ 2923,
+ 5955,
+ UNUSED,
+ 9074,
+ UNUSED,
+ UNUSED,
+ 21,
+ 0,
+ UNUSED,
+ 203,
+ 0,
+ 6541,
+ 252,
+ 342,
+ 175,
+ 2470,
+ -1248,
+ 1788,
+ -1198,
+ UNUSED,
+ 2334,
+ -93,
+ 465,
+ UNUSED,
+ 7666,
+ UNUSED,
+ UNUSED,
+ -2454,
+ 4893,
+ UNUSED,
+ 1109,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 242,
+ -758,
+ 8312,
+ UNUSED,
+ -253,
+ 1935,
+ UNUSED,
+ 0,
+ 2163,
+ 1566,
+ UNUSED,
+ UNUSED,
+ 260,
+ 1708,
+ -1052,
+ UNUSED,
+ 2693,
+ UNUSED,
+ UNUSED,
+ 11074,
+ 5712,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -254,
+ 8653,
+ UNUSED,
+ -565,
+ UNUSED,
+ 527,
+ 1983,
+ UNUSED,
+ UNUSED,
+ 2688,
+ 408,
+ UNUSED,
+ 5048,
+ 1496,
+ 640,
+ UNUSED,
+ UNUSED,
+ 1080,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -2078,
+ 8389,
+ 0,
+ UNUSED,
+ UNUSED,
+ -36,
+ -835,
+ 512,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1530,
+ UNUSED,
+ 1593,
+ UNUSED,
+ 996,
+ UNUSED,
+ 1943,
+ 967,
+ 383,
+ 9556,
+ 803,
+ 2043,
+ UNUSED,
+ UNUSED,
+ 12293,
+ 1166,
+ UNUSED,
+ 2377,
+ -1625,
+ 1438,
+ UNUSED,
+ UNUSED,
+ 1620,
+ UNUSED,
+ -450,
+ 918,
+ -1248,
+ 0,
+ 854,
+ 2811,
+ 1521,
+ 0,
+ 1668,
+ 0,
+ -913,
+ UNUSED,
+ -975,
+ 1559,
+ UNUSED,
+ 1269,
+ UNUSED,
+ 0,
+ UNUSED,
+ 1924,
+ 2417,
+ 1067,
+ 6367,
+ 8621,
+ 400,
+ 2668,
+ 2282,
+ 8494,
+ 807,
+ -1114,
+ 10861,
+ UNUSED,
+ UNUSED,
+ 5324,
+ UNUSED,
+ UNUSED,
+ 12379,
+ UNUSED,
+ -845,
+ -1335,
+ 502,
+ 1497,
+ -1827,
+ 120,
+ 5867,
+ 0,
+ -99,
+ 0,
+ UNUSED,
+ -185,
+ 7964,
+ 502,
+ 6,
+ 8937,
+ UNUSED,
+ 5868,
+ 0,
+ 2094,
+ UNUSED,
+ 3890,
+ UNUSED,
+ 1495,
+ 7033,
+ 1310,
+ UNUSED,
+ 3612,
+ 7050,
+ UNUSED,
+ -958,
+ UNUSED,
+ 1804,
+ 3317,
+ 10446,
+ UNUSED,
+ 0,
+ -45,
+ 0,
+ UNUSED,
+ -4602,
+ 539,
+ 0,
+ 41,
+ 9886,
+ UNUSED,
+ UNUSED,
+ 422,
+ 11043,
+ 1362,
+ 815,
+ UNUSED,
+ UNUSED,
+ 1870,
+ 1962,
+ 676,
+ 0,
+ 1921,
+ 7075,
+ 586,
+ UNUSED,
+ 5061,
+ UNUSED,
+ 9450,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1340,
+ 0,
+ 9330,
+ -1303,
+ 0,
+ UNUSED,
+ 389,
+ -1073,
+ UNUSED,
+ 414,
+ 472,
+ 4843,
+ UNUSED,
+ 0,
+ UNUSED,
+ 10025,
+ 4350,
+ -501,
+ 384,
+ 1293,
+ 8243,
+ UNUSED,
+ -118,
+ 0,
+ -428,
+ 5667,
+ 990,
+ 2799,
+ 565,
+ 2410,
+ 0,
+ 669,
+ UNUSED,
+ 870,
+ 9277,
+ 8109,
+ 7234,
+ UNUSED,
+ 8627,
+ UNUSED,
+ UNUSED,
+ 1321,
+ 0,
+ 1200,
+ 129,
+ 7759,
+ 11283,
+ UNUSED,
+ 861,
+ UNUSED,
+ 0,
+ 2016,
+ UNUSED,
+ UNUSED,
+ 1530,
+ 2131,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 2901,
+ UNUSED,
+ 8931,
+ 664,
+ 5319,
+ UNUSED,
+ UNUSED,
+ 2181,
+ -1832,
+ 1543,
+ UNUSED,
+ 0,
+ 121,
+ UNUSED,
+ -73,
+ 658,
+ UNUSED,
+ UNUSED,
+ 7791,
+ UNUSED,
+ 1234,
+ 0,
+ 1467,
+ -1305,
+ UNUSED,
+ 5876,
+ 0,
+ 1945,
+ 73,
+ UNUSED,
+ 657,
+ -857,
+ -168,
+ UNUSED,
+ UNUSED,
+ 7330,
+ 7234,
+ UNUSED,
+ 223,
+ UNUSED,
+ UNUSED,
+ 2267,
+ UNUSED,
+ 2208,
+ UNUSED,
+ 5836,
+ UNUSED,
+ 7054,
+ 2127,
+ 1002,
+ 3220,
+ UNUSED,
+ 7699,
+ 6206,
+ 655,
+ -291,
+ 874,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 2012,
+ 5526,
+ 0,
+ UNUSED,
+ UNUSED,
+ 3402,
+ 214,
+ UNUSED,
+ 1519,
+ 2062,
+ UNUSED,
+ 7015,
+ 425,
+ UNUSED,
+ -1015,
+ 0,
+ 1163,
+ 6814,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 2196,
+ UNUSED,
+ UNUSED,
+ 1545,
+ 9763,
+ -2018,
+ 0,
+ -239,
+ 431,
+ 2116,
+ UNUSED,
+ -1479,
+ UNUSED,
+ 1246,
+ UNUSED,
+ 8046,
+ 2061,
+ 0,
+ 308,
+ 770,
+ 323,
+ UNUSED,
+ 198,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1895,
+ 0,
+ 6302,
+ UNUSED,
+ UNUSED,
+ 1095,
+ 1571,
+ 8396,
+ 594,
+ UNUSED,
+ UNUSED,
+ -21,
+ UNUSED,
+ 22,
+ UNUSED,
+ 0,
+ UNUSED,
+ -3182,
+ 2707,
+ 2675,
+ 1958,
+ 6177,
+ UNUSED,
+ -1150,
+ 0,
+ UNUSED,
+ 9528,
+ UNUSED,
+ UNUSED,
+ 2929,
+ 0,
+ UNUSED,
+ 1284,
+ -352,
+ UNUSED,
+ 1586,
+ 1827,
+ UNUSED,
+ 7548,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 919,
+ 9180,
+ UNUSED,
+ -41,
+ UNUSED,
+ 96,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1985,
+ 13335,
+ 0,
+ 8505,
+ 2542,
+ 11482,
+ 116,
+ 1558,
+ UNUSED,
+ -651,
+ 2274,
+ 0,
+ 1333,
+ 2475,
+ 7865,
+ 0,
+ 0,
+ 1801,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 72,
+ 3728,
+ 0,
+ 1457,
+ UNUSED,
+ UNUSED,
+ 912,
+ 0,
+ 7834,
+ 483,
+ UNUSED,
+ UNUSED,
+ 7309,
+ -341,
+ -17,
+ 2163,
+ UNUSED,
+ 878,
+ 1891,
+ 1398,
+ UNUSED,
+ 1354,
+ 1119,
+ UNUSED,
+ 1390,
+ 1697,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 3493,
+ -746,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 126,
+ 1006,
+ 6742,
+ UNUSED,
+ UNUSED,
+ 639,
+ 511,
+ 7505,
+ 1796,
+ 113,
+ UNUSED,
+ 1072,
+ 66,
+ UNUSED,
+ 1973,
+ 246,
+ -205,
+ 0,
+ 904,
+ 1409,
+ -17,
+ 8301,
+ 6456,
+ 0,
+ -147,
+ 853,
+ 12095,
+ UNUSED,
+ -940,
+ 2348,
+ 3089,
+ UNUSED,
+ 2199,
+ 7562,
+ UNUSED,
+ 3938,
+ 1920,
+ 1147,
+ UNUSED,
+ 640,
+ 0,
+ 2477,
+ 629,
+ 801,
+ 868,
+ UNUSED,
+ 0,
+ 0,
+ 1254,
+ UNUSED,
+ 2965,
+ UNUSED,
+ 3069,
+ UNUSED,
+ 1407,
+ 955,
+ UNUSED,
+ UNUSED,
+ 2360,
+ 9304,
+ 403,
+ 984,
+ 4876,
+ 772,
+ UNUSED,
+ -891,
+ -231,
+ 594,
+ 4740,
+ 0,
+ UNUSED,
+ 7446,
+ UNUSED,
+ 127,
+ UNUSED,
+ -268,
+ 1848,
+ 758,
+ UNUSED,
+ -1346,
+ 1017,
+ -273,
+ 1281,
+ UNUSED,
+ 7111,
+ 4709,
+ 3475,
+ -565,
+ UNUSED,
+ 1014,
+ 3456,
+ 1402,
+ -347,
+ 1959,
+ 1035,
+ UNUSED,
+ 1574,
+ 684,
+ 2593,
+ UNUSED,
+ 314,
+ 1155,
+ 655,
+ UNUSED,
+ 1067,
+ 1179,
+ UNUSED,
+ -997,
+ UNUSED,
+ UNUSED,
+ 7712,
+ -681,
+ 1611,
+ 480,
+ UNUSED,
+ UNUSED,
+ 879,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 5754,
+ 2981,
+ 6924,
+ 367,
+ 2125,
+ UNUSED,
+ 2342,
+ 14,
+ UNUSED,
+ UNUSED,
+ 7267,
+ 154,
+ 0,
+ UNUSED,
+ -1536,
+ UNUSED,
+ 0,
+ UNUSED,
+ 1552,
+ 683,
+ 6505,
+ UNUSED,
+ -718,
+ UNUSED,
+ 1393,
+ UNUSED,
+ -430,
+ 1172,
+ UNUSED,
+ 8590,
+ 9062,
+ 2024,
+ UNUSED,
+ UNUSED,
+ -1983,
+ UNUSED,
+ UNUSED,
+ 1395,
+ -2243,
+ -1014,
+ 7955,
+ 7535,
+ 220,
+ UNUSED,
+ UNUSED,
+ -387,
+ 1503,
+ 1602,
+ 259,
+ 0,
+ 6689,
+ -600,
+ 1403,
+ -3,
+ 4919,
+ 1937,
+ 6152,
+ 107,
+ UNUSED,
+ UNUSED,
+ 1057,
+ 0,
+ 5113,
+ UNUSED,
+ 1485,
+ 5817,
+ 841,
+ 248,
+ 6444,
+ 949,
+ 787,
+ 2418,
+ UNUSED,
+ UNUSED,
+ 799,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 3080,
+ 6397,
+ 10984,
+ UNUSED,
+ 7528,
+ 1665,
+ UNUSED,
+ UNUSED,
+ 1798,
+ 1040,
+ UNUSED,
+ UNUSED,
+ 1960,
+ UNUSED,
+ 5031,
+ -2878,
+ 11694,
+ UNUSED,
+ 956,
+ -542,
+ UNUSED,
+ UNUSED,
+ 630,
+ 12284,
+ 11750,
+ 533,
+ 1929,
+ 5238,
+ 371,
+ UNUSED,
+ 0,
+ 6606,
+ 2052,
+ -1123,
+ 669,
+ -119,
+ 785,
+ -1307,
+ 1730,
+ 8933,
+ -2247,
+ 1550,
+ UNUSED,
+ UNUSED,
+ 2441,
+ -24,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 680,
+ 9786,
+ 0,
+ 1600,
+ UNUSED,
+ UNUSED,
+ 1874,
+ 386,
+ UNUSED,
+ 1338,
+ 2826,
+ 6201,
+ 1356,
+ 713,
+ -332,
+ 1247,
+ UNUSED,
+ 1302,
+ 7395,
+ 264,
+ UNUSED,
+ UNUSED,
+ 1717,
+ UNUSED,
+ -596,
+ UNUSED,
+ -837,
+ 663,
+ 847,
+ UNUSED,
+ UNUSED,
+ 2703,
+ 2269,
+ 112,
+ 374,
+ 1037,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -668,
+ 8611,
+ UNUSED,
+ 3403,
+ 634,
+ -1489,
+ UNUSED,
+ 6527,
+ 4826,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 559,
+ 515,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 5141,
+ 2500,
+ 6982,
+ 0,
+ UNUSED,
+ -157,
+ UNUSED,
+ UNUSED,
+ 8217,
+ UNUSED,
+ -1,
+ UNUSED,
+ -226,
+ -772,
+ 7632,
+ 2240,
+ 11105,
+ 1776,
+ 322,
+ UNUSED,
+ 1352,
+ 655,
+ UNUSED,
+ UNUSED,
+ 3338,
+ UNUSED,
+ UNUSED,
+ 5685,
+ UNUSED,
+ 1650,
+ 185,
+ 668,
+ 1947,
+ 556,
+ 4864,
+ 2709,
+ UNUSED,
+ 1977,
+ UNUSED,
+ 1216,
+ -3725,
+ UNUSED,
+ 6353,
+ -129,
+ UNUSED,
+ 1772,
+ 8389,
+ UNUSED,
+ UNUSED,
+ 6694,
+ UNUSED,
+ 2058,
+ 2142,
+ -1372,
+ UNUSED,
+ UNUSED,
+ 1745,
+ 1608,
+ 231,
+ 98,
+ 7390,
+ UNUSED,
+ 8277,
+ UNUSED,
+ 203,
+ 804,
+ 118,
+ 5072,
+ 1153,
+ UNUSED,
+ 457,
+ 2017,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -5,
+ 865,
+ 2065,
+ 657,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 5049,
+ UNUSED,
+ 11665,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 1896,
+ 1651,
+ 739,
+ 446,
+ UNUSED,
+ 1994,
+ 1604,
+ UNUSED,
+ 1806,
+ 4885,
+ 97,
+ 7841,
+ 1759,
+ UNUSED,
+ 1511,
+ 224,
+ -1615,
+ UNUSED,
+ UNUSED,
+ 21,
+ 2209,
+ 1637,
+ 6706,
+ UNUSED,
+ 2249,
+ 190,
+ -920,
+ 8047,
+ 0,
+ 1062,
+ 432,
+ 1919,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ -868,
+ 2045,
+ UNUSED,
+ 8578,
+ UNUSED,
+ 1561,
+ UNUSED,
+ -275,
+ UNUSED,
+ 1629,
+ UNUSED,
+ 195,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1671,
+ 2188,
+ 9893,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 9388,
+ 7203,
+ 22,
+ 7620,
+ 6299,
+ 420,
+ UNUSED,
+ 3461,
+ 1106,
+ 1557,
+ -3377,
+ 6661,
+ 52,
+ 968,
+ UNUSED,
+ 506,
+ 0,
+ 1316,
+ 697,
+ 1512,
+ 1037,
+ 423,
+ UNUSED,
+ -1518,
+ UNUSED,
+ 149,
+ 0,
+ UNUSED,
+ 290,
+ 8157,
+ 1742,
+ 1446,
+ UNUSED,
+ UNUSED,
+ 8473,
+ 981,
+ 364,
+ 4394,
+ 682,
+ UNUSED,
+ 1937,
+ UNUSED,
+ 9972,
+ 7123,
+ UNUSED,
+ -849,
+ 1108,
+ UNUSED,
+ UNUSED,
+ 9046,
+ 925,
+ -982,
+ -880,
+ 2234,
+ 1105,
+ 1546,
+ 9521,
+ 47,
+ UNUSED,
+ UNUSED,
+ 32,
+ 408,
+ 1365,
+ 1003,
+ -267,
+ 1147,
+ 1549,
+ 2127,
+ -3612,
+ UNUSED,
+ UNUSED,
+ 555,
+ 956,
+ 2132,
+ 11038,
+ UNUSED,
+ UNUSED,
+ -1137,
+ 1447,
+ UNUSED,
+ -433,
+ UNUSED,
+ UNUSED,
+ -568,
+ 642,
+ 8653,
+ -2549,
+ 2793,
+ 2407,
+ -665,
+ -787,
+ -140,
+ UNUSED,
+ 971,
+ 1137,
+ UNUSED,
+ UNUSED,
+ 5948,
+ 0,
+ 1670,
+ 26,
+ 3613,
+ 2298,
+ UNUSED,
+ 12230,
+ 389,
+ UNUSED,
+ 1267,
+ UNUSED,
+ -457,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 8768,
+ UNUSED,
+ UNUSED,
+ 1128,
+ -429,
+ 3933,
+ 843,
+ 1005,
+ 1710,
+ -1204,
+ -296,
+ UNUSED,
+ 883,
+ -1086,
+ UNUSED,
+ 877,
+ 1562,
+ 6529,
+ UNUSED,
+ 1045,
+ UNUSED,
+ UNUSED,
+ 7728,
+ 2028,
+ -297,
+ 8244,
+ UNUSED,
+ 1110,
+ 4681,
+ 384,
+ 5945,
+ 3103,
+ 7121,
+ 1124,
+ 366,
+ 7864,
+ UNUSED,
+ 1885,
+ 9532,
+ UNUSED,
+ 3755,
+ 1338,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 3689,
+ -1207,
+ UNUSED,
+ 2049,
+ UNUSED,
+ 1025,
+ 266,
+ -602,
+ -18,
+ 3762,
+ UNUSED,
+ 778,
+ UNUSED,
+ UNUSED,
+ 1418,
+ UNUSED,
+ 1264,
+ 7271,
+ UNUSED,
+ UNUSED,
+ 8327,
+ UNUSED,
+ 960,
+ 1315,
+ UNUSED,
+ 2587,
+ UNUSED,
+ UNUSED,
+ 9821,
+ 4548,
+ 306,
+ 3107,
+ 2087,
+ UNUSED,
+ -11,
+ UNUSED,
+ 1611,
+ 12415,
+ 1437,
+ 774,
+ 347,
+ 2954,
+ 1106,
+ 1149,
+ 0,
+ UNUSED,
+ 1098,
+ 1212,
+ 8060,
+ 1904,
+ -706,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1782,
+ 2059,
+ UNUSED,
+ UNUSED,
+ 541,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -685,
+ UNUSED,
+ 1109,
+ UNUSED,
+ 262,
+ UNUSED,
+ UNUSED,
+ 1757,
+ UNUSED,
+ -2494,
+ 533,
+ 535,
+ 2894,
+ 1001,
+ UNUSED,
+ UNUSED,
+ 1691,
+ UNUSED,
+ 1865,
+ 1946,
+ 588,
+ 4338,
+ 1510,
+ 572,
+ UNUSED,
+ -3601,
+ 6938,
+ 1294,
+ 1762,
+ };
+ static const int16_t hash2[2048] = {
+ UNUSED,
+ UNUSED,
+ -4377,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1428,
+ -984,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ -9771,
+ -9272,
+ 0,
+ 2037,
+ UNUSED,
+ 0,
+ -2371,
+ UNUSED,
+ UNUSED,
+ 0,
+ -7594,
+ 0,
+ UNUSED,
+ UNUSED,
+ -2667,
+ UNUSED,
+ -8814,
+ -6297,
+ 0,
+ 0,
+ -1740,
+ UNUSED,
+ UNUSED,
+ 23,
+ 0,
+ 0,
+ -403,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 4801,
+ -6828,
+ -4752,
+ 0,
+ 926,
+ 0,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 2680,
+ -5470,
+ UNUSED,
+ UNUSED,
+ -5655,
+ -10620,
+ 0,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 996,
+ UNUSED,
+ 0,
+ 42,
+ 0,
+ 77,
+ 507,
+ 0,
+ 65,
+ -4354,
+ UNUSED,
+ UNUSED,
+ 509,
+ 0,
+ 0,
+ UNUSED,
+ 1729,
+ -4602,
+ 644,
+ 2638,
+ UNUSED,
+ -66,
+ 585,
+ 0,
+ 1562,
+ 0,
+ 0,
+ UNUSED,
+ -6266,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1572,
+ 0,
+ -187,
+ 999,
+ 0,
+ -5426,
+ -1288,
+ -9838,
+ 0,
+ 0,
+ 0,
+ -187,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ -1285,
+ 3658,
+ UNUSED,
+ 1283,
+ UNUSED,
+ 784,
+ UNUSED,
+ 2563,
+ 0,
+ -6284,
+ -810,
+ UNUSED,
+ -2974,
+ 0,
+ UNUSED,
+ 1209,
+ -10376,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 0,
+ -5950,
+ UNUSED,
+ 1133,
+ UNUSED,
+ -210,
+ -4481,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ -2235,
+ -770,
+ -2103,
+ UNUSED,
+ -4451,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ 427,
+ 0,
+ 1553,
+ 0,
+ 0,
+ 1280,
+ 0,
+ UNUSED,
+ UNUSED,
+ 25,
+ UNUSED,
+ 179,
+ UNUSED,
+ UNUSED,
+ 2149,
+ UNUSED,
+ -500,
+ 0,
+ 1274,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ -5179,
+ 0,
+ 1175,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -6758,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 361,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ -22,
+ -1382,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ -576,
+ -6812,
+ -4205,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ -41,
+ UNUSED,
+ 0,
+ UNUSED,
+ -6077,
+ 0,
+ -1533,
+ 0,
+ -281,
+ 0,
+ 207,
+ 1037,
+ -7053,
+ -7326,
+ -6741,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ -625,
+ UNUSED,
+ 0,
+ -1691,
+ -5804,
+ -616,
+ -1289,
+ UNUSED,
+ -2095,
+ 1940,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -1834,
+ -7248,
+ 0,
+ 0,
+ 0,
+ 219,
+ UNUSED,
+ 0,
+ 2508,
+ UNUSED,
+ UNUSED,
+ 0,
+ -1400,
+ 1204,
+ -5650,
+ 0,
+ -4881,
+ UNUSED,
+ -1761,
+ 0,
+ -7262,
+ UNUSED,
+ 1884,
+ 2516,
+ 80,
+ UNUSED,
+ UNUSED,
+ -931,
+ UNUSED,
+ -573,
+ 0,
+ UNUSED,
+ 0,
+ 221,
+ -4740,
+ -6670,
+ -4705,
+ UNUSED,
+ -4916,
+ 0,
+ 762,
+ UNUSED,
+ -6130,
+ 1034,
+ UNUSED,
+ 962,
+ -9557,
+ -1243,
+ UNUSED,
+ 3100,
+ 0,
+ 0,
+ UNUSED,
+ -6326,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -689,
+ UNUSED,
+ 376,
+ 0,
+ 2271,
+ -8653,
+ 410,
+ 0,
+ -489,
+ UNUSED,
+ 2895,
+ -6509,
+ UNUSED,
+ 0,
+ 146,
+ 4151,
+ -3215,
+ UNUSED,
+ 1406,
+ UNUSED,
+ 890,
+ 1516,
+ UNUSED,
+ UNUSED,
+ 0,
+ -3337,
+ 0,
+ -199,
+ UNUSED,
+ 0,
+ 831,
+ -5649,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 1362,
+ 403,
+ 0,
+ 0,
+ -11142,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ 142,
+ 0,
+ UNUSED,
+ -3679,
+ -1148,
+ UNUSED,
+ UNUSED,
+ 0,
+ 2044,
+ -552,
+ -985,
+ UNUSED,
+ 0,
+ UNUSED,
+ -6944,
+ 0,
+ UNUSED,
+ 7,
+ 0,
+ UNUSED,
+ -1709,
+ UNUSED,
+ 1694,
+ 0,
+ UNUSED,
+ 0,
+ 758,
+ UNUSED,
+ 0,
+ UNUSED,
+ 129,
+ UNUSED,
+ 1136,
+ -5188,
+ UNUSED,
+ -5809,
+ -5311,
+ 0,
+ 2209,
+ UNUSED,
+ 0,
+ 596,
+ UNUSED,
+ 2808,
+ 2232,
+ UNUSED,
+ 810,
+ 0,
+ 1656,
+ 1050,
+ -829,
+ 0,
+ UNUSED,
+ -7634,
+ UNUSED,
+ 1575,
+ UNUSED,
+ -9354,
+ 1402,
+ 792,
+ 0,
+ 2611,
+ -951,
+ UNUSED,
+ 852,
+ UNUSED,
+ 813,
+ 0,
+ 1845,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1567,
+ 0,
+ 1529,
+ 1776,
+ 1330,
+ -797,
+ 311,
+ 790,
+ 769,
+ -2517,
+ 66,
+ UNUSED,
+ -2199,
+ 1941,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 0,
+ 2250,
+ -6547,
+ 0,
+ -8407,
+ UNUSED,
+ 1077,
+ 742,
+ UNUSED,
+ 0,
+ 887,
+ 0,
+ 490,
+ UNUSED,
+ 0,
+ 2117,
+ UNUSED,
+ -767,
+ 2971,
+ 0,
+ -3407,
+ UNUSED,
+ 2218,
+ -5692,
+ 0,
+ UNUSED,
+ -1525,
+ UNUSED,
+ -2895,
+ 0,
+ UNUSED,
+ 1312,
+ UNUSED,
+ -1422,
+ 527,
+ 2021,
+ 0,
+ -129,
+ UNUSED,
+ UNUSED,
+ 0,
+ 949,
+ -3158,
+ UNUSED,
+ UNUSED,
+ -166,
+ -8299,
+ 0,
+ UNUSED,
+ UNUSED,
+ -6780,
+ 3151,
+ UNUSED,
+ UNUSED,
+ 1500,
+ 2046,
+ 2036,
+ 1763,
+ -11061,
+ 397,
+ 0,
+ -12785,
+ UNUSED,
+ -2828,
+ UNUSED,
+ -2901,
+ 1796,
+ -6471,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 1148,
+ -1980,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 3622,
+ -8207,
+ 476,
+ UNUSED,
+ UNUSED,
+ -3977,
+ -32,
+ -5096,
+ UNUSED,
+ 0,
+ -5577,
+ -2318,
+ 1554,
+ 649,
+ UNUSED,
+ UNUSED,
+ 438,
+ -4683,
+ -14755,
+ -5922,
+ 5503,
+ 1707,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -529,
+ 3833,
+ UNUSED,
+ 232,
+ UNUSED,
+ 0,
+ -9781,
+ 0,
+ UNUSED,
+ -686,
+ UNUSED,
+ -678,
+ 0,
+ UNUSED,
+ UNUSED,
+ -493,
+ 192,
+ -7637,
+ -6627,
+ UNUSED,
+ UNUSED,
+ -1219,
+ -679,
+ UNUSED,
+ -5268,
+ 0,
+ 1225,
+ 0,
+ 762,
+ 0,
+ -687,
+ UNUSED,
+ -311,
+ -140,
+ UNUSED,
+ -1262,
+ 1049,
+ UNUSED,
+ 0,
+ 0,
+ 0,
+ UNUSED,
+ -10,
+ UNUSED,
+ 0,
+ 1773,
+ UNUSED,
+ 0,
+ 0,
+ -5164,
+ UNUSED,
+ 0,
+ UNUSED,
+ -5063,
+ -538,
+ -5907,
+ UNUSED,
+ 481,
+ UNUSED,
+ -3573,
+ UNUSED,
+ 0,
+ -511,
+ -62,
+ UNUSED,
+ 0,
+ -977,
+ UNUSED,
+ UNUSED,
+ 0,
+ 245,
+ UNUSED,
+ -351,
+ -7710,
+ UNUSED,
+ -4030,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -4305,
+ 1230,
+ -8829,
+ 1871,
+ 0,
+ UNUSED,
+ 920,
+ UNUSED,
+ UNUSED,
+ 678,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -1343,
+ -5277,
+ UNUSED,
+ 2080,
+ -3150,
+ UNUSED,
+ -230,
+ -6413,
+ UNUSED,
+ -5861,
+ UNUSED,
+ 0,
+ 1270,
+ 819,
+ -4983,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -2564,
+ -800,
+ 3242,
+ 0,
+ UNUSED,
+ 0,
+ -6,
+ UNUSED,
+ -2382,
+ UNUSED,
+ -5512,
+ 1328,
+ 106,
+ 816,
+ 2139,
+ 565,
+ -647,
+ 635,
+ 1718,
+ 1329,
+ -1623,
+ UNUSED,
+ -5377,
+ 1823,
+ -3492,
+ -7813,
+ -4718,
+ 592,
+ 677,
+ UNUSED,
+ UNUSED,
+ 1146,
+ UNUSED,
+ -3392,
+ 3289,
+ 1815,
+ 0,
+ UNUSED,
+ -4256,
+ 0,
+ 504,
+ 1232,
+ 1896,
+ UNUSED,
+ 0,
+ 5367,
+ 489,
+ -5174,
+ -1491,
+ UNUSED,
+ 1724,
+ UNUSED,
+ 779,
+ UNUSED,
+ -8145,
+ UNUSED,
+ 0,
+ -1033,
+ -8288,
+ 2141,
+ UNUSED,
+ -777,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 2099,
+ -435,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -1407,
+ 0,
+ UNUSED,
+ -4032,
+ -7043,
+ -10318,
+ -4,
+ UNUSED,
+ 0,
+ 0,
+ UNUSED,
+ 3074,
+ UNUSED,
+ -6637,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1847,
+ -638,
+ -7323,
+ UNUSED,
+ -6445,
+ 0,
+ UNUSED,
+ -410,
+ 868,
+ UNUSED,
+ 2763,
+ 210,
+ UNUSED,
+ 4759,
+ UNUSED,
+ UNUSED,
+ 2394,
+ 0,
+ -949,
+ 441,
+ 0,
+ -6406,
+ -671,
+ UNUSED,
+ -4338,
+ UNUSED,
+ -1192,
+ UNUSED,
+ 0,
+ -2036,
+ -7505,
+ UNUSED,
+ -425,
+ 2137,
+ UNUSED,
+ 0,
+ 880,
+ UNUSED,
+ UNUSED,
+ -9732,
+ 1578,
+ UNUSED,
+ -7573,
+ -10141,
+ 1935,
+ -5213,
+ UNUSED,
+ -1351,
+ 0,
+ -52,
+ 0,
+ UNUSED,
+ UNUSED,
+ -1538,
+ UNUSED,
+ UNUSED,
+ -7777,
+ -1046,
+ -4613,
+ 153,
+ -2923,
+ -530,
+ UNUSED,
+ UNUSED,
+ -8716,
+ 1663,
+ 3353,
+ UNUSED,
+ -2024,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -7615,
+ 0,
+ 1512,
+ 0,
+ 1096,
+ 1851,
+ UNUSED,
+ 3941,
+ UNUSED,
+ -10749,
+ UNUSED,
+ UNUSED,
+ 960,
+ -439,
+ 0,
+ 0,
+ -4571,
+ 1616,
+ -7723,
+ -7380,
+ -1208,
+ 528,
+ 0,
+ -7842,
+ -1820,
+ UNUSED,
+ UNUSED,
+ -1975,
+ -8365,
+ 0,
+ 1253,
+ UNUSED,
+ -8840,
+ 0,
+ UNUSED,
+ UNUSED,
+ -1534,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1481,
+ UNUSED,
+ -2954,
+ UNUSED,
+ -865,
+ 923,
+ 4446,
+ 1801,
+ 22,
+ 2264,
+ UNUSED,
+ 306,
+ 1969,
+ 0,
+ 866,
+ 0,
+ 400,
+ UNUSED,
+ 1515,
+ -1817,
+ 1388,
+ 1926,
+ UNUSED,
+ 2104,
+ 387,
+ -11977,
+ 2176,
+ 1646,
+ UNUSED,
+ -9226,
+ UNUSED,
+ -8976,
+ 0,
+ -1028,
+ 418,
+ -298,
+ 1325,
+ UNUSED,
+ UNUSED,
+ 217,
+ UNUSED,
+ UNUSED,
+ 2150,
+ 809,
+ 1096,
+ 58,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1157,
+ UNUSED,
+ -86,
+ 855,
+ -6759,
+ UNUSED,
+ 862,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 194,
+ 1471,
+ 1665,
+ 0,
+ 856,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -107,
+ UNUSED,
+ -6444,
+ 1999,
+ -7186,
+ -8991,
+ UNUSED,
+ UNUSED,
+ 762,
+ UNUSED,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ 2619,
+ 826,
+ 1513,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1881,
+ -735,
+ -5636,
+ -4643,
+ UNUSED,
+ UNUSED,
+ -1783,
+ 1468,
+ UNUSED,
+ 890,
+ UNUSED,
+ -61,
+ -8629,
+ 0,
+ -104,
+ UNUSED,
+ 0,
+ -7562,
+ 0,
+ 1346,
+ 1635,
+ UNUSED,
+ UNUSED,
+ 421,
+ UNUSED,
+ -3040,
+ -357,
+ 1150,
+ -1113,
+ 147,
+ 990,
+ 348,
+ -5049,
+ 1346,
+ -7104,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 701,
+ -6115,
+ -9265,
+ 0,
+ 2777,
+ -2216,
+ -4253,
+ 0,
+ -6391,
+ 2483,
+ 1474,
+ 0,
+ 1305,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 2492,
+ -371,
+ -7757,
+ -1472,
+ UNUSED,
+ 398,
+ UNUSED,
+ 1228,
+ UNUSED,
+ -161,
+ 520,
+ 936,
+ UNUSED,
+ 1738,
+ 0,
+ UNUSED,
+ -4433,
+ 253,
+ UNUSED,
+ -1822,
+ UNUSED,
+ 430,
+ UNUSED,
+ 1747,
+ 892,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 556,
+ UNUSED,
+ -308,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 275,
+ UNUSED,
+ -748,
+ -6892,
+ -5911,
+ UNUSED,
+ -627,
+ -7132,
+ UNUSED,
+ UNUSED,
+ 0,
+ 1066,
+ 0,
+ UNUSED,
+ -10380,
+ -708,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1920,
+ UNUSED,
+ 1902,
+ -703,
+ UNUSED,
+ UNUSED,
+ 2496,
+ UNUSED,
+ 1782,
+ UNUSED,
+ UNUSED,
+ 0,
+ 4141,
+ UNUSED,
+ 1914,
+ -4324,
+ -318,
+ 1734,
+ -313,
+ 0,
+ 1400,
+ -7067,
+ 0,
+ UNUSED,
+ 386,
+ 2040,
+ 3663,
+ 2184,
+ UNUSED,
+ -2281,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1462,
+ 0,
+ -138,
+ -221,
+ UNUSED,
+ 0,
+ -3745,
+ -9862,
+ -828,
+ UNUSED,
+ 4992,
+ 2055,
+ 0,
+ 953,
+ UNUSED,
+ -7443,
+ -579,
+ 859,
+ UNUSED,
+ 0,
+ 1512,
+ 0,
+ -767,
+ 953,
+ 1548,
+ 1034,
+ 1177,
+ UNUSED,
+ -696,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 136,
+ -610,
+ -7020,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 29,
+ -7119,
+ 260,
+ 0,
+ 2577,
+ UNUSED,
+ 2187,
+ UNUSED,
+ -5556,
+ -6168,
+ UNUSED,
+ 50,
+ UNUSED,
+ 1029,
+ UNUSED,
+ UNUSED,
+ 862,
+ 885,
+ UNUSED,
+ -1922,
+ UNUSED,
+ 45,
+ 1953,
+ UNUSED,
+ 0,
+ -2598,
+ 828,
+ -974,
+ 1020,
+ UNUSED,
+ 544,
+ UNUSED,
+ 100,
+ 1162,
+ 0,
+ UNUSED,
+ 0,
+ -4334,
+ 711,
+ UNUSED,
+ UNUSED,
+ -1498,
+ 1856,
+ UNUSED,
+ -1125,
+ UNUSED,
+ -4870,
+ UNUSED,
+ -6288,
+ 648,
+ 814,
+ UNUSED,
+ -739,
+ 0,
+ 388,
+ 117,
+ -1147,
+ -3044,
+ -12076,
+ UNUSED,
+ 1682,
+ 2200,
+ -4996,
+ UNUSED,
+ -4977,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -1485,
+ -6978,
+ 1742,
+ 1951,
+ UNUSED,
+ -1036,
+ 1171,
+ UNUSED,
+ 801,
+ UNUSED,
+ 1960,
+ -119,
+ UNUSED,
+ -1956,
+ -1894,
+ 350,
+ -696,
+ UNUSED,
+ 0,
+ -6481,
+ 227,
+ 1720,
+ 0,
+ 1712,
+ 2391,
+ UNUSED,
+ UNUSED,
+ -371,
+ 0,
+ 987,
+ -48,
+ UNUSED,
+ 977,
+ -121,
+ 1352,
+ UNUSED,
+ -103,
+ -1398,
+ UNUSED,
+ 2372,
+ -3635,
+ 0,
+ 299,
+ -6317,
+ -4574,
+ 568,
+ -283,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1847,
+ 0,
+ UNUSED,
+ 1441,
+ -354,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1554,
+ -6179,
+ 0,
+ 491,
+ UNUSED,
+ -6777,
+ 877,
+ UNUSED,
+ -1874,
+ 606,
+ 711,
+ UNUSED,
+ 0,
+ -3385,
+ UNUSED,
+ -5925,
+ UNUSED,
+ 4810,
+ UNUSED,
+ 830,
+ -2086,
+ -4620,
+ UNUSED,
+ UNUSED,
+ 193,
+ -3544,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -6758,
+ 57,
+ -14713,
+ -4531,
+ -5600,
+ 1501,
+ -1287,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -7264,
+ UNUSED,
+ UNUSED,
+ -1668,
+ -6054,
+ 2162,
+ 529,
+ 1613,
+ 887,
+ -8928,
+ UNUSED,
+ -5256,
+ 989,
+ UNUSED,
+ -1339,
+ 2052,
+ UNUSED,
+ 568,
+ 4806,
+ 0,
+ -1546,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 395,
+ UNUSED,
+ 1869,
+ 5355,
+ UNUSED,
+ UNUSED,
+ -1218,
+ -6017,
+ 1576,
+ -6843,
+ UNUSED,
+ -21,
+ 0,
+ UNUSED,
+ UNUSED,
+ 2051,
+ UNUSED,
+ -699,
+ 1841,
+ -2940,
+ -6413,
+ 1597,
+ 1949,
+ 887,
+ 269,
+ UNUSED,
+ 2230,
+ 1291,
+ UNUSED,
+ -253,
+ 637,
+ UNUSED,
+ -6458,
+ 557,
+ -12385,
+ -6125,
+ -5021,
+ -5026,
+ 1826,
+ UNUSED,
+ UNUSED,
+ -7232,
+ -1614,
+ -2257,
+ 1895,
+ UNUSED,
+ UNUSED,
+ 2215,
+ 824,
+ 752,
+ -297,
+ 4756,
+ 836,
+ 972,
+ UNUSED,
+ -5552,
+ -1267,
+ UNUSED,
+ 396,
+ UNUSED,
+ UNUSED,
+ 2248,
+ 1695,
+ 2228,
+ 1960,
+ UNUSED,
+ 0,
+ UNUSED,
+ 0,
+ 187,
+ 321,
+ 303,
+ 1524,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1540,
+ 375,
+ UNUSED,
+ 1952,
+ 1642,
+ UNUSED,
+ -4746,
+ 800,
+ 2776,
+ 3123,
+ 2209,
+ -5751,
+ 346,
+ 199,
+ -3182,
+ 2119,
+ UNUSED,
+ 944,
+ 258,
+ 0,
+ -238,
+ -5240,
+ 1874,
+ 1814,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1173,
+ UNUSED,
+ -2123,
+ 1364,
+ 560,
+ -3764,
+ 837,
+ 1540,
+ 989,
+ UNUSED,
+ 393,
+ 1584,
+ -5563,
+ -5645,
+ 1336,
+ -680,
+ -990,
+ UNUSED,
+ UNUSED,
+ -606,
+ 480,
+ 1335,
+ 111,
+ -994,
+ 0,
+ UNUSED,
+ 3541,
+ UNUSED,
+ 132,
+ UNUSED,
+ -9303,
+ 390,
+ -6033,
+ 1945,
+ UNUSED,
+ -5182,
+ 0,
+ UNUSED,
+ 1974,
+ 2101,
+ UNUSED,
+ 483,
+ 265,
+ -9193,
+ 592,
+ UNUSED,
+ UNUSED,
+ -6411,
+ 415,
+ 909,
+ 2207,
+ 202,
+ 1569,
+ UNUSED,
+ 382,
+ UNUSED,
+ 0,
+ UNUSED,
+ UNUSED,
+ -8097,
+ UNUSED,
+ 0,
+ -227,
+ 482,
+ 2027,
+ UNUSED,
+ -160,
+ 592,
+ -559,
+ 464,
+ -4773,
+ 965,
+ 986,
+ -6729,
+ UNUSED,
+ 2163,
+ -1302,
+ 559,
+ 790,
+ UNUSED,
+ UNUSED,
+ -534,
+ UNUSED,
+ 952,
+ 1506,
+ UNUSED,
+ 616,
+ -9957,
+ UNUSED,
+ 60,
+ 161,
+ 1771,
+ UNUSED,
+ UNUSED,
+ 48,
+ -1134,
+ -254,
+ -712,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -699,
+ -8494,
+ 48,
+ -8271,
+ UNUSED,
+ UNUSED,
+ 1581,
+ UNUSED,
+ -1899,
+ UNUSED,
+ 1456,
+ -8000,
+ UNUSED,
+ 1529,
+ 651,
+ -1000,
+ 841,
+ -6453,
+ -4226,
+ -1508,
+ 1842,
+ UNUSED,
+ 2067,
+ -746,
+ 87,
+ -601,
+ 1258,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 711,
+ -4573,
+ 280,
+ -5696,
+ UNUSED,
+ -6034,
+ 1817,
+ 0,
+ UNUSED,
+ 704,
+ 3119,
+ -4576,
+ 2221,
+ 4182,
+ 246,
+ -5038,
+ UNUSED,
+ UNUSED,
+ 554,
+ UNUSED,
+ 569,
+ 911,
+ UNUSED,
+ 613,
+ UNUSED,
+ UNUSED,
+ -4541,
+ -476,
+ -9963,
+ 997,
+ 124,
+ UNUSED,
+ 456,
+ 2133,
+ 120,
+ 1993,
+ -10933,
+ -129,
+ UNUSED,
+ 556,
+ UNUSED,
+ -8660,
+ 1093,
+ -6113,
+ 2777,
+ -19,
+ -5284,
+ UNUSED,
+ UNUSED,
+ 930,
+ 825,
+ -18,
+ -6603,
+ -10011,
+ 882,
+ 1018,
+ -6595,
+ UNUSED,
+ -7398,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -1091,
+ 250,
+ -1616,
+ 845,
+ -8205,
+ 2200,
+ -8440,
+ -130,
+ UNUSED,
+ -5529,
+ UNUSED,
+ 43,
+ UNUSED,
+ -1958,
+ UNUSED,
+ -10917,
+ -7339,
+ UNUSED,
+ 1875,
+ 1586,
+ UNUSED,
+ -265,
+ -5545,
+ 10,
+ 432,
+ -78,
+ -11393,
+ 789,
+ UNUSED,
+ -7487,
+ -1303,
+ UNUSED,
+ UNUSED,
+ -4639,
+ 144,
+ -12097,
+ 206,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 4219,
+ 458,
+ 0,
+ -3071,
+ UNUSED,
+ UNUSED,
+ -7365,
+ 1382,
+ -918,
+ -2140,
+ -771,
+ 0,
+ -193,
+ 103,
+ -331,
+ 0,
+ UNUSED,
+ -8161,
+ 633,
+ -11042,
+ -149,
+ 2173,
+ 3043,
+ -3034,
+ -4154,
+ -6214,
+ -1121,
+ UNUSED,
+ 1807,
+ 1825,
+ 94,
+ UNUSED,
+ -293,
+ UNUSED,
+ 497,
+ UNUSED,
+ 532,
+ 1396,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1555,
+ 40,
+ -5538,
+ 1355,
+ 0,
+ UNUSED,
+ 771,
+ 692,
+ -7163,
+ 2122,
+ -1534,
+ 395,
+ UNUSED,
+ 1334,
+ 1736,
+ UNUSED,
+ UNUSED,
+ 754,
+ 247,
+ 1344,
+ -13,
+ UNUSED,
+ 1372,
+ UNUSED,
+ -428,
+ 2159,
+ UNUSED,
+ UNUSED,
+ -1074,
+ 5383,
+ 1095,
+ 226,
+ UNUSED,
+ -1055,
+ UNUSED,
+ 0,
+ UNUSED,
+ 1413,
+ 873,
+ 83,
+ -468,
+ 2070,
+ UNUSED,
+ -1995,
+ 1715,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1303,
+ 53,
+ UNUSED,
+ -6009,
+ 486,
+ 512,
+ -10194,
+ UNUSED,
+ -2082,
+ UNUSED,
+ UNUSED,
+ -764,
+ 3208,
+ UNUSED,
+ UNUSED,
+ -7179,
+ 50,
+ 2025,
+ 733,
+ 319,
+ -208,
+ UNUSED,
+ 242,
+ 1304,
+ UNUSED,
+ -2188,
+ UNUSED,
+ UNUSED,
+ 664,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1907,
+ 2083,
+ 1354,
+ UNUSED,
+ UNUSED,
+ -278,
+ 1629,
+ UNUSED,
+ 1630,
+ -5126,
+ UNUSED,
+ UNUSED,
+ 175,
+ 443,
+ 254,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1777,
+ -558,
+ UNUSED,
+ 764,
+ UNUSED,
+ 1242,
+ -2798,
+ 1554,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ -4652,
+ 1790,
+ 616,
+ 3969,
+ -3305,
+ 876,
+ UNUSED,
+ -4718,
+ 1046,
+ UNUSED,
+ 2120,
+ -1760,
+ -5600,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1407,
+ 1267,
+ 1460,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 625,
+ 1982,
+ 715,
+ -678,
+ UNUSED,
+ 905,
+ -5605,
+ 1978,
+ 478,
+ -2454,
+ 941,
+ 0,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 1454,
+ 1511,
+ 1134,
+ -435,
+ 1570,
+ UNUSED,
+ 529,
+ 715,
+ -1981,
+ UNUSED,
+ UNUSED,
+ 1690,
+ 2107,
+ UNUSED,
+ -4814,
+ -1673,
+ 2238,
+ 1706,
+ UNUSED,
+ 356,
+ 2064,
+ -4497,
+ -6650,
+ -628,
+ 10,
+ -1111,
+ UNUSED,
+ -8057,
+ -6255,
+ -103,
+ UNUSED,
+ 1434,
+ 553,
+ 360,
+ 1167,
+ 908,
+ 839,
+ 1859,
+ 546,
+ 1499,
+ UNUSED,
+ -5594,
+ 1266,
+ 1364,
+ -6742,
+ 410,
+ UNUSED,
+ -7282,
+ UNUSED,
+ UNUSED,
+ -1940,
+ 1480,
+ 2430,
+ 1212,
+ 1957,
+ 1898,
+ UNUSED,
+ 1337,
+ UNUSED,
+ UNUSED,
+ 1813,
+ UNUSED,
+ 1163,
+ 888,
+ 805,
+ UNUSED,
+ UNUSED,
+ -9007,
+ -1004,
+ 484,
+ -6314,
+ 644,
+ UNUSED,
+ 1458,
+ 529,
+ 2684,
+ 323,
+ UNUSED,
+ 68,
+ 1019,
+ 415,
+ 35,
+ -3864,
+ -1538,
+ UNUSED,
+ 1017,
+ UNUSED,
+ 773,
+ 1122,
+ 2326,
+ UNUSED,
+ -1477,
+ -8611,
+ UNUSED,
+ 3167,
+ UNUSED,
+ UNUSED,
+ UNUSED,
+ 294,
+ 1135,
+ -7098,
+ 2135,
+ 257,
+ UNUSED,
+ -1217,
+ -6172,
+ UNUSED,
+ 801,
+ 1227,
+ -6893,
+ -8186,
+ UNUSED,
+ 1585,
+ 2005,
+ 1955,
+ -1886,
+ -209,
+ UNUSED,
+ UNUSED,
+ 453,
+ UNUSED,
+ -853,
+ 2176,
+ 1596,
+ 829,
+ -792,
+ -10623,
+ -5255,
+ 637,
+ UNUSED,
+ 803,
+ UNUSED,
+ 1343,
+ 820,
+ -5964,
+ -39,
+ UNUSED,
+ UNUSED,
+ -9029,
+ 211,
+ -8104,
+ 407,
+ UNUSED,
+ 1038,
+ 1658,
+ 102,
+ UNUSED,
+ UNUSED,
+ 137,
+ -9562,
+ UNUSED,
+ 1894,
+ -2483,
+ 1820,
+ 1059,
+ 921,
+ UNUSED,
+ -4361,
+ UNUSED,
+ };
+ static const struct tokendata tokendata[2283] = {
+ { "db", TOKEN_INSN, C_none, 0, I_DB },
+ { "dw", TOKEN_INSN, C_none, 0, I_DW },
+ { "dd", TOKEN_INSN, C_none, 0, I_DD },
+ { "dq", TOKEN_INSN, C_none, 0, I_DQ },
+ { "dt", TOKEN_INSN, C_none, 0, I_DT },
+ { "do", TOKEN_INSN, C_none, 0, I_DO },
+ { "dy", TOKEN_INSN, C_none, 0, I_DY },
+ { "dz", TOKEN_INSN, C_none, 0, I_DZ },
+ { "resb", TOKEN_INSN, C_none, 0, I_RESB },
+ { "resw", TOKEN_INSN, C_none, 0, I_RESW },
+ { "resd", TOKEN_INSN, C_none, 0, I_RESD },
+ { "resq", TOKEN_INSN, C_none, 0, I_RESQ },
+ { "rest", TOKEN_INSN, C_none, 0, I_REST },
+ { "reso", TOKEN_INSN, C_none, 0, I_RESO },
+ { "resy", TOKEN_INSN, C_none, 0, I_RESY },
+ { "resz", TOKEN_INSN, C_none, 0, I_RESZ },
+ { "incbin", TOKEN_INSN, C_none, 0, I_INCBIN },
+ { "aaa", TOKEN_INSN, C_none, 0, I_AAA },
+ { "aad", TOKEN_INSN, C_none, 0, I_AAD },
+ { "aam", TOKEN_INSN, C_none, 0, I_AAM },
+ { "aas", TOKEN_INSN, C_none, 0, I_AAS },
+ { "adc", TOKEN_INSN, C_none, 0, I_ADC },
+ { "add", TOKEN_INSN, C_none, 0, I_ADD },
+ { "and", TOKEN_INSN, C_none, 0, I_AND },
+ { "arpl", TOKEN_INSN, C_none, 0, I_ARPL },
+ { "bb0_reset", TOKEN_INSN, C_none, 0, I_BB0_RESET },
+ { "bb1_reset", TOKEN_INSN, C_none, 0, I_BB1_RESET },
+ { "bound", TOKEN_INSN, C_none, 0, I_BOUND },
+ { "bsf", TOKEN_INSN, C_none, 0, I_BSF },
+ { "bsr", TOKEN_INSN, C_none, 0, I_BSR },
+ { "bswap", TOKEN_INSN, C_none, 0, I_BSWAP },
+ { "bt", TOKEN_INSN, C_none, 0, I_BT },
+ { "btc", TOKEN_INSN, C_none, 0, I_BTC },
+ { "btr", TOKEN_INSN, C_none, 0, I_BTR },
+ { "bts", TOKEN_INSN, C_none, 0, I_BTS },
+ { "call", TOKEN_INSN, C_none, 0, I_CALL },
+ { "cbw", TOKEN_INSN, C_none, 0, I_CBW },
+ { "cdq", TOKEN_INSN, C_none, 0, I_CDQ },
+ { "cdqe", TOKEN_INSN, C_none, 0, I_CDQE },
+ { "clc", TOKEN_INSN, C_none, 0, I_CLC },
+ { "cld", TOKEN_INSN, C_none, 0, I_CLD },
+ { "cli", TOKEN_INSN, C_none, 0, I_CLI },
+ { "clts", TOKEN_INSN, C_none, 0, I_CLTS },
+ { "cmc", TOKEN_INSN, C_none, 0, I_CMC },
+ { "cmp", TOKEN_INSN, C_none, 0, I_CMP },
+ { "cmpsb", TOKEN_INSN, C_none, 0, I_CMPSB },
+ { "cmpsd", TOKEN_INSN, C_none, 0, I_CMPSD },
+ { "cmpsq", TOKEN_INSN, C_none, 0, I_CMPSQ },
+ { "cmpsw", TOKEN_INSN, C_none, 0, I_CMPSW },
+ { "cmpxchg", TOKEN_INSN, C_none, 0, I_CMPXCHG },
+ { "cmpxchg486", TOKEN_INSN, C_none, 0, I_CMPXCHG486 },
+ { "cmpxchg8b", TOKEN_INSN, C_none, 0, I_CMPXCHG8B },
+ { "cmpxchg16b", TOKEN_INSN, C_none, 0, I_CMPXCHG16B },
+ { "cpuid", TOKEN_INSN, C_none, 0, I_CPUID },
+ { "cpu_read", TOKEN_INSN, C_none, 0, I_CPU_READ },
+ { "cpu_write", TOKEN_INSN, C_none, 0, I_CPU_WRITE },
+ { "cqo", TOKEN_INSN, C_none, 0, I_CQO },
+ { "cwd", TOKEN_INSN, C_none, 0, I_CWD },
+ { "cwde", TOKEN_INSN, C_none, 0, I_CWDE },
+ { "daa", TOKEN_INSN, C_none, 0, I_DAA },
+ { "das", TOKEN_INSN, C_none, 0, I_DAS },
+ { "dec", TOKEN_INSN, C_none, 0, I_DEC },
+ { "div", TOKEN_INSN, C_none, 0, I_DIV },
+ { "dmint", TOKEN_INSN, C_none, 0, I_DMINT },
+ { "emms", TOKEN_INSN, C_none, 0, I_EMMS },
+ { "enter", TOKEN_INSN, C_none, 0, I_ENTER },
+ { "equ", TOKEN_INSN, C_none, 0, I_EQU },
+ { "f2xm1", TOKEN_INSN, C_none, 0, I_F2XM1 },
+ { "fabs", TOKEN_INSN, C_none, 0, I_FABS },
+ { "fadd", TOKEN_INSN, C_none, 0, I_FADD },
+ { "faddp", TOKEN_INSN, C_none, 0, I_FADDP },
+ { "fbld", TOKEN_INSN, C_none, 0, I_FBLD },
+ { "fbstp", TOKEN_INSN, C_none, 0, I_FBSTP },
+ { "fchs", TOKEN_INSN, C_none, 0, I_FCHS },
+ { "fclex", TOKEN_INSN, C_none, 0, I_FCLEX },
+ { "fcmovb", TOKEN_INSN, C_none, 0, I_FCMOVB },
+ { "fcmovbe", TOKEN_INSN, C_none, 0, I_FCMOVBE },
+ { "fcmove", TOKEN_INSN, C_none, 0, I_FCMOVE },
+ { "fcmovnb", TOKEN_INSN, C_none, 0, I_FCMOVNB },
+ { "fcmovnbe", TOKEN_INSN, C_none, 0, I_FCMOVNBE },
+ { "fcmovne", TOKEN_INSN, C_none, 0, I_FCMOVNE },
+ { "fcmovnu", TOKEN_INSN, C_none, 0, I_FCMOVNU },
+ { "fcmovu", TOKEN_INSN, C_none, 0, I_FCMOVU },
+ { "fcom", TOKEN_INSN, C_none, 0, I_FCOM },
+ { "fcomi", TOKEN_INSN, C_none, 0, I_FCOMI },
+ { "fcomip", TOKEN_INSN, C_none, 0, I_FCOMIP },
+ { "fcomp", TOKEN_INSN, C_none, 0, I_FCOMP },
+ { "fcompp", TOKEN_INSN, C_none, 0, I_FCOMPP },
+ { "fcos", TOKEN_INSN, C_none, 0, I_FCOS },
+ { "fdecstp", TOKEN_INSN, C_none, 0, I_FDECSTP },
+ { "fdisi", TOKEN_INSN, C_none, 0, I_FDISI },
+ { "fdiv", TOKEN_INSN, C_none, 0, I_FDIV },
+ { "fdivp", TOKEN_INSN, C_none, 0, I_FDIVP },
+ { "fdivr", TOKEN_INSN, C_none, 0, I_FDIVR },
+ { "fdivrp", TOKEN_INSN, C_none, 0, I_FDIVRP },
+ { "femms", TOKEN_INSN, C_none, 0, I_FEMMS },
+ { "feni", TOKEN_INSN, C_none, 0, I_FENI },
+ { "ffree", TOKEN_INSN, C_none, 0, I_FFREE },
+ { "ffreep", TOKEN_INSN, C_none, 0, I_FFREEP },
+ { "fiadd", TOKEN_INSN, C_none, 0, I_FIADD },
+ { "ficom", TOKEN_INSN, C_none, 0, I_FICOM },
+ { "ficomp", TOKEN_INSN, C_none, 0, I_FICOMP },
+ { "fidiv", TOKEN_INSN, C_none, 0, I_FIDIV },
+ { "fidivr", TOKEN_INSN, C_none, 0, I_FIDIVR },
+ { "fild", TOKEN_INSN, C_none, 0, I_FILD },
+ { "fimul", TOKEN_INSN, C_none, 0, I_FIMUL },
+ { "fincstp", TOKEN_INSN, C_none, 0, I_FINCSTP },
+ { "finit", TOKEN_INSN, C_none, 0, I_FINIT },
+ { "fist", TOKEN_INSN, C_none, 0, I_FIST },
+ { "fistp", TOKEN_INSN, C_none, 0, I_FISTP },
+ { "fisttp", TOKEN_INSN, C_none, 0, I_FISTTP },
+ { "fisub", TOKEN_INSN, C_none, 0, I_FISUB },
+ { "fisubr", TOKEN_INSN, C_none, 0, I_FISUBR },
+ { "fld", TOKEN_INSN, C_none, 0, I_FLD },
+ { "fld1", TOKEN_INSN, C_none, 0, I_FLD1 },
+ { "fldcw", TOKEN_INSN, C_none, 0, I_FLDCW },
+ { "fldenv", TOKEN_INSN, C_none, 0, I_FLDENV },
+ { "fldl2e", TOKEN_INSN, C_none, 0, I_FLDL2E },
+ { "fldl2t", TOKEN_INSN, C_none, 0, I_FLDL2T },
+ { "fldlg2", TOKEN_INSN, C_none, 0, I_FLDLG2 },
+ { "fldln2", TOKEN_INSN, C_none, 0, I_FLDLN2 },
+ { "fldpi", TOKEN_INSN, C_none, 0, I_FLDPI },
+ { "fldz", TOKEN_INSN, C_none, 0, I_FLDZ },
+ { "fmul", TOKEN_INSN, C_none, 0, I_FMUL },
+ { "fmulp", TOKEN_INSN, C_none, 0, I_FMULP },
+ { "fnclex", TOKEN_INSN, C_none, 0, I_FNCLEX },
+ { "fndisi", TOKEN_INSN, C_none, 0, I_FNDISI },
+ { "fneni", TOKEN_INSN, C_none, 0, I_FNENI },
+ { "fninit", TOKEN_INSN, C_none, 0, I_FNINIT },
+ { "fnop", TOKEN_INSN, C_none, 0, I_FNOP },
+ { "fnsave", TOKEN_INSN, C_none, 0, I_FNSAVE },
+ { "fnstcw", TOKEN_INSN, C_none, 0, I_FNSTCW },
+ { "fnstenv", TOKEN_INSN, C_none, 0, I_FNSTENV },
+ { "fnstsw", TOKEN_INSN, C_none, 0, I_FNSTSW },
+ { "fpatan", TOKEN_INSN, C_none, 0, I_FPATAN },
+ { "fprem", TOKEN_INSN, C_none, 0, I_FPREM },
+ { "fprem1", TOKEN_INSN, C_none, 0, I_FPREM1 },
+ { "fptan", TOKEN_INSN, C_none, 0, I_FPTAN },
+ { "frndint", TOKEN_INSN, C_none, 0, I_FRNDINT },
+ { "frstor", TOKEN_INSN, C_none, 0, I_FRSTOR },
+ { "fsave", TOKEN_INSN, C_none, 0, I_FSAVE },
+ { "fscale", TOKEN_INSN, C_none, 0, I_FSCALE },
+ { "fsetpm", TOKEN_INSN, C_none, 0, I_FSETPM },
+ { "fsin", TOKEN_INSN, C_none, 0, I_FSIN },
+ { "fsincos", TOKEN_INSN, C_none, 0, I_FSINCOS },
+ { "fsqrt", TOKEN_INSN, C_none, 0, I_FSQRT },
+ { "fst", TOKEN_INSN, C_none, 0, I_FST },
+ { "fstcw", TOKEN_INSN, C_none, 0, I_FSTCW },
+ { "fstenv", TOKEN_INSN, C_none, 0, I_FSTENV },
+ { "fstp", TOKEN_INSN, C_none, 0, I_FSTP },
+ { "fstsw", TOKEN_INSN, C_none, 0, I_FSTSW },
+ { "fsub", TOKEN_INSN, C_none, 0, I_FSUB },
+ { "fsubp", TOKEN_INSN, C_none, 0, I_FSUBP },
+ { "fsubr", TOKEN_INSN, C_none, 0, I_FSUBR },
+ { "fsubrp", TOKEN_INSN, C_none, 0, I_FSUBRP },
+ { "ftst", TOKEN_INSN, C_none, 0, I_FTST },
+ { "fucom", TOKEN_INSN, C_none, 0, I_FUCOM },
+ { "fucomi", TOKEN_INSN, C_none, 0, I_FUCOMI },
+ { "fucomip", TOKEN_INSN, C_none, 0, I_FUCOMIP },
+ { "fucomp", TOKEN_INSN, C_none, 0, I_FUCOMP },
+ { "fucompp", TOKEN_INSN, C_none, 0, I_FUCOMPP },
+ { "fxam", TOKEN_INSN, C_none, 0, I_FXAM },
+ { "fxch", TOKEN_INSN, C_none, 0, I_FXCH },
+ { "fxtract", TOKEN_INSN, C_none, 0, I_FXTRACT },
+ { "fyl2x", TOKEN_INSN, C_none, 0, I_FYL2X },
+ { "fyl2xp1", TOKEN_INSN, C_none, 0, I_FYL2XP1 },
+ { "hlt", TOKEN_INSN, C_none, 0, I_HLT },
+ { "ibts", TOKEN_INSN, C_none, 0, I_IBTS },
+ { "icebp", TOKEN_INSN, C_none, 0, I_ICEBP },
+ { "idiv", TOKEN_INSN, C_none, 0, I_IDIV },
+ { "imul", TOKEN_INSN, C_none, 0, I_IMUL },
+ { "in", TOKEN_INSN, C_none, 0, I_IN },
+ { "inc", TOKEN_INSN, C_none, 0, I_INC },
+ { "insb", TOKEN_INSN, C_none, 0, I_INSB },
+ { "insd", TOKEN_INSN, C_none, 0, I_INSD },
+ { "insw", TOKEN_INSN, C_none, 0, I_INSW },
+ { "int", TOKEN_INSN, C_none, 0, I_INT },
+ { "int01", TOKEN_INSN, C_none, 0, I_INT01 },
+ { "int1", TOKEN_INSN, C_none, 0, I_INT1 },
+ { "int03", TOKEN_INSN, C_none, 0, I_INT03 },
+ { "int3", TOKEN_INSN, C_none, 0, I_INT3 },
+ { "into", TOKEN_INSN, C_none, 0, I_INTO },
+ { "invd", TOKEN_INSN, C_none, 0, I_INVD },
+ { "invpcid", TOKEN_INSN, C_none, 0, I_INVPCID },
+ { "invlpg", TOKEN_INSN, C_none, 0, I_INVLPG },
+ { "invlpga", TOKEN_INSN, C_none, 0, I_INVLPGA },
+ { "iret", TOKEN_INSN, C_none, 0, I_IRET },
+ { "iretd", TOKEN_INSN, C_none, 0, I_IRETD },
+ { "iretq", TOKEN_INSN, C_none, 0, I_IRETQ },
+ { "iretw", TOKEN_INSN, C_none, 0, I_IRETW },
+ { "jcxz", TOKEN_INSN, C_none, 0, I_JCXZ },
+ { "jecxz", TOKEN_INSN, C_none, 0, I_JECXZ },
+ { "jrcxz", TOKEN_INSN, C_none, 0, I_JRCXZ },
+ { "jmp", TOKEN_INSN, C_none, 0, I_JMP },
+ { "jmpe", TOKEN_INSN, C_none, 0, I_JMPE },
+ { "lahf", TOKEN_INSN, C_none, 0, I_LAHF },
+ { "lar", TOKEN_INSN, C_none, 0, I_LAR },
+ { "lds", TOKEN_INSN, C_none, 0, I_LDS },
+ { "lea", TOKEN_INSN, C_none, 0, I_LEA },
+ { "leave", TOKEN_INSN, C_none, 0, I_LEAVE },
+ { "les", TOKEN_INSN, C_none, 0, I_LES },
+ { "lfence", TOKEN_INSN, C_none, 0, I_LFENCE },
+ { "lfs", TOKEN_INSN, C_none, 0, I_LFS },
+ { "lgdt", TOKEN_INSN, C_none, 0, I_LGDT },
+ { "lgs", TOKEN_INSN, C_none, 0, I_LGS },
+ { "lidt", TOKEN_INSN, C_none, 0, I_LIDT },
+ { "lldt", TOKEN_INSN, C_none, 0, I_LLDT },
+ { "lmsw", TOKEN_INSN, C_none, 0, I_LMSW },
+ { "loadall", TOKEN_INSN, C_none, 0, I_LOADALL },
+ { "loadall286", TOKEN_INSN, C_none, 0, I_LOADALL286 },
+ { "lodsb", TOKEN_INSN, C_none, 0, I_LODSB },
+ { "lodsd", TOKEN_INSN, C_none, 0, I_LODSD },
+ { "lodsq", TOKEN_INSN, C_none, 0, I_LODSQ },
+ { "lodsw", TOKEN_INSN, C_none, 0, I_LODSW },
+ { "loop", TOKEN_INSN, C_none, 0, I_LOOP },
+ { "loope", TOKEN_INSN, C_none, 0, I_LOOPE },
+ { "loopne", TOKEN_INSN, C_none, 0, I_LOOPNE },
+ { "loopnz", TOKEN_INSN, C_none, 0, I_LOOPNZ },
+ { "loopz", TOKEN_INSN, C_none, 0, I_LOOPZ },
+ { "lsl", TOKEN_INSN, C_none, 0, I_LSL },
+ { "lss", TOKEN_INSN, C_none, 0, I_LSS },
+ { "ltr", TOKEN_INSN, C_none, 0, I_LTR },
+ { "mfence", TOKEN_INSN, C_none, 0, I_MFENCE },
+ { "monitor", TOKEN_INSN, C_none, 0, I_MONITOR },
+ { "monitorx", TOKEN_INSN, C_none, 0, I_MONITORX },
+ { "mov", TOKEN_INSN, C_none, 0, I_MOV },
+ { "movd", TOKEN_INSN, C_none, 0, I_MOVD },
+ { "movq", TOKEN_INSN, C_none, 0, I_MOVQ },
+ { "movsb", TOKEN_INSN, C_none, 0, I_MOVSB },
+ { "movsd", TOKEN_INSN, C_none, 0, I_MOVSD },
+ { "movsq", TOKEN_INSN, C_none, 0, I_MOVSQ },
+ { "movsw", TOKEN_INSN, C_none, 0, I_MOVSW },
+ { "movsx", TOKEN_INSN, C_none, 0, I_MOVSX },
+ { "movsxd", TOKEN_INSN, C_none, 0, I_MOVSXD },
+ { "movzx", TOKEN_INSN, C_none, 0, I_MOVZX },
+ { "mul", TOKEN_INSN, C_none, 0, I_MUL },
+ { "mwait", TOKEN_INSN, C_none, 0, I_MWAIT },
+ { "mwaitx", TOKEN_INSN, C_none, 0, I_MWAITX },
+ { "neg", TOKEN_INSN, C_none, 0, I_NEG },
+ { "nop", TOKEN_INSN, C_none, 0, I_NOP },
+ { "not", TOKEN_INSN, C_none, 0, I_NOT },
+ { "or", TOKEN_INSN, C_none, 0, I_OR },
+ { "out", TOKEN_INSN, C_none, 0, I_OUT },
+ { "outsb", TOKEN_INSN, C_none, 0, I_OUTSB },
+ { "outsd", TOKEN_INSN, C_none, 0, I_OUTSD },
+ { "outsw", TOKEN_INSN, C_none, 0, I_OUTSW },
+ { "packssdw", TOKEN_INSN, C_none, 0, I_PACKSSDW },
+ { "packsswb", TOKEN_INSN, C_none, 0, I_PACKSSWB },
+ { "packuswb", TOKEN_INSN, C_none, 0, I_PACKUSWB },
+ { "paddb", TOKEN_INSN, C_none, 0, I_PADDB },
+ { "paddd", TOKEN_INSN, C_none, 0, I_PADDD },
+ { "paddsb", TOKEN_INSN, C_none, 0, I_PADDSB },
+ { "paddsiw", TOKEN_INSN, C_none, 0, I_PADDSIW },
+ { "paddsw", TOKEN_INSN, C_none, 0, I_PADDSW },
+ { "paddusb", TOKEN_INSN, C_none, 0, I_PADDUSB },
+ { "paddusw", TOKEN_INSN, C_none, 0, I_PADDUSW },
+ { "paddw", TOKEN_INSN, C_none, 0, I_PADDW },
+ { "pand", TOKEN_INSN, C_none, 0, I_PAND },
+ { "pandn", TOKEN_INSN, C_none, 0, I_PANDN },
+ { "pause", TOKEN_INSN, C_none, 0, I_PAUSE },
+ { "paveb", TOKEN_INSN, C_none, 0, I_PAVEB },
+ { "pavgusb", TOKEN_INSN, C_none, 0, I_PAVGUSB },
+ { "pcmpeqb", TOKEN_INSN, C_none, 0, I_PCMPEQB },
+ { "pcmpeqd", TOKEN_INSN, C_none, 0, I_PCMPEQD },
+ { "pcmpeqw", TOKEN_INSN, C_none, 0, I_PCMPEQW },
+ { "pcmpgtb", TOKEN_INSN, C_none, 0, I_PCMPGTB },
+ { "pcmpgtd", TOKEN_INSN, C_none, 0, I_PCMPGTD },
+ { "pcmpgtw", TOKEN_INSN, C_none, 0, I_PCMPGTW },
+ { "pdistib", TOKEN_INSN, C_none, 0, I_PDISTIB },
+ { "pf2id", TOKEN_INSN, C_none, 0, I_PF2ID },
+ { "pfacc", TOKEN_INSN, C_none, 0, I_PFACC },
+ { "pfadd", TOKEN_INSN, C_none, 0, I_PFADD },
+ { "pfcmpeq", TOKEN_INSN, C_none, 0, I_PFCMPEQ },
+ { "pfcmpge", TOKEN_INSN, C_none, 0, I_PFCMPGE },
+ { "pfcmpgt", TOKEN_INSN, C_none, 0, I_PFCMPGT },
+ { "pfmax", TOKEN_INSN, C_none, 0, I_PFMAX },
+ { "pfmin", TOKEN_INSN, C_none, 0, I_PFMIN },
+ { "pfmul", TOKEN_INSN, C_none, 0, I_PFMUL },
+ { "pfrcp", TOKEN_INSN, C_none, 0, I_PFRCP },
+ { "pfrcpit1", TOKEN_INSN, C_none, 0, I_PFRCPIT1 },
+ { "pfrcpit2", TOKEN_INSN, C_none, 0, I_PFRCPIT2 },
+ { "pfrsqit1", TOKEN_INSN, C_none, 0, I_PFRSQIT1 },
+ { "pfrsqrt", TOKEN_INSN, C_none, 0, I_PFRSQRT },
+ { "pfsub", TOKEN_INSN, C_none, 0, I_PFSUB },
+ { "pfsubr", TOKEN_INSN, C_none, 0, I_PFSUBR },
+ { "pi2fd", TOKEN_INSN, C_none, 0, I_PI2FD },
+ { "pmachriw", TOKEN_INSN, C_none, 0, I_PMACHRIW },
+ { "pmaddwd", TOKEN_INSN, C_none, 0, I_PMADDWD },
+ { "pmagw", TOKEN_INSN, C_none, 0, I_PMAGW },
+ { "pmulhriw", TOKEN_INSN, C_none, 0, I_PMULHRIW },
+ { "pmulhrwa", TOKEN_INSN, C_none, 0, I_PMULHRWA },
+ { "pmulhrwc", TOKEN_INSN, C_none, 0, I_PMULHRWC },
+ { "pmulhw", TOKEN_INSN, C_none, 0, I_PMULHW },
+ { "pmullw", TOKEN_INSN, C_none, 0, I_PMULLW },
+ { "pmvgezb", TOKEN_INSN, C_none, 0, I_PMVGEZB },
+ { "pmvlzb", TOKEN_INSN, C_none, 0, I_PMVLZB },
+ { "pmvnzb", TOKEN_INSN, C_none, 0, I_PMVNZB },
+ { "pmvzb", TOKEN_INSN, C_none, 0, I_PMVZB },
+ { "pop", TOKEN_INSN, C_none, 0, I_POP },
+ { "popa", TOKEN_INSN, C_none, 0, I_POPA },
+ { "popad", TOKEN_INSN, C_none, 0, I_POPAD },
+ { "popaw", TOKEN_INSN, C_none, 0, I_POPAW },
+ { "popf", TOKEN_INSN, C_none, 0, I_POPF },
+ { "popfd", TOKEN_INSN, C_none, 0, I_POPFD },
+ { "popfq", TOKEN_INSN, C_none, 0, I_POPFQ },
+ { "popfw", TOKEN_INSN, C_none, 0, I_POPFW },
+ { "por", TOKEN_INSN, C_none, 0, I_POR },
+ { "prefetch", TOKEN_INSN, C_none, 0, I_PREFETCH },
+ { "prefetchw", TOKEN_INSN, C_none, 0, I_PREFETCHW },
+ { "pslld", TOKEN_INSN, C_none, 0, I_PSLLD },
+ { "psllq", TOKEN_INSN, C_none, 0, I_PSLLQ },
+ { "psllw", TOKEN_INSN, C_none, 0, I_PSLLW },
+ { "psrad", TOKEN_INSN, C_none, 0, I_PSRAD },
+ { "psraw", TOKEN_INSN, C_none, 0, I_PSRAW },
+ { "psrld", TOKEN_INSN, C_none, 0, I_PSRLD },
+ { "psrlq", TOKEN_INSN, C_none, 0, I_PSRLQ },
+ { "psrlw", TOKEN_INSN, C_none, 0, I_PSRLW },
+ { "psubb", TOKEN_INSN, C_none, 0, I_PSUBB },
+ { "psubd", TOKEN_INSN, C_none, 0, I_PSUBD },
+ { "psubsb", TOKEN_INSN, C_none, 0, I_PSUBSB },
+ { "psubsiw", TOKEN_INSN, C_none, 0, I_PSUBSIW },
+ { "psubsw", TOKEN_INSN, C_none, 0, I_PSUBSW },
+ { "psubusb", TOKEN_INSN, C_none, 0, I_PSUBUSB },
+ { "psubusw", TOKEN_INSN, C_none, 0, I_PSUBUSW },
+ { "psubw", TOKEN_INSN, C_none, 0, I_PSUBW },
+ { "punpckhbw", TOKEN_INSN, C_none, 0, I_PUNPCKHBW },
+ { "punpckhdq", TOKEN_INSN, C_none, 0, I_PUNPCKHDQ },
+ { "punpckhwd", TOKEN_INSN, C_none, 0, I_PUNPCKHWD },
+ { "punpcklbw", TOKEN_INSN, C_none, 0, I_PUNPCKLBW },
+ { "punpckldq", TOKEN_INSN, C_none, 0, I_PUNPCKLDQ },
+ { "punpcklwd", TOKEN_INSN, C_none, 0, I_PUNPCKLWD },
+ { "push", TOKEN_INSN, C_none, 0, I_PUSH },
+ { "pusha", TOKEN_INSN, C_none, 0, I_PUSHA },
+ { "pushad", TOKEN_INSN, C_none, 0, I_PUSHAD },
+ { "pushaw", TOKEN_INSN, C_none, 0, I_PUSHAW },
+ { "pushf", TOKEN_INSN, C_none, 0, I_PUSHF },
+ { "pushfd", TOKEN_INSN, C_none, 0, I_PUSHFD },
+ { "pushfq", TOKEN_INSN, C_none, 0, I_PUSHFQ },
+ { "pushfw", TOKEN_INSN, C_none, 0, I_PUSHFW },
+ { "pxor", TOKEN_INSN, C_none, 0, I_PXOR },
+ { "rcl", TOKEN_INSN, C_none, 0, I_RCL },
+ { "rcr", TOKEN_INSN, C_none, 0, I_RCR },
+ { "rdshr", TOKEN_INSN, C_none, 0, I_RDSHR },
+ { "rdmsr", TOKEN_INSN, C_none, 0, I_RDMSR },
+ { "rdpmc", TOKEN_INSN, C_none, 0, I_RDPMC },
+ { "rdtsc", TOKEN_INSN, C_none, 0, I_RDTSC },
+ { "rdtscp", TOKEN_INSN, C_none, 0, I_RDTSCP },
+ { "ret", TOKEN_INSN, C_none, 0, I_RET },
+ { "retf", TOKEN_INSN, C_none, 0, I_RETF },
+ { "retn", TOKEN_INSN, C_none, 0, I_RETN },
+ { "retw", TOKEN_INSN, C_none, 0, I_RETW },
+ { "retfw", TOKEN_INSN, C_none, 0, I_RETFW },
+ { "retnw", TOKEN_INSN, C_none, 0, I_RETNW },
+ { "retd", TOKEN_INSN, C_none, 0, I_RETD },
+ { "retfd", TOKEN_INSN, C_none, 0, I_RETFD },
+ { "retnd", TOKEN_INSN, C_none, 0, I_RETND },
+ { "retq", TOKEN_INSN, C_none, 0, I_RETQ },
+ { "retfq", TOKEN_INSN, C_none, 0, I_RETFQ },
+ { "retnq", TOKEN_INSN, C_none, 0, I_RETNQ },
+ { "rol", TOKEN_INSN, C_none, 0, I_ROL },
+ { "ror", TOKEN_INSN, C_none, 0, I_ROR },
+ { "rdm", TOKEN_INSN, C_none, 0, I_RDM },
+ { "rsdc", TOKEN_INSN, C_none, 0, I_RSDC },
+ { "rsldt", TOKEN_INSN, C_none, 0, I_RSLDT },
+ { "rsm", TOKEN_INSN, C_none, 0, I_RSM },
+ { "rsts", TOKEN_INSN, C_none, 0, I_RSTS },
+ { "sahf", TOKEN_INSN, C_none, 0, I_SAHF },
+ { "sal", TOKEN_INSN, C_none, 0, I_SAL },
+ { "salc", TOKEN_INSN, C_none, 0, I_SALC },
+ { "sar", TOKEN_INSN, C_none, 0, I_SAR },
+ { "sbb", TOKEN_INSN, C_none, 0, I_SBB },
+ { "scasb", TOKEN_INSN, C_none, 0, I_SCASB },
+ { "scasd", TOKEN_INSN, C_none, 0, I_SCASD },
+ { "scasq", TOKEN_INSN, C_none, 0, I_SCASQ },
+ { "scasw", TOKEN_INSN, C_none, 0, I_SCASW },
+ { "sfence", TOKEN_INSN, C_none, 0, I_SFENCE },
+ { "sgdt", TOKEN_INSN, C_none, 0, I_SGDT },
+ { "shl", TOKEN_INSN, C_none, 0, I_SHL },
+ { "shld", TOKEN_INSN, C_none, 0, I_SHLD },
+ { "shr", TOKEN_INSN, C_none, 0, I_SHR },
+ { "shrd", TOKEN_INSN, C_none, 0, I_SHRD },
+ { "sidt", TOKEN_INSN, C_none, 0, I_SIDT },
+ { "sldt", TOKEN_INSN, C_none, 0, I_SLDT },
+ { "skinit", TOKEN_INSN, C_none, 0, I_SKINIT },
+ { "smi", TOKEN_INSN, C_none, 0, I_SMI },
+ { "smint", TOKEN_INSN, C_none, 0, I_SMINT },
+ { "smintold", TOKEN_INSN, C_none, 0, I_SMINTOLD },
+ { "smsw", TOKEN_INSN, C_none, 0, I_SMSW },
+ { "stc", TOKEN_INSN, C_none, 0, I_STC },
+ { "std", TOKEN_INSN, C_none, 0, I_STD },
+ { "sti", TOKEN_INSN, C_none, 0, I_STI },
+ { "stosb", TOKEN_INSN, C_none, 0, I_STOSB },
+ { "stosd", TOKEN_INSN, C_none, 0, I_STOSD },
+ { "stosq", TOKEN_INSN, C_none, 0, I_STOSQ },
+ { "stosw", TOKEN_INSN, C_none, 0, I_STOSW },
+ { "str", TOKEN_INSN, C_none, 0, I_STR },
+ { "sub", TOKEN_INSN, C_none, 0, I_SUB },
+ { "svdc", TOKEN_INSN, C_none, 0, I_SVDC },
+ { "svldt", TOKEN_INSN, C_none, 0, I_SVLDT },
+ { "svts", TOKEN_INSN, C_none, 0, I_SVTS },
+ { "swapgs", TOKEN_INSN, C_none, 0, I_SWAPGS },
+ { "syscall", TOKEN_INSN, C_none, 0, I_SYSCALL },
+ { "sysenter", TOKEN_INSN, C_none, 0, I_SYSENTER },
+ { "sysexit", TOKEN_INSN, C_none, 0, I_SYSEXIT },
+ { "sysret", TOKEN_INSN, C_none, 0, I_SYSRET },
+ { "test", TOKEN_INSN, C_none, 0, I_TEST },
+ { "ud0", TOKEN_INSN, C_none, 0, I_UD0 },
+ { "ud1", TOKEN_INSN, C_none, 0, I_UD1 },
+ { "ud2b", TOKEN_INSN, C_none, 0, I_UD2B },
+ { "ud2", TOKEN_INSN, C_none, 0, I_UD2 },
+ { "ud2a", TOKEN_INSN, C_none, 0, I_UD2A },
+ { "umov", TOKEN_INSN, C_none, 0, I_UMOV },
+ { "verr", TOKEN_INSN, C_none, 0, I_VERR },
+ { "verw", TOKEN_INSN, C_none, 0, I_VERW },
+ { "fwait", TOKEN_INSN, C_none, 0, I_FWAIT },
+ { "wbinvd", TOKEN_INSN, C_none, 0, I_WBINVD },
+ { "wrshr", TOKEN_INSN, C_none, 0, I_WRSHR },
+ { "wrmsr", TOKEN_INSN, C_none, 0, I_WRMSR },
+ { "xadd", TOKEN_INSN, C_none, 0, I_XADD },
+ { "xbts", TOKEN_INSN, C_none, 0, I_XBTS },
+ { "xchg", TOKEN_INSN, C_none, 0, I_XCHG },
+ { "xlatb", TOKEN_INSN, C_none, 0, I_XLATB },
+ { "xlat", TOKEN_INSN, C_none, 0, I_XLAT },
+ { "xor", TOKEN_INSN, C_none, 0, I_XOR },
+ { "cmova", TOKEN_INSN, C_A, 0, I_CMOVcc },
+ { "cmovae", TOKEN_INSN, C_AE, 0, I_CMOVcc },
+ { "cmovb", TOKEN_INSN, C_B, 0, I_CMOVcc },
+ { "cmovbe", TOKEN_INSN, C_BE, 0, I_CMOVcc },
+ { "cmovc", TOKEN_INSN, C_C, 0, I_CMOVcc },
+ { "cmove", TOKEN_INSN, C_E, 0, I_CMOVcc },
+ { "cmovg", TOKEN_INSN, C_G, 0, I_CMOVcc },
+ { "cmovge", TOKEN_INSN, C_GE, 0, I_CMOVcc },
+ { "cmovl", TOKEN_INSN, C_L, 0, I_CMOVcc },
+ { "cmovle", TOKEN_INSN, C_LE, 0, I_CMOVcc },
+ { "cmovna", TOKEN_INSN, C_NA, 0, I_CMOVcc },
+ { "cmovnae", TOKEN_INSN, C_NAE, 0, I_CMOVcc },
+ { "cmovnb", TOKEN_INSN, C_NB, 0, I_CMOVcc },
+ { "cmovnbe", TOKEN_INSN, C_NBE, 0, I_CMOVcc },
+ { "cmovnc", TOKEN_INSN, C_NC, 0, I_CMOVcc },
+ { "cmovne", TOKEN_INSN, C_NE, 0, I_CMOVcc },
+ { "cmovng", TOKEN_INSN, C_NG, 0, I_CMOVcc },
+ { "cmovnge", TOKEN_INSN, C_NGE, 0, I_CMOVcc },
+ { "cmovnl", TOKEN_INSN, C_NL, 0, I_CMOVcc },
+ { "cmovnle", TOKEN_INSN, C_NLE, 0, I_CMOVcc },
+ { "cmovno", TOKEN_INSN, C_NO, 0, I_CMOVcc },
+ { "cmovnp", TOKEN_INSN, C_NP, 0, I_CMOVcc },
+ { "cmovns", TOKEN_INSN, C_NS, 0, I_CMOVcc },
+ { "cmovnz", TOKEN_INSN, C_NZ, 0, I_CMOVcc },
+ { "cmovo", TOKEN_INSN, C_O, 0, I_CMOVcc },
+ { "cmovp", TOKEN_INSN, C_P, 0, I_CMOVcc },
+ { "cmovpe", TOKEN_INSN, C_PE, 0, I_CMOVcc },
+ { "cmovpo", TOKEN_INSN, C_PO, 0, I_CMOVcc },
+ { "cmovs", TOKEN_INSN, C_S, 0, I_CMOVcc },
+ { "cmovz", TOKEN_INSN, C_Z, 0, I_CMOVcc },
+ { "ja", TOKEN_INSN, C_A, 0, I_Jcc },
+ { "jae", TOKEN_INSN, C_AE, 0, I_Jcc },
+ { "jb", TOKEN_INSN, C_B, 0, I_Jcc },
+ { "jbe", TOKEN_INSN, C_BE, 0, I_Jcc },
+ { "jc", TOKEN_INSN, C_C, 0, I_Jcc },
+ { "je", TOKEN_INSN, C_E, 0, I_Jcc },
+ { "jg", TOKEN_INSN, C_G, 0, I_Jcc },
+ { "jge", TOKEN_INSN, C_GE, 0, I_Jcc },
+ { "jl", TOKEN_INSN, C_L, 0, I_Jcc },
+ { "jle", TOKEN_INSN, C_LE, 0, I_Jcc },
+ { "jna", TOKEN_INSN, C_NA, 0, I_Jcc },
+ { "jnae", TOKEN_INSN, C_NAE, 0, I_Jcc },
+ { "jnb", TOKEN_INSN, C_NB, 0, I_Jcc },
+ { "jnbe", TOKEN_INSN, C_NBE, 0, I_Jcc },
+ { "jnc", TOKEN_INSN, C_NC, 0, I_Jcc },
+ { "jne", TOKEN_INSN, C_NE, 0, I_Jcc },
+ { "jng", TOKEN_INSN, C_NG, 0, I_Jcc },
+ { "jnge", TOKEN_INSN, C_NGE, 0, I_Jcc },
+ { "jnl", TOKEN_INSN, C_NL, 0, I_Jcc },
+ { "jnle", TOKEN_INSN, C_NLE, 0, I_Jcc },
+ { "jno", TOKEN_INSN, C_NO, 0, I_Jcc },
+ { "jnp", TOKEN_INSN, C_NP, 0, I_Jcc },
+ { "jns", TOKEN_INSN, C_NS, 0, I_Jcc },
+ { "jnz", TOKEN_INSN, C_NZ, 0, I_Jcc },
+ { "jo", TOKEN_INSN, C_O, 0, I_Jcc },
+ { "jp", TOKEN_INSN, C_P, 0, I_Jcc },
+ { "jpe", TOKEN_INSN, C_PE, 0, I_Jcc },
+ { "jpo", TOKEN_INSN, C_PO, 0, I_Jcc },
+ { "js", TOKEN_INSN, C_S, 0, I_Jcc },
+ { "jz", TOKEN_INSN, C_Z, 0, I_Jcc },
+ { "seta", TOKEN_INSN, C_A, 0, I_SETcc },
+ { "setae", TOKEN_INSN, C_AE, 0, I_SETcc },
+ { "setb", TOKEN_INSN, C_B, 0, I_SETcc },
+ { "setbe", TOKEN_INSN, C_BE, 0, I_SETcc },
+ { "setc", TOKEN_INSN, C_C, 0, I_SETcc },
+ { "sete", TOKEN_INSN, C_E, 0, I_SETcc },
+ { "setg", TOKEN_INSN, C_G, 0, I_SETcc },
+ { "setge", TOKEN_INSN, C_GE, 0, I_SETcc },
+ { "setl", TOKEN_INSN, C_L, 0, I_SETcc },
+ { "setle", TOKEN_INSN, C_LE, 0, I_SETcc },
+ { "setna", TOKEN_INSN, C_NA, 0, I_SETcc },
+ { "setnae", TOKEN_INSN, C_NAE, 0, I_SETcc },
+ { "setnb", TOKEN_INSN, C_NB, 0, I_SETcc },
+ { "setnbe", TOKEN_INSN, C_NBE, 0, I_SETcc },
+ { "setnc", TOKEN_INSN, C_NC, 0, I_SETcc },
+ { "setne", TOKEN_INSN, C_NE, 0, I_SETcc },
+ { "setng", TOKEN_INSN, C_NG, 0, I_SETcc },
+ { "setnge", TOKEN_INSN, C_NGE, 0, I_SETcc },
+ { "setnl", TOKEN_INSN, C_NL, 0, I_SETcc },
+ { "setnle", TOKEN_INSN, C_NLE, 0, I_SETcc },
+ { "setno", TOKEN_INSN, C_NO, 0, I_SETcc },
+ { "setnp", TOKEN_INSN, C_NP, 0, I_SETcc },
+ { "setns", TOKEN_INSN, C_NS, 0, I_SETcc },
+ { "setnz", TOKEN_INSN, C_NZ, 0, I_SETcc },
+ { "seto", TOKEN_INSN, C_O, 0, I_SETcc },
+ { "setp", TOKEN_INSN, C_P, 0, I_SETcc },
+ { "setpe", TOKEN_INSN, C_PE, 0, I_SETcc },
+ { "setpo", TOKEN_INSN, C_PO, 0, I_SETcc },
+ { "sets", TOKEN_INSN, C_S, 0, I_SETcc },
+ { "setz", TOKEN_INSN, C_Z, 0, I_SETcc },
+ { "addps", TOKEN_INSN, C_none, 0, I_ADDPS },
+ { "addss", TOKEN_INSN, C_none, 0, I_ADDSS },
+ { "andnps", TOKEN_INSN, C_none, 0, I_ANDNPS },
+ { "andps", TOKEN_INSN, C_none, 0, I_ANDPS },
+ { "cmpeqps", TOKEN_INSN, C_none, 0, I_CMPEQPS },
+ { "cmpeqss", TOKEN_INSN, C_none, 0, I_CMPEQSS },
+ { "cmpleps", TOKEN_INSN, C_none, 0, I_CMPLEPS },
+ { "cmpless", TOKEN_INSN, C_none, 0, I_CMPLESS },
+ { "cmpltps", TOKEN_INSN, C_none, 0, I_CMPLTPS },
+ { "cmpltss", TOKEN_INSN, C_none, 0, I_CMPLTSS },
+ { "cmpneqps", TOKEN_INSN, C_none, 0, I_CMPNEQPS },
+ { "cmpneqss", TOKEN_INSN, C_none, 0, I_CMPNEQSS },
+ { "cmpnleps", TOKEN_INSN, C_none, 0, I_CMPNLEPS },
+ { "cmpnless", TOKEN_INSN, C_none, 0, I_CMPNLESS },
+ { "cmpnltps", TOKEN_INSN, C_none, 0, I_CMPNLTPS },
+ { "cmpnltss", TOKEN_INSN, C_none, 0, I_CMPNLTSS },
+ { "cmpordps", TOKEN_INSN, C_none, 0, I_CMPORDPS },
+ { "cmpordss", TOKEN_INSN, C_none, 0, I_CMPORDSS },
+ { "cmpunordps", TOKEN_INSN, C_none, 0, I_CMPUNORDPS },
+ { "cmpunordss", TOKEN_INSN, C_none, 0, I_CMPUNORDSS },
+ { "cmpps", TOKEN_INSN, C_none, 0, I_CMPPS },
+ { "cmpss", TOKEN_INSN, C_none, 0, I_CMPSS },
+ { "comiss", TOKEN_INSN, C_none, 0, I_COMISS },
+ { "cvtpi2ps", TOKEN_INSN, C_none, 0, I_CVTPI2PS },
+ { "cvtps2pi", TOKEN_INSN, C_none, 0, I_CVTPS2PI },
+ { "cvtsi2ss", TOKEN_INSN, C_none, 0, I_CVTSI2SS },
+ { "cvtss2si", TOKEN_INSN, C_none, 0, I_CVTSS2SI },
+ { "cvttps2pi", TOKEN_INSN, C_none, 0, I_CVTTPS2PI },
+ { "cvttss2si", TOKEN_INSN, C_none, 0, I_CVTTSS2SI },
+ { "divps", TOKEN_INSN, C_none, 0, I_DIVPS },
+ { "divss", TOKEN_INSN, C_none, 0, I_DIVSS },
+ { "ldmxcsr", TOKEN_INSN, C_none, 0, I_LDMXCSR },
+ { "maxps", TOKEN_INSN, C_none, 0, I_MAXPS },
+ { "maxss", TOKEN_INSN, C_none, 0, I_MAXSS },
+ { "minps", TOKEN_INSN, C_none, 0, I_MINPS },
+ { "minss", TOKEN_INSN, C_none, 0, I_MINSS },
+ { "movaps", TOKEN_INSN, C_none, 0, I_MOVAPS },
+ { "movhps", TOKEN_INSN, C_none, 0, I_MOVHPS },
+ { "movlhps", TOKEN_INSN, C_none, 0, I_MOVLHPS },
+ { "movlps", TOKEN_INSN, C_none, 0, I_MOVLPS },
+ { "movhlps", TOKEN_INSN, C_none, 0, I_MOVHLPS },
+ { "movmskps", TOKEN_INSN, C_none, 0, I_MOVMSKPS },
+ { "movntps", TOKEN_INSN, C_none, 0, I_MOVNTPS },
+ { "movss", TOKEN_INSN, C_none, 0, I_MOVSS },
+ { "movups", TOKEN_INSN, C_none, 0, I_MOVUPS },
+ { "mulps", TOKEN_INSN, C_none, 0, I_MULPS },
+ { "mulss", TOKEN_INSN, C_none, 0, I_MULSS },
+ { "orps", TOKEN_INSN, C_none, 0, I_ORPS },
+ { "rcpps", TOKEN_INSN, C_none, 0, I_RCPPS },
+ { "rcpss", TOKEN_INSN, C_none, 0, I_RCPSS },
+ { "rsqrtps", TOKEN_INSN, C_none, 0, I_RSQRTPS },
+ { "rsqrtss", TOKEN_INSN, C_none, 0, I_RSQRTSS },
+ { "shufps", TOKEN_INSN, C_none, 0, I_SHUFPS },
+ { "sqrtps", TOKEN_INSN, C_none, 0, I_SQRTPS },
+ { "sqrtss", TOKEN_INSN, C_none, 0, I_SQRTSS },
+ { "stmxcsr", TOKEN_INSN, C_none, 0, I_STMXCSR },
+ { "subps", TOKEN_INSN, C_none, 0, I_SUBPS },
+ { "subss", TOKEN_INSN, C_none, 0, I_SUBSS },
+ { "ucomiss", TOKEN_INSN, C_none, 0, I_UCOMISS },
+ { "unpckhps", TOKEN_INSN, C_none, 0, I_UNPCKHPS },
+ { "unpcklps", TOKEN_INSN, C_none, 0, I_UNPCKLPS },
+ { "xorps", TOKEN_INSN, C_none, 0, I_XORPS },
+ { "fxrstor", TOKEN_INSN, C_none, 0, I_FXRSTOR },
+ { "fxrstor64", TOKEN_INSN, C_none, 0, I_FXRSTOR64 },
+ { "fxsave", TOKEN_INSN, C_none, 0, I_FXSAVE },
+ { "fxsave64", TOKEN_INSN, C_none, 0, I_FXSAVE64 },
+ { "xgetbv", TOKEN_INSN, C_none, 0, I_XGETBV },
+ { "xsetbv", TOKEN_INSN, C_none, 0, I_XSETBV },
+ { "xsave", TOKEN_INSN, C_none, 0, I_XSAVE },
+ { "xsave64", TOKEN_INSN, C_none, 0, I_XSAVE64 },
+ { "xsavec", TOKEN_INSN, C_none, 0, I_XSAVEC },
+ { "xsavec64", TOKEN_INSN, C_none, 0, I_XSAVEC64 },
+ { "xsaveopt", TOKEN_INSN, C_none, 0, I_XSAVEOPT },
+ { "xsaveopt64", TOKEN_INSN, C_none, 0, I_XSAVEOPT64 },
+ { "xsaves", TOKEN_INSN, C_none, 0, I_XSAVES },
+ { "xsaves64", TOKEN_INSN, C_none, 0, I_XSAVES64 },
+ { "xrstor", TOKEN_INSN, C_none, 0, I_XRSTOR },
+ { "xrstor64", TOKEN_INSN, C_none, 0, I_XRSTOR64 },
+ { "xrstors", TOKEN_INSN, C_none, 0, I_XRSTORS },
+ { "xrstors64", TOKEN_INSN, C_none, 0, I_XRSTORS64 },
+ { "prefetchnta", TOKEN_INSN, C_none, 0, I_PREFETCHNTA },
+ { "prefetcht0", TOKEN_INSN, C_none, 0, I_PREFETCHT0 },
+ { "prefetcht1", TOKEN_INSN, C_none, 0, I_PREFETCHT1 },
+ { "prefetcht2", TOKEN_INSN, C_none, 0, I_PREFETCHT2 },
+ { "maskmovq", TOKEN_INSN, C_none, 0, I_MASKMOVQ },
+ { "movntq", TOKEN_INSN, C_none, 0, I_MOVNTQ },
+ { "pavgb", TOKEN_INSN, C_none, 0, I_PAVGB },
+ { "pavgw", TOKEN_INSN, C_none, 0, I_PAVGW },
+ { "pextrw", TOKEN_INSN, C_none, 0, I_PEXTRW },
+ { "pinsrw", TOKEN_INSN, C_none, 0, I_PINSRW },
+ { "pmaxsw", TOKEN_INSN, C_none, 0, I_PMAXSW },
+ { "pmaxub", TOKEN_INSN, C_none, 0, I_PMAXUB },
+ { "pminsw", TOKEN_INSN, C_none, 0, I_PMINSW },
+ { "pminub", TOKEN_INSN, C_none, 0, I_PMINUB },
+ { "pmovmskb", TOKEN_INSN, C_none, 0, I_PMOVMSKB },
+ { "pmulhuw", TOKEN_INSN, C_none, 0, I_PMULHUW },
+ { "psadbw", TOKEN_INSN, C_none, 0, I_PSADBW },
+ { "pshufw", TOKEN_INSN, C_none, 0, I_PSHUFW },
+ { "pf2iw", TOKEN_INSN, C_none, 0, I_PF2IW },
+ { "pfnacc", TOKEN_INSN, C_none, 0, I_PFNACC },
+ { "pfpnacc", TOKEN_INSN, C_none, 0, I_PFPNACC },
+ { "pi2fw", TOKEN_INSN, C_none, 0, I_PI2FW },
+ { "pswapd", TOKEN_INSN, C_none, 0, I_PSWAPD },
+ { "maskmovdqu", TOKEN_INSN, C_none, 0, I_MASKMOVDQU },
+ { "clflush", TOKEN_INSN, C_none, 0, I_CLFLUSH },
+ { "movntdq", TOKEN_INSN, C_none, 0, I_MOVNTDQ },
+ { "movnti", TOKEN_INSN, C_none, 0, I_MOVNTI },
+ { "movntpd", TOKEN_INSN, C_none, 0, I_MOVNTPD },
+ { "movdqa", TOKEN_INSN, C_none, 0, I_MOVDQA },
+ { "movdqu", TOKEN_INSN, C_none, 0, I_MOVDQU },
+ { "movdq2q", TOKEN_INSN, C_none, 0, I_MOVDQ2Q },
+ { "movq2dq", TOKEN_INSN, C_none, 0, I_MOVQ2DQ },
+ { "paddq", TOKEN_INSN, C_none, 0, I_PADDQ },
+ { "pmuludq", TOKEN_INSN, C_none, 0, I_PMULUDQ },
+ { "pshufd", TOKEN_INSN, C_none, 0, I_PSHUFD },
+ { "pshufhw", TOKEN_INSN, C_none, 0, I_PSHUFHW },
+ { "pshuflw", TOKEN_INSN, C_none, 0, I_PSHUFLW },
+ { "pslldq", TOKEN_INSN, C_none, 0, I_PSLLDQ },
+ { "psrldq", TOKEN_INSN, C_none, 0, I_PSRLDQ },
+ { "psubq", TOKEN_INSN, C_none, 0, I_PSUBQ },
+ { "punpckhqdq", TOKEN_INSN, C_none, 0, I_PUNPCKHQDQ },
+ { "punpcklqdq", TOKEN_INSN, C_none, 0, I_PUNPCKLQDQ },
+ { "addpd", TOKEN_INSN, C_none, 0, I_ADDPD },
+ { "addsd", TOKEN_INSN, C_none, 0, I_ADDSD },
+ { "andnpd", TOKEN_INSN, C_none, 0, I_ANDNPD },
+ { "andpd", TOKEN_INSN, C_none, 0, I_ANDPD },
+ { "cmpeqpd", TOKEN_INSN, C_none, 0, I_CMPEQPD },
+ { "cmpeqsd", TOKEN_INSN, C_none, 0, I_CMPEQSD },
+ { "cmplepd", TOKEN_INSN, C_none, 0, I_CMPLEPD },
+ { "cmplesd", TOKEN_INSN, C_none, 0, I_CMPLESD },
+ { "cmpltpd", TOKEN_INSN, C_none, 0, I_CMPLTPD },
+ { "cmpltsd", TOKEN_INSN, C_none, 0, I_CMPLTSD },
+ { "cmpneqpd", TOKEN_INSN, C_none, 0, I_CMPNEQPD },
+ { "cmpneqsd", TOKEN_INSN, C_none, 0, I_CMPNEQSD },
+ { "cmpnlepd", TOKEN_INSN, C_none, 0, I_CMPNLEPD },
+ { "cmpnlesd", TOKEN_INSN, C_none, 0, I_CMPNLESD },
+ { "cmpnltpd", TOKEN_INSN, C_none, 0, I_CMPNLTPD },
+ { "cmpnltsd", TOKEN_INSN, C_none, 0, I_CMPNLTSD },
+ { "cmpordpd", TOKEN_INSN, C_none, 0, I_CMPORDPD },
+ { "cmpordsd", TOKEN_INSN, C_none, 0, I_CMPORDSD },
+ { "cmpunordpd", TOKEN_INSN, C_none, 0, I_CMPUNORDPD },
+ { "cmpunordsd", TOKEN_INSN, C_none, 0, I_CMPUNORDSD },
+ { "cmppd", TOKEN_INSN, C_none, 0, I_CMPPD },
+ { "comisd", TOKEN_INSN, C_none, 0, I_COMISD },
+ { "cvtdq2pd", TOKEN_INSN, C_none, 0, I_CVTDQ2PD },
+ { "cvtdq2ps", TOKEN_INSN, C_none, 0, I_CVTDQ2PS },
+ { "cvtpd2dq", TOKEN_INSN, C_none, 0, I_CVTPD2DQ },
+ { "cvtpd2pi", TOKEN_INSN, C_none, 0, I_CVTPD2PI },
+ { "cvtpd2ps", TOKEN_INSN, C_none, 0, I_CVTPD2PS },
+ { "cvtpi2pd", TOKEN_INSN, C_none, 0, I_CVTPI2PD },
+ { "cvtps2dq", TOKEN_INSN, C_none, 0, I_CVTPS2DQ },
+ { "cvtps2pd", TOKEN_INSN, C_none, 0, I_CVTPS2PD },
+ { "cvtsd2si", TOKEN_INSN, C_none, 0, I_CVTSD2SI },
+ { "cvtsd2ss", TOKEN_INSN, C_none, 0, I_CVTSD2SS },
+ { "cvtsi2sd", TOKEN_INSN, C_none, 0, I_CVTSI2SD },
+ { "cvtss2sd", TOKEN_INSN, C_none, 0, I_CVTSS2SD },
+ { "cvttpd2pi", TOKEN_INSN, C_none, 0, I_CVTTPD2PI },
+ { "cvttpd2dq", TOKEN_INSN, C_none, 0, I_CVTTPD2DQ },
+ { "cvttps2dq", TOKEN_INSN, C_none, 0, I_CVTTPS2DQ },
+ { "cvttsd2si", TOKEN_INSN, C_none, 0, I_CVTTSD2SI },
+ { "divpd", TOKEN_INSN, C_none, 0, I_DIVPD },
+ { "divsd", TOKEN_INSN, C_none, 0, I_DIVSD },
+ { "maxpd", TOKEN_INSN, C_none, 0, I_MAXPD },
+ { "maxsd", TOKEN_INSN, C_none, 0, I_MAXSD },
+ { "minpd", TOKEN_INSN, C_none, 0, I_MINPD },
+ { "minsd", TOKEN_INSN, C_none, 0, I_MINSD },
+ { "movapd", TOKEN_INSN, C_none, 0, I_MOVAPD },
+ { "movhpd", TOKEN_INSN, C_none, 0, I_MOVHPD },
+ { "movlpd", TOKEN_INSN, C_none, 0, I_MOVLPD },
+ { "movmskpd", TOKEN_INSN, C_none, 0, I_MOVMSKPD },
+ { "movupd", TOKEN_INSN, C_none, 0, I_MOVUPD },
+ { "mulpd", TOKEN_INSN, C_none, 0, I_MULPD },
+ { "mulsd", TOKEN_INSN, C_none, 0, I_MULSD },
+ { "orpd", TOKEN_INSN, C_none, 0, I_ORPD },
+ { "shufpd", TOKEN_INSN, C_none, 0, I_SHUFPD },
+ { "sqrtpd", TOKEN_INSN, C_none, 0, I_SQRTPD },
+ { "sqrtsd", TOKEN_INSN, C_none, 0, I_SQRTSD },
+ { "subpd", TOKEN_INSN, C_none, 0, I_SUBPD },
+ { "subsd", TOKEN_INSN, C_none, 0, I_SUBSD },
+ { "ucomisd", TOKEN_INSN, C_none, 0, I_UCOMISD },
+ { "unpckhpd", TOKEN_INSN, C_none, 0, I_UNPCKHPD },
+ { "unpcklpd", TOKEN_INSN, C_none, 0, I_UNPCKLPD },
+ { "xorpd", TOKEN_INSN, C_none, 0, I_XORPD },
+ { "addsubpd", TOKEN_INSN, C_none, 0, I_ADDSUBPD },
+ { "addsubps", TOKEN_INSN, C_none, 0, I_ADDSUBPS },
+ { "haddpd", TOKEN_INSN, C_none, 0, I_HADDPD },
+ { "haddps", TOKEN_INSN, C_none, 0, I_HADDPS },
+ { "hsubpd", TOKEN_INSN, C_none, 0, I_HSUBPD },
+ { "hsubps", TOKEN_INSN, C_none, 0, I_HSUBPS },
+ { "lddqu", TOKEN_INSN, C_none, 0, I_LDDQU },
+ { "movddup", TOKEN_INSN, C_none, 0, I_MOVDDUP },
+ { "movshdup", TOKEN_INSN, C_none, 0, I_MOVSHDUP },
+ { "movsldup", TOKEN_INSN, C_none, 0, I_MOVSLDUP },
+ { "clgi", TOKEN_INSN, C_none, 0, I_CLGI },
+ { "stgi", TOKEN_INSN, C_none, 0, I_STGI },
+ { "vmcall", TOKEN_INSN, C_none, 0, I_VMCALL },
+ { "vmclear", TOKEN_INSN, C_none, 0, I_VMCLEAR },
+ { "vmfunc", TOKEN_INSN, C_none, 0, I_VMFUNC },
+ { "vmlaunch", TOKEN_INSN, C_none, 0, I_VMLAUNCH },
+ { "vmload", TOKEN_INSN, C_none, 0, I_VMLOAD },
+ { "vmmcall", TOKEN_INSN, C_none, 0, I_VMMCALL },
+ { "vmptrld", TOKEN_INSN, C_none, 0, I_VMPTRLD },
+ { "vmptrst", TOKEN_INSN, C_none, 0, I_VMPTRST },
+ { "vmread", TOKEN_INSN, C_none, 0, I_VMREAD },
+ { "vmresume", TOKEN_INSN, C_none, 0, I_VMRESUME },
+ { "vmrun", TOKEN_INSN, C_none, 0, I_VMRUN },
+ { "vmsave", TOKEN_INSN, C_none, 0, I_VMSAVE },
+ { "vmwrite", TOKEN_INSN, C_none, 0, I_VMWRITE },
+ { "vmxoff", TOKEN_INSN, C_none, 0, I_VMXOFF },
+ { "vmxon", TOKEN_INSN, C_none, 0, I_VMXON },
+ { "invept", TOKEN_INSN, C_none, 0, I_INVEPT },
+ { "invvpid", TOKEN_INSN, C_none, 0, I_INVVPID },
+ { "pabsb", TOKEN_INSN, C_none, 0, I_PABSB },
+ { "pabsw", TOKEN_INSN, C_none, 0, I_PABSW },
+ { "pabsd", TOKEN_INSN, C_none, 0, I_PABSD },
+ { "palignr", TOKEN_INSN, C_none, 0, I_PALIGNR },
+ { "phaddw", TOKEN_INSN, C_none, 0, I_PHADDW },
+ { "phaddd", TOKEN_INSN, C_none, 0, I_PHADDD },
+ { "phaddsw", TOKEN_INSN, C_none, 0, I_PHADDSW },
+ { "phsubw", TOKEN_INSN, C_none, 0, I_PHSUBW },
+ { "phsubd", TOKEN_INSN, C_none, 0, I_PHSUBD },
+ { "phsubsw", TOKEN_INSN, C_none, 0, I_PHSUBSW },
+ { "pmaddubsw", TOKEN_INSN, C_none, 0, I_PMADDUBSW },
+ { "pmulhrsw", TOKEN_INSN, C_none, 0, I_PMULHRSW },
+ { "pshufb", TOKEN_INSN, C_none, 0, I_PSHUFB },
+ { "psignb", TOKEN_INSN, C_none, 0, I_PSIGNB },
+ { "psignw", TOKEN_INSN, C_none, 0, I_PSIGNW },
+ { "psignd", TOKEN_INSN, C_none, 0, I_PSIGND },
+ { "extrq", TOKEN_INSN, C_none, 0, I_EXTRQ },
+ { "insertq", TOKEN_INSN, C_none, 0, I_INSERTQ },
+ { "movntsd", TOKEN_INSN, C_none, 0, I_MOVNTSD },
+ { "movntss", TOKEN_INSN, C_none, 0, I_MOVNTSS },
+ { "lzcnt", TOKEN_INSN, C_none, 0, I_LZCNT },
+ { "blendpd", TOKEN_INSN, C_none, 0, I_BLENDPD },
+ { "blendps", TOKEN_INSN, C_none, 0, I_BLENDPS },
+ { "blendvpd", TOKEN_INSN, C_none, 0, I_BLENDVPD },
+ { "blendvps", TOKEN_INSN, C_none, 0, I_BLENDVPS },
+ { "dppd", TOKEN_INSN, C_none, 0, I_DPPD },
+ { "dpps", TOKEN_INSN, C_none, 0, I_DPPS },
+ { "extractps", TOKEN_INSN, C_none, 0, I_EXTRACTPS },
+ { "insertps", TOKEN_INSN, C_none, 0, I_INSERTPS },
+ { "movntdqa", TOKEN_INSN, C_none, 0, I_MOVNTDQA },
+ { "mpsadbw", TOKEN_INSN, C_none, 0, I_MPSADBW },
+ { "packusdw", TOKEN_INSN, C_none, 0, I_PACKUSDW },
+ { "pblendvb", TOKEN_INSN, C_none, 0, I_PBLENDVB },
+ { "pblendw", TOKEN_INSN, C_none, 0, I_PBLENDW },
+ { "pcmpeqq", TOKEN_INSN, C_none, 0, I_PCMPEQQ },
+ { "pextrb", TOKEN_INSN, C_none, 0, I_PEXTRB },
+ { "pextrd", TOKEN_INSN, C_none, 0, I_PEXTRD },
+ { "pextrq", TOKEN_INSN, C_none, 0, I_PEXTRQ },
+ { "phminposuw", TOKEN_INSN, C_none, 0, I_PHMINPOSUW },
+ { "pinsrb", TOKEN_INSN, C_none, 0, I_PINSRB },
+ { "pinsrd", TOKEN_INSN, C_none, 0, I_PINSRD },
+ { "pinsrq", TOKEN_INSN, C_none, 0, I_PINSRQ },
+ { "pmaxsb", TOKEN_INSN, C_none, 0, I_PMAXSB },
+ { "pmaxsd", TOKEN_INSN, C_none, 0, I_PMAXSD },
+ { "pmaxud", TOKEN_INSN, C_none, 0, I_PMAXUD },
+ { "pmaxuw", TOKEN_INSN, C_none, 0, I_PMAXUW },
+ { "pminsb", TOKEN_INSN, C_none, 0, I_PMINSB },
+ { "pminsd", TOKEN_INSN, C_none, 0, I_PMINSD },
+ { "pminud", TOKEN_INSN, C_none, 0, I_PMINUD },
+ { "pminuw", TOKEN_INSN, C_none, 0, I_PMINUW },
+ { "pmovsxbw", TOKEN_INSN, C_none, 0, I_PMOVSXBW },
+ { "pmovsxbd", TOKEN_INSN, C_none, 0, I_PMOVSXBD },
+ { "pmovsxbq", TOKEN_INSN, C_none, 0, I_PMOVSXBQ },
+ { "pmovsxwd", TOKEN_INSN, C_none, 0, I_PMOVSXWD },
+ { "pmovsxwq", TOKEN_INSN, C_none, 0, I_PMOVSXWQ },
+ { "pmovsxdq", TOKEN_INSN, C_none, 0, I_PMOVSXDQ },
+ { "pmovzxbw", TOKEN_INSN, C_none, 0, I_PMOVZXBW },
+ { "pmovzxbd", TOKEN_INSN, C_none, 0, I_PMOVZXBD },
+ { "pmovzxbq", TOKEN_INSN, C_none, 0, I_PMOVZXBQ },
+ { "pmovzxwd", TOKEN_INSN, C_none, 0, I_PMOVZXWD },
+ { "pmovzxwq", TOKEN_INSN, C_none, 0, I_PMOVZXWQ },
+ { "pmovzxdq", TOKEN_INSN, C_none, 0, I_PMOVZXDQ },
+ { "pmuldq", TOKEN_INSN, C_none, 0, I_PMULDQ },
+ { "pmulld", TOKEN_INSN, C_none, 0, I_PMULLD },
+ { "ptest", TOKEN_INSN, C_none, 0, I_PTEST },
+ { "roundpd", TOKEN_INSN, C_none, 0, I_ROUNDPD },
+ { "roundps", TOKEN_INSN, C_none, 0, I_ROUNDPS },
+ { "roundsd", TOKEN_INSN, C_none, 0, I_ROUNDSD },
+ { "roundss", TOKEN_INSN, C_none, 0, I_ROUNDSS },
+ { "crc32", TOKEN_INSN, C_none, 0, I_CRC32 },
+ { "pcmpestri", TOKEN_INSN, C_none, 0, I_PCMPESTRI },
+ { "pcmpestrm", TOKEN_INSN, C_none, 0, I_PCMPESTRM },
+ { "pcmpistri", TOKEN_INSN, C_none, 0, I_PCMPISTRI },
+ { "pcmpistrm", TOKEN_INSN, C_none, 0, I_PCMPISTRM },
+ { "pcmpgtq", TOKEN_INSN, C_none, 0, I_PCMPGTQ },
+ { "popcnt", TOKEN_INSN, C_none, 0, I_POPCNT },
+ { "getsec", TOKEN_INSN, C_none, 0, I_GETSEC },
+ { "pfrcpv", TOKEN_INSN, C_none, 0, I_PFRCPV },
+ { "pfrsqrtv", TOKEN_INSN, C_none, 0, I_PFRSQRTV },
+ { "movbe", TOKEN_INSN, C_none, 0, I_MOVBE },
+ { "aesenc", TOKEN_INSN, C_none, 0, I_AESENC },
+ { "aesenclast", TOKEN_INSN, C_none, 0, I_AESENCLAST },
+ { "aesdec", TOKEN_INSN, C_none, 0, I_AESDEC },
+ { "aesdeclast", TOKEN_INSN, C_none, 0, I_AESDECLAST },
+ { "aesimc", TOKEN_INSN, C_none, 0, I_AESIMC },
+ { "aeskeygenassist", TOKEN_INSN, C_none, 0, I_AESKEYGENASSIST },
+ { "vaesenc", TOKEN_INSN, C_none, 0, I_VAESENC },
+ { "vaesenclast", TOKEN_INSN, C_none, 0, I_VAESENCLAST },
+ { "vaesdec", TOKEN_INSN, C_none, 0, I_VAESDEC },
+ { "vaesdeclast", TOKEN_INSN, C_none, 0, I_VAESDECLAST },
+ { "vaesimc", TOKEN_INSN, C_none, 0, I_VAESIMC },
+ { "vaeskeygenassist", TOKEN_INSN, C_none, 0, I_VAESKEYGENASSIST },
+ { "vaddpd", TOKEN_INSN, C_none, 0, I_VADDPD },
+ { "vaddps", TOKEN_INSN, C_none, 0, I_VADDPS },
+ { "vaddsd", TOKEN_INSN, C_none, 0, I_VADDSD },
+ { "vaddss", TOKEN_INSN, C_none, 0, I_VADDSS },
+ { "vaddsubpd", TOKEN_INSN, C_none, 0, I_VADDSUBPD },
+ { "vaddsubps", TOKEN_INSN, C_none, 0, I_VADDSUBPS },
+ { "vandpd", TOKEN_INSN, C_none, 0, I_VANDPD },
+ { "vandps", TOKEN_INSN, C_none, 0, I_VANDPS },
+ { "vandnpd", TOKEN_INSN, C_none, 0, I_VANDNPD },
+ { "vandnps", TOKEN_INSN, C_none, 0, I_VANDNPS },
+ { "vblendpd", TOKEN_INSN, C_none, 0, I_VBLENDPD },
+ { "vblendps", TOKEN_INSN, C_none, 0, I_VBLENDPS },
+ { "vblendvpd", TOKEN_INSN, C_none, 0, I_VBLENDVPD },
+ { "vblendvps", TOKEN_INSN, C_none, 0, I_VBLENDVPS },
+ { "vbroadcastss", TOKEN_INSN, C_none, 0, I_VBROADCASTSS },
+ { "vbroadcastsd", TOKEN_INSN, C_none, 0, I_VBROADCASTSD },
+ { "vbroadcastf128", TOKEN_INSN, C_none, 0, I_VBROADCASTF128 },
+ { "vcmpeq_ospd", TOKEN_INSN, C_none, 0, I_VCMPEQ_OSPD },
+ { "vcmpeqpd", TOKEN_INSN, C_none, 0, I_VCMPEQPD },
+ { "vcmplt_ospd", TOKEN_INSN, C_none, 0, I_VCMPLT_OSPD },
+ { "vcmpltpd", TOKEN_INSN, C_none, 0, I_VCMPLTPD },
+ { "vcmple_ospd", TOKEN_INSN, C_none, 0, I_VCMPLE_OSPD },
+ { "vcmplepd", TOKEN_INSN, C_none, 0, I_VCMPLEPD },
+ { "vcmpunord_qpd", TOKEN_INSN, C_none, 0, I_VCMPUNORD_QPD },
+ { "vcmpunordpd", TOKEN_INSN, C_none, 0, I_VCMPUNORDPD },
+ { "vcmpneq_uqpd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_UQPD },
+ { "vcmpneqpd", TOKEN_INSN, C_none, 0, I_VCMPNEQPD },
+ { "vcmpnlt_uspd", TOKEN_INSN, C_none, 0, I_VCMPNLT_USPD },
+ { "vcmpnltpd", TOKEN_INSN, C_none, 0, I_VCMPNLTPD },
+ { "vcmpnle_uspd", TOKEN_INSN, C_none, 0, I_VCMPNLE_USPD },
+ { "vcmpnlepd", TOKEN_INSN, C_none, 0, I_VCMPNLEPD },
+ { "vcmpord_qpd", TOKEN_INSN, C_none, 0, I_VCMPORD_QPD },
+ { "vcmpordpd", TOKEN_INSN, C_none, 0, I_VCMPORDPD },
+ { "vcmpeq_uqpd", TOKEN_INSN, C_none, 0, I_VCMPEQ_UQPD },
+ { "vcmpnge_uspd", TOKEN_INSN, C_none, 0, I_VCMPNGE_USPD },
+ { "vcmpngepd", TOKEN_INSN, C_none, 0, I_VCMPNGEPD },
+ { "vcmpngt_uspd", TOKEN_INSN, C_none, 0, I_VCMPNGT_USPD },
+ { "vcmpngtpd", TOKEN_INSN, C_none, 0, I_VCMPNGTPD },
+ { "vcmpfalse_oqpd", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OQPD },
+ { "vcmpfalsepd", TOKEN_INSN, C_none, 0, I_VCMPFALSEPD },
+ { "vcmpneq_oqpd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OQPD },
+ { "vcmpge_ospd", TOKEN_INSN, C_none, 0, I_VCMPGE_OSPD },
+ { "vcmpgepd", TOKEN_INSN, C_none, 0, I_VCMPGEPD },
+ { "vcmpgt_ospd", TOKEN_INSN, C_none, 0, I_VCMPGT_OSPD },
+ { "vcmpgtpd", TOKEN_INSN, C_none, 0, I_VCMPGTPD },
+ { "vcmptrue_uqpd", TOKEN_INSN, C_none, 0, I_VCMPTRUE_UQPD },
+ { "vcmptruepd", TOKEN_INSN, C_none, 0, I_VCMPTRUEPD },
+ { "vcmplt_oqpd", TOKEN_INSN, C_none, 0, I_VCMPLT_OQPD },
+ { "vcmple_oqpd", TOKEN_INSN, C_none, 0, I_VCMPLE_OQPD },
+ { "vcmpunord_spd", TOKEN_INSN, C_none, 0, I_VCMPUNORD_SPD },
+ { "vcmpneq_uspd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_USPD },
+ { "vcmpnlt_uqpd", TOKEN_INSN, C_none, 0, I_VCMPNLT_UQPD },
+ { "vcmpnle_uqpd", TOKEN_INSN, C_none, 0, I_VCMPNLE_UQPD },
+ { "vcmpord_spd", TOKEN_INSN, C_none, 0, I_VCMPORD_SPD },
+ { "vcmpeq_uspd", TOKEN_INSN, C_none, 0, I_VCMPEQ_USPD },
+ { "vcmpnge_uqpd", TOKEN_INSN, C_none, 0, I_VCMPNGE_UQPD },
+ { "vcmpngt_uqpd", TOKEN_INSN, C_none, 0, I_VCMPNGT_UQPD },
+ { "vcmpfalse_ospd", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OSPD },
+ { "vcmpneq_ospd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OSPD },
+ { "vcmpge_oqpd", TOKEN_INSN, C_none, 0, I_VCMPGE_OQPD },
+ { "vcmpgt_oqpd", TOKEN_INSN, C_none, 0, I_VCMPGT_OQPD },
+ { "vcmptrue_uspd", TOKEN_INSN, C_none, 0, I_VCMPTRUE_USPD },
+ { "vcmppd", TOKEN_INSN, C_none, 0, I_VCMPPD },
+ { "vcmpeq_osps", TOKEN_INSN, C_none, 0, I_VCMPEQ_OSPS },
+ { "vcmpeqps", TOKEN_INSN, C_none, 0, I_VCMPEQPS },
+ { "vcmplt_osps", TOKEN_INSN, C_none, 0, I_VCMPLT_OSPS },
+ { "vcmpltps", TOKEN_INSN, C_none, 0, I_VCMPLTPS },
+ { "vcmple_osps", TOKEN_INSN, C_none, 0, I_VCMPLE_OSPS },
+ { "vcmpleps", TOKEN_INSN, C_none, 0, I_VCMPLEPS },
+ { "vcmpunord_qps", TOKEN_INSN, C_none, 0, I_VCMPUNORD_QPS },
+ { "vcmpunordps", TOKEN_INSN, C_none, 0, I_VCMPUNORDPS },
+ { "vcmpneq_uqps", TOKEN_INSN, C_none, 0, I_VCMPNEQ_UQPS },
+ { "vcmpneqps", TOKEN_INSN, C_none, 0, I_VCMPNEQPS },
+ { "vcmpnlt_usps", TOKEN_INSN, C_none, 0, I_VCMPNLT_USPS },
+ { "vcmpnltps", TOKEN_INSN, C_none, 0, I_VCMPNLTPS },
+ { "vcmpnle_usps", TOKEN_INSN, C_none, 0, I_VCMPNLE_USPS },
+ { "vcmpnleps", TOKEN_INSN, C_none, 0, I_VCMPNLEPS },
+ { "vcmpord_qps", TOKEN_INSN, C_none, 0, I_VCMPORD_QPS },
+ { "vcmpordps", TOKEN_INSN, C_none, 0, I_VCMPORDPS },
+ { "vcmpeq_uqps", TOKEN_INSN, C_none, 0, I_VCMPEQ_UQPS },
+ { "vcmpnge_usps", TOKEN_INSN, C_none, 0, I_VCMPNGE_USPS },
+ { "vcmpngeps", TOKEN_INSN, C_none, 0, I_VCMPNGEPS },
+ { "vcmpngt_usps", TOKEN_INSN, C_none, 0, I_VCMPNGT_USPS },
+ { "vcmpngtps", TOKEN_INSN, C_none, 0, I_VCMPNGTPS },
+ { "vcmpfalse_oqps", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OQPS },
+ { "vcmpfalseps", TOKEN_INSN, C_none, 0, I_VCMPFALSEPS },
+ { "vcmpneq_oqps", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OQPS },
+ { "vcmpge_osps", TOKEN_INSN, C_none, 0, I_VCMPGE_OSPS },
+ { "vcmpgeps", TOKEN_INSN, C_none, 0, I_VCMPGEPS },
+ { "vcmpgt_osps", TOKEN_INSN, C_none, 0, I_VCMPGT_OSPS },
+ { "vcmpgtps", TOKEN_INSN, C_none, 0, I_VCMPGTPS },
+ { "vcmptrue_uqps", TOKEN_INSN, C_none, 0, I_VCMPTRUE_UQPS },
+ { "vcmptrueps", TOKEN_INSN, C_none, 0, I_VCMPTRUEPS },
+ { "vcmplt_oqps", TOKEN_INSN, C_none, 0, I_VCMPLT_OQPS },
+ { "vcmple_oqps", TOKEN_INSN, C_none, 0, I_VCMPLE_OQPS },
+ { "vcmpunord_sps", TOKEN_INSN, C_none, 0, I_VCMPUNORD_SPS },
+ { "vcmpneq_usps", TOKEN_INSN, C_none, 0, I_VCMPNEQ_USPS },
+ { "vcmpnlt_uqps", TOKEN_INSN, C_none, 0, I_VCMPNLT_UQPS },
+ { "vcmpnle_uqps", TOKEN_INSN, C_none, 0, I_VCMPNLE_UQPS },
+ { "vcmpord_sps", TOKEN_INSN, C_none, 0, I_VCMPORD_SPS },
+ { "vcmpeq_usps", TOKEN_INSN, C_none, 0, I_VCMPEQ_USPS },
+ { "vcmpnge_uqps", TOKEN_INSN, C_none, 0, I_VCMPNGE_UQPS },
+ { "vcmpngt_uqps", TOKEN_INSN, C_none, 0, I_VCMPNGT_UQPS },
+ { "vcmpfalse_osps", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OSPS },
+ { "vcmpneq_osps", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OSPS },
+ { "vcmpge_oqps", TOKEN_INSN, C_none, 0, I_VCMPGE_OQPS },
+ { "vcmpgt_oqps", TOKEN_INSN, C_none, 0, I_VCMPGT_OQPS },
+ { "vcmptrue_usps", TOKEN_INSN, C_none, 0, I_VCMPTRUE_USPS },
+ { "vcmpps", TOKEN_INSN, C_none, 0, I_VCMPPS },
+ { "vcmpeq_ossd", TOKEN_INSN, C_none, 0, I_VCMPEQ_OSSD },
+ { "vcmpeqsd", TOKEN_INSN, C_none, 0, I_VCMPEQSD },
+ { "vcmplt_ossd", TOKEN_INSN, C_none, 0, I_VCMPLT_OSSD },
+ { "vcmpltsd", TOKEN_INSN, C_none, 0, I_VCMPLTSD },
+ { "vcmple_ossd", TOKEN_INSN, C_none, 0, I_VCMPLE_OSSD },
+ { "vcmplesd", TOKEN_INSN, C_none, 0, I_VCMPLESD },
+ { "vcmpunord_qsd", TOKEN_INSN, C_none, 0, I_VCMPUNORD_QSD },
+ { "vcmpunordsd", TOKEN_INSN, C_none, 0, I_VCMPUNORDSD },
+ { "vcmpneq_uqsd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_UQSD },
+ { "vcmpneqsd", TOKEN_INSN, C_none, 0, I_VCMPNEQSD },
+ { "vcmpnlt_ussd", TOKEN_INSN, C_none, 0, I_VCMPNLT_USSD },
+ { "vcmpnltsd", TOKEN_INSN, C_none, 0, I_VCMPNLTSD },
+ { "vcmpnle_ussd", TOKEN_INSN, C_none, 0, I_VCMPNLE_USSD },
+ { "vcmpnlesd", TOKEN_INSN, C_none, 0, I_VCMPNLESD },
+ { "vcmpord_qsd", TOKEN_INSN, C_none, 0, I_VCMPORD_QSD },
+ { "vcmpordsd", TOKEN_INSN, C_none, 0, I_VCMPORDSD },
+ { "vcmpeq_uqsd", TOKEN_INSN, C_none, 0, I_VCMPEQ_UQSD },
+ { "vcmpnge_ussd", TOKEN_INSN, C_none, 0, I_VCMPNGE_USSD },
+ { "vcmpngesd", TOKEN_INSN, C_none, 0, I_VCMPNGESD },
+ { "vcmpngt_ussd", TOKEN_INSN, C_none, 0, I_VCMPNGT_USSD },
+ { "vcmpngtsd", TOKEN_INSN, C_none, 0, I_VCMPNGTSD },
+ { "vcmpfalse_oqsd", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OQSD },
+ { "vcmpfalsesd", TOKEN_INSN, C_none, 0, I_VCMPFALSESD },
+ { "vcmpneq_oqsd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OQSD },
+ { "vcmpge_ossd", TOKEN_INSN, C_none, 0, I_VCMPGE_OSSD },
+ { "vcmpgesd", TOKEN_INSN, C_none, 0, I_VCMPGESD },
+ { "vcmpgt_ossd", TOKEN_INSN, C_none, 0, I_VCMPGT_OSSD },
+ { "vcmpgtsd", TOKEN_INSN, C_none, 0, I_VCMPGTSD },
+ { "vcmptrue_uqsd", TOKEN_INSN, C_none, 0, I_VCMPTRUE_UQSD },
+ { "vcmptruesd", TOKEN_INSN, C_none, 0, I_VCMPTRUESD },
+ { "vcmplt_oqsd", TOKEN_INSN, C_none, 0, I_VCMPLT_OQSD },
+ { "vcmple_oqsd", TOKEN_INSN, C_none, 0, I_VCMPLE_OQSD },
+ { "vcmpunord_ssd", TOKEN_INSN, C_none, 0, I_VCMPUNORD_SSD },
+ { "vcmpneq_ussd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_USSD },
+ { "vcmpnlt_uqsd", TOKEN_INSN, C_none, 0, I_VCMPNLT_UQSD },
+ { "vcmpnle_uqsd", TOKEN_INSN, C_none, 0, I_VCMPNLE_UQSD },
+ { "vcmpord_ssd", TOKEN_INSN, C_none, 0, I_VCMPORD_SSD },
+ { "vcmpeq_ussd", TOKEN_INSN, C_none, 0, I_VCMPEQ_USSD },
+ { "vcmpnge_uqsd", TOKEN_INSN, C_none, 0, I_VCMPNGE_UQSD },
+ { "vcmpngt_uqsd", TOKEN_INSN, C_none, 0, I_VCMPNGT_UQSD },
+ { "vcmpfalse_ossd", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OSSD },
+ { "vcmpneq_ossd", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OSSD },
+ { "vcmpge_oqsd", TOKEN_INSN, C_none, 0, I_VCMPGE_OQSD },
+ { "vcmpgt_oqsd", TOKEN_INSN, C_none, 0, I_VCMPGT_OQSD },
+ { "vcmptrue_ussd", TOKEN_INSN, C_none, 0, I_VCMPTRUE_USSD },
+ { "vcmpsd", TOKEN_INSN, C_none, 0, I_VCMPSD },
+ { "vcmpeq_osss", TOKEN_INSN, C_none, 0, I_VCMPEQ_OSSS },
+ { "vcmpeqss", TOKEN_INSN, C_none, 0, I_VCMPEQSS },
+ { "vcmplt_osss", TOKEN_INSN, C_none, 0, I_VCMPLT_OSSS },
+ { "vcmpltss", TOKEN_INSN, C_none, 0, I_VCMPLTSS },
+ { "vcmple_osss", TOKEN_INSN, C_none, 0, I_VCMPLE_OSSS },
+ { "vcmpless", TOKEN_INSN, C_none, 0, I_VCMPLESS },
+ { "vcmpunord_qss", TOKEN_INSN, C_none, 0, I_VCMPUNORD_QSS },
+ { "vcmpunordss", TOKEN_INSN, C_none, 0, I_VCMPUNORDSS },
+ { "vcmpneq_uqss", TOKEN_INSN, C_none, 0, I_VCMPNEQ_UQSS },
+ { "vcmpneqss", TOKEN_INSN, C_none, 0, I_VCMPNEQSS },
+ { "vcmpnlt_usss", TOKEN_INSN, C_none, 0, I_VCMPNLT_USSS },
+ { "vcmpnltss", TOKEN_INSN, C_none, 0, I_VCMPNLTSS },
+ { "vcmpnle_usss", TOKEN_INSN, C_none, 0, I_VCMPNLE_USSS },
+ { "vcmpnless", TOKEN_INSN, C_none, 0, I_VCMPNLESS },
+ { "vcmpord_qss", TOKEN_INSN, C_none, 0, I_VCMPORD_QSS },
+ { "vcmpordss", TOKEN_INSN, C_none, 0, I_VCMPORDSS },
+ { "vcmpeq_uqss", TOKEN_INSN, C_none, 0, I_VCMPEQ_UQSS },
+ { "vcmpnge_usss", TOKEN_INSN, C_none, 0, I_VCMPNGE_USSS },
+ { "vcmpngess", TOKEN_INSN, C_none, 0, I_VCMPNGESS },
+ { "vcmpngt_usss", TOKEN_INSN, C_none, 0, I_VCMPNGT_USSS },
+ { "vcmpngtss", TOKEN_INSN, C_none, 0, I_VCMPNGTSS },
+ { "vcmpfalse_oqss", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OQSS },
+ { "vcmpfalsess", TOKEN_INSN, C_none, 0, I_VCMPFALSESS },
+ { "vcmpneq_oqss", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OQSS },
+ { "vcmpge_osss", TOKEN_INSN, C_none, 0, I_VCMPGE_OSSS },
+ { "vcmpgess", TOKEN_INSN, C_none, 0, I_VCMPGESS },
+ { "vcmpgt_osss", TOKEN_INSN, C_none, 0, I_VCMPGT_OSSS },
+ { "vcmpgtss", TOKEN_INSN, C_none, 0, I_VCMPGTSS },
+ { "vcmptrue_uqss", TOKEN_INSN, C_none, 0, I_VCMPTRUE_UQSS },
+ { "vcmptruess", TOKEN_INSN, C_none, 0, I_VCMPTRUESS },
+ { "vcmplt_oqss", TOKEN_INSN, C_none, 0, I_VCMPLT_OQSS },
+ { "vcmple_oqss", TOKEN_INSN, C_none, 0, I_VCMPLE_OQSS },
+ { "vcmpunord_sss", TOKEN_INSN, C_none, 0, I_VCMPUNORD_SSS },
+ { "vcmpneq_usss", TOKEN_INSN, C_none, 0, I_VCMPNEQ_USSS },
+ { "vcmpnlt_uqss", TOKEN_INSN, C_none, 0, I_VCMPNLT_UQSS },
+ { "vcmpnle_uqss", TOKEN_INSN, C_none, 0, I_VCMPNLE_UQSS },
+ { "vcmpord_sss", TOKEN_INSN, C_none, 0, I_VCMPORD_SSS },
+ { "vcmpeq_usss", TOKEN_INSN, C_none, 0, I_VCMPEQ_USSS },
+ { "vcmpnge_uqss", TOKEN_INSN, C_none, 0, I_VCMPNGE_UQSS },
+ { "vcmpngt_uqss", TOKEN_INSN, C_none, 0, I_VCMPNGT_UQSS },
+ { "vcmpfalse_osss", TOKEN_INSN, C_none, 0, I_VCMPFALSE_OSSS },
+ { "vcmpneq_osss", TOKEN_INSN, C_none, 0, I_VCMPNEQ_OSSS },
+ { "vcmpge_oqss", TOKEN_INSN, C_none, 0, I_VCMPGE_OQSS },
+ { "vcmpgt_oqss", TOKEN_INSN, C_none, 0, I_VCMPGT_OQSS },
+ { "vcmptrue_usss", TOKEN_INSN, C_none, 0, I_VCMPTRUE_USSS },
+ { "vcmpss", TOKEN_INSN, C_none, 0, I_VCMPSS },
+ { "vcomisd", TOKEN_INSN, C_none, 0, I_VCOMISD },
+ { "vcomiss", TOKEN_INSN, C_none, 0, I_VCOMISS },
+ { "vcvtdq2pd", TOKEN_INSN, C_none, 0, I_VCVTDQ2PD },
+ { "vcvtdq2ps", TOKEN_INSN, C_none, 0, I_VCVTDQ2PS },
+ { "vcvtpd2dq", TOKEN_INSN, C_none, 0, I_VCVTPD2DQ },
+ { "vcvtpd2ps", TOKEN_INSN, C_none, 0, I_VCVTPD2PS },
+ { "vcvtps2dq", TOKEN_INSN, C_none, 0, I_VCVTPS2DQ },
+ { "vcvtps2pd", TOKEN_INSN, C_none, 0, I_VCVTPS2PD },
+ { "vcvtsd2si", TOKEN_INSN, C_none, 0, I_VCVTSD2SI },
+ { "vcvtsd2ss", TOKEN_INSN, C_none, 0, I_VCVTSD2SS },
+ { "vcvtsi2sd", TOKEN_INSN, C_none, 0, I_VCVTSI2SD },
+ { "vcvtsi2ss", TOKEN_INSN, C_none, 0, I_VCVTSI2SS },
+ { "vcvtss2sd", TOKEN_INSN, C_none, 0, I_VCVTSS2SD },
+ { "vcvtss2si", TOKEN_INSN, C_none, 0, I_VCVTSS2SI },
+ { "vcvttpd2dq", TOKEN_INSN, C_none, 0, I_VCVTTPD2DQ },
+ { "vcvttps2dq", TOKEN_INSN, C_none, 0, I_VCVTTPS2DQ },
+ { "vcvttsd2si", TOKEN_INSN, C_none, 0, I_VCVTTSD2SI },
+ { "vcvttss2si", TOKEN_INSN, C_none, 0, I_VCVTTSS2SI },
+ { "vdivpd", TOKEN_INSN, C_none, 0, I_VDIVPD },
+ { "vdivps", TOKEN_INSN, C_none, 0, I_VDIVPS },
+ { "vdivsd", TOKEN_INSN, C_none, 0, I_VDIVSD },
+ { "vdivss", TOKEN_INSN, C_none, 0, I_VDIVSS },
+ { "vdppd", TOKEN_INSN, C_none, 0, I_VDPPD },
+ { "vdpps", TOKEN_INSN, C_none, 0, I_VDPPS },
+ { "vextractf128", TOKEN_INSN, C_none, 0, I_VEXTRACTF128 },
+ { "vextractps", TOKEN_INSN, C_none, 0, I_VEXTRACTPS },
+ { "vhaddpd", TOKEN_INSN, C_none, 0, I_VHADDPD },
+ { "vhaddps", TOKEN_INSN, C_none, 0, I_VHADDPS },
+ { "vhsubpd", TOKEN_INSN, C_none, 0, I_VHSUBPD },
+ { "vhsubps", TOKEN_INSN, C_none, 0, I_VHSUBPS },
+ { "vinsertf128", TOKEN_INSN, C_none, 0, I_VINSERTF128 },
+ { "vinsertps", TOKEN_INSN, C_none, 0, I_VINSERTPS },
+ { "vlddqu", TOKEN_INSN, C_none, 0, I_VLDDQU },
+ { "vldqqu", TOKEN_INSN, C_none, 0, I_VLDQQU },
+ { "vldmxcsr", TOKEN_INSN, C_none, 0, I_VLDMXCSR },
+ { "vmaskmovdqu", TOKEN_INSN, C_none, 0, I_VMASKMOVDQU },
+ { "vmaskmovps", TOKEN_INSN, C_none, 0, I_VMASKMOVPS },
+ { "vmaskmovpd", TOKEN_INSN, C_none, 0, I_VMASKMOVPD },
+ { "vmaxpd", TOKEN_INSN, C_none, 0, I_VMAXPD },
+ { "vmaxps", TOKEN_INSN, C_none, 0, I_VMAXPS },
+ { "vmaxsd", TOKEN_INSN, C_none, 0, I_VMAXSD },
+ { "vmaxss", TOKEN_INSN, C_none, 0, I_VMAXSS },
+ { "vminpd", TOKEN_INSN, C_none, 0, I_VMINPD },
+ { "vminps", TOKEN_INSN, C_none, 0, I_VMINPS },
+ { "vminsd", TOKEN_INSN, C_none, 0, I_VMINSD },
+ { "vminss", TOKEN_INSN, C_none, 0, I_VMINSS },
+ { "vmovapd", TOKEN_INSN, C_none, 0, I_VMOVAPD },
+ { "vmovaps", TOKEN_INSN, C_none, 0, I_VMOVAPS },
+ { "vmovd", TOKEN_INSN, C_none, 0, I_VMOVD },
+ { "vmovq", TOKEN_INSN, C_none, 0, I_VMOVQ },
+ { "vmovddup", TOKEN_INSN, C_none, 0, I_VMOVDDUP },
+ { "vmovdqa", TOKEN_INSN, C_none, 0, I_VMOVDQA },
+ { "vmovqqa", TOKEN_INSN, C_none, 0, I_VMOVQQA },
+ { "vmovdqu", TOKEN_INSN, C_none, 0, I_VMOVDQU },
+ { "vmovqqu", TOKEN_INSN, C_none, 0, I_VMOVQQU },
+ { "vmovhlps", TOKEN_INSN, C_none, 0, I_VMOVHLPS },
+ { "vmovhpd", TOKEN_INSN, C_none, 0, I_VMOVHPD },
+ { "vmovhps", TOKEN_INSN, C_none, 0, I_VMOVHPS },
+ { "vmovlhps", TOKEN_INSN, C_none, 0, I_VMOVLHPS },
+ { "vmovlpd", TOKEN_INSN, C_none, 0, I_VMOVLPD },
+ { "vmovlps", TOKEN_INSN, C_none, 0, I_VMOVLPS },
+ { "vmovmskpd", TOKEN_INSN, C_none, 0, I_VMOVMSKPD },
+ { "vmovmskps", TOKEN_INSN, C_none, 0, I_VMOVMSKPS },
+ { "vmovntdq", TOKEN_INSN, C_none, 0, I_VMOVNTDQ },
+ { "vmovntqq", TOKEN_INSN, C_none, 0, I_VMOVNTQQ },
+ { "vmovntdqa", TOKEN_INSN, C_none, 0, I_VMOVNTDQA },
+ { "vmovntpd", TOKEN_INSN, C_none, 0, I_VMOVNTPD },
+ { "vmovntps", TOKEN_INSN, C_none, 0, I_VMOVNTPS },
+ { "vmovsd", TOKEN_INSN, C_none, 0, I_VMOVSD },
+ { "vmovshdup", TOKEN_INSN, C_none, 0, I_VMOVSHDUP },
+ { "vmovsldup", TOKEN_INSN, C_none, 0, I_VMOVSLDUP },
+ { "vmovss", TOKEN_INSN, C_none, 0, I_VMOVSS },
+ { "vmovupd", TOKEN_INSN, C_none, 0, I_VMOVUPD },
+ { "vmovups", TOKEN_INSN, C_none, 0, I_VMOVUPS },
+ { "vmpsadbw", TOKEN_INSN, C_none, 0, I_VMPSADBW },
+ { "vmulpd", TOKEN_INSN, C_none, 0, I_VMULPD },
+ { "vmulps", TOKEN_INSN, C_none, 0, I_VMULPS },
+ { "vmulsd", TOKEN_INSN, C_none, 0, I_VMULSD },
+ { "vmulss", TOKEN_INSN, C_none, 0, I_VMULSS },
+ { "vorpd", TOKEN_INSN, C_none, 0, I_VORPD },
+ { "vorps", TOKEN_INSN, C_none, 0, I_VORPS },
+ { "vpabsb", TOKEN_INSN, C_none, 0, I_VPABSB },
+ { "vpabsw", TOKEN_INSN, C_none, 0, I_VPABSW },
+ { "vpabsd", TOKEN_INSN, C_none, 0, I_VPABSD },
+ { "vpacksswb", TOKEN_INSN, C_none, 0, I_VPACKSSWB },
+ { "vpackssdw", TOKEN_INSN, C_none, 0, I_VPACKSSDW },
+ { "vpackuswb", TOKEN_INSN, C_none, 0, I_VPACKUSWB },
+ { "vpackusdw", TOKEN_INSN, C_none, 0, I_VPACKUSDW },
+ { "vpaddb", TOKEN_INSN, C_none, 0, I_VPADDB },
+ { "vpaddw", TOKEN_INSN, C_none, 0, I_VPADDW },
+ { "vpaddd", TOKEN_INSN, C_none, 0, I_VPADDD },
+ { "vpaddq", TOKEN_INSN, C_none, 0, I_VPADDQ },
+ { "vpaddsb", TOKEN_INSN, C_none, 0, I_VPADDSB },
+ { "vpaddsw", TOKEN_INSN, C_none, 0, I_VPADDSW },
+ { "vpaddusb", TOKEN_INSN, C_none, 0, I_VPADDUSB },
+ { "vpaddusw", TOKEN_INSN, C_none, 0, I_VPADDUSW },
+ { "vpalignr", TOKEN_INSN, C_none, 0, I_VPALIGNR },
+ { "vpand", TOKEN_INSN, C_none, 0, I_VPAND },
+ { "vpandn", TOKEN_INSN, C_none, 0, I_VPANDN },
+ { "vpavgb", TOKEN_INSN, C_none, 0, I_VPAVGB },
+ { "vpavgw", TOKEN_INSN, C_none, 0, I_VPAVGW },
+ { "vpblendvb", TOKEN_INSN, C_none, 0, I_VPBLENDVB },
+ { "vpblendw", TOKEN_INSN, C_none, 0, I_VPBLENDW },
+ { "vpcmpestri", TOKEN_INSN, C_none, 0, I_VPCMPESTRI },
+ { "vpcmpestrm", TOKEN_INSN, C_none, 0, I_VPCMPESTRM },
+ { "vpcmpistri", TOKEN_INSN, C_none, 0, I_VPCMPISTRI },
+ { "vpcmpistrm", TOKEN_INSN, C_none, 0, I_VPCMPISTRM },
+ { "vpcmpeqb", TOKEN_INSN, C_none, 0, I_VPCMPEQB },
+ { "vpcmpeqw", TOKEN_INSN, C_none, 0, I_VPCMPEQW },
+ { "vpcmpeqd", TOKEN_INSN, C_none, 0, I_VPCMPEQD },
+ { "vpcmpeqq", TOKEN_INSN, C_none, 0, I_VPCMPEQQ },
+ { "vpcmpgtb", TOKEN_INSN, C_none, 0, I_VPCMPGTB },
+ { "vpcmpgtw", TOKEN_INSN, C_none, 0, I_VPCMPGTW },
+ { "vpcmpgtd", TOKEN_INSN, C_none, 0, I_VPCMPGTD },
+ { "vpcmpgtq", TOKEN_INSN, C_none, 0, I_VPCMPGTQ },
+ { "vpermilpd", TOKEN_INSN, C_none, 0, I_VPERMILPD },
+ { "vpermilps", TOKEN_INSN, C_none, 0, I_VPERMILPS },
+ { "vperm2f128", TOKEN_INSN, C_none, 0, I_VPERM2F128 },
+ { "vpextrb", TOKEN_INSN, C_none, 0, I_VPEXTRB },
+ { "vpextrw", TOKEN_INSN, C_none, 0, I_VPEXTRW },
+ { "vpextrd", TOKEN_INSN, C_none, 0, I_VPEXTRD },
+ { "vpextrq", TOKEN_INSN, C_none, 0, I_VPEXTRQ },
+ { "vphaddw", TOKEN_INSN, C_none, 0, I_VPHADDW },
+ { "vphaddd", TOKEN_INSN, C_none, 0, I_VPHADDD },
+ { "vphaddsw", TOKEN_INSN, C_none, 0, I_VPHADDSW },
+ { "vphminposuw", TOKEN_INSN, C_none, 0, I_VPHMINPOSUW },
+ { "vphsubw", TOKEN_INSN, C_none, 0, I_VPHSUBW },
+ { "vphsubd", TOKEN_INSN, C_none, 0, I_VPHSUBD },
+ { "vphsubsw", TOKEN_INSN, C_none, 0, I_VPHSUBSW },
+ { "vpinsrb", TOKEN_INSN, C_none, 0, I_VPINSRB },
+ { "vpinsrw", TOKEN_INSN, C_none, 0, I_VPINSRW },
+ { "vpinsrd", TOKEN_INSN, C_none, 0, I_VPINSRD },
+ { "vpinsrq", TOKEN_INSN, C_none, 0, I_VPINSRQ },
+ { "vpmaddwd", TOKEN_INSN, C_none, 0, I_VPMADDWD },
+ { "vpmaddubsw", TOKEN_INSN, C_none, 0, I_VPMADDUBSW },
+ { "vpmaxsb", TOKEN_INSN, C_none, 0, I_VPMAXSB },
+ { "vpmaxsw", TOKEN_INSN, C_none, 0, I_VPMAXSW },
+ { "vpmaxsd", TOKEN_INSN, C_none, 0, I_VPMAXSD },
+ { "vpmaxub", TOKEN_INSN, C_none, 0, I_VPMAXUB },
+ { "vpmaxuw", TOKEN_INSN, C_none, 0, I_VPMAXUW },
+ { "vpmaxud", TOKEN_INSN, C_none, 0, I_VPMAXUD },
+ { "vpminsb", TOKEN_INSN, C_none, 0, I_VPMINSB },
+ { "vpminsw", TOKEN_INSN, C_none, 0, I_VPMINSW },
+ { "vpminsd", TOKEN_INSN, C_none, 0, I_VPMINSD },
+ { "vpminub", TOKEN_INSN, C_none, 0, I_VPMINUB },
+ { "vpminuw", TOKEN_INSN, C_none, 0, I_VPMINUW },
+ { "vpminud", TOKEN_INSN, C_none, 0, I_VPMINUD },
+ { "vpmovmskb", TOKEN_INSN, C_none, 0, I_VPMOVMSKB },
+ { "vpmovsxbw", TOKEN_INSN, C_none, 0, I_VPMOVSXBW },
+ { "vpmovsxbd", TOKEN_INSN, C_none, 0, I_VPMOVSXBD },
+ { "vpmovsxbq", TOKEN_INSN, C_none, 0, I_VPMOVSXBQ },
+ { "vpmovsxwd", TOKEN_INSN, C_none, 0, I_VPMOVSXWD },
+ { "vpmovsxwq", TOKEN_INSN, C_none, 0, I_VPMOVSXWQ },
+ { "vpmovsxdq", TOKEN_INSN, C_none, 0, I_VPMOVSXDQ },
+ { "vpmovzxbw", TOKEN_INSN, C_none, 0, I_VPMOVZXBW },
+ { "vpmovzxbd", TOKEN_INSN, C_none, 0, I_VPMOVZXBD },
+ { "vpmovzxbq", TOKEN_INSN, C_none, 0, I_VPMOVZXBQ },
+ { "vpmovzxwd", TOKEN_INSN, C_none, 0, I_VPMOVZXWD },
+ { "vpmovzxwq", TOKEN_INSN, C_none, 0, I_VPMOVZXWQ },
+ { "vpmovzxdq", TOKEN_INSN, C_none, 0, I_VPMOVZXDQ },
+ { "vpmulhuw", TOKEN_INSN, C_none, 0, I_VPMULHUW },
+ { "vpmulhrsw", TOKEN_INSN, C_none, 0, I_VPMULHRSW },
+ { "vpmulhw", TOKEN_INSN, C_none, 0, I_VPMULHW },
+ { "vpmullw", TOKEN_INSN, C_none, 0, I_VPMULLW },
+ { "vpmulld", TOKEN_INSN, C_none, 0, I_VPMULLD },
+ { "vpmuludq", TOKEN_INSN, C_none, 0, I_VPMULUDQ },
+ { "vpmuldq", TOKEN_INSN, C_none, 0, I_VPMULDQ },
+ { "vpor", TOKEN_INSN, C_none, 0, I_VPOR },
+ { "vpsadbw", TOKEN_INSN, C_none, 0, I_VPSADBW },
+ { "vpshufb", TOKEN_INSN, C_none, 0, I_VPSHUFB },
+ { "vpshufd", TOKEN_INSN, C_none, 0, I_VPSHUFD },
+ { "vpshufhw", TOKEN_INSN, C_none, 0, I_VPSHUFHW },
+ { "vpshuflw", TOKEN_INSN, C_none, 0, I_VPSHUFLW },
+ { "vpsignb", TOKEN_INSN, C_none, 0, I_VPSIGNB },
+ { "vpsignw", TOKEN_INSN, C_none, 0, I_VPSIGNW },
+ { "vpsignd", TOKEN_INSN, C_none, 0, I_VPSIGND },
+ { "vpslldq", TOKEN_INSN, C_none, 0, I_VPSLLDQ },
+ { "vpsrldq", TOKEN_INSN, C_none, 0, I_VPSRLDQ },
+ { "vpsllw", TOKEN_INSN, C_none, 0, I_VPSLLW },
+ { "vpslld", TOKEN_INSN, C_none, 0, I_VPSLLD },
+ { "vpsllq", TOKEN_INSN, C_none, 0, I_VPSLLQ },
+ { "vpsraw", TOKEN_INSN, C_none, 0, I_VPSRAW },
+ { "vpsrad", TOKEN_INSN, C_none, 0, I_VPSRAD },
+ { "vpsrlw", TOKEN_INSN, C_none, 0, I_VPSRLW },
+ { "vpsrld", TOKEN_INSN, C_none, 0, I_VPSRLD },
+ { "vpsrlq", TOKEN_INSN, C_none, 0, I_VPSRLQ },
+ { "vptest", TOKEN_INSN, C_none, 0, I_VPTEST },
+ { "vpsubb", TOKEN_INSN, C_none, 0, I_VPSUBB },
+ { "vpsubw", TOKEN_INSN, C_none, 0, I_VPSUBW },
+ { "vpsubd", TOKEN_INSN, C_none, 0, I_VPSUBD },
+ { "vpsubq", TOKEN_INSN, C_none, 0, I_VPSUBQ },
+ { "vpsubsb", TOKEN_INSN, C_none, 0, I_VPSUBSB },
+ { "vpsubsw", TOKEN_INSN, C_none, 0, I_VPSUBSW },
+ { "vpsubusb", TOKEN_INSN, C_none, 0, I_VPSUBUSB },
+ { "vpsubusw", TOKEN_INSN, C_none, 0, I_VPSUBUSW },
+ { "vpunpckhbw", TOKEN_INSN, C_none, 0, I_VPUNPCKHBW },
+ { "vpunpckhwd", TOKEN_INSN, C_none, 0, I_VPUNPCKHWD },
+ { "vpunpckhdq", TOKEN_INSN, C_none, 0, I_VPUNPCKHDQ },
+ { "vpunpckhqdq", TOKEN_INSN, C_none, 0, I_VPUNPCKHQDQ },
+ { "vpunpcklbw", TOKEN_INSN, C_none, 0, I_VPUNPCKLBW },
+ { "vpunpcklwd", TOKEN_INSN, C_none, 0, I_VPUNPCKLWD },
+ { "vpunpckldq", TOKEN_INSN, C_none, 0, I_VPUNPCKLDQ },
+ { "vpunpcklqdq", TOKEN_INSN, C_none, 0, I_VPUNPCKLQDQ },
+ { "vpxor", TOKEN_INSN, C_none, 0, I_VPXOR },
+ { "vrcpps", TOKEN_INSN, C_none, 0, I_VRCPPS },
+ { "vrcpss", TOKEN_INSN, C_none, 0, I_VRCPSS },
+ { "vrsqrtps", TOKEN_INSN, C_none, 0, I_VRSQRTPS },
+ { "vrsqrtss", TOKEN_INSN, C_none, 0, I_VRSQRTSS },
+ { "vroundpd", TOKEN_INSN, C_none, 0, I_VROUNDPD },
+ { "vroundps", TOKEN_INSN, C_none, 0, I_VROUNDPS },
+ { "vroundsd", TOKEN_INSN, C_none, 0, I_VROUNDSD },
+ { "vroundss", TOKEN_INSN, C_none, 0, I_VROUNDSS },
+ { "vshufpd", TOKEN_INSN, C_none, 0, I_VSHUFPD },
+ { "vshufps", TOKEN_INSN, C_none, 0, I_VSHUFPS },
+ { "vsqrtpd", TOKEN_INSN, C_none, 0, I_VSQRTPD },
+ { "vsqrtps", TOKEN_INSN, C_none, 0, I_VSQRTPS },
+ { "vsqrtsd", TOKEN_INSN, C_none, 0, I_VSQRTSD },
+ { "vsqrtss", TOKEN_INSN, C_none, 0, I_VSQRTSS },
+ { "vstmxcsr", TOKEN_INSN, C_none, 0, I_VSTMXCSR },
+ { "vsubpd", TOKEN_INSN, C_none, 0, I_VSUBPD },
+ { "vsubps", TOKEN_INSN, C_none, 0, I_VSUBPS },
+ { "vsubsd", TOKEN_INSN, C_none, 0, I_VSUBSD },
+ { "vsubss", TOKEN_INSN, C_none, 0, I_VSUBSS },
+ { "vtestps", TOKEN_INSN, C_none, 0, I_VTESTPS },
+ { "vtestpd", TOKEN_INSN, C_none, 0, I_VTESTPD },
+ { "vucomisd", TOKEN_INSN, C_none, 0, I_VUCOMISD },
+ { "vucomiss", TOKEN_INSN, C_none, 0, I_VUCOMISS },
+ { "vunpckhpd", TOKEN_INSN, C_none, 0, I_VUNPCKHPD },
+ { "vunpckhps", TOKEN_INSN, C_none, 0, I_VUNPCKHPS },
+ { "vunpcklpd", TOKEN_INSN, C_none, 0, I_VUNPCKLPD },
+ { "vunpcklps", TOKEN_INSN, C_none, 0, I_VUNPCKLPS },
+ { "vxorpd", TOKEN_INSN, C_none, 0, I_VXORPD },
+ { "vxorps", TOKEN_INSN, C_none, 0, I_VXORPS },
+ { "vzeroall", TOKEN_INSN, C_none, 0, I_VZEROALL },
+ { "vzeroupper", TOKEN_INSN, C_none, 0, I_VZEROUPPER },
+ { "pclmullqlqdq", TOKEN_INSN, C_none, 0, I_PCLMULLQLQDQ },
+ { "pclmulhqlqdq", TOKEN_INSN, C_none, 0, I_PCLMULHQLQDQ },
+ { "pclmullqhqdq", TOKEN_INSN, C_none, 0, I_PCLMULLQHQDQ },
+ { "pclmulhqhqdq", TOKEN_INSN, C_none, 0, I_PCLMULHQHQDQ },
+ { "pclmulqdq", TOKEN_INSN, C_none, 0, I_PCLMULQDQ },
+ { "vpclmullqlqdq", TOKEN_INSN, C_none, 0, I_VPCLMULLQLQDQ },
+ { "vpclmulhqlqdq", TOKEN_INSN, C_none, 0, I_VPCLMULHQLQDQ },
+ { "vpclmullqhqdq", TOKEN_INSN, C_none, 0, I_VPCLMULLQHQDQ },
+ { "vpclmulhqhqdq", TOKEN_INSN, C_none, 0, I_VPCLMULHQHQDQ },
+ { "vpclmulqdq", TOKEN_INSN, C_none, 0, I_VPCLMULQDQ },
+ { "vfmadd132ps", TOKEN_INSN, C_none, 0, I_VFMADD132PS },
+ { "vfmadd132pd", TOKEN_INSN, C_none, 0, I_VFMADD132PD },
+ { "vfmadd312ps", TOKEN_INSN, C_none, 0, I_VFMADD312PS },
+ { "vfmadd312pd", TOKEN_INSN, C_none, 0, I_VFMADD312PD },
+ { "vfmadd213ps", TOKEN_INSN, C_none, 0, I_VFMADD213PS },
+ { "vfmadd213pd", TOKEN_INSN, C_none, 0, I_VFMADD213PD },
+ { "vfmadd123ps", TOKEN_INSN, C_none, 0, I_VFMADD123PS },
+ { "vfmadd123pd", TOKEN_INSN, C_none, 0, I_VFMADD123PD },
+ { "vfmadd231ps", TOKEN_INSN, C_none, 0, I_VFMADD231PS },
+ { "vfmadd231pd", TOKEN_INSN, C_none, 0, I_VFMADD231PD },
+ { "vfmadd321ps", TOKEN_INSN, C_none, 0, I_VFMADD321PS },
+ { "vfmadd321pd", TOKEN_INSN, C_none, 0, I_VFMADD321PD },
+ { "vfmaddsub132ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB132PS },
+ { "vfmaddsub132pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB132PD },
+ { "vfmaddsub312ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB312PS },
+ { "vfmaddsub312pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB312PD },
+ { "vfmaddsub213ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB213PS },
+ { "vfmaddsub213pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB213PD },
+ { "vfmaddsub123ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB123PS },
+ { "vfmaddsub123pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB123PD },
+ { "vfmaddsub231ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB231PS },
+ { "vfmaddsub231pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB231PD },
+ { "vfmaddsub321ps", TOKEN_INSN, C_none, 0, I_VFMADDSUB321PS },
+ { "vfmaddsub321pd", TOKEN_INSN, C_none, 0, I_VFMADDSUB321PD },
+ { "vfmsub132ps", TOKEN_INSN, C_none, 0, I_VFMSUB132PS },
+ { "vfmsub132pd", TOKEN_INSN, C_none, 0, I_VFMSUB132PD },
+ { "vfmsub312ps", TOKEN_INSN, C_none, 0, I_VFMSUB312PS },
+ { "vfmsub312pd", TOKEN_INSN, C_none, 0, I_VFMSUB312PD },
+ { "vfmsub213ps", TOKEN_INSN, C_none, 0, I_VFMSUB213PS },
+ { "vfmsub213pd", TOKEN_INSN, C_none, 0, I_VFMSUB213PD },
+ { "vfmsub123ps", TOKEN_INSN, C_none, 0, I_VFMSUB123PS },
+ { "vfmsub123pd", TOKEN_INSN, C_none, 0, I_VFMSUB123PD },
+ { "vfmsub231ps", TOKEN_INSN, C_none, 0, I_VFMSUB231PS },
+ { "vfmsub231pd", TOKEN_INSN, C_none, 0, I_VFMSUB231PD },
+ { "vfmsub321ps", TOKEN_INSN, C_none, 0, I_VFMSUB321PS },
+ { "vfmsub321pd", TOKEN_INSN, C_none, 0, I_VFMSUB321PD },
+ { "vfmsubadd132ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD132PS },
+ { "vfmsubadd132pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD132PD },
+ { "vfmsubadd312ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD312PS },
+ { "vfmsubadd312pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD312PD },
+ { "vfmsubadd213ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD213PS },
+ { "vfmsubadd213pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD213PD },
+ { "vfmsubadd123ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD123PS },
+ { "vfmsubadd123pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD123PD },
+ { "vfmsubadd231ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD231PS },
+ { "vfmsubadd231pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD231PD },
+ { "vfmsubadd321ps", TOKEN_INSN, C_none, 0, I_VFMSUBADD321PS },
+ { "vfmsubadd321pd", TOKEN_INSN, C_none, 0, I_VFMSUBADD321PD },
+ { "vfnmadd132ps", TOKEN_INSN, C_none, 0, I_VFNMADD132PS },
+ { "vfnmadd132pd", TOKEN_INSN, C_none, 0, I_VFNMADD132PD },
+ { "vfnmadd312ps", TOKEN_INSN, C_none, 0, I_VFNMADD312PS },
+ { "vfnmadd312pd", TOKEN_INSN, C_none, 0, I_VFNMADD312PD },
+ { "vfnmadd213ps", TOKEN_INSN, C_none, 0, I_VFNMADD213PS },
+ { "vfnmadd213pd", TOKEN_INSN, C_none, 0, I_VFNMADD213PD },
+ { "vfnmadd123ps", TOKEN_INSN, C_none, 0, I_VFNMADD123PS },
+ { "vfnmadd123pd", TOKEN_INSN, C_none, 0, I_VFNMADD123PD },
+ { "vfnmadd231ps", TOKEN_INSN, C_none, 0, I_VFNMADD231PS },
+ { "vfnmadd231pd", TOKEN_INSN, C_none, 0, I_VFNMADD231PD },
+ { "vfnmadd321ps", TOKEN_INSN, C_none, 0, I_VFNMADD321PS },
+ { "vfnmadd321pd", TOKEN_INSN, C_none, 0, I_VFNMADD321PD },
+ { "vfnmsub132ps", TOKEN_INSN, C_none, 0, I_VFNMSUB132PS },
+ { "vfnmsub132pd", TOKEN_INSN, C_none, 0, I_VFNMSUB132PD },
+ { "vfnmsub312ps", TOKEN_INSN, C_none, 0, I_VFNMSUB312PS },
+ { "vfnmsub312pd", TOKEN_INSN, C_none, 0, I_VFNMSUB312PD },
+ { "vfnmsub213ps", TOKEN_INSN, C_none, 0, I_VFNMSUB213PS },
+ { "vfnmsub213pd", TOKEN_INSN, C_none, 0, I_VFNMSUB213PD },
+ { "vfnmsub123ps", TOKEN_INSN, C_none, 0, I_VFNMSUB123PS },
+ { "vfnmsub123pd", TOKEN_INSN, C_none, 0, I_VFNMSUB123PD },
+ { "vfnmsub231ps", TOKEN_INSN, C_none, 0, I_VFNMSUB231PS },
+ { "vfnmsub231pd", TOKEN_INSN, C_none, 0, I_VFNMSUB231PD },
+ { "vfnmsub321ps", TOKEN_INSN, C_none, 0, I_VFNMSUB321PS },
+ { "vfnmsub321pd", TOKEN_INSN, C_none, 0, I_VFNMSUB321PD },
+ { "vfmadd132ss", TOKEN_INSN, C_none, 0, I_VFMADD132SS },
+ { "vfmadd132sd", TOKEN_INSN, C_none, 0, I_VFMADD132SD },
+ { "vfmadd312ss", TOKEN_INSN, C_none, 0, I_VFMADD312SS },
+ { "vfmadd312sd", TOKEN_INSN, C_none, 0, I_VFMADD312SD },
+ { "vfmadd213ss", TOKEN_INSN, C_none, 0, I_VFMADD213SS },
+ { "vfmadd213sd", TOKEN_INSN, C_none, 0, I_VFMADD213SD },
+ { "vfmadd123ss", TOKEN_INSN, C_none, 0, I_VFMADD123SS },
+ { "vfmadd123sd", TOKEN_INSN, C_none, 0, I_VFMADD123SD },
+ { "vfmadd231ss", TOKEN_INSN, C_none, 0, I_VFMADD231SS },
+ { "vfmadd231sd", TOKEN_INSN, C_none, 0, I_VFMADD231SD },
+ { "vfmadd321ss", TOKEN_INSN, C_none, 0, I_VFMADD321SS },
+ { "vfmadd321sd", TOKEN_INSN, C_none, 0, I_VFMADD321SD },
+ { "vfmsub132ss", TOKEN_INSN, C_none, 0, I_VFMSUB132SS },
+ { "vfmsub132sd", TOKEN_INSN, C_none, 0, I_VFMSUB132SD },
+ { "vfmsub312ss", TOKEN_INSN, C_none, 0, I_VFMSUB312SS },
+ { "vfmsub312sd", TOKEN_INSN, C_none, 0, I_VFMSUB312SD },
+ { "vfmsub213ss", TOKEN_INSN, C_none, 0, I_VFMSUB213SS },
+ { "vfmsub213sd", TOKEN_INSN, C_none, 0, I_VFMSUB213SD },
+ { "vfmsub123ss", TOKEN_INSN, C_none, 0, I_VFMSUB123SS },
+ { "vfmsub123sd", TOKEN_INSN, C_none, 0, I_VFMSUB123SD },
+ { "vfmsub231ss", TOKEN_INSN, C_none, 0, I_VFMSUB231SS },
+ { "vfmsub231sd", TOKEN_INSN, C_none, 0, I_VFMSUB231SD },
+ { "vfmsub321ss", TOKEN_INSN, C_none, 0, I_VFMSUB321SS },
+ { "vfmsub321sd", TOKEN_INSN, C_none, 0, I_VFMSUB321SD },
+ { "vfnmadd132ss", TOKEN_INSN, C_none, 0, I_VFNMADD132SS },
+ { "vfnmadd132sd", TOKEN_INSN, C_none, 0, I_VFNMADD132SD },
+ { "vfnmadd312ss", TOKEN_INSN, C_none, 0, I_VFNMADD312SS },
+ { "vfnmadd312sd", TOKEN_INSN, C_none, 0, I_VFNMADD312SD },
+ { "vfnmadd213ss", TOKEN_INSN, C_none, 0, I_VFNMADD213SS },
+ { "vfnmadd213sd", TOKEN_INSN, C_none, 0, I_VFNMADD213SD },
+ { "vfnmadd123ss", TOKEN_INSN, C_none, 0, I_VFNMADD123SS },
+ { "vfnmadd123sd", TOKEN_INSN, C_none, 0, I_VFNMADD123SD },
+ { "vfnmadd231ss", TOKEN_INSN, C_none, 0, I_VFNMADD231SS },
+ { "vfnmadd231sd", TOKEN_INSN, C_none, 0, I_VFNMADD231SD },
+ { "vfnmadd321ss", TOKEN_INSN, C_none, 0, I_VFNMADD321SS },
+ { "vfnmadd321sd", TOKEN_INSN, C_none, 0, I_VFNMADD321SD },
+ { "vfnmsub132ss", TOKEN_INSN, C_none, 0, I_VFNMSUB132SS },
+ { "vfnmsub132sd", TOKEN_INSN, C_none, 0, I_VFNMSUB132SD },
+ { "vfnmsub312ss", TOKEN_INSN, C_none, 0, I_VFNMSUB312SS },
+ { "vfnmsub312sd", TOKEN_INSN, C_none, 0, I_VFNMSUB312SD },
+ { "vfnmsub213ss", TOKEN_INSN, C_none, 0, I_VFNMSUB213SS },
+ { "vfnmsub213sd", TOKEN_INSN, C_none, 0, I_VFNMSUB213SD },
+ { "vfnmsub123ss", TOKEN_INSN, C_none, 0, I_VFNMSUB123SS },
+ { "vfnmsub123sd", TOKEN_INSN, C_none, 0, I_VFNMSUB123SD },
+ { "vfnmsub231ss", TOKEN_INSN, C_none, 0, I_VFNMSUB231SS },
+ { "vfnmsub231sd", TOKEN_INSN, C_none, 0, I_VFNMSUB231SD },
+ { "vfnmsub321ss", TOKEN_INSN, C_none, 0, I_VFNMSUB321SS },
+ { "vfnmsub321sd", TOKEN_INSN, C_none, 0, I_VFNMSUB321SD },
+ { "rdfsbase", TOKEN_INSN, C_none, 0, I_RDFSBASE },
+ { "rdgsbase", TOKEN_INSN, C_none, 0, I_RDGSBASE },
+ { "rdrand", TOKEN_INSN, C_none, 0, I_RDRAND },
+ { "wrfsbase", TOKEN_INSN, C_none, 0, I_WRFSBASE },
+ { "wrgsbase", TOKEN_INSN, C_none, 0, I_WRGSBASE },
+ { "vcvtph2ps", TOKEN_INSN, C_none, 0, I_VCVTPH2PS },
+ { "vcvtps2ph", TOKEN_INSN, C_none, 0, I_VCVTPS2PH },
+ { "adcx", TOKEN_INSN, C_none, 0, I_ADCX },
+ { "adox", TOKEN_INSN, C_none, 0, I_ADOX },
+ { "rdseed", TOKEN_INSN, C_none, 0, I_RDSEED },
+ { "clac", TOKEN_INSN, C_none, 0, I_CLAC },
+ { "stac", TOKEN_INSN, C_none, 0, I_STAC },
+ { "xstore", TOKEN_INSN, C_none, 0, I_XSTORE },
+ { "xcryptecb", TOKEN_INSN, C_none, 0, I_XCRYPTECB },
+ { "xcryptcbc", TOKEN_INSN, C_none, 0, I_XCRYPTCBC },
+ { "xcryptctr", TOKEN_INSN, C_none, 0, I_XCRYPTCTR },
+ { "xcryptcfb", TOKEN_INSN, C_none, 0, I_XCRYPTCFB },
+ { "xcryptofb", TOKEN_INSN, C_none, 0, I_XCRYPTOFB },
+ { "montmul", TOKEN_INSN, C_none, 0, I_MONTMUL },
+ { "xsha1", TOKEN_INSN, C_none, 0, I_XSHA1 },
+ { "xsha256", TOKEN_INSN, C_none, 0, I_XSHA256 },
+ { "llwpcb", TOKEN_INSN, C_none, 0, I_LLWPCB },
+ { "slwpcb", TOKEN_INSN, C_none, 0, I_SLWPCB },
+ { "lwpval", TOKEN_INSN, C_none, 0, I_LWPVAL },
+ { "lwpins", TOKEN_INSN, C_none, 0, I_LWPINS },
+ { "vfmaddpd", TOKEN_INSN, C_none, 0, I_VFMADDPD },
+ { "vfmaddps", TOKEN_INSN, C_none, 0, I_VFMADDPS },
+ { "vfmaddsd", TOKEN_INSN, C_none, 0, I_VFMADDSD },
+ { "vfmaddss", TOKEN_INSN, C_none, 0, I_VFMADDSS },
+ { "vfmaddsubpd", TOKEN_INSN, C_none, 0, I_VFMADDSUBPD },
+ { "vfmaddsubps", TOKEN_INSN, C_none, 0, I_VFMADDSUBPS },
+ { "vfmsubaddpd", TOKEN_INSN, C_none, 0, I_VFMSUBADDPD },
+ { "vfmsubaddps", TOKEN_INSN, C_none, 0, I_VFMSUBADDPS },
+ { "vfmsubpd", TOKEN_INSN, C_none, 0, I_VFMSUBPD },
+ { "vfmsubps", TOKEN_INSN, C_none, 0, I_VFMSUBPS },
+ { "vfmsubsd", TOKEN_INSN, C_none, 0, I_VFMSUBSD },
+ { "vfmsubss", TOKEN_INSN, C_none, 0, I_VFMSUBSS },
+ { "vfnmaddpd", TOKEN_INSN, C_none, 0, I_VFNMADDPD },
+ { "vfnmaddps", TOKEN_INSN, C_none, 0, I_VFNMADDPS },
+ { "vfnmaddsd", TOKEN_INSN, C_none, 0, I_VFNMADDSD },
+ { "vfnmaddss", TOKEN_INSN, C_none, 0, I_VFNMADDSS },
+ { "vfnmsubpd", TOKEN_INSN, C_none, 0, I_VFNMSUBPD },
+ { "vfnmsubps", TOKEN_INSN, C_none, 0, I_VFNMSUBPS },
+ { "vfnmsubsd", TOKEN_INSN, C_none, 0, I_VFNMSUBSD },
+ { "vfnmsubss", TOKEN_INSN, C_none, 0, I_VFNMSUBSS },
+ { "vfrczpd", TOKEN_INSN, C_none, 0, I_VFRCZPD },
+ { "vfrczps", TOKEN_INSN, C_none, 0, I_VFRCZPS },
+ { "vfrczsd", TOKEN_INSN, C_none, 0, I_VFRCZSD },
+ { "vfrczss", TOKEN_INSN, C_none, 0, I_VFRCZSS },
+ { "vpcmov", TOKEN_INSN, C_none, 0, I_VPCMOV },
+ { "vpcomb", TOKEN_INSN, C_none, 0, I_VPCOMB },
+ { "vpcomd", TOKEN_INSN, C_none, 0, I_VPCOMD },
+ { "vpcomq", TOKEN_INSN, C_none, 0, I_VPCOMQ },
+ { "vpcomub", TOKEN_INSN, C_none, 0, I_VPCOMUB },
+ { "vpcomud", TOKEN_INSN, C_none, 0, I_VPCOMUD },
+ { "vpcomuq", TOKEN_INSN, C_none, 0, I_VPCOMUQ },
+ { "vpcomuw", TOKEN_INSN, C_none, 0, I_VPCOMUW },
+ { "vpcomw", TOKEN_INSN, C_none, 0, I_VPCOMW },
+ { "vphaddbd", TOKEN_INSN, C_none, 0, I_VPHADDBD },
+ { "vphaddbq", TOKEN_INSN, C_none, 0, I_VPHADDBQ },
+ { "vphaddbw", TOKEN_INSN, C_none, 0, I_VPHADDBW },
+ { "vphadddq", TOKEN_INSN, C_none, 0, I_VPHADDDQ },
+ { "vphaddubd", TOKEN_INSN, C_none, 0, I_VPHADDUBD },
+ { "vphaddubq", TOKEN_INSN, C_none, 0, I_VPHADDUBQ },
+ { "vphaddubw", TOKEN_INSN, C_none, 0, I_VPHADDUBW },
+ { "vphaddudq", TOKEN_INSN, C_none, 0, I_VPHADDUDQ },
+ { "vphadduwd", TOKEN_INSN, C_none, 0, I_VPHADDUWD },
+ { "vphadduwq", TOKEN_INSN, C_none, 0, I_VPHADDUWQ },
+ { "vphaddwd", TOKEN_INSN, C_none, 0, I_VPHADDWD },
+ { "vphaddwq", TOKEN_INSN, C_none, 0, I_VPHADDWQ },
+ { "vphsubbw", TOKEN_INSN, C_none, 0, I_VPHSUBBW },
+ { "vphsubdq", TOKEN_INSN, C_none, 0, I_VPHSUBDQ },
+ { "vphsubwd", TOKEN_INSN, C_none, 0, I_VPHSUBWD },
+ { "vpmacsdd", TOKEN_INSN, C_none, 0, I_VPMACSDD },
+ { "vpmacsdqh", TOKEN_INSN, C_none, 0, I_VPMACSDQH },
+ { "vpmacsdql", TOKEN_INSN, C_none, 0, I_VPMACSDQL },
+ { "vpmacssdd", TOKEN_INSN, C_none, 0, I_VPMACSSDD },
+ { "vpmacssdqh", TOKEN_INSN, C_none, 0, I_VPMACSSDQH },
+ { "vpmacssdql", TOKEN_INSN, C_none, 0, I_VPMACSSDQL },
+ { "vpmacsswd", TOKEN_INSN, C_none, 0, I_VPMACSSWD },
+ { "vpmacssww", TOKEN_INSN, C_none, 0, I_VPMACSSWW },
+ { "vpmacswd", TOKEN_INSN, C_none, 0, I_VPMACSWD },
+ { "vpmacsww", TOKEN_INSN, C_none, 0, I_VPMACSWW },
+ { "vpmadcsswd", TOKEN_INSN, C_none, 0, I_VPMADCSSWD },
+ { "vpmadcswd", TOKEN_INSN, C_none, 0, I_VPMADCSWD },
+ { "vpperm", TOKEN_INSN, C_none, 0, I_VPPERM },
+ { "vprotb", TOKEN_INSN, C_none, 0, I_VPROTB },
+ { "vprotd", TOKEN_INSN, C_none, 0, I_VPROTD },
+ { "vprotq", TOKEN_INSN, C_none, 0, I_VPROTQ },
+ { "vprotw", TOKEN_INSN, C_none, 0, I_VPROTW },
+ { "vpshab", TOKEN_INSN, C_none, 0, I_VPSHAB },
+ { "vpshad", TOKEN_INSN, C_none, 0, I_VPSHAD },
+ { "vpshaq", TOKEN_INSN, C_none, 0, I_VPSHAQ },
+ { "vpshaw", TOKEN_INSN, C_none, 0, I_VPSHAW },
+ { "vpshlb", TOKEN_INSN, C_none, 0, I_VPSHLB },
+ { "vpshld", TOKEN_INSN, C_none, 0, I_VPSHLD },
+ { "vpshlq", TOKEN_INSN, C_none, 0, I_VPSHLQ },
+ { "vpshlw", TOKEN_INSN, C_none, 0, I_VPSHLW },
+ { "vbroadcasti128", TOKEN_INSN, C_none, 0, I_VBROADCASTI128 },
+ { "vpblendd", TOKEN_INSN, C_none, 0, I_VPBLENDD },
+ { "vpbroadcastb", TOKEN_INSN, C_none, 0, I_VPBROADCASTB },
+ { "vpbroadcastw", TOKEN_INSN, C_none, 0, I_VPBROADCASTW },
+ { "vpbroadcastd", TOKEN_INSN, C_none, 0, I_VPBROADCASTD },
+ { "vpbroadcastq", TOKEN_INSN, C_none, 0, I_VPBROADCASTQ },
+ { "vpermd", TOKEN_INSN, C_none, 0, I_VPERMD },
+ { "vpermpd", TOKEN_INSN, C_none, 0, I_VPERMPD },
+ { "vpermps", TOKEN_INSN, C_none, 0, I_VPERMPS },
+ { "vpermq", TOKEN_INSN, C_none, 0, I_VPERMQ },
+ { "vperm2i128", TOKEN_INSN, C_none, 0, I_VPERM2I128 },
+ { "vextracti128", TOKEN_INSN, C_none, 0, I_VEXTRACTI128 },
+ { "vinserti128", TOKEN_INSN, C_none, 0, I_VINSERTI128 },
+ { "vpmaskmovd", TOKEN_INSN, C_none, 0, I_VPMASKMOVD },
+ { "vpmaskmovq", TOKEN_INSN, C_none, 0, I_VPMASKMOVQ },
+ { "vpsllvd", TOKEN_INSN, C_none, 0, I_VPSLLVD },
+ { "vpsllvq", TOKEN_INSN, C_none, 0, I_VPSLLVQ },
+ { "vpsravd", TOKEN_INSN, C_none, 0, I_VPSRAVD },
+ { "vpsrlvd", TOKEN_INSN, C_none, 0, I_VPSRLVD },
+ { "vpsrlvq", TOKEN_INSN, C_none, 0, I_VPSRLVQ },
+ { "vgatherdpd", TOKEN_INSN, C_none, 0, I_VGATHERDPD },
+ { "vgatherqpd", TOKEN_INSN, C_none, 0, I_VGATHERQPD },
+ { "vgatherdps", TOKEN_INSN, C_none, 0, I_VGATHERDPS },
+ { "vgatherqps", TOKEN_INSN, C_none, 0, I_VGATHERQPS },
+ { "vpgatherdd", TOKEN_INSN, C_none, 0, I_VPGATHERDD },
+ { "vpgatherqd", TOKEN_INSN, C_none, 0, I_VPGATHERQD },
+ { "vpgatherdq", TOKEN_INSN, C_none, 0, I_VPGATHERDQ },
+ { "vpgatherqq", TOKEN_INSN, C_none, 0, I_VPGATHERQQ },
+ { "xabort", TOKEN_INSN, C_none, 0, I_XABORT },
+ { "xbegin", TOKEN_INSN, C_none, 0, I_XBEGIN },
+ { "xend", TOKEN_INSN, C_none, 0, I_XEND },
+ { "xtest", TOKEN_INSN, C_none, 0, I_XTEST },
+ { "andn", TOKEN_INSN, C_none, 0, I_ANDN },
+ { "bextr", TOKEN_INSN, C_none, 0, I_BEXTR },
+ { "blci", TOKEN_INSN, C_none, 0, I_BLCI },
+ { "blcic", TOKEN_INSN, C_none, 0, I_BLCIC },
+ { "blsi", TOKEN_INSN, C_none, 0, I_BLSI },
+ { "blsic", TOKEN_INSN, C_none, 0, I_BLSIC },
+ { "blcfill", TOKEN_INSN, C_none, 0, I_BLCFILL },
+ { "blsfill", TOKEN_INSN, C_none, 0, I_BLSFILL },
+ { "blcmsk", TOKEN_INSN, C_none, 0, I_BLCMSK },
+ { "blsmsk", TOKEN_INSN, C_none, 0, I_BLSMSK },
+ { "blsr", TOKEN_INSN, C_none, 0, I_BLSR },
+ { "blcs", TOKEN_INSN, C_none, 0, I_BLCS },
+ { "bzhi", TOKEN_INSN, C_none, 0, I_BZHI },
+ { "mulx", TOKEN_INSN, C_none, 0, I_MULX },
+ { "pdep", TOKEN_INSN, C_none, 0, I_PDEP },
+ { "pext", TOKEN_INSN, C_none, 0, I_PEXT },
+ { "rorx", TOKEN_INSN, C_none, 0, I_RORX },
+ { "sarx", TOKEN_INSN, C_none, 0, I_SARX },
+ { "shlx", TOKEN_INSN, C_none, 0, I_SHLX },
+ { "shrx", TOKEN_INSN, C_none, 0, I_SHRX },
+ { "tzcnt", TOKEN_INSN, C_none, 0, I_TZCNT },
+ { "tzmsk", TOKEN_INSN, C_none, 0, I_TZMSK },
+ { "t1mskc", TOKEN_INSN, C_none, 0, I_T1MSKC },
+ { "prefetchwt1", TOKEN_INSN, C_none, 0, I_PREFETCHWT1 },
+ { "bndmk", TOKEN_INSN, C_none, 0, I_BNDMK },
+ { "bndcl", TOKEN_INSN, C_none, 0, I_BNDCL },
+ { "bndcu", TOKEN_INSN, C_none, 0, I_BNDCU },
+ { "bndcn", TOKEN_INSN, C_none, 0, I_BNDCN },
+ { "bndmov", TOKEN_INSN, C_none, 0, I_BNDMOV },
+ { "bndldx", TOKEN_INSN, C_none, 0, I_BNDLDX },
+ { "bndstx", TOKEN_INSN, C_none, 0, I_BNDSTX },
+ { "sha1msg1", TOKEN_INSN, C_none, 0, I_SHA1MSG1 },
+ { "sha1msg2", TOKEN_INSN, C_none, 0, I_SHA1MSG2 },
+ { "sha1nexte", TOKEN_INSN, C_none, 0, I_SHA1NEXTE },
+ { "sha1rnds4", TOKEN_INSN, C_none, 0, I_SHA1RNDS4 },
+ { "sha256msg1", TOKEN_INSN, C_none, 0, I_SHA256MSG1 },
+ { "sha256msg2", TOKEN_INSN, C_none, 0, I_SHA256MSG2 },
+ { "sha256rnds2", TOKEN_INSN, C_none, 0, I_SHA256RNDS2 },
+ { "kaddb", TOKEN_INSN, C_none, 0, I_KADDB },
+ { "kaddd", TOKEN_INSN, C_none, 0, I_KADDD },
+ { "kaddq", TOKEN_INSN, C_none, 0, I_KADDQ },
+ { "kaddw", TOKEN_INSN, C_none, 0, I_KADDW },
+ { "kandb", TOKEN_INSN, C_none, 0, I_KANDB },
+ { "kandd", TOKEN_INSN, C_none, 0, I_KANDD },
+ { "kandnb", TOKEN_INSN, C_none, 0, I_KANDNB },
+ { "kandnd", TOKEN_INSN, C_none, 0, I_KANDND },
+ { "kandnq", TOKEN_INSN, C_none, 0, I_KANDNQ },
+ { "kandnw", TOKEN_INSN, C_none, 0, I_KANDNW },
+ { "kandq", TOKEN_INSN, C_none, 0, I_KANDQ },
+ { "kandw", TOKEN_INSN, C_none, 0, I_KANDW },
+ { "kmovb", TOKEN_INSN, C_none, 0, I_KMOVB },
+ { "kmovd", TOKEN_INSN, C_none, 0, I_KMOVD },
+ { "kmovq", TOKEN_INSN, C_none, 0, I_KMOVQ },
+ { "kmovw", TOKEN_INSN, C_none, 0, I_KMOVW },
+ { "knotb", TOKEN_INSN, C_none, 0, I_KNOTB },
+ { "knotd", TOKEN_INSN, C_none, 0, I_KNOTD },
+ { "knotq", TOKEN_INSN, C_none, 0, I_KNOTQ },
+ { "knotw", TOKEN_INSN, C_none, 0, I_KNOTW },
+ { "korb", TOKEN_INSN, C_none, 0, I_KORB },
+ { "kord", TOKEN_INSN, C_none, 0, I_KORD },
+ { "korq", TOKEN_INSN, C_none, 0, I_KORQ },
+ { "kortestb", TOKEN_INSN, C_none, 0, I_KORTESTB },
+ { "kortestd", TOKEN_INSN, C_none, 0, I_KORTESTD },
+ { "kortestq", TOKEN_INSN, C_none, 0, I_KORTESTQ },
+ { "kortestw", TOKEN_INSN, C_none, 0, I_KORTESTW },
+ { "korw", TOKEN_INSN, C_none, 0, I_KORW },
+ { "kshiftlb", TOKEN_INSN, C_none, 0, I_KSHIFTLB },
+ { "kshiftld", TOKEN_INSN, C_none, 0, I_KSHIFTLD },
+ { "kshiftlq", TOKEN_INSN, C_none, 0, I_KSHIFTLQ },
+ { "kshiftlw", TOKEN_INSN, C_none, 0, I_KSHIFTLW },
+ { "kshiftrb", TOKEN_INSN, C_none, 0, I_KSHIFTRB },
+ { "kshiftrd", TOKEN_INSN, C_none, 0, I_KSHIFTRD },
+ { "kshiftrq", TOKEN_INSN, C_none, 0, I_KSHIFTRQ },
+ { "kshiftrw", TOKEN_INSN, C_none, 0, I_KSHIFTRW },
+ { "ktestb", TOKEN_INSN, C_none, 0, I_KTESTB },
+ { "ktestd", TOKEN_INSN, C_none, 0, I_KTESTD },
+ { "ktestq", TOKEN_INSN, C_none, 0, I_KTESTQ },
+ { "ktestw", TOKEN_INSN, C_none, 0, I_KTESTW },
+ { "kunpckbw", TOKEN_INSN, C_none, 0, I_KUNPCKBW },
+ { "kunpckdq", TOKEN_INSN, C_none, 0, I_KUNPCKDQ },
+ { "kunpckwd", TOKEN_INSN, C_none, 0, I_KUNPCKWD },
+ { "kxnorb", TOKEN_INSN, C_none, 0, I_KXNORB },
+ { "kxnord", TOKEN_INSN, C_none, 0, I_KXNORD },
+ { "kxnorq", TOKEN_INSN, C_none, 0, I_KXNORQ },
+ { "kxnorw", TOKEN_INSN, C_none, 0, I_KXNORW },
+ { "kxorb", TOKEN_INSN, C_none, 0, I_KXORB },
+ { "kxord", TOKEN_INSN, C_none, 0, I_KXORD },
+ { "kxorq", TOKEN_INSN, C_none, 0, I_KXORQ },
+ { "kxorw", TOKEN_INSN, C_none, 0, I_KXORW },
+ { "valignd", TOKEN_INSN, C_none, 0, I_VALIGND },
+ { "valignq", TOKEN_INSN, C_none, 0, I_VALIGNQ },
+ { "vblendmpd", TOKEN_INSN, C_none, 0, I_VBLENDMPD },
+ { "vblendmps", TOKEN_INSN, C_none, 0, I_VBLENDMPS },
+ { "vbroadcastf32x2", TOKEN_INSN, C_none, 0, I_VBROADCASTF32X2 },
+ { "vbroadcastf32x4", TOKEN_INSN, C_none, 0, I_VBROADCASTF32X4 },
+ { "vbroadcastf32x8", TOKEN_INSN, C_none, 0, I_VBROADCASTF32X8 },
+ { "vbroadcastf64x2", TOKEN_INSN, C_none, 0, I_VBROADCASTF64X2 },
+ { "vbroadcastf64x4", TOKEN_INSN, C_none, 0, I_VBROADCASTF64X4 },
+ { "vbroadcasti32x2", TOKEN_INSN, C_none, 0, I_VBROADCASTI32X2 },
+ { "vbroadcasti32x4", TOKEN_INSN, C_none, 0, I_VBROADCASTI32X4 },
+ { "vbroadcasti32x8", TOKEN_INSN, C_none, 0, I_VBROADCASTI32X8 },
+ { "vbroadcasti64x2", TOKEN_INSN, C_none, 0, I_VBROADCASTI64X2 },
+ { "vbroadcasti64x4", TOKEN_INSN, C_none, 0, I_VBROADCASTI64X4 },
+ { "vcompresspd", TOKEN_INSN, C_none, 0, I_VCOMPRESSPD },
+ { "vcompressps", TOKEN_INSN, C_none, 0, I_VCOMPRESSPS },
+ { "vcvtpd2qq", TOKEN_INSN, C_none, 0, I_VCVTPD2QQ },
+ { "vcvtpd2udq", TOKEN_INSN, C_none, 0, I_VCVTPD2UDQ },
+ { "vcvtpd2uqq", TOKEN_INSN, C_none, 0, I_VCVTPD2UQQ },
+ { "vcvtps2qq", TOKEN_INSN, C_none, 0, I_VCVTPS2QQ },
+ { "vcvtps2udq", TOKEN_INSN, C_none, 0, I_VCVTPS2UDQ },
+ { "vcvtps2uqq", TOKEN_INSN, C_none, 0, I_VCVTPS2UQQ },
+ { "vcvtqq2pd", TOKEN_INSN, C_none, 0, I_VCVTQQ2PD },
+ { "vcvtqq2ps", TOKEN_INSN, C_none, 0, I_VCVTQQ2PS },
+ { "vcvtsd2usi", TOKEN_INSN, C_none, 0, I_VCVTSD2USI },
+ { "vcvtss2usi", TOKEN_INSN, C_none, 0, I_VCVTSS2USI },
+ { "vcvttpd2qq", TOKEN_INSN, C_none, 0, I_VCVTTPD2QQ },
+ { "vcvttpd2udq", TOKEN_INSN, C_none, 0, I_VCVTTPD2UDQ },
+ { "vcvttpd2uqq", TOKEN_INSN, C_none, 0, I_VCVTTPD2UQQ },
+ { "vcvttps2qq", TOKEN_INSN, C_none, 0, I_VCVTTPS2QQ },
+ { "vcvttps2udq", TOKEN_INSN, C_none, 0, I_VCVTTPS2UDQ },
+ { "vcvttps2uqq", TOKEN_INSN, C_none, 0, I_VCVTTPS2UQQ },
+ { "vcvttsd2usi", TOKEN_INSN, C_none, 0, I_VCVTTSD2USI },
+ { "vcvttss2usi", TOKEN_INSN, C_none, 0, I_VCVTTSS2USI },
+ { "vcvtudq2pd", TOKEN_INSN, C_none, 0, I_VCVTUDQ2PD },
+ { "vcvtudq2ps", TOKEN_INSN, C_none, 0, I_VCVTUDQ2PS },
+ { "vcvtuqq2pd", TOKEN_INSN, C_none, 0, I_VCVTUQQ2PD },
+ { "vcvtuqq2ps", TOKEN_INSN, C_none, 0, I_VCVTUQQ2PS },
+ { "vcvtusi2sd", TOKEN_INSN, C_none, 0, I_VCVTUSI2SD },
+ { "vcvtusi2ss", TOKEN_INSN, C_none, 0, I_VCVTUSI2SS },
+ { "vdbpsadbw", TOKEN_INSN, C_none, 0, I_VDBPSADBW },
+ { "vexp2pd", TOKEN_INSN, C_none, 0, I_VEXP2PD },
+ { "vexp2ps", TOKEN_INSN, C_none, 0, I_VEXP2PS },
+ { "vexpandpd", TOKEN_INSN, C_none, 0, I_VEXPANDPD },
+ { "vexpandps", TOKEN_INSN, C_none, 0, I_VEXPANDPS },
+ { "vextractf32x4", TOKEN_INSN, C_none, 0, I_VEXTRACTF32X4 },
+ { "vextractf32x8", TOKEN_INSN, C_none, 0, I_VEXTRACTF32X8 },
+ { "vextractf64x2", TOKEN_INSN, C_none, 0, I_VEXTRACTF64X2 },
+ { "vextractf64x4", TOKEN_INSN, C_none, 0, I_VEXTRACTF64X4 },
+ { "vextracti32x4", TOKEN_INSN, C_none, 0, I_VEXTRACTI32X4 },
+ { "vextracti32x8", TOKEN_INSN, C_none, 0, I_VEXTRACTI32X8 },
+ { "vextracti64x2", TOKEN_INSN, C_none, 0, I_VEXTRACTI64X2 },
+ { "vextracti64x4", TOKEN_INSN, C_none, 0, I_VEXTRACTI64X4 },
+ { "vfixupimmpd", TOKEN_INSN, C_none, 0, I_VFIXUPIMMPD },
+ { "vfixupimmps", TOKEN_INSN, C_none, 0, I_VFIXUPIMMPS },
+ { "vfixupimmsd", TOKEN_INSN, C_none, 0, I_VFIXUPIMMSD },
+ { "vfixupimmss", TOKEN_INSN, C_none, 0, I_VFIXUPIMMSS },
+ { "vfpclasspd", TOKEN_INSN, C_none, 0, I_VFPCLASSPD },
+ { "vfpclassps", TOKEN_INSN, C_none, 0, I_VFPCLASSPS },
+ { "vfpclasssd", TOKEN_INSN, C_none, 0, I_VFPCLASSSD },
+ { "vfpclassss", TOKEN_INSN, C_none, 0, I_VFPCLASSSS },
+ { "vgatherpf0dpd", TOKEN_INSN, C_none, 0, I_VGATHERPF0DPD },
+ { "vgatherpf0dps", TOKEN_INSN, C_none, 0, I_VGATHERPF0DPS },
+ { "vgatherpf0qpd", TOKEN_INSN, C_none, 0, I_VGATHERPF0QPD },
+ { "vgatherpf0qps", TOKEN_INSN, C_none, 0, I_VGATHERPF0QPS },
+ { "vgatherpf1dpd", TOKEN_INSN, C_none, 0, I_VGATHERPF1DPD },
+ { "vgatherpf1dps", TOKEN_INSN, C_none, 0, I_VGATHERPF1DPS },
+ { "vgatherpf1qpd", TOKEN_INSN, C_none, 0, I_VGATHERPF1QPD },
+ { "vgatherpf1qps", TOKEN_INSN, C_none, 0, I_VGATHERPF1QPS },
+ { "vgetexppd", TOKEN_INSN, C_none, 0, I_VGETEXPPD },
+ { "vgetexpps", TOKEN_INSN, C_none, 0, I_VGETEXPPS },
+ { "vgetexpsd", TOKEN_INSN, C_none, 0, I_VGETEXPSD },
+ { "vgetexpss", TOKEN_INSN, C_none, 0, I_VGETEXPSS },
+ { "vgetmantpd", TOKEN_INSN, C_none, 0, I_VGETMANTPD },
+ { "vgetmantps", TOKEN_INSN, C_none, 0, I_VGETMANTPS },
+ { "vgetmantsd", TOKEN_INSN, C_none, 0, I_VGETMANTSD },
+ { "vgetmantss", TOKEN_INSN, C_none, 0, I_VGETMANTSS },
+ { "vinsertf32x4", TOKEN_INSN, C_none, 0, I_VINSERTF32X4 },
+ { "vinsertf32x8", TOKEN_INSN, C_none, 0, I_VINSERTF32X8 },
+ { "vinsertf64x2", TOKEN_INSN, C_none, 0, I_VINSERTF64X2 },
+ { "vinsertf64x4", TOKEN_INSN, C_none, 0, I_VINSERTF64X4 },
+ { "vinserti32x4", TOKEN_INSN, C_none, 0, I_VINSERTI32X4 },
+ { "vinserti32x8", TOKEN_INSN, C_none, 0, I_VINSERTI32X8 },
+ { "vinserti64x2", TOKEN_INSN, C_none, 0, I_VINSERTI64X2 },
+ { "vinserti64x4", TOKEN_INSN, C_none, 0, I_VINSERTI64X4 },
+ { "vmovdqa32", TOKEN_INSN, C_none, 0, I_VMOVDQA32 },
+ { "vmovdqa64", TOKEN_INSN, C_none, 0, I_VMOVDQA64 },
+ { "vmovdqu16", TOKEN_INSN, C_none, 0, I_VMOVDQU16 },
+ { "vmovdqu32", TOKEN_INSN, C_none, 0, I_VMOVDQU32 },
+ { "vmovdqu64", TOKEN_INSN, C_none, 0, I_VMOVDQU64 },
+ { "vmovdqu8", TOKEN_INSN, C_none, 0, I_VMOVDQU8 },
+ { "vpabsq", TOKEN_INSN, C_none, 0, I_VPABSQ },
+ { "vpandd", TOKEN_INSN, C_none, 0, I_VPANDD },
+ { "vpandnd", TOKEN_INSN, C_none, 0, I_VPANDND },
+ { "vpandnq", TOKEN_INSN, C_none, 0, I_VPANDNQ },
+ { "vpandq", TOKEN_INSN, C_none, 0, I_VPANDQ },
+ { "vpblendmb", TOKEN_INSN, C_none, 0, I_VPBLENDMB },
+ { "vpblendmd", TOKEN_INSN, C_none, 0, I_VPBLENDMD },
+ { "vpblendmq", TOKEN_INSN, C_none, 0, I_VPBLENDMQ },
+ { "vpblendmw", TOKEN_INSN, C_none, 0, I_VPBLENDMW },
+ { "vpbroadcastmb2q", TOKEN_INSN, C_none, 0, I_VPBROADCASTMB2Q },
+ { "vpbroadcastmw2d", TOKEN_INSN, C_none, 0, I_VPBROADCASTMW2D },
+ { "vpcmpb", TOKEN_INSN, C_none, 0, I_VPCMPB },
+ { "vpcmpd", TOKEN_INSN, C_none, 0, I_VPCMPD },
+ { "vpcmpq", TOKEN_INSN, C_none, 0, I_VPCMPQ },
+ { "vpcmpub", TOKEN_INSN, C_none, 0, I_VPCMPUB },
+ { "vpcmpud", TOKEN_INSN, C_none, 0, I_VPCMPUD },
+ { "vpcmpuq", TOKEN_INSN, C_none, 0, I_VPCMPUQ },
+ { "vpcmpuw", TOKEN_INSN, C_none, 0, I_VPCMPUW },
+ { "vpcmpw", TOKEN_INSN, C_none, 0, I_VPCMPW },
+ { "vpcompressd", TOKEN_INSN, C_none, 0, I_VPCOMPRESSD },
+ { "vpcompressq", TOKEN_INSN, C_none, 0, I_VPCOMPRESSQ },
+ { "vpconflictd", TOKEN_INSN, C_none, 0, I_VPCONFLICTD },
+ { "vpconflictq", TOKEN_INSN, C_none, 0, I_VPCONFLICTQ },
+ { "vpermb", TOKEN_INSN, C_none, 0, I_VPERMB },
+ { "vpermi2b", TOKEN_INSN, C_none, 0, I_VPERMI2B },
+ { "vpermi2d", TOKEN_INSN, C_none, 0, I_VPERMI2D },
+ { "vpermi2pd", TOKEN_INSN, C_none, 0, I_VPERMI2PD },
+ { "vpermi2ps", TOKEN_INSN, C_none, 0, I_VPERMI2PS },
+ { "vpermi2q", TOKEN_INSN, C_none, 0, I_VPERMI2Q },
+ { "vpermi2w", TOKEN_INSN, C_none, 0, I_VPERMI2W },
+ { "vpermt2b", TOKEN_INSN, C_none, 0, I_VPERMT2B },
+ { "vpermt2d", TOKEN_INSN, C_none, 0, I_VPERMT2D },
+ { "vpermt2pd", TOKEN_INSN, C_none, 0, I_VPERMT2PD },
+ { "vpermt2ps", TOKEN_INSN, C_none, 0, I_VPERMT2PS },
+ { "vpermt2q", TOKEN_INSN, C_none, 0, I_VPERMT2Q },
+ { "vpermt2w", TOKEN_INSN, C_none, 0, I_VPERMT2W },
+ { "vpermw", TOKEN_INSN, C_none, 0, I_VPERMW },
+ { "vpexpandd", TOKEN_INSN, C_none, 0, I_VPEXPANDD },
+ { "vpexpandq", TOKEN_INSN, C_none, 0, I_VPEXPANDQ },
+ { "vplzcntd", TOKEN_INSN, C_none, 0, I_VPLZCNTD },
+ { "vplzcntq", TOKEN_INSN, C_none, 0, I_VPLZCNTQ },
+ { "vpmadd52huq", TOKEN_INSN, C_none, 0, I_VPMADD52HUQ },
+ { "vpmadd52luq", TOKEN_INSN, C_none, 0, I_VPMADD52LUQ },
+ { "vpmaxsq", TOKEN_INSN, C_none, 0, I_VPMAXSQ },
+ { "vpmaxuq", TOKEN_INSN, C_none, 0, I_VPMAXUQ },
+ { "vpminsq", TOKEN_INSN, C_none, 0, I_VPMINSQ },
+ { "vpminuq", TOKEN_INSN, C_none, 0, I_VPMINUQ },
+ { "vpmovb2m", TOKEN_INSN, C_none, 0, I_VPMOVB2M },
+ { "vpmovd2m", TOKEN_INSN, C_none, 0, I_VPMOVD2M },
+ { "vpmovdb", TOKEN_INSN, C_none, 0, I_VPMOVDB },
+ { "vpmovdw", TOKEN_INSN, C_none, 0, I_VPMOVDW },
+ { "vpmovm2b", TOKEN_INSN, C_none, 0, I_VPMOVM2B },
+ { "vpmovm2d", TOKEN_INSN, C_none, 0, I_VPMOVM2D },
+ { "vpmovm2q", TOKEN_INSN, C_none, 0, I_VPMOVM2Q },
+ { "vpmovm2w", TOKEN_INSN, C_none, 0, I_VPMOVM2W },
+ { "vpmovq2m", TOKEN_INSN, C_none, 0, I_VPMOVQ2M },
+ { "vpmovqb", TOKEN_INSN, C_none, 0, I_VPMOVQB },
+ { "vpmovqd", TOKEN_INSN, C_none, 0, I_VPMOVQD },
+ { "vpmovqw", TOKEN_INSN, C_none, 0, I_VPMOVQW },
+ { "vpmovsdb", TOKEN_INSN, C_none, 0, I_VPMOVSDB },
+ { "vpmovsdw", TOKEN_INSN, C_none, 0, I_VPMOVSDW },
+ { "vpmovsqb", TOKEN_INSN, C_none, 0, I_VPMOVSQB },
+ { "vpmovsqd", TOKEN_INSN, C_none, 0, I_VPMOVSQD },
+ { "vpmovsqw", TOKEN_INSN, C_none, 0, I_VPMOVSQW },
+ { "vpmovswb", TOKEN_INSN, C_none, 0, I_VPMOVSWB },
+ { "vpmovusdb", TOKEN_INSN, C_none, 0, I_VPMOVUSDB },
+ { "vpmovusdw", TOKEN_INSN, C_none, 0, I_VPMOVUSDW },
+ { "vpmovusqb", TOKEN_INSN, C_none, 0, I_VPMOVUSQB },
+ { "vpmovusqd", TOKEN_INSN, C_none, 0, I_VPMOVUSQD },
+ { "vpmovusqw", TOKEN_INSN, C_none, 0, I_VPMOVUSQW },
+ { "vpmovuswb", TOKEN_INSN, C_none, 0, I_VPMOVUSWB },
+ { "vpmovw2m", TOKEN_INSN, C_none, 0, I_VPMOVW2M },
+ { "vpmovwb", TOKEN_INSN, C_none, 0, I_VPMOVWB },
+ { "vpmullq", TOKEN_INSN, C_none, 0, I_VPMULLQ },
+ { "vpmultishiftqb", TOKEN_INSN, C_none, 0, I_VPMULTISHIFTQB },
+ { "vpord", TOKEN_INSN, C_none, 0, I_VPORD },
+ { "vporq", TOKEN_INSN, C_none, 0, I_VPORQ },
+ { "vprold", TOKEN_INSN, C_none, 0, I_VPROLD },
+ { "vprolq", TOKEN_INSN, C_none, 0, I_VPROLQ },
+ { "vprolvd", TOKEN_INSN, C_none, 0, I_VPROLVD },
+ { "vprolvq", TOKEN_INSN, C_none, 0, I_VPROLVQ },
+ { "vprord", TOKEN_INSN, C_none, 0, I_VPRORD },
+ { "vprorq", TOKEN_INSN, C_none, 0, I_VPRORQ },
+ { "vprorvd", TOKEN_INSN, C_none, 0, I_VPRORVD },
+ { "vprorvq", TOKEN_INSN, C_none, 0, I_VPRORVQ },
+ { "vpscatterdd", TOKEN_INSN, C_none, 0, I_VPSCATTERDD },
+ { "vpscatterdq", TOKEN_INSN, C_none, 0, I_VPSCATTERDQ },
+ { "vpscatterqd", TOKEN_INSN, C_none, 0, I_VPSCATTERQD },
+ { "vpscatterqq", TOKEN_INSN, C_none, 0, I_VPSCATTERQQ },
+ { "vpsllvw", TOKEN_INSN, C_none, 0, I_VPSLLVW },
+ { "vpsraq", TOKEN_INSN, C_none, 0, I_VPSRAQ },
+ { "vpsravq", TOKEN_INSN, C_none, 0, I_VPSRAVQ },
+ { "vpsravw", TOKEN_INSN, C_none, 0, I_VPSRAVW },
+ { "vpsrlvw", TOKEN_INSN, C_none, 0, I_VPSRLVW },
+ { "vpternlogd", TOKEN_INSN, C_none, 0, I_VPTERNLOGD },
+ { "vpternlogq", TOKEN_INSN, C_none, 0, I_VPTERNLOGQ },
+ { "vptestmb", TOKEN_INSN, C_none, 0, I_VPTESTMB },
+ { "vptestmd", TOKEN_INSN, C_none, 0, I_VPTESTMD },
+ { "vptestmq", TOKEN_INSN, C_none, 0, I_VPTESTMQ },
+ { "vptestmw", TOKEN_INSN, C_none, 0, I_VPTESTMW },
+ { "vptestnmb", TOKEN_INSN, C_none, 0, I_VPTESTNMB },
+ { "vptestnmd", TOKEN_INSN, C_none, 0, I_VPTESTNMD },
+ { "vptestnmq", TOKEN_INSN, C_none, 0, I_VPTESTNMQ },
+ { "vptestnmw", TOKEN_INSN, C_none, 0, I_VPTESTNMW },
+ { "vpxord", TOKEN_INSN, C_none, 0, I_VPXORD },
+ { "vpxorq", TOKEN_INSN, C_none, 0, I_VPXORQ },
+ { "vrangepd", TOKEN_INSN, C_none, 0, I_VRANGEPD },
+ { "vrangeps", TOKEN_INSN, C_none, 0, I_VRANGEPS },
+ { "vrangesd", TOKEN_INSN, C_none, 0, I_VRANGESD },
+ { "vrangess", TOKEN_INSN, C_none, 0, I_VRANGESS },
+ { "vrcp14pd", TOKEN_INSN, C_none, 0, I_VRCP14PD },
+ { "vrcp14ps", TOKEN_INSN, C_none, 0, I_VRCP14PS },
+ { "vrcp14sd", TOKEN_INSN, C_none, 0, I_VRCP14SD },
+ { "vrcp14ss", TOKEN_INSN, C_none, 0, I_VRCP14SS },
+ { "vrcp28pd", TOKEN_INSN, C_none, 0, I_VRCP28PD },
+ { "vrcp28ps", TOKEN_INSN, C_none, 0, I_VRCP28PS },
+ { "vrcp28sd", TOKEN_INSN, C_none, 0, I_VRCP28SD },
+ { "vrcp28ss", TOKEN_INSN, C_none, 0, I_VRCP28SS },
+ { "vreducepd", TOKEN_INSN, C_none, 0, I_VREDUCEPD },
+ { "vreduceps", TOKEN_INSN, C_none, 0, I_VREDUCEPS },
+ { "vreducesd", TOKEN_INSN, C_none, 0, I_VREDUCESD },
+ { "vreducess", TOKEN_INSN, C_none, 0, I_VREDUCESS },
+ { "vrndscalepd", TOKEN_INSN, C_none, 0, I_VRNDSCALEPD },
+ { "vrndscaleps", TOKEN_INSN, C_none, 0, I_VRNDSCALEPS },
+ { "vrndscalesd", TOKEN_INSN, C_none, 0, I_VRNDSCALESD },
+ { "vrndscaless", TOKEN_INSN, C_none, 0, I_VRNDSCALESS },
+ { "vrsqrt14pd", TOKEN_INSN, C_none, 0, I_VRSQRT14PD },
+ { "vrsqrt14ps", TOKEN_INSN, C_none, 0, I_VRSQRT14PS },
+ { "vrsqrt14sd", TOKEN_INSN, C_none, 0, I_VRSQRT14SD },
+ { "vrsqrt14ss", TOKEN_INSN, C_none, 0, I_VRSQRT14SS },
+ { "vrsqrt28pd", TOKEN_INSN, C_none, 0, I_VRSQRT28PD },
+ { "vrsqrt28ps", TOKEN_INSN, C_none, 0, I_VRSQRT28PS },
+ { "vrsqrt28sd", TOKEN_INSN, C_none, 0, I_VRSQRT28SD },
+ { "vrsqrt28ss", TOKEN_INSN, C_none, 0, I_VRSQRT28SS },
+ { "vscalefpd", TOKEN_INSN, C_none, 0, I_VSCALEFPD },
+ { "vscalefps", TOKEN_INSN, C_none, 0, I_VSCALEFPS },
+ { "vscalefsd", TOKEN_INSN, C_none, 0, I_VSCALEFSD },
+ { "vscalefss", TOKEN_INSN, C_none, 0, I_VSCALEFSS },
+ { "vscatterdpd", TOKEN_INSN, C_none, 0, I_VSCATTERDPD },
+ { "vscatterdps", TOKEN_INSN, C_none, 0, I_VSCATTERDPS },
+ { "vscatterpf0dpd", TOKEN_INSN, C_none, 0, I_VSCATTERPF0DPD },
+ { "vscatterpf0dps", TOKEN_INSN, C_none, 0, I_VSCATTERPF0DPS },
+ { "vscatterpf0qpd", TOKEN_INSN, C_none, 0, I_VSCATTERPF0QPD },
+ { "vscatterpf0qps", TOKEN_INSN, C_none, 0, I_VSCATTERPF0QPS },
+ { "vscatterpf1dpd", TOKEN_INSN, C_none, 0, I_VSCATTERPF1DPD },
+ { "vscatterpf1dps", TOKEN_INSN, C_none, 0, I_VSCATTERPF1DPS },
+ { "vscatterpf1qpd", TOKEN_INSN, C_none, 0, I_VSCATTERPF1QPD },
+ { "vscatterpf1qps", TOKEN_INSN, C_none, 0, I_VSCATTERPF1QPS },
+ { "vscatterqpd", TOKEN_INSN, C_none, 0, I_VSCATTERQPD },
+ { "vscatterqps", TOKEN_INSN, C_none, 0, I_VSCATTERQPS },
+ { "vshuff32x4", TOKEN_INSN, C_none, 0, I_VSHUFF32X4 },
+ { "vshuff64x2", TOKEN_INSN, C_none, 0, I_VSHUFF64X2 },
+ { "vshufi32x4", TOKEN_INSN, C_none, 0, I_VSHUFI32X4 },
+ { "vshufi64x2", TOKEN_INSN, C_none, 0, I_VSHUFI64X2 },
+ { "rdpkru", TOKEN_INSN, C_none, 0, I_RDPKRU },
+ { "wrpkru", TOKEN_INSN, C_none, 0, I_WRPKRU },
+ { "rdpid", TOKEN_INSN, C_none, 0, I_RDPID },
+ { "clflushopt", TOKEN_INSN, C_none, 0, I_CLFLUSHOPT },
+ { "clwb", TOKEN_INSN, C_none, 0, I_CLWB },
+ { "pcommit", TOKEN_INSN, C_none, 0, I_PCOMMIT },
+ { "clzero", TOKEN_INSN, C_none, 0, I_CLZERO },
+ { "ptwrite", TOKEN_INSN, C_none, 0, I_PTWRITE },
+ { "cldemote", TOKEN_INSN, C_none, 0, I_CLDEMOTE },
+ { "movdiri", TOKEN_INSN, C_none, 0, I_MOVDIRI },
+ { "movdir64b", TOKEN_INSN, C_none, 0, I_MOVDIR64B },
+ { "pconfig", TOKEN_INSN, C_none, 0, I_PCONFIG },
+ { "tpause", TOKEN_INSN, C_none, 0, I_TPAUSE },
+ { "umonitor", TOKEN_INSN, C_none, 0, I_UMONITOR },
+ { "umwait", TOKEN_INSN, C_none, 0, I_UMWAIT },
+ { "wbnoinvd", TOKEN_INSN, C_none, 0, I_WBNOINVD },
+ { "gf2p8affineinvqb", TOKEN_INSN, C_none, 0, I_GF2P8AFFINEINVQB },
+ { "vgf2p8affineinvqb", TOKEN_INSN, C_none, 0, I_VGF2P8AFFINEINVQB },
+ { "gf2p8affineqb", TOKEN_INSN, C_none, 0, I_GF2P8AFFINEQB },
+ { "vgf2p8affineqb", TOKEN_INSN, C_none, 0, I_VGF2P8AFFINEQB },
+ { "gf2p8mulb", TOKEN_INSN, C_none, 0, I_GF2P8MULB },
+ { "vgf2p8mulb", TOKEN_INSN, C_none, 0, I_VGF2P8MULB },
+ { "vpcompressb", TOKEN_INSN, C_none, 0, I_VPCOMPRESSB },
+ { "vpcompressw", TOKEN_INSN, C_none, 0, I_VPCOMPRESSW },
+ { "vpexpandb", TOKEN_INSN, C_none, 0, I_VPEXPANDB },
+ { "vpexpandw", TOKEN_INSN, C_none, 0, I_VPEXPANDW },
+ { "vpshldw", TOKEN_INSN, C_none, 0, I_VPSHLDW },
+ { "vpshldd", TOKEN_INSN, C_none, 0, I_VPSHLDD },
+ { "vpshldq", TOKEN_INSN, C_none, 0, I_VPSHLDQ },
+ { "vpshldvw", TOKEN_INSN, C_none, 0, I_VPSHLDVW },
+ { "vpshldvd", TOKEN_INSN, C_none, 0, I_VPSHLDVD },
+ { "vpshldvq", TOKEN_INSN, C_none, 0, I_VPSHLDVQ },
+ { "vpshrdw", TOKEN_INSN, C_none, 0, I_VPSHRDW },
+ { "vpshrdd", TOKEN_INSN, C_none, 0, I_VPSHRDD },
+ { "vpshrdq", TOKEN_INSN, C_none, 0, I_VPSHRDQ },
+ { "vpshrdvw", TOKEN_INSN, C_none, 0, I_VPSHRDVW },
+ { "vpshrdvd", TOKEN_INSN, C_none, 0, I_VPSHRDVD },
+ { "vpshrdvq", TOKEN_INSN, C_none, 0, I_VPSHRDVQ },
+ { "vpdpbusd", TOKEN_INSN, C_none, 0, I_VPDPBUSD },
+ { "vpdpbusds", TOKEN_INSN, C_none, 0, I_VPDPBUSDS },
+ { "vpdpwssd", TOKEN_INSN, C_none, 0, I_VPDPWSSD },
+ { "vpdpwssds", TOKEN_INSN, C_none, 0, I_VPDPWSSDS },
+ { "vpopcntb", TOKEN_INSN, C_none, 0, I_VPOPCNTB },
+ { "vpopcntw", TOKEN_INSN, C_none, 0, I_VPOPCNTW },
+ { "vpopcntd", TOKEN_INSN, C_none, 0, I_VPOPCNTD },
+ { "vpopcntq", TOKEN_INSN, C_none, 0, I_VPOPCNTQ },
+ { "vpshufbitqmb", TOKEN_INSN, C_none, 0, I_VPSHUFBITQMB },
+ { "v4fmaddps", TOKEN_INSN, C_none, 0, I_V4FMADDPS },
+ { "v4fnmaddps", TOKEN_INSN, C_none, 0, I_V4FNMADDPS },
+ { "v4fmaddss", TOKEN_INSN, C_none, 0, I_V4FMADDSS },
+ { "v4fnmaddss", TOKEN_INSN, C_none, 0, I_V4FNMADDSS },
+ { "v4dpwssds", TOKEN_INSN, C_none, 0, I_V4DPWSSDS },
+ { "v4dpwssd", TOKEN_INSN, C_none, 0, I_V4DPWSSD },
+ { "encls", TOKEN_INSN, C_none, 0, I_ENCLS },
+ { "enclu", TOKEN_INSN, C_none, 0, I_ENCLU },
+ { "enclv", TOKEN_INSN, C_none, 0, I_ENCLV },
+ { "hint_nop0", TOKEN_INSN, C_none, 0, I_HINT_NOP0 },
+ { "hint_nop1", TOKEN_INSN, C_none, 0, I_HINT_NOP1 },
+ { "hint_nop2", TOKEN_INSN, C_none, 0, I_HINT_NOP2 },
+ { "hint_nop3", TOKEN_INSN, C_none, 0, I_HINT_NOP3 },
+ { "hint_nop4", TOKEN_INSN, C_none, 0, I_HINT_NOP4 },
+ { "hint_nop5", TOKEN_INSN, C_none, 0, I_HINT_NOP5 },
+ { "hint_nop6", TOKEN_INSN, C_none, 0, I_HINT_NOP6 },
+ { "hint_nop7", TOKEN_INSN, C_none, 0, I_HINT_NOP7 },
+ { "hint_nop8", TOKEN_INSN, C_none, 0, I_HINT_NOP8 },
+ { "hint_nop9", TOKEN_INSN, C_none, 0, I_HINT_NOP9 },
+ { "hint_nop10", TOKEN_INSN, C_none, 0, I_HINT_NOP10 },
+ { "hint_nop11", TOKEN_INSN, C_none, 0, I_HINT_NOP11 },
+ { "hint_nop12", TOKEN_INSN, C_none, 0, I_HINT_NOP12 },
+ { "hint_nop13", TOKEN_INSN, C_none, 0, I_HINT_NOP13 },
+ { "hint_nop14", TOKEN_INSN, C_none, 0, I_HINT_NOP14 },
+ { "hint_nop15", TOKEN_INSN, C_none, 0, I_HINT_NOP15 },
+ { "hint_nop16", TOKEN_INSN, C_none, 0, I_HINT_NOP16 },
+ { "hint_nop17", TOKEN_INSN, C_none, 0, I_HINT_NOP17 },
+ { "hint_nop18", TOKEN_INSN, C_none, 0, I_HINT_NOP18 },
+ { "hint_nop19", TOKEN_INSN, C_none, 0, I_HINT_NOP19 },
+ { "hint_nop20", TOKEN_INSN, C_none, 0, I_HINT_NOP20 },
+ { "hint_nop21", TOKEN_INSN, C_none, 0, I_HINT_NOP21 },
+ { "hint_nop22", TOKEN_INSN, C_none, 0, I_HINT_NOP22 },
+ { "hint_nop23", TOKEN_INSN, C_none, 0, I_HINT_NOP23 },
+ { "hint_nop24", TOKEN_INSN, C_none, 0, I_HINT_NOP24 },
+ { "hint_nop25", TOKEN_INSN, C_none, 0, I_HINT_NOP25 },
+ { "hint_nop26", TOKEN_INSN, C_none, 0, I_HINT_NOP26 },
+ { "hint_nop27", TOKEN_INSN, C_none, 0, I_HINT_NOP27 },
+ { "hint_nop28", TOKEN_INSN, C_none, 0, I_HINT_NOP28 },
+ { "hint_nop29", TOKEN_INSN, C_none, 0, I_HINT_NOP29 },
+ { "hint_nop30", TOKEN_INSN, C_none, 0, I_HINT_NOP30 },
+ { "hint_nop31", TOKEN_INSN, C_none, 0, I_HINT_NOP31 },
+ { "hint_nop32", TOKEN_INSN, C_none, 0, I_HINT_NOP32 },
+ { "hint_nop33", TOKEN_INSN, C_none, 0, I_HINT_NOP33 },
+ { "hint_nop34", TOKEN_INSN, C_none, 0, I_HINT_NOP34 },
+ { "hint_nop35", TOKEN_INSN, C_none, 0, I_HINT_NOP35 },
+ { "hint_nop36", TOKEN_INSN, C_none, 0, I_HINT_NOP36 },
+ { "hint_nop37", TOKEN_INSN, C_none, 0, I_HINT_NOP37 },
+ { "hint_nop38", TOKEN_INSN, C_none, 0, I_HINT_NOP38 },
+ { "hint_nop39", TOKEN_INSN, C_none, 0, I_HINT_NOP39 },
+ { "hint_nop40", TOKEN_INSN, C_none, 0, I_HINT_NOP40 },
+ { "hint_nop41", TOKEN_INSN, C_none, 0, I_HINT_NOP41 },
+ { "hint_nop42", TOKEN_INSN, C_none, 0, I_HINT_NOP42 },
+ { "hint_nop43", TOKEN_INSN, C_none, 0, I_HINT_NOP43 },
+ { "hint_nop44", TOKEN_INSN, C_none, 0, I_HINT_NOP44 },
+ { "hint_nop45", TOKEN_INSN, C_none, 0, I_HINT_NOP45 },
+ { "hint_nop46", TOKEN_INSN, C_none, 0, I_HINT_NOP46 },
+ { "hint_nop47", TOKEN_INSN, C_none, 0, I_HINT_NOP47 },
+ { "hint_nop48", TOKEN_INSN, C_none, 0, I_HINT_NOP48 },
+ { "hint_nop49", TOKEN_INSN, C_none, 0, I_HINT_NOP49 },
+ { "hint_nop50", TOKEN_INSN, C_none, 0, I_HINT_NOP50 },
+ { "hint_nop51", TOKEN_INSN, C_none, 0, I_HINT_NOP51 },
+ { "hint_nop52", TOKEN_INSN, C_none, 0, I_HINT_NOP52 },
+ { "hint_nop53", TOKEN_INSN, C_none, 0, I_HINT_NOP53 },
+ { "hint_nop54", TOKEN_INSN, C_none, 0, I_HINT_NOP54 },
+ { "hint_nop55", TOKEN_INSN, C_none, 0, I_HINT_NOP55 },
+ { "hint_nop56", TOKEN_INSN, C_none, 0, I_HINT_NOP56 },
+ { "hint_nop57", TOKEN_INSN, C_none, 0, I_HINT_NOP57 },
+ { "hint_nop58", TOKEN_INSN, C_none, 0, I_HINT_NOP58 },
+ { "hint_nop59", TOKEN_INSN, C_none, 0, I_HINT_NOP59 },
+ { "hint_nop60", TOKEN_INSN, C_none, 0, I_HINT_NOP60 },
+ { "hint_nop61", TOKEN_INSN, C_none, 0, I_HINT_NOP61 },
+ { "hint_nop62", TOKEN_INSN, C_none, 0, I_HINT_NOP62 },
+ { "hint_nop63", TOKEN_INSN, C_none, 0, I_HINT_NOP63 },
+ { "al", TOKEN_REG, 0, 0, R_AL },
+ { "ah", TOKEN_REG, 0, 0, R_AH },
+ { "ax", TOKEN_REG, 0, 0, R_AX },
+ { "eax", TOKEN_REG, 0, 0, R_EAX },
+ { "rax", TOKEN_REG, 0, 0, R_RAX },
+ { "bl", TOKEN_REG, 0, 0, R_BL },
+ { "bh", TOKEN_REG, 0, 0, R_BH },
+ { "bx", TOKEN_REG, 0, 0, R_BX },
+ { "ebx", TOKEN_REG, 0, 0, R_EBX },
+ { "rbx", TOKEN_REG, 0, 0, R_RBX },
+ { "cl", TOKEN_REG, 0, 0, R_CL },
+ { "ch", TOKEN_REG, 0, 0, R_CH },
+ { "cx", TOKEN_REG, 0, 0, R_CX },
+ { "ecx", TOKEN_REG, 0, 0, R_ECX },
+ { "rcx", TOKEN_REG, 0, 0, R_RCX },
+ { "dl", TOKEN_REG, 0, 0, R_DL },
+ { "dh", TOKEN_REG, 0, 0, R_DH },
+ { "dx", TOKEN_REG, 0, 0, R_DX },
+ { "edx", TOKEN_REG, 0, 0, R_EDX },
+ { "rdx", TOKEN_REG, 0, 0, R_RDX },
+ { "spl", TOKEN_REG, 0, 0, R_SPL },
+ { "sp", TOKEN_REG, 0, 0, R_SP },
+ { "esp", TOKEN_REG, 0, 0, R_ESP },
+ { "rsp", TOKEN_REG, 0, 0, R_RSP },
+ { "bpl", TOKEN_REG, 0, 0, R_BPL },
+ { "bp", TOKEN_REG, 0, 0, R_BP },
+ { "ebp", TOKEN_REG, 0, 0, R_EBP },
+ { "rbp", TOKEN_REG, 0, 0, R_RBP },
+ { "sil", TOKEN_REG, 0, 0, R_SIL },
+ { "si", TOKEN_REG, 0, 0, R_SI },
+ { "esi", TOKEN_REG, 0, 0, R_ESI },
+ { "rsi", TOKEN_REG, 0, 0, R_RSI },
+ { "dil", TOKEN_REG, 0, 0, R_DIL },
+ { "di", TOKEN_REG, 0, 0, R_DI },
+ { "edi", TOKEN_REG, 0, 0, R_EDI },
+ { "rdi", TOKEN_REG, 0, 0, R_RDI },
+ { "r8b", TOKEN_REG, 0, 0, R_R8B },
+ { "r9b", TOKEN_REG, 0, 0, R_R9B },
+ { "r10b", TOKEN_REG, 0, 0, R_R10B },
+ { "r11b", TOKEN_REG, 0, 0, R_R11B },
+ { "r12b", TOKEN_REG, 0, 0, R_R12B },
+ { "r13b", TOKEN_REG, 0, 0, R_R13B },
+ { "r14b", TOKEN_REG, 0, 0, R_R14B },
+ { "r15b", TOKEN_REG, 0, 0, R_R15B },
+ { "r8w", TOKEN_REG, 0, 0, R_R8W },
+ { "r9w", TOKEN_REG, 0, 0, R_R9W },
+ { "r10w", TOKEN_REG, 0, 0, R_R10W },
+ { "r11w", TOKEN_REG, 0, 0, R_R11W },
+ { "r12w", TOKEN_REG, 0, 0, R_R12W },
+ { "r13w", TOKEN_REG, 0, 0, R_R13W },
+ { "r14w", TOKEN_REG, 0, 0, R_R14W },
+ { "r15w", TOKEN_REG, 0, 0, R_R15W },
+ { "r8d", TOKEN_REG, 0, 0, R_R8D },
+ { "r9d", TOKEN_REG, 0, 0, R_R9D },
+ { "r10d", TOKEN_REG, 0, 0, R_R10D },
+ { "r11d", TOKEN_REG, 0, 0, R_R11D },
+ { "r12d", TOKEN_REG, 0, 0, R_R12D },
+ { "r13d", TOKEN_REG, 0, 0, R_R13D },
+ { "r14d", TOKEN_REG, 0, 0, R_R14D },
+ { "r15d", TOKEN_REG, 0, 0, R_R15D },
+ { "r8", TOKEN_REG, 0, 0, R_R8 },
+ { "r9", TOKEN_REG, 0, 0, R_R9 },
+ { "r10", TOKEN_REG, 0, 0, R_R10 },
+ { "r11", TOKEN_REG, 0, 0, R_R11 },
+ { "r12", TOKEN_REG, 0, 0, R_R12 },
+ { "r13", TOKEN_REG, 0, 0, R_R13 },
+ { "r14", TOKEN_REG, 0, 0, R_R14 },
+ { "r15", TOKEN_REG, 0, 0, R_R15 },
+ { "es", TOKEN_REG, 0, 0, R_ES },
+ { "cs", TOKEN_REG, 0, 0, R_CS },
+ { "ss", TOKEN_REG, 0, 0, R_SS },
+ { "ds", TOKEN_REG, 0, 0, R_DS },
+ { "fs", TOKEN_REG, 0, 0, R_FS },
+ { "gs", TOKEN_REG, 0, 0, R_GS },
+ { "segr6", TOKEN_REG, 0, 0, R_SEGR6 },
+ { "segr7", TOKEN_REG, 0, 0, R_SEGR7 },
+ { "cr0", TOKEN_REG, 0, 0, R_CR0 },
+ { "cr1", TOKEN_REG, 0, 0, R_CR1 },
+ { "cr2", TOKEN_REG, 0, 0, R_CR2 },
+ { "cr3", TOKEN_REG, 0, 0, R_CR3 },
+ { "cr4", TOKEN_REG, 0, 0, R_CR4 },
+ { "cr5", TOKEN_REG, 0, 0, R_CR5 },
+ { "cr6", TOKEN_REG, 0, 0, R_CR6 },
+ { "cr7", TOKEN_REG, 0, 0, R_CR7 },
+ { "cr8", TOKEN_REG, 0, 0, R_CR8 },
+ { "cr9", TOKEN_REG, 0, 0, R_CR9 },
+ { "cr10", TOKEN_REG, 0, 0, R_CR10 },
+ { "cr11", TOKEN_REG, 0, 0, R_CR11 },
+ { "cr12", TOKEN_REG, 0, 0, R_CR12 },
+ { "cr13", TOKEN_REG, 0, 0, R_CR13 },
+ { "cr14", TOKEN_REG, 0, 0, R_CR14 },
+ { "cr15", TOKEN_REG, 0, 0, R_CR15 },
+ { "dr0", TOKEN_REG, 0, 0, R_DR0 },
+ { "dr1", TOKEN_REG, 0, 0, R_DR1 },
+ { "dr2", TOKEN_REG, 0, 0, R_DR2 },
+ { "dr3", TOKEN_REG, 0, 0, R_DR3 },
+ { "dr4", TOKEN_REG, 0, 0, R_DR4 },
+ { "dr5", TOKEN_REG, 0, 0, R_DR5 },
+ { "dr6", TOKEN_REG, 0, 0, R_DR6 },
+ { "dr7", TOKEN_REG, 0, 0, R_DR7 },
+ { "dr8", TOKEN_REG, 0, 0, R_DR8 },
+ { "dr9", TOKEN_REG, 0, 0, R_DR9 },
+ { "dr10", TOKEN_REG, 0, 0, R_DR10 },
+ { "dr11", TOKEN_REG, 0, 0, R_DR11 },
+ { "dr12", TOKEN_REG, 0, 0, R_DR12 },
+ { "dr13", TOKEN_REG, 0, 0, R_DR13 },
+ { "dr14", TOKEN_REG, 0, 0, R_DR14 },
+ { "dr15", TOKEN_REG, 0, 0, R_DR15 },
+ { "tr0", TOKEN_REG, 0, 0, R_TR0 },
+ { "tr1", TOKEN_REG, 0, 0, R_TR1 },
+ { "tr2", TOKEN_REG, 0, 0, R_TR2 },
+ { "tr3", TOKEN_REG, 0, 0, R_TR3 },
+ { "tr4", TOKEN_REG, 0, 0, R_TR4 },
+ { "tr5", TOKEN_REG, 0, 0, R_TR5 },
+ { "tr6", TOKEN_REG, 0, 0, R_TR6 },
+ { "tr7", TOKEN_REG, 0, 0, R_TR7 },
+ { "st0", TOKEN_REG, 0, 0, R_ST0 },
+ { "st1", TOKEN_REG, 0, 0, R_ST1 },
+ { "st2", TOKEN_REG, 0, 0, R_ST2 },
+ { "st3", TOKEN_REG, 0, 0, R_ST3 },
+ { "st4", TOKEN_REG, 0, 0, R_ST4 },
+ { "st5", TOKEN_REG, 0, 0, R_ST5 },
+ { "st6", TOKEN_REG, 0, 0, R_ST6 },
+ { "st7", TOKEN_REG, 0, 0, R_ST7 },
+ { "mm0", TOKEN_REG, 0, 0, R_MM0 },
+ { "mm1", TOKEN_REG, 0, 0, R_MM1 },
+ { "mm2", TOKEN_REG, 0, 0, R_MM2 },
+ { "mm3", TOKEN_REG, 0, 0, R_MM3 },
+ { "mm4", TOKEN_REG, 0, 0, R_MM4 },
+ { "mm5", TOKEN_REG, 0, 0, R_MM5 },
+ { "mm6", TOKEN_REG, 0, 0, R_MM6 },
+ { "mm7", TOKEN_REG, 0, 0, R_MM7 },
+ { "xmm0", TOKEN_REG, 0, 0, R_XMM0 },
+ { "xmm1", TOKEN_REG, 0, 0, R_XMM1 },
+ { "xmm2", TOKEN_REG, 0, 0, R_XMM2 },
+ { "xmm3", TOKEN_REG, 0, 0, R_XMM3 },
+ { "xmm4", TOKEN_REG, 0, 0, R_XMM4 },
+ { "xmm5", TOKEN_REG, 0, 0, R_XMM5 },
+ { "xmm6", TOKEN_REG, 0, 0, R_XMM6 },
+ { "xmm7", TOKEN_REG, 0, 0, R_XMM7 },
+ { "xmm8", TOKEN_REG, 0, 0, R_XMM8 },
+ { "xmm9", TOKEN_REG, 0, 0, R_XMM9 },
+ { "xmm10", TOKEN_REG, 0, 0, R_XMM10 },
+ { "xmm11", TOKEN_REG, 0, 0, R_XMM11 },
+ { "xmm12", TOKEN_REG, 0, 0, R_XMM12 },
+ { "xmm13", TOKEN_REG, 0, 0, R_XMM13 },
+ { "xmm14", TOKEN_REG, 0, 0, R_XMM14 },
+ { "xmm15", TOKEN_REG, 0, 0, R_XMM15 },
+ { "xmm16", TOKEN_REG, 0, 0, R_XMM16 },
+ { "xmm17", TOKEN_REG, 0, 0, R_XMM17 },
+ { "xmm18", TOKEN_REG, 0, 0, R_XMM18 },
+ { "xmm19", TOKEN_REG, 0, 0, R_XMM19 },
+ { "xmm20", TOKEN_REG, 0, 0, R_XMM20 },
+ { "xmm21", TOKEN_REG, 0, 0, R_XMM21 },
+ { "xmm22", TOKEN_REG, 0, 0, R_XMM22 },
+ { "xmm23", TOKEN_REG, 0, 0, R_XMM23 },
+ { "xmm24", TOKEN_REG, 0, 0, R_XMM24 },
+ { "xmm25", TOKEN_REG, 0, 0, R_XMM25 },
+ { "xmm26", TOKEN_REG, 0, 0, R_XMM26 },
+ { "xmm27", TOKEN_REG, 0, 0, R_XMM27 },
+ { "xmm28", TOKEN_REG, 0, 0, R_XMM28 },
+ { "xmm29", TOKEN_REG, 0, 0, R_XMM29 },
+ { "xmm30", TOKEN_REG, 0, 0, R_XMM30 },
+ { "xmm31", TOKEN_REG, 0, 0, R_XMM31 },
+ { "ymm0", TOKEN_REG, 0, 0, R_YMM0 },
+ { "ymm1", TOKEN_REG, 0, 0, R_YMM1 },
+ { "ymm2", TOKEN_REG, 0, 0, R_YMM2 },
+ { "ymm3", TOKEN_REG, 0, 0, R_YMM3 },
+ { "ymm4", TOKEN_REG, 0, 0, R_YMM4 },
+ { "ymm5", TOKEN_REG, 0, 0, R_YMM5 },
+ { "ymm6", TOKEN_REG, 0, 0, R_YMM6 },
+ { "ymm7", TOKEN_REG, 0, 0, R_YMM7 },
+ { "ymm8", TOKEN_REG, 0, 0, R_YMM8 },
+ { "ymm9", TOKEN_REG, 0, 0, R_YMM9 },
+ { "ymm10", TOKEN_REG, 0, 0, R_YMM10 },
+ { "ymm11", TOKEN_REG, 0, 0, R_YMM11 },
+ { "ymm12", TOKEN_REG, 0, 0, R_YMM12 },
+ { "ymm13", TOKEN_REG, 0, 0, R_YMM13 },
+ { "ymm14", TOKEN_REG, 0, 0, R_YMM14 },
+ { "ymm15", TOKEN_REG, 0, 0, R_YMM15 },
+ { "ymm16", TOKEN_REG, 0, 0, R_YMM16 },
+ { "ymm17", TOKEN_REG, 0, 0, R_YMM17 },
+ { "ymm18", TOKEN_REG, 0, 0, R_YMM18 },
+ { "ymm19", TOKEN_REG, 0, 0, R_YMM19 },
+ { "ymm20", TOKEN_REG, 0, 0, R_YMM20 },
+ { "ymm21", TOKEN_REG, 0, 0, R_YMM21 },
+ { "ymm22", TOKEN_REG, 0, 0, R_YMM22 },
+ { "ymm23", TOKEN_REG, 0, 0, R_YMM23 },
+ { "ymm24", TOKEN_REG, 0, 0, R_YMM24 },
+ { "ymm25", TOKEN_REG, 0, 0, R_YMM25 },
+ { "ymm26", TOKEN_REG, 0, 0, R_YMM26 },
+ { "ymm27", TOKEN_REG, 0, 0, R_YMM27 },
+ { "ymm28", TOKEN_REG, 0, 0, R_YMM28 },
+ { "ymm29", TOKEN_REG, 0, 0, R_YMM29 },
+ { "ymm30", TOKEN_REG, 0, 0, R_YMM30 },
+ { "ymm31", TOKEN_REG, 0, 0, R_YMM31 },
+ { "zmm0", TOKEN_REG, 0, 0, R_ZMM0 },
+ { "zmm1", TOKEN_REG, 0, 0, R_ZMM1 },
+ { "zmm2", TOKEN_REG, 0, 0, R_ZMM2 },
+ { "zmm3", TOKEN_REG, 0, 0, R_ZMM3 },
+ { "zmm4", TOKEN_REG, 0, 0, R_ZMM4 },
+ { "zmm5", TOKEN_REG, 0, 0, R_ZMM5 },
+ { "zmm6", TOKEN_REG, 0, 0, R_ZMM6 },
+ { "zmm7", TOKEN_REG, 0, 0, R_ZMM7 },
+ { "zmm8", TOKEN_REG, 0, 0, R_ZMM8 },
+ { "zmm9", TOKEN_REG, 0, 0, R_ZMM9 },
+ { "zmm10", TOKEN_REG, 0, 0, R_ZMM10 },
+ { "zmm11", TOKEN_REG, 0, 0, R_ZMM11 },
+ { "zmm12", TOKEN_REG, 0, 0, R_ZMM12 },
+ { "zmm13", TOKEN_REG, 0, 0, R_ZMM13 },
+ { "zmm14", TOKEN_REG, 0, 0, R_ZMM14 },
+ { "zmm15", TOKEN_REG, 0, 0, R_ZMM15 },
+ { "zmm16", TOKEN_REG, 0, 0, R_ZMM16 },
+ { "zmm17", TOKEN_REG, 0, 0, R_ZMM17 },
+ { "zmm18", TOKEN_REG, 0, 0, R_ZMM18 },
+ { "zmm19", TOKEN_REG, 0, 0, R_ZMM19 },
+ { "zmm20", TOKEN_REG, 0, 0, R_ZMM20 },
+ { "zmm21", TOKEN_REG, 0, 0, R_ZMM21 },
+ { "zmm22", TOKEN_REG, 0, 0, R_ZMM22 },
+ { "zmm23", TOKEN_REG, 0, 0, R_ZMM23 },
+ { "zmm24", TOKEN_REG, 0, 0, R_ZMM24 },
+ { "zmm25", TOKEN_REG, 0, 0, R_ZMM25 },
+ { "zmm26", TOKEN_REG, 0, 0, R_ZMM26 },
+ { "zmm27", TOKEN_REG, 0, 0, R_ZMM27 },
+ { "zmm28", TOKEN_REG, 0, 0, R_ZMM28 },
+ { "zmm29", TOKEN_REG, 0, 0, R_ZMM29 },
+ { "zmm30", TOKEN_REG, 0, 0, R_ZMM30 },
+ { "zmm31", TOKEN_REG, 0, 0, R_ZMM31 },
+ { "k0", TOKEN_REG, 0, 0, R_K0 },
+ { "k1", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K1 },
+ { "k2", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K2 },
+ { "k3", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K3 },
+ { "k4", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K4 },
+ { "k5", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K5 },
+ { "k6", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K6 },
+ { "k7", TOKEN_REG, 0, TFLAG_BRC_OPT, R_K7 },
+ { "bnd0", TOKEN_REG, 0, 0, R_BND0 },
+ { "bnd1", TOKEN_REG, 0, 0, R_BND1 },
+ { "bnd2", TOKEN_REG, 0, 0, R_BND2 },
+ { "bnd3", TOKEN_REG, 0, 0, R_BND3 },
+ { "a16", TOKEN_PREFIX, 0, 0, P_A16 },
+ { "a32", TOKEN_PREFIX, 0, 0, P_A32 },
+ { "a64", TOKEN_PREFIX, 0, 0, P_A64 },
+ { "asp", TOKEN_PREFIX, 0, 0, P_ASP },
+ { "lock", TOKEN_PREFIX, 0, 0, P_LOCK },
+ { "o16", TOKEN_PREFIX, 0, 0, P_O16 },
+ { "o32", TOKEN_PREFIX, 0, 0, P_O32 },
+ { "o64", TOKEN_PREFIX, 0, 0, P_O64 },
+ { "osp", TOKEN_PREFIX, 0, 0, P_OSP },
+ { "rep", TOKEN_PREFIX, 0, 0, P_REP },
+ { "repe", TOKEN_PREFIX, 0, 0, P_REPE },
+ { "repne", TOKEN_PREFIX, 0, 0, P_REPNE },
+ { "repnz", TOKEN_PREFIX, 0, 0, P_REPNZ },
+ { "repz", TOKEN_PREFIX, 0, 0, P_REPZ },
+ { "times", TOKEN_PREFIX, 0, 0, P_TIMES },
+ { "wait", TOKEN_PREFIX, 0, 0, P_WAIT },
+ { "xacquire", TOKEN_PREFIX, 0, 0, P_XACQUIRE },
+ { "xrelease", TOKEN_PREFIX, 0, 0, P_XRELEASE },
+ { "bnd", TOKEN_PREFIX, 0, 0, P_BND },
+ { "nobnd", TOKEN_PREFIX, 0, 0, P_NOBND },
+ { "abs", TOKEN_SPECIAL, 0, 0, S_ABS },
+ { "byte", TOKEN_SPECIAL, 0, 0, S_BYTE },
+ { "dword", TOKEN_SPECIAL, 0, 0, S_DWORD },
+ { "far", TOKEN_SPECIAL, 0, 0, S_FAR },
+ { "long", TOKEN_SPECIAL, 0, 0, S_LONG },
+ { "near", TOKEN_SPECIAL, 0, 0, S_NEAR },
+ { "nosplit", TOKEN_SPECIAL, 0, 0, S_NOSPLIT },
+ { "oword", TOKEN_SPECIAL, 0, 0, S_OWORD },
+ { "qword", TOKEN_SPECIAL, 0, 0, S_QWORD },
+ { "rel", TOKEN_SPECIAL, 0, 0, S_REL },
+ { "short", TOKEN_SPECIAL, 0, 0, S_SHORT },
+ { "strict", TOKEN_SPECIAL, 0, 0, S_STRICT },
+ { "to", TOKEN_SPECIAL, 0, 0, S_TO },
+ { "tword", TOKEN_SPECIAL, 0, 0, S_TWORD },
+ { "word", TOKEN_SPECIAL, 0, 0, S_WORD },
+ { "yword", TOKEN_SPECIAL, 0, 0, S_YWORD },
+ { "zword", TOKEN_SPECIAL, 0, 0, S_ZWORD },
+ { "ptr", TOKEN_ID, 0, TFLAG_WARN, 0 },
+ { "__infinity__", TOKEN_FLOAT, 0, 0, 0 },
+ { "__nan__", TOKEN_FLOAT, 0, 0, 0 },
+ { "__qnan__", TOKEN_FLOAT, 0, 0, 0 },
+ { "__snan__", TOKEN_FLOAT, 0, 0, 0 },
+ { "__float8__", TOKEN_FLOATIZE, 0, 0, FLOAT_8 },
+ { "__float16__", TOKEN_FLOATIZE, 0, 0, FLOAT_16 },
+ { "__float32__", TOKEN_FLOATIZE, 0, 0, FLOAT_32 },
+ { "__float64__", TOKEN_FLOATIZE, 0, 0, FLOAT_64 },
+ { "__float80m__", TOKEN_FLOATIZE, 0, 0, FLOAT_80M },
+ { "__float80e__", TOKEN_FLOATIZE, 0, 0, FLOAT_80E },
+ { "__float128l__", TOKEN_FLOATIZE, 0, 0, FLOAT_128L },
+ { "__float128h__", TOKEN_FLOATIZE, 0, 0, FLOAT_128H },
+ { "__utf16__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF16 },
+ { "__utf16le__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF16LE },
+ { "__utf16be__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF16BE },
+ { "__utf32__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF32 },
+ { "__utf32le__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF32LE },
+ { "__utf32be__", TOKEN_STRFUNC, 0, 0, STRFUNC_UTF32BE },
+ { "__ilog2e__", TOKEN_IFUNC, 0, 0, IFUNC_ILOG2E },
+ { "__ilog2w__", TOKEN_IFUNC, 0, 0, IFUNC_ILOG2W },
+ { "__ilog2f__", TOKEN_IFUNC, 0, 0, IFUNC_ILOG2F },
+ { "__ilog2c__", TOKEN_IFUNC, 0, 0, IFUNC_ILOG2C },
+ { "seg", TOKEN_SEG, 0, 0, 0 },
+ { "wrt", TOKEN_WRT, 0, 0, 0 },
+ { "1to2", TOKEN_DECORATOR, 0, TFLAG_BRC | TFLAG_BRDCAST , BRC_1TO2 },
+ { "1to4", TOKEN_DECORATOR, 0, TFLAG_BRC | TFLAG_BRDCAST , BRC_1TO4 },
+ { "1to8", TOKEN_DECORATOR, 0, TFLAG_BRC | TFLAG_BRDCAST , BRC_1TO8 },
+ { "1to16", TOKEN_DECORATOR, 0, TFLAG_BRC | TFLAG_BRDCAST , BRC_1TO16 },
+ { "rn-sae", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_RN },
+ { "rd-sae", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_RD },
+ { "ru-sae", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_RU },
+ { "rz-sae", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_RZ },
+ { "sae", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_SAE },
+ { "z", TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_Z },
+ { "evex", TOKEN_PREFIX, 0, TFLAG_BRC, P_EVEX },
+ { "vex3", TOKEN_PREFIX, 0, TFLAG_BRC, P_VEX3 },
+ { "vex2", TOKEN_PREFIX, 0, TFLAG_BRC, P_VEX2 },
+ };
+ uint32_t k1, k2;
+ uint64_t crc;
+ uint16_t ix;
+ const struct tokendata *data;
+
+ tv->t_flag = 0;
+ crc = crc64(UINT64_C(0xace2d0e480575791), token);
+ k1 = (uint32_t)crc;
+ k2 = (uint32_t)(crc >> 32);
+
+ ix = hash1[k1 & 0x7ff] + hash2[k2 & 0x7ff];
+ if (ix >= 2283)
+ return tv->t_type = TOKEN_ID;
+
+ data = &tokendata[ix];
+ if (strcmp(data->string, token))
+ return tv->t_type = TOKEN_ID;
+
+ tv->t_integer = data->num;
+ tv->t_inttwo = data->aux;
+ tv->t_flag = data->tokflag;
+ return tv->t_type = data->tokentype;
+}
diff --git a/asm/tokhash.pl b/asm/tokhash.pl
new file mode 100755
index 00000000..9bc2b912
--- /dev/null
+++ b/asm/tokhash.pl
@@ -0,0 +1,284 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2014 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Generate a perfect hash for token parsing
+#
+# Usage: tokenhash.pl insns.dat regs.dat tokens.dat
+#
+
+require 'phash.ph';
+
+my($output, $insns_dat, $regs_dat, $tokens_dat) = @ARGV;
+
+%tokens = ();
+@tokendata = ();
+
+#
+# List of condition codes
+#
+@conditions = ('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');
+
+#
+# Read insns.dat
+#
+open(ID, '<', $insns_dat) or die "$0: cannot open $insns_dat: $!\n";
+while (defined($line = <ID>)) {
+ if ($line =~ /^([A-Z0-9_]+)(|cc)\s/) {
+ $insn = $1.$2;
+ ($token = $1) =~ tr/A-Z/a-z/;
+
+ if ($2 eq '') {
+ # Single instruction token
+ if (!defined($tokens{$token})) {
+ $tokens{$token} = scalar @tokendata;
+ push(@tokendata, "\"${token}\", TOKEN_INSN, C_none, 0, I_${insn}");
+ }
+ } else {
+ # Conditional instruction
+ foreach $cc (@conditions) {
+ if (!defined($tokens{$token.$cc})) {
+ $tokens{$token.$cc} = scalar @tokendata;
+ push(@tokendata, "\"${token}${cc}\", TOKEN_INSN, C_\U$cc\E, 0, I_${insn}");
+ }
+ }
+ }
+ }
+}
+close(ID);
+
+#
+# Read regs.dat
+#
+open(RD, '<', $regs_dat) or die "$0: cannot open $regs_dat: $!\n";
+while (defined($line = <RD>)) {
+ if ($line =~ /^([a-z0-9_-]+)\s*\S+\s*\S+\s*[0-9]+\s*(\S*)/) {
+ $reg = $1;
+ $reg_flag = $2;
+
+ if ($reg =~ /^(.*[^0-9])([0-9]+)\-([0-9]+)(|[^0-9].*)$/) {
+ $nregs = $3-$2+1;
+ $reg = $1.$2.$4;
+ $reg_nr = $2;
+ $reg_prefix = $1;
+ $reg_suffix = $4;
+ } else {
+ $nregs = 1;
+ undef $reg_prefix, $reg_suffix;
+ }
+
+ while ($nregs--) {
+ if (defined($tokens{$reg})) {
+ die "Duplicate definition: $reg\n";
+ }
+ $tokens{$reg} = scalar @tokendata;
+ if ($reg_flag eq '') {
+ push(@tokendata, "\"${reg}\", TOKEN_REG, 0, 0, R_\U${reg}\E");
+ } else {
+ push(@tokendata, "\"${reg}\", TOKEN_REG, 0, ${reg_flag}, R_\U${reg}\E");
+ }
+
+ if (defined($reg_prefix)) {
+ $reg_nr++;
+ $reg = sprintf("%s%u%s", $reg_prefix, $reg_nr, $reg_suffix);
+ } else {
+ # Not a dashed sequence
+ die if ($nregs);
+ }
+ }
+ }
+}
+close(RD);
+
+#
+# Read tokens.dat
+#
+open(TD, '<', $tokens_dat) or die "$0: cannot open $tokens_dat: $!\n";
+while (defined($line = <TD>)) {
+ if ($line =~ /^\%\s+(.*)$/) {
+ $pattern = $1;
+ } elsif ($line =~ /^([a-z0-9_-]+)/) {
+ $token = $1;
+
+ if (defined($tokens{$token})) {
+ die "Duplicate definition: $token\n";
+ }
+ $tokens{$token} = scalar @tokendata;
+
+ $data = $pattern;
+ if ($data =~ /^(.*)\{(.*)\}(.*)$/) {
+ my $head = $1, $tail = $3;
+ my $px = $2;
+
+ $px =~ s/\*/(.*)/g;
+ if ($token =~ /$px/i) {
+ $data = $head."\U$1".$tail;
+ } else {
+ die "$0: token $token doesn't match $px\n";
+ }
+ }
+
+ $data =~ s/\*/\U$token/g;
+
+ push(@tokendata, "\"$token\", $data");
+ }
+}
+close(TD);
+
+if ($output eq 'h') {
+ #
+ # tokens.h
+ #
+
+ $max_len = 0;
+ foreach $token (keys(%tokens)) {
+ if (length($token) > $max_len) {
+ $max_len = length($token);
+ }
+ }
+
+ print "/*\n";
+ print " * This file is generated from insns.dat, regs.dat and token.dat\n";
+ print " * by tokhash.pl; do not edit.\n";
+ print " */\n";
+ print "\n";
+
+ print "#ifndef NASM_TOKENS_H\n";
+ print "#define NASM_TOKENS_H\n";
+ print "\n";
+ print "#define MAX_KEYWORD $max_len /* length of longest keyword */\n";
+ print "\n";
+ print "#endif /* NASM_TOKENS_H */\n";
+} elsif ($output eq 'c') {
+ #
+ # tokhash.c
+ #
+
+ @hashinfo = gen_perfect_hash(\%tokens);
+ if (!@hashinfo) {
+ die "$0: no hash found\n";
+ }
+
+ # Paranoia...
+ verify_hash_table(\%tokens, \@hashinfo);
+
+ ($n, $sv, $g) = @hashinfo;
+ $sv2 = $sv+2;
+
+ die if ($n & ($n-1));
+
+ print "/*\n";
+ print " * This file is generated from insns.dat, regs.dat and token.dat\n";
+ print " * by tokhash.pl; do not edit.\n";
+ print " */\n";
+ print "\n";
+
+ print "#include \"compiler.h\"\n";
+ print "#include <string.h>\n";
+ print "#include \"nasm.h\"\n";
+ print "#include \"hashtbl.h\"\n";
+ print "#include \"insns.h\"\n";
+ print "#include \"stdscan.h\"\n";
+ print "\n";
+
+ # These somewhat odd sizes and ordering thereof are due to the
+ # relative ranges of the types; this makes it fit in 16 bytes on
+ # 64-bit machines and 12 bytes on 32-bit machines.
+ print "struct tokendata {\n";
+ print " const char *string;\n";
+ print " int16_t tokentype;\n";
+ print " int8_t aux;\n";
+ print " int8_t tokflag;\n";
+ print " int32_t num;\n";
+ print "};\n";
+ print "\n";
+
+ print "int nasm_token_hash(const char *token, struct tokenval *tv)\n";
+ print "{\n";
+
+ # Put a large value in unused slots. This makes it extremely unlikely
+ # that any combination that involves unused slot will pass the range test.
+ # This speeds up rejection of unrecognized tokens, i.e. identifiers.
+ print "#define UNUSED (65535/3)\n";
+
+ print " static const int16_t hash1[$n] = {\n";
+ for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+0];
+ print " ", defined($h) ? $h : 'UNUSED', ",\n";
+ }
+ print " };\n";
+
+ print " static const int16_t hash2[$n] = {\n";
+ for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+1];
+ print " ", defined($h) ? $h : 'UNUSED', ",\n";
+ }
+ print " };\n";
+
+ printf " static const struct tokendata tokendata[%d] = {\n", scalar(@tokendata);
+ foreach $d (@tokendata) {
+ print " { ", $d, " },\n";
+ }
+ print " };\n";
+
+ print " uint32_t k1, k2;\n";
+ print " uint64_t crc;\n";
+ # For correct overflow behavior, "ix" should be unsigned of the same
+ # width as the hash arrays.
+ print " uint16_t ix;\n";
+ print " const struct tokendata *data;\n";
+ print "\n";
+ printf " tv->t_flag = 0;\n";
+ printf " crc = crc64(UINT64_C(0x%08x%08x), token);\n",
+ $$sv[0], $$sv[1];
+ print " k1 = (uint32_t)crc;\n";
+ print " k2 = (uint32_t)(crc >> 32);\n";
+ print "\n";
+ printf " ix = hash1[k1 & 0x%x] + hash2[k2 & 0x%x];\n", $n-1, $n-1;
+ printf " if (ix >= %d)\n", scalar(@tokendata);
+ print " return tv->t_type = TOKEN_ID;\n";
+ print "\n";
+ print " data = &tokendata[ix];\n";
+
+ print " if (strcmp(data->string, token))\n";
+ print " return tv->t_type = TOKEN_ID;\n";
+ print "\n";
+ print " tv->t_integer = data->num;\n";
+ print " tv->t_inttwo = data->aux;\n";
+ print " tv->t_flag = data->tokflag;\n";
+ print " return tv->t_type = data->tokentype;\n";
+ print "}\n";
+}
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 00000000..5dbcbb5e
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,8 @@
+#!/bin/sh -xe
+#
+# Simple script to run the appropriate autotools from a repository.
+#
+autoreconf
+rm -rf autom4te.cache config.log config.status
+rm -f Makefile rdoff/Makefile doc/Makefile
+rm -f config.h.in config.h config/config.h
diff --git a/codereview.settings b/codereview.settings
new file mode 100644
index 00000000..67792642
--- /dev/null
+++ b/codereview.settings
@@ -0,0 +1,3 @@
+# This file is used by gcl to get repository specific information.
+GERRIT_HOST: True
+PROJECT: nasm
diff --git a/common/common.c b/common/common.c
new file mode 100644
index 00000000..13237994
--- /dev/null
+++ b/common/common.c
@@ -0,0 +1,64 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * common.c - code common to nasm and ndisasm
+ */
+
+#include "compiler.h"
+#include "nasm.h"
+#include "nasmlib.h"
+#include "insns.h"
+
+/*
+ * The current bit size of the CPU
+ */
+int globalbits = 0;
+/*
+ * Common list of prefix names; ideally should be auto-generated
+ * from tokens.dat
+ */
+const char *prefix_name(int token)
+{
+ static const char *prefix_names[] = {
+ "a16", "a32", "a64", "asp", "lock", "o16", "o32", "o64", "osp",
+ "rep", "repe", "repne", "repnz", "repz", "times", "wait",
+ "xacquire", "xrelease", "bnd"
+ };
+ unsigned int prefix = token-PREFIX_ENUM_START;
+
+ if (prefix >= ARRAY_SIZE(prefix_names))
+ return NULL;
+
+ return prefix_names[prefix];
+}
diff --git a/config/config-linux.h b/config/config-linux.h
new file mode 100644
index 00000000..7eb7c20f
--- /dev/null
+++ b/config/config-linux.h
@@ -0,0 +1,544 @@
+/* config/config.h. Generated from config.h.in by configure. */
+/* config/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 to call abort() on panics (internal errors), for debugging. */
+/* #undef ABORT_ON_PANIC */
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* Define to 1 if compiled with the `-fdata-sections' compiler flag */
+/* #undef CFLAG_FDATA_SECTIONS */
+
+/* Define to 1 if compiled with the `-ffunction-sections' compiler flag */
+/* #undef CFLAG_FFUNCTION_SECTIONS */
+
+/* Define to 1 if compiled with the `-fgnu89-inline' compiler flag */
+/* #undef CFLAG_FGNU89_INLINE */
+
+/* Define to 1 if compiled with the `-flto' compiler flag */
+/* #undef CFLAG_FLTO */
+
+/* Define to 1 if compiled with the `-fno-common' compiler flag */
+#define CFLAG_FNO_COMMON 1
+
+/* Define to 1 if compiled with the `-fno-omit-frame-pointer' compiler flag */
+/* #undef CFLAG_FNO_OMIT_FRAME_POINTER */
+
+/* Define to 1 if compiled with the `-fsanitize=address' compiler flag */
+/* #undef CFLAG_FSANITIZE_ADDRESS */
+
+/* Define to 1 if compiled with the `-fsanitize=undefined' compiler flag */
+/* #undef CFLAG_FSANITIZE_UNDEFINED */
+
+/* Define to 1 if compiled with the `-fvisibility=hidden' compiler flag */
+#define CFLAG_FVISIBILITY_HIDDEN 1
+
+/* Define to 1 if compiled with the `-fwrapv' compiler flag */
+#define CFLAG_FWRAPV 1
+
+/* Define to 1 if compiled with the `-ggdb3' compiler flag */
+/* #undef CFLAG_GGDB3 */
+
+/* Define to 1 if compiled with the `-O0' compiler flag */
+/* #undef CFLAG_O0 */
+
+/* Define to 1 if compiled with the `-pedantic' compiler flag */
+#define CFLAG_PEDANTIC 1
+
+/* Define to 1 if compiled with the `-U__STRICT_ANSI__' compiler flag */
+#define CFLAG_U_STRICT_ANSI 1
+
+/* Define to 1 if compiled with the `-W' compiler flag */
+#define CFLAG_W 1
+
+/* Define to 1 if compiled with the `-Wall' compiler flag */
+#define CFLAG_WALL 1
+
+/* Define to 1 if compiled with the `-Wc90-c99-compat' compiler flag */
+/* #undef CFLAG_WC90_C99_COMPAT */
+
+/* Define to 1 if compiled with the `-Werror' compiler flag */
+/* #undef CFLAG_WERROR */
+
+/* Define to 1 if compiled with the `-Werror=attributes' compiler flag */
+#define CFLAG_WERROR_ATTRIBUTES 1
+
+/* Define to 1 if compiled with the `-Werror=comment' compiler flag */
+#define CFLAG_WERROR_COMMENT 1
+
+/* Define to 1 if compiled with the `-Werror=implicit' compiler flag */
+#define CFLAG_WERROR_IMPLICIT 1
+
+/* Define to 1 if compiled with the `-Werror=missing-braces' compiler flag */
+#define CFLAG_WERROR_MISSING_BRACES 1
+
+/* Define to 1 if compiled with the `-Werror=missing-declarations' compiler
+ flag */
+#define CFLAG_WERROR_MISSING_DECLARATIONS 1
+
+/* Define to 1 if compiled with the `-Werror=missing-prototypes' compiler flag
+ */
+#define CFLAG_WERROR_MISSING_PROTOTYPES 1
+
+/* Define to 1 if compiled with the `-Werror=pointer-arith' compiler flag */
+#define CFLAG_WERROR_POINTER_ARITH 1
+
+/* Define to 1 if compiled with the `-Werror=return-type' compiler flag */
+#define CFLAG_WERROR_RETURN_TYPE 1
+
+/* Define to 1 if compiled with the `-Werror=strict-prototypes' compiler flag
+ */
+#define CFLAG_WERROR_STRICT_PROTOTYPES 1
+
+/* Define to 1 if compiled with the `-Werror=trigraphs' compiler flag */
+#define CFLAG_WERROR_TRIGRAPHS 1
+
+/* Define to 1 if compiled with the `-Werror=unknown-warning-option' compiler
+ flag */
+#define CFLAG_WERROR_UNKNOWN_WARNING_OPTION 1
+
+/* Define to 1 if compiled with the `-Werror=vla' compiler flag */
+#define CFLAG_WERROR_VLA 1
+
+/* Define to 1 if compiled with the `-Wlong-long' compiler flag */
+#define CFLAG_WLONG_LONG 1
+
+/* Define to 1 if compiled with the `-Wl,--gc-sections' compiler flag */
+/* #undef CFLAG_WL_GC_SECTIONS */
+
+/* Define to 1 if compiled with the `-Wpedantic-ms-format' compiler flag */
+/* #undef CFLAG_WPEDANTIC_MS_FORMAT */
+
+/* Define to 1 if compiled with the `-Wstringop-truncation' compiler flag */
+/* #undef CFLAG_WSTRINGOP_TRUNCATION */
+
+/* Define to 1 if you have the `access' function. */
+#define HAVE_ACCESS 1
+
+/* Define to 1 if you have the `canonicalize_file_name' function. */
+#define HAVE_CANONICALIZE_FILE_NAME 1
+
+/* Define to 1 if you have the `cpu_to_le16' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE16 */
+
+/* Define to 1 if you have the `cpu_to_le32' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE32 */
+
+/* Define to 1 if you have the `cpu_to_le64' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE64 */
+
+/* Define to 1 if you have the declaration of `strcasecmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRCASECMP 1
+
+/* Define to 1 if you have the declaration of `stricmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRICMP 0
+
+/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRLCPY 1
+
+/* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNCASECMP 1
+
+/* Define to 1 if you have the declaration of `strnicmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNICMP 0
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNLEN 1
+
+/* Define to 1 if you have the declaration of `strrchrnul', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRRCHRNUL 0
+
+/* Define to 1 if you have the declaration of `strsep', and to 0 if you don't.
+ */
+#define HAVE_DECL_STRSEP 1
+
+/* Define to 1 if you have the <endian.h> header file. */
+#define HAVE_ENDIAN_H 1
+
+/* Define to 1 if you have the `faccessat' function. */
+#define HAVE_FACCESSAT 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `fileno' function. */
+#define HAVE_FILENO 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#define HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `fstat' function. */
+#define HAVE_FSTAT 1
+
+/* Define to 1 if you have the `ftruncate' function. */
+#define HAVE_FTRUNCATE 1
+
+/* Define to 1 if your compiler supports __attribute__((alloc_size)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_ALLOC_SIZE 1
+
+/* Define to 1 if your compiler supports __attribute__((cold)) on functions */
+#define HAVE_FUNC_ATTRIBUTE_COLD 1
+
+/* Define to 1 if your compiler supports __attribute__((const)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_CONST 1
+
+/* Define to 1 if your compiler supports __attribute__((error)) on functions
+ */
+/* #undef HAVE_FUNC_ATTRIBUTE_ERROR */
+
+/* Define to 1 if your compiler supports __attribute__((format)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_FORMAT 1
+
+/* Define to 1 if your compiler supports __attribute__((malloc)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_MALLOC 1
+
+/* Define to 1 if your compiler supports __attribute__((noreturn)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_NORETURN 1
+
+/* Define to 1 if your compiler supports __attribute__((pure)) on functions */
+#define HAVE_FUNC_ATTRIBUTE_PURE 1
+
+/* Define to 1 if your compiler supports __attribute__((returns_nonnull)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL 1
+
+/* Define to 1 if your compiler supports __attribute__((sentinel)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_SENTINEL 1
+
+/* Define to 1 if you have the `getgid' function. */
+#define HAVE_GETGID 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getuid' function. */
+#define HAVE_GETUID 1
+
+/* Define to 1 if you have the `htole16' intrinsic function. */
+#define HAVE_HTOLE16 1
+
+/* Define to 1 if you have the `htole32' intrinsic function. */
+#define HAVE_HTOLE32 1
+
+/* Define to 1 if you have the `htole64' intrinsic function. */
+#define HAVE_HTOLE64 1
+
+/* Define to 1 if you have the <intrin.h> header file. */
+/* #undef HAVE_INTRIN_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <io.h> header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the <machine/endian.h> header file. */
+/* #undef HAVE_MACHINE_ENDIAN_H */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* Define to 1 if you have the `pathconf' function. */
+#define HAVE_PATHCONF 1
+
+/* Define to 1 if you have the `realpath' function. */
+#define HAVE_REALPATH 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `stat' function. */
+#define HAVE_STAT 1
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if your compiler supports C99 extern inline */
+#define HAVE_STDC_INLINE 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <stdnoreturn.h> header file. */
+#define HAVE_STDNORETURN_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `stricmp' function. */
+/* #undef HAVE_STRICMP */
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strlcpy' function. */
+/* #undef HAVE_STRLCPY */
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the `strnicmp' function. */
+/* #undef HAVE_STRNICMP */
+
+/* Define to 1 if you have the `strnlen' function. */
+#define HAVE_STRNLEN 1
+
+/* Define to 1 if you have the `strrchrnul' function. */
+/* #undef HAVE_STRRCHRNUL */
+
+/* Define to 1 if you have the `strsep' function. */
+#define HAVE_STRSEP 1
+
+/* Define to 1 if the system has the type `struct stat'. */
+#define HAVE_STRUCT_STAT 1
+
+/* Define to 1 if the system has the type `struct _stati64'. */
+/* #undef HAVE_STRUCT__STATI64 */
+
+/* Define to 1 if you have the `sysconf' function. */
+#define HAVE_SYSCONF 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#define HAVE_UINTPTR_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_access' function. */
+/* #undef HAVE__ACCESS */
+
+/* Define to 1 if you have the `_BitScanReverse' intrinsic function. */
+/* #undef HAVE__BITSCANREVERSE */
+
+/* Define to 1 if you have the `_BitScanReverse64' intrinsic function. */
+/* #undef HAVE__BITSCANREVERSE64 */
+
+/* Define to 1 if the system has the type `_Bool'. */
+#define HAVE__BOOL 1
+
+/* Define to 1 if you have the `_byteswap_uint64' intrinsic function. */
+/* #undef HAVE__BYTESWAP_UINT64 */
+
+/* Define to 1 if you have the `_byteswap_ulong' intrinsic function. */
+/* #undef HAVE__BYTESWAP_ULONG */
+
+/* Define to 1 if you have the `_byteswap_ushort' intrinsic function. */
+/* #undef HAVE__BYTESWAP_USHORT */
+
+/* Define to 1 if you have the `_chsize' function. */
+/* #undef HAVE__CHSIZE */
+
+/* Define to 1 if you have the `_chsize_s' function. */
+/* #undef HAVE__CHSIZE_S */
+
+/* Define to 1 if you have the `_filelengthi64' function. */
+/* #undef HAVE__FILELENGTHI64 */
+
+/* Define to 1 if you have the `_fileno' function. */
+/* #undef HAVE__FILENO */
+
+/* Define to 1 if you have the `_fseeki64' function. */
+/* #undef HAVE__FSEEKI64 */
+
+/* Define to 1 if you have the `_fstati64' function. */
+/* #undef HAVE__FSTATI64 */
+
+/* Define to 1 if you have the `_fullpath' function. */
+/* #undef HAVE__FULLPATH */
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_stati64' function. */
+/* #undef HAVE__STATI64 */
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `__bswap_16' intrinsic function. */
+#define HAVE___BSWAP_16 1
+
+/* Define to 1 if you have the `__bswap_32' intrinsic function. */
+#define HAVE___BSWAP_32 1
+
+/* Define to 1 if you have the `__bswap_64' intrinsic function. */
+#define HAVE___BSWAP_64 1
+
+/* Define to 1 if you have the `__builtin_bswap16' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP16 1
+
+/* Define to 1 if you have the `__builtin_bswap32' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP32 1
+
+/* Define to 1 if you have the `__builtin_bswap64' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP64 1
+
+/* Define to 1 if you have the `__builtin_clz' intrinsic function. */
+#define HAVE___BUILTIN_CLZ 1
+
+/* Define to 1 if you have the `__builtin_clzl' intrinsic function. */
+#define HAVE___BUILTIN_CLZL 1
+
+/* Define to 1 if you have the `__builtin_clzll' intrinsic function. */
+#define HAVE___BUILTIN_CLZLL 1
+
+/* Define to 1 if you have the `__builtin_constant_p' intrinsic function. */
+#define HAVE___BUILTIN_CONSTANT_P 1
+
+/* Define to 1 if you have the `__builtin_expect' intrinsic function. */
+#define HAVE___BUILTIN_EXPECT 1
+
+/* Define to 1 if you have the `__cpu_to_le16' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE16 */
+
+/* Define to 1 if you have the `__cpu_to_le32' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE32 */
+
+/* Define to 1 if you have the `__cpu_to_le64' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE64 */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Define to 1 if your processor stores words with the least significant byte
+ first (like Intel and VAX, unlike Motorola and SPARC). */
+#define WORDS_LITTLEENDIAN 1
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+#define restrict __restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+ __restrict__, even though the corresponding Sun C compiler ends up with
+ "#define restrict _Restrict" or "#define restrict __restrict__" in the
+ previous line. Perhaps some future version of Sun C++ will work with
+ restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+/* #undef uintptr_t */
diff --git a/config/config-mac.h b/config/config-mac.h
new file mode 100644
index 00000000..93a28198
--- /dev/null
+++ b/config/config-mac.h
@@ -0,0 +1,544 @@
+/* config/config.h. Generated from config.h.in by configure. */
+/* config/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 to call abort() on panics (internal errors), for debugging. */
+/* #undef ABORT_ON_PANIC */
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* Define to 1 if compiled with the `-fdata-sections' compiler flag */
+/* #undef CFLAG_FDATA_SECTIONS */
+
+/* Define to 1 if compiled with the `-ffunction-sections' compiler flag */
+/* #undef CFLAG_FFUNCTION_SECTIONS */
+
+/* Define to 1 if compiled with the `-fgnu89-inline' compiler flag */
+/* #undef CFLAG_FGNU89_INLINE */
+
+/* Define to 1 if compiled with the `-flto' compiler flag */
+/* #undef CFLAG_FLTO */
+
+/* Define to 1 if compiled with the `-fno-common' compiler flag */
+#define CFLAG_FNO_COMMON 1
+
+/* Define to 1 if compiled with the `-fno-omit-frame-pointer' compiler flag */
+/* #undef CFLAG_FNO_OMIT_FRAME_POINTER */
+
+/* Define to 1 if compiled with the `-fsanitize=address' compiler flag */
+/* #undef CFLAG_FSANITIZE_ADDRESS */
+
+/* Define to 1 if compiled with the `-fsanitize=undefined' compiler flag */
+/* #undef CFLAG_FSANITIZE_UNDEFINED */
+
+/* Define to 1 if compiled with the `-fvisibility=hidden' compiler flag */
+#define CFLAG_FVISIBILITY_HIDDEN 1
+
+/* Define to 1 if compiled with the `-fwrapv' compiler flag */
+#define CFLAG_FWRAPV 1
+
+/* Define to 1 if compiled with the `-ggdb3' compiler flag */
+/* #undef CFLAG_GGDB3 */
+
+/* Define to 1 if compiled with the `-O0' compiler flag */
+/* #undef CFLAG_O0 */
+
+/* Define to 1 if compiled with the `-pedantic' compiler flag */
+#define CFLAG_PEDANTIC 1
+
+/* Define to 1 if compiled with the `-U__STRICT_ANSI__' compiler flag */
+#define CFLAG_U_STRICT_ANSI 1
+
+/* Define to 1 if compiled with the `-W' compiler flag */
+#define CFLAG_W 1
+
+/* Define to 1 if compiled with the `-Wall' compiler flag */
+#define CFLAG_WALL 1
+
+/* Define to 1 if compiled with the `-Wc90-c99-compat' compiler flag */
+/* #undef CFLAG_WC90_C99_COMPAT */
+
+/* Define to 1 if compiled with the `-Werror' compiler flag */
+/* #undef CFLAG_WERROR */
+
+/* Define to 1 if compiled with the `-Werror=attributes' compiler flag */
+#define CFLAG_WERROR_ATTRIBUTES 1
+
+/* Define to 1 if compiled with the `-Werror=comment' compiler flag */
+#define CFLAG_WERROR_COMMENT 1
+
+/* Define to 1 if compiled with the `-Werror=implicit' compiler flag */
+#define CFLAG_WERROR_IMPLICIT 1
+
+/* Define to 1 if compiled with the `-Werror=missing-braces' compiler flag */
+#define CFLAG_WERROR_MISSING_BRACES 1
+
+/* Define to 1 if compiled with the `-Werror=missing-declarations' compiler
+ flag */
+#define CFLAG_WERROR_MISSING_DECLARATIONS 1
+
+/* Define to 1 if compiled with the `-Werror=missing-prototypes' compiler flag
+ */
+#define CFLAG_WERROR_MISSING_PROTOTYPES 1
+
+/* Define to 1 if compiled with the `-Werror=pointer-arith' compiler flag */
+#define CFLAG_WERROR_POINTER_ARITH 1
+
+/* Define to 1 if compiled with the `-Werror=return-type' compiler flag */
+#define CFLAG_WERROR_RETURN_TYPE 1
+
+/* Define to 1 if compiled with the `-Werror=strict-prototypes' compiler flag
+ */
+#define CFLAG_WERROR_STRICT_PROTOTYPES 1
+
+/* Define to 1 if compiled with the `-Werror=trigraphs' compiler flag */
+#define CFLAG_WERROR_TRIGRAPHS 1
+
+/* Define to 1 if compiled with the `-Werror=unknown-warning-option' compiler
+ flag */
+#define CFLAG_WERROR_UNKNOWN_WARNING_OPTION 1
+
+/* Define to 1 if compiled with the `-Werror=vla' compiler flag */
+#define CFLAG_WERROR_VLA 1
+
+/* Define to 1 if compiled with the `-Wlong-long' compiler flag */
+#define CFLAG_WLONG_LONG 1
+
+/* Define to 1 if compiled with the `-Wl,--gc-sections' compiler flag */
+/* #undef CFLAG_WL_GC_SECTIONS */
+
+/* Define to 1 if compiled with the `-Wpedantic-ms-format' compiler flag */
+/* #undef CFLAG_WPEDANTIC_MS_FORMAT */
+
+/* Define to 1 if compiled with the `-Wstringop-truncation' compiler flag */
+/* #undef CFLAG_WSTRINGOP_TRUNCATION */
+
+/* Define to 1 if you have the `access' function. */
+#define HAVE_ACCESS 1
+
+/* Define to 1 if you have the `canonicalize_file_name' function. */
+/* #undef HAVE_CANONICALIZE_FILE_NAME */
+
+/* Define to 1 if you have the `cpu_to_le16' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE16 */
+
+/* Define to 1 if you have the `cpu_to_le32' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE32 */
+
+/* Define to 1 if you have the `cpu_to_le64' intrinsic function. */
+/* #undef HAVE_CPU_TO_LE64 */
+
+/* Define to 1 if you have the declaration of `strcasecmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRCASECMP 1
+
+/* Define to 1 if you have the declaration of `stricmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRICMP 0
+
+/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRLCPY 1
+
+/* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNCASECMP 1
+
+/* Define to 1 if you have the declaration of `strnicmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNICMP 0
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNLEN 1
+
+/* Define to 1 if you have the declaration of `strrchrnul', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRRCHRNUL 0
+
+/* Define to 1 if you have the declaration of `strsep', and to 0 if you don't.
+ */
+#define HAVE_DECL_STRSEP 1
+
+/* Define to 1 if you have the <endian.h> header file. */
+/* #undef HAVE_ENDIAN_H */
+
+/* Define to 1 if you have the `faccessat' function. */
+/* #undef HAVE_FACCESSAT */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `fileno' function. */
+#define HAVE_FILENO 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#define HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `fstat' function. */
+#define HAVE_FSTAT 1
+
+/* Define to 1 if you have the `ftruncate' function. */
+#define HAVE_FTRUNCATE 1
+
+/* Define to 1 if your compiler supports __attribute__((alloc_size)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_ALLOC_SIZE 1
+
+/* Define to 1 if your compiler supports __attribute__((cold)) on functions */
+#define HAVE_FUNC_ATTRIBUTE_COLD 1
+
+/* Define to 1 if your compiler supports __attribute__((const)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_CONST 1
+
+/* Define to 1 if your compiler supports __attribute__((error)) on functions
+ */
+/* #undef HAVE_FUNC_ATTRIBUTE_ERROR */
+
+/* Define to 1 if your compiler supports __attribute__((format)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_FORMAT 1
+
+/* Define to 1 if your compiler supports __attribute__((malloc)) on functions
+ */
+#define HAVE_FUNC_ATTRIBUTE_MALLOC 1
+
+/* Define to 1 if your compiler supports __attribute__((noreturn)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_NORETURN 1
+
+/* Define to 1 if your compiler supports __attribute__((pure)) on functions */
+#define HAVE_FUNC_ATTRIBUTE_PURE 1
+
+/* Define to 1 if your compiler supports __attribute__((returns_nonnull)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL 1
+
+/* Define to 1 if your compiler supports __attribute__((sentinel)) on
+ functions */
+#define HAVE_FUNC_ATTRIBUTE_SENTINEL 1
+
+/* Define to 1 if you have the `getgid' function. */
+#define HAVE_GETGID 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getuid' function. */
+#define HAVE_GETUID 1
+
+/* Define to 1 if you have the `htole16' intrinsic function. */
+/* #undef HAVE_HTOLE16 */
+
+/* Define to 1 if you have the `htole32' intrinsic function. */
+/* #undef HAVE_HTOLE32 */
+
+/* Define to 1 if you have the `htole64' intrinsic function. */
+/* #undef HAVE_HTOLE64 */
+
+/* Define to 1 if you have the <intrin.h> header file. */
+/* #undef HAVE_INTRIN_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <io.h> header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the <machine/endian.h> header file. */
+#define HAVE_MACHINE_ENDIAN_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* Define to 1 if you have the `pathconf' function. */
+#define HAVE_PATHCONF 1
+
+/* Define to 1 if you have the `realpath' function. */
+#define HAVE_REALPATH 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `stat' function. */
+#define HAVE_STAT 1
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if your compiler supports C99 extern inline */
+#define HAVE_STDC_INLINE 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <stdnoreturn.h> header file. */
+#define HAVE_STDNORETURN_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `stricmp' function. */
+/* #undef HAVE_STRICMP */
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strlcpy' function. */
+#define HAVE_STRLCPY 1
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the `strnicmp' function. */
+/* #undef HAVE_STRNICMP */
+
+/* Define to 1 if you have the `strnlen' function. */
+#define HAVE_STRNLEN 1
+
+/* Define to 1 if you have the `strrchrnul' function. */
+/* #undef HAVE_STRRCHRNUL */
+
+/* Define to 1 if you have the `strsep' function. */
+#define HAVE_STRSEP 1
+
+/* Define to 1 if the system has the type `struct stat'. */
+#define HAVE_STRUCT_STAT 1
+
+/* Define to 1 if the system has the type `struct _stati64'. */
+/* #undef HAVE_STRUCT__STATI64 */
+
+/* Define to 1 if you have the `sysconf' function. */
+#define HAVE_SYSCONF 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#define HAVE_UINTPTR_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_access' function. */
+/* #undef HAVE__ACCESS */
+
+/* Define to 1 if you have the `_BitScanReverse' intrinsic function. */
+/* #undef HAVE__BITSCANREVERSE */
+
+/* Define to 1 if you have the `_BitScanReverse64' intrinsic function. */
+/* #undef HAVE__BITSCANREVERSE64 */
+
+/* Define to 1 if the system has the type `_Bool'. */
+#define HAVE__BOOL 1
+
+/* Define to 1 if you have the `_byteswap_uint64' intrinsic function. */
+/* #undef HAVE__BYTESWAP_UINT64 */
+
+/* Define to 1 if you have the `_byteswap_ulong' intrinsic function. */
+/* #undef HAVE__BYTESWAP_ULONG */
+
+/* Define to 1 if you have the `_byteswap_ushort' intrinsic function. */
+/* #undef HAVE__BYTESWAP_USHORT */
+
+/* Define to 1 if you have the `_chsize' function. */
+/* #undef HAVE__CHSIZE */
+
+/* Define to 1 if you have the `_chsize_s' function. */
+/* #undef HAVE__CHSIZE_S */
+
+/* Define to 1 if you have the `_filelengthi64' function. */
+/* #undef HAVE__FILELENGTHI64 */
+
+/* Define to 1 if you have the `_fileno' function. */
+/* #undef HAVE__FILENO */
+
+/* Define to 1 if you have the `_fseeki64' function. */
+/* #undef HAVE__FSEEKI64 */
+
+/* Define to 1 if you have the `_fstati64' function. */
+/* #undef HAVE__FSTATI64 */
+
+/* Define to 1 if you have the `_fullpath' function. */
+/* #undef HAVE__FULLPATH */
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_stati64' function. */
+/* #undef HAVE__STATI64 */
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `__bswap_16' intrinsic function. */
+/* #undef HAVE___BSWAP_16 */
+
+/* Define to 1 if you have the `__bswap_32' intrinsic function. */
+/* #undef HAVE___BSWAP_32 */
+
+/* Define to 1 if you have the `__bswap_64' intrinsic function. */
+/* #undef HAVE___BSWAP_64 */
+
+/* Define to 1 if you have the `__builtin_bswap16' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP16 1
+
+/* Define to 1 if you have the `__builtin_bswap32' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP32 1
+
+/* Define to 1 if you have the `__builtin_bswap64' intrinsic function. */
+#define HAVE___BUILTIN_BSWAP64 1
+
+/* Define to 1 if you have the `__builtin_clz' intrinsic function. */
+#define HAVE___BUILTIN_CLZ 1
+
+/* Define to 1 if you have the `__builtin_clzl' intrinsic function. */
+#define HAVE___BUILTIN_CLZL 1
+
+/* Define to 1 if you have the `__builtin_clzll' intrinsic function. */
+#define HAVE___BUILTIN_CLZLL 1
+
+/* Define to 1 if you have the `__builtin_constant_p' intrinsic function. */
+#define HAVE___BUILTIN_CONSTANT_P 1
+
+/* Define to 1 if you have the `__builtin_expect' intrinsic function. */
+#define HAVE___BUILTIN_EXPECT 1
+
+/* Define to 1 if you have the `__cpu_to_le16' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE16 */
+
+/* Define to 1 if you have the `__cpu_to_le32' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE32 */
+
+/* Define to 1 if you have the `__cpu_to_le64' intrinsic function. */
+/* #undef HAVE___CPU_TO_LE64 */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Define to 1 if your processor stores words with the least significant byte
+ first (like Intel and VAX, unlike Motorola and SPARC). */
+#define WORDS_LITTLEENDIAN 1
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+#define restrict __restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+ __restrict__, even though the corresponding Sun C compiler ends up with
+ "#define restrict _Restrict" or "#define restrict __restrict__" in the
+ previous line. Perhaps some future version of Sun C++ will work with
+ restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+/* #undef uintptr_t */
diff --git a/config/config.h b/config/config.h
new file mode 100644
index 00000000..155cdf13
--- /dev/null
+++ b/config/config.h
@@ -0,0 +1,11 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#if __APPLE__
+#include "config-mac.h"
+#elif _WIN32
+#include "msvc.h"
+#else
+#include "config-linux.h"
+#endif
diff --git a/config/msvc.h b/config/msvc.h
new file mode 100644
index 00000000..631652ef
--- /dev/null
+++ b/config/msvc.h
@@ -0,0 +1,192 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * config/msvc.h
+ *
+ * Compiler definitions for Microsoft Visual C++;
+ * instead of config.h.in. See config.h.in for the
+ * variables which can be defined here.
+ *
+ * MSDN seems to have information back to Visual Studio 2003, so aim
+ * for compatibility that far back.
+ *
+ * Relevant _MSC_VER values:
+ * 1310 - Visual Studio 2003
+ * 1400 - Visual Studio 2005
+ * 1500 - Visual Studio 2008
+ * 1600 - Visual Studio 2010
+ * 1700 - Visual Studio 2012
+ * 1800 - Visual Studio 2013
+ * 1900 - Visual Studio 2015
+ * 1910 - Visual Studio 2017
+ */
+
+#ifndef NASM_CONFIG_MSVC_H
+#define NASM_CONFIG_MSVC_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#if _MSC_VER >= 1800
+# define HAVE_INTTYPES_H 1
+#endif
+
+/* Define to 1 if you have the <io.h> header file. */
+#define HAVE_IO_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the `access' function. */
+#define HAVE_ACCESS 1
+#if _MSC_VER < 1400
+# define access _access
+#endif
+
+/* Define to 1 if you have the `fileno' function. */
+#define HAVE_FILENO 1
+#if _MSC_VER < 1400
+# define fileno _fileno
+#endif
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+#if _MSC_VER < 1900
+# define snprintf _snprinf
+#endif
+
+/* Define to 1 if you have the `_chsize' function. */
+#define HAVE__CHSIZE 1
+
+/* Define to 1 if you have the `_chsize_s' function. */
+#if _MSC_VER >= 1400
+# define HAVE__CHSIZE_S 1
+#endif
+
+/* Define to 1 if you have the `_filelengthi64' function. */
+#define HAVE__FILELENGTHI64 1
+
+/* Define to 1 if you have the `_fseeki64' function. */
+#define HAVE__FSEEKI64 1
+
+/* Define to 1 if you have the `_fullpath' function. */
+#define HAVE__FULLPATH 1
+
+/* Define to 1 if the system has the type `struct _stati64'. */
+#define HAVE_STRUCT__STATI64
+
+/* Define to 1 if you have the `_stati64' function. */
+#define HAVE__STATI64 1
+
+/* Define to 1 if you have the `_fstati64' function. */
+#define HAVE__FSTATI64 1
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#if _MSC_VER >= 1800
+# define HAVE_STDBOOL_H 1
+#endif
+
+/* Define to 1 if you have the `stricmp' function. */
+#define HAVE_STRICMP 1
+/* Define to 1 if you have the declaration of `stricmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRICMP 1
+#if _MSC_VER < 1400
+# define stricmp _stricmp
+#endif
+
+/* Define to 1 if you have the `strnicmp' function. */
+#define HAVE_STRNICMP 1
+/* Define to 1 if you have the declaration of `strnicmp', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRNICMP 1
+#if _MSC_VER < 1400
+# define strnicmp _strnicmp
+#endif
+
+#if _MSC_VER >= 1400
+/* Define to 1 if you have the `strnlen' function. */
+# define HAVE_STRNLEN 1
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+# define HAVE_DECL_STRNLEN 1
+#endif
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#if _MSC_VER >= 1900
+# define HAVE_UINTPTR_T 1
+#else
+/* Define to the type of an unsigned integer type wide enough to hold a
+ pointer, if such a type exists, and if the system does not define it. */
+# define uintptr_t size_t
+#endif
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+#if _MSC_VER < 1400
+# define vsnprint _vsnprintf
+#endif
+
+/* Define to 1 if the system has the type `_Bool'. */
+#if _MSC_VER >= 1900
+# define HAVE__BOOL 1
+#endif
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if your processor stores words with the least significant byte
+ first (like Intel and VAX, unlike Motorola and SPARC). */
+#define WORDS_LITTLEENDIAN 1
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#define inline __inline
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported directly. */
+#define restrict __restrict
+
+#endif /* NASM_CONFIG_MSVC_H */
diff --git a/config/unknown.h b/config/unknown.h
new file mode 100644
index 00000000..d3cbe494
--- /dev/null
+++ b/config/unknown.h
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * config/unknown.h
+ *
+ * Compiler definitions for an unknown compiler. Assume the worst.
+ */
+
+#ifndef NASM_CONFIG_UNKNOWN_H
+#define NASM_CONFIG_UNKNOWN_H
+
+/* Assume these don't exist */
+#ifndef inline
+# define inline
+#endif
+#ifndef restrict
+# define restrict
+#endif
+
+#endif /* NASM_CONFIG_UNKNOWN_H */
diff --git a/config/watcom.h b/config/watcom.h
new file mode 100644
index 00000000..029a36f8
--- /dev/null
+++ b/config/watcom.h
@@ -0,0 +1,74 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * config/watcom.h
+ *
+ * Compiler definitions for OpenWatcom instead of config.h.in.
+ * See config.h.in for the variables which can be defined here.
+ *
+ * This was taken from openwcom.mak and needs to be actually validated.
+ */
+
+#ifndef NASM_CONFIG_WATCOM_H
+#define NASM_CONFIG_WATCOM_H
+
+#define HAVE_DECL_STRCASECMP 1
+#define HAVE_DECL_STRICMP 1
+#define HAVE_DECL_STRLCPY 1
+#define HAVE_DECL_STRNCASECMP 1
+#define HAVE_DECL_STRNICMP 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_LIMITS_H 1
+#define HAVE_MEMORY_H 1
+#define HAVE_SNPRINTF 1
+#define HAVE_STDBOOL_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRCASECMP 1
+#define HAVE_STRCSPN 1
+#define HAVE_STRICMP 1
+#define HAVE_STRINGS_H 1
+#define HAVE_STRING_H 1
+#define HAVE_STRLCPY 1
+#define HAVE_STRNCASECMP 1
+#define HAVE_STRNICMP 1
+#define HAVE_STRSPN 1
+#define HAVE_SYS_STAT_H 1
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_UNISTD_H 1
+#define HAVE_VSNPRINTF 1
+#define STDC_HEADERS 1
+#define inline __inline
+
+#endif /* NASM_CONFIG_WATCOM_H */
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 00000000..d111e249
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,312 @@
+dnl Process this file with autoconf 2.69 or later to produce
+dnl a configure script.
+AC_PREREQ(2.69)
+AC_INIT(config/config.h.in)
+AC_CONFIG_HEADERS(config/config.h)
+
+AC_PREFIX_PROGRAM(nasm)
+
+dnl Save initial CFLAGS, to see if -g -O2 came from configure or not
+pa_init_cflags="$CFLAGS"
+
+dnl This prevents us from running Wine and thinking we are not
+dnl cross-compiling when in fact we are; running Wine here is at
+dnl the best very slow and doesn't buy us a single thing at all.
+WINELOADER=/dev/null
+export WINELOADER
+
+dnl Checks for programs and enable necessary CC extensions
+AC_USE_SYSTEM_EXTENSIONS
+AC_SYS_LARGEFILE
+AC_PROG_CC
+AC_PROG_CC_STDC
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+pa_no_optimize=false
+
+dnl If the user did not specify a CFLAGS default, change default
+dnl to -O0 for debugging
+PA_ARG_DISABLED([optimization],
+ [compile without optimization (-O0) to help debugging],
+ [pa_no_optimize=true])
+
+dnl Compile and link with dwarf debug
+PA_ARG_ENABLED([gdb],
+ [disable optimization and compile with extra debug information for GDB debugger],
+ [PA_ADD_CFLAGS([-ggdb3])
+ pa_no_optimize=true])
+
+AS_IF([$pa_no_optimize],
+ [PA_ADD_CFLAGS([-O0])
+ PA_ADD_CFLAGS([-fno-omit-frame-pointer])])
+
+dnl Abort on panic
+PA_ARG_ENABLED([panic-abort],
+ [call abort() on panic to trap in the debugger],
+ [AC_DEFINE(ABORT_ON_PANIC)])
+AH_TEMPLATE(ABORT_ON_PANIC,
+[Define to 1 to call abort() on panics (internal errors), for debugging.])
+
+dnl Check for library extension
+PA_LIBEXT
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+AC_C_RESTRICT
+AC_TYPE_SIZE_T
+AC_C_BIGENDIAN(AC_DEFINE(WORDS_BIGENDIAN),AC_DEFINE(WORDS_LITTLEENDIAN),,)
+AH_TEMPLATE(WORDS_BIGENDIAN,
+[Define to 1 if your processor stores words with the most significant
+byte first (like Motorola and SPARC, unlike Intel and VAX).])
+AH_TEMPLATE(WORDS_LITTLEENDIAN,
+[Define to 1 if your processor stores words with the least significant
+byte first (like Intel and VAX, unlike Motorola and SPARC).])
+
+dnl Force gcc and gcc-compatible compilers treat signed integers
+dnl as 2's complement
+PA_ADD_CFLAGS([-fwrapv])
+
+dnl Some environments abuse __STRICT_ANSI__ to disable some
+dnl function declarations
+PA_ADD_CFLAGS([-U__STRICT_ANSI__])
+
+dnl Don't put things in common if we can avoid it. We don't want to
+dnl assume all compilers support common, and this will help find those
+dnl problems. This also works around an OSX linker problem.
+PA_ADD_CFLAGS([-fno-common])
+
+dnl Look for programs...
+AC_CHECK_PROGS(NROFF, nroff, false)
+AC_CHECK_PROGS(ASCIIDOC, asciidoc, false)
+AC_CHECK_PROGS(XMLTO, xmlto, false)
+
+dnl Check for progs needed for manpage generation
+AS_IF([test $ASCIIDOC = false],
+ [AC_MSG_WARN([No asciidoc package found])]
+)
+AS_IF([test $XMLTO = false],
+ [AC_MSG_WARN([No xmlto package found])]
+)
+
+dnl Check for host compiler tools
+AC_CHECK_TOOL(AR, ar)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(inttypes.h)
+AC_CHECK_HEADERS(strings.h)
+AC_HEADER_STDBOOL
+AC_CHECK_HEADERS(stdnoreturn.h)
+AC_CHECK_HEADERS(io.h)
+AC_CHECK_HEADERS(fcntl.h)
+AC_CHECK_HEADERS(unistd.h)
+AC_CHECK_HEADERS(sys/mman.h)
+AC_CHECK_HEADERS(sys/types.h)
+AC_CHECK_HEADERS(sys/stat.h)
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(strcasecmp stricmp)
+AC_CHECK_FUNCS(strncasecmp strnicmp)
+AC_CHECK_FUNCS(strsep)
+AC_CHECK_FUNCS(strnlen)
+AC_CHECK_FUNCS(strrchrnul)
+
+AC_CHECK_FUNCS(getuid)
+AC_CHECK_FUNCS(getgid)
+
+AC_CHECK_FUNCS(realpath)
+AC_CHECK_FUNCS(canonicalize_file_name)
+AC_CHECK_FUNCS(_fullpath)
+AC_CHECK_FUNCS(pathconf)
+
+AC_FUNC_FSEEKO
+AC_CHECK_FUNCS([_fseeki64])
+AC_CHECK_FUNCS([ftruncate _chsize _chsize_s])
+AC_CHECK_FUNCS([fileno _fileno])
+
+AC_CHECK_FUNCS(_filelengthi64)
+AC_FUNC_MMAP
+AC_CHECK_FUNCS(getpagesize)
+AC_CHECK_FUNCS(sysconf)
+
+AC_CHECK_FUNCS([access _access faccessat])
+
+PA_HAVE_FUNC(__builtin_expect, (1,1))
+
+dnl ilog2() building blocks
+PA_ADD_HEADERS(intrin.h)
+PA_HAVE_FUNC(__builtin_clz, (0U))
+PA_HAVE_FUNC(__builtin_clzl, (0UL))
+PA_HAVE_FUNC(__builtin_clzll, (0ULL))
+PA_HAVE_FUNC(_BitScanReverse, (0))
+PA_HAVE_FUNC(_BitScanReverse64, (0))
+
+dnl Functions for which we have replacements available in stdlib/
+AC_CHECK_FUNCS([vsnprintf _vsnprintf])
+AC_CHECK_FUNCS([snprintf _snprintf])
+AC_CHECK_FUNCS([strlcpy])
+AC_CHECK_FUNCS([strrchrnul])
+
+dnl These types are POSIX-specific, and Windows does it differently...
+AC_CHECK_TYPES([struct _stati64])
+AC_CHECK_TYPES([struct stat])
+AC_CHECK_FUNCS([stat _stati64])
+AC_CHECK_FUNCS([fstat _fstati64])
+
+dnl Check for functions that might not be declared in the headers for
+dnl various idiotic reasons (mostly because of library authors
+dnl abusing the meaning of __STRICT_ANSI__)
+AC_CHECK_DECLS(strcasecmp)
+AC_CHECK_DECLS(stricmp)
+AC_CHECK_DECLS(strncasecmp)
+AC_CHECK_DECLS(strnicmp)
+AC_CHECK_DECLS(strsep)
+AC_CHECK_DECLS(strlcpy)
+AC_CHECK_DECLS(strnlen)
+AC_CHECK_DECLS(strrchrnul)
+
+dnl Check for missing types
+AC_TYPE_UINTPTR_T
+
+dnl Documentation: should we generate an uncompressed PDF? It is
+dnl about twice as big, but it can be externally compressed (e.g. with xz)
+dnl and becomes significantly smaller than the original.
+PA_ARG_DISABLED([pdf-compression],
+ [generate an uncompressed documentation PDF],
+ [PDFOPT='-nocompress'])
+AC_SUBST([PDFOPT])
+
+dnl
+dnl Look for byte-swapping support...
+dnl
+PA_ADD_HEADERS(endian.h sys/endian.h machine/endian.h)
+PA_HAVE_FUNC(cpu_to_le16, (0))
+PA_HAVE_FUNC(cpu_to_le32, (0))
+PA_HAVE_FUNC(cpu_to_le64, (0))
+PA_HAVE_FUNC(__cpu_to_le16, (0))
+PA_HAVE_FUNC(__cpu_to_le32, (0))
+PA_HAVE_FUNC(__cpu_to_le64, (0))
+PA_HAVE_FUNC(htole16, (0))
+PA_HAVE_FUNC(htole32, (0))
+PA_HAVE_FUNC(htole64, (0))
+PA_HAVE_FUNC(__bswap_16, (0))
+PA_HAVE_FUNC(__bswap_32, (0))
+PA_HAVE_FUNC(__bswap_64, (0))
+PA_HAVE_FUNC(__builtin_bswap16, (0))
+PA_HAVE_FUNC(__builtin_bswap32, (0))
+PA_HAVE_FUNC(__builtin_bswap64, (0))
+PA_HAVE_FUNC(_byteswap_ushort, (0))
+PA_HAVE_FUNC(_byteswap_ulong, (0))
+PA_HAVE_FUNC(_byteswap_uint64, (0))
+
+dnl
+dnl Check for __builtin_constant_p()
+dnl
+PA_HAVE_FUNC(__builtin_constant_p, (0))
+
+dnl
+dnl Check for supported gcc attributes; some compilers (e.g. Sun CC)
+dnl support these, but don't define __GNUC__ as they don't support
+dnl some other features of gcc.
+dnl
+PA_ADD_CFLAGS([-Werror=attributes])
+PA_FUNC_ATTRIBUTE(noreturn)
+PA_FUNC_ATTRIBUTE(returns_nonnull)
+PA_FUNC_ATTRIBUTE(malloc)
+PA_FUNC_ATTRIBUTE(alloc_size, (1))
+PA_FUNC_ATTRIBUTE(sentinel,,, [const char *, ...], ["a","b",NULL])
+PA_FUNC_ATTRIBUTE(format, [(printf,1,2)], int, [const char *, ...], ["%d",1])
+PA_FUNC_ATTRIBUTE(const)
+PA_FUNC_ATTRIBUTE(pure)
+PA_FUNC_ATTRIBUTE(cold)
+PA_FUNC_ATTRIBUTE_ERROR
+
+dnl
+dnl support function sections (if available)
+dnl
+PA_ARG_ENABLED([sections],
+ [compile with function/data section support],
+ [PA_ADD_CLDFLAGS([-ffunction-sections])
+ PA_ADD_CLDFLAGS([-fdata-sections])
+ PA_ADD_CLDFLAGS([-Wl,--gc-sections])],
+ [])
+
+dnl
+dnl support LTO
+dnl
+PA_ARG_ENABLED([lto],
+ [compile with gcc-style link time optimization],
+ [PA_ADD_CLDFLAGS([-flto])
+ dnl Note: we use _PROG rather than _TOOL since we are prepending the full
+ dnl CC name which ought to already contain the host triplet if needed
+ ccbase=`echo "$CC" | awk '{ print $1; }'`
+ AC_CHECK_PROGS(CC_AR, [${ccbase}-ar], [$ac_cv_prog_AR])
+ AR="$CC_AR"
+ AC_CHECK_PROGS(CC_RANLIB, [${ccbase}-ranlib], [$ac_cv_prog_RANLIB])
+ RANLIB="$CC_RANLIB"], [])
+
+dnl
+dnl support sanitizers (if available)
+dnl
+PA_ARG_ENABLED([sanitizer],
+ [compile with sanitizers enabled],
+ [PA_ADD_CFLAGS([-fno-omit-frame-pointer])
+ PA_ADD_CLDFLAGS([-fsanitize=address])
+ PA_ADD_CLDFLAGS([-fsanitize=undefined])])
+
+dnl
+dnl Don't make symbols visible, there is no point and it just
+dnl makes the code slower.
+dnl
+PA_ADD_CLDFLAGS([-fvisibility=hidden])
+
+dnl If we have gcc, add appropriate code cleanliness options
+PA_ADD_CFLAGS([-W])
+PA_ADD_CFLAGS([-Wall])
+PA_ADD_CFLAGS([-pedantic])
+dnl LLVM doesn't error out on invalid -W options unless this option is
+dnl specified first. Enable this so this script can actually discover
+dnl which -W options are possible for this compiler.
+PA_ADD_CFLAGS([-Werror=unknown-warning-option])
+dnl Suppress format warning on Windows targets due to their <inttypes.h>
+PA_ADD_CFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format])
+PA_ADD_CFLAGS([-Wc90-c99-compat])
+PA_ADD_CFLAGS([-Wlong-long],[-Wno-long-long])
+dnl This is needed because we intentionally expect strncpy() to fill
+dnl in a zero-padded (not zero-terminated) buffer in several backends
+PA_ADD_CFLAGS([-Wstringop-truncation],[-Wno-stringop-truncation])
+dnl PA_ADD_CFLAGS([-Wwrite-strings])
+PA_ARG_ENABLED([werror],
+ [compile with -Werror to error out on any warning],
+ [PA_ADD_CFLAGS([-Werror])],
+ [PA_ADD_CFLAGS([-Werror=implicit])
+ PA_ADD_CFLAGS([-Werror=missing-braces])
+ PA_ADD_CFLAGS([-Werror=return-type])
+ PA_ADD_CFLAGS([-Werror=trigraphs])
+ PA_ADD_CFLAGS([-Werror=pointer-arith])
+ PA_ADD_CFLAGS([-Werror=strict-prototypes])
+ PA_ADD_CFLAGS([-Werror=missing-prototypes])
+ PA_ADD_CFLAGS([-Werror=missing-declarations])
+ PA_ADD_CFLAGS([-Werror=comment])
+ PA_ADD_CFLAGS([-Werror=vla])]
+)
+
+dnl
+dnl On some versions of gcc, -Werror=missing-prototypes causes problems
+dnl with C99-style external inlines. Test this *after* adding the -Werror
+dnl options.
+dnl
+PA_CHECK_BAD_STDC_INLINE
+
+dnl
+dnl support ccache
+dnl
+PA_ARG_ENABLED([ccache], [compile with ccache], [CC="ccache $CC"], [])
+
+AC_OUTPUT_COMMANDS([mkdir -p config nasmlib nsis output stdlib x86 asm disasm rdoff macros common])
+AC_OUTPUT(Makefile doc/Makefile)
diff --git a/contrib/MSVC6.txt b/contrib/MSVC6.txt
new file mode 100644
index 00000000..ce237565
--- /dev/null
+++ b/contrib/MSVC6.txt
@@ -0,0 +1,25 @@
+Compilation with Nasm on MSVC 6.0, with usage of Custom Build step.
+
+1) Open your project in MSVC.
+
+2) Add .asm at the list of source files.
+
+3) Click on it with the right button, further press Settings...
+
+4) In General tab, flags "Always use custom build step" and "Exclude file
+ from build" should be disabled.
+
+5) In "Custom Build" tab it is necessary to define "Commands" and "Outputs"
+ (By "Outputs" build system checks if it has reached a necessary result.
+ This parameter is mandatory and without it MSVC will not let you close
+ the window by OK button).
+
+ The "Commands" should be set to
+
+ nasmw.exe -fwin -o $(OUTDIR)\$(InputName).obj $(InputName).asm
+
+ And "Outputs" to
+
+ $(OUTDIR)\$(InputName).obj
+
+Have fun!
diff --git a/contrib/VSrules/nasm.README b/contrib/VSrules/nasm.README
new file mode 100644
index 00000000..8fbf155c
--- /dev/null
+++ b/contrib/VSrules/nasm.README
@@ -0,0 +1,16 @@
+ Visual Studio 2008 NASM integration
+
+
+In order to use nasm seamlessly in your VS2k8, follow the steps below.
+
+1. First install nasm by running its installer
+2. copy nasm.rules to c:\Program Files\Microsoft Visual Studio 2008\VC\VCProjectDefaults
+3. Start Visual Studio 2008
+4. go to Tools->Options->VC++ Directories
+5. click on Show Directories for Executables
+6. add C:\Program Files\NASM to the list of paths
+7. Open a solution that you want to use NASM with
+8. Right click on the project name and select Custom Build Rules
+9. Check the box next to the NASM line
+10. Add any .asm files to the project
+11. click on build to test
diff --git a/contrib/VSrules/nasm.rules b/contrib/VSrules/nasm.rules
new file mode 100644
index 00000000..79b4fb16
--- /dev/null
+++ b/contrib/VSrules/nasm.rules
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VisualStudioToolFile
+ Name="Netwide Macro Assembler"
+ Version="8.00"
+ >
+ <Rules>
+ <CustomBuildRule
+ Name="NASM"
+ DisplayName="Netwide Macro Assembler"
+ CommandLine="nasm.exe -f win32 -Xvc [AllOptions] [AdditionalOptions] [Inputs]"
+ Outputs="[$ObjectFileName]"
+ FileExtensions="*.asm"
+ ExecutionDescription="Assembling..."
+ >
+ <Properties>
+ <StringProperty
+ Name="ObjectFileName"
+ DisplayName="Object File Name"
+ PropertyPageName="Object File"
+ Description="Specifies the name of the output object file. (-o [file])"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-o &quot;[value]&quot;"
+ DefaultValue="$(IntDir)\$(InputName).obj"
+ />
+ <StringProperty
+ Name="PreprocessorDefinitions"
+ DisplayName="Preprocessor Definitions"
+ Description="Defines a text macro with the given name. (-D[symbol])"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-D[value]"
+ Delimited="false"
+ Inheritable="true"
+ />
+ <StringProperty
+ Name="UndefinePreprocessorDefinitions"
+ DisplayName="Undefine Preprocessor Definitions"
+ Description="Undefines a text macro with the given name. (-U[symbol])"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-U[value]"
+ Delimited="false"
+ Inheritable="true"
+ />
+ <StringProperty
+ Name="AssembledCodeListingFile"
+ DisplayName="Assembled Code Listing File"
+ PropertyPageName="Listing File"
+ Description="Generates an assembled code listing file. (-l [file])"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-l &quot;[value]&quot;"
+ />
+ <StringProperty
+ Name="IncludePaths"
+ DisplayName="Include Paths"
+ Description="Sets path for include file. (-I[path])"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-I[value]"
+ Delimited="false"
+ Inheritable="true"
+ />
+ <BooleanProperty
+ Name="TreatWarningsAsErrors"
+ DisplayName="Treat Warnings As Errors"
+ Description="Returns an error code if warnings are generated. (-Werror)"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-Werror"
+ />
+ <BooleanProperty
+ Name="GenerateDebugInformation"
+ DisplayName="Generate Debug Information"
+ Description="Generates Debug Information. (-g)"
+ HelpURL="http://www.nasm.us/doc/"
+ Switch="-g"
+ DefaultValue="true"
+ />
+
+ </Properties>
+ </CustomBuildRule>
+ </Rules>
+</VisualStudioToolFile>
diff --git a/disasm/disasm.c b/disasm/disasm.c
new file mode 100644
index 00000000..fd3eb42a
--- /dev/null
+++ b/disasm/disasm.c
@@ -0,0 +1,1765 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2012 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * disasm.c where all the _work_ gets done in the Netwide Disassembler
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "disasm.h"
+#include "sync.h"
+#include "insns.h"
+#include "tables.h"
+#include "regdis.h"
+#include "disp8.h"
+
+#define fetch_safe(_start, _ptr, _size, _need, _op) \
+ do { \
+ if (((_ptr) - (_start)) >= ((_size) - (_need))) \
+ _op; \
+ } while (0)
+
+#define fetch_or_return(_start, _ptr, _size, _need) \
+ fetch_safe(_start, _ptr, _size, _need, return 0)
+
+/*
+ * Flags that go into the `segment' field of `insn' structures
+ * during disassembly.
+ */
+#define SEG_RELATIVE 1
+#define SEG_32BIT 2
+#define SEG_RMREG 4
+#define SEG_DISP8 8
+#define SEG_DISP16 16
+#define SEG_DISP32 32
+#define SEG_NODISP 64
+#define SEG_SIGNED 128
+#define SEG_64BIT 256
+
+/*
+ * Prefix information
+ */
+struct prefix_info {
+ uint8_t osize; /* Operand size */
+ uint8_t asize; /* Address size */
+ uint8_t osp; /* Operand size prefix present */
+ uint8_t asp; /* Address size prefix present */
+ uint8_t rep; /* Rep prefix present */
+ uint8_t seg; /* Segment override prefix present */
+ uint8_t wait; /* WAIT "prefix" present */
+ uint8_t lock; /* Lock prefix present */
+ uint8_t vex[3]; /* VEX prefix present */
+ uint8_t vex_c; /* VEX "class" (VEX, XOP, ...) */
+ uint8_t vex_m; /* VEX.M field */
+ uint8_t vex_v;
+ uint8_t vex_lp; /* VEX.LP fields */
+ uint32_t rex; /* REX prefix present */
+ uint8_t evex[3]; /* EVEX prefix present */
+};
+
+#define getu8(x) (*(uint8_t *)(x))
+#if X86_MEMORY
+/* Littleendian CPU which can handle unaligned references */
+#define getu16(x) (*(uint16_t *)(x))
+#define getu32(x) (*(uint32_t *)(x))
+#define getu64(x) (*(uint64_t *)(x))
+#else
+static uint16_t getu16(uint8_t *data)
+{
+ return (uint16_t)data[0] + ((uint16_t)data[1] << 8);
+}
+static uint32_t getu32(uint8_t *data)
+{
+ return (uint32_t)getu16(data) + ((uint32_t)getu16(data+2) << 16);
+}
+static uint64_t getu64(uint8_t *data)
+{
+ return (uint64_t)getu32(data) + ((uint64_t)getu32(data+4) << 32);
+}
+#endif
+
+#define gets8(x) ((int8_t)getu8(x))
+#define gets16(x) ((int16_t)getu16(x))
+#define gets32(x) ((int32_t)getu32(x))
+#define gets64(x) ((int64_t)getu64(x))
+
+/* Important: regval must already have been adjusted for rex extensions */
+static enum reg_enum whichreg(opflags_t regflags, int regval, int rex)
+{
+ size_t i;
+
+ static const struct {
+ opflags_t flags;
+ enum reg_enum reg;
+ } specific_registers[] = {
+ {REG_AL, R_AL},
+ {REG_AX, R_AX},
+ {REG_EAX, R_EAX},
+ {REG_RAX, R_RAX},
+ {REG_DL, R_DL},
+ {REG_DX, R_DX},
+ {REG_EDX, R_EDX},
+ {REG_RDX, R_RDX},
+ {REG_CL, R_CL},
+ {REG_CX, R_CX},
+ {REG_ECX, R_ECX},
+ {REG_RCX, R_RCX},
+ {FPU0, R_ST0},
+ {XMM0, R_XMM0},
+ {YMM0, R_YMM0},
+ {ZMM0, R_ZMM0},
+ {REG_ES, R_ES},
+ {REG_CS, R_CS},
+ {REG_SS, R_SS},
+ {REG_DS, R_DS},
+ {REG_FS, R_FS},
+ {REG_GS, R_GS},
+ {OPMASK0, R_K0},
+ };
+
+ if (!(regflags & (REGISTER|REGMEM)))
+ return 0; /* Registers not permissible?! */
+
+ regflags |= REGISTER;
+
+ for (i = 0; i < ARRAY_SIZE(specific_registers); i++)
+ if (!(specific_registers[i].flags & ~regflags))
+ return specific_registers[i].reg;
+
+ /* All the entries below look up regval in an 16-entry array */
+ if (regval < 0 || regval > (rex & REX_EV ? 31 : 15))
+ return 0;
+
+#define GET_REGISTER(__array, __index) \
+ ((size_t)(__index) < (size_t)ARRAY_SIZE(__array) ? __array[(__index)] : 0)
+
+ if (!(REG8 & ~regflags)) {
+ if (rex & (REX_P|REX_NH))
+ return GET_REGISTER(nasm_rd_reg8_rex, regval);
+ else
+ return GET_REGISTER(nasm_rd_reg8, regval);
+ }
+ if (!(REG16 & ~regflags))
+ return GET_REGISTER(nasm_rd_reg16, regval);
+ if (!(REG32 & ~regflags))
+ return GET_REGISTER(nasm_rd_reg32, regval);
+ if (!(REG64 & ~regflags))
+ return GET_REGISTER(nasm_rd_reg64, regval);
+ if (!(REG_SREG & ~regflags))
+ return GET_REGISTER(nasm_rd_sreg, regval & 7); /* Ignore REX */
+ if (!(REG_CREG & ~regflags))
+ return GET_REGISTER(nasm_rd_creg, regval);
+ if (!(REG_DREG & ~regflags))
+ return GET_REGISTER(nasm_rd_dreg, regval);
+ if (!(REG_TREG & ~regflags)) {
+ if (regval > 7)
+ return 0; /* TR registers are ill-defined with rex */
+ return GET_REGISTER(nasm_rd_treg, regval);
+ }
+ if (!(FPUREG & ~regflags))
+ return GET_REGISTER(nasm_rd_fpureg, regval & 7); /* Ignore REX */
+ if (!(MMXREG & ~regflags))
+ return GET_REGISTER(nasm_rd_mmxreg, regval & 7); /* Ignore REX */
+ if (!(XMMREG & ~regflags))
+ return GET_REGISTER(nasm_rd_xmmreg, regval);
+ if (!(YMMREG & ~regflags))
+ return GET_REGISTER(nasm_rd_ymmreg, regval);
+ if (!(ZMMREG & ~regflags))
+ return GET_REGISTER(nasm_rd_zmmreg, regval);
+ if (!(OPMASKREG & ~regflags))
+ return GET_REGISTER(nasm_rd_opmaskreg, regval);
+ if (!(BNDREG & ~regflags))
+ return GET_REGISTER(nasm_rd_bndreg, regval);
+
+#undef GET_REGISTER
+ return 0;
+}
+
+static uint32_t append_evex_reg_deco(char *buf, uint32_t num,
+ decoflags_t deco, uint8_t *evex)
+{
+ const char * const er_names[] = {"rn-sae", "rd-sae", "ru-sae", "rz-sae"};
+ uint32_t num_chars = 0;
+
+ if ((deco & MASK) && (evex[2] & EVEX_P2AAA)) {
+ enum reg_enum opmasknum = nasm_rd_opmaskreg[evex[2] & EVEX_P2AAA];
+ const char * regname = nasm_reg_names[opmasknum - EXPR_REG_START];
+
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ "{%s}", regname);
+
+ if ((deco & Z) && (evex[2] & EVEX_P2Z)) {
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ "{z}");
+ }
+ }
+
+ if (evex[2] & EVEX_P2B) {
+ if (deco & ER) {
+ uint8_t er_type = (evex[2] & EVEX_P2LL) >> 5;
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ ",{%s}", er_names[er_type]);
+ } else if (deco & SAE) {
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ ",{sae}");
+ }
+ }
+
+ return num_chars;
+}
+
+static uint32_t append_evex_mem_deco(char *buf, uint32_t num, opflags_t type,
+ decoflags_t deco, uint8_t *evex)
+{
+ uint32_t num_chars = 0;
+
+ if ((evex[2] & EVEX_P2B) && (deco & BRDCAST_MASK)) {
+ decoflags_t deco_brsize = deco & BRSIZE_MASK;
+ opflags_t template_opsize = (deco_brsize == BR_BITS32 ? BITS32 : BITS64);
+ uint8_t br_num = (type & SIZE_MASK) / BITS128 *
+ BITS64 / template_opsize * 2;
+
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ "{1to%d}", br_num);
+ }
+
+ if ((deco & MASK) && (evex[2] & EVEX_P2AAA)) {
+ enum reg_enum opmasknum = nasm_rd_opmaskreg[evex[2] & EVEX_P2AAA];
+ const char * regname = nasm_reg_names[opmasknum - EXPR_REG_START];
+
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ "{%s}", regname);
+
+ if ((deco & Z) && (evex[2] & EVEX_P2Z)) {
+ num_chars += snprintf(buf + num_chars, num - num_chars,
+ "{z}");
+ }
+ }
+
+
+ return num_chars;
+}
+
+/*
+ * Process an effective address (ModRM) specification.
+ */
+static uint8_t *do_ea(uint8_t *data, int modrm, int asize,
+ int segsize, enum ea_type type,
+ operand *op, insn *ins)
+{
+ int mod, rm, scale, index, base;
+ int rex;
+ uint8_t *evex;
+ uint8_t sib = 0;
+ bool is_evex = !!(ins->rex & REX_EV);
+
+ mod = (modrm >> 6) & 03;
+ rm = modrm & 07;
+
+ if (mod != 3 && asize != 16 && rm == 4)
+ sib = *data++;
+
+ rex = ins->rex;
+ evex = ins->evex_p;
+
+ if (mod == 3) { /* pure register version */
+ op->basereg = rm+(rex & REX_B ? 8 : 0);
+ op->segment |= SEG_RMREG;
+ if (is_evex && segsize == 64) {
+ op->basereg += (evex[0] & EVEX_P0X ? 0 : 16);
+ }
+ return data;
+ }
+
+ op->disp_size = 0;
+ op->eaflags = 0;
+
+ if (asize == 16) {
+ /*
+ * <mod> specifies the displacement size (none, byte or
+ * word), and <rm> specifies the register combination.
+ * Exception: mod=0,rm=6 does not specify [BP] as one might
+ * expect, but instead specifies [disp16].
+ */
+
+ if (type != EA_SCALAR)
+ return NULL;
+
+ op->indexreg = op->basereg = -1;
+ op->scale = 1; /* always, in 16 bits */
+ switch (rm) {
+ case 0:
+ op->basereg = R_BX;
+ op->indexreg = R_SI;
+ break;
+ case 1:
+ op->basereg = R_BX;
+ op->indexreg = R_DI;
+ break;
+ case 2:
+ op->basereg = R_BP;
+ op->indexreg = R_SI;
+ break;
+ case 3:
+ op->basereg = R_BP;
+ op->indexreg = R_DI;
+ break;
+ case 4:
+ op->basereg = R_SI;
+ break;
+ case 5:
+ op->basereg = R_DI;
+ break;
+ case 6:
+ op->basereg = R_BP;
+ break;
+ case 7:
+ op->basereg = R_BX;
+ break;
+ }
+ if (rm == 6 && mod == 0) { /* special case */
+ op->basereg = -1;
+ if (segsize != 16)
+ op->disp_size = 16;
+ mod = 2; /* fake disp16 */
+ }
+ switch (mod) {
+ case 0:
+ op->segment |= SEG_NODISP;
+ break;
+ case 1:
+ op->segment |= SEG_DISP8;
+ if (ins->evex_tuple != 0) {
+ op->offset = gets8(data) * get_disp8N(ins);
+ } else {
+ op->offset = gets8(data);
+ }
+ data++;
+ break;
+ case 2:
+ op->segment |= SEG_DISP16;
+ op->offset = *data++;
+ op->offset |= ((unsigned)*data++) << 8;
+ break;
+ }
+ return data;
+ } else {
+ /*
+ * Once again, <mod> specifies displacement size (this time
+ * none, byte or *dword*), while <rm> specifies the base
+ * register. Again, [EBP] is missing, replaced by a pure
+ * disp32 (this time that's mod=0,rm=*5*) in 32-bit mode,
+ * and RIP-relative addressing in 64-bit mode.
+ *
+ * However, rm=4
+ * indicates not a single base register, but instead the
+ * presence of a SIB byte...
+ */
+ int a64 = asize == 64;
+
+ op->indexreg = -1;
+
+ if (a64)
+ op->basereg = nasm_rd_reg64[rm | ((rex & REX_B) ? 8 : 0)];
+ else
+ op->basereg = nasm_rd_reg32[rm | ((rex & REX_B) ? 8 : 0)];
+
+ if (rm == 5 && mod == 0) {
+ if (segsize == 64) {
+ op->eaflags |= EAF_REL;
+ op->segment |= SEG_RELATIVE;
+ }
+
+ if (asize != 64)
+ op->disp_size = asize;
+
+ op->basereg = -1;
+ mod = 2; /* fake disp32 */
+ }
+
+
+ if (rm == 4) { /* process SIB */
+ uint8_t vsib_hi = 0;
+ scale = (sib >> 6) & 03;
+ index = (sib >> 3) & 07;
+ base = sib & 07;
+
+ op->scale = 1 << scale;
+
+ if (segsize == 64) {
+ vsib_hi = (rex & REX_X ? 8 : 0) |
+ (evex[2] & EVEX_P2VP ? 0 : 16);
+ }
+
+ if (type == EA_XMMVSIB)
+ op->indexreg = nasm_rd_xmmreg[index | vsib_hi];
+ else if (type == EA_YMMVSIB)
+ op->indexreg = nasm_rd_ymmreg[index | vsib_hi];
+ else if (type == EA_ZMMVSIB)
+ op->indexreg = nasm_rd_zmmreg[index | vsib_hi];
+ else if (index == 4 && !(rex & REX_X))
+ op->indexreg = -1; /* ESP/RSP cannot be an index */
+ else if (a64)
+ op->indexreg = nasm_rd_reg64[index | ((rex & REX_X) ? 8 : 0)];
+ else
+ op->indexreg = nasm_rd_reg32[index | ((rex & REX_X) ? 8 : 0)];
+
+ if (base == 5 && mod == 0) {
+ op->basereg = -1;
+ mod = 2; /* Fake disp32 */
+ } else if (a64)
+ op->basereg = nasm_rd_reg64[base | ((rex & REX_B) ? 8 : 0)];
+ else
+ op->basereg = nasm_rd_reg32[base | ((rex & REX_B) ? 8 : 0)];
+
+ if (segsize == 16)
+ op->disp_size = 32;
+ } else if (type != EA_SCALAR) {
+ /* Can't have VSIB without SIB */
+ return NULL;
+ }
+
+ switch (mod) {
+ case 0:
+ op->segment |= SEG_NODISP;
+ break;
+ case 1:
+ op->segment |= SEG_DISP8;
+ if (ins->evex_tuple != 0) {
+ op->offset = gets8(data) * get_disp8N(ins);
+ } else {
+ op->offset = gets8(data);
+ }
+ data++;
+ break;
+ case 2:
+ op->segment |= SEG_DISP32;
+ op->offset = gets32(data);
+ data += 4;
+ break;
+ }
+ return data;
+ }
+}
+
+/*
+ * Determine whether the instruction template in t corresponds to the data
+ * stream in data. Return the number of bytes matched if so.
+ */
+#define case4(x) case (x): case (x)+1: case (x)+2: case (x)+3
+
+static int matches(const struct itemplate *t, uint8_t *data,
+ const struct prefix_info *prefix, int segsize, insn *ins)
+{
+ uint8_t *r = (uint8_t *)(t->code);
+ uint8_t *origdata = data;
+ bool a_used = false, o_used = false;
+ enum prefixes drep = 0;
+ enum prefixes dwait = 0;
+ uint8_t lock = prefix->lock;
+ int osize = prefix->osize;
+ int asize = prefix->asize;
+ int i, c;
+ int op1, op2;
+ struct operand *opx, *opy;
+ uint8_t opex = 0;
+ bool vex_ok = false;
+ int regmask = (segsize == 64) ? 15 : 7;
+ enum ea_type eat = EA_SCALAR;
+
+ for (i = 0; i < MAX_OPERANDS; i++) {
+ ins->oprs[i].segment = ins->oprs[i].disp_size =
+ (segsize == 64 ? SEG_64BIT : segsize == 32 ? SEG_32BIT : 0);
+ }
+ ins->condition = -1;
+ ins->evex_tuple = 0;
+ ins->rex = prefix->rex;
+ memset(ins->prefixes, 0, sizeof ins->prefixes);
+
+ if (itemp_has(t, (segsize == 64 ? IF_NOLONG : IF_LONG)))
+ return 0;
+
+ if (prefix->rep == 0xF2)
+ drep = (itemp_has(t, IF_BND) ? P_BND : P_REPNE);
+ else if (prefix->rep == 0xF3)
+ drep = P_REP;
+
+ dwait = prefix->wait ? P_WAIT : 0;
+
+ while ((c = *r++) != 0) {
+ op1 = (c & 3) + ((opex & 1) << 2);
+ op2 = ((c >> 3) & 3) + ((opex & 2) << 1);
+ opx = &ins->oprs[op1];
+ opy = &ins->oprs[op2];
+ opex = 0;
+
+ switch (c) {
+ case 01:
+ case 02:
+ case 03:
+ case 04:
+ while (c--)
+ if (*r++ != *data++)
+ return 0;
+ break;
+
+ case 05:
+ case 06:
+ case 07:
+ opex = c;
+ break;
+
+ case4(010):
+ {
+ int t = *r++, d = *data++;
+ if (d < t || d > t + 7)
+ return 0;
+ else {
+ opx->basereg = (d-t)+
+ (ins->rex & REX_B ? 8 : 0);
+ opx->segment |= SEG_RMREG;
+ }
+ break;
+ }
+
+ case4(014):
+ /* this is an separate index reg position of MIB operand (ICC) */
+ /* Disassembler uses NASM's split EA form only */
+ break;
+
+ case4(0274):
+ opx->offset = (int8_t)*data++;
+ opx->segment |= SEG_SIGNED;
+ break;
+
+ case4(020):
+ opx->offset = *data++;
+ break;
+
+ case4(024):
+ opx->offset = *data++;
+ break;
+
+ case4(030):
+ opx->offset = getu16(data);
+ data += 2;
+ break;
+
+ case4(034):
+ if (osize == 32) {
+ opx->offset = getu32(data);
+ data += 4;
+ } else {
+ opx->offset = getu16(data);
+ data += 2;
+ }
+ if (segsize != asize)
+ opx->disp_size = asize;
+ break;
+
+ case4(040):
+ opx->offset = getu32(data);
+ data += 4;
+ break;
+
+ case4(0254):
+ opx->offset = gets32(data);
+ data += 4;
+ break;
+
+ case4(044):
+ switch (asize) {
+ case 16:
+ opx->offset = getu16(data);
+ data += 2;
+ if (segsize != 16)
+ opx->disp_size = 16;
+ break;
+ case 32:
+ opx->offset = getu32(data);
+ data += 4;
+ if (segsize == 16)
+ opx->disp_size = 32;
+ break;
+ case 64:
+ opx->offset = getu64(data);
+ opx->disp_size = 64;
+ data += 8;
+ break;
+ }
+ break;
+
+ case4(050):
+ opx->offset = gets8(data++);
+ opx->segment |= SEG_RELATIVE;
+ break;
+
+ case4(054):
+ opx->offset = getu64(data);
+ data += 8;
+ break;
+
+ case4(060):
+ opx->offset = gets16(data);
+ data += 2;
+ opx->segment |= SEG_RELATIVE;
+ opx->segment &= ~SEG_32BIT;
+ break;
+
+ case4(064): /* rel */
+ opx->segment |= SEG_RELATIVE;
+ /* In long mode rel is always 32 bits, sign extended. */
+ if (segsize == 64 || osize == 32) {
+ opx->offset = gets32(data);
+ data += 4;
+ if (segsize != 64)
+ opx->segment |= SEG_32BIT;
+ opx->type = (opx->type & ~SIZE_MASK)
+ | (segsize == 64 ? BITS64 : BITS32);
+ } else {
+ opx->offset = gets16(data);
+ data += 2;
+ opx->segment &= ~SEG_32BIT;
+ opx->type = (opx->type & ~SIZE_MASK) | BITS16;
+ }
+ break;
+
+ case4(070):
+ opx->offset = gets32(data);
+ data += 4;
+ opx->segment |= SEG_32BIT | SEG_RELATIVE;
+ break;
+
+ case4(0100):
+ case4(0110):
+ case4(0120):
+ case4(0130):
+ {
+ int modrm = *data++;
+ opx->segment |= SEG_RMREG;
+ data = do_ea(data, modrm, asize, segsize, eat, opy, ins);
+ if (!data)
+ return 0;
+ opx->basereg = ((modrm >> 3) & 7) + (ins->rex & REX_R ? 8 : 0);
+ if ((ins->rex & REX_EV) && (segsize == 64))
+ opx->basereg += (ins->evex_p[0] & EVEX_P0RP ? 0 : 16);
+ break;
+ }
+
+ case 0172:
+ {
+ uint8_t ximm = *data++;
+ c = *r++;
+ ins->oprs[c >> 3].basereg = (ximm >> 4) & regmask;
+ ins->oprs[c >> 3].segment |= SEG_RMREG;
+ ins->oprs[c & 7].offset = ximm & 15;
+ }
+ break;
+
+ case 0173:
+ {
+ uint8_t ximm = *data++;
+ c = *r++;
+
+ if ((c ^ ximm) & 15)
+ return 0;
+
+ ins->oprs[c >> 4].basereg = (ximm >> 4) & regmask;
+ ins->oprs[c >> 4].segment |= SEG_RMREG;
+ }
+ break;
+
+ case4(0174):
+ {
+ uint8_t ximm = *data++;
+
+ opx->basereg = (ximm >> 4) & regmask;
+ opx->segment |= SEG_RMREG;
+ }
+ break;
+
+ case4(0200):
+ case4(0204):
+ case4(0210):
+ case4(0214):
+ case4(0220):
+ case4(0224):
+ case4(0230):
+ case4(0234):
+ {
+ int modrm = *data++;
+ if (((modrm >> 3) & 07) != (c & 07))
+ return 0; /* spare field doesn't match up */
+ data = do_ea(data, modrm, asize, segsize, eat, opy, ins);
+ if (!data)
+ return 0;
+ break;
+ }
+
+ case4(0240):
+ case 0250:
+ {
+ uint8_t evexm = *r++;
+ uint8_t evexwlp = *r++;
+ uint8_t modrm, valid_mask;
+ ins->evex_tuple = *r++ - 0300;
+ modrm = *(origdata + 1);
+
+ ins->rex |= REX_EV;
+ if ((prefix->rex & (REX_EV|REX_V|REX_P)) != REX_EV)
+ return 0;
+
+ if ((evexm & 0x1f) != prefix->vex_m)
+ return 0;
+
+ switch (evexwlp & 060) {
+ case 000:
+ if (prefix->rex & REX_W)
+ return 0;
+ break;
+ case 020:
+ if (!(prefix->rex & REX_W))
+ return 0;
+ ins->rex |= REX_W;
+ break;
+ case 040: /* VEX.W is a don't care */
+ ins->rex &= ~REX_W;
+ break;
+ case 060:
+ break;
+ }
+
+ /* If EVEX.b is set with reg-reg op,
+ * EVEX.L'L contains embedded rounding control info
+ */
+ if ((prefix->evex[2] & EVEX_P2B) && ((modrm >> 6) == 3)) {
+ valid_mask = 0x3; /* prefix only */
+ } else {
+ valid_mask = 0xf; /* vector length and prefix */
+ }
+ if ((evexwlp ^ prefix->vex_lp) & valid_mask)
+ return 0;
+
+ if (c == 0250) {
+ if ((prefix->vex_v != 0) ||
+ (!(prefix->evex[2] & EVEX_P2VP) &&
+ ((eat < EA_XMMVSIB) || (eat > EA_ZMMVSIB))))
+ return 0;
+ } else {
+ opx->segment |= SEG_RMREG;
+ opx->basereg = ((~prefix->evex[2] & EVEX_P2VP) << (4 - 3) ) |
+ prefix->vex_v;
+ }
+ vex_ok = true;
+ memcpy(ins->evex_p, prefix->evex, 3);
+ break;
+ }
+
+ case4(0260):
+ case 0270:
+ {
+ int vexm = *r++;
+ int vexwlp = *r++;
+
+ ins->rex |= REX_V;
+ if ((prefix->rex & (REX_V|REX_P)) != REX_V)
+ return 0;
+
+ if ((vexm & 0x1f) != prefix->vex_m)
+ return 0;
+
+ switch (vexwlp & 060) {
+ case 000:
+ if (prefix->rex & REX_W)
+ return 0;
+ break;
+ case 020:
+ if (!(prefix->rex & REX_W))
+ return 0;
+ ins->rex &= ~REX_W;
+ break;
+ case 040: /* VEX.W is a don't care */
+ ins->rex &= ~REX_W;
+ break;
+ case 060:
+ break;
+ }
+
+ /* The 010 bit of vexwlp is set if VEX.L is ignored */
+ if ((vexwlp ^ prefix->vex_lp) & ((vexwlp & 010) ? 03 : 07))
+ return 0;
+
+ if (c == 0270) {
+ if (prefix->vex_v != 0)
+ return 0;
+ } else {
+ opx->segment |= SEG_RMREG;
+ opx->basereg = prefix->vex_v;
+ }
+ vex_ok = true;
+ break;
+ }
+
+ case 0271:
+ if (prefix->rep == 0xF3)
+ drep = P_XRELEASE;
+ break;
+
+ case 0272:
+ if (prefix->rep == 0xF2)
+ drep = P_XACQUIRE;
+ else if (prefix->rep == 0xF3)
+ drep = P_XRELEASE;
+ break;
+
+ case 0273:
+ if (prefix->lock == 0xF0) {
+ if (prefix->rep == 0xF2)
+ drep = P_XACQUIRE;
+ else if (prefix->rep == 0xF3)
+ drep = P_XRELEASE;
+ }
+ break;
+
+ case 0310:
+ if (asize != 16)
+ return 0;
+ else
+ a_used = true;
+ break;
+
+ case 0311:
+ if (asize != 32)
+ return 0;
+ else
+ a_used = true;
+ break;
+
+ case 0312:
+ if (asize != segsize)
+ return 0;
+ else
+ a_used = true;
+ break;
+
+ case 0313:
+ if (asize != 64)
+ return 0;
+ else
+ a_used = true;
+ break;
+
+ case 0314:
+ if (prefix->rex & REX_B)
+ return 0;
+ break;
+
+ case 0315:
+ if (prefix->rex & REX_X)
+ return 0;
+ break;
+
+ case 0316:
+ if (prefix->rex & REX_R)
+ return 0;
+ break;
+
+ case 0317:
+ if (prefix->rex & REX_W)
+ return 0;
+ break;
+
+ case 0320:
+ if (osize != 16)
+ return 0;
+ else
+ o_used = true;
+ break;
+
+ case 0321:
+ if (osize != 32)
+ return 0;
+ else
+ o_used = true;
+ break;
+
+ case 0322:
+ if (osize != (segsize == 16 ? 16 : 32))
+ return 0;
+ else
+ o_used = true;
+ break;
+
+ case 0323:
+ ins->rex |= REX_W; /* 64-bit only instruction */
+ osize = 64;
+ o_used = true;
+ break;
+
+ case 0324:
+ if (osize != 64)
+ return 0;
+ o_used = true;
+ break;
+
+ case 0325:
+ ins->rex |= REX_NH;
+ break;
+
+ case 0330:
+ {
+ int t = *r++, d = *data++;
+ if (d < t || d > t + 15)
+ return 0;
+ else
+ ins->condition = d - t;
+ break;
+ }
+
+ case 0326:
+ if (prefix->rep == 0xF3)
+ return 0;
+ break;
+
+ case 0331:
+ if (prefix->rep)
+ return 0;
+ break;
+
+ case 0332:
+ if (prefix->rep != 0xF2)
+ return 0;
+ drep = 0;
+ break;
+
+ case 0333:
+ if (prefix->rep != 0xF3)
+ return 0;
+ drep = 0;
+ break;
+
+ case 0334:
+ if (lock) {
+ ins->rex |= REX_R;
+ lock = 0;
+ }
+ break;
+
+ case 0335:
+ if (drep == P_REP)
+ drep = P_REPE;
+ break;
+
+ case 0336:
+ case 0337:
+ break;
+
+ case 0340:
+ return 0;
+
+ case 0341:
+ if (prefix->wait != 0x9B)
+ return 0;
+ dwait = 0;
+ break;
+
+ case 0360:
+ if (prefix->osp || prefix->rep)
+ return 0;
+ break;
+
+ case 0361:
+ if (!prefix->osp || prefix->rep)
+ return 0;
+ o_used = true;
+ break;
+
+ case 0364:
+ if (prefix->osp)
+ return 0;
+ break;
+
+ case 0365:
+ if (prefix->asp)
+ return 0;
+ break;
+
+ case 0366:
+ if (!prefix->osp)
+ return 0;
+ o_used = true;
+ break;
+
+ case 0367:
+ if (!prefix->asp)
+ return 0;
+ a_used = true;
+ break;
+
+ case 0370:
+ case 0371:
+ break;
+
+ case 0374:
+ eat = EA_XMMVSIB;
+ break;
+
+ case 0375:
+ eat = EA_YMMVSIB;
+ break;
+
+ case 0376:
+ eat = EA_ZMMVSIB;
+ break;
+
+ default:
+ return 0; /* Unknown code */
+ }
+ }
+
+ if (!vex_ok && (ins->rex & (REX_V | REX_EV)))
+ return 0;
+
+ /* REX cannot be combined with VEX */
+ if ((ins->rex & REX_V) && (prefix->rex & REX_P))
+ return 0;
+
+ /*
+ * Check for unused rep or a/o prefixes.
+ */
+ for (i = 0; i < t->operands; i++) {
+ if (ins->oprs[i].segment != SEG_RMREG)
+ a_used = true;
+ }
+
+ if (lock) {
+ if (ins->prefixes[PPS_LOCK])
+ return 0;
+ ins->prefixes[PPS_LOCK] = P_LOCK;
+ }
+ if (drep) {
+ if (ins->prefixes[PPS_REP])
+ return 0;
+ ins->prefixes[PPS_REP] = drep;
+ }
+ ins->prefixes[PPS_WAIT] = dwait;
+ if (!o_used) {
+ if (osize != ((segsize == 16) ? 16 : 32)) {
+ enum prefixes pfx = 0;
+
+ switch (osize) {
+ case 16:
+ pfx = P_O16;
+ break;
+ case 32:
+ pfx = P_O32;
+ break;
+ case 64:
+ pfx = P_O64;
+ break;
+ }
+
+ if (ins->prefixes[PPS_OSIZE])
+ return 0;
+ ins->prefixes[PPS_OSIZE] = pfx;
+ }
+ }
+ if (!a_used && asize != segsize) {
+ if (ins->prefixes[PPS_ASIZE])
+ return 0;
+ ins->prefixes[PPS_ASIZE] = asize == 16 ? P_A16 : P_A32;
+ }
+
+ /* Fix: check for redundant REX prefixes */
+
+ return data - origdata;
+}
+
+/* Condition names for disassembly, sorted by x86 code */
+static const char * const condition_name[16] = {
+ "o", "no", "c", "nc", "z", "nz", "na", "a",
+ "s", "ns", "pe", "po", "l", "nl", "ng", "g"
+};
+
+int32_t disasm(uint8_t *data, int32_t data_size, char *output, int outbufsize, int segsize,
+ int64_t offset, int autosync, iflag_t *prefer)
+{
+ const struct itemplate * const *p, * const *best_p;
+ const struct disasm_index *ix;
+ uint8_t *dp;
+ int length, best_length = 0;
+ char *segover;
+ int i, slen, colon, n;
+ uint8_t *origdata;
+ int works;
+ insn tmp_ins, ins;
+ iflag_t goodness, best;
+ int best_pref;
+ struct prefix_info prefix;
+ bool end_prefix;
+ bool is_evex;
+
+ memset(&ins, 0, sizeof ins);
+
+ /*
+ * Scan for prefixes.
+ */
+ memset(&prefix, 0, sizeof prefix);
+ prefix.asize = segsize;
+ prefix.osize = (segsize == 64) ? 32 : segsize;
+ segover = NULL;
+ origdata = data;
+
+ ix = itable;
+
+ end_prefix = false;
+ while (!end_prefix) {
+ switch (*data) {
+ case 0xF2:
+ case 0xF3:
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.rep = *data++;
+ break;
+
+ case 0x9B:
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.wait = *data++;
+ break;
+
+ case 0xF0:
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.lock = *data++;
+ break;
+
+ case 0x2E:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "cs", prefix.seg = *data++;
+ break;
+ case 0x36:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "ss", prefix.seg = *data++;
+ break;
+ case 0x3E:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "ds", prefix.seg = *data++;
+ break;
+ case 0x26:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "es", prefix.seg = *data++;
+ break;
+ case 0x64:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "fs", prefix.seg = *data++;
+ break;
+ case 0x65:
+ fetch_or_return(origdata, data, data_size, 1);
+ segover = "gs", prefix.seg = *data++;
+ break;
+
+ case 0x66:
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.osize = (segsize == 16) ? 32 : 16;
+ prefix.osp = *data++;
+ break;
+ case 0x67:
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.asize = (segsize == 32) ? 16 : 32;
+ prefix.asp = *data++;
+ break;
+
+ case 0xC4:
+ case 0xC5:
+ if (segsize == 64 || (data[1] & 0xc0) == 0xc0) {
+ fetch_or_return(origdata, data, data_size, 2);
+ prefix.vex[0] = *data++;
+ prefix.vex[1] = *data++;
+
+ prefix.rex = REX_V;
+ prefix.vex_c = RV_VEX;
+
+ if (prefix.vex[0] == 0xc4) {
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.vex[2] = *data++;
+ prefix.rex |= (~prefix.vex[1] >> 5) & 7; /* REX_RXB */
+ prefix.rex |= (prefix.vex[2] >> (7-3)) & REX_W;
+ prefix.vex_m = prefix.vex[1] & 0x1f;
+ prefix.vex_v = (~prefix.vex[2] >> 3) & 15;
+ prefix.vex_lp = prefix.vex[2] & 7;
+ } else {
+ prefix.rex |= (~prefix.vex[1] >> (7-2)) & REX_R;
+ prefix.vex_m = 1;
+ prefix.vex_v = (~prefix.vex[1] >> 3) & 15;
+ prefix.vex_lp = prefix.vex[1] & 7;
+ }
+
+ ix = itable_vex[RV_VEX][prefix.vex_m][prefix.vex_lp & 3];
+ }
+ end_prefix = true;
+ break;
+
+ case 0x62:
+ {
+ if (segsize == 64 || ((data[1] & 0xc0) == 0xc0)) {
+ fetch_or_return(origdata, data, data_size, 4);
+ data++; /* 62h EVEX prefix */
+ prefix.evex[0] = *data++;
+ prefix.evex[1] = *data++;
+ prefix.evex[2] = *data++;
+
+ prefix.rex = REX_EV;
+ prefix.vex_c = RV_EVEX;
+ prefix.rex |= (~prefix.evex[0] >> 5) & 7; /* REX_RXB */
+ prefix.rex |= (prefix.evex[1] >> (7-3)) & REX_W;
+ prefix.vex_m = prefix.evex[0] & EVEX_P0MM;
+ prefix.vex_v = (~prefix.evex[1] & EVEX_P1VVVV) >> 3;
+ prefix.vex_lp = ((prefix.evex[2] & EVEX_P2LL) >> (5-2)) |
+ (prefix.evex[1] & EVEX_P1PP);
+
+ ix = itable_vex[prefix.vex_c][prefix.vex_m][prefix.vex_lp & 3];
+ }
+ end_prefix = true;
+ break;
+ }
+
+ case 0x8F:
+ if ((data[1] & 030) != 0 &&
+ (segsize == 64 || (data[1] & 0xc0) == 0xc0)) {
+ fetch_or_return(origdata, data, data_size, 3);
+ prefix.vex[0] = *data++;
+ prefix.vex[1] = *data++;
+ prefix.vex[2] = *data++;
+
+ prefix.rex = REX_V;
+ prefix.vex_c = RV_XOP;
+
+ prefix.rex |= (~prefix.vex[1] >> 5) & 7; /* REX_RXB */
+ prefix.rex |= (prefix.vex[2] >> (7-3)) & REX_W;
+ prefix.vex_m = prefix.vex[1] & 0x1f;
+ prefix.vex_v = (~prefix.vex[2] >> 3) & 15;
+ prefix.vex_lp = prefix.vex[2] & 7;
+
+ ix = itable_vex[RV_XOP][prefix.vex_m][prefix.vex_lp & 3];
+ }
+ end_prefix = true;
+ break;
+
+ case REX_P + 0x0:
+ case REX_P + 0x1:
+ case REX_P + 0x2:
+ case REX_P + 0x3:
+ case REX_P + 0x4:
+ case REX_P + 0x5:
+ case REX_P + 0x6:
+ case REX_P + 0x7:
+ case REX_P + 0x8:
+ case REX_P + 0x9:
+ case REX_P + 0xA:
+ case REX_P + 0xB:
+ case REX_P + 0xC:
+ case REX_P + 0xD:
+ case REX_P + 0xE:
+ case REX_P + 0xF:
+ if (segsize == 64) {
+ fetch_or_return(origdata, data, data_size, 1);
+ prefix.rex = *data++;
+ if (prefix.rex & REX_W)
+ prefix.osize = 64;
+ }
+ end_prefix = true;
+ break;
+
+ default:
+ end_prefix = true;
+ break;
+ }
+ }
+
+ iflag_set_all(&best); /* Worst possible */
+ best_p = NULL;
+ best_pref = INT_MAX;
+
+ if (!ix)
+ return 0; /* No instruction table at all... */
+
+ dp = data;
+ fetch_or_return(origdata, dp, data_size, 1);
+ ix += *dp++;
+ while (ix->n == -1) {
+ fetch_or_return(origdata, dp, data_size, 1);
+ ix = (const struct disasm_index *)ix->p + *dp++;
+ }
+
+ p = (const struct itemplate * const *)ix->p;
+ for (n = ix->n; n; n--, p++) {
+ if ((length = matches(*p, data, &prefix, segsize, &tmp_ins))) {
+ works = true;
+ /*
+ * Final check to make sure the types of r/m match up.
+ * XXX: Need to make sure this is actually correct.
+ */
+ for (i = 0; i < (*p)->operands; i++) {
+ if (
+ /* If it's a mem-only EA but we have a
+ register, die. */
+ ((tmp_ins.oprs[i].segment & SEG_RMREG) &&
+ is_class(MEMORY, (*p)->opd[i])) ||
+ /* If it's a reg-only EA but we have a memory
+ ref, die. */
+ (!(tmp_ins.oprs[i].segment & SEG_RMREG) &&
+ !(REG_EA & ~(*p)->opd[i]) &&
+ !((*p)->opd[i] & REG_SMASK)) ||
+ /* Register type mismatch (eg FS vs REG_DESS):
+ die. */
+ ((((*p)->opd[i] & (REGISTER | FPUREG)) ||
+ (tmp_ins.oprs[i].segment & SEG_RMREG)) &&
+ !whichreg((*p)->opd[i],
+ tmp_ins.oprs[i].basereg, tmp_ins.rex))
+ ) {
+ works = false;
+ break;
+ }
+ }
+
+ /*
+ * Note: we always prefer instructions which incorporate
+ * prefixes in the instructions themselves. This is to allow
+ * e.g. PAUSE to be preferred to REP NOP, and deal with
+ * MMX/SSE instructions where prefixes are used to select
+ * between MMX and SSE register sets or outright opcode
+ * selection.
+ */
+ if (works) {
+ int i, nprefix;
+ goodness = iflag_pfmask(*p);
+ goodness = iflag_xor(&goodness, prefer);
+ nprefix = 0;
+ for (i = 0; i < MAXPREFIX; i++)
+ if (tmp_ins.prefixes[i])
+ nprefix++;
+ if (nprefix < best_pref ||
+ (nprefix == best_pref &&
+ iflag_cmp(&goodness, &best) < 0)) {
+ /* This is the best one found so far */
+ best = goodness;
+ best_p = p;
+ best_pref = nprefix;
+ best_length = length;
+ ins = tmp_ins;
+ }
+ }
+ }
+ }
+
+ if (!best_p)
+ return 0; /* no instruction was matched */
+
+ /* Pick the best match */
+ p = best_p;
+ length = best_length;
+
+ slen = 0;
+
+ /* TODO: snprintf returns the value that the string would have if
+ * the buffer were long enough, and not the actual length of
+ * the returned string, so each instance of using the return
+ * value of snprintf should actually be checked to assure that
+ * the return value is "sane." Maybe a macro wrapper could
+ * be used for that purpose.
+ */
+ for (i = 0; i < MAXPREFIX; i++) {
+ const char *prefix = prefix_name(ins.prefixes[i]);
+ if (prefix)
+ slen += snprintf(output+slen, outbufsize-slen, "%s ", prefix);
+ }
+
+ i = (*p)->opcode;
+ if (i >= FIRST_COND_OPCODE)
+ slen += snprintf(output + slen, outbufsize - slen, "%s%s",
+ nasm_insn_names[i], condition_name[ins.condition]);
+ else
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ nasm_insn_names[i]);
+
+ colon = false;
+ is_evex = !!(ins.rex & REX_EV);
+ length += data - origdata; /* fix up for prefixes */
+ for (i = 0; i < (*p)->operands; i++) {
+ opflags_t t = (*p)->opd[i];
+ decoflags_t deco = (*p)->deco[i];
+ const operand *o = &ins.oprs[i];
+ int64_t offs;
+
+ output[slen++] = (colon ? ':' : i == 0 ? ' ' : ',');
+
+ offs = o->offset;
+ if (o->segment & SEG_RELATIVE) {
+ offs += offset + length;
+ /*
+ * sort out wraparound
+ */
+ if (!(o->segment & (SEG_32BIT|SEG_64BIT)))
+ offs &= 0xffff;
+ else if (segsize != 64)
+ offs &= 0xffffffff;
+
+ /*
+ * add sync marker, if autosync is on
+ */
+ if (autosync)
+ add_sync(offs, 0L);
+ }
+
+ if (t & COLON)
+ colon = true;
+ else
+ colon = false;
+
+ if ((t & (REGISTER | FPUREG)) ||
+ (o->segment & SEG_RMREG)) {
+ enum reg_enum reg;
+ reg = whichreg(t, o->basereg, ins.rex);
+ if (t & TO)
+ slen += snprintf(output + slen, outbufsize - slen, "to ");
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ nasm_reg_names[reg-EXPR_REG_START]);
+ if (t & REGSET_MASK)
+ slen += snprintf(output + slen, outbufsize - slen, "+%d",
+ (int)((t & REGSET_MASK) >> (REGSET_SHIFT-1))-1);
+ if (is_evex && deco)
+ slen += append_evex_reg_deco(output + slen, outbufsize - slen,
+ deco, ins.evex_p);
+ } else if (!(UNITY & ~t)) {
+ output[slen++] = '1';
+ } else if (t & IMMEDIATE) {
+ if (t & BITS8) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "byte ");
+ if (o->segment & SEG_SIGNED) {
+ if (offs < 0) {
+ offs *= -1;
+ output[slen++] = '-';
+ } else
+ output[slen++] = '+';
+ }
+ } else if (t & BITS16) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "word ");
+ } else if (t & BITS32) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "dword ");
+ } else if (t & BITS64) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "qword ");
+ } else if (t & NEAR) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "near ");
+ } else if (t & SHORT) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "short ");
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "0x%"PRIx64"",
+ offs);
+ } else if (!(MEM_OFFS & ~t)) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen,
+ "[%s%s%s0x%"PRIx64"]",
+ (segover ? segover : ""),
+ (segover ? ":" : ""),
+ (o->disp_size == 64 ? "qword " :
+ o->disp_size == 32 ? "dword " :
+ o->disp_size == 16 ? "word " : ""), offs);
+ segover = NULL;
+ } else if (is_class(REGMEM, t)) {
+ int started = false;
+ if (t & BITS8)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "byte ");
+ if (t & BITS16)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "word ");
+ if (t & BITS32)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "dword ");
+ if (t & BITS64)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "qword ");
+ if (t & BITS80)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "tword ");
+ if ((ins.evex_p[2] & EVEX_P2B) && (deco & BRDCAST_MASK)) {
+ /* when broadcasting, each element size should be used */
+ if (deco & BR_BITS32)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "dword ");
+ else if (deco & BR_BITS64)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "qword ");
+ } else {
+ if (t & BITS128)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "oword ");
+ if (t & BITS256)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "yword ");
+ if (t & BITS512)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "zword ");
+ }
+ if (t & FAR)
+ slen += snprintf(output + slen, outbufsize - slen, "far ");
+ if (t & NEAR)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "near ");
+ output[slen++] = '[';
+ if (o->disp_size)
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ (o->disp_size == 64 ? "qword " :
+ o->disp_size == 32 ? "dword " :
+ o->disp_size == 16 ? "word " :
+ ""));
+ if (o->eaflags & EAF_REL)
+ slen += snprintf(output + slen, outbufsize - slen, "rel ");
+ if (segover) {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "%s:",
+ segover);
+ segover = NULL;
+ }
+ if (o->basereg != -1) {
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ nasm_reg_names[(o->basereg-EXPR_REG_START)]);
+ started = true;
+ }
+ if (o->indexreg != -1 && !itemp_has(*best_p, IF_MIB)) {
+ if (started)
+ output[slen++] = '+';
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ nasm_reg_names[(o->indexreg-EXPR_REG_START)]);
+ if (o->scale > 1)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "*%d",
+ o->scale);
+ started = true;
+ }
+
+
+ if (o->segment & SEG_DISP8) {
+ if (is_evex) {
+ const char *prefix;
+ uint32_t offset = offs;
+ if ((int32_t)offset < 0) {
+ prefix = "-";
+ offset = -offset;
+ } else {
+ prefix = "+";
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "%s0x%"PRIx32"",
+ prefix, offset);
+ } else {
+ const char *prefix;
+ uint8_t offset = offs;
+ if ((int8_t)offset < 0) {
+ prefix = "-";
+ offset = -offset;
+ } else {
+ prefix = "+";
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "%s0x%"PRIx8"",
+ prefix, offset);
+ }
+ } else if (o->segment & SEG_DISP16) {
+ const char *prefix;
+ uint16_t offset = offs;
+ if ((int16_t)offset < 0 && started) {
+ offset = -offset;
+ prefix = "-";
+ } else {
+ prefix = started ? "+" : "";
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen,
+ "%s0x%"PRIx16"", prefix, offset);
+ } else if (o->segment & SEG_DISP32) {
+ if (prefix.asize == 64) {
+ const char *prefix;
+ uint64_t offset = offs;
+ if ((int32_t)offs < 0 && started) {
+ offset = -offset;
+ prefix = "-";
+ } else {
+ prefix = started ? "+" : "";
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen,
+ "%s0x%"PRIx64"", prefix, offset);
+ } else {
+ const char *prefix;
+ uint32_t offset = offs;
+ if ((int32_t) offset < 0 && started) {
+ offset = -offset;
+ prefix = "-";
+ } else {
+ prefix = started ? "+" : "";
+ }
+ slen +=
+ snprintf(output + slen, outbufsize - slen,
+ "%s0x%"PRIx32"", prefix, offset);
+ }
+ }
+
+ if (o->indexreg != -1 && itemp_has(*best_p, IF_MIB)) {
+ output[slen++] = ',';
+ slen += snprintf(output + slen, outbufsize - slen, "%s",
+ nasm_reg_names[(o->indexreg-EXPR_REG_START)]);
+ if (o->scale > 1)
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "*%d",
+ o->scale);
+ started = true;
+ }
+
+ output[slen++] = ']';
+
+ if (is_evex && deco)
+ slen += append_evex_mem_deco(output + slen, outbufsize - slen,
+ t, deco, ins.evex_p);
+ } else {
+ slen +=
+ snprintf(output + slen, outbufsize - slen, "<operand%d>",
+ i);
+ }
+ }
+ output[slen] = '\0';
+ if (segover) { /* unused segment override */
+ char *p = output;
+ int count = slen + 1;
+ while (count--)
+ p[count + 3] = p[count];
+ strncpy(output, segover, 2);
+ output[2] = ' ';
+ }
+ return length;
+}
+
+/*
+ * This is called when we don't have a complete instruction. If it
+ * is a standalone *single-byte* prefix show it as such, otherwise
+ * print it as a literal.
+ */
+int32_t eatbyte(uint8_t *data, char *output, int outbufsize, int segsize)
+{
+ uint8_t byte = *data;
+ const char *str = NULL;
+
+ switch (byte) {
+ case 0xF2:
+ str = "repne";
+ break;
+ case 0xF3:
+ str = "rep";
+ break;
+ case 0x9B:
+ str = "wait";
+ break;
+ case 0xF0:
+ str = "lock";
+ break;
+ case 0x2E:
+ str = "cs";
+ break;
+ case 0x36:
+ str = "ss";
+ break;
+ case 0x3E:
+ str = "ds";
+ break;
+ case 0x26:
+ str = "es";
+ break;
+ case 0x64:
+ str = "fs";
+ break;
+ case 0x65:
+ str = "gs";
+ break;
+ case 0x66:
+ str = (segsize == 16) ? "o32" : "o16";
+ break;
+ case 0x67:
+ str = (segsize == 32) ? "a16" : "a32";
+ break;
+ case REX_P + 0x0:
+ case REX_P + 0x1:
+ case REX_P + 0x2:
+ case REX_P + 0x3:
+ case REX_P + 0x4:
+ case REX_P + 0x5:
+ case REX_P + 0x6:
+ case REX_P + 0x7:
+ case REX_P + 0x8:
+ case REX_P + 0x9:
+ case REX_P + 0xA:
+ case REX_P + 0xB:
+ case REX_P + 0xC:
+ case REX_P + 0xD:
+ case REX_P + 0xE:
+ case REX_P + 0xF:
+ if (segsize == 64) {
+ snprintf(output, outbufsize, "rex%s%s%s%s%s",
+ (byte == REX_P) ? "" : ".",
+ (byte & REX_W) ? "w" : "",
+ (byte & REX_R) ? "r" : "",
+ (byte & REX_X) ? "x" : "",
+ (byte & REX_B) ? "b" : "");
+ break;
+ }
+ /* else fall through */
+ default:
+ snprintf(output, outbufsize, "db 0x%02x", byte);
+ break;
+ }
+
+ if (str)
+ snprintf(output, outbufsize, "%s", str);
+
+ return 1;
+}
diff --git a/disasm/disasm.h b/disasm/disasm.h
new file mode 100644
index 00000000..053474d2
--- /dev/null
+++ b/disasm/disasm.h
@@ -0,0 +1,49 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * disasm.h header file for disasm.c
+ */
+
+#ifndef NASM_DISASM_H
+#define NASM_DISASM_H
+
+#include "iflag.h"
+
+#define INSN_MAX 32 /* one instruction can't be longer than this */
+
+int32_t disasm(uint8_t *data, int32_t data_size, char *output, int outbufsize, int segsize,
+ int64_t offset, int autosync, iflag_t *prefer);
+int32_t eatbyte(uint8_t *data, char *output, int outbufsize, int segsize);
+
+#endif
diff --git a/disasm/ndisasm.c b/disasm/ndisasm.c
new file mode 100644
index 00000000..591c19bc
--- /dev/null
+++ b/disasm/ndisasm.c
@@ -0,0 +1,396 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * ndisasm.c the Netwide Disassembler main module
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "insns.h"
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "ver.h"
+#include "sync.h"
+#include "disasm.h"
+
+#define BPL 8 /* bytes per line of hex dump */
+
+static const char *help =
+ "usage: ndisasm [-a] [-i] [-h] [-r] [-u] [-b bits] [-o origin] [-s sync...]\n"
+ " [-e bytes] [-k start,bytes] [-p vendor] file\n"
+ " -a or -i activates auto (intelligent) sync\n"
+ " -u same as -b 32\n"
+ " -b 16, -b 32 or -b 64 sets the processor mode\n"
+ " -h displays this text\n"
+ " -r or -v displays the version number\n"
+ " -e skips <bytes> bytes of header\n"
+ " -k avoids disassembling <bytes> bytes from position <start>\n"
+ " -p selects the preferred vendor instruction set (intel, amd, cyrix, idt)\n";
+
+static void output_ins(uint64_t, uint8_t *, int, char *);
+static void skip(uint32_t dist, FILE * fp);
+
+static void ndisasm_verror(int severity, const char *fmt, va_list va)
+{
+ vfprintf(stderr, fmt, va);
+
+ if (severity & ERR_FATAL)
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ char buffer[INSN_MAX * 2], *p, *ep, *q;
+ char outbuf[256];
+ char *pname = *argv;
+ char *filename = NULL;
+ uint32_t nextsync, synclen, initskip = 0L;
+ int lenread;
+ int32_t lendis;
+ bool autosync = false;
+ int bits = 16, b;
+ bool eof = false;
+ iflag_t prefer;
+ bool rn_error;
+ int64_t offset;
+ FILE *fp;
+
+ tolower_init();
+ nasm_set_verror(ndisasm_verror);
+ iflag_clear_all(&prefer);
+
+ offset = 0;
+ init_sync();
+
+ while (--argc) {
+ char *v, *vv, *p = *++argv;
+ if (*p == '-' && p[1]) {
+ p++;
+ while (*p)
+ switch (nasm_tolower(*p)) {
+ case 'a': /* auto or intelligent sync */
+ case 'i':
+ autosync = true;
+ p++;
+ break;
+ case 'h':
+ fputs(help, stderr);
+ return 0;
+ case 'r':
+ case 'v':
+ fprintf(stderr,
+ "NDISASM version %s\n",
+ nasm_version);
+ return 0;
+ case 'u': /* -u for -b 32, -uu for -b 64 */
+ if (bits < 64)
+ bits <<= 1;
+ p++;
+ break;
+ case 'b': /* bits */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-b' requires an argument\n",
+ pname);
+ return 1;
+ }
+ b = strtoul(v, &ep, 10);
+ if (*ep || !(bits == 16 || bits == 32 || bits == 64)) {
+ fprintf(stderr, "%s: argument to `-b' should"
+ " be 16, 32 or 64\n", pname);
+ } else {
+ bits = b;
+ }
+ p = ""; /* force to next argument */
+ break;
+ case 'o': /* origin */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-o' requires an argument\n",
+ pname);
+ return 1;
+ }
+ offset = readnum(v, &rn_error);
+ if (rn_error) {
+ fprintf(stderr,
+ "%s: `-o' requires a numeric argument\n",
+ pname);
+ return 1;
+ }
+ p = ""; /* force to next argument */
+ break;
+ case 's': /* sync point */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-s' requires an argument\n",
+ pname);
+ return 1;
+ }
+ add_sync(readnum(v, &rn_error), 0L);
+ if (rn_error) {
+ fprintf(stderr,
+ "%s: `-s' requires a numeric argument\n",
+ pname);
+ return 1;
+ }
+ p = ""; /* force to next argument */
+ break;
+ case 'e': /* skip a header */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-e' requires an argument\n",
+ pname);
+ return 1;
+ }
+ initskip = readnum(v, &rn_error);
+ if (rn_error) {
+ fprintf(stderr,
+ "%s: `-e' requires a numeric argument\n",
+ pname);
+ return 1;
+ }
+ p = ""; /* force to next argument */
+ break;
+ case 'k': /* skip a region */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-k' requires an argument\n",
+ pname);
+ return 1;
+ }
+ vv = strchr(v, ',');
+ if (!vv) {
+ fprintf(stderr,
+ "%s: `-k' requires two numbers separated"
+ " by a comma\n", pname);
+ return 1;
+ }
+ *vv++ = '\0';
+ nextsync = readnum(v, &rn_error);
+ if (rn_error) {
+ fprintf(stderr,
+ "%s: `-k' requires numeric arguments\n",
+ pname);
+ return 1;
+ }
+ synclen = readnum(vv, &rn_error);
+ if (rn_error) {
+ fprintf(stderr,
+ "%s: `-k' requires numeric arguments\n",
+ pname);
+ return 1;
+ }
+ add_sync(nextsync, synclen);
+ p = ""; /* force to next argument */
+ break;
+ case 'p': /* preferred vendor */
+ v = p[1] ? p + 1 : --argc ? *++argv : NULL;
+ if (!v) {
+ fprintf(stderr, "%s: `-p' requires an argument\n",
+ pname);
+ return 1;
+ }
+ if (!strcmp(v, "intel")) {
+ iflag_clear_all(&prefer); /* default */
+ } else if (!strcmp(v, "amd")) {
+ iflag_clear_all(&prefer);
+ iflag_set(&prefer, IF_AMD);
+ iflag_set(&prefer, IF_3DNOW);
+ } else if (!strcmp(v, "cyrix")) {
+ iflag_clear_all(&prefer);
+ iflag_set(&prefer, IF_CYRIX);
+ iflag_set(&prefer, IF_3DNOW);
+ } else if (!strcmp(v, "idt") ||
+ !strcmp(v, "centaur") ||
+ !strcmp(v, "winchip")) {
+ iflag_clear_all(&prefer);
+ iflag_set(&prefer, IF_3DNOW);
+ } else {
+ fprintf(stderr,
+ "%s: unknown vendor `%s' specified with `-p'\n",
+ pname, v);
+ return 1;
+ }
+ p = ""; /* force to next argument */
+ break;
+ default: /*bf */
+ fprintf(stderr, "%s: unrecognised option `-%c'\n",
+ pname, *p);
+ return 1;
+ }
+ } else if (!filename) {
+ filename = p;
+ } else {
+ fprintf(stderr, "%s: more than one filename specified\n",
+ pname);
+ return 1;
+ }
+ }
+
+ if (!filename) {
+ fprintf(stderr, help, pname);
+ return 0;
+ }
+
+ if (strcmp(filename, "-")) {
+ fp = fopen(filename, "rb");
+ if (!fp) {
+ fprintf(stderr, "%s: unable to open `%s': %s\n",
+ pname, filename, strerror(errno));
+ return 1;
+ }
+ } else
+ fp = stdin;
+
+ if (initskip > 0)
+ skip(initskip, fp);
+
+ /*
+ * This main loop is really horrible, and wants rewriting with
+ * an axe. It'll stay the way it is for a while though, until I
+ * find the energy...
+ */
+
+ p = q = buffer;
+ nextsync = next_sync(offset, &synclen);
+ do {
+ uint32_t to_read = buffer + sizeof(buffer) - p;
+ if ((nextsync || synclen) &&
+ to_read > nextsync - offset - (p - q))
+ to_read = nextsync - offset - (p - q);
+ if (to_read) {
+ lenread = fread(p, 1, to_read, fp);
+ if (lenread == 0)
+ eof = true; /* help along systems with bad feof */
+ } else
+ lenread = 0;
+ p += lenread;
+ if ((nextsync || synclen) &&
+ (uint32_t)offset == nextsync) {
+ if (synclen) {
+ fprintf(stdout, "%08"PRIX64" skipping 0x%"PRIX32" bytes\n",
+ offset, synclen);
+ offset += synclen;
+ skip(synclen, fp);
+ }
+ p = q = buffer;
+ nextsync = next_sync(offset, &synclen);
+ }
+ while (p > q && (p - q >= INSN_MAX || lenread == 0)) {
+ lendis = disasm((uint8_t *)q, INSN_MAX, outbuf, sizeof(outbuf),
+ bits, offset, autosync, &prefer);
+ if (!lendis || lendis > (p - q)
+ || ((nextsync || synclen) &&
+ (uint32_t)lendis > nextsync - offset))
+ lendis = eatbyte((uint8_t *) q, outbuf, sizeof(outbuf), bits);
+ output_ins(offset, (uint8_t *) q, lendis, outbuf);
+ q += lendis;
+ offset += lendis;
+ }
+ if (q >= buffer + INSN_MAX) {
+ uint8_t *r = (uint8_t *) buffer, *s = (uint8_t *) q;
+ int count = p - q;
+ while (count--)
+ *r++ = *s++;
+ p -= (q - buffer);
+ q = buffer;
+ }
+ } while (lenread > 0 || !(eof || feof(fp)));
+
+ if (fp != stdin)
+ fclose(fp);
+
+ return 0;
+}
+
+static void output_ins(uint64_t offset, uint8_t *data,
+ int datalen, char *insn)
+{
+ int bytes;
+ fprintf(stdout, "%08"PRIX64" ", offset);
+
+ bytes = 0;
+ while (datalen > 0 && bytes < BPL) {
+ fprintf(stdout, "%02X", *data++);
+ bytes++;
+ datalen--;
+ }
+
+ fprintf(stdout, "%*s%s\n", (BPL + 1 - bytes) * 2, "", insn);
+
+ while (datalen > 0) {
+ fprintf(stdout, " -");
+ bytes = 0;
+ while (datalen > 0 && bytes < BPL) {
+ fprintf(stdout, "%02X", *data++);
+ bytes++;
+ datalen--;
+ }
+ fprintf(stdout, "\n");
+ }
+}
+
+/*
+ * Skip a certain amount of data in a file, either by seeking if
+ * possible, or if that fails then by reading and discarding.
+ */
+static void skip(uint32_t dist, FILE * fp)
+{
+ char buffer[256]; /* should fit on most stacks :-) */
+
+ /*
+ * Got to be careful with fseek: at least one fseek I've tried
+ * doesn't approve of SEEK_CUR. So I'll use SEEK_SET and
+ * ftell... horrible but apparently necessary.
+ */
+ if (fseek(fp, dist + ftell(fp), SEEK_SET)) {
+ while (dist > 0) {
+ uint32_t len = (dist < sizeof(buffer) ?
+ dist : sizeof(buffer));
+ if (fread(buffer, 1, len, fp) < len) {
+ perror("fread");
+ exit(1);
+ }
+ dist -= len;
+ }
+ }
+}
diff --git a/disasm/sync.c b/disasm/sync.c
new file mode 100644
index 00000000..7116b229
--- /dev/null
+++ b/disasm/sync.c
@@ -0,0 +1,132 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * sync.c the Netwide Disassembler synchronisation processing module
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "nasmlib.h"
+#include "sync.h"
+
+#define SYNC_MAX_SHIFT 31
+#define SYNC_MAX_SIZE (1U << SYNC_MAX_SHIFT)
+
+/* initial # of sync points (*must* be power of two)*/
+#define SYNC_INITIAL_CHUNK (1U << 12)
+
+/*
+ * This lot manages the current set of sync points by means of a
+ * heap (priority queue) structure.
+ */
+
+static struct Sync {
+ uint64_t pos;
+ uint32_t length;
+} *synx;
+
+static uint32_t max_synx, nsynx;
+
+static inline void swap_sync(uint32_t dst, uint32_t src)
+{
+ struct Sync t = synx[dst];
+ synx[dst] = synx[src];
+ synx[src] = t;
+}
+
+void init_sync(void)
+{
+ max_synx = SYNC_INITIAL_CHUNK;
+ synx = nasm_malloc((max_synx + 1) * sizeof(*synx));
+ nsynx = 0;
+}
+
+void add_sync(uint64_t pos, uint32_t length)
+{
+ uint32_t i;
+
+ if (nsynx >= max_synx) {
+ if (max_synx >= SYNC_MAX_SIZE) /* too many sync points! */
+ return;
+ max_synx = (max_synx << 1);
+ synx = nasm_realloc(synx, (max_synx + 1) * sizeof(*synx));
+ }
+
+ nsynx++;
+ synx[nsynx].pos = pos;
+ synx[nsynx].length = length;
+
+ for (i = nsynx; i > 1; i /= 2) {
+ if (synx[i / 2].pos > synx[i].pos)
+ swap_sync(i / 2, i);
+ }
+}
+
+uint64_t next_sync(uint64_t position, uint32_t *length)
+{
+ while (nsynx > 0 && synx[1].pos + synx[1].length <= position) {
+ uint32_t i, j;
+
+ swap_sync(nsynx, 1);
+ nsynx--;
+
+ i = 1;
+ while (i * 2 <= nsynx) {
+ j = i * 2;
+ if (synx[j].pos < synx[i].pos &&
+ (j + 1 > nsynx || synx[j + 1].pos > synx[j].pos)) {
+ swap_sync(j, i);
+ i = j;
+ } else if (j + 1 <= nsynx && synx[j + 1].pos < synx[i].pos) {
+ swap_sync(j + 1, i);
+ i = j + 1;
+ } else
+ break;
+ }
+ }
+
+ if (nsynx > 0) {
+ if (length)
+ *length = synx[1].length;
+ return synx[1].pos;
+ } else {
+ if (length)
+ *length = 0L;
+ return 0;
+ }
+}
diff --git a/disasm/sync.h b/disasm/sync.h
new file mode 100644
index 00000000..15c5afdf
--- /dev/null
+++ b/disasm/sync.h
@@ -0,0 +1,45 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * sync.h header file for sync.c
+ */
+
+#ifndef NASM_SYNC_H
+#define NASM_SYNC_H
+
+void init_sync(void);
+void add_sync(uint64_t position, uint32_t length);
+uint64_t next_sync(uint64_t position, uint32_t *length);
+
+#endif
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 00000000..27e6fadb
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,90 @@
+#
+# UNIX Makefile for NASM documentation
+#
+
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+mandir = @mandir@
+docdir = @docdir@
+htmldir = @htmldir@
+infodir = @infodir@
+datarootdir = @datarootdir@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+PERL = perl -I$(srcdir)
+
+PDFOPT = @PDFOPT@
+
+MKDIR = mkdir
+RM_F = rm -f
+RM_RF = rm -rf
+CP_F = cp -f
+CP_UF = cp -ufv
+
+# Auxiliary files referenced by the HTML files
+HTMLAUX = nasmdoc.css local.css nasmlogw.png
+
+SRCS = nasmdoc.src inslist.src changes.src version.src
+OUT = html nasmdoc.txt nasmdoc.pdf
+
+.SUFFIXES:
+.SUFFIXES: .pfa .ph
+
+all: $(OUT)
+
+inslist.src: inslist.pl ../x86/insns.dat
+ $(PERL) $(srcdir)/inslist.pl $(srcdir)/../x86/insns.dat
+
+.PHONY: html
+html: $(HTMLAUX)
+ $(MKDIR) -p html
+ for f in $(HTMLAUX); do $(CP_UF) "$(srcdir)/$$f" html/; done
+ $(MAKE) html/nasmdoc0.html
+
+RDSRC = $(PERL) $(srcdir)/rdsrc.pl -I$(srcdir)/
+
+html/nasmdoc0.html: $(SRCS) rdsrc.pl
+ $(RM_F) html/*.html
+ $(RDSRC) -ohtml html nasmdoc.src
+
+nasmdoc.dip: $(SRCS) rdsrc.pl
+ $(RDSRC) dip nasmdoc.src
+
+nasmdoc.txt: $(SRCS) rdsrc.pl
+ $(RDSRC) txt nasmdoc.src
+
+version.src: $(top_srcdir)/version.pl $(top_srcdir)/version
+ $(PERL) $(top_srcdir)/version.pl docsrc \
+ < $(top_srcdir)/version > version.src
+
+nasmdoc.ps: nasmdoc.dip genps.pl afmmetrics.ph ttfmetrics.ph \
+ pswidth.ph nasmlogo.eps psfonts.ph head.ps
+ $(PERL) $(srcdir)/genps.pl -epsdir "$(srcdir)" \
+ -headps $(srcdir)/head.ps nasmdoc.dip \
+ > nasmdoc.ps
+
+nasmdoc.pdf: nasmdoc.ps pspdf.pl
+ $(PERL) $(srcdir)/pspdf.pl $(PDFOPT) nasmdoc.ps nasmdoc.pdf
+
+clean:
+ -$(RM_F) *.rtf *.hpj *.texi *.gid *.ipf *.dip
+ -$(RM_F) *.aux *.cp *.fn *.ky *.pg *.log *.toc *.tp *.vr
+ -$(RM_F) inslist.src version.src
+ -$(RM_F) nasmdoc*.ps
+
+spotless: clean
+ -$(RM_RF) html info
+ -$(RM_F) *.hlp nasmdoc.txt *.inf *.pdf *.dvi
+
+install: all
+ $(MKDIR) -p $(DESTDIR)$(htmldir)
+ $(INSTALL_DATA) html/* $(DESTDIR)$(htmldir)
+ $(MKDIR) -p $(DESTDIR)$(docdir)
+ $(INSTALL_DATA) nasmdoc.pdf nasmdoc.txt $(DESTDIR)$(docdir)
diff --git a/doc/README b/doc/README
new file mode 100644
index 00000000..63956224
--- /dev/null
+++ b/doc/README
@@ -0,0 +1,20 @@
+To build the entire documentation, the following tools are needed:
+
+1. A Perl interpreter for your platform
+2. The following Perl modules available from CPAN:
+ Font::TTF
+ Sort::Versions
+3. asciidoc
+ http://asciidoc.org/
+4. xmlto
+ https://fedorahosted.org/xmlto
+5. One of:
+ Adobe Acrobat (acrodist)
+ Ghostscript (ps2pdf) http://download.ghostscript.com/
+ pstopdf (available on some BSD-derived Unix systems)
+
+ Of these, Ghostscript is the most tested, although Acrobat has
+ been claimed to generate smaller files.
+6. For best results, the Adobe fonts Source Sans Pro and Source Code
+ Pro, available for free at:
+ https://github.com/adobe-fonts
diff --git a/doc/afmmetrics.ph b/doc/afmmetrics.ph
new file mode 100644
index 00000000..c6f6d612
--- /dev/null
+++ b/doc/afmmetrics.ph
@@ -0,0 +1,102 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Parse AFM metric file, returns a reference to fontdata
+#
+sub parse_afm_file($$) {
+ my($filename, $filetype) = @_;
+
+ my $fontdata = {
+ widths => {},
+ kern => {}
+ };
+
+ my $charmetrics = 0;
+ my $kerndata = 0;
+ my $charcode, $width, $name;
+
+ my $fontfile = $filename.'.'.$filetype;
+ return undef unless ( -f $fontfile );
+
+ $fontdata->{file} = $fontfile;
+ $fontdata->{type} = $filetype;
+ $fontdata->{scale} = 1000; # AFM metrics always have scale 1000
+
+ return undef unless (open(my $fh, '<', $filename.'.afm'));
+
+ while ( my $line = <$fh> ) {
+ if ( $line =~ /^\s*FontName\s+(.*)\s*$/i ) {
+ $fontdata->{'name'} = $1;
+ } elsif ( $line =~ /^\s*StartCharMetrics\b/i ) {
+ $charmetrics = 1;
+ } elsif ( $line =~ /^\s*EndCharMetrics\b/i ) {
+ $charmetrics = 0;
+ } elsif ( $line =~ /^\s*StartKernPairs\b/i ) {
+ $kerndata = 1;
+ } elsif ( $line =~ /^\s*EndKernPairs\b/i ) {
+ $kerndata = 0;
+ } elsif ( $charmetrics ) {
+ my @data = split(/\s*;\s*/, $line);
+ undef $charcode, $width, $name;
+ foreach my $d ( @data ) {
+ my @dd = split(/\s+/, $d);
+ if ( $dd[0] eq 'C' ) {
+ $charcode = $dd[1];
+ } elsif ( $dd[0] eq 'WX' ) {
+ $width = $dd[1];
+ } elsif ( $dd[0] eq 'W' ) {
+ $width = $dd[2];
+ } elsif ( $dd[0] eq 'N' ) {
+ $name = $dd[1];
+ }
+ }
+ if ( defined($name) && defined($width) ) {
+ $fontdata->{widths}{$name} = $width;
+ }
+ } elsif ( $kerndata ) {
+ my($kpx, $a, $b, $adj) = split(/\s+/, $line);
+ if ( $kpx eq 'KPX' ) {
+ if (!exists($fontdata->{kern}{$a})) {
+ $fontdata->{kern}{$a} = {};
+ }
+ $fontdata->{kern}{$a}{$b} = $adj;
+ }
+ }
+ }
+
+ return $fontdata;
+}
+
+1;
diff --git a/doc/changes.src b/doc/changes.src
new file mode 100644
index 00000000..7da6662b
--- /dev/null
+++ b/doc/changes.src
@@ -0,0 +1,2659 @@
+\#
+\# NASM revision history in nasmdoc format
+\#
+
+\H{cl-2.xx} NASM 2 Series
+
+The NASM 2 series supports x86-64, and is the production version of NASM
+since 2007.
+
+\S{cl-2.14} Version 2.14
+
+\b Fixed \c{-I} option handling when ending slash is not present.
+
+\b Fixed null dereference in corrupted invalid single line macros.
+
+\b Fixed division by zero which may happen if source code is malformed.
+
+\b Fixed out of bound access in processing of malformed segment override.
+
+\b Fixed out of bound access in certain \c{EQU} parsing.
+
+\b Fixed buffer underflow in float parsing.
+
+\b Added \c{SGX} (Intel Software Guard Extensions) instructions.
+
+\b Added \c{+n} syntax for multiple contiguous registers.
+
+\b Fixed \c{subsections_via_symbols} for \c{macho} object format.
+
+\b Added the \c{--gprefix}, \c{--gpostfix}, \c{--lprefix}, and
+\c{--lpostfix} command line options, to allow command line base symbol
+renaming. See \k{opt-pfix}.
+
+\b Allow label renaming to be specified by \c{%pragma} in addition to
+from the command line. See \k{mangling}.
+
+\b Supported generic \c{%pragma} namespaces, \c{output} and \c{debug}. See
+\k{gen-namespace}.
+
+\b Added the \c{--pragma} command line option to inject a \c{%pragma}
+directive. See \k{opt-pragma}.
+
+\b Added the \c{--before} command line option to accept preprocess
+statement before input. See \k{opt-before}.
+
+\b Added \c{AVX512} \c{VBMI2} (Additional Bit Manipulation), \c{VNNI} (Vector
+Neural Network), \c{BITALG} (Bit Algorithm), and \c{GFNI} (Galois Field New
+Instruction) instructions.
+
+\b Added the \c{STATIC} directive for local symbols that should be
+renamed using global-symbol rules. See \k{static}.
+
+\b Allow a symbol to be defined as \c{EXTERN} and then later
+overridden as \c{GLOBAL} or \c{COMMON}. Furthermore, a symbol declared
+\c{EXTERN} and then defined will be treated as \c{GLOBAL}. See \k{extern}.
+
+\b The \c{GLOBAL} directive no longer is required to precede the
+definition of the symbol.
+
+\b Support \c{private_extern} as \c{macho} specific extension to the
+\c{GLOBAL} directive. See \k{macho-pext}.
+
+\b Updated \c{UD0} encoding to match with the specification
+
+\b Added the \c{--limit-X} command line option to set execution
+limits. See \k{opt-limit}.
+
+\b Updated the \c{Codeview} version number to be aligned with \c{MASM}.
+
+\b Added the \c{--keep-all} command line option to preserve output
+files. See \k{opt-keep-all}.
+
+\b Added the \c{--include} command line option, an alias to \c{-P} (\k{opt-p}).
+
+\b Added the \c{--help} command line option as an alias to \c{-h} (\k{syntax}).
+
+\b Added \c{-W}, \c{-D}, and \c{-Q} suffix aliases for \c{RET}
+ instructions so the operand sizes of these instructions can be
+ encoded without using \c{o16}, \c{o32} or \c{o64}.
+
+\S{cl-2.13.03} Version 2.13.03
+
+\b Added AVX and AVX512 \c{VAES*} and \c{VPCLMULQDQ} instructions.
+
+\b Fixed missing dwarf record in x32 ELF output format.
+
+\S{cl-2.13.02} Version 2.13.02
+
+\b Fix false positive in testing of numeric overflows.
+
+\b Fix generation of \c{PEXTRW} instruction.
+
+\b Fix \c{smartalign} package which could trigger an error during
+ optimization if the alignment code expanded too much due to
+ optimization of the previous code.
+
+\b Fix a case where negative value in \c{TIMES} directive causes
+ panic instead of an error.
+
+\b Always finalize \c{.debug_abbrev} section with a null in
+ \c{dwarf} output format.
+
+\b Support \c{debug} flag in section attributes for \c{macho}
+ output format. See \k{machosect}.
+
+\b Support up to 16 characters in section names for \c{macho}
+ output format.
+
+\b Fix missing update of global \c{BITS} setting if \c{SECTION}
+ directive specified a bit size using output format-specific
+ extensions (e.g. \c{USE32} for the \c{obj} output format.)
+
+\b Fix the incorrect generation of VEX-encoded instruction when static
+ mode decorators are specified on scalar instructions, losing the
+ decorators as they require EVEX encoding.
+
+\b Option \c{-MW} to quote dependency outputs according to Watcom
+ Make conventions instead of POSIX Make conventions. See \k{opt-MW}.
+
+\b The \c{obj} output format now contains embedded dependency file
+ information, unless disabled with \c{%pragma obj nodepend}. See
+ \k{objdepend}.
+
+\b Fix generation of dependency lists.
+
+\b Fix a number of null pointer reference and memory allocation errors.
+
+\b Always generate symbol-relative relocations for the \c{macho64}
+ output format; at least some versions of the XCode/LLVM linker fails
+ for section-relative relocations.
+
+\S{cl-2.13.01} Version 2.13.01
+
+\b Fix incorrect output for some types of \c{FAR} or \c{SEG}
+ references in the \c{obj} output format, and possibly other 16-bit
+ output formats.
+
+\b Fix the address in the list file for an instruction containing a
+ \c{TIMES} directive.
+
+\b Fix error with \c{TIMES} used together with an instruction which
+ can vary in size, e.g. \c{JMP}.
+
+\b Fix breakage on some uses of the \c{DZ} pseudo-op.
+
+\S{cl-2.13} Version 2.13
+
+\b Support the official forms of the \c{UD0} and \c{UD1} instructions.
+
+\b Allow self-segment-relative expressions in immediates and
+ displacements, even when combined with an external or otherwise
+ out-of-segment special symbol, e.g.:
+
+\c extern foo
+\c mov eax,[foo - $ + ebx] ; Now legal
+
+\b Handle a 64-bit origin in NDISASM.
+
+\b NASM can now generate sparse output files for relevant output
+ formats, if the underlying operating system supports them.
+
+\b The \c{macho} object format now supports the \c{subsections_via_symbols}
+ and \c{no_dead_strip} directives, see \k{macho-ssvs}.
+
+\b The \c{macho} object format now supports the \c{no_dead_strip},
+ \c{live_support} and \c{strip_static_syms} section flags, see
+ \k{machosect}.
+
+\b The \c{macho} object format now supports the \c{dwarf} debugging
+ format, as required by newer toolchains.
+
+\b All warnings can now be suppressed if desired; warnings not
+ otherwise part of any warning class are now considered its own
+ warning class called \c{other} (e.g. \c{-w-other}). Furthermore,
+ warning-as-error can now be controlled on a per warning class
+ basis, using the syntax \c{-w+error=}\e{warning-class} and its
+ equivalent for all other warning control options. See \k{opt-w}
+ for the command-line options and warning classes and
+ \k{asmdir-warning} for the \c{[WARNING]} directive.
+
+\b Fix a number of bugs related to AVX-512 decorators.
+
+\b Significant improvements to building NASM with Microsoft Visual
+ Studio via \c{Mkfiles/msvc.mak}. It is now possible to build the
+ full Windows installer binary as long as the necessary
+ prerequisites are installed; see \c{Mkfiles/README}
+
+\b To build NASM with custom modifications (table changes) or from the
+ git tree now requires Perl 5.8 at the very minimum, quite possibly
+ a higher version (Perl 5.24.1 tested.) There is no requirement to
+ have Perl on your system at all if all you want to do is build
+ unmodified NASM from source archives.
+
+\b Fix the \c{\{z\}} decorator on AVX-512 \c{VMOVDQ*} instructions.
+
+\b Add new warnings for certain dangerous constructs which never ought
+ to have been allowed. In particular, the \c{RESB} family of
+ instructions should have been taking a critical expression all
+ along.
+
+\b Fix the EVEX (AVX-512) versions of the \c{VPBROADCAST}, \c{VPEXTR},
+ and \c{VPINSR} instructions.
+
+\b Support contracted forms of additional instructions. As a general
+ rule, if an instruction has a non-destructive source immediately
+ after a destination register that isn't used as an input, NASM
+ supports omitting that source register, using the destination
+ register as that value. This among other things makes it easier to
+ convert SSE code to the equivalent AVX code:
+
+\c addps xmm1,xmm0 ; SSE instruction
+\c vaddps ymm1,ymm1,ymm0 ; AVX official long form
+\c vaddps ymm1,ymm0 ; AVX contracted form
+
+\b Fix Codeview malformed compiler version record.
+
+\b Add the \c{CLWB} and \c{PCOMMIT} instructions. Note that the
+ \c{PCOMMIT} instruction has been deprecated and will never be
+ included in a shipping product; it is included for completeness
+ only.
+
+\b Add the \c{%pragma} preprocessor directive for soft-error directives.
+
+\b Add the \c{RDPID} instruction.
+
+\S{cl-2.12.02} Version 2.12.02
+
+\b Fix preprocessor errors, especially \c{%error} and \c{%warning},
+ inside \c{%if} statements.
+
+\b Fix relative relocations in 32-bit Mach-O.
+
+\b More Codeview debug format fixes.
+
+\b If the MASM \c{PTR} keyword is encountered, issue a warning. This is
+ much more likely to indicate a MASM-ism encountered in NASM than it
+ is a valid label. This warning can be suppressed with \c{-w-ptr},
+ the \c{[warning]} directive (see \k{opt-w}) or by the macro
+ definition \c{%idefine ptr $%?} (see \k{selfref%?}).
+
+\b When an error or a warning comes from the expansion of a multi-line
+ macro, display the file and line numbers for the expanded macros.
+ Macros defined with \c{.nolist} do not get displayed.
+
+\b Add macros \c{ilog2fw()} and \c{ilog2cw()} to the \c{ifunc} macro
+ package. See \k{ilog2}.
+
+
+\S{cl-2.12.01} Version 2.12.01
+
+\b Portability fixes for some platforms.
+
+\b Fix error when not specifying a list file.
+
+\b Correct the handling of macro-local labels in the Codeview
+ debugging format.
+
+\b Add \c{CLZERO}, \c{MONITORX} and \c{MWAITX} instructions.
+
+
+\S{cl-2.12} Version 2.12
+
+\b Major fixes to the \c{macho} backend (\k{machofmt}); earlier versions
+ would produce invalid symbols and relocations on a regular basis.
+
+\b Support for thread-local storage in Mach-O.
+
+\b Support for arbitrary sections in Mach-O.
+
+\b Fix wrong negative size treated as a big positive value passed into
+ backend causing NASM to crash.
+
+\b Fix handling of zero-extending unsigned relocations, we have been printing
+ wrong message and forgot to assign segment with predefined value before
+ passing it into output format.
+
+\b Fix potential write of oversized (with size greater than allowed in
+ output format) relative relocations.
+
+\b Portability fixes for building NASM with the LLVM compiler.
+
+\b Add support of Codeview version 8 (\c{cv8}) debug format for
+ \c{win32} and \c{win64} formats in the \c{COFF} backend,
+ see \k{codeview}.
+
+\b Allow 64-bit outputs in 16/32-bit only backends. Unsigned 64-bit
+ relocations are zero-extended from 32-bits with a warning
+ (suppressible via \c{-w-zext-reloc}); signed 64-bit relocations are
+ an error.
+
+\b Line numbers in list files now correspond to the lines in the source
+ files, instead of simply being sequential.
+
+\b There is now an official 64-bit (x64 a.k.a. x86-64) build for Windows.
+
+
+\S{cl-2.11.09} Version 2.11.09
+
+\b Fix potential stack overwrite in \c{macho32} backend.
+
+\b Fix relocation records in \c{macho64} backend.
+
+\b Fix symbol lookup computation in \c{macho64} backend.
+
+\b Adjust \c{.symtab} and \c{.rela.text} sections alignments to 8 bytes
+ in \c{elf64} backed.
+
+\b Fix section length computation in \c{bin} backend which leaded in incorrect
+ relocation records.
+
+\S{cl-2.11.08} Version 2.11.08
+
+\b Fix section length computation in \c{bin} backend which leaded in incorrect
+ relocation records.
+
+\b Add a warning for numeric preprocessor definitions passed via command
+ line which might have unexpected results otherwise.
+
+\b Add ability to specify a module name record in \c{rdoff} linker with
+ \c{-mn} option.
+
+\b Increase label length capacity up to 256 bytes in \c{rdoff} backend for
+ FreePascal sake, which tends to generate very long labels for procedures.
+
+\b Fix segmentation failure when rip addressing is used in \c{macho64} backend.
+
+\b Fix access on out of memory when handling strings with a single
+ grave. We have sixed similar problem in previous release but not
+ all cases were covered.
+
+\b Fix NULL dereference in disassembled on \c{BND} instruction.
+
+\S{cl-2.11.07} Version 2.11.07
+
+\b Fix 256 bit \c{VMOVNTPS} instruction.
+
+\b Fix \c{-MD} option handling, which was rather broken in previous
+release changing command line api.
+
+\b Fix access to unitialized space when handling strings with
+a single grave.
+
+\b Fix nil dereference in handling memory reference parsing.
+
+\S{cl-2.11.06} Version 2.11.06
+
+\b Update AVX512 instructions based on the Extension Reference (319433-021 Sept
+2014).
+
+\b Fix the behavior of \c{-MF} and \c{-MD} options (Bugzilla 3392280)
+
+\b Updated Win32 Makefile to fix issue with build
+
+\S{cl-2.11.05} Version 2.11.05
+
+\b Add \c{--v} as an alias for \c{-v} (see \k{opt-v}), for
+command-line compatibility with Yasm.
+
+\b Fix a bug introduced in 2.11.03 whereby certain instructions would
+contain multiple REX prefixes, and thus be corrupt.
+
+\S{cl-2.11.04} Version 2.11.04
+
+\b Removed an invalid error checking code. Sometimes a memref only with
+a displacement can also set an evex flag. For example:
+
+\c vmovdqu32 [0xabcd]{k1}, zmm0
+
+\b Fixed a bug in disassembler that EVEX.L'L vector length was not matched
+when EVEX.b was set because it was simply considered as EVEC.RC.
+Separated EVEX.L'L case from EVEX.RC which is ignored in matching.
+
+\S{cl-2.11.03} Version 2.11.03
+
+\b Fix a bug there REX prefixes were missing on instructions inside a
+\c{TIMES} statement.
+
+\S{cl-2.11.02} Version 2.11.02
+
+\b Add the \c{XSAVEC}, \c{XSAVES} and \c{XRSTORS} family instructions.
+
+\b Add the \c{CLFLUSHOPT} instruction.
+
+\S{cl-2.11.01} Version 2.11.01
+
+\b Allow instructions which implicitly uses \c{XMM0} (\c{VBLENDVPD},
+\c{VBLENDVPS}, \c{PBLENDVB} and \c{SHA256RNDS2}) to be specified
+without an explicit \c{xmm0} on the assembly line. In other words,
+the following two lines produce the same output:
+
+\c vblendvpd xmm2,xmm1,xmm0 ; Last operand is fixed xmm0
+\c vblendvpd xmm2,xmm1 ; Implicit xmm0 omitted
+
+\b In the ELF backends, don't crash the assembler if \c{section align}
+is specified without a value.
+
+\S{cl-2.11} Version 2.11
+
+\b Add support for the Intel AVX-512 instruction set:
+
+\b 16 new, 512-bit SIMD registers. Total 32 \c{(ZMM0 ~ ZMM31)}
+
+\b 8 new opmask registers \c{(K0 ~ K7)}. One of 7 registers \c{(K1 ~ K7)} can
+be used as an opmask for conditional execution.
+
+\b A new EVEX encoding prefix. EVEX is based on VEX and provides more
+capabilities: opmasks, broadcasting, embedded rounding and compressed
+displacements.
+
+\c - opmask
+\c VDIVPD zmm0{k1}{z}, zmm1, zmm3 ; conditional vector operation
+\c ; using opmask k1.
+\c ; {z} is for zero-masking
+\c - broadcasting
+\c VDIVPS zmm4, zmm5, [rbx]{1to16} ; load single-precision float and
+\c ; replicate it 16 times. 32 * 16 = 512
+\c - embedded rounding
+\c VCVTSI2SD xmm6, xmm7, {rz-sae}, rax ; round toward zero. note that it
+\c ; is used as if a separate operand.
+\c ; it comes after the last SIMD operand
+
+\b Add support for \c{ZWORD} (512 bits), \c{DZ} and \c{RESZ}.
+
+\b Add support for the MPX and SHA instruction sets.
+
+\b Better handling of section redefinition.
+
+\b Generate manpages when running \c{'make dist'}.
+
+\b Handle all token chains in mmacro params range.
+
+\b Support split [base,index] effective address:
+
+\c mov eax,[eax+8,ecx*4] ; eax=base, ecx=index, 4=scale, 8=disp
+
+This is expected to be most useful for the MPX instructions.
+
+\b Support \c{BND} prefix for branch instructions (for MPX).
+
+\b The \c{DEFAULT} directive can now take \c{BND} and \c{NOBND}
+options to indicate whether all relevant branches should be getting
+\c{BND} prefixes. This is expected to be the normal for use in MPX
+code.
+
+\b Add \c{{evex}}, \c{{vex3}} and \c{{vex2}} instruction prefixes to
+have NASM encode the corresponding instruction, if possible, with an EVEX,
+3-byte VEX, or 2-byte VEX prefix, respectively.
+
+\b Support for section names longer than 8 bytes in Win32/Win64 COFF.
+
+\b The \c{NOSPLIT} directive by itself no longer forces a single
+register to become an index register, unless it has an explicit
+multiplier.
+
+\c mov eax,[nosplit eax] ; eax as base register
+\c mov eax,[nosplit eax*1] ; eax as index register
+
+\S{cl-2.10.09} Version 2.10.09
+
+\b Pregenerate man pages.
+
+\S{cl-2.10.08} Version 2.10.08
+
+\b Fix \c{VMOVNTDQA}, \c{MOVNTDQA} and \c{MOVLPD} instructions.
+
+\b Fix collision for \c{VGATHERQPS}, \c{VPGATHERQD} instructions.
+
+\b Fix \c{VPMOVSXBQ}, \c{VGATHERQPD}, \c{VSPLLW} instructions.
+
+\b Add a bunch of AMD TBM instructions.
+
+\b Fix potential stack overwrite in numbers conversion.
+
+\b Allow byte size in \c{PREFETCHTx} instructions.
+
+\b Make manual pages up to date.
+
+\b Make \c{F3} and \c{F2} SSE prefixes to override \c{66}.
+
+\b Support of AMD SVM instructions in 32 bit mode.
+
+\b Fix near offsets code generation for \c{JMP}, \c{CALL} instrictions
+in long mode.
+
+\b Fix preprocessor parse regression when id is expanding to a whitespace.
+
+\S{cl-2.10.07} Version 2.10.07
+
+\b Fix line continuation parsing being broken in previous version.
+
+\S{cl-2.10.06} Version 2.10.06
+
+\b Always quote the dependency source names when using the automatic
+dependency generation options.
+
+\b If no dependency target name is specified via the \c{-MT} or
+\c{-MQ} options, quote the default output name.
+
+\b Fix assembly of shift operations in \c{CPU 8086} mode.
+
+\b Fix incorrect generation of explicit immediate byte for shift by 1
+under certain circumstances.
+
+\b Fix assembly of the \c{VPCMPGTQ} instruction.
+
+\b Fix RIP-relative relocations in the \c{macho64} backend.
+
+\S{cl-2.10.05} Version 2.10.05
+
+\b Add the \c{CLAC} and \c{STAC} instructions.
+
+\S{cl-2.10.04} Version 2.10.04
+
+\b Add back the inadvertently deleted 256-bit version of the \c{VORPD}
+instruction.
+
+\b Correct disassembly of instructions starting with byte \c{82} hex.
+
+\b Fix corner cases in token pasting, for example:
+
+\c %define N 1e%++%+ 5
+\c dd N, 1e+5
+
+\S{cl-2.10.03} Version 2.10.03
+
+\b Correct the assembly of the instruction:
+
+\c XRELEASE MOV [absolute],AL
+
+\> Previous versions would incorrectly generate \c{F3 A2} for this
+instruction and issue a warning; correct behavior is to emit \c{F3 88
+05}.
+
+\S{cl-2.10.02} Version 2.10.02
+
+\b Add the \c{ifunc} macro package with integer functions, currently
+only integer logarithms. See \k{pkg_ifunc}.
+
+\b Add the \c{RDSEED}, \c{ADCX} and \c{ADOX} instructions.
+
+\S{cl-2.10.01} Version 2.10.01
+
+\b Add missing VPMOVMSKB instruction with reg32, ymmreg operands.
+
+\S{cl-2.10} Version 2.10
+
+\b When optimization is enabled, \c{mov r64,imm} now optimizes to the
+ shortest form possible between:
+
+\c mov r32,imm32 ; 5 bytes
+\c mov r64,imm32 ; 7 bytes
+\c mov r64,imm64 ; 10 bytes
+
+\> To force a specific form, use the \c{STRICT} keyword, see \k{strict}.
+
+\b Add support for the Intel AVX2 instruction set.
+
+\b Add support for Bit Manipulation Instructions 1 and 2.
+
+\b Add support for Intel Transactional Synchronization Extensions (TSX).
+
+\b Add support for x32 ELF (32-bit ELF with the CPU in 64-bit mode.)
+ See \k{elffmt}.
+
+\b Add support for bigendian UTF-16 and UTF-32. See \k{unicode}.
+
+\S{cl-2.09.10} Version 2.09.10
+
+\b Fix up NSIS script to protect uninstaller against registry keys
+ absence or corruption. It brings in a few additional questions
+ to a user during deinstallation procedure but still it is better
+ than unpredictable file removal.
+
+\S{cl-2.09.09} Version 2.09.09
+
+\b Fix initialization of section attributes of \c{bin} output format.
+
+\b Fix \c{mach64} output format bug that crashes NASM due to NULL symbols.
+
+
+\S{cl-2.09.08} Version 2.09.08
+
+\b Fix \c{__OUTPUT_FORMAT__} assignment when output driver alias
+ is used. For example when \c{-f elf} is used \c{__OUTPUT_FORMAT__}
+ must be set to \c{elf}, if \c{-f elf32} is used \c{__OUTPUT_FORMAT__}
+ must be assigned accordingly, i.e. to \c{elf32}. The rule applies to
+ all output driver aliases. See \k{ofmtm}.
+
+
+\S{cl-2.09.07} Version 2.09.07
+
+\b Fix attempts to close same file several times
+ when \c{-a} option is used.
+
+\b Fixes for VEXTRACTF128, VMASKMOVPS encoding.
+
+
+\S{cl-2.09.06} Version 2.09.06
+
+\b Fix missed section attribute initialization in \c{bin} output target.
+
+
+\S{cl-2.09.05} Version 2.09.05
+
+\b Fix arguments encoding for VPEXTRW instruction.
+
+\b Remove invalid form of VPEXTRW instruction.
+
+\b Add \c{VLDDQU} as alias for \c{VLDQQU} to
+ match specification.
+
+
+\S{cl-2.09.04} Version 2.09.04
+
+\b Fix incorrect labels offset for VEX intructions.
+
+\b Eliminate bogus warning on implicit operand size override.
+
+\b \c{%if} term could not handle 64 bit numbers.
+
+\b The COFF backend was limiting relocations number to 16 bits even if
+ in real there were a way more relocations.
+
+
+\S{cl-2.09.03} Version 2.09.03
+
+\b Print \c{%macro} name inside \c{%rep} blocks on error.
+
+\b Fix preprocessor expansion behaviour. It happened sometime
+ too early and sometime simply wrong. Move behaviour back to
+ the origins (down to NASM 2.05.01).
+
+\b Fix unitialized data dereference on OMF output format.
+
+\b Issue warning on unterminated \c{%{} construct.
+
+\b Fix for documentation typo.
+
+
+\S{cl-2.09.02} Version 2.09.02
+
+\b Fix reversed tokens when \c{%deftok} produces more than one output token.
+
+\b Fix segmentation fault on disassembling some VEX instructions.
+
+\b Missing \c{%endif} did not always cause error.
+
+\b Fix typo in documentation.
+
+\b Compound context local preprocessor single line macro identifiers
+ were not expanded early enough and as result lead to unresolved
+ symbols.
+
+
+\S{cl-2.09.01} Version 2.09.01
+
+\b Fix NULL dereference on missed %deftok second parameter.
+
+\b Fix NULL dereference on invalid %substr parameters.
+
+
+\S{cl-2.09} Version 2.09
+
+\b Fixed assignment the magnitude of \c{%rep} counter. It is limited
+ to 62 bits now.
+
+\b Fixed NULL dereference if argument of \c{%strlen} resolves
+ to whitespace. For example if nonexistent macro parameter is used.
+
+\b \c{%ifenv}, \c{%elifenv}, \c{%ifnenv}, and \c{%elifnenv} directives
+ introduced. See \k{ifenv}.
+
+\b Fixed NULL dereference if environment variable is missed.
+
+\b Updates of new AVX v7 Intel instructions.
+
+\b \c{PUSH imm32} is now officially documented.
+
+\b Fix for encoding the LFS, LGS and LSS in 64-bit mode.
+
+\b Fixes for compatibility with OpenWatcom compiler and DOS 8.3 file
+ format limitation.
+
+\b Macros parameters range expansion introduced. See \k{mlmacrange}.
+
+\b Backward compatibility on expanging of local sigle macros restored.
+
+\b 8 bit relocations for \c{elf} and \c{bin} output formats are introduced.
+
+\b Short intersegment jumps are permitted now.
+
+\b An alignment more than 64 bytes are allowed for \c{win32},
+ \c{win64} output formats.
+
+\b \c{SECTALIGN} directive introduced. See \k{sectalign}.
+
+\b \c{nojmp} option introduced in \c{smartalign} package. See
+ \k{pkg_smartalign}.
+
+\b Short aliases \c{win}, \c{elf} and \c{macho} for output formats are
+ introduced. Each stands for \c{win32}, \c{elf32} and \c{macho32}
+ accordingly.
+
+\b Faster handling of missing directives implemented.
+
+\b Various small improvements in documentation.
+
+\b No hang anymore if unable to open malloc.log file.
+
+\b The environments without vsnprintf function are able to build nasm again.
+
+\b AMD LWP instructions updated.
+
+\b Tighten EA checks. We warn a user if there overflow in EA addressing.
+
+\b Make \c{-Ox} the default optimization level. For the legacy
+ behavior, specify \c{-O0} explicitly. See \k{opt-O}.
+
+\b Environment variables read with \c{%!} or tested with \c{%ifenv}
+ can now contain non-identifier characters if surrounded by quotes.
+ See \k{getenv}.
+
+\b Add a new standard macro package \c{%use fp} for floating-point
+ convenience macros. See \k{pkg_fp}.
+
+
+\S{cl-2.08.02} Version 2.08.02
+
+\b Fix crash under certain circumstances when using the \c{%+} operator.
+
+
+\S{cl-2.08.01} Version 2.08.01
+
+\b Fix the \c{%use} statement, which was broken in 2.08.
+
+
+\S{cl-2.08} Version 2.08
+
+\b A number of enhancements/fixes in macros area.
+
+\b Support for converting strings to tokens. See \k{deftok}.
+
+\b Fuzzy operand size logic introduced.
+
+\b Fix COFF stack overrun on too long export identifiers.
+
+\b Fix Macho-O alignment bug.
+
+\b Fix crashes with -fwin32 on file with many exports.
+
+\b Fix stack overrun for too long [DEBUG id].
+
+\b Fix incorrect sbyte usage in IMUL (hit only if optimization
+ flag passed).
+
+\b Append ending token for \c{.stabs} records in the ELF output format.
+
+\b New NSIS script which uses ModernUI and MultiUser approach.
+
+\b Visual Studio 2008 NASM integration (rules file).
+
+\b Warn a user if a constant is too long (and as result will be stripped).
+
+\b The obsoleted pre-XOP AMD SSE5 instruction set which was never actualized
+ was removed.
+
+\b Fix stack overrun on too long error file name passed from the command line.
+
+\b Bind symbols to the .text section by default (ie in case if SECTION
+ directive was omitted) in the ELF output format.
+
+\b Fix sync points array index wrapping.
+
+\b A few fixes for FMA4 and XOP instruction templates.
+
+\b Add AMD Lightweight Profiling (LWP) instructions.
+
+\b Fix the offset for \c{%arg} in 64-bit mode.
+
+\b An undefined local macro (\c{%$}) no longer matches a global macro
+ with the same name.
+
+\b Fix NULL dereference on too long local labels.
+
+
+\S{cl-2.07} Version 2.07
+
+\b NASM is now under the 2-clause BSD license. See \k{legal}.
+
+\b Fix the section type for the \c{.strtab} section in the \c{elf64}
+ output format.
+
+\b Fix the handling of \c{COMMON} directives in the \c{obj} output format.
+
+\b New \c{ith} and \c{srec} output formats; these are variants of the
+ \c{bin} output format which output Intel hex and Motorola S-records,
+ respectively. See \k{ithfmt} and \k{srecfmt}.
+
+\b \c{rdf2ihx} replaced with an enhanced \c{rdf2bin}, which can output
+ binary, COM, Intel hex or Motorola S-records.
+
+\b The Windows installer now puts the NASM directory first in the
+ \c{PATH} of the "NASM Shell".
+
+\b Revert the early expansion behavior of \c{%+} to pre-2.06 behavior:
+ \c{%+} is only expanded late.
+
+\b Yet another Mach-O alignment fix.
+
+\b Don't delete the list file on errors. Also, include error and
+ warning information in the list file.
+
+\b Support for 64-bit Mach-O output, see \k{machofmt}.
+
+\b Fix assert failure on certain operations that involve strings with
+ high-bit bytes.
+
+
+\S{cl-2.06} Version 2.06
+
+\b This release is dedicated to the memory of Charles A. Crayne, long
+ time NASM developer as well as moderator of \c{comp.lang.asm.x86} and
+ author of the book \e{Serious Assembler}. We miss you, Chuck.
+
+\b Support for indirect macro expansion (\c{%[...]}). See \k{indmacro}.
+
+\b \c{%pop} can now take an argument, see \k{pushpop}.
+
+\b The argument to \c{%use} is no longer macro-expanded. Use
+ \c{%[...]} if macro expansion is desired.
+
+\b Support for thread-local storage in ELF32 and ELF64. See \k{elftls}.
+
+\b Fix crash on \c{%ifmacro} without an argument.
+
+\b Correct the arguments to the \c{POPCNT} instruction.
+
+\b Fix section alignment in the Mach-O format.
+
+\b Update AVX support to version 5 of the Intel specification.
+
+\b Fix the handling of accesses to context-local macros from higher
+ levels in the context stack.
+
+\b Treat \c{WAIT} as a prefix rather than as an instruction, thereby
+ allowing constructs like \c{O16 FSAVE} to work correctly.
+
+\b Support for structures with a non-zero base offset. See \k{struc}.
+
+\b Correctly handle preprocessor token concatenation (see \k{concat})
+ involving floating-point numbers.
+
+\b The \c{PINSR} series of instructions have been corrected and
+ rationalized.
+
+\b Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 (rev 3.03)
+ spec.
+
+\b The ELF backends no longer automatically generate a \c{.comment} section.
+
+\b Add additional "well-known" ELF sections with default attributes. See
+ \k{elfsect}.
+
+
+\S{cl-2.05.01} Version 2.05.01
+
+\b Fix the \c{-w}/\c{-W} option parsing, which was broken in NASM 2.05.
+
+
+\S{cl-2.05} Version 2.05
+
+\b Fix redundant REX.W prefix on \c{JMP reg64}.
+
+\b Make the behaviour of \c{-O0} match NASM 0.98 legacy behavior.
+ See \k{opt-O}.
+
+\b \c{-w-user} can be used to suppress the output of \c{%warning} directives.
+ See \k{opt-w}.
+
+\b Fix bug where \c{ALIGN} would issue a full alignment datum instead of
+ zero bytes.
+
+\b Fix offsets in list files.
+
+\b Fix \c{%include} inside multi-line macros or loops.
+
+\b Fix error where NASM would generate a spurious warning on valid
+ optimizations of immediate values.
+
+\b Fix arguments to a number of the \c{CVT} SSE instructions.
+
+\b Fix RIP-relative offsets when the instruction carries an immediate.
+
+\b Massive overhaul of the ELF64 backend for spec compliance.
+
+\b Fix the Geode \c{PFRCPV} and \c{PFRSQRTV} instruction.
+
+\b Fix the SSE 4.2 \c{CRC32} instruction.
+
+
+\S{cl-2.04} Version 2.04
+
+\b Sanitize macro handing in the \c{%error} directive.
+
+\b New \c{%warning} directive to issue user-controlled warnings.
+
+\b \c{%error} directives are now deferred to the final assembly phase.
+
+\b New \c{%fatal} directive to immediately terminate assembly.
+
+\b New \c{%strcat} directive to join quoted strings together.
+
+\b New \c{%use} macro directive to support standard macro directives. See
+ \k{use}.
+
+\b Excess default parameters to \c{%macro} now issues a warning by default.
+ See \k{mlmacro}.
+
+\b Fix \c{%ifn} and \c{%elifn}.
+
+\b Fix nested \c{%else} clauses.
+
+\b Correct the handling of nested \c{%rep}s.
+
+\b New \c{%unmacro} directive to undeclare a multi-line macro.
+ See \k{unmacro}.
+
+\b Builtin macro \c{__PASS__} which expands to the current assembly pass.
+ See \k{pass_macro}.
+
+\b \c{__utf16__} and \c{__utf32__} operators to generate UTF-16 and UTF-32
+ strings. See \k{unicode}.
+
+\b Fix bug in case-insensitive matching when compiled on platforms that
+ don't use the \c{configure} script. Of the official release binaries,
+ that only affected the OS/2 binary.
+
+\b Support for x87 packed BCD constants. See \k{bcdconst}.
+
+\b Correct the \c{LTR} and \c{SLDT} instructions in 64-bit mode.
+
+\b Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.
+
+\b Add AVX versions of the AES instructions (\c{VAES}...).
+
+\b Fix the 256-bit FMA instructions.
+
+\b Add 256-bit AVX stores per the latest AVX spec.
+
+\b VIA XCRYPT instructions can now be written either with or without
+ \c{REP}, apparently different versions of the VIA spec wrote them
+ differently.
+
+\b Add missing 64-bit \c{MOVNTI} instruction.
+
+\b Fix the operand size of \c{VMREAD} and \c{VMWRITE}.
+
+\b Numerous bug fixes, especially to the AES, AVX and VTX instructions.
+
+\b The optimizer now always runs until it converges. It also runs even
+ when disabled, but doesn't optimize. This allows most forward references
+ to be resolved properly.
+
+\b \c{%push} no longer needs a context identifier; omitting the context
+ identifier results in an anonymous context.
+
+
+\S{cl-2.03.01} Version 2.03.01
+
+\b Fix buffer overflow in the listing module.
+
+\b Fix the handling of hexadecimal escape codes in `...` strings.
+
+\b The Postscript/PDF documentation has been reformatted.
+
+\b The \c{-F} option now implies \c{-g}.
+
+
+\S{cl-2.03} Version 2.03
+
+\b Add support for Intel AVX, CLMUL and FMA instructions,
+including YMM registers.
+
+\b \c{dy}, \c{resy} and \c{yword} for 32-byte operands.
+
+\b Fix some SSE5 instructions.
+
+\b Intel \c{INVEPT}, \c{INVVPID} and \c{MOVBE} instructions.
+
+\b Fix checking for critical expressions when the optimizer is enabled.
+
+\b Support the DWARF debugging format for ELF targets.
+
+\b Fix optimizations of signed bytes.
+
+\b Fix operation on bigendian machines.
+
+\b Fix buffer overflow in the preprocessor.
+
+\b \c{SAFESEH} support for Win32, \c{IMAGEREL} for Win64 (SEH).
+
+\b \c{%?} and \c{%??} to refer to the name of a macro itself. In particular,
+\c{%idefine keyword $%?} can be used to make a keyword "disappear".
+
+\b New options for dependency generation: \c{-MD}, \c{-MF},
+\c{-MP}, \c{-MT}, \c{-MQ}.
+
+\b New preprocessor directives \c{%pathsearch} and \c{%depend}; INCBIN
+reimplemented as a macro.
+
+\b \c{%include} now resolves macros in a sane manner.
+
+\b \c{%substr} can now be used to get other than one-character substrings.
+
+\b New type of character/string constants, using backquotes (\c{`...`}),
+which support C-style escape sequences.
+
+\b \c{%defstr} and \c{%idefstr} to stringize macro definitions before
+creation.
+
+\b Fix forward references used in \c{EQU} statements.
+
+
+\S{cl-2.02} Version 2.02
+
+\b Additional fixes for MMX operands with explicit \c{qword}, as well as
+ (hopefully) SSE operands with \c{oword}.
+
+\b Fix handling of truncated strings with \c{DO}.
+
+\b Fix segfaults due to memory overwrites when floating-point constants
+ were used.
+
+\b Fix segfaults due to missing include files.
+
+\b Fix OpenWatcom Makefiles for DOS and OS/2.
+
+\b Add autogenerated instruction list back into the documentation.
+
+\b ELF: Fix segfault when generating stabs, and no symbols have been
+ defined.
+
+\b ELF: Experimental support for DWARF debugging information.
+
+\b New compile date and time standard macros.
+
+\b \c{%ifnum} now returns true for negative numbers.
+
+\b New \c{%iftoken} test for a single token.
+
+\b New \c{%ifempty} test for empty expansion.
+
+\b Add support for the \c{XSAVE} instruction group.
+
+\b Makefile for Netware/gcc.
+
+\b Fix issue with some warnings getting emitted way too many times.
+
+\b Autogenerated instruction list added to the documentation.
+
+
+\S{cl-2.01} Version 2.01
+
+\b Fix the handling of MMX registers with explicit \c{qword} tags on
+ memory (broken in 2.00 due to 64-bit changes.)
+
+\b Fix the PREFETCH instructions.
+
+\b Fix the documentation.
+
+\b Fix debugging info when using \c{-f elf}
+(backwards compatibility alias for \c{-f elf32}).
+
+\b Man pages for rdoff tools (from the Debian project.)
+
+\b ELF: handle large numbers of sections.
+
+\b Fix corrupt output when the optimizer runs out of passes.
+
+
+\S{cl-2.00} Version 2.00
+
+\b Added c99 data-type compliance.
+
+\b Added general x86-64 support.
+
+\b Added win64 (x86-64 COFF) output format.
+
+\b Added \c{__BITS__} standard macro.
+
+\b Renamed the \c{elf} output format to \c{elf32} for clarity.
+
+\b Added \c{elf64} and \c{macho} (MacOS X) output formats.
+
+\b Added Numeric constants in \c{dq} directive.
+
+\b Added \c{oword}, \c{do} and \c{reso} pseudo operands.
+
+\b Allow underscores in numbers.
+
+\b Added 8-, 16- and 128-bit floating-point formats.
+
+\b Added binary, octal and hexadecimal floating-point.
+
+\b Correct the generation of floating-point constants.
+
+\b Added floating-point option control.
+
+\b Added Infinity and NaN floating point support.
+
+\b Added ELF Symbol Visibility support.
+
+\b Added setting OSABI value in ELF header directive.
+
+\b Added Generate Makefile Dependencies option.
+
+\b Added Unlimited Optimization Passes option.
+
+\b Added \c{%IFN} and \c{%ELIFN} support.
+
+\b Added Logical Negation Operator.
+
+\b Enhanced Stack Relative Preprocessor Directives.
+
+\b Enhanced ELF Debug Formats.
+
+\b Enhanced Send Errors to a File option.
+
+\b Added SSSE3, SSE4.1, SSE4.2, SSE5 support.
+
+\b Added a large number of additional instructions.
+
+\b Significant performance improvements.
+
+\b \c{-w+warning} and \c{-w-warning} can now be written as -Wwarning and
+ -Wno-warning, respectively. See \k{opt-w}.
+
+\b Add \c{-w+error} to treat warnings as errors. See \k{opt-w}.
+
+\b Add \c{-w+all} and \c{-w-all} to enable or disable all suppressible
+ warnings. See \k{opt-w}.
+
+
+\H{cl-0.98.xx} NASM 0.98 Series
+
+The 0.98 series was the production versions of NASM from 1999 to 2007.
+
+
+\S{cl-0.98.39} Version 0.98.39
+
+\b fix buffer overflow
+
+\b fix outas86's \c{.bss} handling
+
+\b "make spotless" no longer deletes config.h.in.
+
+\b \c{%(el)if(n)idn} insensitivity to string quotes difference (#809300).
+
+\b (nasm.c)\c{__OUTPUT_FORMAT__} changed to string value instead of symbol.
+
+\S{cl-0.98.38} Version 0.98.38
+
+
+\b Add Makefile for 16-bit DOS binaries under OpenWatcom, and modify
+ \c{mkdep.pl} to be able to generate completely pathless dependencies, as
+ required by OpenWatcom wmake (it supports path searches, but not
+ explicit paths.)
+
+\b Fix the \c{STR} instruction.
+
+\b Fix the ELF output format, which was broken under certain
+ circumstances due to the addition of stabs support.
+
+\b Quick-fix Borland format debug-info for \c{-f obj}
+
+\b Fix for \c{%rep} with no arguments (#560568)
+
+\b Fix concatenation of preprocessor function call (#794686)
+
+\b Fix long label causes coredump (#677841)
+
+\b Use autoheader as well as autoconf to keep configure from generating
+ ridiculously long command lines.
+
+\b Make sure that all of the formats which support debugging output
+ actually will suppress debugging output when \c{-g} not specified.
+
+\S{cl-0.98.37} Version 0.98.37
+
+
+\b Paths given in \c{-I} switch searched for \c{incbin}-ed as
+ well as \c{%include}-ed files.
+
+\b Added stabs debugging for the ELF output format, patch from
+ Martin Wawro.
+
+\b Fix \c{output/outbin.c} to allow origin > 80000000h.
+
+\b Make \c{-U} switch work.
+
+\b Fix the use of relative offsets with explicit prefixes, e.g.
+\c{a32 loop foo}.
+
+\b Remove \c{backslash()}.
+
+\b Fix the \c{SMSW} and \c{SLDT} instructions.
+
+\b \c{-O2} and \c{-O3} are no longer aliases for \c{-O10} and \c{-O15}.
+If you mean the latter, please say so! :)
+
+\S{cl-0.98.36} Version 0.98.36
+
+
+\b Update rdoff - librarian/archiver - common rec - docs!
+
+\b Fix signed/unsigned problems.
+
+\b Fix \c{JMP FAR label} and \c{CALL FAR label}.
+
+\b Add new multisection support - map files - fix align bug
+
+\b Fix sysexit, movhps/movlps reg,reg bugs in insns.dat
+
+\b \c{Q} or \c{O} suffixes indicate octal
+
+\b Support Prescott new instructions (PNI).
+
+\b Cyrix \c{XSTORE} instruction.
+
+
+\S{cl-0.98.35} Version 0.98.35
+
+\b Fix build failure on 16-bit DOS (Makefile.bc3 workaround for compiler bug.)
+
+\b Fix dependencies and compiler warnings.
+
+\b Add "const" in a number of places.
+
+\b Add -X option to specify error reporting format (use -Xvc to
+ integrate with Microsoft Visual Studio.)
+
+\b Minor changes for code legibility.
+
+\b Drop use of tmpnam() in rdoff (security fix.)
+
+
+\S{cl-0.98.34} Version 0.98.34
+
+\b Correct additional address-size vs. operand-size confusions.
+
+\b Generate dependencies for all Makefiles automatically.
+
+\b Add support for unimplemented (but theoretically available)
+ registers such as tr0 and cr5. Segment registers 6 and 7 are called
+ segr6 and segr7 for the operations which they can be represented.
+
+\b Correct some disassembler bugs related to redundant address-size prefixes.
+ Some work still remains in this area.
+
+\b Correctly generate an error for things like "SEG eax".
+
+\b Add the JMPE instruction, enabled by "CPU IA64".
+
+\b Correct compilation on newer gcc/glibc platforms.
+
+\b Issue an error on things like "jmp far eax".
+
+
+\S{cl-0.98.33} Version 0.98.33
+
+\b New __NASM_PATCHLEVEL__ and __NASM_VERSION_ID__ standard macros to
+ round out the version-query macros. version.pl now understands
+ X.YYplWW or X.YY.ZZplWW as a version number, equivalent to
+ X.YY.ZZ.WW (or X.YY.0.WW, as appropriate).
+
+\b New keyword "strict" to disable the optimization of specific
+ operands.
+
+\b Fix the handing of size overrides with JMP instructions
+ (instructions such as "jmp dword foo".)
+
+\b Fix the handling of "ABSOLUTE label", where "label" points into a
+ relocatable segment.
+
+\b Fix OBJ output format with lots of externs.
+
+\b More documentation updates.
+
+\b Add -Ov option to get verbose information about optimizations.
+
+\b Undo a braindead change which broke \c{%elif} directives.
+
+\b Makefile updates.
+
+
+\S{cl-0.98.32} Version 0.98.32
+
+\b Fix NASM crashing when \c{%macro} directives were left unterminated.
+
+\b Lots of documentation updates.
+
+\b Complete rewrite of the PostScript/PDF documentation generator.
+
+\b The MS Visual C++ Makefile was updated and corrected.
+
+\b Recognize .rodata as a standard section name in ELF.
+
+\b Fix some obsolete Perl4-isms in Perl scripts.
+
+\b Fix configure.in to work with autoconf 2.5x.
+
+\b Fix a couple of "make cleaner" misses.
+
+\b Make the normal "./configure && make" work with Cygwin.
+
+
+\S{cl-0.98.31} Version 0.98.31
+
+\b Correctly build in a separate object directory again.
+
+\b Derive all references to the version number from the version file.
+
+\b New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.
+
+\b Lots of Makefile updates and bug fixes.
+
+\b New \c{%ifmacro} directive to test for multiline macros.
+
+\b Documentation updates.
+
+\b Fixes for 16-bit OBJ format output.
+
+\b Changed the NASM environment variable to NASMENV.
+
+
+\S{cl-0.98.30} Version 0.98.30
+
+\b Changed doc files a lot: completely removed old READMExx and
+ Wishlist files, incorporating all information in CHANGES and TODO.
+
+\b I waited a long time to rename zoutieee.c to (original) outieee.c
+
+\b moved all output modules to output/ subdirectory.
+
+\b Added 'make strip' target to strip debug info from nasm & ndisasm.
+
+\b Added INSTALL file with installation instructions.
+
+\b Added -v option description to nasm man.
+
+\b Added dist makefile target to produce source distributions.
+
+\b 16-bit support for ELF output format (GNU extension, but useful.)
+
+
+\S{cl-0.98.28} Version 0.98.28
+
+\b Fastcooked this for Debian's Woody release:
+Frank applied the INCBIN bug patch to 0.98.25alt and called
+it 0.98.28 to not confuse poor little apt-get.
+
+
+\S{cl-0.98.26} Version 0.98.26
+
+\b Reorganised files even better from 0.98.25alt
+
+
+\S{cl-0.98.25alt} Version 0.98.25alt
+
+\b Prettified the source tree. Moved files to more reasonable places.
+
+\b Added findleak.pl script to misc/ directory.
+
+\b Attempted to fix doc.
+
+
+\S{cl-0.98.25} Version 0.98.25
+
+\b Line continuation character \c{\\}.
+
+\b Docs inadvertantly reverted - "dos packaging".
+
+
+\S{cl-0.98.24p1} Version 0.98.24p1
+
+\b FIXME: Someone, document this please.
+
+
+\S{cl-0.98.24} Version 0.98.24
+
+\b Documentation - Ndisasm doc added to Nasm.doc.
+
+
+\S{cl-0.98.23} Version 0.98.23
+
+\b Attempted to remove rdoff version1
+
+\b Lino Mastrodomenico's patches to preproc.c (%$$ bug?).
+
+
+\S{cl-0.98.22} Version 0.98.22
+
+\b Update rdoff2 - attempt to remove v1.
+
+
+\S{cl-0.98.21} Version 0.98.21
+
+\b Optimization fixes.
+
+
+\S{cl-0.98.20} Version 0.98.20
+
+\b Optimization fixes.
+
+
+\S{cl-0.98.19} Version 0.98.19
+
+\b H. J. Lu's patch back out.
+
+
+\S{cl-0.98.18} Version 0.98.18
+
+\b Added ".rdata" to "-f win32".
+
+
+\S{cl-0.98.17} Version 0.98.17
+
+\b H. J. Lu's "bogus elf" patch. (Red Hat problem?)
+
+
+\S{cl-0.98.16} Version 0.98.16
+
+\b Fix whitespace before "[section ..." bug.
+
+
+\S{cl-0.98.15} Version 0.98.15
+
+\b Rdoff changes (?).
+
+\b Fix fixes to memory leaks.
+
+
+\S{cl-0.98.14} Version 0.98.14
+
+\b Fix memory leaks.
+
+
+\S{cl-0.98.13} Version 0.98.13
+
+\b There was no 0.98.13
+
+
+\S{cl-0.98.12} Version 0.98.12
+
+\b Update optimization (new function of "-O1")
+
+\b Changes to test/bintest.asm (?).
+
+
+\S{cl-0.98.11} Version 0.98.11
+
+\b Optimization changes.
+
+\b Ndisasm fixed.
+
+
+\S{cl-0.98.10} Version 0.98.10
+
+\b There was no 0.98.10
+
+
+\S{cl-0.98.09} Version 0.98.09
+
+\b Add multiple sections support to "-f bin".
+
+\b Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.
+
+\b Add "-v" as an alias to the "-r" switch.
+
+\b Remove "#ifdef" from Tasm compatibility options.
+
+\b Remove redundant size-overrides on "mov ds, ex", etc.
+
+\b Fixes to SSE2, other insns.dat (?).
+
+\b Enable uppercase "I" and "P" switches.
+
+\b Case insinsitive "seg" and "wrt".
+
+\b Update install.sh (?).
+
+\b Allocate tokens in blocks.
+
+\b Improve "invalid effective address" messages.
+
+
+\S{cl-0.98.08} Version 0.98.08
+
+\b Add "\c{%strlen}" and "\c{%substr}" macro operators
+
+\b Fixed broken c16.mac.
+
+\b Unterminated string error reported.
+
+\b Fixed bugs as per 0.98bf
+
+
+\S{cl-0.98.09b with John Coffman patches released 28-Oct-2001} Version 0.98.09b with John Coffman patches released 28-Oct-2001
+
+Changes from 0.98.07 release to 98.09b as of 28-Oct-2001
+
+\b More closely compatible with 0.98 when -O0 is implied
+or specified. Not strictly identical, since backward
+branches in range of short offsets are recognized, and signed
+byte values with no explicit size specification will be
+assembled as a single byte.
+
+\b More forgiving with the PUSH instruction. 0.98 requires
+a size to be specified always. 0.98.09b will imply the size
+from the current BITS setting (16 or 32).
+
+\b Changed definition of the optimization flag:
+
+\c -O0 strict two-pass assembly, JMP and Jcc are
+\c handled more like 0.98, except that back-
+\c ward JMPs are short, if possible.
+\c
+\c -O1 strict two-pass assembly, but forward
+\c branches are assembled with code guaranteed
+\c to reach; may produce larger code than
+\c -O0, but will produce successful assembly
+\c more often if branch offset sizes are not
+\c specified.
+\c
+\c -O2 multi-pass optimization, minimize branch
+\c offsets; also will minimize signed immed-
+\c iate bytes, overriding size specification.
+\c
+\c -O3 like -O2, but more passes taken, if needed
+
+
+\S{cl-0.98.07 released 01/28/01} Version 0.98.07 released 01/28/01
+
+\b Added Stepane Denis' SSE2 instructions to a *working*
+ version of the code - some earlier versions were based on
+ broken code - sorry 'bout that. version "0.98.07"
+
+\b Cosmetic modifications to nasm.c, nasm.h,
+ AUTHORS, MODIFIED
+
+
+\S{cl-0.98.06f released 01/18/01} Version 0.98.06f released 01/18/01
+
+
+\b Add "metalbrain"s jecxz bug fix in insns.dat
+
+\b Alter nasmdoc.src to match - version "0.98.06f"
+
+
+\S{cl-0.98.06e released 01/09/01} Version 0.98.06e released 01/09/01
+
+
+\b Removed the "outforms.h" file - it appears to be
+ someone's old backup of "outform.h". version "0.98.06e"
+
+\b fbk - finally added the fix for the "multiple %includes bug",
+ known since 7/27/99 - reported originally (?) and sent to
+ us by Austin Lunnen - he reports that John Fine had a fix
+ within the day. Here it is...
+
+\b Nelson Rush resigns from the group. Big thanks to Nelson for
+ his leadership and enthusiasm in getting these changes
+ incorporated into Nasm!
+
+\b fbk - [list +], [list -] directives - ineptly implemented, should
+ be re-written or removed, perhaps.
+
+\b Brian Raiter / fbk - "elfso bug" fix - applied to aoutb format
+ as well - testing might be desirable...
+
+\b James Seter - -postfix, -prefix command line switches.
+
+\b Yuri Zaporozhets - rdoff utility changes.
+
+
+\S{cl-0.98p1} Version 0.98p1
+
+\b GAS-like palign (Panos Minos)
+
+\b FIXME: Someone, fill this in with details
+
+
+\S{cl-0.98bf (bug-fixed)} Version 0.98bf (bug-fixed)
+
+\b Fixed - elf and aoutb bug - shared libraries
+ - multiple "%include" bug in "-f obj"
+ - jcxz, jecxz bug
+ - unrecognized option bug in ndisasm
+
+\S{cl-0.98.03 with John Coffman's changes released 27-Jul-2000} Version 0.98.03 with John Coffman's changes released 27-Jul-2000
+
+\b Added signed byte optimizations for the 0x81/0x83 class
+of instructions: ADC, ADD, AND, CMP, OR, SBB, SUB, XOR:
+when used as 'ADD reg16,imm' or 'ADD reg32,imm.' Also
+optimization of signed byte form of 'PUSH imm' and 'IMUL
+reg,imm'/'IMUL reg,reg,imm.' No size specification is needed.
+
+\b Added multi-pass JMP and Jcc offset optimization. Offsets
+on forward references will preferentially use the short form,
+without the need to code a specific size (short or near) for
+the branch. Added instructions for 'Jcc label' to use the
+form 'Jnotcc $+3/JMP label', in cases where a short offset
+is out of bounds. If compiling for a 386 or higher CPU, then
+the 386 form of Jcc will be used instead.
+
+\> This feature is controlled by a new command-line switch: "O",
+(upper case letter O). "-O0" reverts the assembler to no
+extra optimization passes, "-O1" allows up to 5 extra passes,
+and "-O2"(default), allows up to 10 extra optimization passes.
+
+\b Added a new directive: 'cpu XXX', where XXX is any of:
+8086, 186, 286, 386, 486, 586, pentium, 686, PPro, P2, P3 or
+Katmai. All are case insensitive. All instructions will
+be selected only if they apply to the selected cpu or lower.
+Corrected a couple of bugs in cpu-dependence in 'insns.dat'.
+
+\b Added to 'standard.mac', the "use16" and "use32" forms of
+the "bits 16/32" directive. This is nothing new, just conforms
+to a lot of other assemblers. (minor)
+
+\b Changed label allocation from 320/32 (10000 labels @ 200K+)
+to 32/37 (1000 labels); makes running under DOS much easier.
+Since additional label space is allocated dynamically, this
+should have no effect on large programs with lots of labels.
+The 37 is a prime, believed to be better for hashing. (minor)
+
+
+\S{cl-0.98.03} Version 0.98.03
+
+"Integrated patchfile 0.98-0.98.01. I call this version 0.98.03 for
+historical reasons: 0.98.02 was trashed." --John Coffman
+<johninsd@san.rr.com>, 27-Jul-2000
+
+\b Kendall Bennett's SciTech MGL changes
+
+\b Note that you must define "TASM_COMPAT" at compile-time
+to get the Tasm Ideal Mode compatibility.
+
+\b All changes can be compiled in and out using the TASM_COMPAT macros,
+and when compiled without TASM_COMPAT defined we get the exact same
+binary as the unmodified 0.98 sources.
+
+\b standard.mac, macros.c: Added macros to ignore TASM directives before
+first include
+
+\b nasm.h: Added extern declaration for tasm_compatible_mode
+
+\b nasm.c: Added global variable tasm_compatible_mode
+
+\b Added command line switch for TASM compatible mode (-t)
+
+\b Changed version command line to reflect when compiled with TASM additions
+
+\b Added response file processing to allow all arguments on a single
+line (response file is @resp rather than -@resp for NASM format).
+
+\b labels.c: Changes islocal() macro to support TASM style @@local labels.
+
+\b Added islocalchar() macro to support TASM style @@local labels.
+
+\b parser.c: Added support for TASM style memory references (ie: mov
+[DWORD eax],10 rather than the NASM style mov DWORD [eax],10).
+
+\b preproc.c: Added new directives, \c{%arg}, \c{%local}, \c{%stacksize} to directives
+table
+
+\b Added support for TASM style directives without a leading % symbol.
+
+\b Integrated a block of changes from Andrew Zabolotny <bit@eltech.ru>:
+
+\b A new keyword \c{%xdefine} and its case-insensitive counterpart \c{%ixdefine}.
+They work almost the same way as \c{%define} and \c{%idefine} but expand
+the definition immediately, not on the invocation. Something like a cross
+between \c{%define} and \c{%assign}. The "x" suffix stands for "eXpand", so
+"xdefine" can be deciphered as "expand-and-define". Thus you can do
+things like this:
+
+\c %assign ofs 0
+\c
+\c %macro arg 1
+\c %xdefine %1 dword [esp+ofs]
+\c %assign ofs ofs+4
+\c %endmacro
+
+\b Changed the place where the expansion of %$name macros are expanded.
+Now they are converted into ..@ctxnum.name form when detokenizing, so
+there are no quirks as before when using %$name arguments to macros,
+in macros etc. For example:
+
+\c %macro abc 1
+\c %define %1 hello
+\c %endm
+\c
+\c abc %$here
+\c %$here
+
+\> Now last line will be expanded into "hello" as expected. This also allows
+ for lots of goodies, a good example are extended "proc" macros included
+ in this archive.
+
+\b Added a check for "cstk" in smacro_defined() before calling get_ctx() -
+ this allows for things like:
+
+\c %ifdef %$abc
+\c %endif
+
+\> to work without warnings even in no context.
+
+\b Added a check for "cstk" in %if*ctx and %elif*ctx directives -
+ this allows to use \c{%ifctx} without excessive warnings. If there is
+ no active context, \c{%ifctx} goes through "false" branch.
+
+\b Removed "user error: " prefix with \c{%error} directive: it just clobbers the
+ output and has absolutely no functionality. Besides, this allows to write
+ macros that does not differ from built-in functions in any way.
+
+\b Added expansion of string that is output by \c{%error} directive. Now you
+ can do things like:
+
+\c %define hello(x) Hello, x!
+\c
+\c %define %$name andy
+\c %error "hello(%$name)"
+
+\> Same happened with \c{%include} directive.
+
+\b Now all directives that expect an identifier will try to expand and
+ concatenate everything without whitespaces in between before usage.
+ For example, with "unfixed" nasm the commands
+
+\c %define %$abc hello
+\c %define __%$abc goodbye
+\c __%$abc
+
+\> would produce "incorrect" output: last line will expand to
+
+\c hello goodbyehello
+
+\> Not quite what you expected, eh? :-) The answer is that preprocessor
+ treats the \c{%define} construct as if it would be
+
+\c %define __ %$abc goodbye
+
+\> (note the white space between __ and %$abc). After my "fix" it
+ will "correctly" expand into
+
+\c goodbye
+
+\> as expected. Note that I use quotes around words "correct", "incorrect"
+ etc because this is rather a feature not a bug; however current behaviour
+ is more logical (and allows more advanced macro usage :-).
+
+ Same change was applied to:
+ \c{%push},\c{%macro},\c{%imacro},\c{%define},\c{%idefine},\c{%xdefine},\c{%ixdefine},
+ \c{%assign},\c{%iassign},\c{%undef}
+
+\b A new directive [WARNING {+|-}warning-id] have been added. It works only
+ if the assembly phase is enabled (i.e. it doesn't work with nasm -e).
+
+\b A new warning type: macro-selfref. By default this warning is disabled;
+ when enabled NASM warns when a macro self-references itself; for example
+ the following source:
+
+\c [WARNING macro-selfref]
+\c
+\c %macro push 1-*
+\c %rep %0
+\c push %1
+\c %rotate 1
+\c %endrep
+\c %endmacro
+\c
+\c push eax,ebx,ecx
+
+\> will produce a warning, but if we remove the first line we won't see it
+ anymore (which is The Right Thing To Do {tm} IMHO since C preprocessor
+ eats such constructs without warnings at all).
+
+\b Added a "error" routine to preprocessor which always will set ERR_PASS1
+ bit in severity_code. This removes annoying repeated errors on first
+ and second passes from preprocessor.
+
+\b Added the %+ operator in single-line macros for concatenating two
+ identifiers. Usage example:
+
+\c %define _myfunc _otherfunc
+\c %define cextern(x) _ %+ x
+\c cextern (myfunc)
+
+\> After first expansion, third line will become "_myfunc". After this
+ expansion is performed again so it becomes "_otherunc".
+
+\b Now if preprocessor is in a non-emitting state, no warning or error
+ will be emitted. Example:
+
+\c %if 1
+\c mov eax,ebx
+\c %else
+\c put anything you want between these two brackets,
+\c even macro-parameter references %1 or local
+\c labels %$zz or macro-local labels %%zz - no
+\c warning will be emitted.
+\c %endif
+
+\b Context-local variables on expansion as a last resort are looked up
+ in outer contexts. For example, the following piece:
+
+\c %push outer
+\c %define %$a [esp]
+\c
+\c %push inner
+\c %$a
+\c %pop
+\c %pop
+
+\> will expand correctly the fourth line to [esp]; if we'll define another
+ %$a inside the "inner" context, it will take precedence over outer
+ definition. However, this modification has been applied only to
+ expand_smacro and not to smacro_define: as a consequence expansion
+ looks in outer contexts, but \c{%ifdef} won't look in outer contexts.
+
+\> This behaviour is needed because we don't want nested contexts to
+ act on already defined local macros. Example:
+
+\c %define %$arg1 [esp+4]
+\c test eax,eax
+\c if nz
+\c mov eax,%$arg1
+\c endif
+
+\> In this example the "if" mmacro enters into the "if" context, so %$arg1
+ is not valid anymore inside "if". Of course it could be worked around
+ by using explicitely %$$arg1 but this is ugly IMHO.
+
+\b Fixed memory leak in \c{%undef}. The origline wasn't freed before
+ exiting on success.
+
+\b Fixed trap in preprocessor when line expanded to empty set of tokens.
+ This happens, for example, in the following case:
+
+\c #define SOMETHING
+\c SOMETHING
+
+
+\S{cl-0.98} Version 0.98
+
+All changes since NASM 0.98p3 have been produced by H. Peter Anvin <hpa@zytor.com>.
+
+\b The documentation comment delimiter is \# not #.
+
+\b Allow EQU definitions to refer to external labels; reported by
+ Pedro Gimeno.
+
+\b Re-enable support for RDOFF v1; reported by Pedro Gimeno.
+
+\b Updated License file per OK from Simon and Julian.
+
+
+\S{cl-0.98p9} Version 0.98p9
+
+\b Update documentation (although the instruction set reference will
+ have to wait; I don't want to hold up the 0.98 release for it.)
+
+\b Verified that the NASM implementation of the PEXTRW and PMOVMSKB
+ instructions is correct. The encoding differs from what the Intel
+ manuals document, but the Pentium III behaviour matches NASM, not
+ the Intel manuals.
+
+\b Fix handling of implicit sizes in PSHUFW and PINSRW, reported by
+ Stefan Hoffmeister.
+
+\b Resurrect the -s option, which was removed when changing the
+ diagnostic output to stdout.
+
+
+\S{cl-0.98p8} Version 0.98p8
+
+\b Fix for "DB" when NASM is running on a bigendian machine.
+
+\b Invoke insns.pl once for each output script, making Makefile.in
+ legal for "make -j".
+
+\b Improve the Unix configure-based makefiles to make package
+ creation easier.
+
+\b Included an RPM .spec file for building RPM (RedHat Package Manager)
+ packages on Linux or Unix systems.
+
+\b Fix Makefile dependency problems.
+
+\b Change src/rdsrc.pl to include sectioning information in info
+ output; required for install-info to work.
+
+\b Updated the RDOFF distribution to version 2 from Jules; minor
+ massaging to make it compile in my environment.
+
+\b Split doc files that can be built by anyone with a Perl interpreter off
+ into a separate archive.
+
+\b "Dress rehearsal" release!
+
+
+\S{cl-0.98p7} Version 0.98p7
+
+\b Fixed opcodes with a third byte-sized immediate argument to not
+ complain if given "byte" on the immediate.
+
+\b Allow \c{%undef} to remove single-line macros with arguments. This
+ matches the behaviour of #undef in the C preprocessor.
+
+\b Allow -d, -u, -i and -p to be specified as -D, -U, -I and -P for
+ compatibility with most C compilers and preprocessors. This allows
+ Makefile options to be shared between cc and nasm, for example.
+
+\b Minor cleanups.
+
+\b Went through the list of Katmai instructions and hopefully fixed the
+ (rather few) mistakes in it.
+
+\b (Hopefully) fixed a number of disassembler bugs related to ambiguous
+ instructions (disambiguated by -p) and SSE instructions with REP.
+
+\b Fix for bug reported by Mark Junger: "call dword 0x12345678" should
+ work and may add an OSP (affected CALL, JMP, Jcc).
+
+\b Fix for environments when "stderr" isn't a compile-time constant.
+
+
+\S{cl-0.98p6} Version 0.98p6
+
+
+\b Took officially over coordination of the 0.98 release; so drop
+ the p3.x notation. Skipped p4 and p5 to avoid confusion with John
+ Fine's J4 and J5 releases.
+
+\b Update the documentation; however, it still doesn't include
+ documentation for the various new instructions. I somehow wonder if
+ it makes sense to have an instruction set reference in the assembler
+ manual when Intel et al have PDF versions of their manuals online.
+
+\b Recognize "idt" or "centaur" for the -p option to ndisasm.
+
+\b Changed error messages back to stderr where they belong, but add an
+ -E option to redirect them elsewhere (the DOS shell cannot redirect
+ stderr.)
+
+\b -M option to generate Makefile dependencies (based on code from Alex
+ Verstak.)
+
+\b \c{%undef} preprocessor directive, and -u option, that undefines a
+ single-line macro.
+
+\b OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from
+ Chuck Crayne.
+
+\b Various minor bugfixes (reported by):
+ - Dangling \c{%s} in preproc.c (Martin Junker)
+
+\b THERE ARE KNOWN BUGS IN SSE AND THE OTHER KATMAI INSTRUCTIONS. I am
+ on a trip and didn't bring the Katmai instruction reference, so I
+ can't work on them right now.
+
+\b Updated the License file per agreement with Simon and Jules to
+ include a GPL distribution clause.
+
+
+\S{cl-0.98p3.7} Version 0.98p3.7
+
+\b (Hopefully) fixed the canned Makefiles to include the outrdf2 and
+ zoutieee modules.
+
+\b Renamed changes.asm to changed.asm.
+
+
+\S{cl-0.98p3.6} Version 0.98p3.6
+
+\b Fixed a bunch of instructions that were added in 0.98p3.5 which had
+ memory operands, and the address-size prefix was missing from the
+ instruction pattern.
+
+
+\S{cl-0.98p3.5} Version 0.98p3.5
+
+\b Merged in changes from John S. Fine's 0.98-J5 release. John's based
+ 0.98-J5 on my 0.98p3.3 release; this merges the changes.
+
+\b Expanded the instructions flag field to a long so we can fit more
+ flags; mark SSE (KNI) and AMD or Katmai-specific instructions as
+ such.
+
+\b Fix the "PRIV" flag on a bunch of instructions, and create new
+ "PROT" flag for protected-mode-only instructions (orthogonal to if
+ the instruction is privileged!) and new "SMM" flag for SMM-only
+ instructions.
+
+\b Added AMD-only SYSCALL and SYSRET instructions.
+
+\b Make SSE actually work, and add new Katmai MMX instructions.
+
+\b Added a -p (preferred vendor) option to ndisasm so that it can
+ distinguish e.g. Cyrix opcodes also used in SSE. For example:
+
+\c ndisasm -p cyrix aliased.bin
+\c 00000000 670F514310 paddsiw mm0,[ebx+0x10]
+\c 00000005 670F514320 paddsiw mm0,[ebx+0x20]
+\c ndisasm -p intel aliased.bin
+\c 00000000 670F514310 sqrtps xmm0,[ebx+0x10]
+\c 00000005 670F514320 sqrtps xmm0,[ebx+0x20]
+
+\b Added a bunch of Cyrix-specific instructions.
+
+
+\S{cl-0.98p3.4} Version 0.98p3.4
+
+\b Made at least an attempt to modify all the additional Makefiles (in
+ the Mkfiles directory). I can't test it, but this was the best I
+ could do.
+
+\b DOS DJGPP+"Opus Make" Makefile from John S. Fine.
+
+\b changes.asm changes from John S. Fine.
+
+
+\S{cl-0.98p3.3} Version 0.98p3.3
+
+\b Patch from Conan Brink to allow nesting of \c{%rep} directives.
+
+\b If we're going to allow INT01 as an alias for INT1/ICEBP (one of
+ Jules 0.98p3 changes), then we should allow INT03 as an alias for INT3
+ as well.
+
+\b Updated changes.asm to include the latest changes.
+
+\b Tried to clean up the <CR>s that had snuck in from a DOS/Windows
+ environment into my Unix environment, and try to make sure than
+ DOS/Windows users get them back.
+
+\b We would silently generate broken tools if insns.dat wasn't sorted
+ properly. Change insns.pl so that the order doesn't matter.
+
+\b Fix bug in insns.pl (introduced by me) which would cause conditional
+ instructions to have an extra "cc" in disassembly, e.g. "jnz"
+ disassembled as "jccnz".
+
+
+\S{cl-0.98p3.2} Version 0.98p3.2
+
+\b Merged in John S. Fine's changes from his 0.98-J4 prerelease; see
+ http://www.csoft.net/cz/johnfine/
+
+\b Changed previous "spotless" Makefile target (appropriate for distribution)
+ to "distclean", and added "cleaner" target which is same as "clean"
+ except deletes files generated by Perl scripts; "spotless" is union.
+
+\b Removed BASIC programs from distribution. Get a Perl interpreter
+ instead (see below.)
+
+\b Calling this "pre-release 3.2" rather than "p3-hpa2" because of
+ John's contributions.
+
+\b Actually link in the IEEE output format (zoutieee.c); fix a bunch of
+ compiler warnings in that file. Note I don't know what IEEE output
+ is supposed to look like, so these changes were made "blind".
+
+
+\S{cl-0.98p3-hpa} Version 0.98p3-hpa
+
+\b Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
+ buildable version for Unix systems (Makefile.in updates, etc.)
+
+\b Changed insns.pl to create the instruction tables in nasm.h and
+ names.c, so that a new instruction can be added by adding it *only*
+ to insns.dat.
+
+\b Added the following new instructions: SYSENTER, SYSEXIT, FXSAVE,
+ FXRSTOR, UD1, UD2 (the latter two are two opcodes that Intel
+ guarantee will never be used; one of them is documented as UD2 in
+ Intel documentation, the other one just as "Undefined Opcode" --
+ calling it UD1 seemed to make sense.)
+
+\b MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10
+ characters long. Now MAX_SYMBOL is derived from insns.dat.
+
+\b A note on the BASIC programs included: forget them. insns.bas is
+ already out of date. Get yourself a Perl interpreter for your
+ platform of choice at
+ \W{http://www.cpan.org/ports/index.html}{http://www.cpan.org/ports/index.html}.
+
+
+\S{cl-0.98p3} Version 0.98 pre-release 3
+
+\b added response file support, improved command line handling, new layout
+help screen
+
+\b fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple of rdoff
+related bugs, updated Wishlist; 0.98 Prerelease 3.
+
+
+\S{cl-0.98p2} Version 0.98 pre-release 2
+
+\b fixed bug in outcoff.c to do with truncating section names longer
+than 8 characters, referencing beyond end of string; 0.98 pre-release 2
+
+
+\S{cl-0.98p1} Version 0.98 pre-release 1
+
+\b Fixed a bug whereby STRUC didn't work at all in RDF.
+
+\b Fixed a problem with group specification in PUBDEFs in OBJ.
+
+\b Improved ease of adding new output formats. Contribution due to
+Fox Cutter.
+
+\b Fixed a bug in relocations in the `bin' format: was showing up when
+a relocatable reference crossed an 8192-byte boundary in any output
+section.
+
+\b Fixed a bug in local labels: local-label lookups were inconsistent
+between passes one and two if an EQU occurred between the definition
+of a global label and the subsequent use of a local label local to
+that global.
+
+\b Fixed a seg-fault in the preprocessor (again) which happened when
+you use a blank line as the first line of a multi-line macro
+definition and then defined a label on the same line as a call to
+that macro.
+
+\b Fixed a stale-pointer bug in the handling of the NASM environment
+variable. Thanks to Thomas McWilliams.
+
+\b ELF had a hard limit on the number of sections which caused
+segfaults when transgressed. Fixed.
+
+\b Added ability for ndisasm to read from stdin by using `-' as the
+filename.
+
+\b ndisasm wasn't outputting the TO keyword. Fixed.
+
+\b Fixed error cascade on bogus expression in \c{%if} - an error in
+evaluation was causing the entire \c{%if} to be discarded, thus creating
+trouble later when the \c{%else} or \c{%endif} was encountered.
+
+\b Forward reference tracking was instruction-granular not operand-
+granular, which was causing 286-specific code to be generated
+needlessly on code of the form `shr word [forwardref],1'. Thanks to
+Jim Hague for sending a patch.
+
+\b All messages now appear on stdout, as sending them to stderr serves
+no useful purpose other than to make redirection difficult.
+
+\b Fixed the problem with EQUs pointing to an external symbol - this
+now generates an error message.
+
+\b Allowed multiple size prefixes to an operand, of which only the first
+is taken into account.
+
+\b Incorporated John Fine's changes, including fixes of a large number
+of preprocessor bugs, some small problems in OBJ, and a reworking of
+label handling to define labels before their line is assembled, rather
+than after.
+
+\b Reformatted a lot of the source code to be more readable. Included
+'coding.txt' as a guideline for how to format code for contributors.
+
+\b Stopped nested \c{%reps} causing a panic - they now cause a slightly more
+friendly error message instead.
+
+\b Fixed floating point constant problems (patch by Pedro Gimeno)
+
+\b Fixed the return value of insn_size() not being checked for -1, indicating
+an error.
+
+\b Incorporated 3Dnow! instructions.
+
+\b Fixed the 'mov eax, eax + ebx' bug.
+
+\b Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
+
+\b Incorporated John Fine's command line parsing changes
+
+\b Incorporated David Lindauer's OMF debug support
+
+\b Made changes for LCC 4.0 support (\c{__NASM_CDecl__}, removed register size
+specification warning when sizes agree).
+
+
+\H{cl-0.9x} NASM 0.9 Series
+
+Revisions before 0.98.
+
+
+\S{cl-0.97} Version 0.97 released December 1997
+
+\b This was entirely a bug-fix release to 0.96, which seems to have got
+cursed. Silly me.
+
+\b Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to
+fail. Caused by an error in the `MOV EAX,<segment>' support.
+
+\b ndisasm hung at EOF when compiled with lcc on Linux because lcc on
+Linux somehow breaks feof(). ndisasm now does not rely on feof().
+
+\b A heading in the documentation was missing due to a markup error in
+the indexing. Fixed.
+
+\b Fixed failure to update all pointers on realloc() within extended-
+operand code in parser.c. Was causing wrong behaviour and seg faults
+on lines such as `dd 0.0,0.0,0.0,0.0,...'
+
+\b Fixed a subtle preprocessor bug whereby invoking one multi-line
+macro on the first line of the expansion of another, when the second
+had been invoked with a label defined before it, didn't expand the
+inner macro.
+
+\b Added internal.doc back in to the distribution archives - it was
+missing in 0.96 *blush*
+
+\b Fixed bug causing 0.96 to be unable to assemble its own test files,
+specifically objtest.asm. *blush again*
+
+\b Fixed seg-faults and bogus error messages caused by mismatching
+\c{%rep} and \c{%endrep} within multi-line macro definitions.
+
+\b Fixed a problem with buffer overrun in OBJ, which was causing
+corruption at ends of long PUBDEF records.
+
+\b Separated DOS archives into main-program and documentation to reduce
+download size.
+
+
+\S{cl-0.96} Version 0.96 released November 1997
+
+\b Fixed a bug whereby, if `nasm sourcefile' would cause a filename
+collision warning and put output into `nasm.out', then `nasm
+sourcefile -o outputfile' still gave the warning even though the
+`-o' was honoured.
+Fixed name pollution under Digital UNIX: one of its header files
+defined R_SP, which broke the enum in nasm.h.
+
+\b Fixed minor instruction table problems: FUCOM and FUCOMP didn't have
+two-operand forms; NDISASM didn't recognise the longer register
+forms of PUSH and POP (eg FF F3 for PUSH BX); TEST mem,imm32 was
+flagged as undocumented; the 32-bit forms of CMOV had 16-bit operand
+size prefixes; `AAD imm' and `AAM imm' are no longer flagged as
+undocumented because the Intel Architecture reference documents
+them.
+
+\b Fixed a problem with the local-label mechanism, whereby strange
+types of symbol (EQUs, auto-defined OBJ segment base symbols)
+interfered with the `previous global label' value and screwed up
+local labels.
+
+\b Fixed a bug whereby the stub preprocessor didn't communicate with
+the listing file generator, so that the -a and -l options in
+conjunction would produce a useless listing file.
+
+\b Merged `os2' object file format back into `obj', after discovering
+that `obj' _also_ shouldn't have a link pass separator in a module
+containing a non-trivial MODEND. Flat segments are now declared
+using the FLAT attribute. `os2' is no longer a valid object format
+name: use `obj'.
+
+\b Removed the fixed-size temporary storage in the evaluator. Very very
+long expressions (like `mov ax,1+1+1+1+...' for two hundred 1s or
+so) should now no longer crash NASM.
+
+\b Fixed a bug involving segfaults on disassembly of MMX instructions,
+by changing the meaning of one of the operand-type flags in nasm.h.
+This may cause other apparently unrelated MMX problems; it needs to
+be tested thoroughly.
+
+\b Fixed some buffer overrun problems with large OBJ output files.
+Thanks to DJ Delorie for the bug report and fix.
+
+\b Made preprocess-only mode actually listen to the \c{%line} markers as it
+prints them, so that it can report errors more sanely.
+
+\b Re-designed the evaluator to keep more sensible track of expressions
+involving forward references: can now cope with previously-nightmare
+situations such as:
+
+\c mov ax,foo | bar
+\c foo equ 1
+\c bar equ 2
+
+\b Added the ALIGN and ALIGNB standard macros.
+
+\b Added PIC support in ELF: use of WRT to obtain the four extra
+relocation types needed.
+
+\b Added the ability for output file formats to define their own
+extensions to the GLOBAL, COMMON and EXTERN directives.
+
+\b Implemented common-variable alignment, and global-symbol type and
+size declarations, in ELF.
+
+\b Implemented NEAR and FAR keywords for common variables, plus
+far-common element size specification, in OBJ.
+
+\b Added a feature whereby EXTERNs and COMMONs in OBJ can be given a
+default WRT specification (either a segment or a group).
+
+\b Transformed the Unix NASM archive into an auto-configuring package.
+
+\b Added a sanity-check for people applying SEG to things which are
+already segment bases: this previously went unnoticed by the SEG
+processing and caused OBJ-driver panics later.
+
+\b Added the ability, in OBJ format, to deal with `MOV EAX,<segment>'
+type references: OBJ doesn't directly support dword-size segment
+base fixups, but as long as the low two bytes of the constant term
+are zero, a word-size fixup can be generated instead and it will
+work.
+
+\b Added the ability to specify sections' alignment requirements in
+Win32 object files and pure binary files.
+
+\b Added preprocess-time expression evaluation: the \c{%assign} (and
+\c{%iassign}) directive and the bare \c{%if} (and \c{%elif}) conditional. Added
+relational operators to the evaluator, for use only in \c{%if}
+constructs: the standard relationals = < > <= >= <> (and C-like
+synonyms == and !=) plus low-precedence logical operators &&, ^^ and
+||.
+
+\b Added a preprocessor repeat construct: \c{%rep} / \c{%exitrep} / \c{%endrep}.
+
+\b Added the __FILE__ and __LINE__ standard macros.
+
+\b Added a sanity check for number constants being greater than
+0xFFFFFFFF. The warning can be disabled.
+
+\b Added the %0 token whereby a variadic multi-line macro can tell how
+many parameters it's been given in a specific invocation.
+
+\b Added \c{%rotate}, allowing multi-line macro parameters to be cycled.
+
+\b Added the `*' option for the maximum parameter count on multi-line
+macros, allowing them to take arbitrarily many parameters.
+
+\b Added the ability for the user-level forms of EXTERN, GLOBAL and
+COMMON to take more than one argument.
+
+\b Added the IMPORT and EXPORT directives in OBJ format, to deal with
+Windows DLLs.
+
+\b Added some more preprocessor \c{%if} constructs: \c{%ifidn} / \c{%ifidni} (exact
+textual identity), and \c{%ifid} / \c{%ifnum} / \c{%ifstr} (token type testing).
+
+\b Added the ability to distinguish SHL AX,1 (the 8086 version) from
+SHL AX,BYTE 1 (the 286-and-upwards version whose constant happens to
+be 1).
+
+\b Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete
+with PIC shared library features.
+
+\b Changed NASM's idiosyncratic handling of FCLEX, FDISI, FENI, FINIT,
+FSAVE, FSTCW, FSTENV, and FSTSW to bring it into line with the
+otherwise accepted standard. The previous behaviour, though it was a
+deliberate feature, was a deliberate feature based on a
+misunderstanding. Apologies for the inconvenience.
+
+\b Improved the flexibility of ABSOLUTE: you can now give it an
+expression rather than being restricted to a constant, and it can
+take relocatable arguments as well.
+
+\b Added the ability for a variable to be declared as EXTERN multiple
+times, and the subsequent definitions are just ignored.
+
+\b We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be
+alone on a line (without a following instruction).
+
+\b Improved sanity checks on whether the arguments to EXTERN, GLOBAL
+and COMMON are valid identifiers.
+
+\b Added misc/exebin.mac to allow direct generation of .EXE files by
+hacking up an EXE header using DB and DW; also added test/binexe.asm
+to demonstrate the use of this. Thanks to Yann Guidon for
+contributing the EXE header code.
+
+\b ndisasm forgot to check whether the input file had been successfully
+opened. Now it does. Doh!
+
+\b Added the Cyrix extensions to the MMX instruction set.
+
+\b Added a hinting mechanism to allow [EAX+EBX] and [EBX+EAX] to be
+assembled differently. This is important since [ESI+EBP] and
+[EBP+ESI] have different default base segment registers.
+
+\b Added support for the PharLap OMF extension for 4096-byte segment
+alignment.
+
+
+\S{cl-0.95 released July 1997} Version 0.95 released July 1997
+
+\b Fixed yet another ELF bug. This one manifested if the user relied on
+the default segment, and attempted to define global symbols without
+first explicitly declaring the target segment.
+
+\b Added makefiles (for NASM and the RDF tools) to build Win32 console
+apps under Symantec C++. Donated by Mark Junker.
+
+\b Added `macros.bas' and `insns.bas', QBasic versions of the Perl
+scripts that convert `standard.mac' to `macros.c' and convert
+`insns.dat' to `insnsa.c' and `insnsd.c'. Also thanks to Mark
+Junker.
+
+\b Changed the diassembled forms of the conditional instructions so
+that JB is now emitted as JC, and other similar changes. Suggested
+list by Ulrich Doewich.
+
+\b Added `@' to the list of valid characters to begin an identifier
+with.
+
+\b Documentary changes, notably the addition of the `Common Problems'
+section in nasm.doc.
+
+\b Fixed a bug relating to 32-bit PC-relative fixups in OBJ.
+
+\b Fixed a bug in perm_copy() in labels.c which was causing exceptions
+in cleanup_labels() on some systems.
+
+\b Positivity sanity check in TIMES argument changed from a warning to
+an error following a further complaint.
+
+\b Changed the acceptable limits on byte and word operands to allow
+things like `~10111001b' to work.
+
+\b Fixed a major problem in the preprocessor which caused seg-faults if
+macro definitions contained blank lines or comment-only lines.
+
+\b Fixed inadequate error checking on the commas separating the
+arguments to `db', `dw' etc.
+
+\b Fixed a crippling bug in the handling of macros with operand counts
+defined with a `+' modifier.
+
+\b Fixed a bug whereby object file formats which stored the input file
+name in the output file (such as OBJ and COFF) weren't doing so
+correctly when the output file name was specified on the command
+line.
+
+\b Removed [INC] and [INCLUDE] support for good, since they were
+obsolete anyway.
+
+\b Fixed a bug in OBJ which caused all fixups to be output in 16-bit
+(old-format) FIXUPP records, rather than putting the 32-bit ones in
+FIXUPP32 (new-format) records.
+
+\b Added, tentatively, OS/2 object file support (as a minor variant on
+OBJ).
+
+\b Updates to Fox Cutter's Borland C makefile, Makefile.bc2.
+
+\b Removed a spurious second fclose() on the output file.
+
+\b Added the `-s' command line option to redirect all messages which
+would go to stderr (errors, help text) to stdout instead.
+
+\b Added the `-w' command line option to selectively suppress some
+classes of assembly warning messages.
+
+\b Added the `-p' pre-include and `-d' pre-define command-line options.
+
+\b Added an include file search path: the `-i' command line option.
+
+\b Fixed a silly little preprocessor bug whereby starting a line with a
+`%!' environment-variable reference caused an `unknown directive'
+error.
+
+\b Added the long-awaited listing file support: the `-l' command line
+option.
+
+\b Fixed a problem with OBJ format whereby, in the absence of any
+explicit segment definition, non-global symbols declared in the
+implicit default segment generated spurious EXTDEF records in the
+output.
+
+\b Added the NASM environment variable.
+
+\b From this version forward, Win32 console-mode binaries will be
+included in the DOS distribution in addition to the 16-bit binaries.
+Added Makefile.vc for this purpose.
+
+\b Added `return 0;' to test/objlink.c to prevent compiler warnings.
+
+\b Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
+
+\b Added an alternative memory-reference syntax in which prefixing an
+operand with `&' is equivalent to enclosing it in square brackets,
+at the request of Fox Cutter.
+
+\b Errors in pass two now cause the program to return a non-zero error
+code, which they didn't before.
+
+\b Fixed the single-line macro cycle detection, which didn't work at
+all on macros with no parameters (caused an infinite loop). Also
+changed the behaviour of single-line macro cycle detection to work
+like cpp, so that macros like `extrn' as given in the documentation
+can be implemented.
+
+\b Fixed the implementation of WRT, which was too restrictive in that
+you couldn't do `mov ax,[di+abc wrt dgroup]' because (di+abc) wasn't
+a relocatable reference.
+
+
+\S{cl-0.94 released April 1997} Version 0.94 released April 1997
+
+
+\b Major item: added the macro processor.
+
+\b Added undocumented instructions SMI, IBTS, XBTS and LOADALL286. Also
+reorganised CMPXCHG instruction into early-486 and Pentium forms.
+Thanks to Thobias Jones for the information.
+
+\b Fixed two more stupid bugs in ELF, which were causing `ld' to
+continue to seg-fault in a lot of non-trivial cases.
+
+\b Fixed a seg-fault in the label manager.
+
+\b Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which is
+the only option for BCD loads/stores in any case.
+
+\b Ensured FLDCW, FSTCW and FSTSW can cope with the WORD keyword, if
+anyone bothers to provide it. Previously they complained unless no
+keyword at all was present.
+
+\b Some forms of FDIV/FDIVR and FSUB/FSUBR were still inverted: a
+vestige of a bug that I thought had been fixed in 0.92. This was
+fixed, hopefully for good this time...
+
+\b Another minor phase error (insofar as a phase error can _ever_ be
+minor) fixed, this one occurring in code of the form
+
+\c rol ax,forward_reference
+\c forward_reference equ 1
+
+\b The number supplied to TIMES is now sanity-checked for positivity,
+and also may be greater than 64K (which previously didn't work on
+16-bit systems).
+
+\b Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.
+
+\b Added the INCBIN pseudo-opcode.
+
+\b Due to the advent of the preprocessor, the [INCLUDE] and [INC]
+directives have become obsolete. They are still supported in this
+version, with a warning, but won't be in the next.
+
+\b Fixed a bug in OBJ format, which caused incorrect object records to
+be output when absolute labels were made global.
+
+\b Updates to RDOFF subdirectory, and changes to outrdf.c.
+
+
+\S{cl-0.93 released January 1997} Version 0.93 released January 1997
+
+This release went out in a great hurry after semi-crippling bugs
+were found in 0.92.
+
+\b Really \e{did} fix the stack overflows this time. *blush*
+
+\b Had problems with EA instruction sizes changing between passes, when
+an offset contained a forward reference and so 4 bytes were
+allocated for the offset in pass one; by pass two the symbol had
+been defined and happened to be a small absolute value, so only 1
+byte got allocated, causing instruction size mismatch between passes
+and hence incorrect address calculations. Fixed.
+
+\b Stupid bug in the revised ELF section generation fixed (associated
+string-table section for .symtab was hard-coded as 7, even when this
+didn't fit with the real section table). Was causing `ld' to
+seg-fault under Linux.
+
+\b Included a new Borland C makefile, Makefile.bc2, donated by Fox
+Cutter <lmb@comtch.iea.com>.
+
+
+\S{cl-0.92 released January 1997} Version 0.92 released January 1997
+
+\b The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was
+fixed. This also affected the LCC driver.
+
+\b Fixed a bug regarding 32-bit effective addresses of the form
+\c{[other_register+ESP]}.
+
+\b Documentary changes, notably documentation of the fact that Borland
+Win32 compilers use `obj' rather than `win32' object format.
+
+\b Fixed the COMENT record in OBJ files, which was formatted
+incorrectly.
+
+\b Fixed a bug causing segfaults in large RDF files.
+
+\b OBJ format now strips initial periods from segment and group
+definitions, in order to avoid complications with the local label
+syntax.
+
+\b Fixed a bug in disassembling far calls and jumps in NDISASM.
+
+\b Added support for user-defined sections in COFF and ELF files.
+
+\b Compiled the DOS binaries with a sensible amount of stack, to
+prevent stack overflows on any arithmetic expression containing
+parentheses.
+
+\b Fixed a bug in handling of files that do not terminate in a newline.
+
+
+\S{cl-0.91 released November 1996} Version 0.91 released November 1996
+
+\b Loads of bug fixes.
+
+\b Support for RDF added.
+
+\b Support for DBG debugging format added.
+
+\b Support for 32-bit extensions to Microsoft OBJ format added.
+
+\b Revised for Borland C: some variable names changed, makefile added.
+
+\b LCC support revised to actually work.
+
+\b JMP/CALL NEAR/FAR notation added.
+
+\b `a16', `o16', `a32' and `o32' prefixes added.
+
+\b Range checking on short jumps implemented.
+
+\b MMX instruction support added.
+
+\b Negative floating point constant support added.
+
+\b Memory handling improved to bypass 64K barrier under DOS.
+
+\b \c{$} prefix to force treatment of reserved words as identifiers added.
+
+\b Default-size mechanism for object formats added.
+
+\b Compile-time configurability added.
+
+\b \c{#}, \c{@}, \c{~} and c\{?} are now valid characters in labels.
+
+\b \c{-e} and \c{-k} options in NDISASM added.
+
+
+\S{cl-0.90 released October 1996} Version 0.90 released October 1996
+
+First release version. First support for object file output. Other
+changes from previous version (0.3x) too numerous to document.
diff --git a/doc/findfont.ph b/doc/findfont.ph
new file mode 100644
index 00000000..60047b84
--- /dev/null
+++ b/doc/findfont.ph
@@ -0,0 +1,180 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Try our best to find a specific PostScipt font in the system.
+# We need to find the font files so we can extract the metrics.
+# Sadly there isn't any reasonable Perl module to do this for us,
+# as far as I can tell.
+#
+
+use strict;
+use File::Spec;
+use File::Find;
+
+require 'afmmetrics.ph';
+require 'ttfmetrics.ph';
+
+my %font_info_hash = ();
+my $fonts_scanned = 0;
+my %prefs = { 'otf' => 1, 'ttf' => 2, 'pfa' => 3, 'pfb' => 4 };
+
+sub add_file_to_font_hash($) {
+ my($filename) = @_;
+
+ return unless ( -f $filename );
+ return unless ( $filename =~ /^(.*)\.([[:alnum:]]+)$/ );
+
+ my $filestem = $1;
+ my $fonttype = $2;
+ my $fontdata;
+
+ if ( $filename =~ /\.(otf|ttf)$/i ) {
+ $fontdata = parse_ttf_file($filename);
+ } elsif ( $filename =~ /\.(pfa|pfb)$/i ) {
+ if ( -f "${filestem}.afm" ) {
+ $fontdata = parse_afm_file($filestem, $fonttype);
+ }
+ }
+
+ return unless (defined($fontdata));
+
+ my $oldinfo = $font_info_hash{$fontdata->{name}};
+
+ if (!defined($oldinfo) ||
+ $prefs{$fontdata->{type}} < $prefs{$oldinfo->{type}}) {
+ $font_info_hash{$fontdata->{name}} = $fontdata;
+ }
+}
+
+my $win32_ok = eval {
+ require Win32::TieRegistry;
+ Win32::TieRegistry->import();
+ 1;
+};
+
+# Based on Font::TTF::Win32 by
+# Martin Hosken <http://scripts.sil.org/FontUtils>.
+# LICENSING
+#
+# Copyright (c) 1998-2014, SIL International (http://www.sil.org)
+#
+# This module is released under the terms of the Artistic License 2.0.
+# For details, see the full text of the license in the file LICENSE.
+sub scanfonts_win32() {
+ return unless ($win32_ok);
+
+ my $Reg = $::Registry->Open('', {Access=>'KEY_READ', Delimiter=>'/'});
+ my $fd;
+ foreach my $win ('Windows NT', 'Windows') {
+ $fd = $Reg->{"HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/$win/CurrentVersion/Fonts"};
+ last if (defined($fd));
+ }
+ return unless (defined($fd));
+
+ foreach my $font (keys(%$fd)) {
+ my($fname, $ftype) = ($font =~ m:^/(.+?)(| \([^\(\)]+\))$:);
+ next unless ($ftype =~ / \((TrueType|OpenType)\)$/);
+ my $file = File::Spec->rel2abs($fd->{$font}, $ENV{'windir'}.'\\fonts');
+ add_file_to_font_hash($file);
+ }
+}
+
+sub font_search_file {
+ add_file_to_font_hash($_);
+}
+
+sub findfont($) {
+ my($fontname) = @_;
+ my $win32 = eval {
+ require Font::TTF::Win32;
+ Font::TTF::Win32->import();
+ 1;
+ };
+ my($file, $psname, $fontdata);
+
+ if (exists($font_info_hash{$fontname})) {
+ return $font_info_hash{$fontname};
+ }
+
+ # Are we on a system that uses fontconfig?
+ # NOTE: use a single string for the command here, or this
+ # script dies horribly on Windows, even though this isn't really
+ # applicable there...
+ if (open(my $fh, '-|',
+ "fc-match -f \"%{file}\\n%{postscriptname}\\n\" ".
+ "\" : postscriptname=$fontname\"")) {
+ chomp($file = <$fh>);
+ chomp($psname = <$fh>);
+ close($fh);
+ if ( -f $file ) {
+ if ($psname eq $fontname) {
+ add_file_to_font_hash($file);
+ }
+ if (!exists($font_info_hash{$fontname})) {
+ $font_info_hash{$fontname} = undef;
+ }
+ return $font_info_hash{$fontname};
+ }
+ }
+
+ if (exists($font_info_hash{$fontname})) {
+ return $font_info_hash{$fontname};
+ } elsif ($fonts_scanned >= 1) {
+ return $font_info_hash{$fontname} = undef;
+ }
+
+ scanfonts_win32();
+ $fonts_scanned = 1;
+
+ if (exists($font_info_hash{$fontname})) {
+ return $font_info_hash{$fontname};
+ } elsif ($fonts_scanned >= 2) {
+ return $font_info_hash{$fontname} = undef;
+ }
+
+ # Search a set of possible locations for a file, from a few different
+ # systems...
+ my @dirs = ('fonts', '/usr/share/fonts', '/usr/lib/fonts', '/Library/Fonts');
+ push @dirs, $ENV{'windir'}.'\\fonts' if (defined $ENV{'windir'});
+ push @dirs, $ENV{'HOME'}.'/.fonts', $ENV{'HOME'}.'/Library/Fonts'
+ if (defined $ENV{'HOME'});
+
+ find({wanted => \&font_search_file, follow=>1, no_chdir=>1}, @dirs);
+ $fonts_scanned = 2;
+
+ return $font_info_hash{$fontname};
+}
+
+1;
diff --git a/doc/genps.pl b/doc/genps.pl
new file mode 100755
index 00000000..4758bb9d
--- /dev/null
+++ b/doc/genps.pl
@@ -0,0 +1,1294 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Format the documentation as PostScript
+#
+
+use File::Spec;
+
+require 'psfonts.ph'; # The fonts we want to use
+require 'pswidth.ph'; # PostScript string width
+require 'findfont.ph'; # Find fonts in the system
+
+#
+# Document formatting parameters
+#
+%psconf = (
+ pagewidth => 595, # Page width in PostScript points
+ pageheight => 792, # Page height in PostScript points
+ lmarg => 72*1.25, # Left margin in PostScript points
+ rmarg => 72, # Right margin in PostScript points
+ topmarg => 72, # Top margin in PostScript points
+ botmarg => 72, # Bottom margin in PostScript points
+ plmarg => 72*0.25, # Page number position relative to left margin
+ prmarg => 0, # Page number position relative to right margin
+ pymarg => 24, # Page number position relative to bot margin
+ startcopyright => 75, # How much above the bottom margin is the
+ # copyright notice stuff
+ bulladj => 12, # How much to indent a bullet/indented paragraph
+ tocind => 12, # TOC indentation per level
+ tocpnz => 24, # Width of TOC page number only zone
+ tocdots => 8, # Spacing between TOC dots
+ idxspace => 24, # Minimum space between index title and pg#
+ idxindent => 24, # How much to indent a subindex entry
+ idxgutter => 24, # Space between index columns
+ idxcolumns => 2, # Number of index columns
+
+ paraskip => 6, # Space between paragraphs
+ chapstart => 30, # Space before a chapter heading
+ chapskip => 24, # Space after a chapter heading
+ tocskip => 6, # Space between TOC entries
+ );
+
+%psbool = (
+ colorlinks => 0, # Set links in blue rather than black
+ );
+
+# Known paper sizes
+%papersizes = (
+ 'a5' => [421, 595], # ISO half paper size
+ 'b5' => [501, 709], # ISO small paper size
+ 'a4' => [595, 842], # ISO standard paper size
+ 'letter' => [612, 792], # US common paper size
+ 'pa4' => [595, 792], # Compromise ("portable a4")
+ 'b4' => [709,1002], # ISO intermediate paper size
+ 'legal' => [612,1008], # US intermediate paper size
+ 'a3' => [842,1190], # ISO double paper size
+ '11x17' => [792,1224], # US double paper size
+ );
+
+# Canned header file
+$headps = 'head.ps';
+
+# Directories
+$fontsdir = 'fonts';
+$epsdir = File::Spec->curdir();
+
+#
+# Parse the command line
+#
+undef $input;
+while ( $arg = shift(@ARGV) ) {
+ if ( $arg =~ /^\-(|no\-)(.*)$/ ) {
+ $parm = $2;
+ $true = ($1 eq '') ? 1 : 0;
+ if ( $true && defined($papersizes{$parm}) ) {
+ $psconf{pagewidth} = $papersizes{$parm}->[0];
+ $psconf{pageheight} = $papersizes{$parm}->[1];
+ } elsif ( defined($psbool{$parm}) ) {
+ $psbool{$parm} = $true;
+ } elsif ( $true && defined($psconf{$parm}) ) {
+ $psconf{$parm} = shift(@ARGV);
+ } elsif ( $true && $parm =~ /^(title|subtitle|year|author|license)$/ ) {
+ $metadata{$parm} = shift(@ARGV);
+ } elsif ( $true && $parm eq 'fontsdir' ) {
+ $fontsdir = shift(@ARGV);
+ } elsif ( $true && $parm eq 'epsdir' ) {
+ $epsdir = shift(@ARGV);
+ } elsif ( $true && $parm eq 'headps' ) {
+ $headps = shift(@ARGV);
+ } else {
+ die "$0: Unknown option: $arg\n";
+ }
+ } else {
+ $input = $arg;
+ }
+}
+
+# Configure post-paragraph skips for each kind of paragraph
+# (subject to modification above)
+%skiparray = ('chap' => $psconf{chapskip},
+ 'appn' => $psconf{chapstart},
+ 'head' => $psconf{paraskip},
+ 'subh' => $psconf{paraskip},
+ 'norm' => $psconf{paraskip},
+ 'bull' => $psconf{paraskip},
+ 'indt' => $psconf{paraskip},
+ 'bquo' => $psconf{paraskip},
+ 'code' => $psconf{paraskip},
+ 'toc0' => $psconf{tocskip},
+ 'toc1' => $psconf{tocskip},
+ 'toc2' => $psconf{tocskip}
+ );
+
+# Read the font metrics files, and update @AllFonts
+# Get the list of fonts used
+%ps_all_fonts = ();
+%ps_font_subst = ();
+foreach my $fset ( @AllFonts ) {
+ foreach my $font ( @{$fset->{fonts}} ) {
+ my $fdata;
+ my @flist = @{$font->[1]};
+ my $fname;
+ while (defined($fname = shift(@flist))) {
+ $fdata = findfont($fname);
+ last if (defined($fdata));
+ }
+ if (!defined($fdata)) {
+ die "$infile: no font found of: ".
+ join(', ', @{$font->[1]}), "\n".
+ "Install one of these fonts or update psfonts.ph\n";
+ }
+ $ps_all_fonts{$fname} = $fdata;
+ $font->[1] = $fdata;
+ }
+}
+
+# Custom encoding vector. This is basically the same as
+# ISOLatin1Encoding (a level 2 feature, so we dont want to use it),
+# but with the "naked" accents at \200-\237 moved to the \000-\037
+# range (ASCII control characters), and a few extra characters thrown
+# in. It is basically a modified Windows 1252 codepage, minus, for
+# now, the euro sign (\200 is reserved for euro.)
+
+@NASMEncoding =
+(
+ undef, undef, undef, undef, undef, undef, undef, undef, undef, undef,
+ undef, undef, undef, undef, undef, undef, 'dotlessi', 'grave',
+ 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+ 'dieresis', undef, 'ring', 'cedilla', undef, 'hungarumlaut',
+ 'ogonek', 'caron', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'minus', 'period',
+ 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six',
+ 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal',
+ 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+ 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e',
+ 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', undef, undef, undef, 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'dbldagger', 'circumflex',
+ 'perthousand', 'Scaron', 'guilsinglleft', 'OE', undef, 'Zcaron',
+ undef, undef, 'grave', 'quotesingle', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark',
+ 'scaron', 'guilsignlright', 'oe', undef, 'zcaron', 'Ydieresis',
+ 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen',
+ 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine',
+ 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu',
+ 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
+ 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf',
+ 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex',
+ 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute',
+ 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex',
+ 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex',
+ 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute',
+ 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring',
+ 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde',
+ 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute',
+ 'thorn', 'ydieresis'
+);
+
+# Name-to-byte lookup hash
+%charcode = ();
+for ( $i = 0 ; $i < 256 ; $i++ ) {
+ $charcode{$NASMEncoding[$i]} = chr($i);
+}
+
+#
+# First, format the stuff coming from the front end into
+# a cleaner representation
+#
+if ( defined($input) ) {
+ open(PARAS, '<', $input) or
+ die "$0: cannot open $input: $!\n";
+} else {
+ # stdin
+ open(PARAS, '<-') or die "$0: $!\n";
+}
+while ( defined($line = <PARAS>) ) {
+ chomp $line;
+ $data = <PARAS>;
+ chomp $data;
+ if ( $line =~ /^meta :(.*)$/ ) {
+ $metakey = $1;
+ $metadata{$metakey} = $data;
+ } elsif ( $line =~ /^indx :(.*)$/ ) {
+ $ixentry = $1;
+ push(@ixentries, $ixentry);
+ $ixterms{$ixentry} = [split(/\037/, $data)];
+ # Look for commas. This is easier done on the string
+ # representation, so do it now.
+ if ( $data =~ /^(.*)\,\037sp\037/ ) {
+ $ixprefix = $1;
+ $ixprefix =~ s/\037n $//; # Discard possible font change at end
+ $ixhasprefix{$ixentry} = $ixprefix;
+ if ( !$ixprefixes{$ixprefix} ) {
+ $ixcommafirst{$ixentry}++;
+ }
+ $ixprefixes{$ixprefix}++;
+ } else {
+ # A complete term can also be used as a prefix
+ $ixprefixes{$data}++;
+ }
+ } else {
+ push(@ptypes, $line);
+ push(@paras, [split(/\037/, $data)]);
+ }
+}
+close(PARAS);
+
+#
+# Convert an integer to a chosen base
+#
+sub int2base($$) {
+ my($i,$b) = @_;
+ my($s) = '';
+ my($n) = '';
+ my($z) = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ return '0' if ($i == 0);
+ if ( $i < 0 ) { $n = '-'; $i = -$i; }
+ while ( $i ) {
+ $s = substr($z,$i%$b,1) . $s;
+ $i = int($i/$b);
+ }
+ return $n.$s;
+}
+
+#
+# Convert a string to a rendering array
+#
+sub string2array($)
+{
+ my($s) = @_;
+ my(@a) = ();
+
+ $s =~ s/\B\-\-\B/$charcode{'emdash'}/g;
+ $s =~ s/\B\-\B/ $charcode{'endash'} /g;
+
+ while ( $s =~ /^(\s+|\S+)(.*)$/ ) {
+ push(@a, [0,$1]);
+ $s = $2;
+ }
+
+ return @a;
+}
+
+#
+# Take a crossreference name and generate the PostScript name for it.
+#
+# This hack produces a somewhat smaller PDF...
+#%ps_xref_list = ();
+#$ps_xref_next = 0;
+#sub ps_xref($) {
+# my($s) = @_;
+# my $q = $ps_xref_list{$s};
+# return $q if ( defined($ps_xref_list{$s}) );
+# $q = 'X'.int2base($ps_xref_next++, 52);
+# $ps_xref_list{$s} = $q;
+# return $q;
+#}
+
+# Somewhat bigger PDF, but one which obeys # URLs
+sub ps_xref($) {
+ return @_[0];
+}
+
+#
+# Flow lines according to a particular font set and width
+#
+# A "font set" is represented as an array containing
+# arrays of pairs: [<size>, <metricref>]
+#
+# Each line is represented as:
+# [ [type,first|last,aux,fontset,page,ypos,optional col],
+# [rendering array] ]
+#
+# A space character may be "squeezed" by up to this much
+# (as a fraction of the normal width of a space.)
+#
+$ps_space_squeeze = 0.00; # Min space width 100%
+sub ps_flow_lines($$$@) {
+ my($wid, $fontset, $type, @data) = @_;
+ my($fonts) = $$fontset{fonts};
+ my($e);
+ my($w) = 0; # Width of current line
+ my($sw) = 0; # Width of current line due to spaces
+ my(@l) = (); # Current line
+ my(@ls) = (); # Accumulated output lines
+ my(@xd) = (); # Metadata that goes with subsequent text
+ my $hasmarker = 0; # Line has -6 marker
+ my $pastmarker = 0; # -6 marker found
+
+ # If there is a -6 marker anywhere in the paragraph,
+ # *each line* output needs to have a -6 marker
+ foreach $e ( @data ) {
+ $hasmarker = 1 if ( $$e[0] == -6 );
+ }
+
+ $w = 0;
+ foreach $e ( @data ) {
+ if ( $$e[0] < 0 ) {
+ # Type is metadata. Zero width.
+ if ( $$e[0] == -6 ) {
+ $pastmarker = 1;
+ }
+ if ( $$e[0] == -1 || $$e[0] == -6 ) {
+ # -1 (end anchor) or -6 (marker) goes with the preceeding
+ # text, otherwise with the subsequent text
+ push(@l, $e);
+ } else {
+ push(@xd, $e);
+ }
+ } else {
+ my $ew = ps_width($$e[1], $fontset->{fonts}->[$$e[0]][1],
+ \@NASMEncoding) *
+ ($fontset->{fonts}->[$$e[0]][0]);
+ my $sp = $$e[1];
+ $sp =~ tr/[^ ]//d; # Delete nonspaces
+ my $esw = ps_width($sp, $fontset->{fonts}->[$$e[0]][1],
+ \@NASMEncoding) *
+ ($fontset->{fonts}->[$$e[0]][0]);
+
+ if ( ($w+$ew) - $ps_space_squeeze*($sw+$esw) > $wid ) {
+ # Begin new line
+ # Search backwards for previous space chunk
+ my $lx = scalar(@l)-1;
+ my @rm = ();
+ while ( $lx >= 0 ) {
+ while ( $lx >= 0 && $l[$lx]->[0] < 0 ) {
+ # Skip metadata
+ $pastmarker = 0 if ( $l[$lx]->[0] == -6 );
+ $lx--;
+ };
+ if ( $lx >= 0 ) {
+ if ( $l[$lx]->[1] eq ' ' ) {
+ splice(@l, $lx, 1);
+ @rm = splice(@l, $lx);
+ last; # Found place to break
+ } else {
+ $lx--;
+ }
+ }
+ }
+
+ # Now @l contains the stuff to remain on the old line
+ # If we broke the line inside a link, then split the link
+ # into two.
+ my $lkref = undef;
+ foreach my $lc ( @l ) {
+ if ( $$lc[0] == -2 || $$lc[0] == -3 || $lc[0] == -7 ) {
+ $lkref = $lc;
+ } elsif ( $$lc[0] == -1 ) {
+ undef $lkref;
+ }
+ }
+
+ if ( defined($lkref) ) {
+ push(@l, [-1,undef]); # Terminate old reference
+ unshift(@rm, $lkref); # Duplicate reference on new line
+ }
+
+ if ( $hasmarker ) {
+ if ( $pastmarker ) {
+ unshift(@rm,[-6,undef]); # New line starts with marker
+ } else {
+ push(@l,[-6,undef]); # Old line ends with marker
+ }
+ }
+
+ push(@ls, [[$type,0,undef,$fontset,0,0],[@l]]);
+ @l = @rm;
+
+ $w = $sw = 0;
+ # Compute the width of the remainder array
+ for my $le ( @l ) {
+ if ( $$le[0] >= 0 ) {
+ my $xew = ps_width($$le[1],
+ $fontset->{fonts}->[$$le[0]][1],
+ \@NASMEncoding) *
+ ($fontset->{fonts}->[$$le[0]][0]);
+ my $xsp = $$le[1];
+ $xsp =~ tr/[^ ]//d; # Delete nonspaces
+ my $xsw = ps_width($xsp,
+ $fontset->{fonts}->[$$le[0]][1],
+ \@NASMEncoding) *
+ ($fontset->{fonts}->[$$le[0]][0]);
+ $w += $xew; $sw += $xsw;
+ }
+ }
+ }
+ push(@l, @xd); # Accumulated metadata
+ @xd = ();
+ if ( $$e[1] ne '' ) {
+ push(@l, $e);
+ $w += $ew; $sw += $esw;
+ }
+ }
+ }
+ push(@l,@xd);
+ if ( scalar(@l) ) {
+ push(@ls, [[$type,0,undef,$fontset,0,0],[@l]]); # Final line
+ }
+
+ # Mark the first line as first and the last line as last
+ if ( scalar(@ls) ) {
+ $ls[0]->[0]->[1] |= 1; # First in para
+ $ls[-1]->[0]->[1] |= 2; # Last in para
+ }
+ return @ls;
+}
+
+#
+# Once we have broken things into lines, having multiple chunks
+# with the same font index is no longer meaningful. Merge
+# adjacent chunks to keep down the size of the whole file.
+#
+sub ps_merge_chunks(@) {
+ my(@ci) = @_;
+ my($c, $lc);
+ my(@co, $eco);
+
+ undef $lc;
+ @co = ();
+ $eco = -1; # Index of the last entry in @co
+ foreach $c ( @ci ) {
+ if ( defined($lc) && $$c[0] == $lc && $$c[0] >= 0 ) {
+ $co[$eco]->[1] .= $$c[1];
+ } else {
+ push(@co, $c); $eco++;
+ $lc = $$c[0];
+ }
+ }
+ return @co;
+}
+
+#
+# Convert paragraphs to rendering arrays. Each
+# element in the array contains (font, string),
+# where font can be one of:
+# -1 end link
+# -2 begin crossref
+# -3 begin weblink
+# -4 index item anchor
+# -5 crossref anchor
+# -6 left/right marker (used in the index)
+# -7 page link (used in the index)
+# 0 normal
+# 1 empatic (italic)
+# 2 code (fixed spacing)
+#
+
+sub mkparaarray($@) {
+ my($ptype, @chunks) = @_;
+
+ my @para = ();
+ my $in_e = 0;
+ my $chunk;
+
+ if ( $ptype =~ /^code/ ) {
+ foreach $chunk ( @chunks ) {
+ push(@para, [2, $chunk]);
+ }
+ } else {
+ foreach $chunk ( @chunks ) {
+ my $type = substr($chunk,0,2);
+ my $text = substr($chunk,2);
+
+ if ( $type eq 'sp' ) {
+ push(@para, [$in_e?1:0, ' ']);
+ } elsif ( $type eq 'da' ) {
+ push(@para, [$in_e?1:0, $charcode{'endash'}]);
+ } elsif ( $type eq 'n ' ) {
+ push(@para, [0, $text]);
+ $in_e = 0;
+ } elsif ( $type =~ '^e' ) {
+ push(@para, [1, $text]);
+ $in_e = ($type eq 'es' || $type eq 'e ');
+ } elsif ( $type eq 'c ' ) {
+ push(@para, [2, $text]);
+ $in_e = 0;
+ } elsif ( $type eq 'x ' ) {
+ push(@para, [-2, ps_xref($text)]);
+ } elsif ( $type eq 'xe' ) {
+ push(@para, [-1, undef]);
+ } elsif ( $type eq 'wc' || $type eq 'w ' ) {
+ $text =~ /\<(.*)\>(.*)$/;
+ my $link = $1; $text = $2;
+ push(@para, [-3, $link]);
+ push(@para, [($type eq 'wc') ? 2:0, $text]);
+ push(@para, [-1, undef]);
+ $in_e = 0;
+ } elsif ( $type eq 'i ' ) {
+ push(@para, [-4, $text]);
+ } else {
+ die "Unexpected paragraph chunk: $chunk";
+ }
+ }
+ }
+ return @para;
+}
+
+$npara = scalar(@paras);
+for ( $i = 0 ; $i < $npara ; $i++ ) {
+ $paras[$i] = [mkparaarray($ptypes[$i], @{$paras[$i]})];
+}
+
+#
+# This converts a rendering array to a simple string
+#
+sub ps_arraytostr(@) {
+ my $s = '';
+ my $c;
+ foreach $c ( @_ ) {
+ $s .= $$c[1] if ( $$c[0] >= 0 );
+ }
+ return $s;
+}
+
+#
+# This generates a duplicate of a paragraph
+#
+sub ps_dup_para(@) {
+ my(@i) = @_;
+ my(@o) = ();
+ my($c);
+
+ foreach $c ( @i ) {
+ my @cc = @{$c};
+ push(@o, [@cc]);
+ }
+ return @o;
+}
+
+#
+# This generates a duplicate of a paragraph, stripping anchor
+# tags (-4 and -5)
+#
+sub ps_dup_para_noanchor(@) {
+ my(@i) = @_;
+ my(@o) = ();
+ my($c);
+
+ foreach $c ( @i ) {
+ my @cc = @{$c};
+ push(@o, [@cc]) unless ( $cc[0] == -4 || $cc[0] == -5 );
+ }
+ return @o;
+}
+
+#
+# Scan for header paragraphs and fix up their contents;
+# also generate table of contents and PDF bookmarks.
+#
+@tocparas = ([[-5, 'contents'], [0,'Contents']]);
+@tocptypes = ('chap');
+@bookmarks = (['title', 0, 'Title'], ['contents', 0, 'Contents']);
+%bookref = ();
+for ( $i = 0 ; $i < $npara ; $i++ ) {
+ my $xtype = $ptypes[$i];
+ my $ptype = substr($xtype,0,4);
+ my $str;
+ my $book;
+
+ if ( $ptype eq 'chap' || $ptype eq 'appn' ) {
+ unless ( $xtype =~ /^\S+ (\S+) :(.*)$/ ) {
+ die "Bad para";
+ }
+ my $secn = $1;
+ my $sech = $2;
+ my $xref = ps_xref($sech);
+ my $chap = ($ptype eq 'chap')?'Chapter':'Appendix';
+
+ $book = [$xref, 0, ps_arraytostr(@{$paras[$i]})];
+ push(@bookmarks, $book);
+ $bookref{$secn} = $book;
+
+ push(@tocparas, [ps_dup_para_noanchor(@{$paras[$i]})]);
+ push(@tocptypes, 'toc0'.' :'.$sech.':'.$chap.' '.$secn.':');
+
+ unshift(@{$paras[$i]},
+ [-5, $xref], [0,$chap.' '.$secn.':'], [0, ' ']);
+ } elsif ( $ptype eq 'head' || $ptype eq 'subh' ) {
+ unless ( $xtype =~ /^\S+ (\S+) :(.*)$/ ) {
+ die "Bad para";
+ }
+ my $secn = $1;
+ my $sech = $2;
+ my $xref = ps_xref($sech);
+ my $pref;
+ $pref = $secn; $pref =~ s/\.[^\.]+$//; # Find parent node
+
+ $book = [$xref, 0, ps_arraytostr(@{$paras[$i]})];
+ push(@bookmarks, $book);
+ $bookref{$secn} = $book;
+ $bookref{$pref}->[1]--; # Adjust count for parent node
+
+ push(@tocparas, [ps_dup_para_noanchor(@{$paras[$i]})]);
+ push(@tocptypes,
+ (($ptype eq 'subh') ? 'toc2':'toc1').' :'.$sech.':'.$secn);
+
+ unshift(@{$paras[$i]}, [-5, $xref]);
+ }
+}
+
+#
+# Add TOC to beginning of paragraph list
+#
+unshift(@paras, @tocparas); undef @tocparas;
+unshift(@ptypes, @tocptypes); undef @tocptypes;
+
+#
+# Add copyright notice to the beginning
+#
+@copyright_page =
+([[0, $charcode{'copyright'}],
+ [0, ' '], [0, $metadata{'year'}],
+ [0, ' '], string2array($metadata{'author'}),
+ [0, ' '], string2array($metadata{'copyright_tail'})],
+ [string2array($metadata{'license'})],
+ [string2array($metadata{'auxinfo'})]);
+
+unshift(@paras, @copyright_page);
+unshift(@ptypes, ('norm') x scalar(@copyright_page));
+
+$npara = scalar(@paras);
+
+#
+# No lines generated, yet.
+#
+@pslines = ();
+
+#
+# Line Auxilliary Information Types
+#
+$AuxStr = 1; # String
+$AuxPage = 2; # Page number (from xref)
+$AuxPageStr = 3; # Page number as a PostScript string
+$AuxXRef = 4; # Cross reference as a name
+$AuxNum = 5; # Number
+
+#
+# Break or convert paragraphs into lines, and push them
+# onto the @pslines array.
+#
+sub ps_break_lines($$) {
+ my ($paras,$ptypes) = @_;
+
+ my $linewidth = $psconf{pagewidth}-$psconf{lmarg}-$psconf{rmarg};
+ my $bullwidth = $linewidth-$psconf{bulladj};
+ my $indxwidth = ($linewidth-$psconf{idxgutter})/$psconf{idxcolumns}
+ -$psconf{idxspace};
+
+ my $npara = scalar(@{$paras});
+ my $i;
+
+ for ( $i = 0 ; $i < $npara ; $i++ ) {
+ my $xtype = $ptypes->[$i];
+ my $ptype = substr($xtype,0,4);
+ my @data = @{$paras->[$i]};
+ my @ls = ();
+ if ( $ptype eq 'code' ) {
+ my $p;
+ # Code paragraph; each chunk is a line
+ foreach $p ( @data ) {
+ push(@ls, [[$ptype,0,undef,\%BodyFont,0,0],[$p]]);
+ }
+ $ls[0]->[0]->[1] |= 1; # First in para
+ $ls[-1]->[0]->[1] |= 2; # Last in para
+ } elsif ( $ptype eq 'chap' || $ptype eq 'appn' ) {
+ # Chapters are flowed normally, but in an unusual font
+ @ls = ps_flow_lines($linewidth, \%ChapFont, $ptype, @data);
+ } elsif ( $ptype eq 'head' || $ptype eq 'subh' ) {
+ unless ( $xtype =~ /^\S+ (\S+) :(.*)$/ ) {
+ die "Bad para";
+ }
+ my $secn = $1;
+ my $sech = $2;
+ my $font = ($ptype eq 'head') ? \%HeadFont : \%SubhFont;
+ @ls = ps_flow_lines($linewidth, $font, $ptype, @data);
+ # We need the heading number as auxillary data
+ $ls[0]->[0]->[2] = [[$AuxStr,$secn]];
+ } elsif ( $ptype eq 'norm' ) {
+ @ls = ps_flow_lines($linewidth, \%BodyFont, $ptype, @data);
+ } elsif ( $ptype =~ /^(bull|indt)$/ ) {
+ @ls = ps_flow_lines($bullwidth, \%BodyFont, $ptype, @data);
+ } elsif ( $ptypq eq 'bquo' ) {
+ @ls = ps_flow_lines($bullwidth, \%BquoFont, $ptype, @data);
+ } elsif ( $ptype =~ /^toc/ ) {
+ unless ( $xtype =~/^\S+ :([^:]*):(.*)$/ ) {
+ die "Bad para";
+ }
+ my $xref = $1;
+ my $refname = $2.' ';
+ my $ntoc = substr($ptype,3,1)+0;
+ my $refwidth = ps_width($refname, $BodyFont{fonts}->[0][1],
+ \@NASMEncoding) *
+ ($BodyFont{fonts}->[0][0]);
+
+ @ls = ps_flow_lines($linewidth-$ntoc*$psconf{tocind}-
+ $psconf{tocpnz}-$refwidth,
+ \%BodyFont, $ptype, @data);
+
+ # Auxilliary data: for the first line, the cross reference symbol
+ # and the reference name; for all lines but the first, the
+ # reference width; and for the last line, the page number
+ # as a string.
+ my $nl = scalar(@ls);
+ $ls[0]->[0]->[2] = [[$AuxStr,$refname], [$AuxXRef,$xref]];
+ for ( $j = 1 ; $j < $nl ; $j++ ) {
+ $ls[$j]->[0]->[2] = [[$AuxNum,$refwidth]];
+ }
+ push(@{$ls[$nl-1]->[0]->[2]}, [$AuxPageStr,$xref]);
+ } elsif ( $ptype =~ /^idx/ ) {
+ my $lvl = substr($ptype,3,1)+0;
+
+ @ls = ps_flow_lines($indxwidth-$lvl*$psconf{idxindent},
+ \%BodyFont, $ptype, @data);
+ } else {
+ die "Unknown para type: $ptype";
+ }
+ # Merge adjacent identical chunks
+ foreach $l ( @ls ) {
+ @{$$l[1]} = ps_merge_chunks(@{$$l[1]});
+ }
+ push(@pslines,@ls);
+ }
+}
+
+# Break the main body text into lines.
+ps_break_lines(\@paras, \@ptypes);
+
+#
+# Break lines in to pages
+#
+
+# Where to start on page 2, the copyright page
+$curpage = 2; # Start on page 2
+$curypos = $psconf{pageheight}-$psconf{topmarg}-$psconf{botmarg}-
+ $psconf{startcopyright};
+undef $columnstart; # Not outputting columnar text
+undef $curcolumn; # Current column
+$nlines = scalar(@pslines);
+
+#
+# This formats lines inside the global @pslines array into pages,
+# updating the page and y-coordinate entries. Start at the
+# $startline position in @pslines and go to but not including
+# $endline. The global variables $curpage, $curypos, $columnstart
+# and $curcolumn are updated appropriately.
+#
+sub ps_break_pages($$) {
+ my($startline, $endline) = @_;
+
+ # Paragraph types which should never be broken
+ my $nobreakregexp = "^(chap|appn|head|subh|toc.|idx.)\$";
+ # Paragraph types which are heading (meaning they should not be broken
+ # immediately after)
+ my $nobreakafter = "^(chap|appn|head|subh)\$";
+ # Paragraph types which should never be broken *before*
+ my $nobreakbefore = "^idx[1-9]\$";
+ # Paragraph types which are set in columnar format
+ my $columnregexp = "^idx.\$";
+
+ my $upageheight = $psconf{pageheight}-$psconf{topmarg}-$psconf{botmarg};
+
+ my $i;
+
+ for ( $i = $startline ; $i < $endline ; $i++ ) {
+ my $linfo = $pslines[$i]->[0];
+ if ( ($$linfo[0] eq 'chap' || $$linfo[0] eq 'appn' )
+ && ($$linfo[1] & 1) ) {
+ # First line of a new chapter heading. Start a new page.
+ undef $columnstart;
+ $curpage++ if ( $curypos > 0 || defined($columnstart) );
+ # Always start on an odd page
+ $curpage |= 1;
+ $curypos = $chapstart;
+ } elsif ( defined($columnstart) && $$linfo[0] !~ /$columnregexp/o ) {
+ undef $columnstart;
+ $curpage++;
+ $curypos = 0;
+ }
+
+ if ( $$linfo[0] =~ /$columnregexp/o && !defined($columnstart) ) {
+ $columnstart = $curypos;
+ $curcolumn = 0;
+ }
+
+ # Adjust position by the appropriate leading
+ $curypos += $$linfo[3]->{leading};
+
+ # Record the page and y-position
+ $$linfo[4] = $curpage;
+ $$linfo[5] = $curypos;
+ $$linfo[6] = $curcolumn if ( defined($columnstart) );
+
+ if ( $curypos > $upageheight ) {
+ # We need to break the page before this line.
+ my $broken = 0; # No place found yet
+ while ( !$broken && $pslines[$i]->[0]->[4] == $curpage ) {
+ my $linfo = $pslines[$i]->[0];
+ my $pinfo = $pslines[$i-1]->[0];
+
+ if ( $$linfo[1] == 2 ) {
+ # This would be an orphan, don't break.
+ } elsif ( $$linfo[1] & 1 ) {
+ # Sole line or start of paragraph. Break unless
+ # the previous line was part of a heading.
+ $broken = 1 if ( $$pinfo[0] !~ /$nobreakafter/o &&
+ $$linfo[0] !~ /$nobreakbefore/o );
+ } else {
+ # Middle of paragraph. Break unless we're in a
+ # no-break paragraph, or the previous line would
+ # end up being a widow.
+ $broken = 1 if ( $$linfo[0] !~ /$nobreakregexp/o &&
+ $$pinfo[1] != 1 );
+ }
+ $i--;
+ }
+ die "Nowhere to break page $curpage\n" if ( !$broken );
+ # Now $i should point to line immediately before the break, i.e.
+ # the next paragraph should be the first on the new page
+ if ( defined($columnstart) &&
+ ++$curcolumn < $psconf{idxcolumns} ) {
+ # We're actually breaking text into columns, not pages
+ $curypos = $columnstart;
+ } else {
+ undef $columnstart;
+ $curpage++;
+ $curypos = 0;
+ }
+ next;
+ }
+
+ # Add end of paragraph skip
+ if ( $$linfo[1] & 2 ) {
+ $curypos += $skiparray{$$linfo[0]};
+ }
+ }
+}
+
+ps_break_pages(0,$nlines); # Break the main text body into pages
+
+#
+# Find the page number of all the indices
+#
+%ps_xref_page = (); # Crossref anchor pages
+%ps_index_pages = (); # Index item pages
+$nlines = scalar(@pslines);
+for ( $i = 0 ; $i < $nlines ; $i++ ) {
+ my $linfo = $pslines[$i]->[0];
+ foreach my $c ( @{$pslines[$i]->[1]} ) {
+ if ( $$c[0] == -4 ) {
+ if ( !defined($ps_index_pages{$$c[1]}) ) {
+ $ps_index_pages{$$c[1]} = [];
+ } elsif ( $ps_index_pages{$$c[1]}->[-1] eq $$linfo[4] ) {
+ # Pages are emitted in order; if this is a duplicated
+ # entry it will be the last one
+ next; # Duplicate
+ }
+ push(@{$ps_index_pages{$$c[1]}}, $$linfo[4]);
+ } elsif ( $$c[0] == -5 ) {
+ $ps_xref_page{$$c[1]} = $$linfo[4];
+ }
+ }
+}
+
+#
+# Emit index paragraphs
+#
+$startofindex = scalar(@pslines);
+@ixparas = ([[-5,'index'],[0,'Index']]);
+@ixptypes = ('chap');
+
+foreach $k ( @ixentries ) {
+ my $n,$i;
+ my $ixptype = 'idx0';
+ my $prefix = $ixhasprefix{$k};
+ my @ixpara = mkparaarray($ixptype,@{$ixterms{$k}});
+ my $commapos = undef;
+
+ if ( defined($prefix) && $ixprefixes{$prefix} > 1 ) {
+ # This entry has a "hanging comma"
+ for ( $i = 0 ; $i < scalar(@ixpara)-1 ; $i++ ) {
+ if ( substr($ixpara[$i]->[1],-1,1) eq ',' &&
+ $ixpara[$i+1]->[1] eq ' ' ) {
+ $commapos = $i;
+ last;
+ }
+ }
+ }
+ if ( defined($commapos) ) {
+ if ( $ixcommafirst{$k} ) {
+ # This is the first entry; generate the
+ # "hanging comma" entry
+ my @precomma = splice(@ixpara,0,$commapos);
+ if ( $ixpara[0]->[1] eq ',' ) {
+ shift(@ixpara); # Discard lone comma
+ } else {
+ # Discard attached comma
+ $ixpara[0]->[1] =~ s/\,$//;
+ push(@precomma,shift(@ixpara));
+ }
+ push(@precomma, [-6,undef]);
+ push(@ixparas, [@precomma]);
+ push(@ixptypes, $ixptype);
+ shift(@ixpara); # Remove space
+ } else {
+ splice(@ixpara,0,$commapos+2);
+ }
+ $ixptype = 'idx1';
+ }
+
+ push(@ixpara, [-6,undef]); # Left/right marker
+ $i = 1; $n = scalar(@{$ps_index_pages{$k}});
+ foreach $p ( @{$ps_index_pages{$k}} ) {
+ if ( $i++ == $n ) {
+ push(@ixpara,[-7,$p],[0,"$p"],[-1,undef]);
+ } else {
+ push(@ixpara,[-7,$p],[0,"$p,"],[-1,undef],[0,' ']);
+ }
+ }
+
+ push(@ixparas, [@ixpara]);
+ push(@ixptypes, $ixptype);
+}
+
+#
+# Flow index paragraphs into lines
+#
+ps_break_lines(\@ixparas, \@ixptypes);
+
+#
+# Format index into pages
+#
+$nlines = scalar(@pslines);
+ps_break_pages($startofindex, $nlines);
+
+#
+# Push index onto bookmark list
+#
+push(@bookmarks, ['index', 0, 'Index']);
+
+@all_fonts_lst = sort(keys(%ps_all_fonts));
+$all_fonts_str = join(' ', @all_fonts_lst);
+@need_fonts_lst = ();
+foreach my $f (@all_fonts_lst) {
+ push(@need_fonts_lst, $f); # unless (defined($ps_all_fonts{$f}->{file}));
+}
+$need_fonts_str = join(' ', @need_fonts_lst);
+
+# Emit the PostScript DSC header
+print "%!PS-Adobe-3.0\n";
+print "%%Pages: $curpage\n";
+print "%%BoundingBox: 0 0 ", $psconf{pagewidth}, ' ', $psconf{pageheight}, "\n";
+print "%%Creator: (NASM psflow.pl)\n";
+print "%%DocumentData: Clean7Bit\n";
+print "%%DocumentFonts: $all_fonts_str\n";
+print "%%DocumentNeededFonts: $need_fonts_str\n";
+print "%%Orientation: Portrait\n";
+print "%%PageOrder: Ascend\n";
+print "%%EndComments\n";
+print "%%BeginProlog\n";
+
+# Emit the configurables as PostScript tokens
+foreach $c ( keys(%psconf) ) {
+ print "/$c ", $psconf{$c}, " def\n";
+}
+foreach $c ( keys(%psbool) ) {
+ print "/$c ", ($psbool{$c}?'true':'false'), " def\n";
+}
+
+# Embed font data, if applicable
+#foreach my $f (@all_fonts_lst) {
+# my $fontfile = $all_ps_fonts{$f}->{file};
+# if (defined($fontfile)) {
+# if (open(my $fh, '<', $fontfile)) {
+# print vector <$fh>;
+# close($fh);
+# }
+# }
+#}
+
+# Emit custom encoding vector
+$zstr = '/NASMEncoding [ ';
+foreach $c ( @NASMEncoding ) {
+ my $z = '/'.(defined($c)?$c:'.notdef ').' ';
+ if ( length($zstr)+length($z) > 72 ) {
+ print $zstr,"\n";
+ $zstr = ' ';
+ }
+ $zstr .= $z;
+}
+print $zstr, "] def\n";
+
+# Font recoding routine
+# newname fontname --
+print "/nasmenc {\n";
+print " findfont dup length dict begin\n";
+print " { 1 index /FID ne {def}{pop pop} ifelse } forall\n";
+print " /Encoding NASMEncoding def\n";
+print " currentdict\n";
+print " end\n";
+print " definefont pop\n";
+print "} def\n";
+
+# Emit fontset definitions
+foreach $font ( sort(keys(%ps_all_fonts)) ) {
+ print '/',$font,'-NASM /',$font," nasmenc\n";
+}
+
+foreach $fset ( @AllFonts ) {
+ my $i = 0;
+ my @zfonts = ();
+ foreach $font ( @{$fset->{fonts}} ) {
+ print '/', $fset->{name}, $i, ' ',
+ '/', $font->[1]->{name}, '-NASM findfont ',
+ $font->[0], " scalefont def\n";
+ push(@zfonts, $fset->{name}.$i);
+ $i++;
+ }
+ print '/', $fset->{name}, ' [', join(' ',@zfonts), "] def\n";
+}
+
+# This is used by the bullet-paragraph PostScript methods
+print "/bullet [",ps_string($charcode{'bullet'}),"] def\n";
+
+# Emit the canned PostScript prologue
+open(PSHEAD, '<', $headps)
+ or die "$0: cannot open: $headps: $!\n";
+while ( defined($line = <PSHEAD>) ) {
+ print $line;
+}
+close(PSHEAD);
+print "%%EndProlog\n";
+
+# Generate a PostScript string
+sub ps_string($) {
+ my ($s) = @_;
+ my ($i,$c);
+ my ($o) = '(';
+ my ($l) = length($s);
+ for ( $i = 0 ; $i < $l ; $i++ ) {
+ $c = substr($s,$i,1);
+ if ( ord($c) < 32 || ord($c) > 126 ) {
+ $o .= sprintf("\\%03o", ord($c));
+ } elsif ( $c eq '(' || $c eq ')' || $c eq "\\" ) {
+ $o .= "\\".$c;
+ } else {
+ $o .= $c;
+ }
+ }
+ return $o.')';
+}
+
+# Generate PDF bookmarks
+print "%%BeginSetup\n";
+foreach $b ( @bookmarks ) {
+ print '[/Title ', ps_string($b->[2]), "\n";
+ print '/Count ', $b->[1], ' ' if ( $b->[1] );
+ print '/Dest /',$b->[0]," /OUT pdfmark\n";
+}
+
+# Ask the PostScript interpreter for the proper size media
+print "setpagesize\n";
+print "%%EndSetup\n";
+
+# Start a PostScript page
+sub ps_start_page() {
+ $ps_page++;
+ print "%%Page: $ps_page $ps_page\n";
+ print "%%BeginPageSetup\n";
+ print "save\n";
+ print "%%EndPageSetup\n";
+ print '/', $ps_page, " pa\n";
+}
+
+# End a PostScript page
+sub ps_end_page($) {
+ my($pn) = @_;
+ if ( $pn ) {
+ print "($ps_page)", (($ps_page & 1) ? 'pageodd' : 'pageeven'), "\n";
+ }
+ print "restore showpage\n";
+}
+
+$ps_page = 0;
+
+# Title page
+ps_start_page();
+$title = $metadata{'title'} || '';
+$title =~ s/ \- / $charcode{'endash'} /;
+
+$subtitle = $metadata{'subtitle'} || '';
+$subtitle =~ s/ \- / $charcode{'endash'} /;
+
+# Print title
+print "/ti ", ps_string($title), " def\n";
+print "/sti ", ps_string($subtitle), " def\n";
+print "lmarg pageheight 2 mul 3 div moveto\n";
+print "tfont0 setfont\n";
+print "/title linkdest ti show\n";
+print "lmarg pageheight 2 mul 3 div 10 sub moveto\n";
+print "0 setlinecap 3 setlinewidth\n";
+print "pagewidth lmarg sub rmarg sub 0 rlineto currentpoint stroke moveto\n";
+print "hfont1 setfont sti stringwidth pop neg ",
+ -$HeadFont{leading}, " rmoveto\n";
+print "sti show\n";
+
+# Print logo, if there is one
+# FIX: To be 100% correct, this should look for DocumentNeeded*
+# and DocumentFonts in the header of the EPSF and add those to the
+# global header.
+if ( defined($metadata{epslogo}) &&
+ open(EPS, '<', File::Spec->catfile($epsdir, $metadata{epslogo})) ) {
+ my @eps = ();
+ my ($bbllx,$bblly,$bburx,$bbury) = (undef,undef,undef,undef);
+ my $line;
+ my $scale = 1;
+ my $maxwidth = $psconf{pagewidth}-$psconf{lmarg}-$psconf{rmarg};
+ my $maxheight = $psconf{pageheight}/3-40;
+ my $width, $height;
+ my $x, $y;
+
+ while ( defined($line = <EPS>) ) {
+ last if ( $line =~ /^%%EOF/ );
+ if ( !defined($bbllx) &&
+ $line =~ /^\%\%BoundingBox\:\s*([0-9\.]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9\.]+)/i ) {
+ $bbllx = $1+0; $bblly = $2+0;
+ $bburx = $3+0; $bbury = $4+0;
+ }
+ push(@eps,$line);
+ }
+ close(EPS);
+
+ if ( defined($bbllx) ) {
+ $width = $bburx-$bbllx;
+ $height = $bbury-$bblly;
+
+ if ( $width > $maxwidth ) {
+ $scale = $maxwidth/$width;
+ }
+ if ( $height*$scale > $maxheight ) {
+ $scale = $maxheight/$height;
+ }
+
+ $x = ($psconf{pagewidth}-$width*$scale)/2;
+ $y = ($psconf{pageheight}-$height*$scale)/2;
+
+ if ( defined($metadata{logoxadj}) ) {
+ $x += $metadata{logoxadj};
+ }
+ if ( defined($metadata{logoyadj}) ) {
+ $y += $metadata{logoyadj};
+ }
+
+ print "BeginEPSF\n";
+ print $x, ' ', $y, " translate\n";
+ print $scale, " dup scale\n" unless ( $scale == 1 );
+ print -$bbllx, ' ', -$bblly, " translate\n";
+ print "$bbllx $bblly moveto\n";
+ print "$bburx $bblly lineto\n";
+ print "$bburx $bbury lineto\n";
+ print "$bbllx $bbury lineto\n";
+ print "$bbllx $bblly lineto clip newpath\n";
+ print "%%BeginDocument: ",ps_string($metadata{epslogo}),"\n";
+ print @eps;
+ print "%%EndDocument\n";
+ print "EndEPSF\n";
+ }
+}
+ps_end_page(0);
+
+# Emit the rest of the document (page 2 and on)
+$curpage = 2;
+ps_start_page();
+foreach $line ( @pslines ) {
+ my $linfo = $line->[0];
+
+ while ( $$linfo[4] > $curpage ) {
+ ps_end_page($curpage > 2);
+ ps_start_page();
+ $curpage++;
+ }
+
+ print '[';
+ my $curfont = 0;
+ foreach my $c ( @{$line->[1]} ) {
+ if ( $$c[0] >= 0 ) {
+ if ( $curfont != $$c[0] ) {
+ print ($curfont = $$c[0]);
+ }
+ print ps_string($$c[1]);
+ } elsif ( $$c[0] == -1 ) {
+ print '{el}'; # End link
+ } elsif ( $$c[0] == -2 ) {
+ print '{/',$$c[1],' xl}'; # xref link
+ } elsif ( $$c[0] == -3 ) {
+ print '{',ps_string($$c[1]),'wl}'; # web link
+ } elsif ( $$c[0] == -4 ) {
+ # Index anchor -- ignore
+ } elsif ( $$c[0] == -5 ) {
+ print '{/',$$c[1],' xa}'; #xref anchor
+ } elsif ( $$c[0] == -6 ) {
+ print ']['; # Start a new array
+ $curfont = 0;
+ } elsif ( $$c[0] == -7 ) {
+ print '{/',$$c[1],' pl}'; # page link
+ } else {
+ die "Unknown annotation";
+ }
+ }
+ print ']';
+ if ( defined($$linfo[2]) ) {
+ foreach my $x ( @{$$linfo[2]} ) {
+ if ( $$x[0] == $AuxStr ) {
+ print ps_string($$x[1]);
+ } elsif ( $$x[0] == $AuxPage ) {
+ print $ps_xref_page{$$x[1]},' ';
+ } elsif ( $$x[0] == $AuxPageStr ) {
+ print ps_string($ps_xref_page{$$x[1]});
+ } elsif ( $$x[0] == $AuxXRef ) {
+ print '/',ps_xref($$x[1]),' ';
+ } elsif ( $$x[0] == $AuxNum ) {
+ print $$x[1],' ';
+ } else {
+ die "Unknown auxilliary data type";
+ }
+ }
+ }
+ print ($psconf{pageheight}-$psconf{topmarg}-$$linfo[5]);
+ print ' ', $$linfo[6] if ( defined($$linfo[6]) );
+ print ' ', $$linfo[0].$$linfo[1], "\n";
+}
+
+ps_end_page(1);
+print "%%EOF\n";
diff --git a/doc/head.ps b/doc/head.ps
new file mode 100644
index 00000000..7fbb3a90
--- /dev/null
+++ b/doc/head.ps
@@ -0,0 +1,401 @@
+%
+% PostScript header for NASM documentation
+%
+
+% Avoid barfing on old PS implementations
+/pdfmark where
+{pop} {userdict /pdfmark /cleartomark load put} ifelse
+/setpagedevice where
+{pop} {userdict /setpagedevice /pop load put} ifelse
+
+% Useful definition
+/space 32 def
+
+%
+% This asks the PostScript interpreter for the proper size paper
+%
+/setpagesize {
+ 1 dict dup /PageSize [pagewidth pageheight] put setpagedevice
+} def
+
+%
+% Code to handle links
+%
+/min { 2 copy gt { exch } if pop } def
+/max { 2 copy lt { exch } if pop } def
+
+/lkbegun 0 def
+/lktype null def
+/lkury 0 def
+/lkurx 0 def
+/lklly 0 def
+/lkllx 0 def
+/lkxmarg 1 def % Extra space for link in x dir
+/lkymarg 1 def % Extra space for link in y dir
+/lktarget () def
+
+% target type --
+/linkbegin {
+ userdict begin
+ /lkbegun 1 def
+ /lktype exch def
+ /lktarget exch def
+ colorlinks { 0 0 0.4 setrgbcolor } if
+ end
+} def
+
+% target --
+/linkbegindest {
+ /Dest linkbegin
+} def
+
+% uristring --
+/linkbeginuri {
+ /URI linkbegin
+} def
+
+% pageno --
+/linkbeginpage {
+ /Page linkbegin
+} def
+
+% string spacepadding --
+/linkshow {
+ userdict begin
+ /lspad exch def /lss exch def
+ lkbegun 0 ne {
+ gsave lss true charpath flattenpath pathbbox grestore
+ lkbegun 1 eq {
+ /lkury exch def
+ lss spacecount lspad mul add /lkurx exch def
+ /lklly exch def
+ /lkllx exch def
+ /lkbegun 2 def
+ } {
+ lkury max /lkury exch def
+ lss spacecount lspad mul add lkurx max /lkurx exch def
+ lklly min /lklly exch def
+ lkllx min /lkllx exch def
+ } ifelse
+ } if
+ lspad 0 space lss widthshow
+ end
+} def
+
+% --
+/linkend {
+ userdict begin
+ [ lktype /URI eq {
+ /Action 2 dict dup /Subtype /URI put dup /URI lktarget put
+ } {
+ /Dest lktarget
+ } ifelse
+ /Border [0 0 0]
+ /Rect [ lkllx lkxmarg sub
+ lklly lkymarg sub
+ lkurx lkxmarg add
+ lkury lkymarg add ]
+ /Subtype /Link
+ /ANN pdfmark
+ /lkbegun 0 def
+ colorlinks { 0 setgray } if
+ end
+} def
+
+% targetname --
+/linkdest {
+ [ /Dest 3 -1 roll
+ /View [ /XYZ currentpoint null ]
+ /DEST pdfmark
+} def
+
+% A "fontset" is an array of fonts; a "stream" is an array of strings
+% and numbers or procedures:
+% [ 0 (Foo) ( ) (mani) ( ) 1 (padme) 0 ( ) (hum.) ]
+% A number choses a font from the current fontset.
+% A procedure is invoked as-is when printing the stream.
+%
+% When printing justified, an equal amount of space is added in
+% between each string.
+
+% string -- spacecount
+% Count space characters in a string
+/spacecount {
+ 0 exch {
+ space eq { 1 add } if
+ } forall
+} def
+
+% stream fontset -- spacecount width
+% Get the width of a stream in the given fontset, and the
+% number of space characters in the stream
+/streamwidth {
+ gsave
+ 6 dict begin
+ /f exch def
+ /w 0 def
+ /s 0 def
+ f 0 get setfont
+ /integertype {
+ f exch get setfont
+ } def
+ /stringtype {
+ dup stringwidth pop w add /w exch def
+ spacecount s add /s exch def
+ } def
+ /arraytype { pop } def
+ % The input stream is on the top of the stack now
+ {
+ dup type exec
+ } forall
+ s w
+ end
+ grestore
+} def
+
+% stream fontset spacer --
+% Show the stream in the given fontset, but add a certain amount
+% of space to each space character
+/showstreamspc {
+ 5 dict begin
+ /spc exch def
+ /f exch def
+ f 0 get setfont
+ /integertype {
+ f exch get setfont
+ } def
+ /stringtype {
+ spc linkshow
+ } def
+ /arraytype {
+ exec
+ } def
+ % Now stream is on the top of the stack
+ {
+ dup type exec
+ } forall
+ end
+} def
+
+% stream fontset --
+% Show the stream in the given fontset, with no extra spacing
+/showstream {
+ 0 showstreamspc
+} def
+
+% stream fontset totalspace --
+% Show the stream justified to fit into a certain number of pixels
+/showstreamjust {
+ userdict begin
+ /ts exch def /fs exch def /st exch def
+ st fs
+ st fs streamwidth ts exch sub exch
+ dup 0 gt { div } { pop } ifelse
+ showstreamspc
+ end
+} def
+
+/bullmarg lmarg bulladj add def
+/lwidth pagewidth lmarg sub rmarg sub def
+/bwidth lwidth bulladj sub def
+
+%
+% The various paragraph types
+% The number at the end indicates start (1) of para, end (2) of para
+%
+/chapline {
+ currentpoint exch pop 10 sub lmarg exch moveto
+ 0 setlinecap 3 setlinewidth
+ lwidth 0 rlineto stroke
+} def
+
+/chap0 { lmarg exch moveto cfont lwidth showstreamjust } def
+/chap1 { lmarg exch moveto cfont lwidth showstreamjust } def
+/chap2 { lmarg exch moveto cfont showstream chapline } def
+/chap3 { lmarg exch moveto cfont showstream chapline } def
+
+/appn0 {chap0} def
+/appn1 {chap1} def
+/appn2 {chap2} def
+/appn3 {chap3} def
+
+% lbl ypos fontset -- ypos
+/headlbl {
+ 3 -1 roll [exch ( )] exch % ypos strm fontset
+ 2 copy % ypos strm fontset strm fontset
+ streamwidth % ypos strm fontset spccount width
+ lmarg exch sub % ypos strm fontset spccount xpos
+ 4 index % ypos strm fontset spccount xpos ypos
+ moveto % ypos strm fontset spccount
+ pop % ypos strm fontset spccount
+ showstream % ypos
+} def
+
+/head0 { lmarg exch moveto hfont lwidth showstreamjust } def
+/head1 { hfont headlbl lmarg exch moveto hfont lwidth showstreamjust } def
+/head2 { lmarg exch moveto hfont showstream } def
+/head3 { hfont headlbl lmarg exch moveto hfont showstream } def
+
+/subh0 { lmarg exch moveto sfont lwidth showstreamjust } def
+/subh1 { sfont headlbl lmarg exch moveto sfont lwidth showstreamjust } def
+/subh2 { lmarg exch moveto sfont showstream } def
+/subh3 { sfont headlbl lmarg exch moveto sfont showstream } def
+
+/norm0 { lmarg exch moveto bfont lwidth showstreamjust } def
+/norm1 { lmarg exch moveto bfont lwidth showstreamjust } def
+/norm2 { lmarg exch moveto bfont showstream } def
+/norm3 { lmarg exch moveto bfont showstream } def
+
+/code0 { lmarg exch moveto bfont showstream } def
+/code1 { lmarg exch moveto bfont showstream } def
+/code2 { lmarg exch moveto bfont showstream } def
+/code3 { lmarg exch moveto bfont showstream } def
+
+/bull0 { bullmarg exch moveto bfont bwidth showstreamjust } def
+/bull1 { dup lmarg exch moveto bullet bfont showstream
+ bullmarg exch moveto bfont bwidth showstreamjust } def
+/bull2 { bullmarg exch moveto bfont showstream } def
+/bull3 { dup lmarg exch moveto bullet bfont showstream
+ bullmarg exch moveto bfont showstream } def
+
+/indt0 { bullmarg exch moveto bfont bwidth showstreamjust } def
+/indt1 { bullmarg exch moveto bfont bwidth showstreamjust } def
+/indt2 { bullmarg exch moveto bfont showstream } def
+/indt3 { bullmarg exch moveto bfont showstream } def
+
+/bquo0 { bullmarg exch moveto qfont bwidth showstreamjust } def
+/bquo1 { bullmarg exch moveto qfont bwidth showstreamjust } def
+/bquo2 { bullmarg exch moveto qfont showstream } def
+/bquo3 { bullmarg exch moveto qfont showstream } def
+
+/tocw0 lwidth tocpnz sub def
+/tocw1 tocw0 tocind sub def
+/tocw2 tocw1 tocind sub def
+
+/tocx0 lmarg def
+/tocx1 tocx0 tocind add def
+/tocx2 tocx1 tocind add def
+
+/tocpn {
+ bfont0 setfont
+ 3 dict begin
+ /s exch def
+ /x s stringwidth pop pagewidth rmarg sub exch sub def
+ currentpoint /y exch def
+ lmarg sub tocdots div ceiling tocdots mul lmarg add
+ tocdots x {
+ y moveto (.) 0 linkshow
+ } for
+ x y moveto s 0 linkshow
+ end
+ linkend
+} def
+
+/toc00 { tocx0 exch moveto 0 rmoveto bfont showstream } def
+/toc01 { tocx0 exch moveto
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc02 { tocx0 exch moveto 3 1 roll
+ 0 rmoveto bfont showstream tocpn } def
+/toc03 { tocx0 exch moveto 4 1 roll
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+/toc10 { tocx1 exch moveto 0 rmoveto bfont showstream } def
+/toc11 { tocx1 exch moveto
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc12 { tocx1 exch moveto 3 1 roll
+ 0 rmoveto bfont showstream tocpn } def
+/toc13 { tocx1 exch moveto 4 1 roll
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+/toc20 { tocx2 exch moveto 0 rmoveto bfont showstream } def
+/toc21 { tocx2 exch moveto
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc22 { tocx2 exch moveto 3 1 roll
+ 0 rmoveto bfont showstream tocpn } def
+/toc23 { tocx2 exch moveto 4 1 roll
+ linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+% Spacing between index columns
+/indexcolumn pagewidth lmarg sub rmarg sub idxgutter add idxcolumns div def
+% Width of an individual index column
+/indexcolwid indexcolumn idxgutter sub def
+
+/idx03 {
+ 2 dict begin
+ indexcolumn mul lmarg add
+ /x exch def /y exch def x y moveto
+ exch bfont showstream
+ dup bfont streamwidth
+ x indexcolwid add exch sub exch pop y moveto
+ bfont showstream
+ end
+} def
+/idx00 {idx03} def
+/idx01 {idx03} def
+/idx02 {idx03} def
+
+/idx13 {
+ 2 dict begin
+ indexcolumn mul lmarg add idxindent add
+ /x exch def /y exch def x y moveto
+ exch bfont showstream
+ dup bfont streamwidth
+ x indexcolwid idxindent sub add exch sub exch pop y moveto
+ bfont showstream
+ end
+} def
+/idx10 {idx13} def
+/idx11 {idx13} def
+/idx12 {idx13} def
+
+%
+% Page numbers
+%
+/pagey botmarg pymarg sub def
+/pagel lmarg plmarg sub def
+/pager pagewidth rmarg sub prmarg add def
+
+/pageeven { pagel pagey moveto bfont1 setfont show } def
+/pageodd { bfont1 setfont dup stringwidth pop pager exch sub
+ pagey moveto show } def
+
+%
+% Functions invoked during parsing
+%
+/xa { linkdest } def
+/pa { 0 pageheight moveto linkdest } def
+/xl { linkbegindest } def
+/wl { linkbeginuri } def
+/pl { linkbeginpage } def
+/el { linkend } def
+
+%
+% PDF viewer options
+%
+[/PageMode /UseOutlines /DOCVIEW pdfmark % Display bookmarks
+
+%
+% Functions to include EPS
+%
+/BeginEPSF {
+ /Before_EPSF_State save def
+ /dict_count countdictstack def
+ /op_count count 1 sub def
+ userdict begin
+ /showpage {} def
+ 0 setgray 0 setlinecap
+ 1 setlinewidth 0 setlinejoin
+ 10 setmiterlimit [ ] 0 setdash newpath
+ /languagelevel where
+ {
+ pop languagelevel
+ 1 ne {
+ false setstrokeadjust false setoverprint
+ } if
+ } if
+} bind def
+/EndEPSF {
+ count op_count sub {pop} repeat
+ countdictstack dict_count sub {end} repeat
+ Before_EPSF_State restore
+} bind def
diff --git a/doc/inslist.pl b/doc/inslist.pl
new file mode 100644
index 00000000..c7d7da40
--- /dev/null
+++ b/doc/inslist.pl
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# inslist.pl produce inslist.src
+#
+
+print STDERR "Reading insns.dat...\n";
+
+@args = ();
+undef $output;
+foreach $arg ( @ARGV ) {
+ if ( $arg =~ /^\-/ ) {
+ if ( $arg =~ /^\-([adins])$/ ) {
+ $output = $1;
+ } else {
+ die "$0: Unknown option: ${arg}\n";
+ }
+ } else {
+ push (@args, $arg);
+ }
+}
+
+$fname = "../insns.dat" unless $fname = $args[0];
+open (F, '<', $fname) || die "unable to open $fname";
+print STDERR "Writing inslist.src...\n";
+open S, '>', 'inslist.src';
+$line = 0;
+$insns = 0;
+while (<F>) {
+ $line++;
+ next if (/^\s*$/); # blank lines
+ if ( /^\s*;/ ) # comments
+ {
+ if ( /^\s*;\#\s*(.+)/ ) # section subheader
+ {
+ print S "\n\\S{} $1\n\n";
+ }
+ next;
+ }
+ chomp;
+ unless (/^\s*(\S+)\s+(\S+)\s+(\S+|\[.*\])\s+(\S+)\s*$/) {
+ warn "line $line does not contain four fields\n";
+ next;
+ }
+ my @entry = ($1, $2, $3, $4);
+
+ $entry[1] =~ s/ignore//;
+ $entry[1] =~ s/void//;
+
+ my @flags = split(/,/, $entry[3]);
+ my @nflags;
+ undef $isavx512;
+ undef @avx512fl;
+ for my $fl (@flags) {
+ next if ($fl =~ /^(ignore|SB|SM|SM2|SQ|AR2|FUTURE)$/);
+
+ if ($fl =~ /^AVX512(.*)$/) {
+ $isavx512 = 1;
+ push(@avx512fl, $1) unless ($1 eq '');
+ } else {
+ push(@nflags,$fl);
+ }
+ }
+
+ if ($isavx512) {
+ unshift(@nflags, "AVX512".join('/', @avx512fl));
+ }
+
+ printf S "\\c %-16s %-24s %s\n",$entry[0],$entry[1], join(',', @nflags);
+ $insns++;
+}
+print S "\n";
+close S;
+close F;
+printf STDERR "Done: %d instructions\n", $insns;
+
diff --git a/doc/internal.doc b/doc/internal.doc
new file mode 100644
index 00000000..88f06bc2
--- /dev/null
+++ b/doc/internal.doc
@@ -0,0 +1,290 @@
+Internals of the Netwide Assembler
+==================================
+
+The Netwide Assembler is intended to be a modular, re-usable x86
+assembler, which can be embedded in other programs, for example as
+the back end to a compiler.
+
+The assembler is composed of modules. The interfaces between them
+look like:
+
+ +--- preproc.c ----+
+ | |
+ +---- parser.c ----+
+ | | |
+ | float.c |
+ | |
+ +--- assemble.c ---+
+ | | |
+ nasm.c ---+ insnsa.c +--- nasmlib.c
+ | |
+ +--- listing.c ----+
+ | |
+ +---- labels.c ----+
+ | |
+ +--- outform.c ----+
+ | |
+ +----- *out.c -----+
+
+In other words, each of `preproc.c', `parser.c', `assemble.c',
+`labels.c', `listing.c', `outform.c' and each of the output format
+modules `*out.c' are independent modules, which do not directly
+inter-communicate except through the main program.
+
+The Netwide *Disassembler* is not intended to be particularly
+portable or reusable or anything, however. So I won't bother
+documenting it here. :-)
+
+nasmlib.c
+---------
+
+This is a library module; it contains simple library routines which
+may be referenced by all other modules. Among these are a set of
+wrappers around the standard `malloc' routines, which will report a
+fatal error if they run out of memory, rather than returning NULL.
+
+preproc.c
+---------
+
+This contains a macro preprocessor, which takes a file name as input
+and returns a sequence of preprocessed source lines. The only symbol
+exported from the module is `nasmpp', which is a data structure of
+type `Preproc', declared in nasm.h. This structure contains pointers
+to all the functions designed to be callable from outside the
+module.
+
+parser.c
+--------
+
+This contains a source-line parser. It parses `canonical' assembly
+source lines, containing some combination of the `label', `opcode',
+`operand' and `comment' fields: it does not process directives or
+macros. It exports two functions: `parse_line' and `cleanup_insn'.
+
+`parse_line' is the main parser function: you pass it a source line
+in ASCII text form, and it returns you an `insn' structure
+containing all the details of the instruction on that line. The
+parameters it requires are:
+
+- The location (segment, offset) where the instruction on this line
+ will eventually be placed. This is necessary in order to evaluate
+ expressions containing the Here token, `$'.
+
+- A function which can be called to retrieve the value of any
+ symbols the source line references.
+
+- Which pass the assembler is on: an undefined symbol only causes an
+ error condition on pass two.
+
+- The source line to be parsed.
+
+- A structure to fill with the results of the parse.
+
+- A function which can be called to report errors.
+
+Some instructions (DB, DW, DD for example) can require an arbitrary
+amount of storage, and so some of the members of the resulting
+`insn' structure will be dynamically allocated. The other function
+exported by `parser.c' is `cleanup_insn', which can be called to
+deallocate any dynamic storage associated with the results of a
+parse.
+
+names.c
+-------
+
+This doesn't count as a module - it defines a few arrays which are
+shared between NASM and NDISASM, so it's a separate file which is
+#included by both parser.c and disasm.c.
+
+float.c
+-------
+
+This is essentially a library module: it exports one function,
+`float_const', which converts an ASCII representation of a
+floating-point number into an x86-compatible binary representation,
+without using any built-in floating-point arithmetic (so it will run
+on any platform, portably). It calls nothing, and is called only by
+`parser.c'. Note that the function `float_const' must be passed an
+error reporting routine.
+
+assemble.c
+----------
+
+This module contains the code generator: it translates `insn'
+structures as returned from the parser module into actual generated
+code which can be placed in an output file. It exports two
+functions, `assemble' and `insn_size'.
+
+`insn_size' is designed to be called on pass one of assembly: it
+takes an `insn' structure as input, and returns the amount of space
+that would be taken up if the instruction described in the structure
+were to be converted to real machine code. `insn_size' also requires
+to be told the location (as a segment/offset pair) where the
+instruction would be assembled, the mode of assembly (16/32 bit
+default), and a function it can call to report errors.
+
+`assemble' is designed to be called on pass two: it takes all the
+parameters that `insn_size' does, but has an extra parameter which
+is an output driver. `assemble' actually converts the input
+instruction into machine code, and outputs the machine code by means
+of calling the `output' function of the driver.
+
+insnsa.c
+--------
+
+This is another library module: it exports one very big array of
+instruction translations. It is generated automatically from the
+insns.dat file by the insns.pl script.
+
+labels.c
+--------
+
+This module contains a label manager. It exports six functions:
+
+`init_labels' should be called before any other function in the
+module. `cleanup_labels' may be called after all other use of the
+module has finished, to deallocate storage.
+
+`define_label' is called to define new labels: you pass it the name
+of the label to be defined, and the (segment,offset) pair giving the
+value of the label. It is also passed an error-reporting function,
+and an output driver structure (so that it can call the output
+driver's label-definition function). `define_label' mentally
+prepends the name of the most recently defined non-local label to
+any label beginning with a period.
+
+`define_label_stub' is designed to be called in pass two, once all
+the labels have already been defined: it does nothing except to
+update the "most-recently-defined-non-local-label" status, so that
+references to local labels in pass two will work correctly.
+
+`declare_as_global' is used to declare that a label should be
+global. It must be called _before_ the label in question is defined.
+
+Finally, `lookup_label' attempts to translate a label name into a
+(segment,offset) pair. It returns non-zero on success.
+
+The label manager module is (theoretically :) restartable: after
+calling `cleanup_labels', you can call `init_labels' again, and
+start a new assembly with a new set of symbols.
+
+listing.c
+---------
+
+This file contains the listing file generator. The interface to the
+module is through the one symbol it exports, `nasmlist', which is a
+structure containing six function pointers. The calling semantics of
+these functions isn't terribly well thought out, as yet, but it
+works (just about) so it's going to get left alone for now...
+
+outform.c
+---------
+
+This small module contains a set of routines to manage a list of
+output formats, and select one given a keyword. It contains three
+small routines: `ofmt_register' which registers an output driver as
+part of the managed list, `ofmt_list' which lists the available
+drivers on stdout, and `ofmt_find' which tries to find the driver
+corresponding to a given name.
+
+The output modules
+------------------
+
+Each of the output modules, `outbin.o', `outelf.o' and so on,
+exports only one symbol, which is an output driver data structure
+containing pointers to all the functions needed to produce output
+files of the appropriate type.
+
+The exception to this is `outcoff.o', which exports _two_ output
+driver structures, since COFF and Win32 object file formats are very
+similar and most of the code is shared between them.
+
+nasm.c
+------
+
+This is the main program: it calls all the functions in the above
+modules, and puts them together to form a working assembler. We
+hope. :-)
+
+Segment Mechanism
+-----------------
+
+In NASM, the term `segment' is used to separate the different
+sections/segments/groups of which an object file is composed.
+Essentially, every address NASM is capable of understanding is
+expressed as an offset from the beginning of some segment.
+
+The defining property of a segment is that if two symbols are
+declared in the same segment, then the distance between them is
+fixed at assembly time. Hence every externally-declared variable
+must be declared in its own segment, since none of the locations of
+these are known, and so no distances may be computed at assembly
+time.
+
+The special segment value NO_SEG (-1) is used to denote an absolute
+value, e.g. a constant whose value does not depend on relocation,
+such as the _size_ of a data object.
+
+Apart from NO_SEG, segment indices all have their least significant
+bit clear, if they refer to actual in-memory segments. For each
+segment of this type, there is an auxiliary segment value, defined
+to be the same number but with the LSB set, which denotes the
+segment-base value of that segment, for object formats which support
+it (Microsoft .OBJ, for example).
+
+Hence, if `textsym' is declared in a code segment with index 2, then
+referencing `SEG textsym' would return zero offset from
+segment-index 3. Or, in object formats which don't understand such
+references, it would return an error instead.
+
+The next twist is SEG_ABS. Some symbols may be declared with a
+segment value of SEG_ABS plus a 16-bit constant: this indicates that
+they are far-absolute symbols, such as the BIOS keyboard buffer
+under MS-DOS, which always resides at 0040h:001Eh. Far-absolutes are
+handled with care in the parser, since they are supposed to evaluate
+simply to their offset part within expressions, but applying SEG to
+one should yield its segment part. A far-absolute should never find
+its way _out_ of the parser, unless it is enclosed in a WRT clause,
+in which case Microsoft 16-bit object formats will want to know
+about it.
+
+Porting Issues
+--------------
+
+We have tried to write NASM in portable ANSI C: we do not assume
+little-endianness or any hardware characteristics (in order that
+NASM should work as a cross-assembler for x86 platforms, even when
+run on other, stranger machines).
+
+Assumptions we _have_ made are:
+
+- We assume that `short' is at least 16 bits, and `long' at least
+ 32. This really _shouldn't_ be a problem, since Kernighan and
+ Ritchie tell us we are entitled to do so.
+
+- We rely on having more than 6 characters of significance on
+ externally linked symbols in the NASM sources. This may get fixed
+ at some point. We haven't yet come across a linker brain-dead
+ enough to get it wrong anyway.
+
+- We assume that `fopen' using the mode "wb" can be used to write
+ binary data files. This may be wrong on systems like VMS, with a
+ strange file system. Though why you'd want to run NASM on VMS is
+ beyond me anyway.
+
+That's it. Subject to those caveats, NASM should be completely
+portable. If not, we _really_ want to know about it.
+
+Porting Non-Issues
+------------------
+
+The following is _not_ a portability problem, although it looks like
+one.
+
+- When compiling with some versions of DJGPP, you may get errors
+ such as `warning: ANSI C forbids braced-groups within
+ expressions'. This isn't NASM's fault - the problem seems to be
+ that DJGPP's definitions of the <ctype.h> macros include a
+ GNU-specific C extension. So when compiling using -ansi and
+ -pedantic, DJGPP complains about its own header files. It isn't a
+ problem anyway, since it still generates correct code.
diff --git a/doc/local.css b/doc/local.css
new file mode 100644
index 00000000..dfee5220
--- /dev/null
+++ b/doc/local.css
@@ -0,0 +1 @@
+/* Add site-local nasmdoc style configuration to this file */
diff --git a/doc/nasmdoc.css b/doc/nasmdoc.css
new file mode 100644
index 00000000..6ad9e913
--- /dev/null
+++ b/doc/nasmdoc.css
@@ -0,0 +1,150 @@
+body {
+ font-family: "source sans pro", "clear sans", "liberation sans",
+ "arial", "sans-serif";
+ background: white;
+}
+div.title {
+ text-align: center;
+ font-weight: bold;
+ margin: 0.67em 0;
+}
+h1 {
+ font-size: 2em;
+ margin: 0;
+}
+span.subtitle {
+ font-size: 1.25em;
+ font-style: italic;
+}
+code, pre {
+ font-family: "source code pro", "liberation mono", "monospace";
+}
+pre, blockquote {
+ margin-left: 4em;
+ margin-right: 4em;
+}
+code {
+ display: inline;
+ white-space: nowrap;
+}
+a {
+ text-decoration: none;
+}
+div.toc {
+ padding-left: 0;
+ font-size: 195%;
+}
+div.toc li {
+ list-style-type: none;
+ padding-left: 0;
+}
+div.toc ol {
+ padding-left: 2em;
+ font-size: 80%;
+}
+li.toc1 {
+ padding-top: 0.7em;
+}
+li.toc2 {
+ padding-top: 0.3em;
+}
+ul.index {
+ list-style-type: none;
+}
+@media not screen {
+ ul.navbar {
+ display: none;
+ }
+}
+@media print {
+ a {
+ color: inherit;
+ }
+}
+@media only screen {
+ div.contents {
+ -webkit-column-gap: 4em;
+ -webkit-column-rule: 1px dotted black;
+ -moz-column-gap: 4em;
+ -moz-column-rule: 1px dotted black;
+ column-gap: 4em;
+ column-rule: 1px dotted black;
+ }
+}
+@media only screen and (min-width: 90em) {
+ /* For a very wide screen, go to a columnar layout */
+ div.contents {
+ -webkit-column-count: 2;
+ -moz-column-count: 2;
+ column-count: 2;
+ }
+}
+@media only screen and (min-width: 135em) {
+ div.contents {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ }
+}
+@media screen {
+ /* Setting an explicit margin to keep the navbar from moving */
+ body {
+ padding: 0;
+ margin: 8px;
+ }
+
+ /* Link styles */
+ a:link {
+ color: #33c;
+ }
+ a:visited {
+ color: #338;
+ }
+ a:hover {
+ background: #ccc;
+ }
+ a:active {
+ color: #f33;
+ background: #ccc;
+ }
+
+ /* Trick to avoid the navbar hiding the the target of an # link */
+ :target {
+ margin-top: -10vh;
+ padding-top: 10vh;
+ background: #ffa; /* Highlight the jump target */
+ background-clip: content-box;
+ }
+
+ ul.navbar {
+ display: block;
+ position: sticky;
+ top: 8px;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ white-space: nowrap;
+ list-style-type: none;
+ background: #336 url("nasmlogw.png") no-repeat right center;
+ background-size: contain;
+ }
+
+ ul.navbar li {
+ float: left;
+ }
+ ul.navbar li.last {
+ border-right: none;
+ }
+ ul.navbar a {
+ border-right: 1px solid #bbb;
+ display: block;
+ color: white;
+ text-align: center;
+ padding: 1em 1.5em;
+ text-decoration: none;
+ }
+ ul.navbar a:hover {
+ background-color: #448;
+ }
+}
diff --git a/doc/nasmdoc.src b/doc/nasmdoc.src
new file mode 100644
index 00000000..fb140e99
--- /dev/null
+++ b/doc/nasmdoc.src
@@ -0,0 +1,8442 @@
+\# --------------------------------------------------------------------------
+\#
+\# Copyright 1996-2018 The NASM Authors - All Rights Reserved
+\# See the file AUTHORS included with the NASM distribution for
+\# the specific copyright holders.
+\#
+\# Redistribution and use in source and binary forms, with or without
+\# modification, are permitted provided that the following
+\# conditions are met:
+\#
+\# * Redistributions of source code must retain the above copyright
+\# notice, this list of conditions and the following disclaimer.
+\# * 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 COPYRIGHT OWNER 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.
+\#
+\# --------------------------------------------------------------------------
+\#
+\# Source code to NASM documentation
+\#
+
+\M{category}{Programming}
+\M{title}{NASM - The Netwide Assembler}
+\M{year}{1996-2017}
+\M{author}{The NASM Development Team}
+\M{copyright_tail}{-- All Rights Reserved}
+\M{license}{This document is redistributable under the license given in the file "LICENSE" distributed in the NASM archive.}
+\M{summary}{This file documents NASM, the Netwide Assembler: an assembler targetting the Intel x86 series of processors, with portable source.}
+\M{infoname}{NASM}
+\M{infofile}{nasm}
+\M{infotitle}{The Netwide Assembler for x86}
+\M{epslogo}{nasmlogo.eps}
+\M{logoyadj}{-72}
+
+\& version.src
+
+\IR{-D} \c{-D} option
+\IR{-E} \c{-E} option
+\IR{-F} \c{-F} option
+\IR{-I} \c{-I} option
+\IR{-M} \c{-M} option
+\IR{-MD} \c{-MD} option
+\IR{-MF} \c{-MF} option
+\IR{-MG} \c{-MG} option
+\IR{-MP} \c{-MP} option
+\IR{-MQ} \c{-MQ} option
+\IR{-MT} \c{-MT} option
+\IR{-MW} \c{-MW} option
+\IR{-O} \c{-O} option
+\IR{-P} \c{-P} option
+\IR{-U} \c{-U} option
+\IR{-X} \c{-X} option
+\IR{-a} \c{-a} option
+\IR{-d} \c{-d} option
+\IR{-e} \c{-e} option
+\IR{-f} \c{-f} option
+\IR{-g} \c{-g} option
+\IR{-i} \c{-i} option
+\IR{-l} \c{-l} option
+\IR{-o} \c{-o} option
+\IR{-p} \c{-p} option
+\IR{-s} \c{-s} option
+\IR{-u} \c{-u} option
+\IR{-v} \c{-v} option
+\IR{-W} \c{-W} option
+\IR{-Werror} \c{-Werror} option
+\IR{-Wno-error} \c{-Wno-error} option
+\IR{-w} \c{-w} option
+\IR{-y} \c{-y} option
+\IR{-Z} \c{-Z} option
+\IR{!=} \c{!=} operator
+\IR{$, here} \c{$}, Here token
+\IR{$, prefix} \c{$}, prefix
+\IR{$$} \c{$$} token
+\IR{%} \c{%} operator
+\IR{%%} \c{%%} operator
+\IR{%+1} \c{%+1} and \c{%-1} syntax
+\IA{%-1}{%+1}
+\IR{%0} \c{%0} parameter count
+\IR{&} \c{&} operator
+\IR{&&} \c{&&} operator
+\IR{*} \c{*} operator
+\IR{..@} \c{..@} symbol prefix
+\IR{/} \c{/} operator
+\IR{//} \c{//} operator
+\IR{<} \c{<} operator
+\IR{<<} \c{<<} operator
+\IR{<=} \c{<=} operator
+\IR{<>} \c{<>} operator
+\IR{=} \c{=} operator
+\IR{==} \c{==} operator
+\IR{>} \c{>} operator
+\IR{>=} \c{>=} operator
+\IR{>>} \c{>>} operator
+\IR{?} \c{?} MASM syntax
+\IR{^} \c{^} operator
+\IR{^^} \c{^^} operator
+\IR{|} \c{|} operator
+\IR{||} \c{||} operator
+\IR{~} \c{~} operator
+\IR{%$} \c{%$} and \c{%$$} prefixes
+\IA{%$$}{%$}
+\IR{+ opaddition} \c{+} operator, binary
+\IR{+ opunary} \c{+} operator, unary
+\IR{+ modifier} \c{+} modifier
+\IR{- opsubtraction} \c{-} operator, binary
+\IR{- opunary} \c{-} operator, unary
+\IR{! opunary} \c{!} operator, unary
+\IR{alignment, in bin sections} alignment, in \c{bin} sections
+\IR{alignment, in elf sections} alignment, in \c{elf} sections
+\IR{alignment, in win32 sections} alignment, in \c{win32} sections
+\IR{alignment, of elf common variables} alignment, of \c{elf} common
+variables
+\IR{alignment, in obj sections} alignment, in \c{obj} sections
+\IR{a.out, bsd version} \c{a.out}, BSD version
+\IR{a.out, linux version} \c{a.out}, Linux version
+\IR{autoconf} Autoconf
+\IR{bin} bin
+\IR{bitwise and} bitwise AND
+\IR{bitwise or} bitwise OR
+\IR{bitwise xor} bitwise XOR
+\IR{block ifs} block IFs
+\IR{borland pascal} Borland, Pascal
+\IR{borland's win32 compilers} Borland, Win32 compilers
+\IR{braces, after % sign} braces, after \c{%} sign
+\IR{bsd} BSD
+\IR{c calling convention} C calling convention
+\IR{c symbol names} C symbol names
+\IA{critical expressions}{critical expression}
+\IA{command line}{command-line}
+\IA{case sensitivity}{case sensitive}
+\IA{case-sensitive}{case sensitive}
+\IA{case-insensitive}{case sensitive}
+\IA{character constants}{character constant}
+\IR{codeview} CodeView debugging format
+\IR{common object file format} Common Object File Format
+\IR{common variables, alignment in elf} common variables, alignment
+in \c{elf}
+\IR{common, elf extensions to} \c{COMMON}, \c{elf} extensions to
+\IR{common, obj extensions to} \c{COMMON}, \c{obj} extensions to
+\IR{declaring structure} declaring structures
+\IR{default-wrt mechanism} default-\c{WRT} mechanism
+\IR{devpac} DevPac
+\IR{djgpp} DJGPP
+\IR{dll symbols, exporting} DLL symbols, exporting
+\IR{dll symbols, importing} DLL symbols, importing
+\IR{dos} DOS
+\IR{dos archive} DOS archive
+\IR{dos source archive} DOS source archive
+\IA{effective address}{effective addresses}
+\IA{effective-address}{effective addresses}
+\IR{elf} ELF
+\IR{elf, 16-bit code and} ELF, 16-bit code and
+\IR{elf shared libraries} ELF, shared libraries
+\IR{elf32} \c{elf32}
+\IR{elf64} \c{elf64}
+\IR{elfx32} \c{elfx32}
+\IR{executable and linkable format} Executable and Linkable Format
+\IR{extern, obj extensions to} \c{EXTERN}, \c{obj} extensions to
+\IR{extern, rdf extensions to} \c{EXTERN}, \c{rdf} extensions to
+\IR{floating-point, constants} floating-point, constants
+\IR{floating-point, packed bcd constants} floating-point, packed BCD constants
+\IR{freebsd} FreeBSD
+\IR{freelink} FreeLink
+\IR{functions, c calling convention} functions, C calling convention
+\IR{functions, pascal calling convention} functions, Pascal calling
+convention
+\IR{global, aoutb extensions to} \c{GLOBAL}, \c{aoutb} extensions to
+\IR{global, elf extensions to} \c{GLOBAL}, \c{elf} extensions to
+\IR{global, rdf extensions to} \c{GLOBAL}, \c{rdf} extensions to
+\IR{got} GOT
+\IR{got relocations} \c{GOT} relocations
+\IR{gotoff relocation} \c{GOTOFF} relocations
+\IR{gotpc relocation} \c{GOTPC} relocations
+\IR{intel number formats} Intel number formats
+\IR{linux, elf} Linux, ELF
+\IR{linux, a.out} Linux, \c{a.out}
+\IR{linux, as86} Linux, \c{as86}
+\IR{logical and} logical AND
+\IR{logical or} logical OR
+\IR{logical xor} logical XOR
+\IR{mach object file format} Mach, object file format
+\IA{mach-o}{macho}
+\IR{mach-o} Mach-O, object file format
+\IR{macho32} \c{macho32}
+\IR{macho64} \c{macho64}
+\IR{macos x} MacOS X
+\IR{masm} MASM
+\IA{memory reference}{memory references}
+\IR{minix} Minix
+\IA{misc directory}{misc subdirectory}
+\IR{misc subdirectory} \c{misc} subdirectory
+\IR{microsoft omf} Microsoft OMF
+\IR{mmx registers} MMX registers
+\IA{modr/m}{modr/m byte}
+\IR{modr/m byte} ModR/M byte
+\IR{ms-dos} MS-DOS
+\IR{ms-dos device drivers} MS-DOS device drivers
+\IR{multipush} \c{multipush} macro
+\IR{nan} NaN
+\IR{nasm version} NASM version
+\IR{netbsd} NetBSD
+\IR{nsis} NSIS
+\IR{nullsoft scriptable installer} Nullsoft Scriptable Installer
+\IR{omf} OMF
+\IR{openbsd} OpenBSD
+\IR{operating system} operating system
+\IR{os/2} OS/2
+\IR{pascal calling convention}Pascal calling convention
+\IR{passes} passes, assembly
+\IR{perl} Perl
+\IR{pic} PIC
+\IR{pharlap} PharLap
+\IR{plt} PLT
+\IR{plt} \c{PLT} relocations
+\IA{pre-defining macros}{pre-define}
+\IA{preprocessor expressions}{preprocessor, expressions}
+\IA{preprocessor loops}{preprocessor, loops}
+\IA{preprocessor variables}{preprocessor, variables}
+\IA{rdoff subdirectory}{rdoff}
+\IR{rdoff} \c{rdoff} subdirectory
+\IR{relocatable dynamic object file format} Relocatable Dynamic
+Object File Format
+\IR{relocations, pic-specific} relocations, PIC-specific
+\IA{repeating}{repeating code}
+\IR{section alignment, in elf} section alignment, in \c{elf}
+\IR{section alignment, in bin} section alignment, in \c{bin}
+\IR{section alignment, in obj} section alignment, in \c{obj}
+\IR{section alignment, in win32} section alignment, in \c{win32}
+\IR{section, elf extensions to} \c{SECTION}, \c{elf} extensions to
+\IR{section, macho extensions to} \c{SECTION}, \c{macho} extensions to
+\IR{section, win32 extensions to} \c{SECTION}, \c{win32} extensions to
+\IR{segment alignment, in bin} segment alignment, in \c{bin}
+\IR{segment alignment, in obj} segment alignment, in \c{obj}
+\IR{segment, obj extensions to} \c{SEGMENT}, \c{elf} extensions to
+\IR{segment names, borland pascal} segment names, Borland Pascal
+\IR{shift command} \c{shift} command
+\IA{sib}{sib byte}
+\IR{sib byte} SIB byte
+\IR{align, smart} \c{ALIGN}, smart
+\IA{sectalign}{sectalign}
+\IR{solaris x86} Solaris x86
+\IA{standard section names}{standardized section names}
+\IR{symbols, exporting from dlls} symbols, exporting from DLLs
+\IR{symbols, importing from dlls} symbols, importing from DLLs
+\IR{test subdirectory} \c{test} subdirectory
+\IR{tlink} \c{TLINK}
+\IR{underscore, in c symbols} underscore, in C symbols
+\IR{unicode} Unicode
+\IR{unix} Unix
+\IR{utf-8} UTF-8
+\IR{utf-16} UTF-16
+\IR{utf-32} UTF-32
+\IA{sco unix}{unix, sco}
+\IR{unix, sco} Unix, SCO
+\IA{unix source archive}{unix, source archive}
+\IR{unix, source archive} Unix, source archive
+\IA{unix system v}{unix, system v}
+\IR{unix, system v} Unix, System V
+\IR{unixware} UnixWare
+\IR{val} VAL
+\IR{version number of nasm} version number of NASM
+\IR{visual c++} Visual C++
+\IR{www page} WWW page
+\IR{win32} Win32
+\IR{win32} Win64
+\IR{windows} Windows
+\IR{windows 95} Windows 95
+\IR{windows nt} Windows NT
+\# \IC{program entry point}{entry point, program}
+\# \IC{program entry point}{start point, program}
+\# \IC{MS-DOS device drivers}{device drivers, MS-DOS}
+\# \IC{16-bit mode, versus 32-bit mode}{32-bit mode, versus 16-bit mode}
+\# \IC{c symbol names}{symbol names, in C}
+
+
+\C{intro} Introduction
+
+\H{whatsnasm} What Is NASM?
+
+The Netwide Assembler, NASM, is an 80x86 and x86-64 assembler designed
+for portability and modularity. It supports a range of object file
+formats, including Linux and \c{*BSD} \c{a.out}, \c{ELF}, \c{COFF},
+\c{Mach-O}, 16-bit and 32-bit \c{OBJ} (OMF) format, \c{Win32} and
+\c{Win64}. It will also output plain binary files, Intel hex and
+Motorola S-Record formats. Its syntax is designed to be simple and
+easy to understand, similar to the syntax in the Intel Software
+Developer Manual with minimal complexity. It supports all currently
+known x86 architectural extensions, and has strong support for macros.
+
+NASM also comes with a set of utilities for handling the \c{RDOFF}
+custom object-file format.
+
+\S{legal} \i{License} Conditions
+
+Please see the file \c{LICENSE}, supplied as part of any NASM
+distribution archive, for the license conditions under which you may
+use NASM. NASM is now under the so-called 2-clause BSD license, also
+known as the simplified BSD license.
+
+Copyright 1996-2017 the NASM Authors - All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+\b Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+\b 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 COPYRIGHT OWNER 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.
+
+\C{running} Running NASM
+
+\H{syntax} NASM \i{Command-Line} Syntax
+
+To assemble a file, you issue a command of the form
+
+\c nasm -f <format> <filename> [-o <output>]
+
+For example,
+
+\c nasm -f elf myfile.asm
+
+will assemble \c{myfile.asm} into an \c{ELF} object file \c{myfile.o}. And
+
+\c nasm -f bin myfile.asm -o myfile.com
+
+will assemble \c{myfile.asm} into a raw binary file \c{myfile.com}.
+
+To produce a listing file, with the hex codes output from NASM
+displayed on the left of the original sources, use the \c{-l} option
+to give a listing file name, for example:
+
+\c nasm -f coff myfile.asm -l myfile.lst
+
+To get further usage instructions from NASM, try typing
+
+\c nasm -h
+
+\c{--help} option is also the same.
+
+As \c{-hf}, this will also list the available output file formats, and what they
+are.
+
+If you use Linux but aren't sure whether your system is \c{a.out}
+or \c{ELF}, type
+
+\c file nasm
+
+(in the directory in which you put the NASM binary when you
+installed it). If it says something like
+
+\c nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
+
+then your system is \c{ELF}, and you should use the option \c{-f elf}
+when you want NASM to produce Linux object files. If it says
+
+\c nasm: Linux/i386 demand-paged executable (QMAGIC)
+
+or something similar, your system is \c{a.out}, and you should use
+\c{-f aout} instead (Linux \c{a.out} systems have long been obsolete,
+and are rare these days.)
+
+Like Unix compilers and assemblers, NASM is silent unless it
+goes wrong: you won't see any output at all, unless it gives error
+messages.
+
+
+\S{opt-o} The \i\c{-o} Option: Specifying the Output File Name
+
+NASM will normally choose the name of your output file for you;
+precisely how it does this is dependent on the object file format.
+For Microsoft object file formats (\c{obj}, \c{win32} and \c{win64}),
+it will remove the \c{.asm} \i{extension} (or whatever extension you
+like to use - NASM doesn't care) from your source file name and
+substitute \c{.obj}. For Unix object file formats (\c{aout}, \c{as86},
+\c{coff}, \c{elf32}, \c{elf64}, \c{elfx32}, \c{ieee}, \c{macho32} and
+\c{macho64}) it will substitute \c{.o}. For \c{dbg}, \c{rdf}, \c{ith}
+and \c{srec}, it will use \c{.dbg}, \c{.rdf}, \c{.ith} and \c{.srec},
+respectively, and for the \c{bin} format it will simply remove the
+extension, so that \c{myfile.asm} produces the output file \c{myfile}.
+
+If the output file already exists, NASM will overwrite it, unless it
+has the same name as the input file, in which case it will give a
+warning and use \i\c{nasm.out} as the output file name instead.
+
+For situations in which this behaviour is unacceptable, NASM
+provides the \c{-o} command-line option, which allows you to specify
+your desired output file name. You invoke \c{-o} by following it
+with the name you wish for the output file, either with or without
+an intervening space. For example:
+
+\c nasm -f bin program.asm -o program.com
+\c nasm -f bin driver.asm -odriver.sys
+
+Note that this is a small o, and is different from a capital O , which
+is used to specify the number of optimisation passes required. See \k{opt-O}.
+
+
+\S{opt-f} The \i\c{-f} Option: Specifying the \i{Output File Format}
+
+If you do not supply the \c{-f} option to NASM, it will choose an
+output file format for you itself. In the distribution versions of
+NASM, the default is always \i\c{bin}; if you've compiled your own
+copy of NASM, you can redefine \i\c{OF_DEFAULT} at compile time and
+choose what you want the default to be.
+
+Like \c{-o}, the intervening space between \c{-f} and the output
+file format is optional; so \c{-f elf} and \c{-felf} are both valid.
+
+A complete list of the available output file formats can be given by
+issuing the command \i\c{nasm -hf}.
+
+
+\S{opt-l} The \i\c{-l} Option: Generating a \i{Listing File}
+
+If you supply the \c{-l} option to NASM, followed (with the usual
+optional space) by a file name, NASM will generate a
+\i{source-listing file} for you, in which addresses and generated
+code are listed on the left, and the actual source code, with
+expansions of multi-line macros (except those which specifically
+request no expansion in source listings: see \k{nolist}) on the
+right. For example:
+
+\c nasm -f elf myfile.asm -l myfile.lst
+
+If a list file is selected, you may turn off listing for a
+section of your source with \c{[list -]}, and turn it back on
+with \c{[list +]}, (the default, obviously). There is no "user
+form" (without the brackets). This can be used to list only
+sections of interest, avoiding excessively long listings.
+
+
+\S{opt-M} The \i\c{-M} Option: Generate \i{Makefile Dependencies}
+
+This option can be used to generate makefile dependencies on stdout.
+This can be redirected to a file for further processing. For example:
+
+\c nasm -M myfile.asm > myfile.dep
+
+
+\S{opt-MG} The \i\c{-MG} Option: Generate \i{Makefile Dependencies}
+
+This option can be used to generate makefile dependencies on stdout.
+This differs from the \c{-M} option in that if a nonexisting file is
+encountered, it is assumed to be a generated file and is added to the
+dependency list without a prefix.
+
+
+\S{opt-MF} The \i\c\{-MF} Option: Set Makefile Dependency File
+
+This option can be used with the \c{-M} or \c{-MG} options to send the
+output to a file, rather than to stdout. For example:
+
+\c nasm -M -MF myfile.dep myfile.asm
+
+
+\S{opt-MD} The \i\c{-MD} Option: Assemble and Generate Dependencies
+
+The \c{-MD} option acts as the combination of the \c{-M} and \c{-MF}
+options (i.e. a filename has to be specified.) However, unlike the
+\c{-M} or \c{-MG} options, \c{-MD} does \e{not} inhibit the normal
+operation of the assembler. Use this to automatically generate
+updated dependencies with every assembly session. For example:
+
+\c nasm -f elf -o myfile.o -MD myfile.dep myfile.asm
+
+
+\S{opt-MT} The \i\c{-MT} Option: Dependency Target Name
+
+The \c{-MT} option can be used to override the default name of the
+dependency target. This is normally the same as the output filename,
+specified by the \c{-o} option.
+
+
+\S{opt-MQ} The \i\c{-MQ} Option: Dependency Target Name (Quoted)
+
+The \c{-MQ} option acts as the \c{-MT} option, except it tries to
+quote characters that have special meaning in Makefile syntax. This
+is not foolproof, as not all characters with special meaning are
+quotable in Make. The default output (if no \c{-MT} or \c{-MQ} option
+is specified) is automatically quoted.
+
+
+\S{opt-MP} The \i\c{-MP} Option: Emit phony targets
+
+When used with any of the dependency generation options, the \c{-MP}
+option causes NASM to emit a phony target without dependencies for
+each header file. This prevents Make from complaining if a header
+file has been removed.
+
+
+\S{opt-MW} The \i\c{-MW} Option: Watcom Make quoting style
+
+This option causes NASM to attempt to quote dependencies according to
+Watcom Make conventions rather than POSIX Make conventions (also used
+by most other Make variants.) This quotes \c{#} as \c{$#} rather than
+\c{\\#}, uses \c{&} rather than \c{\\} for continuation lines, and
+encloses filenames containing whitespace in double quotes.
+
+
+\S{opt-F} The \i\c{-F} Option: Selecting a \i{Debug Information Format}
+
+This option is used to select the format of the debug information
+emitted into the output file, to be used by a debugger (or \e{will}
+be). Prior to version 2.03.01, the use of this switch did \e{not} enable
+output of the selected debug info format. Use \c{-g}, see \k{opt-g},
+to enable output. Versions 2.03.01 and later automatically enable \c{-g}
+if \c{-F} is specified.
+
+A complete list of the available debug file formats for an output
+format can be seen by issuing the command \c{nasm -f <format> -y}. Not
+all output formats currently support debugging output. See \k{opt-y}.
+
+This should not be confused with the \c{-f dbg} output format option,
+see \k{dbgfmt}.
+
+
+\S{opt-g} The \i\c{-g} Option: Enabling \i{Debug Information}.
+
+This option can be used to generate debugging information in the specified
+format. See \k{opt-F}. Using \c{-g} without \c{-F} results in emitting
+debug info in the default format, if any, for the selected output format.
+If no debug information is currently implemented in the selected output
+format, \c{-g} is \e{silently ignored}.
+
+
+\S{opt-X} The \i\c{-X} Option: Selecting an \i{Error Reporting Format}
+
+This option can be used to select an error reporting format for any
+error messages that might be produced by NASM.
+
+Currently, two error reporting formats may be selected. They are
+the \c{-Xvc} option and the \c{-Xgnu} option. The GNU format is
+the default and looks like this:
+
+\c filename.asm:65: error: specific error message
+
+where \c{filename.asm} is the name of the source file in which the
+error was detected, \c{65} is the source file line number on which
+the error was detected, \c{error} is the severity of the error (this
+could be \c{warning}), and \c{specific error message} is a more
+detailed text message which should help pinpoint the exact problem.
+
+The other format, specified by \c{-Xvc} is the style used by Microsoft
+Visual C++ and some other programs. It looks like this:
+
+\c filename.asm(65) : error: specific error message
+
+where the only difference is that the line number is in parentheses
+instead of being delimited by colons.
+
+See also the \c{Visual C++} output format, \k{win32fmt}.
+
+\S{opt-Z} The \i\c{-Z} Option: Send Errors to a File
+
+Under \I{DOS}\c{MS-DOS} it can be difficult (though there are ways) to
+redirect the standard-error output of a program to a file. Since
+NASM usually produces its warning and \i{error messages} on
+\i\c{stderr}, this can make it hard to capture the errors if (for
+example) you want to load them into an editor.
+
+NASM therefore provides the \c{-Z} option, taking a filename argument
+which causes errors to be sent to the specified files rather than
+standard error. Therefore you can \I{redirecting errors}redirect
+the errors into a file by typing
+
+\c nasm -Z myfile.err -f obj myfile.asm
+
+In earlier versions of NASM, this option was called \c{-E}, but it was
+changed since \c{-E} is an option conventionally used for
+preprocessing only, with disastrous results. See \k{opt-E}.
+
+\S{opt-s} The \i\c{-s} Option: Send Errors to \i\c{stdout}
+
+The \c{-s} option redirects \i{error messages} to \c{stdout} rather
+than \c{stderr}, so it can be redirected under \I{DOS}\c{MS-DOS}. To
+assemble the file \c{myfile.asm} and pipe its output to the \c{more}
+program, you can type:
+
+\c nasm -s -f obj myfile.asm | more
+
+See also the \c{-Z} option, \k{opt-Z}.
+
+
+\S{opt-i} The \i\c{-i}\I\c{-I} Option: Include File Search Directories
+
+When NASM sees the \i\c{%include} or \i\c{%pathsearch} directive in a
+source file (see \k{include}, \k{pathsearch} or \k{incbin}), it will
+search for the given file not only in the current directory, but also
+in any directories specified on the command line by the use of the
+\c{-i} option. Therefore you can include files from a \i{macro
+library}, for example, by typing
+
+\c nasm -ic:\macrolib\ -f obj myfile.asm
+
+(As usual, a space between \c{-i} and the path name is allowed, and
+optional).
+
+NASM, in the interests of complete source-code portability, does not
+understand the file naming conventions of the OS it is running on;
+the string you provide as an argument to the \c{-i} option will be
+prepended exactly as written to the name of the include file.
+Therefore the trailing backslash in the above example is necessary.
+Under Unix, a trailing forward slash is similarly necessary.
+
+(You can use this to your advantage, if you're really \i{perverse},
+by noting that the option \c{-ifoo} will cause \c{%include "bar.i"}
+to search for the file \c{foobar.i}...)
+
+If you want to define a \e{standard} \i{include search path},
+similar to \c{/usr/include} on Unix systems, you should place one or
+more \c{-i} directives in the \c{NASMENV} environment variable (see
+\k{nasmenv}).
+
+For Makefile compatibility with many C compilers, this option can also
+be specified as \c{-I}.
+
+
+\S{opt-p} The \i\c{-p}\I\c{-P} Option: \I{pre-including files}Pre-Include a File
+
+\I\c{%include}NASM allows you to specify files to be
+\e{pre-included} into your source file, by the use of the \c{-p}
+option. So running
+
+\c nasm myfile.asm -p myinc.inc
+
+is equivalent to running \c{nasm myfile.asm} and placing the
+directive \c{%include "myinc.inc"} at the start of the file.
+
+\c{--include} option is also accepted.
+
+For consistency with the \c{-I}, \c{-D} and \c{-U} options, this
+option can also be specified as \c{-P}.
+
+
+
+\S{opt-d} The \i\c{-d}\I\c{-D} Option: \I{pre-defining macros}Pre-Define a Macro
+
+\I\c{%define}Just as the \c{-p} option gives an alternative to placing
+\c{%include} directives at the start of a source file, the \c{-d}
+option gives an alternative to placing a \c{%define} directive. You
+could code
+
+\c nasm myfile.asm -dFOO=100
+
+as an alternative to placing the directive
+
+\c %define FOO 100
+
+at the start of the file. You can miss off the macro value, as well:
+the option \c{-dFOO} is equivalent to coding \c{%define FOO}. This
+form of the directive may be useful for selecting \i{assembly-time
+options} which are then tested using \c{%ifdef}, for example
+\c{-dDEBUG}.
+
+For Makefile compatibility with many C compilers, this option can also
+be specified as \c{-D}.
+
+
+\S{opt-u} The \i\c{-u}\I\c{-U} Option: \I{Undefining macros}Undefine a Macro
+
+\I\c{%undef}The \c{-u} option undefines a macro that would otherwise
+have been pre-defined, either automatically or by a \c{-p} or \c{-d}
+option specified earlier on the command lines.
+
+For example, the following command line:
+
+\c nasm myfile.asm -dFOO=100 -uFOO
+
+would result in \c{FOO} \e{not} being a predefined macro in the
+program. This is useful to override options specified at a different
+point in a Makefile.
+
+For Makefile compatibility with many C compilers, this option can also
+be specified as \c{-U}.
+
+
+\S{opt-E} The \i\c{-E}\I{-e} Option: Preprocess Only
+
+NASM allows the \i{preprocessor} to be run on its own, up to a
+point. Using the \c{-E} option (which requires no arguments) will
+cause NASM to preprocess its input file, expand all the macro
+references, remove all the comments and preprocessor directives, and
+print the resulting file on standard output (or save it to a file,
+if the \c{-o} option is also used).
+
+This option cannot be applied to programs which require the
+preprocessor to evaluate \I{preprocessor expressions}\i{expressions}
+which depend on the values of symbols: so code such as
+
+\c %assign tablesize ($-tablestart)
+
+will cause an error in \i{preprocess-only mode}.
+
+For compatiblity with older version of NASM, this option can also be
+written \c{-e}. \c{-E} in older versions of NASM was the equivalent
+of the current \c{-Z} option, \k{opt-Z}.
+
+\S{opt-a} The \i\c{-a} Option: Don't Preprocess At All
+
+If NASM is being used as the back end to a compiler, it might be
+desirable to \I{suppressing preprocessing}suppress preprocessing
+completely and assume the compiler has already done it, to save time
+and increase compilation speeds. The \c{-a} option, requiring no
+argument, instructs NASM to replace its powerful \i{preprocessor}
+with a \i{stub preprocessor} which does nothing.
+
+
+\S{opt-O} The \i\c{-O} Option: Specifying \i{Multipass Optimization}
+
+Using the \c{-O} option, you can tell NASM to carry out different
+levels of optimization. The syntax is:
+
+\b \c{-O0}: No optimization. All operands take their long forms,
+ if a short form is not specified, except conditional jumps.
+ This is intended to match NASM 0.98 behavior.
+
+\b \c{-O1}: Minimal optimization. As above, but immediate operands
+ which will fit in a signed byte are optimized,
+ unless the long form is specified. Conditional jumps default
+ to the long form unless otherwise specified.
+
+\b \c{-Ox} (where \c{x} is the actual letter \c{x}): Multipass optimization.
+ Minimize branch offsets and signed immediate bytes,
+ overriding size specification unless the \c{strict} keyword
+ has been used (see \k{strict}). For compatibility with earlier
+ releases, the letter \c{x} may also be any number greater than
+ one. This number has no effect on the actual number of passes.
+
+The \c{-Ox} mode is recommended for most uses, and is the default
+since NASM 2.09.
+
+Note that this is a capital \c{O}, and is different from a small \c{o}, which
+is used to specify the output file name. See \k{opt-o}.
+
+
+\S{opt-t} The \i\c{-t} Option: Enable TASM Compatibility Mode
+
+NASM includes a limited form of compatibility with Borland's \i\c{TASM}.
+When NASM's \c{-t} option is used, the following changes are made:
+
+\b local labels may be prefixed with \c{@@} instead of \c{.}
+
+\b size override is supported within brackets. In TASM compatible mode,
+a size override inside square brackets changes the size of the operand,
+and not the address type of the operand as it does in NASM syntax. E.g.
+\c{mov eax,[DWORD val]} is valid syntax in TASM compatibility mode.
+Note that you lose the ability to override the default address type for
+the instruction.
+
+\b unprefixed forms of some directives supported (\c{arg}, \c{elif},
+\c{else}, \c{endif}, \c{if}, \c{ifdef}, \c{ifdifi}, \c{ifndef},
+\c{include}, \c{local})
+
+\S{opt-w} The \i\c{-w} and \i\c{-W} Options: Enable or Disable Assembly \i{Warnings}
+
+NASM can observe many conditions during the course of assembly which
+are worth mentioning to the user, but not a sufficiently severe
+error to justify NASM refusing to generate an output file. These
+conditions are reported like errors, but come up with the word
+`warning' before the message. Warnings do not prevent NASM from
+generating an output file and returning a success status to the
+operating system.
+
+Some conditions are even less severe than that: they are only
+sometimes worth mentioning to the user. Therefore NASM supports the
+\c{-w} command-line option, which enables or disables certain
+classes of assembly warning. Such warning classes are described by a
+name, for example \c{orphan-labels}; you can enable warnings of
+this class by the command-line option \c{-w+orphan-labels} and
+disable it by \c{-w-orphan-labels}.
+
+The current \i{warning classes} are:
+
+\b \i\c{other} specifies any warning not otherwise specified in any
+class. Enabled by default.
+
+\b \i\c{macro-params} covers warnings about \i{multi-line macros}
+being invoked with the wrong number of parameters. Enabled by default;
+see \k{mlmacover} for an example of why you might want to disable it.
+
+\b \i\c{macro-selfref} warns if a macro references itself. Disabled by
+default.
+
+\b \i\c{macro-defaults} warns when a macro has more default parameters
+than optional parameters. Enabled by default; see \k{mlmacdef} for why
+you might want to disable it.
+
+\b \i\c{orphan-labels} covers warnings about source lines which
+contain no instruction but define a label without a trailing colon.
+NASM warns about this somewhat obscure condition by default;
+see \k{syntax} for more information.
+
+\b \i\c{number-overflow} covers warnings about numeric constants which
+don't fit in 64 bits. Enabled by default.
+
+\b \i\c{gnu-elf-extensions} warns if 8-bit or 16-bit relocations
+are used in \c{-f elf} format. The GNU extensions allow this.
+Disabled by default.
+
+\b \i\c{float-overflow} warns about floating point overflow.
+Enabled by default.
+
+\b \i\c{float-denorm} warns about floating point denormals.
+Disabled by default.
+
+\b \i\c{float-underflow} warns about floating point underflow.
+Disabled by default.
+
+\b \i\c{float-toolong} warns about too many digits in floating-point numbers.
+Enabled by default.
+
+\b \i\c{user} controls \c{%warning} directives (see \k{pperror}).
+Enabled by default.
+
+\b \i\c{lock} warns about \c{LOCK} prefixes on unlockable instructions.
+Enabled by default.
+
+\b \i\c{hle} warns about invalid use of the HLE \c{XACQUIRE} or \c{XRELEASE}
+prefixes.
+Enabled by default.
+
+\b \i\c{bnd} warns about ineffective use of the \c{BND} prefix when a relaxed
+form of jmp instruction becomes jmp short form.
+Enabled by default.
+
+\b \i\c{zext-reloc} warns that a relocation has been zero-extended due
+to limitations in the output format. Enabled by default.
+
+\b \i\c\{ptr} warns about keywords used in other assemblers that might
+indicate a mistake in the source code. Currently only the MASM
+\c{PTR} keyword is recognized. Enabled by default.
+
+\b \i\c{bad-pragma} warns about a malformed or otherwise unparsable
+\c{%pragma} directive. Disabled by default.
+
+\b \i\c{unknown-pragma} warns about an unknown \c{%pragma} directive.
+This is not yet implemented. Disabled by default.
+
+\b \i\c{not-my-pragma} warns about a \c{%pragma} directive which is
+not applicable to this particular assembly session. This is not yet
+implemented. Disabled by default.
+
+\b \i\c{unknown-warning} warns about a \c{-w} or \c{-W} option or a
+\c{[WARNING]} directive that contains an unknown warning name or is
+otherwise not possible to process. Disabled by default.
+
+\b \i\c{all} is an alias for \e{all} suppressible warning classes.
+Thus, \c{-w+all} enables all available warnings, and \c{-w-all}
+disables warnings entirely (since NASM 2.13).
+
+Since version 2.00, NASM has also supported the \c{gcc}-like syntax
+\c{-Wwarning-class} and \c{-Wno-warning-class} instead of
+\c{-w+warning-class} and \c{-w-warning-class}, respectively; both
+syntaxes work identically.
+
+The option \c{-w+error} or \i\c{-Werror} can be used to treat warnings
+as errors. This can be controlled on a per warning class basis
+(\c{-w+error=}\e{warning-class} or \c{-Werror=}\e{warning-class});
+if no \e{warning-class} is specified NASM treats it as
+\c{-w+error=all}; the same applies to \c{-w-error} or
+\i\c{-Wno-error},
+of course.
+
+In addition, you can control warnings in the source code itself, using
+the \i\c{[WARNING]} directive. See \k{asmdir-warning}.
+
+
+\S{opt-v} The \i\c{-v} Option: Display \i{Version} Info
+
+Typing \c{NASM -v} will display the version of NASM which you are using,
+and the date on which it was compiled.
+
+You will need the version number if you report a bug.
+
+For command-line compatibility with Yasm, the form \i\c{--v} is also
+accepted for this option starting in NASM version 2.11.05.
+
+\S{opt-y} The \i\c{-y} Option: Display Available Debug Info Formats
+
+Typing \c{nasm -f <option> -y} will display a list of the available
+debug info formats for the given output format. The default format
+is indicated by an asterisk. For example:
+
+\c nasm -f elf -y
+
+\c valid debug formats for 'elf32' output format are
+\c ('*' denotes default):
+\c * stabs ELF32 (i386) stabs debug format for Linux
+\c dwarf elf32 (i386) dwarf debug format for Linux
+
+
+\S{opt-pfix} The \i\c{--(g|l)prefix}, \i\c{--(g|l)postfix} Options.
+
+The \c{--(g)prefix} options prepend the given argument
+to all \c{extern}, \c{common}, \c{static}, and \c{global} symbols, and the
+\c{--lprefix} option prepends to all other symbols. Similarly,
+\c{--(g)postfix} and \c{--lpostfix} options append
+the argument in the exactly same way as the \c{--xxprefix} options does.
+
+Running this:
+
+\c nasm -f macho --gprefix _
+
+is equivalent to place the directive with \c{%pragma macho gprefix _}
+at the start of the file (\k{mangling}). It will prepend the underscore
+to all global and external variables, as C requires it in some, but not all,
+system calling conventions.
+
+\S{opt-pragma} The \i\c{--pragma} Option
+
+NASM accepts an argument as \c{%pragma} option, which is like placing
+a \c{%pragma} preprocess statement at the beginning of the source.
+Running this:
+
+\c nasm -f macho --pragma "macho gprefix _"
+
+is equivalent to the example in \k{opt-pfix}.
+
+
+\S{opt-before} The \i\c{--before} Option
+
+A preprocess statement can be accepted with this option. The example
+shown in \k{opt-pragma} is the same as running this:
+
+\c nasm -f macho --before "%pragma macho gprefix _"
+
+
+\S{opt-limit} The \i\c{--limit-X} Option
+
+This option allows user to setup various maximum values for these:
+
+\b\c{--limit-passes}: Number of maximum allowed passes. Default is
+effectively unlimited.
+
+\b\c{--limit-stalled-passes}: Maximum number of allowed unfinished
+passes. Default is 1000.
+
+\b\c{--limit-macro-levels}: Define maximum depth of macro expansion
+(in preprocess). Default is 1000000.
+
+\b\c{--limit-rep}: Maximum number of allowed preprocessor loop, defined
+under \c{%rep}. Default is 1000000.
+
+\b\c{--limit-eval}: This number sets the boundary condition of allowed
+expression length. Default is 1000000.
+
+\b\c{--limit-lines}: Total number of source lines as allowed to be
+processed. Default is 2000000000.
+
+In example, running this limits the maximum line count to be 1000.
+
+\c nasm --limit-lines 1000
+
+
+\S{opt-keep-all} The \i\c{--keep-all} Option
+
+This option doesn't delete any output files even if an error happens.
+
+
+\S{nasmenv} The \i\c{NASMENV} \i{Environment} Variable
+
+If you define an environment variable called \c{NASMENV}, the program
+will interpret it as a list of extra command-line options, which are
+processed before the real command line. You can use this to define
+standard search directories for include files, by putting \c{-i}
+options in the \c{NASMENV} variable.
+
+The value of the variable is split up at white space, so that the
+value \c{-s -ic:\\nasmlib\\} will be treated as two separate options.
+However, that means that the value \c{-dNAME="my name"} won't do
+what you might want, because it will be split at the space and the
+NASM command-line processing will get confused by the two
+nonsensical words \c{-dNAME="my} and \c{name"}.
+
+To get round this, NASM provides a feature whereby, if you begin the
+\c{NASMENV} environment variable with some character that isn't a minus
+sign, then NASM will treat this character as the \i{separator
+character} for options. So setting the \c{NASMENV} variable to the
+value \c{!-s!-ic:\\nasmlib\\} is equivalent to setting it to \c{-s
+-ic:\\nasmlib\\}, but \c{!-dNAME="my name"} will work.
+
+This environment variable was previously called \c{NASM}. This was
+changed with version 0.98.31.
+
+
+\H{qstart} \i{Quick Start} for \i{MASM} Users
+
+If you're used to writing programs with MASM, or with \i{TASM} in
+MASM-compatible (non-Ideal) mode, or with \i\c{a86}, this section
+attempts to outline the major differences between MASM's syntax and
+NASM's. If you're not already used to MASM, it's probably worth
+skipping this section.
+
+
+\S{qscs} NASM Is \I{case sensitivity}Case-Sensitive
+
+One simple difference is that NASM is case-sensitive. It makes a
+difference whether you call your label \c{foo}, \c{Foo} or \c{FOO}.
+If you're assembling to \c{DOS} or \c{OS/2} \c{.OBJ} files, you can
+invoke the \i\c{UPPERCASE} directive (documented in \k{objfmt}) to
+ensure that all symbols exported to other code modules are forced
+to be upper case; but even then, \e{within} a single module, NASM
+will distinguish between labels differing only in case.
+
+
+\S{qsbrackets} NASM Requires \i{Square Brackets} For \i{Memory References}
+
+NASM was designed with simplicity of syntax in mind. One of the
+\i{design goals} of NASM is that it should be possible, as far as is
+practical, for the user to look at a single line of NASM code
+and tell what opcode is generated by it. You can't do this in MASM:
+if you declare, for example,
+
+\c foo equ 1
+\c bar dw 2
+
+then the two lines of code
+
+\c mov ax,foo
+\c mov ax,bar
+
+generate completely different opcodes, despite having
+identical-looking syntaxes.
+
+NASM avoids this undesirable situation by having a much simpler
+syntax for memory references. The rule is simply that any access to
+the \e{contents} of a memory location requires square brackets
+around the address, and any access to the \e{address} of a variable
+doesn't. So an instruction of the form \c{mov ax,foo} will
+\e{always} refer to a compile-time constant, whether it's an \c{EQU}
+or the address of a variable; and to access the \e{contents} of the
+variable \c{bar}, you must code \c{mov ax,[bar]}.
+
+This also means that NASM has no need for MASM's \i\c{OFFSET}
+keyword, since the MASM code \c{mov ax,offset bar} means exactly the
+same thing as NASM's \c{mov ax,bar}. If you're trying to get
+large amounts of MASM code to assemble sensibly under NASM, you
+can always code \c{%idefine offset} to make the preprocessor treat
+the \c{OFFSET} keyword as a no-op.
+
+This issue is even more confusing in \i\c{a86}, where declaring a
+label with a trailing colon defines it to be a `label' as opposed to
+a `variable' and causes \c{a86} to adopt NASM-style semantics; so in
+\c{a86}, \c{mov ax,var} has different behaviour depending on whether
+\c{var} was declared as \c{var: dw 0} (a label) or \c{var dw 0} (a
+word-size variable). NASM is very simple by comparison:
+\e{everything} is a label.
+
+NASM, in the interests of simplicity, also does not support the
+\i{hybrid syntaxes} supported by MASM and its clones, such as
+\c{mov ax,table[bx]}, where a memory reference is denoted by one
+portion outside square brackets and another portion inside. The
+correct syntax for the above is \c{mov ax,[table+bx]}. Likewise,
+\c{mov ax,es:[di]} is wrong and \c{mov ax,[es:di]} is right.
+
+
+\S{qstypes} NASM Doesn't Store \i{Variable Types}
+
+NASM, by design, chooses not to remember the types of variables you
+declare. Whereas MASM will remember, on seeing \c{var dw 0}, that
+you declared \c{var} as a word-size variable, and will then be able
+to fill in the \i{ambiguity} in the size of the instruction \c{mov
+var,2}, NASM will deliberately remember nothing about the symbol
+\c{var} except where it begins, and so you must explicitly code
+\c{mov word [var],2}.
+
+For this reason, NASM doesn't support the \c{LODS}, \c{MOVS},
+\c{STOS}, \c{SCAS}, \c{CMPS}, \c{INS}, or \c{OUTS} instructions,
+but only supports the forms such as \c{LODSB}, \c{MOVSW}, and
+\c{SCASD}, which explicitly specify the size of the components of
+the strings being manipulated.
+
+
+\S{qsassume} NASM Doesn't \i\c{ASSUME}
+
+As part of NASM's drive for simplicity, it also does not support the
+\c{ASSUME} directive. NASM will not keep track of what values you
+choose to put in your segment registers, and will never
+\e{automatically} generate a \i{segment override} prefix.
+
+
+\S{qsmodel} NASM Doesn't Support \i{Memory Models}
+
+NASM also does not have any directives to support different 16-bit
+memory models. The programmer has to keep track of which functions
+are supposed to be called with a \i{far call} and which with a
+\i{near call}, and is responsible for putting the correct form of
+\c{RET} instruction (\c{RETN} or \c{RETF}; NASM accepts \c{RET}
+itself as an alternate form for \c{RETN}); in addition, the
+programmer is responsible for coding CALL FAR instructions where
+necessary when calling \e{external} functions, and must also keep
+track of which external variable definitions are far and which are
+near.
+
+
+\S{qsfpu} \i{Floating-Point} Differences
+
+NASM uses different names to refer to floating-point registers from
+MASM: where MASM would call them \c{ST(0)}, \c{ST(1)} and so on, and
+\i\c{a86} would call them simply \c{0}, \c{1} and so on, NASM
+chooses to call them \c{st0}, \c{st1} etc.
+
+As of version 0.96, NASM now treats the instructions with
+\i{`nowait'} forms in the same way as MASM-compatible assemblers.
+The idiosyncratic treatment employed by 0.95 and earlier was based
+on a misunderstanding by the authors.
+
+
+\S{qsother} Other Differences
+
+For historical reasons, NASM uses the keyword \i\c{TWORD} where MASM
+and compatible assemblers use \i\c{TBYTE}.
+
+NASM does not declare \i{uninitialized storage} in the same way as
+MASM: where a MASM programmer might use \c{stack db 64 dup (?)},
+NASM requires \c{stack resb 64}, intended to be read as `reserve 64
+bytes'. For a limited amount of compatibility, since NASM treats
+\c{?} as a valid character in symbol names, you can code \c{? equ 0}
+and then writing \c{dw ?} will at least do something vaguely useful.
+\I\c{RESB}\i\c{DUP} is still not a supported syntax, however.
+
+In addition to all of this, macros and directives work completely
+differently to MASM. See \k{preproc} and \k{directive} for further
+details.
+
+
+\C{lang} The NASM Language
+
+\H{syntax} Layout of a NASM Source Line
+
+Like most assemblers, each NASM source line contains (unless it
+is a macro, a preprocessor directive or an assembler directive: see
+\k{preproc} and \k{directive}) some combination of the four fields
+
+\c label: instruction operands ; comment
+
+As usual, most of these fields are optional; the presence or absence
+of any combination of a label, an instruction and a comment is allowed.
+Of course, the operand field is either required or forbidden by the
+presence and nature of the instruction field.
+
+NASM uses backslash (\\) as the line continuation character; if a line
+ends with backslash, the next line is considered to be a part of the
+backslash-ended line.
+
+NASM places no restrictions on white space within a line: labels may
+have white space before them, or instructions may have no space
+before them, or anything. The \i{colon} after a label is also
+optional. (Note that this means that if you intend to code \c{lodsb}
+alone on a line, and type \c{lodab} by accident, then that's still a
+valid source line which does nothing but define a label. Running
+NASM with the command-line option
+\I{orphan-labels}\c{-w+orphan-labels} will cause it to warn you if
+you define a label alone on a line without a \i{trailing colon}.)
+
+\i{Valid characters} in labels are letters, numbers, \c{_}, \c{$},
+\c{#}, \c{@}, \c{~}, \c{.}, and \c{?}. The only characters which may
+be used as the \e{first} character of an identifier are letters,
+\c{.} (with special meaning: see \k{locallab}), \c{_} and \c{?}.
+An identifier may also be prefixed with a \I{$, prefix}\c{$} to
+indicate that it is intended to be read as an identifier and not a
+reserved word; thus, if some other module you are linking with
+defines a symbol called \c{eax}, you can refer to \c{$eax} in NASM
+code to distinguish the symbol from the register. Maximum length of
+an identifier is 4095 characters.
+
+The instruction field may contain any machine instruction: Pentium
+and P6 instructions, FPU instructions, MMX instructions and even
+undocumented instructions are all supported. The instruction may be
+prefixed by \c{LOCK}, \c{REP}, \c{REPE}/\c{REPZ}, \c{REPNE}/\c{REPNZ},
+\c{XACQUIRE}/\c{XRELEASE} or \c{BND}/\c{NOBND}, in the usual way. Explicit
+\I{address-size prefixes}address-size and \i{operand-size prefixes} \i\c{A16},
+\i\c{A32}, \i\c{A64}, \i\c{O16} and \i\c{O32}, \i\c{O64} are provided - one example of their use
+is given in \k{mixsize}. You can also use the name of a \I{segment
+override}segment register as an instruction prefix: coding
+\c{es mov [bx],ax} is equivalent to coding \c{mov [es:bx],ax}. We
+recommend the latter syntax, since it is consistent with other
+syntactic features of the language, but for instructions such as
+\c{LODSB}, which has no operands and yet can require a segment
+override, there is no clean syntactic way to proceed apart from
+\c{es lodsb}.
+
+An instruction is not required to use a prefix: prefixes such as
+\c{CS}, \c{A32}, \c{LOCK} or \c{REPE} can appear on a line by
+themselves, and NASM will just generate the prefix bytes.
+
+In addition to actual machine instructions, NASM also supports a
+number of pseudo-instructions, described in \k{pseudop}.
+
+Instruction \i{operands} may take a number of forms: they can be
+registers, described simply by the register name (e.g. \c{ax},
+\c{bp}, \c{ebx}, \c{cr0}: NASM does not use the \c{gas}-style
+syntax in which register names must be prefixed by a \c{%} sign), or
+they can be \i{effective addresses} (see \k{effaddr}), constants
+(\k{const}) or expressions (\k{expr}).
+
+For x87 \i{floating-point} instructions, NASM accepts a wide range of
+syntaxes: you can use two-operand forms like MASM supports, or you
+can use NASM's native single-operand forms in most cases.
+\# Details of
+\# all forms of each supported instruction are given in
+\# \k{iref}.
+For example, you can code:
+
+\c fadd st1 ; this sets st0 := st0 + st1
+\c fadd st0,st1 ; so does this
+\c
+\c fadd st1,st0 ; this sets st1 := st1 + st0
+\c fadd to st1 ; so does this
+
+Almost any x87 floating-point instruction that references memory must
+use one of the prefixes \i\c{DWORD}, \i\c{QWORD} or \i\c{TWORD} to
+indicate what size of \i{memory operand} it refers to.
+
+
+\H{pseudop} \i{Pseudo-Instructions}
+
+Pseudo-instructions are things which, though not real x86 machine
+instructions, are used in the instruction field anyway because that's
+the most convenient place to put them. The current pseudo-instructions
+are \i\c{DB}, \i\c{DW}, \i\c{DD}, \i\c{DQ}, \i\c{DT}, \i\c{DO},
+\i\c{DY} and \i\c\{DZ}; their \i{uninitialized} counterparts
+\i\c{RESB}, \i\c{RESW}, \i\c{RESD}, \i\c{RESQ}, \i\c{REST},
+\i\c{RESO}, \i\c{RESY} and \i\c\{RESZ}; the \i\c{INCBIN} command, the
+\i\c{EQU} command, and the \i\c{TIMES} prefix.
+
+
+\S{db} \c{DB} and Friends: Declaring Initialized Data
+
+\i\c{DB}, \i\c{DW}, \i\c{DD}, \i\c{DQ}, \i\c{DT}, \i\c{DO}, \i\c{DY}
+and \i\c{DZ} are used, much as in MASM, to declare initialized data in
+the output file. They can be invoked in a wide range of ways:
+\I{floating-point}\I{character constant}\I{string constant}
+
+\c db 0x55 ; just the byte 0x55
+\c db 0x55,0x56,0x57 ; three bytes in succession
+\c db 'a',0x55 ; character constants are OK
+\c db 'hello',13,10,'$' ; so are string constants
+\c dw 0x1234 ; 0x34 0x12
+\c dw 'a' ; 0x61 0x00 (it's just a number)
+\c dw 'ab' ; 0x61 0x62 (character constant)
+\c dw 'abc' ; 0x61 0x62 0x63 0x00 (string)
+\c dd 0x12345678 ; 0x78 0x56 0x34 0x12
+\c dd 1.234567e20 ; floating-point constant
+\c dq 0x123456789abcdef0 ; eight byte constant
+\c dq 1.234567e20 ; double-precision float
+\c dt 1.234567e20 ; extended-precision float
+
+\c{DT}, \c{DO}, \c{DY} and \c{DZ} do not accept \i{numeric constants}
+as operands.
+
+
+\S{resb} \c{RESB} and Friends: Declaring \i{Uninitialized} Data
+
+\i\c{RESB}, \i\c{RESW}, \i\c{RESD}, \i\c{RESQ}, \i\c{REST},
+\i\c{RESO}, \i\c{RESY} and \i\c\{RESZ} are designed to be used in the
+BSS section of a module: they declare \e{uninitialized} storage
+space. Each takes a single operand, which is the number of bytes,
+words, doublewords or whatever to reserve. As stated in \k{qsother},
+NASM does not support the MASM/TASM syntax of reserving uninitialized
+space by writing \I\c{?}\c{DW ?} or similar things: this is what it
+does instead. The operand to a \c{RESB}-type pseudo-instruction is a
+\i\e{critical expression}: see \k{crit}.
+
+For example:
+
+\c buffer: resb 64 ; reserve 64 bytes
+\c wordvar: resw 1 ; reserve a word
+\c realarray resq 10 ; array of ten reals
+\c ymmval: resy 1 ; one YMM register
+\c zmmvals: resz 32 ; 32 ZMM registers
+
+\S{incbin} \i\c{INCBIN}: Including External \i{Binary Files}
+
+\c{INCBIN} is borrowed from the old Amiga assembler \i{DevPac}: it
+includes a binary file verbatim into the output file. This can be
+handy for (for example) including \i{graphics} and \i{sound} data
+directly into a game executable file. It can be called in one of
+these three ways:
+
+\c incbin "file.dat" ; include the whole file
+\c incbin "file.dat",1024 ; skip the first 1024 bytes
+\c incbin "file.dat",1024,512 ; skip the first 1024, and
+\c ; actually include at most 512
+
+\c{INCBIN} is both a directive and a standard macro; the standard
+macro version searches for the file in the include file search path
+and adds the file to the dependency lists. This macro can be
+overridden if desired.
+
+
+\S{equ} \i\c{EQU}: Defining Constants
+
+\c{EQU} defines a symbol to a given constant value: when \c{EQU} is
+used, the source line must contain a label. The action of \c{EQU} is
+to define the given label name to the value of its (only) operand.
+This definition is absolute, and cannot change later. So, for
+example,
+
+\c message db 'hello, world'
+\c msglen equ $-message
+
+defines \c{msglen} to be the constant 12. \c{msglen} may not then be
+redefined later. This is not a \i{preprocessor} definition either:
+the value of \c{msglen} is evaluated \e{once}, using the value of
+\c{$} (see \k{expr} for an explanation of \c{$}) at the point of
+definition, rather than being evaluated wherever it is referenced
+and using the value of \c{$} at the point of reference.
+
+
+\S{times} \i\c{TIMES}: \i{Repeating} Instructions or Data
+
+The \c{TIMES} prefix causes the instruction to be assembled multiple
+times. This is partly present as NASM's equivalent of the \i\c{DUP}
+syntax supported by \i{MASM}-compatible assemblers, in that you can
+code
+
+\c zerobuf: times 64 db 0
+
+or similar things; but \c{TIMES} is more versatile than that. The
+argument to \c{TIMES} is not just a numeric constant, but a numeric
+\e{expression}, so you can do things like
+
+\c buffer: db 'hello, world'
+\c times 64-$+buffer db ' '
+
+which will store exactly enough spaces to make the total length of
+\c{buffer} up to 64. Finally, \c{TIMES} can be applied to ordinary
+instructions, so you can code trivial \i{unrolled loops} in it:
+
+\c times 100 movsb
+
+Note that there is no effective difference between \c{times 100 resb
+1} and \c{resb 100}, except that the latter will be assembled about
+100 times faster due to the internal structure of the assembler.
+
+The operand to \c{TIMES} is a critical expression (\k{crit}).
+
+Note also that \c{TIMES} can't be applied to \i{macros}: the reason
+for this is that \c{TIMES} is processed after the macro phase, which
+allows the argument to \c{TIMES} to contain expressions such as
+\c{64-$+buffer} as above. To repeat more than one line of code, or a
+complex macro, use the preprocessor \i\c{%rep} directive.
+
+
+\H{effaddr} Effective Addresses
+
+An \i{effective address} is any operand to an instruction which
+\I{memory reference}references memory. Effective addresses, in NASM,
+have a very simple syntax: they consist of an expression evaluating
+to the desired address, enclosed in \i{square brackets}. For
+example:
+
+\c wordvar dw 123
+\c mov ax,[wordvar]
+\c mov ax,[wordvar+1]
+\c mov ax,[es:wordvar+bx]
+
+Anything not conforming to this simple system is not a valid memory
+reference in NASM, for example \c{es:wordvar[bx]}.
+
+More complicated effective addresses, such as those involving more
+than one register, work in exactly the same way:
+
+\c mov eax,[ebx*2+ecx+offset]
+\c mov ax,[bp+di+8]
+
+NASM is capable of doing \i{algebra} on these effective addresses,
+so that things which don't necessarily \e{look} legal are perfectly
+all right:
+
+\c mov eax,[ebx*5] ; assembles as [ebx*4+ebx]
+\c mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]
+
+Some forms of effective address have more than one assembled form;
+in most such cases NASM will generate the smallest form it can. For
+example, there are distinct assembled forms for the 32-bit effective
+addresses \c{[eax*2+0]} and \c{[eax+eax]}, and NASM will generally
+generate the latter on the grounds that the former requires four
+bytes to store a zero offset.
+
+NASM has a hinting mechanism which will cause \c{[eax+ebx]} and
+\c{[ebx+eax]} to generate different opcodes; this is occasionally
+useful because \c{[esi+ebp]} and \c{[ebp+esi]} have different
+default segment registers.
+
+However, you can force NASM to generate an effective address in a
+particular form by the use of the keywords \c{BYTE}, \c{WORD},
+\c{DWORD} and \c{NOSPLIT}. If you need \c{[eax+3]} to be assembled
+using a double-word offset field instead of the one byte NASM will
+normally generate, you can code \c{[dword eax+3]}. Similarly, you
+can force NASM to use a byte offset for a small value which it
+hasn't seen on the first pass (see \k{crit} for an example of such a
+code fragment) by using \c{[byte eax+offset]}. As special cases,
+\c{[byte eax]} will code \c{[eax+0]} with a byte offset of zero, and
+\c{[dword eax]} will code it with a double-word offset of zero. The
+normal form, \c{[eax]}, will be coded with no offset field.
+
+The form described in the previous paragraph is also useful if you
+are trying to access data in a 32-bit segment from within 16 bit code.
+For more information on this see the section on mixed-size addressing
+(\k{mixaddr}). In particular, if you need to access data with a known
+offset that is larger than will fit in a 16-bit value, if you don't
+specify that it is a dword offset, nasm will cause the high word of
+the offset to be lost.
+
+Similarly, NASM will split \c{[eax*2]} into \c{[eax+eax]} because
+that allows the offset field to be absent and space to be saved; in
+fact, it will also split \c{[eax*2+offset]} into
+\c{[eax+eax+offset]}. You can combat this behaviour by the use of
+the \c{NOSPLIT} keyword: \c{[nosplit eax*2]} will force
+\c{[eax*2+0]} to be generated literally. \c{[nosplit eax*1]} also has the
+same effect. In another way, a split EA form \c{[0, eax*2]} can be used, too.
+However, \c{NOSPLIT} in \c{[nosplit eax+eax]} will be ignored because user's
+intention here is considered as \c{[eax+eax]}.
+
+In 64-bit mode, NASM will by default generate absolute addresses. The
+\i\c{REL} keyword makes it produce \c{RIP}-relative addresses. Since
+this is frequently the normally desired behaviour, see the \c{DEFAULT}
+directive (\k{default}). The keyword \i\c{ABS} overrides \i\c{REL}.
+
+A new form of split effective addres syntax is also supported. This is
+mainly intended for mib operands as used by MPX instructions, but can
+be used for any memory reference. The basic concept of this form is
+splitting base and index.
+
+\c mov eax,[ebx+8,ecx*4] ; ebx=base, ecx=index, 4=scale, 8=disp
+
+For mib operands, there are several ways of writing effective address depending
+on the tools. NASM supports all currently possible ways of mib syntax:
+
+\c ; bndstx
+\c ; next 5 lines are parsed same
+\c ; base=rax, index=rbx, scale=1, displacement=3
+\c bndstx [rax+0x3,rbx], bnd0 ; NASM - split EA
+\c bndstx [rbx*1+rax+0x3], bnd0 ; GAS - '*1' indecates an index reg
+\c bndstx [rax+rbx+3], bnd0 ; GAS - without hints
+\c bndstx [rax+0x3], bnd0, rbx ; ICC-1
+\c bndstx [rax+0x3], rbx, bnd0 ; ICC-2
+
+When broadcasting decorator is used, the opsize keyword should match
+the size of each element.
+
+\c VDIVPS zmm4, zmm5, dword [rbx]{1to16} ; single-precision float
+\c VDIVPS zmm4, zmm5, zword [rbx] ; packed 512 bit memory
+
+
+\H{const} \i{Constants}
+
+NASM understands four different types of constant: numeric,
+character, string and floating-point.
+
+
+\S{numconst} \i{Numeric Constants}
+
+A numeric constant is simply a number. NASM allows you to specify
+numbers in a variety of number bases, in a variety of ways: you can
+suffix \c{H} or \c{X}, \c{D} or \c{T}, \c{Q} or \c{O}, and \c{B} or
+\c{Y} for \i{hexadecimal}, \i{decimal}, \i{octal} and \i{binary}
+respectively, or you can prefix \c{0x}, for hexadecimal in the style
+of C, or you can prefix \c{$} for hexadecimal in the style of Borland
+Pascal or Motorola Assemblers. Note, though, that the \I{$,
+prefix}\c{$} prefix does double duty as a prefix on identifiers (see
+\k{syntax}), so a hex number prefixed with a \c{$} sign must have a
+digit after the \c{$} rather than a letter. In addition, current
+versions of NASM accept the prefix \c{0h} for hexadecimal, \c{0d} or
+\c{0t} for decimal, \c{0o} or \c{0q} for octal, and \c{0b} or \c{0y}
+for binary. Please note that unlike C, a \c{0} prefix by itself does
+\e{not} imply an octal constant!
+
+Numeric constants can have underscores (\c{_}) interspersed to break
+up long strings.
+
+Some examples (all producing exactly the same code):
+
+\c mov ax,200 ; decimal
+\c mov ax,0200 ; still decimal
+\c mov ax,0200d ; explicitly decimal
+\c mov ax,0d200 ; also decimal
+\c mov ax,0c8h ; hex
+\c mov ax,$0c8 ; hex again: the 0 is required
+\c mov ax,0xc8 ; hex yet again
+\c mov ax,0hc8 ; still hex
+\c mov ax,310q ; octal
+\c mov ax,310o ; octal again
+\c mov ax,0o310 ; octal yet again
+\c mov ax,0q310 ; octal yet again
+\c mov ax,11001000b ; binary
+\c mov ax,1100_1000b ; same binary constant
+\c mov ax,1100_1000y ; same binary constant once more
+\c mov ax,0b1100_1000 ; same binary constant yet again
+\c mov ax,0y1100_1000 ; same binary constant yet again
+
+\S{strings} \I{Strings}\i{Character Strings}
+
+A character string consists of up to eight characters enclosed in
+either single quotes (\c{'...'}), double quotes (\c{"..."}) or
+backquotes (\c{`...`}). Single or double quotes are equivalent to
+NASM (except of course that surrounding the constant with single
+quotes allows double quotes to appear within it and vice versa); the
+contents of those are represented verbatim. Strings enclosed in
+backquotes support C-style \c{\\}-escapes for special characters.
+
+
+The following \i{escape sequences} are recognized by backquoted strings:
+
+\c \' single quote (')
+\c \" double quote (")
+\c \` backquote (`)
+\c \\\ backslash (\)
+\c \? question mark (?)
+\c \a BEL (ASCII 7)
+\c \b BS (ASCII 8)
+\c \t TAB (ASCII 9)
+\c \n LF (ASCII 10)
+\c \v VT (ASCII 11)
+\c \f FF (ASCII 12)
+\c \r CR (ASCII 13)
+\c \e ESC (ASCII 27)
+\c \377 Up to 3 octal digits - literal byte
+\c \xFF Up to 2 hexadecimal digits - literal byte
+\c \u1234 4 hexadecimal digits - Unicode character
+\c \U12345678 8 hexadecimal digits - Unicode character
+
+All other escape sequences are reserved. Note that \c{\\0}, meaning a
+\c{NUL} character (ASCII 0), is a special case of the octal escape
+sequence.
+
+\i{Unicode} characters specified with \c{\\u} or \c{\\U} are converted to
+\i{UTF-8}. For example, the following lines are all equivalent:
+
+\c db `\u263a` ; UTF-8 smiley face
+\c db `\xe2\x98\xba` ; UTF-8 smiley face
+\c db 0E2h, 098h, 0BAh ; UTF-8 smiley face
+
+
+\S{chrconst} \i{Character Constants}
+
+A character constant consists of a string up to eight bytes long, used
+in an expression context. It is treated as if it was an integer.
+
+A character constant with more than one byte will be arranged
+with \i{little-endian} order in mind: if you code
+
+\c mov eax,'abcd'
+
+then the constant generated is not \c{0x61626364}, but
+\c{0x64636261}, so that if you were then to store the value into
+memory, it would read \c{abcd} rather than \c{dcba}. This is also
+the sense of character constants understood by the Pentium's
+\i\c{CPUID} instruction.
+
+
+\S{strconst} \i{String Constants}
+
+String constants are character strings used in the context of some
+pseudo-instructions, namely the
+\I\c{DW}\I\c{DD}\I\c{DQ}\I\c{DT}\I\c{DO}\I\c{DY}\i\c{DB} family and
+\i\c{INCBIN} (where it represents a filename.) They are also used in
+certain preprocessor directives.
+
+A string constant looks like a character constant, only longer. It
+is treated as a concatenation of maximum-size character constants
+for the conditions. So the following are equivalent:
+
+\c db 'hello' ; string constant
+\c db 'h','e','l','l','o' ; equivalent character constants
+
+And the following are also equivalent:
+
+\c dd 'ninechars' ; doubleword string constant
+\c dd 'nine','char','s' ; becomes three doublewords
+\c db 'ninechars',0,0,0 ; and really looks like this
+
+Note that when used in a string-supporting context, quoted strings are
+treated as a string constants even if they are short enough to be a
+character constant, because otherwise \c{db 'ab'} would have the same
+effect as \c{db 'a'}, which would be silly. Similarly, three-character
+or four-character constants are treated as strings when they are
+operands to \c{DW}, and so forth.
+
+\S{unicode} \I{UTF-16}\I{UTF-32}\i{Unicode} Strings
+
+The special operators \i\c{__utf16__}, \i\c{__utf16le__},
+\i\c{__utf16be__}, \i\c{__utf32__}, \i\c{__utf32le__} and
+\i\c{__utf32be__} allows definition of Unicode strings. They take a
+string in UTF-8 format and converts it to UTF-16 or UTF-32,
+respectively. Unless the \c{be} forms are specified, the output is
+littleendian.
+
+For example:
+
+\c %define u(x) __utf16__(x)
+\c %define w(x) __utf32__(x)
+\c
+\c dw u('C:\WINDOWS'), 0 ; Pathname in UTF-16
+\c dd w(`A + B = \u206a`), 0 ; String in UTF-32
+
+The UTF operators can be applied either to strings passed to the
+\c{DB} family instructions, or to character constants in an expression
+context.
+
+\S{fltconst} \I{floating-point, constants}Floating-Point Constants
+
+\i{Floating-point} constants are acceptable only as arguments to
+\i\c{DB}, \i\c{DW}, \i\c{DD}, \i\c{DQ}, \i\c{DT}, and \i\c{DO}, or as
+arguments to the special operators \i\c{__float8__},
+\i\c{__float16__}, \i\c{__float32__}, \i\c{__float64__},
+\i\c{__float80m__}, \i\c{__float80e__}, \i\c{__float128l__}, and
+\i\c{__float128h__}.
+
+Floating-point constants are expressed in the traditional form:
+digits, then a period, then optionally more digits, then optionally an
+\c{E} followed by an exponent. The period is mandatory, so that NASM
+can distinguish between \c{dd 1}, which declares an integer constant,
+and \c{dd 1.0} which declares a floating-point constant.
+
+NASM also support C99-style hexadecimal floating-point: \c{0x},
+hexadecimal digits, period, optionally more hexadeximal digits, then
+optionally a \c{P} followed by a \e{binary} (not hexadecimal) exponent
+in decimal notation. As an extension, NASM additionally supports the
+\c{0h} and \c{$} prefixes for hexadecimal, as well binary and octal
+floating-point, using the \c{0b} or \c{0y} and \c{0o} or \c{0q}
+prefixes, respectively.
+
+Underscores to break up groups of digits are permitted in
+floating-point constants as well.
+
+Some examples:
+
+\c db -0.2 ; "Quarter precision"
+\c dw -0.5 ; IEEE 754r/SSE5 half precision
+\c dd 1.2 ; an easy one
+\c dd 1.222_222_222 ; underscores are permitted
+\c dd 0x1p+2 ; 1.0x2^2 = 4.0
+\c dq 0x1p+32 ; 1.0x2^32 = 4 294 967 296.0
+\c dq 1.e10 ; 10 000 000 000.0
+\c dq 1.e+10 ; synonymous with 1.e10
+\c dq 1.e-10 ; 0.000 000 000 1
+\c dt 3.141592653589793238462 ; pi
+\c do 1.e+4000 ; IEEE 754r quad precision
+
+The 8-bit "quarter-precision" floating-point format is
+sign:exponent:mantissa = 1:4:3 with an exponent bias of 7. This
+appears to be the most frequently used 8-bit floating-point format,
+although it is not covered by any formal standard. This is sometimes
+called a "\i{minifloat}."
+
+The special operators are used to produce floating-point numbers in
+other contexts. They produce the binary representation of a specific
+floating-point number as an integer, and can use anywhere integer
+constants are used in an expression. \c{__float80m__} and
+\c{__float80e__} produce the 64-bit mantissa and 16-bit exponent of an
+80-bit floating-point number, and \c{__float128l__} and
+\c{__float128h__} produce the lower and upper 64-bit halves of a 128-bit
+floating-point number, respectively.
+
+For example:
+
+\c mov rax,__float64__(3.141592653589793238462)
+
+... would assign the binary representation of pi as a 64-bit floating
+point number into \c{RAX}. This is exactly equivalent to:
+
+\c mov rax,0x400921fb54442d18
+
+NASM cannot do compile-time arithmetic on floating-point constants.
+This is because NASM is designed to be portable - although it always
+generates code to run on x86 processors, the assembler itself can
+run on any system with an ANSI C compiler. Therefore, the assembler
+cannot guarantee the presence of a floating-point unit capable of
+handling the \i{Intel number formats}, and so for NASM to be able to
+do floating arithmetic it would have to include its own complete set
+of floating-point routines, which would significantly increase the
+size of the assembler for very little benefit.
+
+The special tokens \i\c{__Infinity__}, \i\c{__QNaN__} (or
+\i\c{__NaN__}) and \i\c{__SNaN__} can be used to generate
+\I{infinity}infinities, quiet \i{NaN}s, and signalling NaNs,
+respectively. These are normally used as macros:
+
+\c %define Inf __Infinity__
+\c %define NaN __QNaN__
+\c
+\c dq +1.5, -Inf, NaN ; Double-precision constants
+
+The \c{%use fp} standard macro package contains a set of convenience
+macros. See \k{pkg_fp}.
+
+\S{bcdconst} \I{floating-point, packed BCD constants}Packed BCD Constants
+
+x87-style packed BCD constants can be used in the same contexts as
+80-bit floating-point numbers. They are suffixed with \c{p} or
+prefixed with \c{0p}, and can include up to 18 decimal digits.
+
+As with other numeric constants, underscores can be used to separate
+digits.
+
+For example:
+
+\c dt 12_345_678_901_245_678p
+\c dt -12_345_678_901_245_678p
+\c dt +0p33
+\c dt 33p
+
+
+\H{expr} \i{Expressions}
+
+Expressions in NASM are similar in syntax to those in C. Expressions
+are evaluated as 64-bit integers which are then adjusted to the
+appropriate size.
+
+NASM supports two special tokens in expressions, allowing
+calculations to involve the current assembly position: the
+\I{$, here}\c{$} and \i\c{$$} tokens. \c{$} evaluates to the assembly
+position at the beginning of the line containing the expression; so
+you can code an \i{infinite loop} using \c{JMP $}. \c{$$} evaluates
+to the beginning of the current section; so you can tell how far
+into the section you are by using \c{($-$$)}.
+
+The arithmetic \i{operators} provided by NASM are listed here, in
+increasing order of \i{precedence}.
+
+
+\S{expor} \i\c{|}: \i{Bitwise OR} Operator
+
+The \c{|} operator gives a bitwise OR, exactly as performed by the
+\c{OR} machine instruction. Bitwise OR is the lowest-priority
+arithmetic operator supported by NASM.
+
+
+\S{expxor} \i\c{^}: \i{Bitwise XOR} Operator
+
+\c{^} provides the bitwise XOR operation.
+
+
+\S{expand} \i\c{&}: \i{Bitwise AND} Operator
+
+\c{&} provides the bitwise AND operation.
+
+
+\S{expshift} \i\c{<<} and \i\c{>>}: \i{Bit Shift} Operators
+
+\c{<<} gives a bit-shift to the left, just as it does in C. So \c{5<<3}
+evaluates to 5 times 8, or 40. \c{>>} gives a bit-shift to the
+right; in NASM, such a shift is \e{always} unsigned, so that
+the bits shifted in from the left-hand end are filled with zero
+rather than a sign-extension of the previous highest bit.
+
+
+\S{expplmi} \I{+ opaddition}\c{+} and \I{- opsubtraction}\c{-}:
+\i{Addition} and \i{Subtraction} Operators
+
+The \c{+} and \c{-} operators do perfectly ordinary addition and
+subtraction.
+
+
+\S{expmul} \i\c{*}, \i\c{/}, \i\c{//}, \i\c{%} and \i\c{%%}:
+\i{Multiplication} and \i{Division}
+
+\c{*} is the multiplication operator. \c{/} and \c{//} are both
+division operators: \c{/} is \i{unsigned division} and \c{//} is
+\i{signed division}. Similarly, \c{%} and \c{%%} provide \I{unsigned
+modulo}\I{modulo operators}unsigned and
+\i{signed modulo} operators respectively.
+
+NASM, like ANSI C, provides no guarantees about the sensible
+operation of the signed modulo operator.
+
+Since the \c{%} character is used extensively by the macro
+\i{preprocessor}, you should ensure that both the signed and unsigned
+modulo operators are followed by white space wherever they appear.
+
+
+\S{expmul} \i{Unary Operators}
+
+The highest-priority operators in NASM's expression grammar are those
+which only apply to one argument. These are \I{+ opunary}\c{+}, \I{-
+opunary}\c{-}, \i\c{~}, \I{! opunary}\c{!}, \i\c{SEG}, and the
+\i{integer functions} operators.
+
+\c{-} negates its operand, \c{+} does nothing (it's provided for
+symmetry with \c{-}), \c{~} computes the \i{one's complement} of its
+operand, \c{!} is the \i{logical negation} operator.
+
+\c{SEG} provides the \i{segment address}
+of its operand (explained in more detail in \k{segwrt}).
+
+A set of additional operators with leading and trailing double
+underscores are used to implement the integer functions of the
+\c{ifunc} macro package, see \k{pkg_ifunc}.
+
+
+\H{segwrt} \i\c{SEG} and \i\c{WRT}
+
+When writing large 16-bit programs, which must be split into
+multiple \i{segments}, it is often necessary to be able to refer to
+the \I{segment address}segment part of the address of a symbol. NASM
+supports the \c{SEG} operator to perform this function.
+
+The \c{SEG} operator returns the \i\e{preferred} segment base of a
+symbol, defined as the segment base relative to which the offset of
+the symbol makes sense. So the code
+
+\c mov ax,seg symbol
+\c mov es,ax
+\c mov bx,symbol
+
+will load \c{ES:BX} with a valid pointer to the symbol \c{symbol}.
+
+Things can be more complex than this: since 16-bit segments and
+\i{groups} may \I{overlapping segments}overlap, you might occasionally
+want to refer to some symbol using a different segment base from the
+preferred one. NASM lets you do this, by the use of the \c{WRT}
+(With Reference To) keyword. So you can do things like
+
+\c mov ax,weird_seg ; weird_seg is a segment base
+\c mov es,ax
+\c mov bx,symbol wrt weird_seg
+
+to load \c{ES:BX} with a different, but functionally equivalent,
+pointer to the symbol \c{symbol}.
+
+NASM supports far (inter-segment) calls and jumps by means of the
+syntax \c{call segment:offset}, where \c{segment} and \c{offset}
+both represent immediate values. So to call a far procedure, you
+could code either of
+
+\c call (seg procedure):procedure
+\c call weird_seg:(procedure wrt weird_seg)
+
+(The parentheses are included for clarity, to show the intended
+parsing of the above instructions. They are not necessary in
+practice.)
+
+NASM supports the syntax \I\c{CALL FAR}\c{call far procedure} as a
+synonym for the first of the above usages. \c{JMP} works identically
+to \c{CALL} in these examples.
+
+To declare a \i{far pointer} to a data item in a data segment, you
+must code
+
+\c dw symbol, seg symbol
+
+NASM supports no convenient synonym for this, though you can always
+invent one using the macro processor.
+
+
+\H{strict} \i\c{STRICT}: Inhibiting Optimization
+
+When assembling with the optimizer set to level 2 or higher (see
+\k{opt-O}), NASM will use size specifiers (\c{BYTE}, \c{WORD},
+\c{DWORD}, \c{QWORD}, \c{TWORD}, \c{OWORD}, \c{YWORD} or \c{ZWORD}),
+but will give them the smallest possible size. The keyword \c{STRICT}
+can be used to inhibit optimization and force a particular operand to
+be emitted in the specified size. For example, with the optimizer on,
+and in \c{BITS 16} mode,
+
+\c push dword 33
+
+is encoded in three bytes \c{66 6A 21}, whereas
+
+\c push strict dword 33
+
+is encoded in six bytes, with a full dword immediate operand \c{66 68
+21 00 00 00}.
+
+With the optimizer off, the same code (six bytes) is generated whether
+the \c{STRICT} keyword was used or not.
+
+
+\H{crit} \i{Critical Expressions}
+
+Although NASM has an optional multi-pass optimizer, there are some
+expressions which must be resolvable on the first pass. These are
+called \e{Critical Expressions}.
+
+The first pass is used to determine the size of all the assembled
+code and data, so that the second pass, when generating all the
+code, knows all the symbol addresses the code refers to. So one
+thing NASM can't handle is code whose size depends on the value of a
+symbol declared after the code in question. For example,
+
+\c times (label-$) db 0
+\c label: db 'Where am I?'
+
+The argument to \i\c{TIMES} in this case could equally legally
+evaluate to anything at all; NASM will reject this example because
+it cannot tell the size of the \c{TIMES} line when it first sees it.
+It will just as firmly reject the slightly \I{paradox}paradoxical
+code
+
+\c times (label-$+1) db 0
+\c label: db 'NOW where am I?'
+
+in which \e{any} value for the \c{TIMES} argument is by definition
+wrong!
+
+NASM rejects these examples by means of a concept called a
+\e{critical expression}, which is defined to be an expression whose
+value is required to be computable in the first pass, and which must
+therefore depend only on symbols defined before it. The argument to
+the \c{TIMES} prefix is a critical expression.
+
+\H{locallab} \i{Local Labels}
+
+NASM gives special treatment to symbols beginning with a \i{period}.
+A label beginning with a single period is treated as a \e{local}
+label, which means that it is associated with the previous non-local
+label. So, for example:
+
+\c label1 ; some code
+\c
+\c .loop
+\c ; some more code
+\c
+\c jne .loop
+\c ret
+\c
+\c label2 ; some code
+\c
+\c .loop
+\c ; some more code
+\c
+\c jne .loop
+\c ret
+
+In the above code fragment, each \c{JNE} instruction jumps to the
+line immediately before it, because the two definitions of \c{.loop}
+are kept separate by virtue of each being associated with the
+previous non-local label.
+
+This form of local label handling is borrowed from the old Amiga
+assembler \i{DevPac}; however, NASM goes one step further, in
+allowing access to local labels from other parts of the code. This
+is achieved by means of \e{defining} a local label in terms of the
+previous non-local label: the first definition of \c{.loop} above is
+really defining a symbol called \c{label1.loop}, and the second
+defines a symbol called \c{label2.loop}. So, if you really needed
+to, you could write
+
+\c label3 ; some more code
+\c ; and some more
+\c
+\c jmp label1.loop
+
+Sometimes it is useful - in a macro, for instance - to be able to
+define a label which can be referenced from anywhere but which
+doesn't interfere with the normal local-label mechanism. Such a
+label can't be non-local because it would interfere with subsequent
+definitions of, and references to, local labels; and it can't be
+local because the macro that defined it wouldn't know the label's
+full name. NASM therefore introduces a third type of label, which is
+probably only useful in macro definitions: if a label begins with
+the \I{label prefix}special prefix \i\c{..@}, then it does nothing
+to the local label mechanism. So you could code
+
+\c label1: ; a non-local label
+\c .local: ; this is really label1.local
+\c ..@foo: ; this is a special symbol
+\c label2: ; another non-local label
+\c .local: ; this is really label2.local
+\c
+\c jmp ..@foo ; this will jump three lines up
+
+NASM has the capacity to define other special symbols beginning with
+a double period: for example, \c{..start} is used to specify the
+entry point in the \c{obj} output format (see \k{dotdotstart}),
+\c{..imagebase} is used to find out the offset from a base address
+of the current image in the \c{win64} output format (see \k{win64pic}).
+So just keep in mind that symbols beginning with a double period are
+special.
+
+
+\C{preproc} The NASM \i{Preprocessor}
+
+NASM contains a powerful \i{macro processor}, which supports
+conditional assembly, multi-level file inclusion, two forms of macro
+(single-line and multi-line), and a `context stack' mechanism for
+extra macro power. Preprocessor directives all begin with a \c{%}
+sign.
+
+The preprocessor collapses all lines which end with a backslash (\\)
+character into a single line. Thus:
+
+\c %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \\
+\c THIS_VALUE
+
+will work like a single-line macro without the backslash-newline
+sequence.
+
+\H{slmacro} \i{Single-Line Macros}
+
+\S{define} The Normal Way: \I\c{%idefine}\i\c{%define}
+
+Single-line macros are defined using the \c{%define} preprocessor
+directive. The definitions work in a similar way to C; so you can do
+things like
+
+\c %define ctrl 0x1F &
+\c %define param(a,b) ((a)+(a)*(b))
+\c
+\c mov byte [param(2,ebx)], ctrl 'D'
+
+which will expand to
+
+\c mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
+
+When the expansion of a single-line macro contains tokens which
+invoke another macro, the expansion is performed at invocation time,
+not at definition time. Thus the code
+
+\c %define a(x) 1+b(x)
+\c %define b(x) 2*x
+\c
+\c mov ax,a(8)
+
+will evaluate in the expected way to \c{mov ax,1+2*8}, even though
+the macro \c{b} wasn't defined at the time of definition of \c{a}.
+
+Macros defined with \c{%define} are \i{case sensitive}: after
+\c{%define foo bar}, only \c{foo} will expand to \c{bar}: \c{Foo} or
+\c{FOO} will not. By using \c{%idefine} instead of \c{%define} (the
+`i' stands for `insensitive') you can define all the case variants
+of a macro at once, so that \c{%idefine foo bar} would cause
+\c{foo}, \c{Foo}, \c{FOO}, \c{fOO} and so on all to expand to
+\c{bar}.
+
+There is a mechanism which detects when a macro call has occurred as
+a result of a previous expansion of the same macro, to guard against
+\i{circular references} and infinite loops. If this happens, the
+preprocessor will only expand the first occurrence of the macro.
+Hence, if you code
+
+\c %define a(x) 1+a(x)
+\c
+\c mov ax,a(3)
+
+the macro \c{a(3)} will expand once, becoming \c{1+a(3)}, and will
+then expand no further. This behaviour can be useful: see \k{32c}
+for an example of its use.
+
+You can \I{overloading, single-line macros}overload single-line
+macros: if you write
+
+\c %define foo(x) 1+x
+\c %define foo(x,y) 1+x*y
+
+the preprocessor will be able to handle both types of macro call,
+by counting the parameters you pass; so \c{foo(3)} will become
+\c{1+3} whereas \c{foo(ebx,2)} will become \c{1+ebx*2}. However, if
+you define
+
+\c %define foo bar
+
+then no other definition of \c{foo} will be accepted: a macro with
+no parameters prohibits the definition of the same name as a macro
+\e{with} parameters, and vice versa.
+
+This doesn't prevent single-line macros being \e{redefined}: you can
+perfectly well define a macro with
+
+\c %define foo bar
+
+and then re-define it later in the same source file with
+
+\c %define foo baz
+
+Then everywhere the macro \c{foo} is invoked, it will be expanded
+according to the most recent definition. This is particularly useful
+when defining single-line macros with \c{%assign} (see \k{assign}).
+
+You can \i{pre-define} single-line macros using the `-d' option on
+the NASM command line: see \k{opt-d}.
+
+
+\S{xdefine} Resolving \c{%define}: \I\c{%ixdefine}\i\c{%xdefine}
+
+To have a reference to an embedded single-line macro resolved at the
+time that the embedding macro is \e{defined}, as opposed to when the
+embedding macro is \e{expanded}, you need a different mechanism to the
+one offered by \c{%define}. The solution is to use \c{%xdefine}, or
+it's \I{case sensitive}case-insensitive counterpart \c{%ixdefine}.
+
+Suppose you have the following code:
+
+\c %define isTrue 1
+\c %define isFalse isTrue
+\c %define isTrue 0
+\c
+\c val1: db isFalse
+\c
+\c %define isTrue 1
+\c
+\c val2: db isFalse
+
+In this case, \c{val1} is equal to 0, and \c{val2} is equal to 1.
+This is because, when a single-line macro is defined using
+\c{%define}, it is expanded only when it is called. As \c{isFalse}
+expands to \c{isTrue}, the expansion will be the current value of
+\c{isTrue}. The first time it is called that is 0, and the second
+time it is 1.
+
+If you wanted \c{isFalse} to expand to the value assigned to the
+embedded macro \c{isTrue} at the time that \c{isFalse} was defined,
+you need to change the above code to use \c{%xdefine}.
+
+\c %xdefine isTrue 1
+\c %xdefine isFalse isTrue
+\c %xdefine isTrue 0
+\c
+\c val1: db isFalse
+\c
+\c %xdefine isTrue 1
+\c
+\c val2: db isFalse
+
+Now, each time that \c{isFalse} is called, it expands to 1,
+as that is what the embedded macro \c{isTrue} expanded to at
+the time that \c{isFalse} was defined.
+
+
+\S{indmacro} \i{Macro Indirection}: \I\c{%[}\c{%[...]}
+
+The \c{%[...]} construct can be used to expand macros in contexts
+where macro expansion would otherwise not occur, including in the
+names other macros. For example, if you have a set of macros named
+\c{Foo16}, \c{Foo32} and \c{Foo64}, you could write:
+
+\c mov ax,Foo%[__BITS__] ; The Foo value
+
+to use the builtin macro \c{__BITS__} (see \k{bitsm}) to automatically
+select between them. Similarly, the two statements:
+
+\c %xdefine Bar Quux ; Expands due to %xdefine
+\c %define Bar %[Quux] ; Expands due to %[...]
+
+have, in fact, exactly the same effect.
+
+\c{%[...]} concatenates to adjacent tokens in the same way that
+multi-line macro parameters do, see \k{concat} for details.
+
+
+\S{concat%+} Concatenating Single Line Macro Tokens: \i\c{%+}
+
+Individual tokens in single line macros can be concatenated, to produce
+longer tokens for later processing. This can be useful if there are
+several similar macros that perform similar functions.
+
+Please note that a space is required after \c{%+}, in order to
+disambiguate it from the syntax \c{%+1} used in multiline macros.
+
+As an example, consider the following:
+
+\c %define BDASTART 400h ; Start of BIOS data area
+
+\c struc tBIOSDA ; its structure
+\c .COM1addr RESW 1
+\c .COM2addr RESW 1
+\c ; ..and so on
+\c endstruc
+
+Now, if we need to access the elements of tBIOSDA in different places,
+we can end up with:
+
+\c mov ax,BDASTART + tBIOSDA.COM1addr
+\c mov bx,BDASTART + tBIOSDA.COM2addr
+
+This will become pretty ugly (and tedious) if used in many places, and
+can be reduced in size significantly by using the following macro:
+
+\c ; Macro to access BIOS variables by their names (from tBDA):
+
+\c %define BDA(x) BDASTART + tBIOSDA. %+ x
+
+Now the above code can be written as:
+
+\c mov ax,BDA(COM1addr)
+\c mov bx,BDA(COM2addr)
+
+Using this feature, we can simplify references to a lot of macros (and,
+in turn, reduce typing errors).
+
+
+\S{selfref%?} The Macro Name Itself: \i\c{%?} and \i\c{%??}
+
+The special symbols \c{%?} and \c{%??} can be used to reference the
+macro name itself inside a macro expansion, this is supported for both
+single-and multi-line macros. \c{%?} refers to the macro name as
+\e{invoked}, whereas \c{%??} refers to the macro name as
+\e{declared}. The two are always the same for case-sensitive
+macros, but for case-insensitive macros, they can differ.
+
+For example:
+
+\c %idefine Foo mov %?,%??
+\c
+\c foo
+\c FOO
+
+will expand to:
+
+\c mov foo,Foo
+\c mov FOO,Foo
+
+The sequence:
+
+\c %idefine keyword $%?
+
+can be used to make a keyword "disappear", for example in case a new
+instruction has been used as a label in older code. For example:
+
+\c %idefine pause $%? ; Hide the PAUSE instruction
+
+
+\S{undef} Undefining Single-Line Macros: \i\c{%undef}
+
+Single-line macros can be removed with the \c{%undef} directive. For
+example, the following sequence:
+
+\c %define foo bar
+\c %undef foo
+\c
+\c mov eax, foo
+
+will expand to the instruction \c{mov eax, foo}, since after
+\c{%undef} the macro \c{foo} is no longer defined.
+
+Macros that would otherwise be pre-defined can be undefined on the
+command-line using the `-u' option on the NASM command line: see
+\k{opt-u}.
+
+
+\S{assign} \i{Preprocessor Variables}: \i\c{%assign}
+
+An alternative way to define single-line macros is by means of the
+\c{%assign} command (and its \I{case sensitive}case-insensitive
+counterpart \i\c{%iassign}, which differs from \c{%assign} in
+exactly the same way that \c{%idefine} differs from \c{%define}).
+
+\c{%assign} is used to define single-line macros which take no
+parameters and have a numeric value. This value can be specified in
+the form of an expression, and it will be evaluated once, when the
+\c{%assign} directive is processed.
+
+Like \c{%define}, macros defined using \c{%assign} can be re-defined
+later, so you can do things like
+
+\c %assign i i+1
+
+to increment the numeric value of a macro.
+
+\c{%assign} is useful for controlling the termination of \c{%rep}
+preprocessor loops: see \k{rep} for an example of this. Another
+use for \c{%assign} is given in \k{16c} and \k{32c}.
+
+The expression passed to \c{%assign} is a \i{critical expression}
+(see \k{crit}), and must also evaluate to a pure number (rather than
+a relocatable reference such as a code or data address, or anything
+involving a register).
+
+
+\S{defstr} Defining Strings: \I\c{%idefstr}\i\c{%defstr}
+
+\c{%defstr}, and its case-insensitive counterpart \c{%idefstr}, define
+or redefine a single-line macro without parameters but converts the
+entire right-hand side, after macro expansion, to a quoted string
+before definition.
+
+For example:
+
+\c %defstr test TEST
+
+is equivalent to
+
+\c %define test 'TEST'
+
+This can be used, for example, with the \c{%!} construct (see
+\k{getenv}):
+
+\c %defstr PATH %!PATH ; The operating system PATH variable
+
+
+\S{deftok} Defining Tokens: \I\c{%ideftok}\i\c{%deftok}
+
+\c{%deftok}, and its case-insensitive counterpart \c{%ideftok}, define
+or redefine a single-line macro without parameters but converts the
+second parameter, after string conversion, to a sequence of tokens.
+
+For example:
+
+\c %deftok test 'TEST'
+
+is equivalent to
+
+\c %define test TEST
+
+
+\H{strlen} \i{String Manipulation in Macros}
+
+It's often useful to be able to handle strings in macros. NASM
+supports a few simple string handling macro operators from which
+more complex operations can be constructed.
+
+All the string operators define or redefine a value (either a string
+or a numeric value) to a single-line macro. When producing a string
+value, it may change the style of quoting of the input string or
+strings, and possibly use \c{\\}-escapes inside \c{`}-quoted strings.
+
+\S{strcat} \i{Concatenating Strings}: \i\c{%strcat}
+
+The \c{%strcat} operator concatenates quoted strings and assign them to
+a single-line macro.
+
+For example:
+
+\c %strcat alpha "Alpha: ", '12" screen'
+
+... would assign the value \c{'Alpha: 12" screen'} to \c{alpha}.
+Similarly:
+
+\c %strcat beta '"foo"\', "'bar'"
+
+... would assign the value \c{`"foo"\\\\'bar'`} to \c{beta}.
+
+The use of commas to separate strings is permitted but optional.
+
+
+\S{strlen} \i{String Length}: \i\c{%strlen}
+
+The \c{%strlen} operator assigns the length of a string to a macro.
+For example:
+
+\c %strlen charcnt 'my string'
+
+In this example, \c{charcnt} would receive the value 9, just as
+if an \c{%assign} had been used. In this example, \c{'my string'}
+was a literal string but it could also have been a single-line
+macro that expands to a string, as in the following example:
+
+\c %define sometext 'my string'
+\c %strlen charcnt sometext
+
+As in the first case, this would result in \c{charcnt} being
+assigned the value of 9.
+
+
+\S{substr} \i{Extracting Substrings}: \i\c{%substr}
+
+Individual letters or substrings in strings can be extracted using the
+\c{%substr} operator. An example of its use is probably more useful
+than the description:
+
+\c %substr mychar 'xyzw' 1 ; equivalent to %define mychar 'x'
+\c %substr mychar 'xyzw' 2 ; equivalent to %define mychar 'y'
+\c %substr mychar 'xyzw' 3 ; equivalent to %define mychar 'z'
+\c %substr mychar 'xyzw' 2,2 ; equivalent to %define mychar 'yz'
+\c %substr mychar 'xyzw' 2,-1 ; equivalent to %define mychar 'yzw'
+\c %substr mychar 'xyzw' 2,-2 ; equivalent to %define mychar 'yz'
+
+As with \c{%strlen} (see \k{strlen}), the first parameter is the
+single-line macro to be created and the second is the string. The
+third parameter specifies the first character to be selected, and the
+optional fourth parameter preceeded by comma) is the length. Note
+that the first index is 1, not 0 and the last index is equal to the
+value that \c{%strlen} would assign given the same string. Index
+values out of range result in an empty string. A negative length
+means "until N-1 characters before the end of string", i.e. \c{-1}
+means until end of string, \c{-2} until one character before, etc.
+
+
+\H{mlmacro} \i{Multi-Line Macros}: \I\c{%imacro}\i\c{%macro}
+
+Multi-line macros are much more like the type of macro seen in MASM
+and TASM: a multi-line macro definition in NASM looks something like
+this.
+
+\c %macro prologue 1
+\c
+\c push ebp
+\c mov ebp,esp
+\c sub esp,%1
+\c
+\c %endmacro
+
+This defines a C-like function prologue as a macro: so you would
+invoke the macro with a call such as
+
+\c myfunc: prologue 12
+
+which would expand to the three lines of code
+
+\c myfunc: push ebp
+\c mov ebp,esp
+\c sub esp,12
+
+The number \c{1} after the macro name in the \c{%macro} line defines
+the number of parameters the macro \c{prologue} expects to receive.
+The use of \c{%1} inside the macro definition refers to the first
+parameter to the macro call. With a macro taking more than one
+parameter, subsequent parameters would be referred to as \c{%2},
+\c{%3} and so on.
+
+Multi-line macros, like single-line macros, are \i{case-sensitive},
+unless you define them using the alternative directive \c{%imacro}.
+
+If you need to pass a comma as \e{part} of a parameter to a
+multi-line macro, you can do that by enclosing the entire parameter
+in \I{braces, around macro parameters}braces. So you could code
+things like
+
+\c %macro silly 2
+\c
+\c %2: db %1
+\c
+\c %endmacro
+\c
+\c silly 'a', letter_a ; letter_a: db 'a'
+\c silly 'ab', string_ab ; string_ab: db 'ab'
+\c silly {13,10}, crlf ; crlf: db 13,10
+
+
+\S{mlmacover} Overloading Multi-Line Macros\I{overloading, multi-line macros}
+
+As with single-line macros, multi-line macros can be overloaded by
+defining the same macro name several times with different numbers of
+parameters. This time, no exception is made for macros with no
+parameters at all. So you could define
+
+\c %macro prologue 0
+\c
+\c push ebp
+\c mov ebp,esp
+\c
+\c %endmacro
+
+to define an alternative form of the function prologue which
+allocates no local stack space.
+
+Sometimes, however, you might want to `overload' a machine
+instruction; for example, you might want to define
+
+\c %macro push 2
+\c
+\c push %1
+\c push %2
+\c
+\c %endmacro
+
+so that you could code
+
+\c push ebx ; this line is not a macro call
+\c push eax,ecx ; but this one is
+
+Ordinarily, NASM will give a warning for the first of the above two
+lines, since \c{push} is now defined to be a macro, and is being
+invoked with a number of parameters for which no definition has been
+given. The correct code will still be generated, but the assembler
+will give a warning. This warning can be disabled by the use of the
+\c{-w-macro-params} command-line option (see \k{opt-w}).
+
+
+\S{maclocal} \i{Macro-Local Labels}
+
+NASM allows you to define labels within a multi-line macro
+definition in such a way as to make them local to the macro call: so
+calling the same macro multiple times will use a different label
+each time. You do this by prefixing \i\c{%%} to the label name. So
+you can invent an instruction which executes a \c{RET} if the \c{Z}
+flag is set by doing this:
+
+\c %macro retz 0
+\c
+\c jnz %%skip
+\c ret
+\c %%skip:
+\c
+\c %endmacro
+
+You can call this macro as many times as you want, and every time
+you call it NASM will make up a different `real' name to substitute
+for the label \c{%%skip}. The names NASM invents are of the form
+\c{..@2345.skip}, where the number 2345 changes with every macro
+call. The \i\c{..@} prefix prevents macro-local labels from
+interfering with the local label mechanism, as described in
+\k{locallab}. You should avoid defining your own labels in this form
+(the \c{..@} prefix, then a number, then another period) in case
+they interfere with macro-local labels.
+
+
+\S{mlmacgre} \i{Greedy Macro Parameters}
+
+Occasionally it is useful to define a macro which lumps its entire
+command line into one parameter definition, possibly after
+extracting one or two smaller parameters from the front. An example
+might be a macro to write a text string to a file in MS-DOS, where
+you might want to be able to write
+
+\c writefile [filehandle],"hello, world",13,10
+
+NASM allows you to define the last parameter of a macro to be
+\e{greedy}, meaning that if you invoke the macro with more
+parameters than it expects, all the spare parameters get lumped into
+the last defined one along with the separating commas. So if you
+code:
+
+\c %macro writefile 2+
+\c
+\c jmp %%endstr
+\c %%str: db %2
+\c %%endstr:
+\c mov dx,%%str
+\c mov cx,%%endstr-%%str
+\c mov bx,%1
+\c mov ah,0x40
+\c int 0x21
+\c
+\c %endmacro
+
+then the example call to \c{writefile} above will work as expected:
+the text before the first comma, \c{[filehandle]}, is used as the
+first macro parameter and expanded when \c{%1} is referred to, and
+all the subsequent text is lumped into \c{%2} and placed after the
+\c{db}.
+
+The greedy nature of the macro is indicated to NASM by the use of
+the \I{+ modifier}\c{+} sign after the parameter count on the
+\c{%macro} line.
+
+If you define a greedy macro, you are effectively telling NASM how
+it should expand the macro given \e{any} number of parameters from
+the actual number specified up to infinity; in this case, for
+example, NASM now knows what to do when it sees a call to
+\c{writefile} with 2, 3, 4 or more parameters. NASM will take this
+into account when overloading macros, and will not allow you to
+define another form of \c{writefile} taking 4 parameters (for
+example).
+
+Of course, the above macro could have been implemented as a
+non-greedy macro, in which case the call to it would have had to
+look like
+
+\c writefile [filehandle], {"hello, world",13,10}
+
+NASM provides both mechanisms for putting \i{commas in macro
+parameters}, and you choose which one you prefer for each macro
+definition.
+
+See \k{sectmac} for a better way to write the above macro.
+
+\S{mlmacrange} \i{Macro Parameters Range}
+
+NASM allows you to expand parameters via special construction \c{%\{x:y\}}
+where \c{x} is the first parameter index and \c{y} is the last. Any index can
+be either negative or positive but must never be zero.
+
+For example
+
+\c %macro mpar 1-*
+\c db %{3:5}
+\c %endmacro
+\c
+\c mpar 1,2,3,4,5,6
+
+expands to \c{3,4,5} range.
+
+Even more, the parameters can be reversed so that
+
+\c %macro mpar 1-*
+\c db %{5:3}
+\c %endmacro
+\c
+\c mpar 1,2,3,4,5,6
+
+expands to \c{5,4,3} range.
+
+But even this is not the last. The parameters can be addressed via negative
+indices so NASM will count them reversed. The ones who know Python may see
+the analogue here.
+
+\c %macro mpar 1-*
+\c db %{-1:-3}
+\c %endmacro
+\c
+\c mpar 1,2,3,4,5,6
+
+expands to \c{6,5,4} range.
+
+Note that NASM uses \i{comma} to separate parameters being expanded.
+
+By the way, here is a trick - you might use the index \c{%{-1:-1}}
+which gives you the \i{last} argument passed to a macro.
+
+\S{mlmacdef} \i{Default Macro Parameters}
+
+NASM also allows you to define a multi-line macro with a \e{range}
+of allowable parameter counts. If you do this, you can specify
+defaults for \i{omitted parameters}. So, for example:
+
+\c %macro die 0-1 "Painful program death has occurred."
+\c
+\c writefile 2,%1
+\c mov ax,0x4c01
+\c int 0x21
+\c
+\c %endmacro
+
+This macro (which makes use of the \c{writefile} macro defined in
+\k{mlmacgre}) can be called with an explicit error message, which it
+will display on the error output stream before exiting, or it can be
+called with no parameters, in which case it will use the default
+error message supplied in the macro definition.
+
+In general, you supply a minimum and maximum number of parameters
+for a macro of this type; the minimum number of parameters are then
+required in the macro call, and then you provide defaults for the
+optional ones. So if a macro definition began with the line
+
+\c %macro foobar 1-3 eax,[ebx+2]
+
+then it could be called with between one and three parameters, and
+\c{%1} would always be taken from the macro call. \c{%2}, if not
+specified by the macro call, would default to \c{eax}, and \c{%3} if
+not specified would default to \c{[ebx+2]}.
+
+You can provide extra information to a macro by providing
+too many default parameters:
+
+\c %macro quux 1 something
+
+This will trigger a warning by default; see \k{opt-w} for
+more information.
+When \c{quux} is invoked, it receives not one but two parameters.
+\c{something} can be referred to as \c{%2}. The difference
+between passing \c{something} this way and writing \c{something}
+in the macro body is that with this way \c{something} is evaluated
+when the macro is defined, not when it is expanded.
+
+You may omit parameter defaults from the macro definition, in which
+case the parameter default is taken to be blank. This can be useful
+for macros which can take a variable number of parameters, since the
+\i\c{%0} token (see \k{percent0}) allows you to determine how many
+parameters were really passed to the macro call.
+
+This defaulting mechanism can be combined with the greedy-parameter
+mechanism; so the \c{die} macro above could be made more powerful,
+and more useful, by changing the first line of the definition to
+
+\c %macro die 0-1+ "Painful program death has occurred.",13,10
+
+The maximum parameter count can be infinite, denoted by \c{*}. In
+this case, of course, it is impossible to provide a \e{full} set of
+default parameters. Examples of this usage are shown in \k{rotate}.
+
+
+\S{percent0} \i\c{%0}: \I{counting macro parameters}Macro Parameter Counter
+
+The parameter reference \c{%0} will return a numeric constant giving the
+number of parameters received, that is, if \c{%0} is n then \c{%}n is the
+last parameter. \c{%0} is mostly useful for macros that can take a variable
+number of parameters. It can be used as an argument to \c{%rep}
+(see \k{rep}) in order to iterate through all the parameters of a macro.
+Examples are given in \k{rotate}.
+
+
+\S{percent00} \i\c{%00}: \I{label preceeding macro}Label Preceeding Macro
+
+\c{%00} will return the label preceeding the macro invocation, if any. The
+label must be on the same line as the macro invocation, may be a local label
+(see \k{locallab}), and need not end in a colon.
+
+
+\S{rotate} \i\c{%rotate}: \i{Rotating Macro Parameters}
+
+Unix shell programmers will be familiar with the \I{shift
+command}\c{shift} shell command, which allows the arguments passed
+to a shell script (referenced as \c{$1}, \c{$2} and so on) to be
+moved left by one place, so that the argument previously referenced
+as \c{$2} becomes available as \c{$1}, and the argument previously
+referenced as \c{$1} is no longer available at all.
+
+NASM provides a similar mechanism, in the form of \c{%rotate}. As
+its name suggests, it differs from the Unix \c{shift} in that no
+parameters are lost: parameters rotated off the left end of the
+argument list reappear on the right, and vice versa.
+
+\c{%rotate} is invoked with a single numeric argument (which may be
+an expression). The macro parameters are rotated to the left by that
+many places. If the argument to \c{%rotate} is negative, the macro
+parameters are rotated to the right.
+
+\I{iterating over macro parameters}So a pair of macros to save and
+restore a set of registers might work as follows:
+
+\c %macro multipush 1-*
+\c
+\c %rep %0
+\c push %1
+\c %rotate 1
+\c %endrep
+\c
+\c %endmacro
+
+This macro invokes the \c{PUSH} instruction on each of its arguments
+in turn, from left to right. It begins by pushing its first
+argument, \c{%1}, then invokes \c{%rotate} to move all the arguments
+one place to the left, so that the original second argument is now
+available as \c{%1}. Repeating this procedure as many times as there
+were arguments (achieved by supplying \c{%0} as the argument to
+\c{%rep}) causes each argument in turn to be pushed.
+
+Note also the use of \c{*} as the maximum parameter count,
+indicating that there is no upper limit on the number of parameters
+you may supply to the \i\c{multipush} macro.
+
+It would be convenient, when using this macro, to have a \c{POP}
+equivalent, which \e{didn't} require the arguments to be given in
+reverse order. Ideally, you would write the \c{multipush} macro
+call, then cut-and-paste the line to where the pop needed to be
+done, and change the name of the called macro to \c{multipop}, and
+the macro would take care of popping the registers in the opposite
+order from the one in which they were pushed.
+
+This can be done by the following definition:
+
+\c %macro multipop 1-*
+\c
+\c %rep %0
+\c %rotate -1
+\c pop %1
+\c %endrep
+\c
+\c %endmacro
+
+This macro begins by rotating its arguments one place to the
+\e{right}, so that the original \e{last} argument appears as \c{%1}.
+This is then popped, and the arguments are rotated right again, so
+the second-to-last argument becomes \c{%1}. Thus the arguments are
+iterated through in reverse order.
+
+
+\S{concat} \i{Concatenating Macro Parameters}
+
+NASM can concatenate macro parameters and macro indirection constructs
+on to other text surrounding them. This allows you to declare a family
+of symbols, for example, in a macro definition. If, for example, you
+wanted to generate a table of key codes along with offsets into the
+table, you could code something like
+
+\c %macro keytab_entry 2
+\c
+\c keypos%1 equ $-keytab
+\c db %2
+\c
+\c %endmacro
+\c
+\c keytab:
+\c keytab_entry F1,128+1
+\c keytab_entry F2,128+2
+\c keytab_entry Return,13
+
+which would expand to
+
+\c keytab:
+\c keyposF1 equ $-keytab
+\c db 128+1
+\c keyposF2 equ $-keytab
+\c db 128+2
+\c keyposReturn equ $-keytab
+\c db 13
+
+You can just as easily concatenate text on to the other end of a
+macro parameter, by writing \c{%1foo}.
+
+If you need to append a \e{digit} to a macro parameter, for example
+defining labels \c{foo1} and \c{foo2} when passed the parameter
+\c{foo}, you can't code \c{%11} because that would be taken as the
+eleventh macro parameter. Instead, you must code
+\I{braces, after % sign}\c{%\{1\}1}, which will separate the first
+\c{1} (giving the number of the macro parameter) from the second
+(literal text to be concatenated to the parameter).
+
+This concatenation can also be applied to other preprocessor in-line
+objects, such as macro-local labels (\k{maclocal}) and context-local
+labels (\k{ctxlocal}). In all cases, ambiguities in syntax can be
+resolved by enclosing everything after the \c{%} sign and before the
+literal text in braces: so \c{%\{%foo\}bar} concatenates the text
+\c{bar} to the end of the real name of the macro-local label
+\c{%%foo}. (This is unnecessary, since the form NASM uses for the
+real names of macro-local labels means that the two usages
+\c{%\{%foo\}bar} and \c{%%foobar} would both expand to the same
+thing anyway; nevertheless, the capability is there.)
+
+The single-line macro indirection construct, \c{%[...]}
+(\k{indmacro}), behaves the same way as macro parameters for the
+purpose of concatenation.
+
+See also the \c{%+} operator, \k{concat%+}.
+
+
+\S{mlmaccc} \i{Condition Codes as Macro Parameters}
+
+NASM can give special treatment to a macro parameter which contains
+a condition code. For a start, you can refer to the macro parameter
+\c{%1} by means of the alternative syntax \i\c{%+1}, which informs
+NASM that this macro parameter is supposed to contain a condition
+code, and will cause the preprocessor to report an error message if
+the macro is called with a parameter which is \e{not} a valid
+condition code.
+
+Far more usefully, though, you can refer to the macro parameter by
+means of \i\c{%-1}, which NASM will expand as the \e{inverse}
+condition code. So the \c{retz} macro defined in \k{maclocal} can be
+replaced by a general \i{conditional-return macro} like this:
+
+\c %macro retc 1
+\c
+\c j%-1 %%skip
+\c ret
+\c %%skip:
+\c
+\c %endmacro
+
+This macro can now be invoked using calls like \c{retc ne}, which
+will cause the conditional-jump instruction in the macro expansion
+to come out as \c{JE}, or \c{retc po} which will make the jump a
+\c{JPE}.
+
+The \c{%+1} macro-parameter reference is quite happy to interpret
+the arguments \c{CXZ} and \c{ECXZ} as valid condition codes;
+however, \c{%-1} will report an error if passed either of these,
+because no inverse condition code exists.
+
+
+\S{nolist} \i{Disabling Listing Expansion}\I\c{.nolist}
+
+When NASM is generating a listing file from your program, it will
+generally expand multi-line macros by means of writing the macro
+call and then listing each line of the expansion. This allows you to
+see which instructions in the macro expansion are generating what
+code; however, for some macros this clutters the listing up
+unnecessarily.
+
+NASM therefore provides the \c{.nolist} qualifier, which you can
+include in a macro definition to inhibit the expansion of the macro
+in the listing file. The \c{.nolist} qualifier comes directly after
+the number of parameters, like this:
+
+\c %macro foo 1.nolist
+
+Or like this:
+
+\c %macro bar 1-5+.nolist a,b,c,d,e,f,g,h
+
+\S{unmacro} Undefining Multi-Line Macros: \i\c{%unmacro}
+
+Multi-line macros can be removed with the \c{%unmacro} directive.
+Unlike the \c{%undef} directive, however, \c{%unmacro} takes an
+argument specification, and will only remove \i{exact matches} with
+that argument specification.
+
+For example:
+
+\c %macro foo 1-3
+\c ; Do something
+\c %endmacro
+\c %unmacro foo 1-3
+
+removes the previously defined macro \c{foo}, but
+
+\c %macro bar 1-3
+\c ; Do something
+\c %endmacro
+\c %unmacro bar 1
+
+does \e{not} remove the macro \c{bar}, since the argument
+specification does not match exactly.
+
+
+\H{condasm} \i{Conditional Assembly}\I\c{%if}
+
+Similarly to the C preprocessor, NASM allows sections of a source
+file to be assembled only if certain conditions are met. The general
+syntax of this feature looks like this:
+
+\c %if<condition>
+\c ; some code which only appears if <condition> is met
+\c %elif<condition2>
+\c ; only appears if <condition> is not met but <condition2> is
+\c %else
+\c ; this appears if neither <condition> nor <condition2> was met
+\c %endif
+
+The inverse forms \i\c{%ifn} and \i\c{%elifn} are also supported.
+
+The \i\c{%else} clause is optional, as is the \i\c{%elif} clause.
+You can have more than one \c{%elif} clause as well.
+
+There are a number of variants of the \c{%if} directive. Each has its
+corresponding \c{%elif}, \c{%ifn}, and \c{%elifn} directives; for
+example, the equivalents to the \c{%ifdef} directive are \c{%elifdef},
+\c{%ifndef}, and \c{%elifndef}.
+
+\S{ifdef} \i\c{%ifdef}: Testing Single-Line Macro Existence\I{testing,
+single-line macro existence}
+
+Beginning a conditional-assembly block with the line \c{%ifdef
+MACRO} will assemble the subsequent code if, and only if, a
+single-line macro called \c{MACRO} is defined. If not, then the
+\c{%elif} and \c{%else} blocks (if any) will be processed instead.
+
+For example, when debugging a program, you might want to write code
+such as
+
+\c ; perform some function
+\c %ifdef DEBUG
+\c writefile 2,"Function performed successfully",13,10
+\c %endif
+\c ; go and do something else
+
+Then you could use the command-line option \c{-dDEBUG} to create a
+version of the program which produced debugging messages, and remove
+the option to generate the final release version of the program.
+
+You can test for a macro \e{not} being defined by using
+\i\c{%ifndef} instead of \c{%ifdef}. You can also test for macro
+definitions in \c{%elif} blocks by using \i\c{%elifdef} and
+\i\c{%elifndef}.
+
+
+\S{ifmacro} \i\c{%ifmacro}: Testing Multi-Line Macro
+Existence\I{testing, multi-line macro existence}
+
+The \c{%ifmacro} directive operates in the same way as the \c{%ifdef}
+directive, except that it checks for the existence of a multi-line macro.
+
+For example, you may be working with a large project and not have control
+over the macros in a library. You may want to create a macro with one
+name if it doesn't already exist, and another name if one with that name
+does exist.
+
+The \c{%ifmacro} is considered true if defining a macro with the given name
+and number of arguments would cause a definitions conflict. For example:
+
+\c %ifmacro MyMacro 1-3
+\c
+\c %error "MyMacro 1-3" causes a conflict with an existing macro.
+\c
+\c %else
+\c
+\c %macro MyMacro 1-3
+\c
+\c ; insert code to define the macro
+\c
+\c %endmacro
+\c
+\c %endif
+
+This will create the macro "MyMacro 1-3" if no macro already exists which
+would conflict with it, and emits a warning if there would be a definition
+conflict.
+
+You can test for the macro not existing by using the \i\c{%ifnmacro} instead
+of \c{%ifmacro}. Additional tests can be performed in \c{%elif} blocks by using
+\i\c{%elifmacro} and \i\c{%elifnmacro}.
+
+
+\S{ifctx} \i\c{%ifctx}: Testing the Context Stack\I{testing, context
+stack}
+
+The conditional-assembly construct \c{%ifctx} will cause the
+subsequent code to be assembled if and only if the top context on
+the preprocessor's context stack has the same name as one of the arguments.
+As with \c{%ifdef}, the inverse and \c{%elif} forms \i\c{%ifnctx},
+\i\c{%elifctx} and \i\c{%elifnctx} are also supported.
+
+For more details of the context stack, see \k{ctxstack}. For a
+sample use of \c{%ifctx}, see \k{blockif}.
+
+
+\S{if} \i\c{%if}: Testing Arbitrary Numeric Expressions\I{testing,
+arbitrary numeric expressions}
+
+The conditional-assembly construct \c{%if expr} will cause the
+subsequent code to be assembled if and only if the value of the
+numeric expression \c{expr} is non-zero. An example of the use of
+this feature is in deciding when to break out of a \c{%rep}
+preprocessor loop: see \k{rep} for a detailed example.
+
+The expression given to \c{%if}, and its counterpart \i\c{%elif}, is
+a critical expression (see \k{crit}).
+
+\c{%if} extends the normal NASM expression syntax, by providing a
+set of \i{relational operators} which are not normally available in
+expressions. The operators \i\c{=}, \i\c{<}, \i\c{>}, \i\c{<=},
+\i\c{>=} and \i\c{<>} test equality, less-than, greater-than,
+less-or-equal, greater-or-equal and not-equal respectively. The
+C-like forms \i\c{==} and \i\c{!=} are supported as alternative
+forms of \c{=} and \c{<>}. In addition, low-priority logical
+operators \i\c{&&}, \i\c{^^} and \i\c{||} are provided, supplying
+\i{logical AND}, \i{logical XOR} and \i{logical OR}. These work like
+the C logical operators (although C has no logical XOR), in that
+they always return either 0 or 1, and treat any non-zero input as 1
+(so that \c{^^}, for example, returns 1 if exactly one of its inputs
+is zero, and 0 otherwise). The relational operators also return 1
+for true and 0 for false.
+
+Like other \c{%if} constructs, \c{%if} has a counterpart
+\i\c{%elif}, and negative forms \i\c{%ifn} and \i\c{%elifn}.
+
+\S{ifidn} \i\c{%ifidn} and \i\c{%ifidni}: Testing Exact Text
+Identity\I{testing, exact text identity}
+
+The construct \c{%ifidn text1,text2} will cause the subsequent code
+to be assembled if and only if \c{text1} and \c{text2}, after
+expanding single-line macros, are identical pieces of text.
+Differences in white space are not counted.
+
+\c{%ifidni} is similar to \c{%ifidn}, but is \i{case-insensitive}.
+
+For example, the following macro pushes a register or number on the
+stack, and allows you to treat \c{IP} as a real register:
+
+\c %macro pushparam 1
+\c
+\c %ifidni %1,ip
+\c call %%label
+\c %%label:
+\c %else
+\c push %1
+\c %endif
+\c
+\c %endmacro
+
+Like other \c{%if} constructs, \c{%ifidn} has a counterpart
+\i\c{%elifidn}, and negative forms \i\c{%ifnidn} and \i\c{%elifnidn}.
+Similarly, \c{%ifidni} has counterparts \i\c{%elifidni},
+\i\c{%ifnidni} and \i\c{%elifnidni}.
+
+\S{iftyp} \i\c{%ifid}, \i\c{%ifnum}, \i\c{%ifstr}: Testing Token
+Types\I{testing, token types}
+
+Some macros will want to perform different tasks depending on
+whether they are passed a number, a string, or an identifier. For
+example, a string output macro might want to be able to cope with
+being passed either a string constant or a pointer to an existing
+string.
+
+The conditional assembly construct \c{%ifid}, taking one parameter
+(which may be blank), assembles the subsequent code if and only if
+the first token in the parameter exists and is an identifier.
+\c{%ifnum} works similarly, but tests for the token being a numeric
+constant; \c{%ifstr} tests for it being a string.
+
+For example, the \c{writefile} macro defined in \k{mlmacgre} can be
+extended to take advantage of \c{%ifstr} in the following fashion:
+
+\c %macro writefile 2-3+
+\c
+\c %ifstr %2
+\c jmp %%endstr
+\c %if %0 = 3
+\c %%str: db %2,%3
+\c %else
+\c %%str: db %2
+\c %endif
+\c %%endstr: mov dx,%%str
+\c mov cx,%%endstr-%%str
+\c %else
+\c mov dx,%2
+\c mov cx,%3
+\c %endif
+\c mov bx,%1
+\c mov ah,0x40
+\c int 0x21
+\c
+\c %endmacro
+
+Then the \c{writefile} macro can cope with being called in either of
+the following two ways:
+
+\c writefile [file], strpointer, length
+\c writefile [file], "hello", 13, 10
+
+In the first, \c{strpointer} is used as the address of an
+already-declared string, and \c{length} is used as its length; in
+the second, a string is given to the macro, which therefore declares
+it itself and works out the address and length for itself.
+
+Note the use of \c{%if} inside the \c{%ifstr}: this is to detect
+whether the macro was passed two arguments (so the string would be a
+single string constant, and \c{db %2} would be adequate) or more (in
+which case, all but the first two would be lumped together into
+\c{%3}, and \c{db %2,%3} would be required).
+
+The usual \I\c{%elifid}\I\c{%elifnum}\I\c{%elifstr}\c{%elif}...,
+\I\c{%ifnid}\I\c{%ifnnum}\I\c{%ifnstr}\c{%ifn}..., and
+\I\c{%elifnid}\I\c{%elifnnum}\I\c{%elifnstr}\c{%elifn}... versions
+exist for each of \c{%ifid}, \c{%ifnum} and \c{%ifstr}.
+
+\S{iftoken} \i\c{%iftoken}: Test for a Single Token
+
+Some macros will want to do different things depending on if it is
+passed a single token (e.g. paste it to something else using \c{%+})
+versus a multi-token sequence.
+
+The conditional assembly construct \c{%iftoken} assembles the
+subsequent code if and only if the expanded parameters consist of
+exactly one token, possibly surrounded by whitespace.
+
+For example:
+
+\c %iftoken 1
+
+will assemble the subsequent code, but
+
+\c %iftoken -1
+
+will not, since \c{-1} contains two tokens: the unary minus operator
+\c{-}, and the number \c{1}.
+
+The usual \i\c{%eliftoken}, \i\c\{%ifntoken}, and \i\c{%elifntoken}
+variants are also provided.
+
+\S{ifempty} \i\c{%ifempty}: Test for Empty Expansion
+
+The conditional assembly construct \c{%ifempty} assembles the
+subsequent code if and only if the expanded parameters do not contain
+any tokens at all, whitespace excepted.
+
+The usual \i\c{%elifempty}, \i\c\{%ifnempty}, and \i\c{%elifnempty}
+variants are also provided.
+
+\S{ifenv} \i\c{%ifenv}: Test If Environment Variable Exists
+
+The conditional assembly construct \c{%ifenv} assembles the
+subsequent code if and only if the environment variable referenced by
+the \c{%!}\e{variable} directive exists.
+
+The usual \i\c{%elifenv}, \i\c\{%ifnenv}, and \i\c{%elifnenv}
+variants are also provided.
+
+Just as for \c{%!}\e{variable} the argument should be written as a
+string if it contains characters that would not be legal in an
+identifier. See \k{getenv}.
+
+\H{rep} \i{Preprocessor Loops}\I{repeating code}: \i\c{%rep}
+
+NASM's \c{TIMES} prefix, though useful, cannot be used to invoke a
+multi-line macro multiple times, because it is processed by NASM
+after macros have already been expanded. Therefore NASM provides
+another form of loop, this time at the preprocessor level: \c{%rep}.
+
+The directives \c{%rep} and \i\c{%endrep} (\c{%rep} takes a numeric
+argument, which can be an expression; \c{%endrep} takes no
+arguments) can be used to enclose a chunk of code, which is then
+replicated as many times as specified by the preprocessor:
+
+\c %assign i 0
+\c %rep 64
+\c inc word [table+2*i]
+\c %assign i i+1
+\c %endrep
+
+This will generate a sequence of 64 \c{INC} instructions,
+incrementing every word of memory from \c{[table]} to
+\c{[table+126]}.
+
+For more complex termination conditions, or to break out of a repeat
+loop part way along, you can use the \i\c{%exitrep} directive to
+terminate the loop, like this:
+
+\c fibonacci:
+\c %assign i 0
+\c %assign j 1
+\c %rep 100
+\c %if j > 65535
+\c %exitrep
+\c %endif
+\c dw j
+\c %assign k j+i
+\c %assign i j
+\c %assign j k
+\c %endrep
+\c
+\c fib_number equ ($-fibonacci)/2
+
+This produces a list of all the Fibonacci numbers that will fit in
+16 bits. Note that a maximum repeat count must still be given to
+\c{%rep}. This is to prevent the possibility of NASM getting into an
+infinite loop in the preprocessor, which (on multitasking or
+multi-user systems) would typically cause all the system memory to
+be gradually used up and other applications to start crashing.
+
+Note a maximum repeat count is limited by 62 bit number, though it
+is hardly possible that you ever need anything bigger.
+
+
+\H{files} Source Files and Dependencies
+
+These commands allow you to split your sources into multiple files.
+
+\S{include} \i\c{%include}: \i{Including Other Files}
+
+Using, once again, a very similar syntax to the C preprocessor,
+NASM's preprocessor lets you include other source files into your
+code. This is done by the use of the \i\c{%include} directive:
+
+\c %include "macros.mac"
+
+will include the contents of the file \c{macros.mac} into the source
+file containing the \c{%include} directive.
+
+Include files are \I{searching for include files}searched for in the
+current directory (the directory you're in when you run NASM, as
+opposed to the location of the NASM executable or the location of
+the source file), plus any directories specified on the NASM command
+line using the \c{-i} option.
+
+The standard C idiom for preventing a file being included more than
+once is just as applicable in NASM: if the file \c{macros.mac} has
+the form
+
+\c %ifndef MACROS_MAC
+\c %define MACROS_MAC
+\c ; now define some macros
+\c %endif
+
+then including the file more than once will not cause errors,
+because the second time the file is included nothing will happen
+because the macro \c{MACROS_MAC} will already be defined.
+
+You can force a file to be included even if there is no \c{%include}
+directive that explicitly includes it, by using the \i\c{-p} option
+on the NASM command line (see \k{opt-p}).
+
+
+\S{pathsearch} \i\c{%pathsearch}: Search the Include Path
+
+The \c{%pathsearch} directive takes a single-line macro name and a
+filename, and declare or redefines the specified single-line macro to
+be the include-path-resolved version of the filename, if the file
+exists (otherwise, it is passed unchanged.)
+
+For example,
+
+\c %pathsearch MyFoo "foo.bin"
+
+... with \c{-Ibins/} in the include path may end up defining the macro
+\c{MyFoo} to be \c{"bins/foo.bin"}.
+
+
+\S{depend} \i\c{%depend}: Add Dependent Files
+
+The \c{%depend} directive takes a filename and adds it to the list of
+files to be emitted as dependency generation when the \c{-M} options
+and its relatives (see \k{opt-M}) are used. It produces no output.
+
+This is generally used in conjunction with \c{%pathsearch}. For
+example, a simplified version of the standard macro wrapper for the
+\c{INCBIN} directive looks like:
+
+\c %imacro incbin 1-2+ 0
+\c %pathsearch dep %1
+\c %depend dep
+\c incbin dep,%2
+\c %endmacro
+
+This first resolves the location of the file into the macro \c{dep},
+then adds it to the dependency lists, and finally issues the
+assembler-level \c{INCBIN} directive.
+
+
+\S{use} \i\c{%use}: Include Standard Macro Package
+
+The \c{%use} directive is similar to \c{%include}, but rather than
+including the contents of a file, it includes a named standard macro
+package. The standard macro packages are part of NASM, and are
+described in \k{macropkg}.
+
+Unlike the \c{%include} directive, package names for the \c{%use}
+directive do not require quotes, but quotes are permitted. In NASM
+2.04 and 2.05 the unquoted form would be macro-expanded; this is no
+longer true. Thus, the following lines are equivalent:
+
+\c %use altreg
+\c %use 'altreg'
+
+Standard macro packages are protected from multiple inclusion. When a
+standard macro package is used, a testable single-line macro of the
+form \c{__USE_}\e{package}\c{__} is also defined, see \k{use_def}.
+
+\H{ctxstack} The \i{Context Stack}
+
+Having labels that are local to a macro definition is sometimes not
+quite powerful enough: sometimes you want to be able to share labels
+between several macro calls. An example might be a \c{REPEAT} ...
+\c{UNTIL} loop, in which the expansion of the \c{REPEAT} macro
+would need to be able to refer to a label which the \c{UNTIL} macro
+had defined. However, for such a macro you would also want to be
+able to nest these loops.
+
+NASM provides this level of power by means of a \e{context stack}.
+The preprocessor maintains a stack of \e{contexts}, each of which is
+characterized by a name. You add a new context to the stack using
+the \i\c{%push} directive, and remove one using \i\c{%pop}. You can
+define labels that are local to a particular context on the stack.
+
+
+\S{pushpop} \i\c{%push} and \i\c{%pop}: \I{creating
+contexts}\I{removing contexts}Creating and Removing Contexts
+
+The \c{%push} directive is used to create a new context and place it
+on the top of the context stack. \c{%push} takes an optional argument,
+which is the name of the context. For example:
+
+\c %push foobar
+
+This pushes a new context called \c{foobar} on the stack. You can have
+several contexts on the stack with the same name: they can still be
+distinguished. If no name is given, the context is unnamed (this is
+normally used when both the \c{%push} and the \c{%pop} are inside a
+single macro definition.)
+
+The directive \c{%pop}, taking one optional argument, removes the top
+context from the context stack and destroys it, along with any
+labels associated with it. If an argument is given, it must match the
+name of the current context, otherwise it will issue an error.
+
+
+\S{ctxlocal} \i{Context-Local Labels}
+
+Just as the usage \c{%%foo} defines a label which is local to the
+particular macro call in which it is used, the usage \I{%$}\c{%$foo}
+is used to define a label which is local to the context on the top
+of the context stack. So the \c{REPEAT} and \c{UNTIL} example given
+above could be implemented by means of:
+
+\c %macro repeat 0
+\c
+\c %push repeat
+\c %$begin:
+\c
+\c %endmacro
+\c
+\c %macro until 1
+\c
+\c j%-1 %$begin
+\c %pop
+\c
+\c %endmacro
+
+and invoked by means of, for example,
+
+\c mov cx,string
+\c repeat
+\c add cx,3
+\c scasb
+\c until e
+
+which would scan every fourth byte of a string in search of the byte
+in \c{AL}.
+
+If you need to define, or access, labels local to the context
+\e{below} the top one on the stack, you can use \I{%$$}\c{%$$foo}, or
+\c{%$$$foo} for the context below that, and so on.
+
+
+\S{ctxdefine} \i{Context-Local Single-Line Macros}
+
+NASM also allows you to define single-line macros which are local to
+a particular context, in just the same way:
+
+\c %define %$localmac 3
+
+will define the single-line macro \c{%$localmac} to be local to the
+top context on the stack. Of course, after a subsequent \c{%push},
+it can then still be accessed by the name \c{%$$localmac}.
+
+
+\S{ctxfallthrough} \i{Context Fall-Through Lookup} \e{(deprecated)}
+
+Context fall-through lookup (automatic searching of outer contexts)
+is a feature that was added in NASM version 0.98.03. Unfortunately,
+this feature is unintuitive and can result in buggy code that would
+have otherwise been prevented by NASM's error reporting. As a result,
+this feature has been \e{deprecated}. NASM version 2.09 will issue a
+warning when usage of this \e{deprecated} feature is detected. Starting
+with NASM version 2.10, usage of this \e{deprecated} feature will simply
+result in an \e{expression syntax error}.
+
+An example usage of this \e{deprecated} feature follows:
+
+\c %macro ctxthru 0
+\c %push ctx1
+\c %assign %$external 1
+\c %push ctx2
+\c %assign %$internal 1
+\c mov eax, %$external
+\c mov eax, %$internal
+\c %pop
+\c %pop
+\c %endmacro
+
+As demonstrated, \c{%$external} is being defined in the \c{ctx1}
+context and referenced within the \c{ctx2} context. With context
+fall-through lookup, referencing an undefined context-local macro
+like this implicitly searches through all outer contexts until a match
+is made or isn't found in any context. As a result, \c{%$external}
+referenced within the \c{ctx2} context would implicitly use \c{%$external}
+as defined in \c{ctx1}. Most people would expect NASM to issue an error in
+this situation because \c{%$external} was never defined within \c{ctx2} and also
+isn't qualified with the proper context depth, \c{%$$external}.
+
+Here is a revision of the above example with proper context depth:
+
+\c %macro ctxthru 0
+\c %push ctx1
+\c %assign %$external 1
+\c %push ctx2
+\c %assign %$internal 1
+\c mov eax, %$$external
+\c mov eax, %$internal
+\c %pop
+\c %pop
+\c %endmacro
+
+As demonstrated, \c{%$external} is still being defined in the \c{ctx1}
+context and referenced within the \c{ctx2} context. However, the
+reference to \c{%$external} within \c{ctx2} has been fully qualified with
+the proper context depth, \c{%$$external}, and thus is no longer ambiguous,
+unintuitive or erroneous.
+
+
+\S{ctxrepl} \i\c{%repl}: \I{renaming contexts}Renaming a Context
+
+If you need to change the name of the top context on the stack (in
+order, for example, to have it respond differently to \c{%ifctx}),
+you can execute a \c{%pop} followed by a \c{%push}; but this will
+have the side effect of destroying all context-local labels and
+macros associated with the context that was just popped.
+
+NASM provides the directive \c{%repl}, which \e{replaces} a context
+with a different name, without touching the associated macros and
+labels. So you could replace the destructive code
+
+\c %pop
+\c %push newname
+
+with the non-destructive version \c{%repl newname}.
+
+
+\S{blockif} Example Use of the \i{Context Stack}: \i{Block IFs}
+
+This example makes use of almost all the context-stack features,
+including the conditional-assembly construct \i\c{%ifctx}, to
+implement a block IF statement as a set of macros.
+
+\c %macro if 1
+\c
+\c %push if
+\c j%-1 %$ifnot
+\c
+\c %endmacro
+\c
+\c %macro else 0
+\c
+\c %ifctx if
+\c %repl else
+\c jmp %$ifend
+\c %$ifnot:
+\c %else
+\c %error "expected `if' before `else'"
+\c %endif
+\c
+\c %endmacro
+\c
+\c %macro endif 0
+\c
+\c %ifctx if
+\c %$ifnot:
+\c %pop
+\c %elifctx else
+\c %$ifend:
+\c %pop
+\c %else
+\c %error "expected `if' or `else' before `endif'"
+\c %endif
+\c
+\c %endmacro
+
+This code is more robust than the \c{REPEAT} and \c{UNTIL} macros
+given in \k{ctxlocal}, because it uses conditional assembly to check
+that the macros are issued in the right order (for example, not
+calling \c{endif} before \c{if}) and issues a \c{%error} if they're
+not.
+
+In addition, the \c{endif} macro has to be able to cope with the two
+distinct cases of either directly following an \c{if}, or following
+an \c{else}. It achieves this, again, by using conditional assembly
+to do different things depending on whether the context on top of
+the stack is \c{if} or \c{else}.
+
+The \c{else} macro has to preserve the context on the stack, in
+order to have the \c{%$ifnot} referred to by the \c{if} macro be the
+same as the one defined by the \c{endif} macro, but has to change
+the context's name so that \c{endif} will know there was an
+intervening \c{else}. It does this by the use of \c{%repl}.
+
+A sample usage of these macros might look like:
+
+\c cmp ax,bx
+\c
+\c if ae
+\c cmp bx,cx
+\c
+\c if ae
+\c mov ax,cx
+\c else
+\c mov ax,bx
+\c endif
+\c
+\c else
+\c cmp ax,cx
+\c
+\c if ae
+\c mov ax,cx
+\c endif
+\c
+\c endif
+
+The block-\c{IF} macros handle nesting quite happily, by means of
+pushing another context, describing the inner \c{if}, on top of the
+one describing the outer \c{if}; thus \c{else} and \c{endif} always
+refer to the last unmatched \c{if} or \c{else}.
+
+
+\H{stackrel} \i{Stack Relative Preprocessor Directives}
+
+The following preprocessor directives provide a way to use
+labels to refer to local variables allocated on the stack.
+
+\b\c{%arg} (see \k{arg})
+
+\b\c{%stacksize} (see \k{stacksize})
+
+\b\c{%local} (see \k{local})
+
+
+\S{arg} \i\c{%arg} Directive
+
+The \c{%arg} directive is used to simplify the handling of
+parameters passed on the stack. Stack based parameter passing
+is used by many high level languages, including C, C++ and Pascal.
+
+While NASM has macros which attempt to duplicate this
+functionality (see \k{16cmacro}), the syntax is not particularly
+convenient to use and is not TASM compatible. Here is an example
+which shows the use of \c{%arg} without any external macros:
+
+\c some_function:
+\c
+\c %push mycontext ; save the current context
+\c %stacksize large ; tell NASM to use bp
+\c %arg i:word, j_ptr:word
+\c
+\c mov ax,[i]
+\c mov bx,[j_ptr]
+\c add ax,[bx]
+\c ret
+\c
+\c %pop ; restore original context
+
+This is similar to the procedure defined in \k{16cmacro} and adds
+the value in i to the value pointed to by j_ptr and returns the
+sum in the ax register. See \k{pushpop} for an explanation of
+\c{push} and \c{pop} and the use of context stacks.
+
+
+\S{stacksize} \i\c{%stacksize} Directive
+
+The \c{%stacksize} directive is used in conjunction with the
+\c{%arg} (see \k{arg}) and the \c{%local} (see \k{local}) directives.
+It tells NASM the default size to use for subsequent \c{%arg} and
+\c{%local} directives. The \c{%stacksize} directive takes one
+required argument which is one of \c{flat}, \c{flat64}, \c{large} or \c{small}.
+
+\c %stacksize flat
+
+This form causes NASM to use stack-based parameter addressing
+relative to \c{ebp} and it assumes that a near form of call was used
+to get to this label (i.e. that \c{eip} is on the stack).
+
+\c %stacksize flat64
+
+This form causes NASM to use stack-based parameter addressing
+relative to \c{rbp} and it assumes that a near form of call was used
+to get to this label (i.e. that \c{rip} is on the stack).
+
+\c %stacksize large
+
+This form uses \c{bp} to do stack-based parameter addressing and
+assumes that a far form of call was used to get to this address
+(i.e. that \c{ip} and \c{cs} are on the stack).
+
+\c %stacksize small
+
+This form also uses \c{bp} to address stack parameters, but it is
+different from \c{large} because it also assumes that the old value
+of bp is pushed onto the stack (i.e. it expects an \c{ENTER}
+instruction). In other words, it expects that \c{bp}, \c{ip} and
+\c{cs} are on the top of the stack, underneath any local space which
+may have been allocated by \c{ENTER}. This form is probably most
+useful when used in combination with the \c{%local} directive
+(see \k{local}).
+
+
+\S{local} \i\c{%local} Directive
+
+The \c{%local} directive is used to simplify the use of local
+temporary stack variables allocated in a stack frame. Automatic
+local variables in C are an example of this kind of variable. The
+\c{%local} directive is most useful when used with the \c{%stacksize}
+(see \k{stacksize} and is also compatible with the \c{%arg} directive
+(see \k{arg}). It allows simplified reference to variables on the
+stack which have been allocated typically by using the \c{ENTER}
+instruction.
+\# (see \k{insENTER} for a description of that instruction).
+An example of its use is the following:
+
+\c silly_swap:
+\c
+\c %push mycontext ; save the current context
+\c %stacksize small ; tell NASM to use bp
+\c %assign %$localsize 0 ; see text for explanation
+\c %local old_ax:word, old_dx:word
+\c
+\c enter %$localsize,0 ; see text for explanation
+\c mov [old_ax],ax ; swap ax & bx
+\c mov [old_dx],dx ; and swap dx & cx
+\c mov ax,bx
+\c mov dx,cx
+\c mov bx,[old_ax]
+\c mov cx,[old_dx]
+\c leave ; restore old bp
+\c ret ;
+\c
+\c %pop ; restore original context
+
+The \c{%$localsize} variable is used internally by the
+\c{%local} directive and \e{must} be defined within the
+current context before the \c{%local} directive may be used.
+Failure to do so will result in one expression syntax error for
+each \c{%local} variable declared. It then may be used in
+the construction of an appropriately sized ENTER instruction
+as shown in the example.
+
+
+\H{pperror} Reporting \i{User-Defined Errors}: \i\c{%error}, \i\c{%warning}, \i\c{%fatal}
+
+The preprocessor directive \c{%error} will cause NASM to report an
+error if it occurs in assembled code. So if other users are going to
+try to assemble your source files, you can ensure that they define the
+right macros by means of code like this:
+
+\c %ifdef F1
+\c ; do some setup
+\c %elifdef F2
+\c ; do some different setup
+\c %else
+\c %error "Neither F1 nor F2 was defined."
+\c %endif
+
+Then any user who fails to understand the way your code is supposed
+to be assembled will be quickly warned of their mistake, rather than
+having to wait until the program crashes on being run and then not
+knowing what went wrong.
+
+Similarly, \c{%warning} issues a warning, but allows assembly to continue:
+
+\c %ifdef F1
+\c ; do some setup
+\c %elifdef F2
+\c ; do some different setup
+\c %else
+\c %warning "Neither F1 nor F2 was defined, assuming F1."
+\c %define F1
+\c %endif
+
+\c{%error} and \c{%warning} are issued only on the final assembly
+pass. This makes them safe to use in conjunction with tests that
+depend on symbol values.
+
+\c{%fatal} terminates assembly immediately, regardless of pass. This
+is useful when there is no point in continuing the assembly further,
+and doing so is likely just going to cause a spew of confusing error
+messages.
+
+It is optional for the message string after \c{%error}, \c{%warning}
+or \c{%fatal} to be quoted. If it is \e{not}, then single-line macros
+are expanded in it, which can be used to display more information to
+the user. For example:
+
+\c %if foo > 64
+\c %assign foo_over foo-64
+\c %error foo is foo_over bytes too large
+\c %endif
+
+
+\H{otherpreproc} \i{Other Preprocessor Directives}
+
+NASM also has preprocessor directives which allow access to
+information from external sources. Currently they include:
+
+\b\c{%line} enables NASM to correctly handle the output of another
+preprocessor (see \k{line}).
+
+\b\c{%!} enables NASM to read in the value of an environment variable,
+which can then be used in your program (see \k{getenv}).
+
+\S{line} \i\c{%line} Directive
+
+The \c{%line} directive is used to notify NASM that the input line
+corresponds to a specific line number in another file. Typically
+this other file would be an original source file, with the current
+NASM input being the output of a pre-processor. The \c{%line}
+directive allows NASM to output messages which indicate the line
+number of the original source file, instead of the file that is being
+read by NASM.
+
+This preprocessor directive is not generally of use to programmers,
+by may be of interest to preprocessor authors. The usage of the
+\c{%line} preprocessor directive is as follows:
+
+\c %line nnn[+mmm] [filename]
+
+In this directive, \c{nnn} identifies the line of the original source
+file which this line corresponds to. \c{mmm} is an optional parameter
+which specifies a line increment value; each line of the input file
+read in is considered to correspond to \c{mmm} lines of the original
+source file. Finally, \c{filename} is an optional parameter which
+specifies the file name of the original source file.
+
+After reading a \c{%line} preprocessor directive, NASM will report
+all file name and line numbers relative to the values specified
+therein.
+
+
+\S{getenv} \i\c{%!}\e{variable}: Read an Environment Variable.
+
+The \c{%!}\e{variable} directive makes it possible to read the value of an
+environment variable at assembly time. This could, for example, be used
+to store the contents of an environment variable into a string, which
+could be used at some other point in your code.
+
+For example, suppose that you have an environment variable \c{FOO},
+and you want the contents of \c{FOO} to be embedded in your program as
+a quoted string. You could do that as follows:
+
+\c %defstr FOO %!FOO
+
+See \k{defstr} for notes on the \c{%defstr} directive.
+
+If the name of the environment variable contains non-identifier
+characters, you can use string quotes to surround the name of the
+variable, for example:
+
+\c %defstr C_colon %!'C:'
+
+
+\H{stdmac} \i{Standard Macros}
+
+NASM defines a set of standard macros, which are already defined
+when it starts to process any source file. If you really need a
+program to be assembled with no pre-defined macros, you can use the
+\i\c{%clear} directive to empty the preprocessor of everything but
+context-local preprocessor variables and single-line macros.
+
+Most \i{user-level assembler directives} (see \k{directive}) are
+implemented as macros which invoke primitive directives; these are
+described in \k{directive}. The rest of the standard macro set is
+described here.
+
+
+\S{stdmacver} \i{NASM Version} Macros
+
+The single-line macros \i\c{__NASM_MAJOR__}, \i\c{__NASM_MINOR__},
+\i\c{__NASM_SUBMINOR__} and \i\c{___NASM_PATCHLEVEL__} expand to the
+major, minor, subminor and patch level parts of the \i{version
+number of NASM} being used. So, under NASM 0.98.32p1 for
+example, \c{__NASM_MAJOR__} would be defined to be 0, \c{__NASM_MINOR__}
+would be defined as 98, \c{__NASM_SUBMINOR__} would be defined to 32,
+and \c{___NASM_PATCHLEVEL__} would be defined as 1.
+
+Additionally, the macro \i\c{__NASM_SNAPSHOT__} is defined for
+automatically generated snapshot releases \e{only}.
+
+
+\S{stdmacverid} \i\c{__NASM_VERSION_ID__}: \i{NASM Version ID}
+
+The single-line macro \c{__NASM_VERSION_ID__} expands to a dword integer
+representing the full version number of the version of nasm being used.
+The value is the equivalent to \c{__NASM_MAJOR__}, \c{__NASM_MINOR__},
+\c{__NASM_SUBMINOR__} and \c{___NASM_PATCHLEVEL__} concatenated to
+produce a single doubleword. Hence, for 0.98.32p1, the returned number
+would be equivalent to:
+
+\c dd 0x00622001
+
+or
+
+\c db 1,32,98,0
+
+Note that the above lines are generate exactly the same code, the second
+line is used just to give an indication of the order that the separate
+values will be present in memory.
+
+
+\S{stdmacverstr} \i\c{__NASM_VER__}: \i{NASM Version string}
+
+The single-line macro \c{__NASM_VER__} expands to a string which defines
+the version number of nasm being used. So, under NASM 0.98.32 for example,
+
+\c db __NASM_VER__
+
+would expand to
+
+\c db "0.98.32"
+
+
+\S{fileline} \i\c{__FILE__} and \i\c{__LINE__}: File Name and Line Number
+
+Like the C preprocessor, NASM allows the user to find out the file
+name and line number containing the current instruction. The macro
+\c{__FILE__} expands to a string constant giving the name of the
+current input file (which may change through the course of assembly
+if \c{%include} directives are used), and \c{__LINE__} expands to a
+numeric constant giving the current line number in the input file.
+
+These macros could be used, for example, to communicate debugging
+information to a macro, since invoking \c{__LINE__} inside a macro
+definition (either single-line or multi-line) will return the line
+number of the macro \e{call}, rather than \e{definition}. So to
+determine where in a piece of code a crash is occurring, for
+example, one could write a routine \c{stillhere}, which is passed a
+line number in \c{EAX} and outputs something like `line 155: still
+here'. You could then write a macro
+
+\c %macro notdeadyet 0
+\c
+\c push eax
+\c mov eax,__LINE__
+\c call stillhere
+\c pop eax
+\c
+\c %endmacro
+
+and then pepper your code with calls to \c{notdeadyet} until you
+find the crash point.
+
+
+\S{bitsm} \i\c{__BITS__}: Current BITS Mode
+
+The \c{__BITS__} standard macro is updated every time that the BITS mode is
+set using the \c{BITS XX} or \c{[BITS XX]} directive, where XX is a valid mode
+number of 16, 32 or 64. \c{__BITS__} receives the specified mode number and
+makes it globally available. This can be very useful for those who utilize
+mode-dependent macros.
+
+\S{ofmtm} \i\c{__OUTPUT_FORMAT__}: Current Output Format
+
+The \c{__OUTPUT_FORMAT__} standard macro holds the current Output Format,
+as given by the \c{-f} option or NASM's default. Type \c{nasm -hf} for a
+list.
+
+\c %ifidn __OUTPUT_FORMAT__, win32
+\c %define NEWLINE 13, 10
+\c %elifidn __OUTPUT_FORMAT__, elf32
+\c %define NEWLINE 10
+\c %endif
+
+
+\S{datetime} Assembly Date and Time Macros
+
+NASM provides a variety of macros that represent the timestamp of the
+assembly session.
+
+\b The \i\c{__DATE__} and \i\c{__TIME__} macros give the assembly date and
+time as strings, in ISO 8601 format (\c{"YYYY-MM-DD"} and \c{"HH:MM:SS"},
+respectively.)
+
+\b The \i\c{__DATE_NUM__} and \i\c{__TIME_NUM__} macros give the assembly
+date and time in numeric form; in the format \c{YYYYMMDD} and
+\c{HHMMSS} respectively.
+
+\b The \i\c{__UTC_DATE__} and \i\c{__UTC_TIME__} macros give the assembly
+date and time in universal time (UTC) as strings, in ISO 8601 format
+(\c{"YYYY-MM-DD"} and \c{"HH:MM:SS"}, respectively.) If the host
+platform doesn't provide UTC time, these macros are undefined.
+
+\b The \i\c{__UTC_DATE_NUM__} and \i\c{__UTC_TIME_NUM__} macros give the
+assembly date and time universal time (UTC) in numeric form; in the
+format \c{YYYYMMDD} and \c{HHMMSS} respectively. If the
+host platform doesn't provide UTC time, these macros are
+undefined.
+
+\b The \c{__POSIX_TIME__} macro is defined as a number containing the
+number of seconds since the POSIX epoch, 1 January 1970 00:00:00 UTC;
+excluding any leap seconds. This is computed using UTC time if
+available on the host platform, otherwise it is computed using the
+local time as if it was UTC.
+
+All instances of time and date macros in the same assembly session
+produce consistent output. For example, in an assembly session
+started at 42 seconds after midnight on January 1, 2010 in Moscow
+(timezone UTC+3) these macros would have the following values,
+assuming, of course, a properly configured environment with a correct
+clock:
+
+\c __DATE__ "2010-01-01"
+\c __TIME__ "00:00:42"
+\c __DATE_NUM__ 20100101
+\c __TIME_NUM__ 000042
+\c __UTC_DATE__ "2009-12-31"
+\c __UTC_TIME__ "21:00:42"
+\c __UTC_DATE_NUM__ 20091231
+\c __UTC_TIME_NUM__ 210042
+\c __POSIX_TIME__ 1262293242
+
+
+\S{use_def} \I\c{__USE_*__}\c{__USE_}\e{package}\c{__}: Package
+Include Test
+
+When a standard macro package (see \k{macropkg}) is included with the
+\c{%use} directive (see \k{use}), a single-line macro of the form
+\c{__USE_}\e{package}\c{__} is automatically defined. This allows
+testing if a particular package is invoked or not.
+
+For example, if the \c{altreg} package is included (see
+\k{pkg_altreg}), then the macro \c{__USE_ALTREG__} is defined.
+
+
+\S{pass_macro} \i\c{__PASS__}: Assembly Pass
+
+The macro \c{__PASS__} is defined to be \c{1} on preparatory passes,
+and \c{2} on the final pass. In preprocess-only mode, it is set to
+\c{3}, and when running only to generate dependencies (due to the
+\c{-M} or \c{-MG} option, see \k{opt-M}) it is set to \c{0}.
+
+\e{Avoid using this macro if at all possible. It is tremendously easy
+to generate very strange errors by misusing it, and the semantics may
+change in future versions of NASM.}
+
+
+\S{struc} \i\c{STRUC} and \i\c{ENDSTRUC}: \i{Declaring Structure} Data Types
+
+The core of NASM contains no intrinsic means of defining data
+structures; instead, the preprocessor is sufficiently powerful that
+data structures can be implemented as a set of macros. The macros
+\c{STRUC} and \c{ENDSTRUC} are used to define a structure data type.
+
+\c{STRUC} takes one or two parameters. The first parameter is the name
+of the data type. The second, optional parameter is the base offset of
+the structure. The name of the data type is defined as a symbol with
+the value of the base offset, and the name of the data type with the
+suffix \c{_size} appended to it is defined as an \c{EQU} giving the
+size of the structure. Once \c{STRUC} has been issued, you are
+defining the structure, and should define fields using the \c{RESB}
+family of pseudo-instructions, and then invoke \c{ENDSTRUC} to finish
+the definition.
+
+For example, to define a structure called \c{mytype} containing a
+longword, a word, a byte and a string of bytes, you might code
+
+\c struc mytype
+\c
+\c mt_long: resd 1
+\c mt_word: resw 1
+\c mt_byte: resb 1
+\c mt_str: resb 32
+\c
+\c endstruc
+
+The above code defines six symbols: \c{mt_long} as 0 (the offset
+from the beginning of a \c{mytype} structure to the longword field),
+\c{mt_word} as 4, \c{mt_byte} as 6, \c{mt_str} as 7, \c{mytype_size}
+as 39, and \c{mytype} itself as zero.
+
+The reason why the structure type name is defined at zero by default
+is a side effect of allowing structures to work with the local label
+mechanism: if your structure members tend to have the same names in
+more than one structure, you can define the above structure like this:
+
+\c struc mytype
+\c
+\c .long: resd 1
+\c .word: resw 1
+\c .byte: resb 1
+\c .str: resb 32
+\c
+\c endstruc
+
+This defines the offsets to the structure fields as \c{mytype.long},
+\c{mytype.word}, \c{mytype.byte} and \c{mytype.str}.
+
+NASM, since it has no \e{intrinsic} structure support, does not
+support any form of period notation to refer to the elements of a
+structure once you have one (except the above local-label notation),
+so code such as \c{mov ax,[mystruc.mt_word]} is not valid.
+\c{mt_word} is a constant just like any other constant, so the
+correct syntax is \c{mov ax,[mystruc+mt_word]} or \c{mov
+ax,[mystruc+mytype.word]}.
+
+Sometimes you only have the address of the structure displaced by an
+offset. For example, consider this standard stack frame setup:
+
+\c push ebp
+\c mov ebp, esp
+\c sub esp, 40
+
+In this case, you could access an element by subtracting the offset:
+
+\c mov [ebp - 40 + mytype.word], ax
+
+However, if you do not want to repeat this offset, you can use -40 as
+a base offset:
+
+\c struc mytype, -40
+
+And access an element this way:
+
+\c mov [ebp + mytype.word], ax
+
+
+\S{istruc} \i\c{ISTRUC}, \i\c{AT} and \i\c{IEND}: Declaring
+\i{Instances of Structures}
+
+Having defined a structure type, the next thing you typically want
+to do is to declare instances of that structure in your data
+segment. NASM provides an easy way to do this in the \c{ISTRUC}
+mechanism. To declare a structure of type \c{mytype} in a program,
+you code something like this:
+
+\c mystruc:
+\c istruc mytype
+\c
+\c at mt_long, dd 123456
+\c at mt_word, dw 1024
+\c at mt_byte, db 'x'
+\c at mt_str, db 'hello, world', 13, 10, 0
+\c
+\c iend
+
+The function of the \c{AT} macro is to make use of the \c{TIMES}
+prefix to advance the assembly position to the correct point for the
+specified structure field, and then to declare the specified data.
+Therefore the structure fields must be declared in the same order as
+they were specified in the structure definition.
+
+If the data to go in a structure field requires more than one source
+line to specify, the remaining source lines can easily come after
+the \c{AT} line. For example:
+
+\c at mt_str, db 123,134,145,156,167,178,189
+\c db 190,100,0
+
+Depending on personal taste, you can also omit the code part of the
+\c{AT} line completely, and start the structure field on the next
+line:
+
+\c at mt_str
+\c db 'hello, world'
+\c db 13,10,0
+
+
+\S{align} \i\c{ALIGN} and \i\c{ALIGNB}: Data Alignment
+
+The \c{ALIGN} and \c{ALIGNB} macros provides a convenient way to
+align code or data on a word, longword, paragraph or other boundary.
+(Some assemblers call this directive \i\c{EVEN}.) The syntax of the
+\c{ALIGN} and \c{ALIGNB} macros is
+
+\c align 4 ; align on 4-byte boundary
+\c align 16 ; align on 16-byte boundary
+\c align 8,db 0 ; pad with 0s rather than NOPs
+\c align 4,resb 1 ; align to 4 in the BSS
+\c alignb 4 ; equivalent to previous line
+
+Both macros require their first argument to be a power of two; they
+both compute the number of additional bytes required to bring the
+length of the current section up to a multiple of that power of two,
+and then apply the \c{TIMES} prefix to their second argument to
+perform the alignment.
+
+If the second argument is not specified, the default for \c{ALIGN}
+is \c{NOP}, and the default for \c{ALIGNB} is \c{RESB 1}. So if the
+second argument is specified, the two macros are equivalent.
+Normally, you can just use \c{ALIGN} in code and data sections and
+\c{ALIGNB} in BSS sections, and never need the second argument
+except for special purposes.
+
+\c{ALIGN} and \c{ALIGNB}, being simple macros, perform no error
+checking: they cannot warn you if their first argument fails to be a
+power of two, or if their second argument generates more than one
+byte of code. In each of these cases they will silently do the wrong
+thing.
+
+\c{ALIGNB} (or \c{ALIGN} with a second argument of \c{RESB 1}) can
+be used within structure definitions:
+
+\c struc mytype2
+\c
+\c mt_byte:
+\c resb 1
+\c alignb 2
+\c mt_word:
+\c resw 1
+\c alignb 4
+\c mt_long:
+\c resd 1
+\c mt_str:
+\c resb 32
+\c
+\c endstruc
+
+This will ensure that the structure members are sensibly aligned
+relative to the base of the structure.
+
+A final caveat: \c{ALIGN} and \c{ALIGNB} work relative to the
+beginning of the \e{section}, not the beginning of the address space
+in the final executable. Aligning to a 16-byte boundary when the
+section you're in is only guaranteed to be aligned to a 4-byte
+boundary, for example, is a waste of effort. Again, NASM does not
+check that the section's alignment characteristics are sensible for
+the use of \c{ALIGN} or \c{ALIGNB}.
+
+Both \c{ALIGN} and \c{ALIGNB} do call \c{SECTALIGN} macro implicitly.
+See \k{sectalign} for details.
+
+See also the \c{smartalign} standard macro package, \k{pkg_smartalign}.
+
+
+\S{sectalign} \i\c{SECTALIGN}: Section Alignment
+
+The \c{SECTALIGN} macros provides a way to modify alignment attribute
+of output file section. Unlike the \c{align=} attribute (which is allowed
+at section definition only) the \c{SECTALIGN} macro may be used at any time.
+
+For example the directive
+
+\c SECTALIGN 16
+
+sets the section alignment requirements to 16 bytes. Once increased it can
+not be decreased, the magnitude may grow only.
+
+Note that \c{ALIGN} (see \k{align}) calls the \c{SECTALIGN} macro implicitly
+so the active section alignment requirements may be updated. This is by default
+behaviour, if for some reason you want the \c{ALIGN} do not call \c{SECTALIGN}
+at all use the directive
+
+\c SECTALIGN OFF
+
+It is still possible to turn in on again by
+
+\c SECTALIGN ON
+
+
+\C{macropkg} \i{Standard Macro Packages}
+
+The \i\c{%use} directive (see \k{use}) includes one of the standard
+macro packages included with the NASM distribution and compiled into
+the NASM binary. It operates like the \c{%include} directive (see
+\k{include}), but the included contents is provided by NASM itself.
+
+The names of standard macro packages are case insensitive, and can be
+quoted or not.
+
+
+\H{pkg_altreg} \i\c{altreg}: \i{Alternate Register Names}
+
+The \c{altreg} standard macro package provides alternate register
+names. It provides numeric register names for all registers (not just
+\c{R8}-\c{R15}), the Intel-defined aliases \c{R8L}-\c{R15L} for the
+low bytes of register (as opposed to the NASM/AMD standard names
+\c{R8B}-\c{R15B}), and the names \c{R0H}-\c{R3H} (by analogy with
+\c{R0L}-\c{R3L}) for \c{AH}, \c{CH}, \c{DH}, and \c{BH}.
+
+Example use:
+
+\c %use altreg
+\c
+\c proc:
+\c mov r0l,r3h ; mov al,bh
+\c ret
+
+See also \k{reg64}.
+
+
+\H{pkg_smartalign} \i\c{smartalign}\I{align, smart}: Smart \c{ALIGN} Macro
+
+The \c{smartalign} standard macro package provides for an \i\c{ALIGN}
+macro which is more powerful than the default (and
+backwards-compatible) one (see \k{align}). When the \c{smartalign}
+package is enabled, when \c{ALIGN} is used without a second argument,
+NASM will generate a sequence of instructions more efficient than a
+series of \c{NOP}. Furthermore, if the padding exceeds a specific
+threshold, then NASM will generate a jump over the entire padding
+sequence.
+
+The specific instructions generated can be controlled with the
+new \i\c{ALIGNMODE} macro. This macro takes two parameters: one mode,
+and an optional jump threshold override. If (for any reason) you need
+to turn off the jump completely just set jump threshold value to -1
+(or set it to \c{nojmp}). The following modes are possible:
+
+\b \c{generic}: Works on all x86 CPUs and should have reasonable
+performance. The default jump threshold is 8. This is the
+default.
+
+\b \c{nop}: Pad out with \c{NOP} instructions. The only difference
+compared to the standard \c{ALIGN} macro is that NASM can still jump
+over a large padding area. The default jump threshold is 16.
+
+\b \c{k7}: Optimize for the AMD K7 (Athlon/Althon XP). These
+instructions should still work on all x86 CPUs. The default jump
+threshold is 16.
+
+\b \c{k8}: Optimize for the AMD K8 (Opteron/Althon 64). These
+instructions should still work on all x86 CPUs. The default jump
+threshold is 16.
+
+\b \c{p6}: Optimize for Intel CPUs. This uses the long \c{NOP}
+instructions first introduced in Pentium Pro. This is incompatible
+with all CPUs of family 5 or lower, as well as some VIA CPUs and
+several virtualization solutions. The default jump threshold is 16.
+
+The macro \i\c{__ALIGNMODE__} is defined to contain the current
+alignment mode. A number of other macros beginning with \c{__ALIGN_}
+are used internally by this macro package.
+
+
+\H{pkg_fp} \i\c\{fp}: Floating-point macros
+
+This packages contains the following floating-point convenience macros:
+
+\c %define Inf __Infinity__
+\c %define NaN __QNaN__
+\c %define QNaN __QNaN__
+\c %define SNaN __SNaN__
+\c
+\c %define float8(x) __float8__(x)
+\c %define float16(x) __float16__(x)
+\c %define float32(x) __float32__(x)
+\c %define float64(x) __float64__(x)
+\c %define float80m(x) __float80m__(x)
+\c %define float80e(x) __float80e__(x)
+\c %define float128l(x) __float128l__(x)
+\c %define float128h(x) __float128h__(x)
+
+
+\H{pkg_ifunc} \i\c{ifunc}: \i{Integer functions}
+
+This package contains a set of macros which implement integer
+functions. These are actually implemented as special operators, but
+are most conveniently accessed via this macro package.
+
+The macros provided are:
+
+\S{ilog2} \i{Integer logarithms}
+
+These functions calculate the integer logarithm base 2 of their
+argument, considered as an unsigned integer. The only differences
+between the functions is their respective behavior if the argument
+provided is not a power of two.
+
+The function \i\c{ilog2e()} (alias \i\c{ilog2()}) generates an error if
+the argument is not a power of two.
+
+The function \i\c{ilog2f()} rounds the argument down to the nearest
+power of two; if the argument is zero it returns zero.
+
+The function \i\c{ilog2c()} rounds the argument up to the nearest
+power of two.
+
+The functions \i\c{ilog2fw()} (alias \i\c{ilog2w()}) and
+\i\c{ilog2cw()} generate a warning if the argument is not a power of
+two, but otherwise behaves like \c{ilog2f()} and \c{ilog2c()},
+respectively.
+
+
+\C{directive} \i{Assembler Directives}
+
+NASM, though it attempts to avoid the bureaucracy of assemblers like
+MASM and TASM, is nevertheless forced to support a \e{few}
+directives. These are described in this chapter.
+
+NASM's directives come in two types: \I{user-level
+directives}\e{user-level} directives and \I{primitive
+directives}\e{primitive} directives. Typically, each directive has a
+user-level form and a primitive form. In almost all cases, we
+recommend that users use the user-level forms of the directives,
+which are implemented as macros which call the primitive forms.
+
+Primitive directives are enclosed in square brackets; user-level
+directives are not.
+
+In addition to the universal directives described in this chapter,
+each object file format can optionally supply extra directives in
+order to control particular features of that file format. These
+\I{format-specific directives}\e{format-specific} directives are
+documented along with the formats that implement them, in \k{outfmt}.
+
+
+\H{bits} \i\c{BITS}: Specifying Target \i{Processor Mode}
+
+The \c{BITS} directive specifies whether NASM should generate code
+\I{16-bit mode, versus 32-bit mode}designed to run on a processor
+operating in 16-bit mode, 32-bit mode or 64-bit mode. The syntax is
+\c{BITS XX}, where XX is 16, 32 or 64.
+
+In most cases, you should not need to use \c{BITS} explicitly. The
+\c{aout}, \c{coff}, \c{elf}, \c{macho}, \c{win32} and \c{win64}
+object formats, which are designed for use in 32-bit or 64-bit
+operating systems, all cause NASM to select 32-bit or 64-bit mode,
+respectively, by default. The \c{obj} object format allows you
+to specify each segment you define as either \c{USE16} or \c{USE32},
+and NASM will set its operating mode accordingly, so the use of the
+\c{BITS} directive is once again unnecessary.
+
+The most likely reason for using the \c{BITS} directive is to write
+32-bit or 64-bit code in a flat binary file; this is because the \c{bin}
+output format defaults to 16-bit mode in anticipation of it being
+used most frequently to write DOS \c{.COM} programs, DOS \c{.SYS}
+device drivers and boot loader software.
+
+The \c{BITS} directive can also be used to generate code for a
+different mode than the standard one for the output format.
+
+You do \e{not} need to specify \c{BITS 32} merely in order to use
+32-bit instructions in a 16-bit DOS program; if you do, the
+assembler will generate incorrect code because it will be writing
+code targeted at a 32-bit platform, to be run on a 16-bit one.
+
+When NASM is in \c{BITS 16} mode, instructions which use 32-bit
+data are prefixed with an 0x66 byte, and those referring to 32-bit
+addresses have an 0x67 prefix. In \c{BITS 32} mode, the reverse is
+true: 32-bit instructions require no prefixes, whereas instructions
+using 16-bit data need an 0x66 and those working on 16-bit addresses
+need an 0x67.
+
+When NASM is in \c{BITS 64} mode, most instructions operate the same
+as they do for \c{BITS 32} mode. However, there are 8 more general and
+SSE registers, and 16-bit addressing is no longer supported.
+
+The default address size is 64 bits; 32-bit addressing can be selected
+with the 0x67 prefix. The default operand size is still 32 bits,
+however, and the 0x66 prefix selects 16-bit operand size. The \c{REX}
+prefix is used both to select 64-bit operand size, and to access the
+new registers. NASM automatically inserts REX prefixes when
+necessary.
+
+When the \c{REX} prefix is used, the processor does not know how to
+address the AH, BH, CH or DH (high 8-bit legacy) registers. Instead,
+it is possible to access the the low 8-bits of the SP, BP SI and DI
+registers as SPL, BPL, SIL and DIL, respectively; but only when the
+REX prefix is used.
+
+The \c{BITS} directive has an exactly equivalent primitive form,
+\c{[BITS 16]}, \c{[BITS 32]} and \c{[BITS 64]}. The user-level form is
+a macro which has no function other than to call the primitive form.
+
+Note that the space is neccessary, e.g. \c{BITS32} will \e{not} work!
+
+\S{USE16 & USE32} \i\c{USE16} & \i\c{USE32}: Aliases for BITS
+
+The `\c{USE16}' and `\c{USE32}' directives can be used in place of
+`\c{BITS 16}' and `\c{BITS 32}', for compatibility with other assemblers.
+
+
+\H{default} \i\c{DEFAULT}: Change the assembler defaults
+
+The \c{DEFAULT} directive changes the assembler defaults. Normally,
+NASM defaults to a mode where the programmer is expected to explicitly
+specify most features directly. However, this is occasionally
+obnoxious, as the explicit form is pretty much the only one one wishes
+to use.
+
+Currently, \c{DEFAULT} can set \c{REL} & \c{ABS} and \c{BND} & \c{NOBND}.
+
+\S{REL & ABS} \i\c{REL} & \i\c{ABS}: RIP-relative addressing
+
+This sets whether registerless instructions in 64-bit mode are \c{RIP}-relative
+or not. By default, they are absolute unless overridden with the \i\c{REL}
+specifier (see \k{effaddr}). However, if \c{DEFAULT REL} is
+specified, \c{REL} is default, unless overridden with the \c{ABS}
+specifier, \e{except when used with an FS or GS segment override}.
+
+The special handling of \c{FS} and \c{GS} overrides are due to the
+fact that these registers are generally used as thread pointers or
+other special functions in 64-bit mode, and generating
+\c{RIP}-relative addresses would be extremely confusing.
+
+\c{DEFAULT REL} is disabled with \c{DEFAULT ABS}.
+
+\S{BND & NOBND} \i\c{BND} & \i\c{NOBND}: \c{BND} prefix
+
+If \c{DEFAULT BND} is set, all bnd-prefix available instructions following
+this directive are prefixed with bnd. To override it, \c{NOBND} prefix can
+be used.
+
+\c DEFAULT BND
+\c call foo ; BND will be prefixed
+\c nobnd call foo ; BND will NOT be prefixed
+
+\c{DEFAULT NOBND} can disable \c{DEFAULT BND} and then \c{BND} prefix will be
+added only when explicitly specified in code.
+
+\c{DEFAULT BND} is expected to be the normal configuration for writing
+MPX-enabled code.
+
+\H{section} \i\c{SECTION} or \i\c{SEGMENT}: Changing and \i{Defining
+Sections}
+
+\I{changing sections}\I{switching between sections}The \c{SECTION}
+directive (\c{SEGMENT} is an exactly equivalent synonym) changes
+which section of the output file the code you write will be
+assembled into. In some object file formats, the number and names of
+sections are fixed; in others, the user may make up as many as they
+wish. Hence \c{SECTION} may sometimes give an error message, or may
+define a new section, if you try to switch to a section that does
+not (yet) exist.
+
+The Unix object formats, and the \c{bin} object format (but see
+\k{multisec}), all support
+the \i{standardized section names} \c{.text}, \c{.data} and \c{.bss}
+for the code, data and uninitialized-data sections. The \c{obj}
+format, by contrast, does not recognize these section names as being
+special, and indeed will strip off the leading period of any section
+name that has one.
+
+
+\S{sectmac} The \i\c{__SECT__} Macro
+
+The \c{SECTION} directive is unusual in that its user-level form
+functions differently from its primitive form. The primitive form,
+\c{[SECTION xyz]}, simply switches the current target section to the
+one given. The user-level form, \c{SECTION xyz}, however, first
+defines the single-line macro \c{__SECT__} to be the primitive
+\c{[SECTION]} directive which it is about to issue, and then issues
+it. So the user-level directive
+
+\c SECTION .text
+
+expands to the two lines
+
+\c %define __SECT__ [SECTION .text]
+\c [SECTION .text]
+
+Users may find it useful to make use of this in their own macros.
+For example, the \c{writefile} macro defined in \k{mlmacgre} can be
+usefully rewritten in the following more sophisticated form:
+
+\c %macro writefile 2+
+\c
+\c [section .data]
+\c
+\c %%str: db %2
+\c %%endstr:
+\c
+\c __SECT__
+\c
+\c mov dx,%%str
+\c mov cx,%%endstr-%%str
+\c mov bx,%1
+\c mov ah,0x40
+\c int 0x21
+\c
+\c %endmacro
+
+This form of the macro, once passed a string to output, first
+switches temporarily to the data section of the file, using the
+primitive form of the \c{SECTION} directive so as not to modify
+\c{__SECT__}. It then declares its string in the data section, and
+then invokes \c{__SECT__} to switch back to \e{whichever} section
+the user was previously working in. It thus avoids the need, in the
+previous version of the macro, to include a \c{JMP} instruction to
+jump over the data, and also does not fail if, in a complicated
+\c{OBJ} format module, the user could potentially be assembling the
+code in any of several separate code sections.
+
+
+\H{absolute} \i\c{ABSOLUTE}: Defining Absolute Labels
+
+The \c{ABSOLUTE} directive can be thought of as an alternative form
+of \c{SECTION}: it causes the subsequent code to be directed at no
+physical section, but at the hypothetical section starting at the
+given absolute address. The only instructions you can use in this
+mode are the \c{RESB} family.
+
+\c{ABSOLUTE} is used as follows:
+
+\c absolute 0x1A
+\c
+\c kbuf_chr resw 1
+\c kbuf_free resw 1
+\c kbuf resw 16
+
+This example describes a section of the PC BIOS data area, at
+segment address 0x40: the above code defines \c{kbuf_chr} to be
+0x1A, \c{kbuf_free} to be 0x1C, and \c{kbuf} to be 0x1E.
+
+The user-level form of \c{ABSOLUTE}, like that of \c{SECTION},
+redefines the \i\c{__SECT__} macro when it is invoked.
+
+\i\c{STRUC} and \i\c{ENDSTRUC} are defined as macros which use
+\c{ABSOLUTE} (and also \c{__SECT__}).
+
+\c{ABSOLUTE} doesn't have to take an absolute constant as an
+argument: it can take an expression (actually, a \i{critical
+expression}: see \k{crit}) and it can be a value in a segment. For
+example, a TSR can re-use its setup code as run-time BSS like this:
+
+\c org 100h ; it's a .COM program
+\c
+\c jmp setup ; setup code comes last
+\c
+\c ; the resident part of the TSR goes here
+\c setup:
+\c ; now write the code that installs the TSR here
+\c
+\c absolute setup
+\c
+\c runtimevar1 resw 1
+\c runtimevar2 resd 20
+\c
+\c tsr_end:
+
+This defines some variables `on top of' the setup code, so that
+after the setup has finished running, the space it took up can be
+re-used as data storage for the running TSR. The symbol `tsr_end'
+can be used to calculate the total size of the part of the TSR that
+needs to be made resident.
+
+
+\H{extern} \i\c{EXTERN}: \i{Importing Symbols} from Other Modules
+
+\c{EXTERN} is similar to the MASM directive \c{EXTRN} and the C
+keyword \c{extern}: it is used to declare a symbol which is not
+defined anywhere in the module being assembled, but is assumed to be
+defined in some other module and needs to be referred to by this
+one. Not every object-file format can support external variables:
+the \c{bin} format cannot.
+
+The \c{EXTERN} directive takes as many arguments as you like. Each
+argument is the name of a symbol:
+
+\c extern _printf
+\c extern _sscanf,_fscanf
+
+Some object-file formats provide extra features to the \c{EXTERN}
+directive. In all cases, the extra features are used by suffixing a
+colon to the symbol name followed by object-format specific text.
+For example, the \c{obj} format allows you to declare that the
+default segment base of an external should be the group \c{dgroup}
+by means of the directive
+
+\c extern _variable:wrt dgroup
+
+The primitive form of \c{EXTERN} differs from the user-level form
+only in that it can take only one argument at a time: the support
+for multiple arguments is implemented at the preprocessor level.
+
+You can declare the same variable as \c{EXTERN} more than once: NASM
+will quietly ignore the second and later redeclarations.
+
+If a variable is declared both \c{GLOBAL} and \c{EXTERN}, or if it is
+declared as \c{EXTERN} and then defined, it will be treated as
+\c{GLOBAL}. If a variable is declared both as \c{COMMON} and
+\c{EXTERN}, it will be treated as \c{COMMON}.
+
+
+\H{global} \i\c{GLOBAL}: \i{Exporting Symbols} to Other Modules
+
+\c{GLOBAL} is the other end of \c{EXTERN}: if one module declares a
+symbol as \c{EXTERN} and refers to it, then in order to prevent
+linker errors, some other module must actually \e{define} the
+symbol and declare it as \c{GLOBAL}. Some assemblers use the name
+\i\c{PUBLIC} for this purpose.
+
+\c{GLOBAL} uses the same syntax as \c{EXTERN}, except that it must
+refer to symbols which \e{are} defined in the same module as the
+\c{GLOBAL} directive. For example:
+
+\c global _main
+\c _main:
+\c ; some code
+
+\c{GLOBAL}, like \c{EXTERN}, allows object formats to define private
+extensions by means of a colon. The \c{elf} object format, for
+example, lets you specify whether global data items are functions or
+data:
+
+\c global hashlookup:function, hashtable:data
+
+Like \c{EXTERN}, the primitive form of \c{GLOBAL} differs from the
+user-level form only in that it can take only one argument at a
+time.
+
+
+\H{common} \i\c{COMMON}: Defining Common Data Areas
+
+The \c{COMMON} directive is used to declare \i\e{common variables}.
+A common variable is much like a global variable declared in the
+uninitialized data section, so that
+
+\c common intvar 4
+
+is similar in function to
+
+\c global intvar
+\c section .bss
+\c
+\c intvar resd 1
+
+The difference is that if more than one module defines the same
+common variable, then at link time those variables will be
+\e{merged}, and references to \c{intvar} in all modules will point
+at the same piece of memory.
+
+Like \c{GLOBAL} and \c{EXTERN}, \c{COMMON} supports object-format
+specific extensions. For example, the \c{obj} format allows common
+variables to be NEAR or FAR, and the \c{elf} format allows you to
+specify the alignment requirements of a common variable:
+
+\c common commvar 4:near ; works in OBJ
+\c common intarray 100:4 ; works in ELF: 4 byte aligned
+
+Once again, like \c{EXTERN} and \c{GLOBAL}, the primitive form of
+\c{COMMON} differs from the user-level form only in that it can take
+only one argument at a time.
+
+\H{static} \i\c{STATIC}: Local Symbols within Modules
+
+Opposite to \c{EXTERN} and \c{GLOBAL}, \c{STATIC} is local symbol, but
+should be named according to the global mangling rules (named by
+analogy with the C keyword \c{static} as applied to functions or
+global variables).
+
+\c static foo
+\c foo:
+\c ; codes
+
+Unlike \c{GLOBAL}, \c{STATIC} does not allow object formats to accept
+private extensions mentioned in \k{global}.
+
+\H{mangling} \i\c{(G|L)PREFIX}, \i\c{(G|L)POSTFIX}: Mangling Symbols
+
+\c{PREFIX}, \c{GPREFIX}, \c{LPREFIX}, \c{POSTFIX}, \c{GPOSTFIX}, and
+\c{LPOSTFIX} directives can prepend or append the given argument to
+a certain type of symbols. The directive should be as a preprocess
+statement. Each usage is:
+
+\b\c{PREFIX}|\c{GPREFIX}: Prepend the argument to all \c{EXTERN}
+\c{COMMON}, \c{STATIC}, and \c{GLOBAL} symbols
+
+\b\c{LPREFIX}: Prepend the argument to all other symbols
+such as Local Labels, and backend defined symbols
+
+\b\c{POSTFIX}|\c{GPOSTFIX}: Append the argument to all \c{EXTERN}
+\c{COMMON}, \c{STATIC}, and \c{GLOBAL} symbols
+
+\b\c{LPOSTFIX}: Append the argument to all other symbols
+such as Local Labels, and backend defined symbols
+
+This is a macro implemented as a \c{%pragma}:
+
+\c %pragma macho lprefix L_
+
+Commandline option is also possible. See also \k{opt-pfix}.
+
+
+\H{gen-namespace} \i\c{OUTPUT}, \i\c{DEBUG}: Generic Namespaces
+
+\c{OUTPUT} and \c{DEBUG} are generic \c{%pragma} namespaces that are
+supposed to redirect to the current output and debug formats.
+For example, when mangling local symbols via the generic namespace:
+
+\c %pragma output gprefix _
+
+This is useful when the directive is needed to be output format
+agnostic.
+
+The example is also euquivalent to this, when the output format is \c{elf}:
+
+\c %pragma elf gprefix _
+
+
+\H{CPU} \i\c{CPU}: Defining CPU Dependencies
+
+The \i\c{CPU} directive restricts assembly to those instructions which
+are available on the specified CPU.
+
+Options are:
+
+\b\c{CPU 8086} Assemble only 8086 instruction set
+
+\b\c{CPU 186} Assemble instructions up to the 80186 instruction set
+
+\b\c{CPU 286} Assemble instructions up to the 286 instruction set
+
+\b\c{CPU 386} Assemble instructions up to the 386 instruction set
+
+\b\c{CPU 486} 486 instruction set
+
+\b\c{CPU 586} Pentium instruction set
+
+\b\c{CPU PENTIUM} Same as 586
+
+\b\c{CPU 686} P6 instruction set
+
+\b\c{CPU PPRO} Same as 686
+
+\b\c{CPU P2} Same as 686
+
+\b\c{CPU P3} Pentium III (Katmai) instruction sets
+
+\b\c{CPU KATMAI} Same as P3
+
+\b\c{CPU P4} Pentium 4 (Willamette) instruction set
+
+\b\c{CPU WILLAMETTE} Same as P4
+
+\b\c{CPU PRESCOTT} Prescott instruction set
+
+\b\c{CPU X64} x86-64 (x64/AMD64/Intel 64) instruction set
+
+\b\c{CPU IA64} IA64 CPU (in x86 mode) instruction set
+
+All options are case insensitive. All instructions will be selected
+only if they apply to the selected CPU or lower. By default, all
+instructions are available.
+
+
+\H{FLOAT} \i\c{FLOAT}: Handling of \I{floating-point, constants}floating-point constants
+
+By default, floating-point constants are rounded to nearest, and IEEE
+denormals are supported. The following options can be set to alter
+this behaviour:
+
+\b\c{FLOAT DAZ} Flush denormals to zero
+
+\b\c{FLOAT NODAZ} Do not flush denormals to zero (default)
+
+\b\c{FLOAT NEAR} Round to nearest (default)
+
+\b\c{FLOAT UP} Round up (toward +Infinity)
+
+\b\c{FLOAT DOWN} Round down (toward -Infinity)
+
+\b\c{FLOAT ZERO} Round toward zero
+
+\b\c{FLOAT DEFAULT} Restore default settings
+
+The standard macros \i\c{__FLOAT_DAZ__}, \i\c{__FLOAT_ROUND__}, and
+\i\c{__FLOAT__} contain the current state, as long as the programmer
+has avoided the use of the brackeded primitive form, (\c{[FLOAT]}).
+
+\c{__FLOAT__} contains the full set of floating-point settings; this
+value can be saved away and invoked later to restore the setting.
+
+
+\H{asmdir-warning} \i\c{[WARNING]}: Enable or disable warnings
+
+The \c{[WARNING]} directive can be used to enable or disable classes
+of warnings in the same way as the \c{-w} option, see \k{opt-w} for
+more details about warning classes.
+
+\b \c{[warning +}\e{warning-class}\c{]} enables warnings for
+ \e{warning-class}.
+
+\b \c{[warning -}\e{warning-class}\c{]} disables warnings for
+ \e{warning-class}.
+
+\b \c{[warning *}\e{warning-class}\c{]} restores \e{warning-class} to
+ the original value, either the default value or as specified on the
+ command line.
+
+The \c{[WARNING]} directive also accepts the \c{all}, \c{error} and
+\c{error=}\e{warning-class} specifiers.
+
+No "user form" (without the brackets) currently exists.
+
+
+\C{outfmt} \i{Output Formats}
+
+NASM is a portable assembler, designed to be able to compile on any
+ANSI C-supporting platform and produce output to run on a variety of
+Intel x86 operating systems. For this reason, it has a large number
+of available output formats, selected using the \i\c{-f} option on
+the NASM \i{command line}. Each of these formats, along with its
+extensions to the base NASM syntax, is detailed in this chapter.
+
+As stated in \k{opt-o}, NASM chooses a \i{default name} for your
+output file based on the input file name and the chosen output
+format. This will be generated by removing the \i{extension}
+(\c{.asm}, \c{.s}, or whatever you like to use) from the input file
+name, and substituting an extension defined by the output format.
+The extensions are given with each format below.
+
+
+\H{binfmt} \i\c{bin}: \i{Flat-Form Binary}\I{pure binary} Output
+
+The \c{bin} format does not produce object files: it generates
+nothing in the output file except the code you wrote. Such `pure
+binary' files are used by \i{MS-DOS}: \i\c{.COM} executables and
+\i\c{.SYS} device drivers are pure binary files. Pure binary output
+is also useful for \i{operating system} and \i{boot loader}
+development.
+
+The \c{bin} format supports \i{multiple section names}. For details of
+how NASM handles sections in the \c{bin} format, see \k{multisec}.
+
+Using the \c{bin} format puts NASM by default into 16-bit mode (see
+\k{bits}). In order to use \c{bin} to write 32-bit or 64-bit code,
+such as an OS kernel, you need to explicitly issue the \I\c{BITS}\c{BITS 32}
+or \I\c{BITS}\c{BITS 64} directive.
+
+\c{bin} has no default output file name extension: instead, it
+leaves your file name as it is once the original extension has been
+removed. Thus, the default is for NASM to assemble \c{binprog.asm}
+into a binary file called \c{binprog}.
+
+
+\S{org} \i\c{ORG}: Binary File \i{Program Origin}
+
+The \c{bin} format provides an additional directive to the list
+given in \k{directive}: \c{ORG}. The function of the \c{ORG}
+directive is to specify the origin address which NASM will assume
+the program begins at when it is loaded into memory.
+
+For example, the following code will generate the longword
+\c{0x00000104}:
+
+\c org 0x100
+\c dd label
+\c label:
+
+Unlike the \c{ORG} directive provided by MASM-compatible assemblers,
+which allows you to jump around in the object file and overwrite
+code you have already generated, NASM's \c{ORG} does exactly what
+the directive says: \e{origin}. Its sole function is to specify one
+offset which is added to all internal address references within the
+section; it does not permit any of the trickery that MASM's version
+does. See \k{proborg} for further comments.
+
+
+\S{binseg} \c{bin} Extensions to the \c{SECTION}
+Directive\I{SECTION, bin extensions to}
+
+The \c{bin} output format extends the \c{SECTION} (or \c{SEGMENT})
+directive to allow you to specify the alignment requirements of
+segments. This is done by appending the \i\c{ALIGN} qualifier to the
+end of the section-definition line. For example,
+
+\c section .data align=16
+
+switches to the section \c{.data} and also specifies that it must be
+aligned on a 16-byte boundary.
+
+The parameter to \c{ALIGN} specifies how many low bits of the
+section start address must be forced to zero. The alignment value
+given may be any power of two.\I{section alignment, in
+bin}\I{segment alignment, in bin}\I{alignment, in bin sections}
+
+
+\S{multisec} \i{Multisection}\I{bin, multisection} Support for the \c{bin} Format
+
+The \c{bin} format allows the use of multiple sections, of arbitrary names,
+besides the "known" \c{.text}, \c{.data}, and \c{.bss} names.
+
+\b Sections may be designated \i\c{progbits} or \i\c{nobits}. Default
+is \c{progbits} (except \c{.bss}, which defaults to \c{nobits},
+of course).
+
+\b Sections can be aligned at a specified boundary following the previous
+section with \c{align=}, or at an arbitrary byte-granular position with
+\i\c{start=}.
+
+\b Sections can be given a virtual start address, which will be used
+for the calculation of all memory references within that section
+with \i\c{vstart=}.
+
+\b Sections can be ordered using \i\c{follows=}\c{<section>} or
+\i\c{vfollows=}\c{<section>} as an alternative to specifying an explicit
+start address.
+
+\b Arguments to \c{org}, \c{start}, \c{vstart}, and \c{align=} are
+critical expressions. See \k{crit}. E.g. \c{align=(1 << ALIGN_SHIFT)}
+- \c{ALIGN_SHIFT} must be defined before it is used here.
+
+\b Any code which comes before an explicit \c{SECTION} directive
+is directed by default into the \c{.text} section.
+
+\b If an \c{ORG} statement is not given, \c{ORG 0} is used
+by default.
+
+\b The \c{.bss} section will be placed after the last \c{progbits}
+section, unless \c{start=}, \c{vstart=}, \c{follows=}, or \c{vfollows=}
+has been specified.
+
+\b All sections are aligned on dword boundaries, unless a different
+alignment has been specified.
+
+\b Sections may not overlap.
+
+\b NASM creates the \c{section.<secname>.start} for each section,
+which may be used in your code.
+
+\S{map}\i{Map Files}
+
+Map files can be generated in \c{-f bin} format by means of the \c{[map]}
+option. Map types of \c{all} (default), \c{brief}, \c{sections}, \c{segments},
+or \c{symbols} may be specified. Output may be directed to \c{stdout}
+(default), \c{stderr}, or a specified file. E.g.
+\c{[map symbols myfile.map]}. No "user form" exists, the square
+brackets must be used.
+
+
+\H{ithfmt} \i\c{ith}: \i{Intel Hex} Output
+
+The \c{ith} file format produces Intel hex-format files. Just as the
+\c{bin} format, this is a flat memory image format with no support for
+relocation or linking. It is usually used with ROM programmers and
+similar utilities.
+
+All extensions supported by the \c{bin} file format is also supported by
+the \c{ith} file format.
+
+\c{ith} provides a default output file-name extension of \c{.ith}.
+
+
+\H{srecfmt} \i\c{srec}: \i{Motorola S-Records} Output
+
+The \c{srec} file format produces Motorola S-records files. Just as the
+\c{bin} format, this is a flat memory image format with no support for
+relocation or linking. It is usually used with ROM programmers and
+similar utilities.
+
+All extensions supported by the \c{bin} file format is also supported by
+the \c{srec} file format.
+
+\c{srec} provides a default output file-name extension of \c{.srec}.
+
+
+\H{objfmt} \i\c{obj}: \i{Microsoft OMF}\I{OMF} Object Files
+
+The \c{obj} file format (NASM calls it \c{obj} rather than \c{omf}
+for historical reasons) is the one produced by \i{MASM} and
+\i{TASM}, which is typically fed to 16-bit DOS linkers to produce
+\i\c{.EXE} files. It is also the format used by \i{OS/2}.
+
+\c{obj} provides a default output file-name extension of \c{.obj}.
+
+\c{obj} is not exclusively a 16-bit format, though: NASM has full
+support for the 32-bit extensions to the format. In particular,
+32-bit \c{obj} format files are used by \i{Borland's Win32
+compilers}, instead of using Microsoft's newer \i\c{win32} object
+file format.
+
+The \c{obj} format does not define any special segment names: you
+can call your segments anything you like. Typical names for segments
+in \c{obj} format files are \c{CODE}, \c{DATA} and \c{BSS}.
+
+If your source file contains code before specifying an explicit
+\c{SEGMENT} directive, then NASM will invent its own segment called
+\i\c{__NASMDEFSEG} for you.
+
+When you define a segment in an \c{obj} file, NASM defines the
+segment name as a symbol as well, so that you can access the segment
+address of the segment. So, for example:
+
+\c segment data
+\c
+\c dvar: dw 1234
+\c
+\c segment code
+\c
+\c function:
+\c mov ax,data ; get segment address of data
+\c mov ds,ax ; and move it into DS
+\c inc word [dvar] ; now this reference will work
+\c ret
+
+The \c{obj} format also enables the use of the \i\c{SEG} and
+\i\c{WRT} operators, so that you can write code which does things
+like
+
+\c extern foo
+\c
+\c mov ax,seg foo ; get preferred segment of foo
+\c mov ds,ax
+\c mov ax,data ; a different segment
+\c mov es,ax
+\c mov ax,[ds:foo] ; this accesses `foo'
+\c mov [es:foo wrt data],bx ; so does this
+
+
+\S{objseg} \c{obj} Extensions to the \c{SEGMENT}
+Directive\I{SEGMENT, obj extensions to}
+
+The \c{obj} output format extends the \c{SEGMENT} (or \c{SECTION})
+directive to allow you to specify various properties of the segment
+you are defining. This is done by appending extra qualifiers to the
+end of the segment-definition line. For example,
+
+\c segment code private align=16
+
+defines the segment \c{code}, but also declares it to be a private
+segment, and requires that the portion of it described in this code
+module must be aligned on a 16-byte boundary.
+
+The available qualifiers are:
+
+\b \i\c{PRIVATE}, \i\c{PUBLIC}, \i\c{COMMON} and \i\c{STACK} specify
+the combination characteristics of the segment. \c{PRIVATE} segments
+do not get combined with any others by the linker; \c{PUBLIC} and
+\c{STACK} segments get concatenated together at link time; and
+\c{COMMON} segments all get overlaid on top of each other rather
+than stuck end-to-end.
+
+\b \i\c{ALIGN} is used, as shown above, to specify how many low bits
+of the segment start address must be forced to zero. The alignment
+value given may be any power of two from 1 to 4096; in reality, the
+only values supported are 1, 2, 4, 16, 256 and 4096, so if 8 is
+specified it will be rounded up to 16, and 32, 64 and 128 will all
+be rounded up to 256, and so on. Note that alignment to 4096-byte
+boundaries is a \i{PharLap} extension to the format and may not be
+supported by all linkers.\I{section alignment, in OBJ}\I{segment
+alignment, in OBJ}\I{alignment, in OBJ sections}
+
+\b \i\c{CLASS} can be used to specify the segment class; this feature
+indicates to the linker that segments of the same class should be
+placed near each other in the output file. The class name can be any
+word, e.g. \c{CLASS=CODE}.
+
+\b \i\c{OVERLAY}, like \c{CLASS}, is specified with an arbitrary word
+as an argument, and provides overlay information to an
+overlay-capable linker.
+
+\b Segments can be declared as \i\c{USE16} or \i\c{USE32}, which has
+the effect of recording the choice in the object file and also
+ensuring that NASM's default assembly mode when assembling in that
+segment is 16-bit or 32-bit respectively.
+
+\b When writing \i{OS/2} object files, you should declare 32-bit
+segments as \i\c{FLAT}, which causes the default segment base for
+anything in the segment to be the special group \c{FLAT}, and also
+defines the group if it is not already defined.
+
+\b The \c{obj} file format also allows segments to be declared as
+having a pre-defined absolute segment address, although no linkers
+are currently known to make sensible use of this feature;
+nevertheless, NASM allows you to declare a segment such as
+\c{SEGMENT SCREEN ABSOLUTE=0xB800} if you need to. The \i\c{ABSOLUTE}
+and \c{ALIGN} keywords are mutually exclusive.
+
+NASM's default segment attributes are \c{PUBLIC}, \c{ALIGN=1}, no
+class, no overlay, and \c{USE16}.
+
+
+\S{group} \i\c{GROUP}: Defining Groups of Segments\I{segments, groups of}
+
+The \c{obj} format also allows segments to be grouped, so that a
+single segment register can be used to refer to all the segments in
+a group. NASM therefore supplies the \c{GROUP} directive, whereby
+you can code
+
+\c segment data
+\c
+\c ; some data
+\c
+\c segment bss
+\c
+\c ; some uninitialized data
+\c
+\c group dgroup data bss
+
+which will define a group called \c{dgroup} to contain the segments
+\c{data} and \c{bss}. Like \c{SEGMENT}, \c{GROUP} causes the group
+name to be defined as a symbol, so that you can refer to a variable
+\c{var} in the \c{data} segment as \c{var wrt data} or as \c{var wrt
+dgroup}, depending on which segment value is currently in your
+segment register.
+
+If you just refer to \c{var}, however, and \c{var} is declared in a
+segment which is part of a group, then NASM will default to giving
+you the offset of \c{var} from the beginning of the \e{group}, not
+the \e{segment}. Therefore \c{SEG var}, also, will return the group
+base rather than the segment base.
+
+NASM will allow a segment to be part of more than one group, but
+will generate a warning if you do this. Variables declared in a
+segment which is part of more than one group will default to being
+relative to the first group that was defined to contain the segment.
+
+A group does not have to contain any segments; you can still make
+\c{WRT} references to a group which does not contain the variable
+you are referring to. OS/2, for example, defines the special group
+\c{FLAT} with no segments in it.
+
+
+\S{uppercase} \i\c{UPPERCASE}: Disabling Case Sensitivity in Output
+
+Although NASM itself is \i{case sensitive}, some OMF linkers are
+not; therefore it can be useful for NASM to output single-case
+object files. The \c{UPPERCASE} format-specific directive causes all
+segment, group and symbol names that are written to the object file
+to be forced to upper case just before being written. Within a
+source file, NASM is still case-sensitive; but the object file can
+be written entirely in upper case if desired.
+
+\c{UPPERCASE} is used alone on a line; it requires no parameters.
+
+
+\S{import} \i\c{IMPORT}: Importing DLL Symbols\I{DLL symbols,
+importing}\I{symbols, importing from DLLs}
+
+The \c{IMPORT} format-specific directive defines a symbol to be
+imported from a DLL, for use if you are writing a DLL's \i{import
+library} in NASM. You still need to declare the symbol as \c{EXTERN}
+as well as using the \c{IMPORT} directive.
+
+The \c{IMPORT} directive takes two required parameters, separated by
+white space, which are (respectively) the name of the symbol you
+wish to import and the name of the library you wish to import it
+from. For example:
+
+\c import WSAStartup wsock32.dll
+
+A third optional parameter gives the name by which the symbol is
+known in the library you are importing it from, in case this is not
+the same as the name you wish the symbol to be known by to your code
+once you have imported it. For example:
+
+\c import asyncsel wsock32.dll WSAAsyncSelect
+
+
+\S{export} \i\c{EXPORT}: Exporting DLL Symbols\I{DLL symbols,
+exporting}\I{symbols, exporting from DLLs}
+
+The \c{EXPORT} format-specific directive defines a global symbol to
+be exported as a DLL symbol, for use if you are writing a DLL in
+NASM. You still need to declare the symbol as \c{GLOBAL} as well as
+using the \c{EXPORT} directive.
+
+\c{EXPORT} takes one required parameter, which is the name of the
+symbol you wish to export, as it was defined in your source file. An
+optional second parameter (separated by white space from the first)
+gives the \e{external} name of the symbol: the name by which you
+wish the symbol to be known to programs using the DLL. If this name
+is the same as the internal name, you may leave the second parameter
+off.
+
+Further parameters can be given to define attributes of the exported
+symbol. These parameters, like the second, are separated by white
+space. If further parameters are given, the external name must also
+be specified, even if it is the same as the internal name. The
+available attributes are:
+
+\b \c{resident} indicates that the exported name is to be kept
+resident by the system loader. This is an optimisation for
+frequently used symbols imported by name.
+
+\b \c{nodata} indicates that the exported symbol is a function which
+does not make use of any initialized data.
+
+\b \c{parm=NNN}, where \c{NNN} is an integer, sets the number of
+parameter words for the case in which the symbol is a call gate
+between 32-bit and 16-bit segments.
+
+\b An attribute which is just a number indicates that the symbol
+should be exported with an identifying number (ordinal), and gives
+the desired number.
+
+For example:
+
+\c export myfunc
+\c export myfunc TheRealMoreFormalLookingFunctionName
+\c export myfunc myfunc 1234 ; export by ordinal
+\c export myfunc myfunc resident parm=23 nodata
+
+
+\S{dotdotstart} \i\c{..start}: Defining the \i{Program Entry
+Point}
+
+\c{OMF} linkers require exactly one of the object files being linked to
+define the program entry point, where execution will begin when the
+program is run. If the object file that defines the entry point is
+assembled using NASM, you specify the entry point by declaring the
+special symbol \c{..start} at the point where you wish execution to
+begin.
+
+
+\S{objextern} \c{obj} Extensions to the \c{EXTERN}
+Directive\I{EXTERN, obj extensions to}
+
+If you declare an external symbol with the directive
+
+\c extern foo
+
+then references such as \c{mov ax,foo} will give you the offset of
+\c{foo} from its preferred segment base (as specified in whichever
+module \c{foo} is actually defined in). So to access the contents of
+\c{foo} you will usually need to do something like
+
+\c mov ax,seg foo ; get preferred segment base
+\c mov es,ax ; move it into ES
+\c mov ax,[es:foo] ; and use offset `foo' from it
+
+This is a little unwieldy, particularly if you know that an external
+is going to be accessible from a given segment or group, say
+\c{dgroup}. So if \c{DS} already contained \c{dgroup}, you could
+simply code
+
+\c mov ax,[foo wrt dgroup]
+
+However, having to type this every time you want to access \c{foo}
+can be a pain; so NASM allows you to declare \c{foo} in the
+alternative form
+
+\c extern foo:wrt dgroup
+
+This form causes NASM to pretend that the preferred segment base of
+\c{foo} is in fact \c{dgroup}; so the expression \c{seg foo} will
+now return \c{dgroup}, and the expression \c{foo} is equivalent to
+\c{foo wrt dgroup}.
+
+This \I{default-WRT mechanism}default-\c{WRT} mechanism can be used
+to make externals appear to be relative to any group or segment in
+your program. It can also be applied to common variables: see
+\k{objcommon}.
+
+
+\S{objcommon} \c{obj} Extensions to the \c{COMMON}
+Directive\I{COMMON, obj extensions to}
+
+The \c{obj} format allows common variables to be either near\I{near
+common variables} or far\I{far common variables}; NASM allows you to
+specify which your variables should be by the use of the syntax
+
+\c common nearvar 2:near ; `nearvar' is a near common
+\c common farvar 10:far ; and `farvar' is far
+
+Far common variables may be greater in size than 64Kb, and so the
+OMF specification says that they are declared as a number of
+\e{elements} of a given size. So a 10-byte far common variable could
+be declared as ten one-byte elements, five two-byte elements, two
+five-byte elements or one ten-byte element.
+
+Some \c{OMF} linkers require the \I{element size, in common
+variables}\I{common variables, element size}element size, as well as
+the variable size, to match when resolving common variables declared
+in more than one module. Therefore NASM must allow you to specify
+the element size on your far common variables. This is done by the
+following syntax:
+
+\c common c_5by2 10:far 5 ; two five-byte elements
+\c common c_2by5 10:far 2 ; five two-byte elements
+
+If no element size is specified, the default is 1. Also, the \c{FAR}
+keyword is not required when an element size is specified, since
+only far commons may have element sizes at all. So the above
+declarations could equivalently be
+
+\c common c_5by2 10:5 ; two five-byte elements
+\c common c_2by5 10:2 ; five two-byte elements
+
+In addition to these extensions, the \c{COMMON} directive in \c{obj}
+also supports default-\c{WRT} specification like \c{EXTERN} does
+(explained in \k{objextern}). So you can also declare things like
+
+\c common foo 10:wrt dgroup
+\c common bar 16:far 2:wrt data
+\c common baz 24:wrt data:6
+
+
+\S{objdepend} Embedded File Dependency Information
+
+Since NASM 2.13.02, \c{obj} files contain embedded dependency file
+information. To suppress the generation of dependencies, use
+
+\c %pragma obj nodepend
+
+
+\H{win32fmt} \i\c{win32}: Microsoft Win32 Object Files
+
+The \c{win32} output format generates Microsoft Win32 object files,
+suitable for passing to Microsoft linkers such as \i{Visual C++}.
+Note that Borland Win32 compilers do not use this format, but use
+\c{obj} instead (see \k{objfmt}).
+
+\c{win32} provides a default output file-name extension of \c{.obj}.
+
+Note that although Microsoft say that Win32 object files follow the
+\c{COFF} (Common Object File Format) standard, the object files produced
+by Microsoft Win32 compilers are not compatible with COFF linkers
+such as DJGPP's, and vice versa. This is due to a difference of
+opinion over the precise semantics of PC-relative relocations. To
+produce COFF files suitable for DJGPP, use NASM's \c{coff} output
+format; conversely, the \c{coff} format does not produce object
+files that Win32 linkers can generate correct output from.
+
+
+\S{win32sect} \c{win32} Extensions to the \c{SECTION}
+Directive\I{SECTION, win32 extensions to}
+
+Like the \c{obj} format, \c{win32} allows you to specify additional
+information on the \c{SECTION} directive line, to control the type
+and properties of sections you declare. Section types and properties
+are generated automatically by NASM for the \i{standard section names}
+\c{.text}, \c{.data} and \c{.bss}, but may still be overridden by
+these qualifiers.
+
+The available qualifiers are:
+
+\b \c{code}, or equivalently \c{text}, defines the section to be a
+code section. This marks the section as readable and executable, but
+not writable, and also indicates to the linker that the type of the
+section is code.
+
+\b \c{data} and \c{bss} define the section to be a data section,
+analogously to \c{code}. Data sections are marked as readable and
+writable, but not executable. \c{data} declares an initialized data
+section, whereas \c{bss} declares an uninitialized data section.
+
+\b \c{rdata} declares an initialized data section that is readable
+but not writable. Microsoft compilers use this section to place
+constants in it.
+
+\b \c{info} defines the section to be an \i{informational section},
+which is not included in the executable file by the linker, but may
+(for example) pass information \e{to} the linker. For example,
+declaring an \c{info}-type section called \i\c{.drectve} causes the
+linker to interpret the contents of the section as command-line
+options.
+
+\b \c{align=}, used with a trailing number as in \c{obj}, gives the
+\I{section alignment, in win32}\I{alignment, in win32
+sections}alignment requirements of the section. The maximum you may
+specify is 64: the Win32 object file format contains no means to
+request a greater section alignment than this. If alignment is not
+explicitly specified, the defaults are 16-byte alignment for code
+sections, 8-byte alignment for rdata sections and 4-byte alignment
+for data (and BSS) sections.
+Informational sections get a default alignment of 1 byte (no
+alignment), though the value does not matter.
+
+The defaults assumed by NASM if you do not specify the above
+qualifiers are:
+
+\c section .text code align=16
+\c section .data data align=4
+\c section .rdata rdata align=8
+\c section .bss bss align=4
+
+Any other section name is treated by default like \c{.text}.
+
+\S{win32safeseh} \c{win32}: Safe Structured Exception Handling
+
+Among other improvements in Windows XP SP2 and Windows Server 2003
+Microsoft has introduced concept of "safe structured exception
+handling." General idea is to collect handlers' entry points in
+designated read-only table and have alleged entry point verified
+against this table prior exception control is passed to the handler. In
+order for an executable module to be equipped with such "safe exception
+handler table," all object modules on linker command line has to comply
+with certain criteria. If one single module among them does not, then
+the table in question is omitted and above mentioned run-time checks
+will not be performed for application in question. Table omission is by
+default silent and therefore can be easily overlooked. One can instruct
+linker to refuse to produce binary without such table by passing
+\c{/safeseh} command line option.
+
+Without regard to this run-time check merits it's natural to expect
+NASM to be capable of generating modules suitable for \c{/safeseh}
+linking. From developer's viewpoint the problem is two-fold:
+
+\b how to adapt modules not deploying exception handlers of their own;
+
+\b how to adapt/develop modules utilizing custom exception handling;
+
+Former can be easily achieved with any NASM version by adding following
+line to source code:
+
+\c $@feat.00 equ 1
+
+As of version 2.03 NASM adds this absolute symbol automatically. If
+it's not already present to be precise. I.e. if for whatever reason
+developer would choose to assign another value in source file, it would
+still be perfectly possible.
+
+Registering custom exception handler on the other hand requires certain
+"magic." As of version 2.03 additional directive is implemented,
+\c{safeseh}, which instructs the assembler to produce appropriately
+formatted input data for above mentioned "safe exception handler
+table." Its typical use would be:
+
+\c section .text
+\c extern _MessageBoxA@16
+\c %if __NASM_VERSION_ID__ >= 0x02030000
+\c safeseh handler ; register handler as "safe handler"
+\c %endif
+\c handler:
+\c push DWORD 1 ; MB_OKCANCEL
+\c push DWORD caption
+\c push DWORD text
+\c push DWORD 0
+\c call _MessageBoxA@16
+\c sub eax,1 ; incidentally suits as return value
+\c ; for exception handler
+\c ret
+\c global _main
+\c _main:
+\c push DWORD handler
+\c push DWORD [fs:0]
+\c mov DWORD [fs:0],esp ; engage exception handler
+\c xor eax,eax
+\c mov eax,DWORD[eax] ; cause exception
+\c pop DWORD [fs:0] ; disengage exception handler
+\c add esp,4
+\c ret
+\c text: db 'OK to rethrow, CANCEL to generate core dump',0
+\c caption:db 'SEGV',0
+\c
+\c section .drectve info
+\c db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
+
+As you might imagine, it's perfectly possible to produce .exe binary
+with "safe exception handler table" and yet engage unregistered
+exception handler. Indeed, handler is engaged by simply manipulating
+\c{[fs:0]} location at run-time, something linker has no power over,
+run-time that is. It should be explicitly mentioned that such failure
+to register handler's entry point with \c{safeseh} directive has
+undesired side effect at run-time. If exception is raised and
+unregistered handler is to be executed, the application is abruptly
+terminated without any notification whatsoever. One can argue that
+system could at least have logged some kind "non-safe exception
+handler in x.exe at address n" message in event log, but no, literally
+no notification is provided and user is left with no clue on what
+caused application failure.
+
+Finally, all mentions of linker in this paragraph refer to Microsoft
+linker version 7.x and later. Presence of \c{@feat.00} symbol and input
+data for "safe exception handler table" causes no backward
+incompatibilities and "safeseh" modules generated by NASM 2.03 and
+later can still be linked by earlier versions or non-Microsoft linkers.
+
+\S{codeview} Debugging formats for Windows
+\I{Windows debugging formats}
+
+The \c{win32} and \c{win64} formats support the Microsoft CodeView
+debugging format. Currently CodeView version 8 format is supported
+(\i\c{cv8}), but newer versions of the CodeView debugger should be
+able to handle this format as well.
+
+
+\H{win64fmt} \i\c{win64}: Microsoft Win64 Object Files
+
+The \c{win64} output format generates Microsoft Win64 object files,
+which is nearly 100% identical to the \c{win32} object format (\k{win32fmt})
+with the exception that it is meant to target 64-bit code and the x86-64
+platform altogether. This object file is used exactly the same as the \c{win32}
+object format (\k{win32fmt}), in NASM, with regard to this exception.
+
+\S{win64pic} \c{win64}: Writing Position-Independent Code
+
+While \c{REL} takes good care of RIP-relative addressing, there is one
+aspect that is easy to overlook for a Win64 programmer: indirect
+references. Consider a switch dispatch table:
+
+\c jmp qword [dsptch+rax*8]
+\c ...
+\c dsptch: dq case0
+\c dq case1
+\c ...
+
+Even a novice Win64 assembler programmer will soon realize that the code
+is not 64-bit savvy. Most notably linker will refuse to link it with
+
+\c 'ADDR32' relocation to '.text' invalid without /LARGEADDRESSAWARE:NO
+
+So [s]he will have to split jmp instruction as following:
+
+\c lea rbx,[rel dsptch]
+\c jmp qword [rbx+rax*8]
+
+What happens behind the scene is that effective address in \c{lea} is
+encoded relative to instruction pointer, or in perfectly
+position-independent manner. But this is only part of the problem!
+Trouble is that in .dll context \c{caseN} relocations will make their
+way to the final module and might have to be adjusted at .dll load
+time. To be specific when it can't be loaded at preferred address. And
+when this occurs, pages with such relocations will be rendered private
+to current process, which kind of undermines the idea of sharing .dll.
+But no worry, it's trivial to fix:
+
+\c lea rbx,[rel dsptch]
+\c add rbx,[rbx+rax*8]
+\c jmp rbx
+\c ...
+\c dsptch: dq case0-dsptch
+\c dq case1-dsptch
+\c ...
+
+NASM version 2.03 and later provides another alternative, \c{wrt
+..imagebase} operator, which returns offset from base address of the
+current image, be it .exe or .dll module, therefore the name. For those
+acquainted with PE-COFF format base address denotes start of
+\c{IMAGE_DOS_HEADER} structure. Here is how to implement switch with
+these image-relative references:
+
+\c lea rbx,[rel dsptch]
+\c mov eax,[rbx+rax*4]
+\c sub rbx,dsptch wrt ..imagebase
+\c add rbx,rax
+\c jmp rbx
+\c ...
+\c dsptch: dd case0 wrt ..imagebase
+\c dd case1 wrt ..imagebase
+
+One can argue that the operator is redundant. Indeed, snippet before
+last works just fine with any NASM version and is not even Windows
+specific... The real reason for implementing \c{wrt ..imagebase} will
+become apparent in next paragraph.
+
+It should be noted that \c{wrt ..imagebase} is defined as 32-bit
+operand only:
+
+\c dd label wrt ..imagebase ; ok
+\c dq label wrt ..imagebase ; bad
+\c mov eax,label wrt ..imagebase ; ok
+\c mov rax,label wrt ..imagebase ; bad
+
+\S{win64seh} \c{win64}: Structured Exception Handling
+
+Structured exception handing in Win64 is completely different matter
+from Win32. Upon exception program counter value is noted, and
+linker-generated table comprising start and end addresses of all the
+functions [in given executable module] is traversed and compared to the
+saved program counter. Thus so called \c{UNWIND_INFO} structure is
+identified. If it's not found, then offending subroutine is assumed to
+be "leaf" and just mentioned lookup procedure is attempted for its
+caller. In Win64 leaf function is such function that does not call any
+other function \e{nor} modifies any Win64 non-volatile registers,
+including stack pointer. The latter ensures that it's possible to
+identify leaf function's caller by simply pulling the value from the
+top of the stack.
+
+While majority of subroutines written in assembler are not calling any
+other function, requirement for non-volatile registers' immutability
+leaves developer with not more than 7 registers and no stack frame,
+which is not necessarily what [s]he counted with. Customarily one would
+meet the requirement by saving non-volatile registers on stack and
+restoring them upon return, so what can go wrong? If [and only if] an
+exception is raised at run-time and no \c{UNWIND_INFO} structure is
+associated with such "leaf" function, the stack unwind procedure will
+expect to find caller's return address on the top of stack immediately
+followed by its frame. Given that developer pushed caller's
+non-volatile registers on stack, would the value on top point at some
+code segment or even addressable space? Well, developer can attempt
+copying caller's return address to the top of stack and this would
+actually work in some very specific circumstances. But unless developer
+can guarantee that these circumstances are always met, it's more
+appropriate to assume worst case scenario, i.e. stack unwind procedure
+going berserk. Relevant question is what happens then? Application is
+abruptly terminated without any notification whatsoever. Just like in
+Win32 case, one can argue that system could at least have logged
+"unwind procedure went berserk in x.exe at address n" in event log, but
+no, no trace of failure is left.
+
+Now, when we understand significance of the \c{UNWIND_INFO} structure,
+let's discuss what's in it and/or how it's processed. First of all it
+is checked for presence of reference to custom language-specific
+exception handler. If there is one, then it's invoked. Depending on the
+return value, execution flow is resumed (exception is said to be
+"handled"), \e{or} rest of \c{UNWIND_INFO} structure is processed as
+following. Beside optional reference to custom handler, it carries
+information about current callee's stack frame and where non-volatile
+registers are saved. Information is detailed enough to be able to
+reconstruct contents of caller's non-volatile registers upon call to
+current callee. And so caller's context is reconstructed, and then
+unwind procedure is repeated, i.e. another \c{UNWIND_INFO} structure is
+associated, this time, with caller's instruction pointer, which is then
+checked for presence of reference to language-specific handler, etc.
+The procedure is recursively repeated till exception is handled. As
+last resort system "handles" it by generating memory core dump and
+terminating the application.
+
+As for the moment of this writing NASM unfortunately does not
+facilitate generation of above mentioned detailed information about
+stack frame layout. But as of version 2.03 it implements building
+blocks for generating structures involved in stack unwinding. As
+simplest example, here is how to deploy custom exception handler for
+leaf function:
+
+\c default rel
+\c section .text
+\c extern MessageBoxA
+\c handler:
+\c sub rsp,40
+\c mov rcx,0
+\c lea rdx,[text]
+\c lea r8,[caption]
+\c mov r9,1 ; MB_OKCANCEL
+\c call MessageBoxA
+\c sub eax,1 ; incidentally suits as return value
+\c ; for exception handler
+\c add rsp,40
+\c ret
+\c global main
+\c main:
+\c xor rax,rax
+\c mov rax,QWORD[rax] ; cause exception
+\c ret
+\c main_end:
+\c text: db 'OK to rethrow, CANCEL to generate core dump',0
+\c caption:db 'SEGV',0
+\c
+\c section .pdata rdata align=4
+\c dd main wrt ..imagebase
+\c dd main_end wrt ..imagebase
+\c dd xmain wrt ..imagebase
+\c section .xdata rdata align=8
+\c xmain: db 9,0,0,0
+\c dd handler wrt ..imagebase
+\c section .drectve info
+\c db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
+
+What you see in \c{.pdata} section is element of the "table comprising
+start and end addresses of function" along with reference to associated
+\c{UNWIND_INFO} structure. And what you see in \c{.xdata} section is
+\c{UNWIND_INFO} structure describing function with no frame, but with
+designated exception handler. References are \e{required} to be
+image-relative (which is the real reason for implementing \c{wrt
+..imagebase} operator). It should be noted that \c{rdata align=n}, as
+well as \c{wrt ..imagebase}, are optional in these two segments'
+contexts, i.e. can be omitted. Latter means that \e{all} 32-bit
+references, not only above listed required ones, placed into these two
+segments turn out image-relative. Why is it important to understand?
+Developer is allowed to append handler-specific data to \c{UNWIND_INFO}
+structure, and if [s]he adds a 32-bit reference, then [s]he will have
+to remember to adjust its value to obtain the real pointer.
+
+As already mentioned, in Win64 terms leaf function is one that does not
+call any other function \e{nor} modifies any non-volatile register,
+including stack pointer. But it's not uncommon that assembler
+programmer plans to utilize every single register and sometimes even
+have variable stack frame. Is there anything one can do with bare
+building blocks? I.e. besides manually composing fully-fledged
+\c{UNWIND_INFO} structure, which would surely be considered
+error-prone? Yes, there is. Recall that exception handler is called
+first, before stack layout is analyzed. As it turned out, it's
+perfectly possible to manipulate current callee's context in custom
+handler in manner that permits further stack unwinding. General idea is
+that handler would not actually "handle" the exception, but instead
+restore callee's context, as it was at its entry point and thus mimic
+leaf function. In other words, handler would simply undertake part of
+unwinding procedure. Consider following example:
+
+\c function:
+\c mov rax,rsp ; copy rsp to volatile register
+\c push r15 ; save non-volatile registers
+\c push rbx
+\c push rbp
+\c mov r11,rsp ; prepare variable stack frame
+\c sub r11,rcx
+\c and r11,-64
+\c mov QWORD[r11],rax ; check for exceptions
+\c mov rsp,r11 ; allocate stack frame
+\c mov QWORD[rsp],rax ; save original rsp value
+\c magic_point:
+\c ...
+\c mov r11,QWORD[rsp] ; pull original rsp value
+\c mov rbp,QWORD[r11-24]
+\c mov rbx,QWORD[r11-16]
+\c mov r15,QWORD[r11-8]
+\c mov rsp,r11 ; destroy frame
+\c ret
+
+The keyword is that up to \c{magic_point} original \c{rsp} value
+remains in chosen volatile register and no non-volatile register,
+except for \c{rsp}, is modified. While past \c{magic_point} \c{rsp}
+remains constant till the very end of the \c{function}. In this case
+custom language-specific exception handler would look like this:
+
+\c EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
+\c CONTEXT *context,DISPATCHER_CONTEXT *disp)
+\c { ULONG64 *rsp;
+\c if (context->Rip<(ULONG64)magic_point)
+\c rsp = (ULONG64 *)context->Rax;
+\c else
+\c { rsp = ((ULONG64 **)context->Rsp)[0];
+\c context->Rbp = rsp[-3];
+\c context->Rbx = rsp[-2];
+\c context->R15 = rsp[-1];
+\c }
+\c context->Rsp = (ULONG64)rsp;
+\c
+\c memcpy (disp->ContextRecord,context,sizeof(CONTEXT));
+\c RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp->ImageBase,
+\c dips->ControlPc,disp->FunctionEntry,disp->ContextRecord,
+\c &disp->HandlerData,&disp->EstablisherFrame,NULL);
+\c return ExceptionContinueSearch;
+\c }
+
+As custom handler mimics leaf function, corresponding \c{UNWIND_INFO}
+structure does not have to contain any information about stack frame
+and its layout.
+
+\H{cofffmt} \i\c{coff}: \i{Common Object File Format}
+
+The \c{coff} output type produces \c{COFF} object files suitable for
+linking with the \i{DJGPP} linker.
+
+\c{coff} provides a default output file-name extension of \c{.o}.
+
+The \c{coff} format supports the same extensions to the \c{SECTION}
+directive as \c{win32} does, except that the \c{align} qualifier and
+the \c{info} section type are not supported.
+
+\H{machofmt} \I{Mach-O}\i\c{macho32} and \i\c{macho64}: \i{Mach Object File Format}
+
+The \c{macho32} and \c{macho64} output formts produces Mach-O
+object files suitable for linking with the \i{MacOS X} linker.
+\i\c{macho} is a synonym for \c{macho32}.
+
+\c{macho} provides a default output file-name extension of \c{.o}.
+
+\S{machosect} \c{macho} extensions to the \c{SECTION} Directive
+\I{SECTION, macho extensions to}
+
+The \c{macho} output format specifies section names in the format
+"\e{segment}\c{,}\e{section}". No spaces are allowed around the
+comma. The following flags can also be specified:
+
+\b \c{data} - this section contains initialized data items
+
+\b \c{code} - this section contains code exclusively
+
+\b \c{mixed} - this section contains both code and data
+
+\b \c{bss} - this section is uninitialized and filled with zero
+
+\b \c{zerofill} - same as \c{bss}
+
+\b \c{no_dead_strip} - inhibit dead code stripping for this section
+
+\b \c{live_support} - set the live support flag for this section
+
+\b \c{strip_static_syms} - strip static symbols for this section
+
+\b \c{debug} - this section contains debugging information
+
+\b \c{align=}\e{alignment} - specify section alignment
+
+The default is \c{data}, unless the section name is \c{__text} or
+\c{__bss} in which case the default is \c{text} or \c{bss},
+respectively.
+
+For compatibility with other Unix platforms, the following standard
+names are also supported:
+
+\c .text = __TEXT,__text text
+\c .rodata = __DATA,__const data
+\c .data = __DATA,__data data
+\c .bss = __DATA,__bss bss
+
+If the \c{.rodata} section contains no relocations, it is instead put
+into the \c{__TEXT,__const} section unless this section has already
+been specified explicitly. However, it is probably better to specify
+\c{__TEXT,__const} and \c{__DATA,__const} explicitly as appropriate.
+
+\S{machotls} \i{Thread Local Storage in Mach-O}\I{TLS}: \c{macho} special
+symbols and \i\c{WRT}
+
+Mach-O defines the following special symbols that can be used on the
+right-hand side of the \c{WRT} operator:
+
+\b \c{..tlvp} is used to specify access to thread-local storage.
+
+\b \c{..gotpcrel} is used to specify references to the Global Offset
+ Table. The GOT is supported in the \c{macho64} format only.
+
+\S{macho-ssvs} \c{macho} specfic directive \i\c{subsections_via_symbols}
+
+The directive \c{subsections_via_symbols} sets the
+\c{MH_SUBSECTIONS_VIA_SYMBOLS} flag in the Mach-O header, which tells
+the linker that the symbols in the file matches the conventions
+required to allow for link-time dead code elimination.
+
+This directive takes no arguments.
+
+This is a macro implemented as a \c{%pragma}. It can also be
+specified in its \c{%pragma} form, in which case it will not affect
+non-Mach-O builds of the same source code:
+
+\c %pragma macho subsections_via_symbols
+
+\S{macho-ssvs} \c{macho} specfic directive \i\c{no_dead_strip}
+
+The directive \c{no_dead_strip} sets the Mach-O \c{SH_NO_DEAD_STRIP}
+section flag on the section containing a a specific symbol. This
+directive takes a list of symbols as its arguments.
+
+This is a macro implemented as a \c{%pragma}. It can also be
+specified in its \c{%pragma} form, in which case it will not affect
+non-Mach-O builds of the same source code:
+
+\c %pragma macho no_dead_strip symbol...
+
+\S{macho-pext} \c{macho} specific extensions to the \c{GLOBAL}
+Directive: \i\c{private_extern}
+
+The directive extension to \c{GLOBAL} marks the symbol with limited
+global scope. For example, you can specify the global symbol with
+this extension:
+
+\c global foo:private_extern
+\c foo:
+\c ; codes
+
+Using with static linker will clear the private extern attribute.
+But linker option like \c{-keep_private_externs} can avoid it.
+
+\H{elffmt} \i\c{elf32}, \i\c{elf64}, \i\c{elfx32}: \I{ELF}\I{linux, elf}\i{Executable and Linkable
+Format} Object Files
+
+The \c{elf32}, \c{elf64} and \c{elfx32} output formats generate
+\c{ELF32 and ELF64} (Executable and Linkable Format) object files, as
+used by Linux as well as \i{Unix System V}, including \i{Solaris x86},
+\i{UnixWare} and \i{SCO Unix}. \c{elf} provides a default output
+file-name extension of \c{.o}. \c{elf} is a synonym for \c{elf32}.
+
+The \c{elfx32} format is used for the \i{x32} ABI, which is a 32-bit
+ABI with the CPU in 64-bit mode.
+
+\S{abisect} ELF specific directive \i\c{osabi}
+
+The ELF header specifies the application binary interface for the
+target operating system (OSABI). This field can be set by using the
+\c{osabi} directive with the numeric value (0-255) of the target
+system. If this directive is not used, the default value will be "UNIX
+System V ABI" (0) which will work on most systems which support ELF.
+
+\S{elfsect} \c{elf} extensions to the \c{SECTION} Directive
+\I{SECTION, elf extensions to}
+
+Like the \c{obj} format, \c{elf} allows you to specify additional
+information on the \c{SECTION} directive line, to control the type
+and properties of sections you declare. Section types and properties
+are generated automatically by NASM for the \i{standard section
+names}, but may still be
+overridden by these qualifiers.
+
+The available qualifiers are:
+
+\b \i\c{alloc} defines the section to be one which is loaded into
+memory when the program is run. \i\c{noalloc} defines it to be one
+which is not, such as an informational or comment section.
+
+\b \i\c{exec} defines the section to be one which should have execute
+permission when the program is run. \i\c{noexec} defines it as one
+which should not.
+
+\b \i\c{write} defines the section to be one which should be writable
+when the program is run. \i\c{nowrite} defines it as one which should
+not.
+
+\b \i\c{progbits} defines the section to be one with explicit contents
+stored in the object file: an ordinary code or data section, for
+example, \i\c{nobits} defines the section to be one with no explicit
+contents given, such as a BSS section.
+
+\b \c{align=}, used with a trailing number as in \c{obj}, gives the
+\I{section alignment, in elf}\I{alignment, in elf sections}alignment
+requirements of the section.
+
+\b \i\c{tls} defines the section to be one which contains
+thread local variables.
+
+The defaults assumed by NASM if you do not specify the above
+qualifiers are:
+
+\I\c{.text} \I\c{.rodata} \I\c{.lrodata} \I\c{.data} \I\c{.ldata}
+\I\c{.bss} \I\c{.lbss} \I\c{.tdata} \I\c{.tbss} \I\c\{.comment}
+
+\c section .text progbits alloc exec nowrite align=16
+\c section .rodata progbits alloc noexec nowrite align=4
+\c section .lrodata progbits alloc noexec nowrite align=4
+\c section .data progbits alloc noexec write align=4
+\c section .ldata progbits alloc noexec write align=4
+\c section .bss nobits alloc noexec write align=4
+\c section .lbss nobits alloc noexec write align=4
+\c section .tdata progbits alloc noexec write align=4 tls
+\c section .tbss nobits alloc noexec write align=4 tls
+\c section .comment progbits noalloc noexec nowrite align=1
+\c section other progbits alloc noexec nowrite align=1
+
+(Any section name other than those in the above table
+ is treated by default like \c{other} in the above table.
+ Please note that section names are case sensitive.)
+
+
+\S{elfwrt} \i{Position-Independent Code}\I{PIC}: \c{macho} Special
+Symbols and \i\c{WRT}
+
+Since \c{ELF} does not support segment-base references, the \c{WRT}
+operator is not used for its normal purpose; therefore NASM's
+\c{elf} output format makes use of \c{WRT} for a different purpose,
+namely the PIC-specific \I{relocations, PIC-specific}relocation
+types.
+
+\c{elf} defines five special symbols which you can use as the
+right-hand side of the \c{WRT} operator to obtain PIC relocation
+types. They are \i\c{..gotpc}, \i\c{..gotoff}, \i\c{..got},
+\i\c{..plt} and \i\c{..sym}. Their functions are summarized here:
+
+\b Referring to the symbol marking the global offset table base
+using \c{wrt ..gotpc} will end up giving the distance from the
+beginning of the current section to the global offset table.
+(\i\c{_GLOBAL_OFFSET_TABLE_} is the standard symbol name used to
+refer to the \i{GOT}.) So you would then need to add \i\c{$$} to the
+result to get the real address of the GOT.
+
+\b Referring to a location in one of your own sections using \c{wrt
+..gotoff} will give the distance from the beginning of the GOT to
+the specified location, so that adding on the address of the GOT
+would give the real address of the location you wanted.
+
+\b Referring to an external or global symbol using \c{wrt ..got}
+causes the linker to build an entry \e{in} the GOT containing the
+address of the symbol, and the reference gives the distance from the
+beginning of the GOT to the entry; so you can add on the address of
+the GOT, load from the resulting address, and end up with the
+address of the symbol.
+
+\b Referring to a procedure name using \c{wrt ..plt} causes the
+linker to build a \i{procedure linkage table} entry for the symbol,
+and the reference gives the address of the \i{PLT} entry. You can
+only use this in contexts which would generate a PC-relative
+relocation normally (i.e. as the destination for \c{CALL} or
+\c{JMP}), since ELF contains no relocation type to refer to PLT
+entries absolutely.
+
+\b Referring to a symbol name using \c{wrt ..sym} causes NASM to
+write an ordinary relocation, but instead of making the relocation
+relative to the start of the section and then adding on the offset
+to the symbol, it will write a relocation record aimed directly at
+the symbol in question. The distinction is a necessary one due to a
+peculiarity of the dynamic linker.
+
+A fuller explanation of how to use these relocation types to write
+shared libraries entirely in NASM is given in \k{picdll}.
+
+\S{elftls} \i{Thread Local Storage in ELF}\I{TLS}: \c{elf} Special
+Symbols and \i\c{WRT}
+
+\b In ELF32 mode, referring to an external or global symbol using
+\c{wrt ..tlsie} \I\c{..tlsie}
+causes the linker to build an entry \e{in} the GOT containing the
+offset of the symbol within the TLS block, so you can access the value
+of the symbol with code such as:
+
+\c mov eax,[tid wrt ..tlsie]
+\c mov [gs:eax],ebx
+
+
+\b In ELF64 or ELFx32 mode, referring to an external or global symbol using
+\c{wrt ..gottpoff} \I\c{..gottpoff}
+causes the linker to build an entry \e{in} the GOT containing the
+offset of the symbol within the TLS block, so you can access the value
+of the symbol with code such as:
+
+\c mov rax,[rel tid wrt ..gottpoff]
+\c mov rcx,[fs:rax]
+
+
+\S{elfglob} \c{elf} Extensions to the \c{GLOBAL} Directive\I{GLOBAL,
+elf extensions to}\I{GLOBAL, aoutb extensions to}
+
+\c{ELF} object files can contain more information about a global symbol
+than just its address: they can contain the \I{symbol sizes,
+specifying}\I{size, of symbols}size of the symbol and its \I{symbol
+types, specifying}\I{type, of symbols}type as well. These are not
+merely debugger conveniences, but are actually necessary when the
+program being written is a \i{shared library}. NASM therefore
+supports some extensions to the \c{GLOBAL} directive, allowing you
+to specify these features.
+
+You can specify whether a global variable is a function or a data
+object by suffixing the name with a colon and the word
+\i\c{function} or \i\c{data}. (\i\c{object} is a synonym for
+\c{data}.) For example:
+
+\c global hashlookup:function, hashtable:data
+
+exports the global symbol \c{hashlookup} as a function and
+\c{hashtable} as a data object.
+
+Optionally, you can control the ELF visibility of the symbol. Just
+add one of the visibility keywords: \i\c{default}, \i\c{internal},
+\i\c{hidden}, or \i\c{protected}. The default is \i\c{default} of
+course. For example, to make \c{hashlookup} hidden:
+
+\c global hashlookup:function hidden
+
+You can also specify the size of the data associated with the
+symbol, as a numeric expression (which may involve labels, and even
+forward references) after the type specifier. Like this:
+
+\c global hashtable:data (hashtable.end - hashtable)
+\c
+\c hashtable:
+\c db this,that,theother ; some data here
+\c .end:
+
+This makes NASM automatically calculate the length of the table and
+place that information into the \c{ELF} symbol table.
+
+Declaring the type and size of global symbols is necessary when
+writing shared library code. For more information, see
+\k{picglobal}.
+
+
+\S{elfcomm} \c{elf} Extensions to the \c{COMMON} Directive
+\I{COMMON, elf extensions to}
+
+\c{ELF} also allows you to specify alignment requirements \I{common
+variables, alignment in elf}\I{alignment, of elf common variables}on
+common variables. This is done by putting a number (which must be a
+power of two) after the name and size of the common variable,
+separated (as usual) by a colon. For example, an array of
+doublewords would benefit from 4-byte alignment:
+
+\c common dwordarray 128:4
+
+This declares the total size of the array to be 128 bytes, and
+requires that it be aligned on a 4-byte boundary.
+
+
+\S{elf16} 16-bit code and ELF
+\I{ELF, 16-bit code and}
+
+The \c{ELF32} specification doesn't provide relocations for 8- and
+16-bit values, but the GNU \c{ld} linker adds these as an extension.
+NASM can generate GNU-compatible relocations, to allow 16-bit code to
+be linked as ELF using GNU \c{ld}. If NASM is used with the
+\c{-w+gnu-elf-extensions} option, a warning is issued when one of
+these relocations is generated.
+
+\S{elfdbg} Debug formats and ELF
+\I{ELF, Debug formats and}
+
+ELF provides debug information in \c{STABS} and \c{DWARF} formats.
+Line number information is generated for all executable sections, but please
+note that only the ".text" section is executable by default.
+
+\H{aoutfmt} \i\c{aout}: Linux \I{a.out, Linux version}\I{linux, a.out}\c{a.out} Object Files
+
+The \c{aout} format generates \c{a.out} object files, in the form used
+by early Linux systems (current Linux systems use ELF, see
+\k{elffmt}.) These differ from other \c{a.out} object files in that
+the magic number in the first four bytes of the file is
+different; also, some implementations of \c{a.out}, for example
+NetBSD's, support position-independent code, which Linux's
+implementation does not.
+
+\c{a.out} provides a default output file-name extension of \c{.o}.
+
+\c{a.out} is a very simple object format. It supports no special
+directives, no special symbols, no use of \c{SEG} or \c{WRT}, and no
+extensions to any standard directives. It supports only the three
+\i{standard section names} \i\c{.text}, \i\c{.data} and \i\c{.bss}.
+
+
+\H{aoutfmt} \i\c{aoutb}: \i{NetBSD}/\i{FreeBSD}/\i{OpenBSD}
+\I{a.out, BSD version}\c{a.out} Object Files
+
+The \c{aoutb} format generates \c{a.out} object files, in the form
+used by the various free \c{BSD Unix} clones, \c{NetBSD}, \c{FreeBSD}
+and \c{OpenBSD}. For simple object files, this object format is exactly
+the same as \c{aout} except for the magic number in the first four bytes
+of the file. However, the \c{aoutb} format supports
+\I{PIC}\i{position-independent code} in the same way as the \c{elf}
+format, so you can use it to write \c{BSD} \i{shared libraries}.
+
+\c{aoutb} provides a default output file-name extension of \c{.o}.
+
+\c{aoutb} supports no special directives, no special symbols, and
+only the three \i{standard section names} \i\c{.text}, \i\c{.data}
+and \i\c{.bss}. However, it also supports the same use of \i\c{WRT} as
+\c{elf} does, to provide position-independent code relocation types.
+See \k{elfwrt} for full documentation of this feature.
+
+\c{aoutb} also supports the same extensions to the \c{GLOBAL}
+directive as \c{elf} does: see \k{elfglob} for documentation of
+this.
+
+
+\H{as86fmt} \c{as86}: \i{Minix}/Linux\I{linux, as86} \i\c{as86} Object Files
+
+The Minix/Linux 16-bit assembler \c{as86} has its own non-standard
+object file format. Although its companion linker \i\c{ld86} produces
+something close to ordinary \c{a.out} binaries as output, the object
+file format used to communicate between \c{as86} and \c{ld86} is not
+itself \c{a.out}.
+
+NASM supports this format, just in case it is useful, as \c{as86}.
+\c{as86} provides a default output file-name extension of \c{.o}.
+
+\c{as86} is a very simple object format (from the NASM user's point
+of view). It supports no special directives, no use of \c{SEG} or \c{WRT},
+and no extensions to any standard directives. It supports only the three
+\i{standard section names} \i\c{.text}, \i\c{.data} and \i\c{.bss}. The
+only special symbol supported is \c{..start}.
+
+
+\H{rdffmt} \I{RDOFF}\i\c{rdf}: \i{Relocatable Dynamic Object File
+Format}
+
+The \c{rdf} output format produces \c{RDOFF} object files. \c{RDOFF}
+(Relocatable Dynamic Object File Format) is a home-grown object-file
+format, designed alongside NASM itself and reflecting in its file
+format the internal structure of the assembler.
+
+\c{RDOFF} is not used by any well-known operating systems. Those
+writing their own systems, however, may well wish to use \c{RDOFF}
+as their object format, on the grounds that it is designed primarily
+for simplicity and contains very little file-header bureaucracy.
+
+The Unix NASM archive, and the DOS archive which includes sources,
+both contain an \I{rdoff subdirectory}\c{rdoff} subdirectory holding
+a set of RDOFF utilities: an RDF linker, an \c{RDF} static-library
+manager, an RDF file dump utility, and a program which will load and
+execute an RDF executable under Linux.
+
+\c{rdf} supports only the \i{standard section names} \i\c{.text},
+\i\c{.data} and \i\c{.bss}.
+
+
+\S{rdflib} Requiring a Library: The \i\c{LIBRARY} Directive
+
+\c{RDOFF} contains a mechanism for an object file to demand a given
+library to be linked to the module, either at load time or run time.
+This is done by the \c{LIBRARY} directive, which takes one argument
+which is the name of the module:
+
+\c library mylib.rdl
+
+
+\S{rdfmod} Specifying a Module Name: The \i\c{MODULE} Directive
+
+Special \c{RDOFF} header record is used to store the name of the module.
+It can be used, for example, by run-time loader to perform dynamic
+linking. \c{MODULE} directive takes one argument which is the name
+of current module:
+
+\c module mymodname
+
+Note that when you statically link modules and tell linker to strip
+the symbols from output file, all module names will be stripped too.
+To avoid it, you should start module names with \I{$, prefix}\c{$}, like:
+
+\c module $kernel.core
+
+
+\S{rdfglob} \c{rdf} Extensions to the \c{GLOBAL} Directive\I{GLOBAL,
+rdf extensions to}
+
+\c{RDOFF} global symbols can contain additional information needed by
+the static linker. You can mark a global symbol as exported, thus
+telling the linker do not strip it from target executable or library
+file. Like in \c{ELF}, you can also specify whether an exported symbol
+is a procedure (function) or data object.
+
+Suffixing the name with a colon and the word \i\c{export} you make the
+symbol exported:
+
+\c global sys_open:export
+
+To specify that exported symbol is a procedure (function), you add the
+word \i\c{proc} or \i\c{function} after declaration:
+
+\c global sys_open:export proc
+
+Similarly, to specify exported data object, add the word \i\c{data}
+or \i\c{object} to the directive:
+
+\c global kernel_ticks:export data
+
+
+\S{rdfimpt} \c{rdf} Extensions to the \c{EXTERN} Directive\I{EXTERN,
+rdf extensions to}
+
+By default the \c{EXTERN} directive in \c{RDOFF} declares a "pure external"
+symbol (i.e. the static linker will complain if such a symbol is not resolved).
+To declare an "imported" symbol, which must be resolved later during a dynamic
+linking phase, \c{RDOFF} offers an additional \c{import} modifier. As in
+\c{GLOBAL}, you can also specify whether an imported symbol is a procedure
+(function) or data object. For example:
+
+\c library $libc
+\c extern _open:import
+\c extern _printf:import proc
+\c extern _errno:import data
+
+Here the directive \c{LIBRARY} is also included, which gives the dynamic linker
+a hint as to where to find requested symbols.
+
+
+\H{dbgfmt} \i\c{dbg}: Debugging Format
+
+The \c{dbg} format does not output an object file as such; instead,
+it outputs a text file which contains a complete list of all the
+transactions between the main body of NASM and the output-format
+back end module. It is primarily intended to aid people who want to
+write their own output drivers, so that they can get a clearer idea
+of the various requests the main program makes of the output driver,
+and in what order they happen.
+
+For simple files, one can easily use the \c{dbg} format like this:
+
+\c nasm -f dbg filename.asm
+
+which will generate a diagnostic file called \c{filename.dbg}.
+However, this will not work well on files which were designed for a
+different object format, because each object format defines its own
+macros (usually user-level forms of directives), and those macros
+will not be defined in the \c{dbg} format. Therefore it can be
+useful to run NASM twice, in order to do the preprocessing with the
+native object format selected:
+
+\c nasm -e -f rdf -o rdfprog.i rdfprog.asm
+\c nasm -a -f dbg rdfprog.i
+
+This preprocesses \c{rdfprog.asm} into \c{rdfprog.i}, keeping the
+\c{rdf} object format selected in order to make sure RDF special
+directives are converted into primitive form correctly. Then the
+preprocessed source is fed through the \c{dbg} format to generate
+the final diagnostic output.
+
+This workaround will still typically not work for programs intended
+for \c{obj} format, because the \c{obj} \c{SEGMENT} and \c{GROUP}
+directives have side effects of defining the segment and group names
+as symbols; \c{dbg} will not do this, so the program will not
+assemble. You will have to work around that by defining the symbols
+yourself (using \c{EXTERN}, for example) if you really need to get a
+\c{dbg} trace of an \c{obj}-specific source file.
+
+\c{dbg} accepts any section name and any directives at all, and logs
+them all to its output file.
+
+\c{dbg} accepts and logs any \c{%pragma}, but the specific
+\c{%pragma}:
+
+\c %pragma dbg maxdump <size>
+
+where \c{<size>} is either a number or \c{unlimited}, can be used to
+control the maximum size for dumping the full contents of a
+\c{rawdata} output object.
+
+
+\C{16bit} Writing 16-bit Code (DOS, Windows 3/3.1)
+
+This chapter attempts to cover some of the common issues encountered
+when writing 16-bit code to run under \c{MS-DOS} or \c{Windows 3.x}. It
+covers how to link programs to produce \c{.EXE} or \c{.COM} files,
+how to write \c{.SYS} device drivers, and how to interface assembly
+language code with 16-bit C compilers and with Borland Pascal.
+
+
+\H{exefiles} Producing \i\c{.EXE} Files
+
+Any large program written under DOS needs to be built as a \c{.EXE}
+file: only \c{.EXE} files have the necessary internal structure
+required to span more than one 64K segment. \i{Windows} programs,
+also, have to be built as \c{.EXE} files, since Windows does not
+support the \c{.COM} format.
+
+In general, you generate \c{.EXE} files by using the \c{obj} output
+format to produce one or more \i\c{.OBJ} files, and then linking
+them together using a linker. However, NASM also supports the direct
+generation of simple DOS \c{.EXE} files using the \c{bin} output
+format (by using \c{DB} and \c{DW} to construct the \c{.EXE} file
+header), and a macro package is supplied to do this. Thanks to
+Yann Guidon for contributing the code for this.
+
+NASM may also support \c{.EXE} natively as another output format in
+future releases.
+
+
+\S{objexe} Using the \c{obj} Format To Generate \c{.EXE} Files
+
+This section describes the usual method of generating \c{.EXE} files
+by linking \c{.OBJ} files together.
+
+Most 16-bit programming language packages come with a suitable
+linker; if you have none of these, there is a free linker called
+\i{VAL}\I{linker, free}, available in \c{LZH} archive format from
+\W{ftp://x2ftp.oulu.fi/pub/msdos/programming/lang/}\i\c{x2ftp.oulu.fi}.
+An LZH archiver can be found at
+\W{ftp://ftp.simtel.net/pub/simtelnet/msdos/arcers}\i\c{ftp.simtel.net}.
+There is another `free' linker (though this one doesn't come with
+sources) called \i{FREELINK}, available from
+\W{http://www.pcorner.com/tpc/old/3-101.html}\i\c{www.pcorner.com}.
+A third, \i\c{djlink}, written by DJ Delorie, is available at
+\W{http://www.delorie.com/djgpp/16bit/djlink/}\i\c{www.delorie.com}.
+A fourth linker, \i\c{ALINK}, written by Anthony A.J. Williams, is
+available at \W{http://alink.sourceforge.net}\i\c{alink.sourceforge.net}.
+
+When linking several \c{.OBJ} files into a \c{.EXE} file, you should
+ensure that exactly one of them has a start point defined (using the
+\I{program entry point}\i\c{..start} special symbol defined by the
+\c{obj} format: see \k{dotdotstart}). If no module defines a start
+point, the linker will not know what value to give the entry-point
+field in the output file header; if more than one defines a start
+point, the linker will not know \e{which} value to use.
+
+An example of a NASM source file which can be assembled to a
+\c{.OBJ} file and linked on its own to a \c{.EXE} is given here. It
+demonstrates the basic principles of defining a stack, initialising
+the segment registers, and declaring a start point. This file is
+also provided in the \I{test subdirectory}\c{test} subdirectory of
+the NASM archives, under the name \c{objexe.asm}.
+
+\c segment code
+\c
+\c ..start:
+\c mov ax,data
+\c mov ds,ax
+\c mov ax,stack
+\c mov ss,ax
+\c mov sp,stacktop
+
+This initial piece of code sets up \c{DS} to point to the data
+segment, and initializes \c{SS} and \c{SP} to point to the top of
+the provided stack. Notice that interrupts are implicitly disabled
+for one instruction after a move into \c{SS}, precisely for this
+situation, so that there's no chance of an interrupt occurring
+between the loads of \c{SS} and \c{SP} and not having a stack to
+execute on.
+
+Note also that the special symbol \c{..start} is defined at the
+beginning of this code, which means that will be the entry point
+into the resulting executable file.
+
+\c mov dx,hello
+\c mov ah,9
+\c int 0x21
+
+The above is the main program: load \c{DS:DX} with a pointer to the
+greeting message (\c{hello} is implicitly relative to the segment
+\c{data}, which was loaded into \c{DS} in the setup code, so the
+full pointer is valid), and call the DOS print-string function.
+
+\c mov ax,0x4c00
+\c int 0x21
+
+This terminates the program using another DOS system call.
+
+\c segment data
+\c
+\c hello: db 'hello, world', 13, 10, '$'
+
+The data segment contains the string we want to display.
+
+\c segment stack stack
+\c resb 64
+\c stacktop:
+
+The above code declares a stack segment containing 64 bytes of
+uninitialized stack space, and points \c{stacktop} at the top of it.
+The directive \c{segment stack stack} defines a segment \e{called}
+\c{stack}, and also of \e{type} \c{STACK}. The latter is not
+necessary to the correct running of the program, but linkers are
+likely to issue warnings or errors if your program has no segment of
+type \c{STACK}.
+
+The above file, when assembled into a \c{.OBJ} file, will link on
+its own to a valid \c{.EXE} file, which when run will print `hello,
+world' and then exit.
+
+
+\S{binexe} Using the \c{bin} Format To Generate \c{.EXE} Files
+
+The \c{.EXE} file format is simple enough that it's possible to
+build a \c{.EXE} file by writing a pure-binary program and sticking
+a 32-byte header on the front. This header is simple enough that it
+can be generated using \c{DB} and \c{DW} commands by NASM itself, so
+that you can use the \c{bin} output format to directly generate
+\c{.EXE} files.
+
+Included in the NASM archives, in the \I{misc subdirectory}\c{misc}
+subdirectory, is a file \i\c{exebin.mac} of macros. It defines three
+macros: \i\c{EXE_begin}, \i\c{EXE_stack} and \i\c{EXE_end}.
+
+To produce a \c{.EXE} file using this method, you should start by
+using \c{%include} to load the \c{exebin.mac} macro package into
+your source file. You should then issue the \c{EXE_begin} macro call
+(which takes no arguments) to generate the file header data. Then
+write code as normal for the \c{bin} format - you can use all three
+standard sections \c{.text}, \c{.data} and \c{.bss}. At the end of
+the file you should call the \c{EXE_end} macro (again, no arguments),
+which defines some symbols to mark section sizes, and these symbols
+are referred to in the header code generated by \c{EXE_begin}.
+
+In this model, the code you end up writing starts at \c{0x100}, just
+like a \c{.COM} file - in fact, if you strip off the 32-byte header
+from the resulting \c{.EXE} file, you will have a valid \c{.COM}
+program. All the segment bases are the same, so you are limited to a
+64K program, again just like a \c{.COM} file. Note that an \c{ORG}
+directive is issued by the \c{EXE_begin} macro, so you should not
+explicitly issue one of your own.
+
+You can't directly refer to your segment base value, unfortunately,
+since this would require a relocation in the header, and things
+would get a lot more complicated. So you should get your segment
+base by copying it out of \c{CS} instead.
+
+On entry to your \c{.EXE} file, \c{SS:SP} are already set up to
+point to the top of a 2Kb stack. You can adjust the default stack
+size of 2Kb by calling the \c{EXE_stack} macro. For example, to
+change the stack size of your program to 64 bytes, you would call
+\c{EXE_stack 64}.
+
+A sample program which generates a \c{.EXE} file in this way is
+given in the \c{test} subdirectory of the NASM archive, as
+\c{binexe.asm}.
+
+
+\H{comfiles} Producing \i\c{.COM} Files
+
+While large DOS programs must be written as \c{.EXE} files, small
+ones are often better written as \c{.COM} files. \c{.COM} files are
+pure binary, and therefore most easily produced using the \c{bin}
+output format.
+
+
+\S{combinfmt} Using the \c{bin} Format To Generate \c{.COM} Files
+
+\c{.COM} files expect to be loaded at offset \c{100h} into their
+segment (though the segment may change). Execution then begins at
+\I\c{ORG}\c{100h}, i.e. right at the start of the program. So to
+write a \c{.COM} program, you would create a source file looking
+like
+
+\c org 100h
+\c
+\c section .text
+\c
+\c start:
+\c ; put your code here
+\c
+\c section .data
+\c
+\c ; put data items here
+\c
+\c section .bss
+\c
+\c ; put uninitialized data here
+
+The \c{bin} format puts the \c{.text} section first in the file, so
+you can declare data or BSS items before beginning to write code if
+you want to and the code will still end up at the front of the file
+where it belongs.
+
+The BSS (uninitialized data) section does not take up space in the
+\c{.COM} file itself: instead, addresses of BSS items are resolved
+to point at space beyond the end of the file, on the grounds that
+this will be free memory when the program is run. Therefore you
+should not rely on your BSS being initialized to all zeros when you
+run.
+
+To assemble the above program, you should use a command line like
+
+\c nasm myprog.asm -fbin -o myprog.com
+
+The \c{bin} format would produce a file called \c{myprog} if no
+explicit output file name were specified, so you have to override it
+and give the desired file name.
+
+
+\S{comobjfmt} Using the \c{obj} Format To Generate \c{.COM} Files
+
+If you are writing a \c{.COM} program as more than one module, you
+may wish to assemble several \c{.OBJ} files and link them together
+into a \c{.COM} program. You can do this, provided you have a linker
+capable of outputting \c{.COM} files directly (\i{TLINK} does this),
+or alternatively a converter program such as \i\c{EXE2BIN} to
+transform the \c{.EXE} file output from the linker into a \c{.COM}
+file.
+
+If you do this, you need to take care of several things:
+
+\b The first object file containing code should start its code
+segment with a line like \c{RESB 100h}. This is to ensure that the
+code begins at offset \c{100h} relative to the beginning of the code
+segment, so that the linker or converter program does not have to
+adjust address references within the file when generating the
+\c{.COM} file. Other assemblers use an \i\c{ORG} directive for this
+purpose, but \c{ORG} in NASM is a format-specific directive to the
+\c{bin} output format, and does not mean the same thing as it does
+in MASM-compatible assemblers.
+
+\b You don't need to define a stack segment.
+
+\b All your segments should be in the same group, so that every time
+your code or data references a symbol offset, all offsets are
+relative to the same segment base. This is because, when a \c{.COM}
+file is loaded, all the segment registers contain the same value.
+
+
+\H{sysfiles} Producing \i\c{.SYS} Files
+
+\i{MS-DOS device drivers} - \c{.SYS} files - are pure binary files,
+similar to \c{.COM} files, except that they start at origin zero
+rather than \c{100h}. Therefore, if you are writing a device driver
+using the \c{bin} format, you do not need the \c{ORG} directive,
+since the default origin for \c{bin} is zero. Similarly, if you are
+using \c{obj}, you do not need the \c{RESB 100h} at the start of
+your code segment.
+
+\c{.SYS} files start with a header structure, containing pointers to
+the various routines inside the driver which do the work. This
+structure should be defined at the start of the code segment, even
+though it is not actually code.
+
+For more information on the format of \c{.SYS} files, and the data
+which has to go in the header structure, a list of books is given in
+the Frequently Asked Questions list for the newsgroup
+\W{news:comp.os.msdos.programmer}\i\c{comp.os.msdos.programmer}.
+
+
+\H{16c} Interfacing to 16-bit C Programs
+
+This section covers the basics of writing assembly routines that
+call, or are called from, C programs. To do this, you would
+typically write an assembly module as a \c{.OBJ} file, and link it
+with your C modules to produce a \i{mixed-language program}.
+
+
+\S{16cunder} External Symbol Names
+
+\I{C symbol names}\I{underscore, in C symbols}C compilers have the
+convention that the names of all global symbols (functions or data)
+they define are formed by prefixing an underscore to the name as it
+appears in the C program. So, for example, the function a C
+programmer thinks of as \c{printf} appears to an assembly language
+programmer as \c{_printf}. This means that in your assembly
+programs, you can define symbols without a leading underscore, and
+not have to worry about name clashes with C symbols.
+
+If you find the underscores inconvenient, you can define macros to
+replace the \c{GLOBAL} and \c{EXTERN} directives as follows:
+
+\c %macro cglobal 1
+\c
+\c global _%1
+\c %define %1 _%1
+\c
+\c %endmacro
+\c
+\c %macro cextern 1
+\c
+\c extern _%1
+\c %define %1 _%1
+\c
+\c %endmacro
+
+(These forms of the macros only take one argument at a time; a
+\c{%rep} construct could solve this.)
+
+If you then declare an external like this:
+
+\c cextern printf
+
+then the macro will expand it as
+
+\c extern _printf
+\c %define printf _printf
+
+Thereafter, you can reference \c{printf} as if it was a symbol, and
+the preprocessor will put the leading underscore on where necessary.
+
+The \c{cglobal} macro works similarly. You must use \c{cglobal}
+before defining the symbol in question, but you would have had to do
+that anyway if you used \c{GLOBAL}.
+
+Also see \k{opt-pfix}.
+
+\S{16cmodels} \i{Memory Models}
+
+NASM contains no mechanism to support the various C memory models
+directly; you have to keep track yourself of which one you are
+writing for. This means you have to keep track of the following
+things:
+
+\b In models using a single code segment (tiny, small and compact),
+functions are near. This means that function pointers, when stored
+in data segments or pushed on the stack as function arguments, are
+16 bits long and contain only an offset field (the \c{CS} register
+never changes its value, and always gives the segment part of the
+full function address), and that functions are called using ordinary
+near \c{CALL} instructions and return using \c{RETN} (which, in
+NASM, is synonymous with \c{RET} anyway). This means both that you
+should write your own routines to return with \c{RETN}, and that you
+should call external C routines with near \c{CALL} instructions.
+
+\b In models using more than one code segment (medium, large and
+huge), functions are far. This means that function pointers are 32
+bits long (consisting of a 16-bit offset followed by a 16-bit
+segment), and that functions are called using \c{CALL FAR} (or
+\c{CALL seg:offset}) and return using \c{RETF}. Again, you should
+therefore write your own routines to return with \c{RETF} and use
+\c{CALL FAR} to call external routines.
+
+\b In models using a single data segment (tiny, small and medium),
+data pointers are 16 bits long, containing only an offset field (the
+\c{DS} register doesn't change its value, and always gives the
+segment part of the full data item address).
+
+\b In models using more than one data segment (compact, large and
+huge), data pointers are 32 bits long, consisting of a 16-bit offset
+followed by a 16-bit segment. You should still be careful not to
+modify \c{DS} in your routines without restoring it afterwards, but
+\c{ES} is free for you to use to access the contents of 32-bit data
+pointers you are passed.
+
+\b The huge memory model allows single data items to exceed 64K in
+size. In all other memory models, you can access the whole of a data
+item just by doing arithmetic on the offset field of the pointer you
+are given, whether a segment field is present or not; in huge model,
+you have to be more careful of your pointer arithmetic.
+
+\b In most memory models, there is a \e{default} data segment, whose
+segment address is kept in \c{DS} throughout the program. This data
+segment is typically the same segment as the stack, kept in \c{SS},
+so that functions' local variables (which are stored on the stack)
+and global data items can both be accessed easily without changing
+\c{DS}. Particularly large data items are typically stored in other
+segments. However, some memory models (though not the standard
+ones, usually) allow the assumption that \c{SS} and \c{DS} hold the
+same value to be removed. Be careful about functions' local
+variables in this latter case.
+
+In models with a single code segment, the segment is called
+\i\c{_TEXT}, so your code segment must also go by this name in order
+to be linked into the same place as the main code segment. In models
+with a single data segment, or with a default data segment, it is
+called \i\c{_DATA}.
+
+
+\S{16cfunc} Function Definitions and Function Calls
+
+\I{functions, C calling convention}The \i{C calling convention} in
+16-bit programs is as follows. In the following description, the
+words \e{caller} and \e{callee} are used to denote the function
+doing the calling and the function which gets called.
+
+\b The caller pushes the function's parameters on the stack, one
+after another, in reverse order (right to left, so that the first
+argument specified to the function is pushed last).
+
+\b The caller then executes a \c{CALL} instruction to pass control
+to the callee. This \c{CALL} is either near or far depending on the
+memory model.
+
+\b The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of \c{SP} in \c{BP} so as to
+be able to use \c{BP} as a base pointer to find its parameters on
+the stack. However, the caller was probably doing this too, so part
+of the calling convention states that \c{BP} must be preserved by
+any C function. Hence the callee, if it is going to set up \c{BP} as
+a \i\e{frame pointer}, must push the previous value first.
+
+\b The callee may then access its parameters relative to \c{BP}.
+The word at \c{[BP]} holds the previous value of \c{BP} as it was
+pushed; the next word, at \c{[BP+2]}, holds the offset part of the
+return address, pushed implicitly by \c{CALL}. In a small-model
+(near) function, the parameters start after that, at \c{[BP+4]}; in
+a large-model (far) function, the segment part of the return address
+lives at \c{[BP+4]}, and the parameters begin at \c{[BP+6]}. The
+leftmost parameter of the function, since it was pushed last, is
+accessible at this offset from \c{BP}; the others follow, at
+successively greater offsets. Thus, in a function such as \c{printf}
+which takes a variable number of parameters, the pushing of the
+parameters in reverse order means that the function knows where to
+find its first parameter, which tells it the number and type of the
+remaining ones.
+
+\b The callee may also wish to decrease \c{SP} further, so as to
+allocate space on the stack for local variables, which will then be
+accessible at negative offsets from \c{BP}.
+
+\b The callee, if it wishes to return a value to the caller, should
+leave the value in \c{AL}, \c{AX} or \c{DX:AX} depending on the size
+of the value. Floating-point results are sometimes (depending on the
+compiler) returned in \c{ST0}.
+
+\b Once the callee has finished processing, it restores \c{SP} from
+\c{BP} if it had allocated local stack space, then pops the previous
+value of \c{BP}, and returns via \c{RETN} or \c{RETF} depending on
+memory model.
+
+\b When the caller regains control from the callee, the function
+parameters are still on the stack, so it typically adds an immediate
+constant to \c{SP} to remove them (instead of executing a number of
+slow \c{POP} instructions). Thus, if a function is accidentally
+called with the wrong number of parameters due to a prototype
+mismatch, the stack will still be returned to a sensible state since
+the caller, which \e{knows} how many parameters it pushed, does the
+removing.
+
+It is instructive to compare this calling convention with that for
+Pascal programs (described in \k{16bpfunc}). Pascal has a simpler
+convention, since no functions have variable numbers of parameters.
+Therefore the callee knows how many parameters it should have been
+passed, and is able to deallocate them from the stack itself by
+passing an immediate argument to the \c{RET} or \c{RETF}
+instruction, so the caller does not have to do it. Also, the
+parameters are pushed in left-to-right order, not right-to-left,
+which means that a compiler can give better guarantees about
+sequence points without performance suffering.
+
+Thus, you would define a function in C style in the following way.
+The following example is for small model:
+
+\c global _myfunc
+\c
+\c _myfunc:
+\c push bp
+\c mov bp,sp
+\c sub sp,0x40 ; 64 bytes of local stack space
+\c mov bx,[bp+4] ; first parameter to function
+\c
+\c ; some more code
+\c
+\c mov sp,bp ; undo "sub sp,0x40" above
+\c pop bp
+\c ret
+
+For a large-model function, you would replace \c{RET} by \c{RETF},
+and look for the first parameter at \c{[BP+6]} instead of
+\c{[BP+4]}. Of course, if one of the parameters is a pointer, then
+the offsets of \e{subsequent} parameters will change depending on
+the memory model as well: far pointers take up four bytes on the
+stack when passed as a parameter, whereas near pointers take up two.
+
+At the other end of the process, to call a C function from your
+assembly code, you would do something like this:
+
+\c extern _printf
+\c
+\c ; and then, further down...
+\c
+\c push word [myint] ; one of my integer variables
+\c push word mystring ; pointer into my data segment
+\c call _printf
+\c add sp,byte 4 ; `byte' saves space
+\c
+\c ; then those data items...
+\c
+\c segment _DATA
+\c
+\c myint dw 1234
+\c mystring db 'This number -> %d <- should be 1234',10,0
+
+This piece of code is the small-model assembly equivalent of the C
+code
+
+\c int myint = 1234;
+\c printf("This number -> %d <- should be 1234\n", myint);
+
+In large model, the function-call code might look more like this. In
+this example, it is assumed that \c{DS} already holds the segment
+base of the segment \c{_DATA}. If not, you would have to initialize
+it first.
+
+\c push word [myint]
+\c push word seg mystring ; Now push the segment, and...
+\c push word mystring ; ... offset of "mystring"
+\c call far _printf
+\c add sp,byte 6
+
+The integer value still takes up one word on the stack, since large
+model does not affect the size of the \c{int} data type. The first
+argument (pushed last) to \c{printf}, however, is a data pointer,
+and therefore has to contain a segment and offset part. The segment
+should be stored second in memory, and therefore must be pushed
+first. (Of course, \c{PUSH DS} would have been a shorter instruction
+than \c{PUSH WORD SEG mystring}, if \c{DS} was set up as the above
+example assumed.) Then the actual call becomes a far call, since
+functions expect far calls in large model; and \c{SP} has to be
+increased by 6 rather than 4 afterwards to make up for the extra
+word of parameters.
+
+
+\S{16cdata} Accessing Data Items
+
+To get at the contents of C variables, or to declare variables which
+C can access, you need only declare the names as \c{GLOBAL} or
+\c{EXTERN}. (Again, the names require leading underscores, as stated
+in \k{16cunder}.) Thus, a C variable declared as \c{int i} can be
+accessed from assembler as
+
+\c extern _i
+\c
+\c mov ax,[_i]
+
+And to declare your own integer variable which C programs can access
+as \c{extern int j}, you do this (making sure you are assembling in
+the \c{_DATA} segment, if necessary):
+
+\c global _j
+\c
+\c _j dw 0
+
+To access a C array, you need to know the size of the components of
+the array. For example, \c{int} variables are two bytes long, so if
+a C program declares an array as \c{int a[10]}, you can access
+\c{a[3]} by coding \c{mov ax,[_a+6]}. (The byte offset 6 is obtained
+by multiplying the desired array index, 3, by the size of the array
+element, 2.) The sizes of the C base types in 16-bit compilers are:
+1 for \c{char}, 2 for \c{short} and \c{int}, 4 for \c{long} and
+\c{float}, and 8 for \c{double}.
+
+To access a C \i{data structure}, you need to know the offset from
+the base of the structure to the field you are interested in. You
+can either do this by converting the C structure definition into a
+NASM structure definition (using \i\c{STRUC}), or by calculating the
+one offset and using just that.
+
+To do either of these, you should read your C compiler's manual to
+find out how it organizes data structures. NASM gives no special
+alignment to structure members in its own \c{STRUC} macro, so you
+have to specify alignment yourself if the C compiler generates it.
+Typically, you might find that a structure like
+
+\c struct {
+\c char c;
+\c int i;
+\c } foo;
+
+might be four bytes long rather than three, since the \c{int} field
+would be aligned to a two-byte boundary. However, this sort of
+feature tends to be a configurable option in the C compiler, either
+using command-line options or \c{#pragma} lines, so you have to find
+out how your own compiler does it.
+
+
+\S{16cmacro} \i\c{c16.mac}: Helper Macros for the 16-bit C Interface
+
+Included in the NASM archives, in the \I{misc subdirectory}\c{misc}
+directory, is a file \c{c16.mac} of macros. It defines three macros:
+\i\c{proc}, \i\c{arg} and \i\c{endproc}. These are intended to be
+used for C-style procedure definitions, and they automate a lot of
+the work involved in keeping track of the calling convention.
+
+(An alternative, TASM compatible form of \c{arg} is also now built
+into NASM's preprocessor. See \k{stackrel} for details.)
+
+An example of an assembly function using the macro set is given
+here:
+
+\c proc _nearproc
+\c
+\c %$i arg
+\c %$j arg
+\c mov ax,[bp + %$i]
+\c mov bx,[bp + %$j]
+\c add ax,[bx]
+\c
+\c endproc
+
+This defines \c{_nearproc} to be a procedure taking two arguments,
+the first (\c{i}) an integer and the second (\c{j}) a pointer to an
+integer. It returns \c{i + *j}.
+
+Note that the \c{arg} macro has an \c{EQU} as the first line of its
+expansion, and since the label before the macro call gets prepended
+to the first line of the expanded macro, the \c{EQU} works, defining
+\c{%$i} to be an offset from \c{BP}. A context-local variable is
+used, local to the context pushed by the \c{proc} macro and popped
+by the \c{endproc} macro, so that the same argument name can be used
+in later procedures. Of course, you don't \e{have} to do that.
+
+The macro set produces code for near functions (tiny, small and
+compact-model code) by default. You can have it generate far
+functions (medium, large and huge-model code) by means of coding
+\I\c{FARCODE}\c{%define FARCODE}. This changes the kind of return
+instruction generated by \c{endproc}, and also changes the starting
+point for the argument offsets. The macro set contains no intrinsic
+dependency on whether data pointers are far or not.
+
+\c{arg} can take an optional parameter, giving the size of the
+argument. If no size is given, 2 is assumed, since it is likely that
+many function parameters will be of type \c{int}.
+
+The large-model equivalent of the above function would look like this:
+
+\c %define FARCODE
+\c
+\c proc _farproc
+\c
+\c %$i arg
+\c %$j arg 4
+\c mov ax,[bp + %$i]
+\c mov bx,[bp + %$j]
+\c mov es,[bp + %$j + 2]
+\c add ax,[bx]
+\c
+\c endproc
+
+This makes use of the argument to the \c{arg} macro to define a
+parameter of size 4, because \c{j} is now a far pointer. When we
+load from \c{j}, we must load a segment and an offset.
+
+
+\H{16bp} Interfacing to \i{Borland Pascal} Programs
+
+Interfacing to Borland Pascal programs is similar in concept to
+interfacing to 16-bit C programs. The differences are:
+
+\b The leading underscore required for interfacing to C programs is
+not required for Pascal.
+
+\b The memory model is always large: functions are far, data
+pointers are far, and no data item can be more than 64K long.
+(Actually, some functions are near, but only those functions that
+are local to a Pascal unit and never called from outside it. All
+assembly functions that Pascal calls, and all Pascal functions that
+assembly routines are able to call, are far.) However, all static
+data declared in a Pascal program goes into the default data
+segment, which is the one whose segment address will be in \c{DS}
+when control is passed to your assembly code. The only things that
+do not live in the default data segment are local variables (they
+live in the stack segment) and dynamically allocated variables. All
+data \e{pointers}, however, are far.
+
+\b The function calling convention is different - described below.
+
+\b Some data types, such as strings, are stored differently.
+
+\b There are restrictions on the segment names you are allowed to
+use - Borland Pascal will ignore code or data declared in a segment
+it doesn't like the name of. The restrictions are described below.
+
+
+\S{16bpfunc} The Pascal Calling Convention
+
+\I{functions, Pascal calling convention}\I{Pascal calling
+convention}The 16-bit Pascal calling convention is as follows. In
+the following description, the words \e{caller} and \e{callee} are
+used to denote the function doing the calling and the function which
+gets called.
+
+\b The caller pushes the function's parameters on the stack, one
+after another, in normal order (left to right, so that the first
+argument specified to the function is pushed first).
+
+\b The caller then executes a far \c{CALL} instruction to pass
+control to the callee.
+
+\b The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of \c{SP} in \c{BP} so as to
+be able to use \c{BP} as a base pointer to find its parameters on
+the stack. However, the caller was probably doing this too, so part
+of the calling convention states that \c{BP} must be preserved by
+any function. Hence the callee, if it is going to set up \c{BP} as a
+\i{frame pointer}, must push the previous value first.
+
+\b The callee may then access its parameters relative to \c{BP}.
+The word at \c{[BP]} holds the previous value of \c{BP} as it was
+pushed. The next word, at \c{[BP+2]}, holds the offset part of the
+return address, and the next one at \c{[BP+4]} the segment part. The
+parameters begin at \c{[BP+6]}. The rightmost parameter of the
+function, since it was pushed last, is accessible at this offset
+from \c{BP}; the others follow, at successively greater offsets.
+
+\b The callee may also wish to decrease \c{SP} further, so as to
+allocate space on the stack for local variables, which will then be
+accessible at negative offsets from \c{BP}.
+
+\b The callee, if it wishes to return a value to the caller, should
+leave the value in \c{AL}, \c{AX} or \c{DX:AX} depending on the size
+of the value. Floating-point results are returned in \c{ST0}.
+Results of type \c{Real} (Borland's own custom floating-point data
+type, not handled directly by the FPU) are returned in \c{DX:BX:AX}.
+To return a result of type \c{String}, the caller pushes a pointer
+to a temporary string before pushing the parameters, and the callee
+places the returned string value at that location. The pointer is
+not a parameter, and should not be removed from the stack by the
+\c{RETF} instruction.
+
+\b Once the callee has finished processing, it restores \c{SP} from
+\c{BP} if it had allocated local stack space, then pops the previous
+value of \c{BP}, and returns via \c{RETF}. It uses the form of
+\c{RETF} with an immediate parameter, giving the number of bytes
+taken up by the parameters on the stack. This causes the parameters
+to be removed from the stack as a side effect of the return
+instruction.
+
+\b When the caller regains control from the callee, the function
+parameters have already been removed from the stack, so it needs to
+do nothing further.
+
+Thus, you would define a function in Pascal style, taking two
+\c{Integer}-type parameters, in the following way:
+
+\c global myfunc
+\c
+\c myfunc: push bp
+\c mov bp,sp
+\c sub sp,0x40 ; 64 bytes of local stack space
+\c mov bx,[bp+8] ; first parameter to function
+\c mov bx,[bp+6] ; second parameter to function
+\c
+\c ; some more code
+\c
+\c mov sp,bp ; undo "sub sp,0x40" above
+\c pop bp
+\c retf 4 ; total size of params is 4
+
+At the other end of the process, to call a Pascal function from your
+assembly code, you would do something like this:
+
+\c extern SomeFunc
+\c
+\c ; and then, further down...
+\c
+\c push word seg mystring ; Now push the segment, and...
+\c push word mystring ; ... offset of "mystring"
+\c push word [myint] ; one of my variables
+\c call far SomeFunc
+
+This is equivalent to the Pascal code
+
+\c procedure SomeFunc(String: PChar; Int: Integer);
+\c SomeFunc(@mystring, myint);
+
+
+\S{16bpseg} Borland Pascal \I{segment names, Borland Pascal}Segment
+Name Restrictions
+
+Since Borland Pascal's internal unit file format is completely
+different from \c{OBJ}, it only makes a very sketchy job of actually
+reading and understanding the various information contained in a
+real \c{OBJ} file when it links that in. Therefore an object file
+intended to be linked to a Pascal program must obey a number of
+restrictions:
+
+\b Procedures and functions must be in a segment whose name is
+either \c{CODE}, \c{CSEG}, or something ending in \c{_TEXT}.
+
+\b initialized data must be in a segment whose name is either
+\c{CONST} or something ending in \c{_DATA}.
+
+\b Uninitialized data must be in a segment whose name is either
+\c{DATA}, \c{DSEG}, or something ending in \c{_BSS}.
+
+\b Any other segments in the object file are completely ignored.
+\c{GROUP} directives and segment attributes are also ignored.
+
+
+\S{16bpmacro} Using \i\c{c16.mac} With Pascal Programs
+
+The \c{c16.mac} macro package, described in \k{16cmacro}, can also
+be used to simplify writing functions to be called from Pascal
+programs, if you code \I\c{PASCAL}\c{%define PASCAL}. This
+definition ensures that functions are far (it implies
+\i\c{FARCODE}), and also causes procedure return instructions to be
+generated with an operand.
+
+Defining \c{PASCAL} does not change the code which calculates the
+argument offsets; you must declare your function's arguments in
+reverse order. For example:
+
+\c %define PASCAL
+\c
+\c proc _pascalproc
+\c
+\c %$j arg 4
+\c %$i arg
+\c mov ax,[bp + %$i]
+\c mov bx,[bp + %$j]
+\c mov es,[bp + %$j + 2]
+\c add ax,[bx]
+\c
+\c endproc
+
+This defines the same routine, conceptually, as the example in
+\k{16cmacro}: it defines a function taking two arguments, an integer
+and a pointer to an integer, which returns the sum of the integer
+and the contents of the pointer. The only difference between this
+code and the large-model C version is that \c{PASCAL} is defined
+instead of \c{FARCODE}, and that the arguments are declared in
+reverse order.
+
+
+\C{32bit} Writing 32-bit Code (Unix, Win32, DJGPP)
+
+This chapter attempts to cover some of the common issues involved
+when writing 32-bit code, to run under \i{Win32} or Unix, or to be
+linked with C code generated by a Unix-style C compiler such as
+\i{DJGPP}. It covers how to write assembly code to interface with
+32-bit C routines, and how to write position-independent code for
+shared libraries.
+
+Almost all 32-bit code, and in particular all code running under
+\c{Win32}, \c{DJGPP} or any of the PC Unix variants, runs in \I{flat
+memory model}\e{flat} memory model. This means that the segment registers
+and paging have already been set up to give you the same 32-bit 4Gb
+address space no matter what segment you work relative to, and that
+you should ignore all segment registers completely. When writing
+flat-model application code, you never need to use a segment
+override or modify any segment register, and the code-section
+addresses you pass to \c{CALL} and \c{JMP} live in the same address
+space as the data-section addresses you access your variables by and
+the stack-section addresses you access local variables and procedure
+parameters by. Every address is 32 bits long and contains only an
+offset part.
+
+
+\H{32c} Interfacing to 32-bit C Programs
+
+A lot of the discussion in \k{16c}, about interfacing to 16-bit C
+programs, still applies when working in 32 bits. The absence of
+memory models or segmentation worries simplifies things a lot.
+
+
+\S{32cunder} External Symbol Names
+
+Most 32-bit C compilers share the convention used by 16-bit
+compilers, that the names of all global symbols (functions or data)
+they define are formed by prefixing an underscore to the name as it
+appears in the C program. However, not all of them do: the \c{ELF}
+specification states that C symbols do \e{not} have a leading
+underscore on their assembly-language names.
+
+The older Linux \c{a.out} C compiler, all \c{Win32} compilers,
+\c{DJGPP}, and \c{NetBSD} and \c{FreeBSD}, all use the leading
+underscore; for these compilers, the macros \c{cextern} and
+\c{cglobal}, as given in \k{16cunder}, will still work. For \c{ELF},
+though, the leading underscore should not be used.
+
+See also \k{opt-pfix}.
+
+\S{32cfunc} Function Definitions and Function Calls
+
+\I{functions, C calling convention}The \i{C calling convention}
+in 32-bit programs is as follows. In the following description,
+the words \e{caller} and \e{callee} are used to denote
+the function doing the calling and the function which gets called.
+
+\b The caller pushes the function's parameters on the stack, one
+after another, in reverse order (right to left, so that the first
+argument specified to the function is pushed last).
+
+\b The caller then executes a near \c{CALL} instruction to pass
+control to the callee.
+
+\b The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of \c{ESP} in \c{EBP} so as
+to be able to use \c{EBP} as a base pointer to find its parameters
+on the stack. However, the caller was probably doing this too, so
+part of the calling convention states that \c{EBP} must be preserved
+by any C function. Hence the callee, if it is going to set up
+\c{EBP} as a \i{frame pointer}, must push the previous value first.
+
+\b The callee may then access its parameters relative to \c{EBP}.
+The doubleword at \c{[EBP]} holds the previous value of \c{EBP} as
+it was pushed; the next doubleword, at \c{[EBP+4]}, holds the return
+address, pushed implicitly by \c{CALL}. The parameters start after
+that, at \c{[EBP+8]}. The leftmost parameter of the function, since
+it was pushed last, is accessible at this offset from \c{EBP}; the
+others follow, at successively greater offsets. Thus, in a function
+such as \c{printf} which takes a variable number of parameters, the
+pushing of the parameters in reverse order means that the function
+knows where to find its first parameter, which tells it the number
+and type of the remaining ones.
+
+\b The callee may also wish to decrease \c{ESP} further, so as to
+allocate space on the stack for local variables, which will then be
+accessible at negative offsets from \c{EBP}.
+
+\b The callee, if it wishes to return a value to the caller, should
+leave the value in \c{AL}, \c{AX} or \c{EAX} depending on the size
+of the value. Floating-point results are typically returned in
+\c{ST0}.
+
+\b Once the callee has finished processing, it restores \c{ESP} from
+\c{EBP} if it had allocated local stack space, then pops the previous
+value of \c{EBP}, and returns via \c{RET} (equivalently, \c{RETN}).
+
+\b When the caller regains control from the callee, the function
+parameters are still on the stack, so it typically adds an immediate
+constant to \c{ESP} to remove them (instead of executing a number of
+slow \c{POP} instructions). Thus, if a function is accidentally
+called with the wrong number of parameters due to a prototype
+mismatch, the stack will still be returned to a sensible state since
+the caller, which \e{knows} how many parameters it pushed, does the
+removing.
+
+There is an alternative calling convention used by Win32 programs
+for Windows API calls, and also for functions called \e{by} the
+Windows API such as window procedures: they follow what Microsoft
+calls the \c{__stdcall} convention. This is slightly closer to the
+Pascal convention, in that the callee clears the stack by passing a
+parameter to the \c{RET} instruction. However, the parameters are
+still pushed in right-to-left order.
+
+Thus, you would define a function in C style in the following way:
+
+\c global _myfunc
+\c
+\c _myfunc:
+\c push ebp
+\c mov ebp,esp
+\c sub esp,0x40 ; 64 bytes of local stack space
+\c mov ebx,[ebp+8] ; first parameter to function
+\c
+\c ; some more code
+\c
+\c leave ; mov esp,ebp / pop ebp
+\c ret
+
+At the other end of the process, to call a C function from your
+assembly code, you would do something like this:
+
+\c extern _printf
+\c
+\c ; and then, further down...
+\c
+\c push dword [myint] ; one of my integer variables
+\c push dword mystring ; pointer into my data segment
+\c call _printf
+\c add esp,byte 8 ; `byte' saves space
+\c
+\c ; then those data items...
+\c
+\c segment _DATA
+\c
+\c myint dd 1234
+\c mystring db 'This number -> %d <- should be 1234',10,0
+
+This piece of code is the assembly equivalent of the C code
+
+\c int myint = 1234;
+\c printf("This number -> %d <- should be 1234\n", myint);
+
+
+\S{32cdata} Accessing Data Items
+
+To get at the contents of C variables, or to declare variables which
+C can access, you need only declare the names as \c{GLOBAL} or
+\c{EXTERN}. (Again, the names require leading underscores, as stated
+in \k{32cunder}.) Thus, a C variable declared as \c{int i} can be
+accessed from assembler as
+
+\c extern _i
+\c mov eax,[_i]
+
+And to declare your own integer variable which C programs can access
+as \c{extern int j}, you do this (making sure you are assembling in
+the \c{_DATA} segment, if necessary):
+
+\c global _j
+\c _j dd 0
+
+To access a C array, you need to know the size of the components of
+the array. For example, \c{int} variables are four bytes long, so if
+a C program declares an array as \c{int a[10]}, you can access
+\c{a[3]} by coding \c{mov ax,[_a+12]}. (The byte offset 12 is obtained
+by multiplying the desired array index, 3, by the size of the array
+element, 4.) The sizes of the C base types in 32-bit compilers are:
+1 for \c{char}, 2 for \c{short}, 4 for \c{int}, \c{long} and
+\c{float}, and 8 for \c{double}. Pointers, being 32-bit addresses,
+are also 4 bytes long.
+
+To access a C \i{data structure}, you need to know the offset from
+the base of the structure to the field you are interested in. You
+can either do this by converting the C structure definition into a
+NASM structure definition (using \c{STRUC}), or by calculating the
+one offset and using just that.
+
+To do either of these, you should read your C compiler's manual to
+find out how it organizes data structures. NASM gives no special
+alignment to structure members in its own \i\c{STRUC} macro, so you
+have to specify alignment yourself if the C compiler generates it.
+Typically, you might find that a structure like
+
+\c struct {
+\c char c;
+\c int i;
+\c } foo;
+
+might be eight bytes long rather than five, since the \c{int} field
+would be aligned to a four-byte boundary. However, this sort of
+feature is sometimes a configurable option in the C compiler, either
+using command-line options or \c{#pragma} lines, so you have to find
+out how your own compiler does it.
+
+
+\S{32cmacro} \i\c{c32.mac}: Helper Macros for the 32-bit C Interface
+
+Included in the NASM archives, in the \I{misc directory}\c{misc}
+directory, is a file \c{c32.mac} of macros. It defines three macros:
+\i\c{proc}, \i\c{arg} and \i\c{endproc}. These are intended to be
+used for C-style procedure definitions, and they automate a lot of
+the work involved in keeping track of the calling convention.
+
+An example of an assembly function using the macro set is given
+here:
+
+\c proc _proc32
+\c
+\c %$i arg
+\c %$j arg
+\c mov eax,[ebp + %$i]
+\c mov ebx,[ebp + %$j]
+\c add eax,[ebx]
+\c
+\c endproc
+
+This defines \c{_proc32} to be a procedure taking two arguments, the
+first (\c{i}) an integer and the second (\c{j}) a pointer to an
+integer. It returns \c{i + *j}.
+
+Note that the \c{arg} macro has an \c{EQU} as the first line of its
+expansion, and since the label before the macro call gets prepended
+to the first line of the expanded macro, the \c{EQU} works, defining
+\c{%$i} to be an offset from \c{BP}. A context-local variable is
+used, local to the context pushed by the \c{proc} macro and popped
+by the \c{endproc} macro, so that the same argument name can be used
+in later procedures. Of course, you don't \e{have} to do that.
+
+\c{arg} can take an optional parameter, giving the size of the
+argument. If no size is given, 4 is assumed, since it is likely that
+many function parameters will be of type \c{int} or pointers.
+
+
+\H{picdll} Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF \i{Shared
+Libraries}
+
+\c{ELF} replaced the older \c{a.out} object file format under Linux
+because it contains support for \i{position-independent code}
+(\i{PIC}), which makes writing shared libraries much easier. NASM
+supports the \c{ELF} position-independent code features, so you can
+write Linux \c{ELF} shared libraries in NASM.
+
+\i{NetBSD}, and its close cousins \i{FreeBSD} and \i{OpenBSD}, take
+a different approach by hacking PIC support into the \c{a.out}
+format. NASM supports this as the \i\c{aoutb} output format, so you
+can write \i{BSD} shared libraries in NASM too.
+
+The operating system loads a PIC shared library by memory-mapping
+the library file at an arbitrarily chosen point in the address space
+of the running process. The contents of the library's code section
+must therefore not depend on where it is loaded in memory.
+
+Therefore, you cannot get at your variables by writing code like
+this:
+
+\c mov eax,[myvar] ; WRONG
+
+Instead, the linker provides an area of memory called the
+\i\e{global offset table}, or \i{GOT}; the GOT is situated at a
+constant distance from your library's code, so if you can find out
+where your library is loaded (which is typically done using a
+\c{CALL} and \c{POP} combination), you can obtain the address of the
+GOT, and you can then load the addresses of your variables out of
+linker-generated entries in the GOT.
+
+The \e{data} section of a PIC shared library does not have these
+restrictions: since the data section is writable, it has to be
+copied into memory anyway rather than just paged in from the library
+file, so as long as it's being copied it can be relocated too. So
+you can put ordinary types of relocation in the data section without
+too much worry (but see \k{picglobal} for a caveat).
+
+
+\S{picgot} Obtaining the Address of the GOT
+
+Each code module in your shared library should define the GOT as an
+external symbol:
+
+\c extern _GLOBAL_OFFSET_TABLE_ ; in ELF
+\c extern __GLOBAL_OFFSET_TABLE_ ; in BSD a.out
+
+At the beginning of any function in your shared library which plans
+to access your data or BSS sections, you must first calculate the
+address of the GOT. This is typically done by writing the function
+in this form:
+
+\c func: push ebp
+\c mov ebp,esp
+\c push ebx
+\c call .get_GOT
+\c .get_GOT:
+\c pop ebx
+\c add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc
+\c
+\c ; the function body comes here
+\c
+\c mov ebx,[ebp-4]
+\c mov esp,ebp
+\c pop ebp
+\c ret
+
+(For BSD, again, the symbol \c{_GLOBAL_OFFSET_TABLE} requires a
+second leading underscore.)
+
+The first two lines of this function are simply the standard C
+prologue to set up a stack frame, and the last three lines are
+standard C function epilogue. The third line, and the fourth to last
+line, save and restore the \c{EBX} register, because PIC shared
+libraries use this register to store the address of the GOT.
+
+The interesting bit is the \c{CALL} instruction and the following
+two lines. The \c{CALL} and \c{POP} combination obtains the address
+of the label \c{.get_GOT}, without having to know in advance where
+the program was loaded (since the \c{CALL} instruction is encoded
+relative to the current position). The \c{ADD} instruction makes use
+of one of the special PIC relocation types: \i{GOTPC relocation}.
+With the \i\c{WRT ..gotpc} qualifier specified, the symbol
+referenced (here \c{_GLOBAL_OFFSET_TABLE_}, the special symbol
+assigned to the GOT) is given as an offset from the beginning of the
+section. (Actually, \c{ELF} encodes it as the offset from the operand
+field of the \c{ADD} instruction, but NASM simplifies this
+deliberately, so you do things the same way for both \c{ELF} and
+\c{BSD}.) So the instruction then \e{adds} the beginning of the section,
+to get the real address of the GOT, and subtracts the value of
+\c{.get_GOT} which it knows is in \c{EBX}. Therefore, by the time
+that instruction has finished, \c{EBX} contains the address of the GOT.
+
+If you didn't follow that, don't worry: it's never necessary to
+obtain the address of the GOT by any other means, so you can put
+those three instructions into a macro and safely ignore them:
+
+\c %macro get_GOT 0
+\c
+\c call %%getgot
+\c %%getgot:
+\c pop ebx
+\c add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
+\c
+\c %endmacro
+
+\S{piclocal} Finding Your Local Data Items
+
+Having got the GOT, you can then use it to obtain the addresses of
+your data items. Most variables will reside in the sections you have
+declared; they can be accessed using the \I{GOTOFF
+relocation}\c{..gotoff} special \I\c{WRT ..gotoff}\c{WRT} type. The
+way this works is like this:
+
+\c lea eax,[ebx+myvar wrt ..gotoff]
+
+The expression \c{myvar wrt ..gotoff} is calculated, when the shared
+library is linked, to be the offset to the local variable \c{myvar}
+from the beginning of the GOT. Therefore, adding it to \c{EBX} as
+above will place the real address of \c{myvar} in \c{EAX}.
+
+If you declare variables as \c{GLOBAL} without specifying a size for
+them, they are shared between code modules in the library, but do
+not get exported from the library to the program that loaded it.
+They will still be in your ordinary data and BSS sections, so you
+can access them in the same way as local variables, using the above
+\c{..gotoff} mechanism.
+
+Note that due to a peculiarity of the way BSD \c{a.out} format
+handles this relocation type, there must be at least one non-local
+symbol in the same section as the address you're trying to access.
+
+
+\S{picextern} Finding External and Common Data Items
+
+If your library needs to get at an external variable (external to
+the \e{library}, not just to one of the modules within it), you must
+use the \I{GOT relocations}\I\c{WRT ..got}\c{..got} type to get at
+it. The \c{..got} type, instead of giving you the offset from the
+GOT base to the variable, gives you the offset from the GOT base to
+a GOT \e{entry} containing the address of the variable. The linker
+will set up this GOT entry when it builds the library, and the
+dynamic linker will place the correct address in it at load time. So
+to obtain the address of an external variable \c{extvar} in \c{EAX},
+you would code
+
+\c mov eax,[ebx+extvar wrt ..got]
+
+This loads the address of \c{extvar} out of an entry in the GOT. The
+linker, when it builds the shared library, collects together every
+relocation of type \c{..got}, and builds the GOT so as to ensure it
+has every necessary entry present.
+
+Common variables must also be accessed in this way.
+
+
+\S{picglobal} Exporting Symbols to the Library User
+
+If you want to export symbols to the user of the library, you have
+to declare whether they are functions or data, and if they are data,
+you have to give the size of the data item. This is because the
+dynamic linker has to build \I{PLT}\i{procedure linkage table}
+entries for any exported functions, and also moves exported data
+items away from the library's data section in which they were
+declared.
+
+So to export a function to users of the library, you must use
+
+\c global func:function ; declare it as a function
+\c
+\c func: push ebp
+\c
+\c ; etc.
+
+And to export a data item such as an array, you would have to code
+
+\c global array:data array.end-array ; give the size too
+\c
+\c array: resd 128
+\c .end:
+
+Be careful: If you export a variable to the library user, by
+declaring it as \c{GLOBAL} and supplying a size, the variable will
+end up living in the data section of the main program, rather than
+in your library's data section, where you declared it. So you will
+have to access your own global variable with the \c{..got} mechanism
+rather than \c{..gotoff}, as if it were external (which,
+effectively, it has become).
+
+Equally, if you need to store the address of an exported global in
+one of your data sections, you can't do it by means of the standard
+sort of code:
+
+\c dataptr: dd global_data_item ; WRONG
+
+NASM will interpret this code as an ordinary relocation, in which
+\c{global_data_item} is merely an offset from the beginning of the
+\c{.data} section (or whatever); so this reference will end up
+pointing at your data section instead of at the exported global
+which resides elsewhere.
+
+Instead of the above code, then, you must write
+
+\c dataptr: dd global_data_item wrt ..sym
+
+which makes use of the special \c{WRT} type \I\c{WRT ..sym}\c{..sym}
+to instruct NASM to search the symbol table for a particular symbol
+at that address, rather than just relocating by section base.
+
+Either method will work for functions: referring to one of your
+functions by means of
+
+\c funcptr: dd my_function
+
+will give the user the address of the code you wrote, whereas
+
+\c funcptr: dd my_function wrt ..sym
+
+will give the address of the procedure linkage table for the
+function, which is where the calling program will \e{believe} the
+function lives. Either address is a valid way to call the function.
+
+
+\S{picproc} Calling Procedures Outside the Library
+
+Calling procedures outside your shared library has to be done by
+means of a \i\e{procedure linkage table}, or \i{PLT}. The PLT is
+placed at a known offset from where the library is loaded, so the
+library code can make calls to the PLT in a position-independent
+way. Within the PLT there is code to jump to offsets contained in
+the GOT, so function calls to other shared libraries or to routines
+in the main program can be transparently passed off to their real
+destinations.
+
+To call an external routine, you must use another special PIC
+relocation type, \I{PLT relocations}\i\c{WRT ..plt}. This is much
+easier than the GOT-based ones: you simply replace calls such as
+\c{CALL printf} with the PLT-relative version \c{CALL printf WRT
+..plt}.
+
+
+\S{link} Generating the Library File
+
+Having written some code modules and assembled them to \c{.o} files,
+you then generate your shared library with a command such as
+
+\c ld -shared -o library.so module1.o module2.o # for ELF
+\c ld -Bshareable -o library.so module1.o module2.o # for BSD
+
+For ELF, if your shared library is going to reside in system
+directories such as \c{/usr/lib} or \c{/lib}, it is usually worth
+using the \i\c{-soname} flag to the linker, to store the final
+library file name, with a version number, into the library:
+
+\c ld -shared -soname library.so.1 -o library.so.1.2 *.o
+
+You would then copy \c{library.so.1.2} into the library directory,
+and create \c{library.so.1} as a symbolic link to it.
+
+
+\C{mixsize} Mixing 16 and 32 Bit Code
+
+This chapter tries to cover some of the issues, largely related to
+unusual forms of addressing and jump instructions, encountered when
+writing operating system code such as protected-mode initialisation
+routines, which require code that operates in mixed segment sizes,
+such as code in a 16-bit segment trying to modify data in a 32-bit
+one, or jumps between different-size segments.
+
+
+\H{mixjump} Mixed-Size Jumps\I{jumps, mixed-size}
+
+\I{operating system, writing}\I{writing operating systems}The most
+common form of \i{mixed-size instruction} is the one used when
+writing a 32-bit OS: having done your setup in 16-bit mode, such as
+loading the kernel, you then have to boot it by switching into
+protected mode and jumping to the 32-bit kernel start address. In a
+fully 32-bit OS, this tends to be the \e{only} mixed-size
+instruction you need, since everything before it can be done in pure
+16-bit code, and everything after it can be pure 32-bit.
+
+This jump must specify a 48-bit far address, since the target
+segment is a 32-bit one. However, it must be assembled in a 16-bit
+segment, so just coding, for example,
+
+\c jmp 0x1234:0x56789ABC ; wrong!
+
+will not work, since the offset part of the address will be
+truncated to \c{0x9ABC} and the jump will be an ordinary 16-bit far
+one.
+
+The Linux kernel setup code gets round the inability of \c{as86} to
+generate the required instruction by coding it manually, using
+\c{DB} instructions. NASM can go one better than that, by actually
+generating the right instruction itself. Here's how to do it right:
+
+\c jmp dword 0x1234:0x56789ABC ; right
+
+\I\c{JMP DWORD}The \c{DWORD} prefix (strictly speaking, it should
+come \e{after} the colon, since it is declaring the \e{offset} field
+to be a doubleword; but NASM will accept either form, since both are
+unambiguous) forces the offset part to be treated as far, in the
+assumption that you are deliberately writing a jump from a 16-bit
+segment to a 32-bit one.
+
+You can do the reverse operation, jumping from a 32-bit segment to a
+16-bit one, by means of the \c{WORD} prefix:
+
+\c jmp word 0x8765:0x4321 ; 32 to 16 bit
+
+If the \c{WORD} prefix is specified in 16-bit mode, or the \c{DWORD}
+prefix in 32-bit mode, they will be ignored, since each is
+explicitly forcing NASM into a mode it was in anyway.
+
+
+\H{mixaddr} Addressing Between Different-Size Segments\I{addressing,
+mixed-size}\I{mixed-size addressing}
+
+If your OS is mixed 16 and 32-bit, or if you are writing a DOS
+extender, you are likely to have to deal with some 16-bit segments
+and some 32-bit ones. At some point, you will probably end up
+writing code in a 16-bit segment which has to access data in a
+32-bit segment, or vice versa.
+
+If the data you are trying to access in a 32-bit segment lies within
+the first 64K of the segment, you may be able to get away with using
+an ordinary 16-bit addressing operation for the purpose; but sooner
+or later, you will want to do 32-bit addressing from 16-bit mode.
+
+The easiest way to do this is to make sure you use a register for
+the address, since any effective address containing a 32-bit
+register is forced to be a 32-bit address. So you can do
+
+\c mov eax,offset_into_32_bit_segment_specified_by_fs
+\c mov dword [fs:eax],0x11223344
+
+This is fine, but slightly cumbersome (since it wastes an
+instruction and a register) if you already know the precise offset
+you are aiming at. The x86 architecture does allow 32-bit effective
+addresses to specify nothing but a 4-byte offset, so why shouldn't
+NASM be able to generate the best instruction for the purpose?
+
+It can. As in \k{mixjump}, you need only prefix the address with the
+\c{DWORD} keyword, and it will be forced to be a 32-bit address:
+
+\c mov dword [fs:dword my_offset],0x11223344
+
+Also as in \k{mixjump}, NASM is not fussy about whether the
+\c{DWORD} prefix comes before or after the segment override, so
+arguably a nicer-looking way to code the above instruction is
+
+\c mov dword [dword fs:my_offset],0x11223344
+
+Don't confuse the \c{DWORD} prefix \e{outside} the square brackets,
+which controls the size of the data stored at the address, with the
+one \c{inside} the square brackets which controls the length of the
+address itself. The two can quite easily be different:
+
+\c mov word [dword 0x12345678],0x9ABC
+
+This moves 16 bits of data to an address specified by a 32-bit
+offset.
+
+You can also specify \c{WORD} or \c{DWORD} prefixes along with the
+\c{FAR} prefix to indirect far jumps or calls. For example:
+
+\c call dword far [fs:word 0x4321]
+
+This instruction contains an address specified by a 16-bit offset;
+it loads a 48-bit far pointer from that (16-bit segment and 32-bit
+offset), and calls that address.
+
+
+\H{mixother} Other Mixed-Size Instructions
+
+The other way you might want to access data might be using the
+string instructions (\c{LODSx}, \c{STOSx} and so on) or the
+\c{XLATB} instruction. These instructions, since they take no
+parameters, might seem to have no easy way to make them perform
+32-bit addressing when assembled in a 16-bit segment.
+
+This is the purpose of NASM's \i\c{a16}, \i\c{a32} and \i\c{a64} prefixes. If
+you are coding \c{LODSB} in a 16-bit segment but it is supposed to
+be accessing a string in a 32-bit segment, you should load the
+desired address into \c{ESI} and then code
+
+\c a32 lodsb
+
+The prefix forces the addressing size to 32 bits, meaning that
+\c{LODSB} loads from \c{[DS:ESI]} instead of \c{[DS:SI]}. To access
+a string in a 16-bit segment when coding in a 32-bit one, the
+corresponding \c{a16} prefix can be used.
+
+The \c{a16}, \c{a32} and \c{a64} prefixes can be applied to any instruction
+in NASM's instruction table, but most of them can generate all the
+useful forms without them. The prefixes are necessary only for
+instructions with implicit addressing:
+\# \c{CMPSx} (\k{insCMPSB}),
+\# \c{SCASx} (\k{insSCASB}), \c{LODSx} (\k{insLODSB}), \c{STOSx}
+\# (\k{insSTOSB}), \c{MOVSx} (\k{insMOVSB}), \c{INSx} (\k{insINSB}),
+\# \c{OUTSx} (\k{insOUTSB}), and \c{XLATB} (\k{insXLATB}).
+\c{CMPSx}, \c{SCASx}, \c{LODSx}, \c{STOSx}, \c{MOVSx}, \c{INSx},
+\c{OUTSx}, and \c{XLATB}.
+Also, the
+various push and pop instructions (\c{PUSHA} and \c{POPF} as well as
+the more usual \c{PUSH} and \c{POP}) can accept \c{a16}, \c{a32} or \c{a64}
+prefixes to force a particular one of \c{SP}, \c{ESP} or \c{RSP} to be used
+as a stack pointer, in case the stack segment in use is a different
+size from the code segment.
+
+\c{PUSH} and \c{POP}, when applied to segment registers in 32-bit
+mode, also have the slightly odd behaviour that they push and pop 4
+bytes at a time, of which the top two are ignored and the bottom two
+give the value of the segment register being manipulated. To force
+the 16-bit behaviour of segment-register push and pop instructions,
+you can use the operand-size prefix \i\c{o16}:
+
+\c o16 push ss
+\c o16 push ds
+
+This code saves a doubleword of stack space by fitting two segment
+registers into the space which would normally be consumed by pushing
+one.
+
+(You can also use the \i\c{o32} prefix to force the 32-bit behaviour
+when in 16-bit mode, but this seems less useful.)
+
+
+\C{64bit} Writing 64-bit Code (Unix, Win64)
+
+This chapter attempts to cover some of the common issues involved when
+writing 64-bit code, to run under \i{Win64} or Unix. It covers how to
+write assembly code to interface with 64-bit C routines, and how to
+write position-independent code for shared libraries.
+
+All 64-bit code uses a flat memory model, since segmentation is not
+available in 64-bit mode. The one exception is the \c{FS} and \c{GS}
+registers, which still add their bases.
+
+Position independence in 64-bit mode is significantly simpler, since
+the processor supports \c{RIP}-relative addressing directly; see the
+\c{REL} keyword (\k{effaddr}). On most 64-bit platforms, it is
+probably desirable to make that the default, using the directive
+\c{DEFAULT REL} (\k{default}).
+
+64-bit programming is relatively similar to 32-bit programming, but
+of course pointers are 64 bits long; additionally, all existing
+platforms pass arguments in registers rather than on the stack.
+Furthermore, 64-bit platforms use SSE2 by default for floating point.
+Please see the ABI documentation for your platform.
+
+64-bit platforms differ in the sizes of the C/C++ fundamental
+datatypes, not just from 32-bit platforms but from each other. If a
+specific size data type is desired, it is probably best to use the
+types defined in the standard C header \c{<inttypes.h>}.
+
+All known 64-bit platforms except some embedded platforms require that
+the stack is 16-byte aligned at the entry to a function. In order to
+enforce that, the stack pointer (\c{RSP}) needs to be aligned on an
+\c{odd} multiple of 8 bytes before the \c{CALL} instruction.
+
+In 64-bit mode, the default instruction size is still 32 bits. When
+loading a value into a 32-bit register (but not an 8- or 16-bit
+register), the upper 32 bits of the corresponding 64-bit register are
+set to zero.
+
+\H{reg64} Register Names in 64-bit Mode
+
+NASM uses the following names for general-purpose registers in 64-bit
+mode, for 8-, 16-, 32- and 64-bit references, respectively:
+
+\c AL/AH, CL/CH, DL/DH, BL/BH, SPL, BPL, SIL, DIL, R8B-R15B
+\c AX, CX, DX, BX, SP, BP, SI, DI, R8W-R15W
+\c EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D-R15D
+\c RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15
+
+This is consistent with the AMD documentation and most other
+assemblers. The Intel documentation, however, uses the names
+\c{R8L-R15L} for 8-bit references to the higher registers. It is
+possible to use those names by definiting them as macros; similarly,
+if one wants to use numeric names for the low 8 registers, define them
+as macros. The standard macro package \c{altreg} (see \k{pkg_altreg})
+can be used for this purpose.
+
+\H{id64} Immediates and Displacements in 64-bit Mode
+
+In 64-bit mode, immediates and displacements are generally only 32
+bits wide. NASM will therefore truncate most displacements and
+immediates to 32 bits.
+
+The only instruction which takes a full \i{64-bit immediate} is:
+
+\c MOV reg64,imm64
+
+NASM will produce this instruction whenever the programmer uses
+\c{MOV} with an immediate into a 64-bit register. If this is not
+desirable, simply specify the equivalent 32-bit register, which will
+be automatically zero-extended by the processor, or specify the
+immediate as \c{DWORD}:
+
+\c mov rax,foo ; 64-bit immediate
+\c mov rax,qword foo ; (identical)
+\c mov eax,foo ; 32-bit immediate, zero-extended
+\c mov rax,dword foo ; 32-bit immediate, sign-extended
+
+The length of these instructions are 10, 5 and 7 bytes, respectively.
+
+If optimization is enabled and NASM can determine at assembly time
+that a shorter instruction will suffice, the shorter instruction will
+be emitted unless of course \c{STRICT QWORD} or \c{STRICT DWORD} is
+specified (see \k{strict}):
+
+\c mov rax,1 ; Assembles as "mov eax,1" (5 bytes)
+\c mov rax,strict qword 1 ; Full 10-byte instruction
+\c mov rax,strict dword 1 ; 7-byte instruction
+\c mov rax,symbol ; 10 bytes, not known at assembly time
+\c lea rax,[rel symbol] ; 7 bytes, usually preferred by the ABI
+
+Note that \c{lea rax,[rel symbol]} is position-independent, whereas
+\c{mov rax,symbol} is not. Most ABIs prefer or even require
+position-independent code in 64-bit mode. However, the \c{MOV}
+instruction is able to reference a symbol anywhere in the 64-bit
+address space, whereas \c{LEA} is only able to access a symbol within
+within 2 GB of the instruction itself (see below.)
+
+The only instructions which take a full \I{64-bit displacement}64-bit
+\e{displacement} is loading or storing, using \c{MOV}, \c{AL}, \c{AX},
+\c{EAX} or \c{RAX} (but no other registers) to an absolute 64-bit address.
+Since this is a relatively rarely used instruction (64-bit code generally uses
+relative addressing), the programmer has to explicitly declare the
+displacement size as \c{ABS QWORD}:
+
+\c default abs
+\c
+\c mov eax,[foo] ; 32-bit absolute disp, sign-extended
+\c mov eax,[a32 foo] ; 32-bit absolute disp, zero-extended
+\c mov eax,[qword foo] ; 64-bit absolute disp
+\c
+\c default rel
+\c
+\c mov eax,[foo] ; 32-bit relative disp
+\c mov eax,[a32 foo] ; d:o, address truncated to 32 bits(!)
+\c mov eax,[qword foo] ; error
+\c mov eax,[abs qword foo] ; 64-bit absolute disp
+
+A sign-extended absolute displacement can access from -2 GB to +2 GB;
+a zero-extended absolute displacement can access from 0 to 4 GB.
+
+\H{unix64} Interfacing to 64-bit C Programs (Unix)
+
+On Unix, the 64-bit ABI as well as the x32 ABI (32-bit ABI with the
+CPU in 64-bit mode) is defined by the documents at:
+
+\W{http://www.nasm.us/abi/unix64}\c{http://www.nasm.us/abi/unix64}
+
+Although written for AT&T-syntax assembly, the concepts apply equally
+well for NASM-style assembly. What follows is a simplified summary.
+
+The first six integer arguments (from the left) are passed in \c{RDI},
+\c{RSI}, \c{RDX}, \c{RCX}, \c{R8}, and \c{R9}, in that order.
+Additional integer arguments are passed on the stack. These
+registers, plus \c{RAX}, \c{R10} and \c{R11} are destroyed by function
+calls, and thus are available for use by the function without saving.
+
+Integer return values are passed in \c{RAX} and \c{RDX}, in that order.
+
+Floating point is done using SSE registers, except for \c{long
+double}, which is 80 bits (\c{TWORD}) on most platforms (Android is
+one exception; there \c{long double} is 64 bits and treated the same
+as \c{double}.) Floating-point arguments are passed in \c{XMM0} to
+\c{XMM7}; return is \c{XMM0} and \c{XMM1}. \c{long double} are passed
+on the stack, and returned in \c{ST0} and \c{ST1}.
+
+All SSE and x87 registers are destroyed by function calls.
+
+On 64-bit Unix, \c{long} is 64 bits.
+
+Integer and SSE register arguments are counted separately, so for the case of
+
+\c void foo(long a, double b, int c)
+
+\c{a} is passed in \c{RDI}, \c{b} in \c{XMM0}, and \c{c} in \c{ESI}.
+
+\H{win64} Interfacing to 64-bit C Programs (Win64)
+
+The Win64 ABI is described by the document at:
+
+\W{http://www.nasm.us/abi/win64}\c{http://www.nasm.us/abi/win64}
+
+What follows is a simplified summary.
+
+The first four integer arguments are passed in \c{RCX}, \c{RDX},
+\c{R8} and \c{R9}, in that order. Additional integer arguments are
+passed on the stack. These registers, plus \c{RAX}, \c{R10} and
+\c{R11} are destroyed by function calls, and thus are available for
+use by the function without saving.
+
+Integer return values are passed in \c{RAX} only.
+
+Floating point is done using SSE registers, except for \c{long
+double}. Floating-point arguments are passed in \c{XMM0} to \c{XMM3};
+return is \c{XMM0} only.
+
+On Win64, \c{long} is 32 bits; \c{long long} or \c{_int64} is 64 bits.
+
+Integer and SSE register arguments are counted together, so for the case of
+
+\c void foo(long long a, double b, int c)
+
+\c{a} is passed in \c{RCX}, \c{b} in \c{XMM1}, and \c{c} in \c{R8D}.
+
+\C{trouble} Troubleshooting
+
+This chapter describes some of the common problems that users have
+been known to encounter with NASM, and answers them. If you think you
+have found a bug in NASM, please see \k{bugs}.
+
+
+\H{problems} Common Problems
+
+\S{inefficient} NASM Generates \i{Inefficient Code}
+
+We sometimes get `bug' reports about NASM generating inefficient, or
+even `wrong', code on instructions such as \c{ADD ESP,8}. This is a
+deliberate design feature, connected to predictability of output:
+NASM, on seeing \c{ADD ESP,8}, will generate the form of the
+instruction which leaves room for a 32-bit offset. You need to code
+\I\c{BYTE}\c{ADD ESP,BYTE 8} if you want the space-efficient form of
+the instruction. This isn't a bug, it's user error: if you prefer to
+have NASM produce the more efficient code automatically enable
+optimization with the \c{-O} option (see \k{opt-O}).
+
+
+\S{jmprange} My Jumps are Out of Range\I{out of range, jumps}
+
+Similarly, people complain that when they issue \i{conditional
+jumps} (which are \c{SHORT} by default) that try to jump too far,
+NASM reports `short jump out of range' instead of making the jumps
+longer.
+
+This, again, is partly a predictability issue, but in fact has a
+more practical reason as well. NASM has no means of being told what
+type of processor the code it is generating will be run on; so it
+cannot decide for itself that it should generate \i\c{Jcc NEAR} type
+instructions, because it doesn't know that it's working for a 386 or
+above. Alternatively, it could replace the out-of-range short
+\c{JNE} instruction with a very short \c{JE} instruction that jumps
+over a \c{JMP NEAR}; this is a sensible solution for processors
+below a 386, but hardly efficient on processors which have good
+branch prediction \e{and} could have used \c{JNE NEAR} instead. So,
+once again, it's up to the user, not the assembler, to decide what
+instructions should be generated. See \k{opt-O}.
+
+
+\S{proborg} \i\c{ORG} Doesn't Work
+
+People writing \i{boot sector} programs in the \c{bin} format often
+complain that \c{ORG} doesn't work the way they'd like: in order to
+place the \c{0xAA55} signature word at the end of a 512-byte boot
+sector, people who are used to MASM tend to code
+
+\c ORG 0
+\c
+\c ; some boot sector code
+\c
+\c ORG 510
+\c DW 0xAA55
+
+This is not the intended use of the \c{ORG} directive in NASM, and
+will not work. The correct way to solve this problem in NASM is to
+use the \i\c{TIMES} directive, like this:
+
+\c ORG 0
+\c
+\c ; some boot sector code
+\c
+\c TIMES 510-($-$$) DB 0
+\c DW 0xAA55
+
+The \c{TIMES} directive will insert exactly enough zero bytes into
+the output to move the assembly point up to 510. This method also
+has the advantage that if you accidentally fill your boot sector too
+full, NASM will catch the problem at assembly time and report it, so
+you won't end up with a boot sector that you have to disassemble to
+find out what's wrong with it.
+
+
+\S{probtimes} \i\c{TIMES} Doesn't Work
+
+The other common problem with the above code is people who write the
+\c{TIMES} line as
+
+\c TIMES 510-$ DB 0
+
+by reasoning that \c{$} should be a pure number, just like 510, so
+the difference between them is also a pure number and can happily be
+fed to \c{TIMES}.
+
+NASM is a \e{modular} assembler: the various component parts are
+designed to be easily separable for re-use, so they don't exchange
+information unnecessarily. In consequence, the \c{bin} output
+format, even though it has been told by the \c{ORG} directive that
+the \c{.text} section should start at 0, does not pass that
+information back to the expression evaluator. So from the
+evaluator's point of view, \c{$} isn't a pure number: it's an offset
+from a section base. Therefore the difference between \c{$} and 510
+is also not a pure number, but involves a section base. Values
+involving section bases cannot be passed as arguments to \c{TIMES}.
+
+The solution, as in the previous section, is to code the \c{TIMES}
+line in the form
+
+\c TIMES 510-($-$$) DB 0
+
+in which \c{$} and \c{$$} are offsets from the same section base,
+and so their difference is a pure number. This will solve the
+problem and generate sensible code.
+
+\A{ndisasm} \i{Ndisasm}
+
+ The Netwide Disassembler, NDISASM
+
+\H{ndisintro} Introduction
+
+
+The Netwide Disassembler is a small companion program to the Netwide
+Assembler, NASM. It seemed a shame to have an x86 assembler,
+complete with a full instruction table, and not make as much use of
+it as possible, so here's a disassembler which shares the
+instruction table (and some other bits of code) with NASM.
+
+The Netwide Disassembler does nothing except to produce
+disassemblies of \e{binary} source files. NDISASM does not have any
+understanding of object file formats, like \c{objdump}, and it will
+not understand \c{DOS .EXE} files like \c{debug} will. It just
+disassembles.
+
+
+\H{ndisrun} Running NDISASM
+
+To disassemble a file, you will typically use a command of the form
+
+\c ndisasm -b {16|32|64} filename
+
+NDISASM can disassemble 16-, 32- or 64-bit code equally easily,
+provided of course that you remember to specify which it is to work
+with. If no \i\c{-b} switch is present, NDISASM works in 16-bit mode
+by default. The \i\c{-u} switch (for USE32) also invokes 32-bit mode.
+
+Two more command line options are \i\c{-r} which reports the version
+number of NDISASM you are running, and \i\c{-h} which gives a short
+summary of command line options.
+
+
+\S{ndiscom} COM Files: Specifying an Origin
+
+To disassemble a \c{DOS .COM} file correctly, a disassembler must assume
+that the first instruction in the file is loaded at address \c{0x100},
+rather than at zero. NDISASM, which assumes by default that any file
+you give it is loaded at zero, will therefore need to be informed of
+this.
+
+The \i\c{-o} option allows you to declare a different origin for the
+file you are disassembling. Its argument may be expressed in any of
+the NASM numeric formats: decimal by default, if it begins with `\c{$}'
+or `\c{0x}' or ends in `\c{H}' it's \c{hex}, if it ends in `\c{Q}' it's
+\c{octal}, and if it ends in `\c{B}' it's \c{binary}.
+
+Hence, to disassemble a \c{.COM} file:
+
+\c ndisasm -o100h filename.com
+
+will do the trick.
+
+
+\S{ndissync} Code Following Data: Synchronisation
+
+Suppose you are disassembling a file which contains some data which
+isn't machine code, and \e{then} contains some machine code. NDISASM
+will faithfully plough through the data section, producing machine
+instructions wherever it can (although most of them will look
+bizarre, and some may have unusual prefixes, e.g. `\c{FS OR AX,0x240A}'),
+and generating `DB' instructions ever so often if it's totally stumped.
+Then it will reach the code section.
+
+Supposing NDISASM has just finished generating a strange machine
+instruction from part of the data section, and its file position is
+now one byte \e{before} the beginning of the code section. It's
+entirely possible that another spurious instruction will get
+generated, starting with the final byte of the data section, and
+then the correct first instruction in the code section will not be
+seen because the starting point skipped over it. This isn't really
+ideal.
+
+To avoid this, you can specify a `\i\c{synchronisation}' point, or indeed
+as many synchronisation points as you like (although NDISASM can
+only handle 2147483647 sync points internally). The definition of a sync
+point is this: NDISASM guarantees to hit sync points exactly during
+disassembly. If it is thinking about generating an instruction which
+would cause it to jump over a sync point, it will discard that
+instruction and output a `\c{db}' instead. So it \e{will} start
+disassembly exactly from the sync point, and so you \e{will} see all
+the instructions in your code section.
+
+Sync points are specified using the \i\c{-s} option: they are measured
+in terms of the program origin, not the file position. So if you
+want to synchronize after 32 bytes of a \c{.COM} file, you would have to
+do
+
+\c ndisasm -o100h -s120h file.com
+
+rather than
+
+\c ndisasm -o100h -s20h file.com
+
+As stated above, you can specify multiple sync markers if you need
+to, just by repeating the \c{-s} option.
+
+
+\S{ndisisync} Mixed Code and Data: Automatic (Intelligent) Synchronisation
+\I\c{auto-sync}
+
+Suppose you are disassembling the boot sector of a \c{DOS} floppy (maybe
+it has a virus, and you need to understand the virus so that you
+know what kinds of damage it might have done you). Typically, this
+will contain a \c{JMP} instruction, then some data, then the rest of the
+code. So there is a very good chance of NDISASM being \e{misaligned}
+when the data ends and the code begins. Hence a sync point is
+needed.
+
+On the other hand, why should you have to specify the sync point
+manually? What you'd do in order to find where the sync point would
+be, surely, would be to read the \c{JMP} instruction, and then to use
+its target address as a sync point. So can NDISASM do that for you?
+
+The answer, of course, is yes: using either of the synonymous
+switches \i\c{-a} (for automatic sync) or \i\c{-i} (for intelligent
+sync) will enable \c{auto-sync} mode. Auto-sync mode automatically
+generates a sync point for any forward-referring PC-relative jump or
+call instruction that NDISASM encounters. (Since NDISASM is one-pass,
+if it encounters a PC-relative jump whose target has already been
+processed, there isn't much it can do about it...)
+
+Only PC-relative jumps are processed, since an absolute jump is
+either through a register (in which case NDISASM doesn't know what
+the register contains) or involves a segment address (in which case
+the target code isn't in the same segment that NDISASM is working
+in, and so the sync point can't be placed anywhere useful).
+
+For some kinds of file, this mechanism will automatically put sync
+points in all the right places, and save you from having to place
+any sync points manually. However, it should be stressed that
+auto-sync mode is \e{not} guaranteed to catch all the sync points, and
+you may still have to place some manually.
+
+Auto-sync mode doesn't prevent you from declaring manual sync
+points: it just adds automatically generated ones to the ones you
+provide. It's perfectly feasible to specify \c{-i} \e{and} some \c{-s}
+options.
+
+Another caveat with auto-sync mode is that if, by some unpleasant
+fluke, something in your data section should disassemble to a
+PC-relative call or jump instruction, NDISASM may obediently place a
+sync point in a totally random place, for example in the middle of
+one of the instructions in your code section. So you may end up with
+a wrong disassembly even if you use auto-sync. Again, there isn't
+much I can do about this. If you have problems, you'll have to use
+manual sync points, or use the \c{-k} option (documented below) to
+suppress disassembly of the data area.
+
+
+\S{ndisother} Other Options
+
+The \i\c{-e} option skips a header on the file, by ignoring the first N
+bytes. This means that the header is \e{not} counted towards the
+disassembly offset: if you give \c{-e10 -o10}, disassembly will start
+at byte 10 in the file, and this will be given offset 10, not 20.
+
+The \i\c{-k} option is provided with two comma-separated numeric
+arguments, the first of which is an assembly offset and the second
+is a number of bytes to skip. This \e{will} count the skipped bytes
+towards the assembly offset: its use is to suppress disassembly of a
+data section which wouldn't contain anything you wanted to see
+anyway.
+
+
+\A{inslist} \i{Instruction List}
+
+\H{inslistintro} Introduction
+
+The following sections show the instructions which NASM currently supports. For each
+instruction, there is a separate entry for each supported addressing mode. The third
+column shows the processor type in which the instruction was introduced and,
+ when appropriate, one or more usage flags.
+
+\& inslist.src
+
+\A{changelog} \i{NASM Version History}
+
+\& changes.src
+
+\A{source} Building NASM from Source
+
+The source code for NASM is available from our website,
+\W{http://www.nasm.us/}{http://wwww.nasm.us/}, see \k{website}.
+
+\H{tarball} Building from a Source Archive
+
+The source archives available on the web site should be capable of
+building on a number of platforms. This is the recommended method for
+building NASM to support platforms for which executables are not
+available.
+
+On a system which has Unix shell (\c{sh}), run:
+
+\c sh configure
+\c make everything
+
+A number of options can be passed to \c{configure}; see
+\c{sh configure --help}.
+
+A set of Makefiles for some other environments are also available;
+please see the file \c{Mkfiles/README}.
+
+To build the installer for the Windows platform, you will need the
+\i\e{Nullsoft Scriptable Installer}, \i{NSIS}, installed.
+
+To build the documentation, you will need a set of additional tools.
+The documentation is not likely to be able to build on non-Unix
+systems.
+
+\H{git} Building from the \i\c{git} Repository
+
+The NASM development tree is kept in a source code repository using
+the \c{git} distributed source control system. The link is available
+on the website. This is recommended only to participate in the
+development of NASM or to assist with testing the development code.
+
+To build NASM from the \c{git} repository you will need a Perl and, if
+building on a Unix system, GNU autoconf.
+
+To build on a Unix system, run:
+
+\c sh autogen.sh
+
+to create the \c{configure} script and then build as listed above.
+
+\A{contact} Contact Information
+
+\H{website} Website
+
+NASM has a \i{website} at
+\W{http://www.nasm.us/}\c{http://www.nasm.us/}.
+
+\i{New releases}, \i{release candidates}, and \I{snapshots, daily
+development}\i{daily development snapshots} of NASM are available from
+the official web site in source form as well as binaries for a number
+of common platforms.
+
+\S{forums} User Forums
+
+Users of NASM may find the Forums on the website useful. These are,
+however, not frequented much by the developers of NASM, so they are
+not suitable for reporting bugs.
+
+\S{develcom} Development Community
+
+The development of NASM is coordinated primarily though the
+\i\c{nasm-devel} mailing list. If you wish to participate in
+development of NASM, please join this mailing list. Subscription
+links and archives of past posts are available on the website.
+
+\H{bugs} \i{Reporting Bugs}\I{bugs}
+
+To report bugs in NASM, please use the \i{bug tracker} at
+\W{http://www.nasm.us/}\c{http://www.nasm.us/} (click on "Bug
+Tracker"), or if that fails then through one of the contacts in
+\k{website}.
+
+Please read \k{qstart} first, and don't report the bug if it's
+listed in there as a deliberate feature. (If you think the feature
+is badly thought out, feel free to send us reasons why you think it
+should be changed, but don't just send us mail saying `This is a
+bug' if the documentation says we did it on purpose.) Then read
+\k{problems}, and don't bother reporting the bug if it's listed
+there.
+
+If you do report a bug, \e{please} make sure your bug report includes
+the following information:
+
+\b What operating system you're running NASM under. Linux,
+FreeBSD, NetBSD, MacOS X, Win16, Win32, Win64, MS-DOS, OS/2, VMS,
+whatever.
+
+\b If you compiled your own executable from a source archive, compiled
+your own executable from \c{git}, used the standard distribution
+binaries from the website, or got an executable from somewhere else
+(e.g. a Linux distribution.) If you were using a locally built
+executable, try to reproduce the problem using one of the standard
+binaries, as this will make it easier for us to reproduce your problem
+prior to fixing it.
+
+\b Which version of NASM you're using, and exactly how you invoked
+it. Give us the precise command line, and the contents of the
+\c{NASMENV} environment variable if any.
+
+\b Which versions of any supplementary programs you're using, and
+how you invoked them. If the problem only becomes visible at link
+time, tell us what linker you're using, what version of it you've
+got, and the exact linker command line. If the problem involves
+linking against object files generated by a compiler, tell us what
+compiler, what version, and what command line or options you used.
+(If you're compiling in an IDE, please try to reproduce the problem
+with the command-line version of the compiler.)
+
+\b If at all possible, send us a NASM source file which exhibits the
+problem. If this causes copyright problems (e.g. you can only
+reproduce the bug in restricted-distribution code) then bear in mind
+the following two points: firstly, we guarantee that any source code
+sent to us for the purposes of debugging NASM will be used \e{only}
+for the purposes of debugging NASM, and that we will delete all our
+copies of it as soon as we have found and fixed the bug or bugs in
+question; and secondly, we would prefer \e{not} to be mailed large
+chunks of code anyway. The smaller the file, the better. A
+three-line sample file that does nothing useful \e{except}
+demonstrate the problem is much easier to work with than a
+fully fledged ten-thousand-line program. (Of course, some errors
+\e{do} only crop up in large files, so this may not be possible.)
+
+\b A description of what the problem actually \e{is}. `It doesn't
+work' is \e{not} a helpful description! Please describe exactly what
+is happening that shouldn't be, or what isn't happening that should.
+Examples might be: `NASM generates an error message saying Line 3
+for an error that's actually on Line 5'; `NASM generates an error
+message that I believe it shouldn't be generating at all'; `NASM
+fails to generate an error message that I believe it \e{should} be
+generating'; `the object file produced from this source code crashes
+my linker'; `the ninth byte of the output file is 66 and I think it
+should be 77 instead'.
+
+\b If you believe the output file from NASM to be faulty, send it to
+us. That allows us to determine whether our own copy of NASM
+generates the same file, or whether the problem is related to
+portability issues between our development platforms and yours. We
+can handle binary files mailed to us as MIME attachments, uuencoded,
+and even BinHex. Alternatively, we may be able to provide an FTP
+site you can upload the suspect files to; but mailing them is easier
+for us.
+
+\b Any other information or data files that might be helpful. If,
+for example, the problem involves NASM failing to generate an object
+file while TASM can generate an equivalent file without trouble,
+then send us \e{both} object files, so we can see what TASM is doing
+differently from us.
diff --git a/doc/nasmlogo.eps b/doc/nasmlogo.eps
new file mode 100644
index 00000000..9ec29194
--- /dev/null
+++ b/doc/nasmlogo.eps
@@ -0,0 +1,212 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.10.2 (http://cairographics.org)
+%%CreationDate: Sun Feb 26 02:08:42 2012
+%%Pages: 1
+%%BoundingBox: 44 42 306 306
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+/cairo_eps_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+ 0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+ { globaldict begin /?pdfmark /pop load def /pdfmark
+ /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+ {
+ dup
+ type /stringtype eq
+ { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+ } forall
+ currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+ cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+ { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+ /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+ /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+ cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 44 42 306 306
+%%EndPageSetup
+q 44 42 262 264 rectclip q
+0.501961 g
+279.656 304.422 m 265.238 304.422 253.559 292.734 253.559 278.32 c
+253.559 273.254 255.023 268.539 257.523 264.535 c 240.906 247.918 l
+220.031 266.812 192.352 278.32 161.977 278.32 c 96.988 278.32 44.297
+225.633 44.297 160.64 c 44.297 95.648 96.988 42.965 161.977 42.965 c
+226.969 42.965 279.656 95.648 279.656 160.64 c 279.656 191.012 268.145
+218.695 249.254 239.574 c 265.871 256.191 l 269.875 253.691 274.59
+252.223 279.66 252.223 c 294.07 252.223 305.754 263.906 305.754 278.32
+c 305.754 292.73 294.07 304.422 279.656 304.422 c h
+279.656 304.422 m f
+1 g
+107.184 140.832 m 107 140.492 106.547 140.324 105.816 140.324 c 97.219
+140.324 l 96.07 140.324 95.5 140.871 95.5 141.965 c 95.5 145.406 95.508
+148.82 95.535 152.207 c 95.562 155.594 95.574 159.008 95.574 162.445 c
+95.574 164.637 95.195 166.187 94.441 167.098 c 93.684 168.008 92.469
+168.465 90.805 168.465 c 89.555 168.465 88.199 168.164 86.742 167.566 c
+85.281 166.965 84.086 166.508 83.145 166.195 c 83.145 141.965 l 83.145
+141.547 83.051 141.172 82.871 140.828 c 82.688 140.492 82.234 140.324
+81.504 140.324 c 72.984 140.324 l 72.309 140.324 71.852 140.465 71.617
+140.754 c 71.379 141.039 71.266 141.445 71.266 141.965 c 71.266 177.14
+l 71.266 177.664 71.379 178.078 71.617 178.39 c 71.852 178.703 72.309
+178.863 72.984 178.863 c 81.504 178.863 l 82.23 178.863 82.688 178.676
+82.871 178.312 c 83.055 177.949 83.145 177.558 83.145 177.14 c 83.145
+175.265 l 83.195 175.265 83.238 175.25 83.262 175.226 c 83.289 175.199
+83.324 175.187 83.379 175.187 c 85.098 176.492 87.105 177.547 89.398
+178.351 c 91.688 179.16 93.773 179.566 95.648 179.566 c 98.414 179.566
+100.59 179.109 102.176 178.199 c 103.77 177.285 104.953 176.086 105.734
+174.601 c 106.52 173.117 106.996 171.461 107.18 169.637 c 107.363
+167.812 107.453 165.988 107.453 164.168 c 107.453 141.965 l 107.461
+141.547 107.367 141.172 107.184 140.832 c h
+107.184 140.832 m f
+137.324 145.015 m 136.281 144.078 135.16 143.269 133.965 142.594 c
+132.766 141.914 131.543 141.355 130.289 140.914 c 129.039 140.469
+127.812 140.16 126.613 139.976 c 125.414 139.793 124.32 139.703 123.332
+139.703 c 121.039 139.703 119.176 140.027 117.742 140.68 c 116.309
+141.328 115.199 142.18 114.422 143.223 c 113.637 144.262 113.102
+145.473 112.82 146.855 c 112.531 148.234 112.391 149.68 112.391 151.195
+c 112.336 153.594 112.66 155.621 113.367 157.293 c 114.07 158.961
+115.074 160.301 116.375 161.316 c 117.68 162.332 119.27 163.066 121.145
+163.508 c 123.02 163.949 125.105 164.172 127.398 164.172 c 136.391
+164.172 l 136.391 165.422 l 136.391 166.254 136.293 166.961 136.117
+167.531 c 135.93 168.105 135.594 168.574 135.102 168.937 c 134.605
+169.305 133.914 169.578 133.027 169.762 c 132.141 169.941 130.969
+170.035 129.512 170.035 c 128.938 170.035 128.219 170.008 127.359
+169.957 c 126.5 169.902 125.605 169.851 124.664 169.797 c 123.727
+169.746 122.785 169.668 121.848 169.562 c 120.91 169.461 120.051
+169.379 119.27 169.328 c 118.176 169.226 117.457 169.226 117.121
+169.328 c 116.781 169.433 116.508 169.879 116.301 170.66 c 115.441
+174.723 l 115.336 175.398 115.43 175.957 115.715 176.402 c 116 176.844
+116.742 177.301 117.941 177.769 c 118.828 178.086 119.855 178.355
+121.031 178.594 c 122.203 178.828 123.402 179.023 124.625 179.18 c
+125.852 179.336 127.062 179.453 128.262 179.531 c 129.461 179.609
+130.504 179.644 131.391 179.644 c 135.035 179.644 137.969 179.308
+140.184 178.629 c 142.398 177.953 144.09 176.988 145.266 175.738 c
+146.438 174.488 147.203 172.949 147.57 171.125 c 147.934 169.301
+148.117 167.219 148.117 164.871 c 148.117 152.523 l 148.117 151.687
+148.156 151.035 148.238 150.566 c 148.312 150.098 148.457 149.746
+148.664 149.512 c 148.871 149.277 149.16 149.105 149.523 149.004 c
+149.887 148.898 150.383 148.82 151.008 148.769 c 151.688 148.715
+152.129 148.598 152.336 148.418 c 152.547 148.234 152.652 147.91
+152.652 147.441 c 152.652 142.433 l 152.652 141.394 151.895 140.715
+150.383 140.402 c 148.926 140.039 147.309 139.855 145.535 139.855 c
+143.609 139.855 141.914 140.183 140.453 140.832 c 138.996 141.484
+138.004 142.851 137.484 144.937 c h
+136.152 156.586 m 129.121 156.586 l 127.66 156.586 126.512 156.246
+125.68 155.57 c 124.844 154.89 124.426 153.637 124.426 151.816 c
+124.426 150.617 124.676 149.781 125.172 149.316 c 125.664 148.848
+126.59 148.609 127.945 148.609 c 129.145 148.609 130.539 148.894
+132.129 149.469 c 133.719 150.039 135.062 150.668 136.156 151.344 c
+136.156 156.586 l h
+136.152 156.586 m f
+187.52 152.488 m 187.52 150.043 187.035 148 186.074 146.367 c 185.105
+144.726 183.82 143.414 182.203 142.426 c 180.586 141.437 178.746
+140.726 176.691 140.281 c 174.633 139.844 172.484 139.621 170.242
+139.621 c 169.305 139.621 168.289 139.66 167.195 139.734 c 166.102
+139.812 164.992 139.93 163.875 140.082 c 162.754 140.238 161.684
+140.418 160.668 140.629 c 159.652 140.832 158.754 141.066 157.969
+141.328 c 156.668 141.793 155.832 142.269 155.469 142.762 c 155.105
+143.25 155.051 144.015 155.312 145.047 c 156.172 148.769 l 156.328
+149.496 156.562 149.941 156.879 150.094 c 157.191 150.254 157.789
+150.254 158.676 150.094 c 160.5 149.781 162.477 149.535 164.613 149.351
+c 166.754 149.168 168.5 149.078 169.855 149.078 c 171.832 149.078
+173.238 149.301 174.074 149.746 c 174.91 150.191 175.324 150.933
+175.324 151.98 c 175.324 153.129 175.012 153.898 174.391 154.293 c
+173.762 154.683 172.617 154.984 170.949 155.191 c 168.812 155.508
+166.816 155.875 164.965 156.289 c 163.117 156.707 161.488 157.336
+160.082 158.172 c 158.676 159.008 157.57 160.133 156.758 161.543 c
+155.949 162.953 155.551 164.808 155.551 167.105 c 155.551 169.195
+155.949 171.023 156.754 172.59 c 157.551 174.156 158.652 175.465
+160.051 176.508 c 161.449 177.555 163.121 178.336 165.066 178.859 c
+167.004 179.383 169.125 179.64 171.418 179.64 c 172.305 179.64 173.281
+179.601 174.352 179.523 c 175.418 179.445 176.5 179.34 177.594 179.211
+c 178.688 179.078 179.746 178.906 180.762 178.699 c 181.777 178.484
+182.703 178.226 183.535 177.91 c 184.578 177.543 185.348 177.16 185.84
+176.765 c 186.336 176.371 186.453 175.676 186.191 174.676 c 185.332
+170.656 l 185.125 169.926 184.906 169.48 184.668 169.324 c 184.434
+169.168 183.875 169.14 182.988 169.246 c 182.102 169.351 181.141
+169.465 180.098 169.598 c 179.055 169.726 178.027 169.832 177.012
+169.91 c 175.996 169.988 175.039 170.055 174.156 170.105 c 173.27
+170.156 172.516 170.183 171.891 170.183 c 169.91 170.234 168.668
+170.012 168.176 169.519 c 167.68 169.027 167.434 168.363 167.434
+167.531 c 167.434 166.543 167.891 165.91 168.809 165.625 c 169.723
+165.336 170.887 165.066 172.301 164.805 c 174.34 164.547 176.273
+164.219 178.105 163.832 c 179.938 163.441 181.547 162.805 182.934
+161.922 c 184.316 161.035 185.43 159.855 186.266 158.371 c 187.102
+156.89 187.52 154.93 187.52 152.488 c h
+187.52 152.488 m f
+250.336 140.832 m 250.152 140.492 249.723 140.324 249.047 140.324 c
+240.449 140.324 l 239.77 140.324 239.312 140.469 239.078 140.754 c
+238.844 141.039 238.727 141.445 238.727 141.965 c 238.727 162.527 l
+238.727 164.922 238.363 166.512 237.633 167.293 c 236.902 168.078
+235.809 168.465 234.352 168.465 c 233.414 168.465 232.266 168.219
+230.91 167.723 c 229.555 167.23 228.383 166.719 227.391 166.199 c
+227.391 141.965 l 227.391 141.551 227.301 141.172 227.117 140.832 c
+226.938 140.492 226.48 140.324 225.75 140.324 c 217.152 140.324 l
+216.523 140.324 216.098 140.469 215.863 140.754 c 215.629 141.039
+215.512 141.445 215.512 141.965 c 215.512 162.762 l 215.512 164.949
+215.16 166.445 214.449 167.254 c 213.738 168.062 212.676 168.469
+211.262 168.469 c 210.312 168.469 209.172 168.234 207.836 167.765 c
+206.496 167.293 205.277 166.773 204.176 166.199 c 204.176 141.969 l
+204.176 141.551 204.07 141.176 203.863 140.832 c 203.656 140.496
+203.191 140.328 202.465 140.328 c 193.926 140.328 l 193.301 140.328
+192.875 140.469 192.641 140.758 c 192.406 141.039 192.297 141.449
+192.297 141.969 c 192.297 177.144 l 192.297 177.664 192.406 178.082
+192.641 178.394 c 192.875 178.707 193.301 178.867 193.926 178.867 c
+202.465 178.867 l 203.191 178.867 203.656 178.68 203.863 178.316 c
+204.07 177.953 204.176 177.562 204.176 177.144 c 204.176 175.348 l
+204.332 175.269 l 206 176.621 207.824 177.68 209.801 178.433 c 211.781
+179.187 213.789 179.566 215.824 179.566 c 218.168 179.566 220.223
+179.14 221.996 178.277 c 223.766 177.418 225.074 176.074 225.906 174.25
+c 227.73 175.762 229.801 177.027 232.117 178.043 c 234.438 179.058
+236.77 179.566 239.113 179.566 c 241.879 179.566 244.027 179.109
+245.562 178.199 c 247.102 177.285 248.25 176.101 249.004 174.644 c
+249.758 173.183 250.215 171.543 250.371 169.719 c 250.527 167.894
+250.605 166.07 250.605 164.246 c 250.605 141.965 l 250.609 141.547
+250.52 141.172 250.336 140.832 c h
+250.336 140.832 m f
+Q Q
+showpage
+%%Trailer
+count op_count sub {pop} repeat
+countdictstack dict_count sub {end} repeat
+cairo_eps_state restore
+%%EOF
diff --git a/doc/nasmlogw.png b/doc/nasmlogw.png
new file mode 100644
index 00000000..72594e80
--- /dev/null
+++ b/doc/nasmlogw.png
Binary files differ
diff --git a/doc/opt_var.txt b/doc/opt_var.txt
new file mode 100644
index 00000000..af15c03d
--- /dev/null
+++ b/doc/opt_var.txt
@@ -0,0 +1,116 @@
+ NASM Optimizer Usage of
+ Certain Variables to Control Assembly
+
+ prepared by: John R Coffman
+ date: 07-Mar-2005
+
+
+GLOBAL variables:
+ optimizing optimization meta data (with level and flag info)
+ .level -1 flags nasm 0.98 compatible operation;
+ offsets usually are explicit (short/near)
+ no optimization passes
+ 0 flags non-optimized assembly; forward
+ references generate long offsets; always
+ assembles
+ no optimization passes
+ 2 or more specifies optmization passes. 5 is
+ the actual recommended minimum setting
+ optimization passes (2 or more, plus
+ passes 1 and 2 will be required)
+ .flag 0 allow all optimizations
+ 1 disallow jump match optimization
+
+ pass0 0 flags an optimizer pass (multiple passes)
+ 1 flags pass1 (define labels)
+ 2 flags pass2 (spit out code)
+
+
+LOCAL variables: local to 'assemble_file' (nasm.c)
+
+ pass_max 2 for non-optimized assembly
+ 4 or more for optimized assembly
+
+ pass index of the FOR loop (1..pass_max)
+ with optimized assembly, this variable is
+ advanced to 'pass_max - 1' in the logic
+ at the end of the loop to terminate
+ an optimized assembly before all passes
+ are used; i.e., when convergence has
+ occurred
+
+
+ pass1 flag for making parts of the assembler do
+ pass 1 behaviors on optimizer passes
+
+ pass2 flag for making parts of the assembler do
+ pass 2 behaviors on optimizer passes
+
+ pass_cnt benign counter for counting the actual
+ number of passes taken. Since 'pass'
+ may be jerked upward early on optimized
+ assembly, it does not accurately reflect
+ the number of passes taken.
+ always ends at 2 for non-optimized assembly
+
+
+
+ How the variables sequence:
+
+
+NON-OPTIMIZED assembly:
+
+
+ pass0 1 2 all indicate, pass 1 and pass 2
+ pass1 1 2
+ pass2 1 2
+
+ pass 1 2
+ ----------------------------------------
+
+ pass_max pre-set to 2
+ pass_cnt ends at 2
+
+
+OPTIMIZED assembly:
+
+ optimizing set to 2 or greater
+
+ pass0 0 0 0 0 0 ... 0 0 1 2
+ pass1 1 1 1 1 1 ... 1 1 1 2
+ pass2 1 2 2 2 2 ... 2 2 2 2
+
+ pass 1 2 3 4 5 ... 7 8 9 12
+
+ pass_max pre-set to, say, 12
+ pass_cnt ends at 10 for this assembly
+
+>From pass_cnt, the reported number of passes will be 1+8+1, meaning
+8 optimization passes, plus pass 1, plus pass 2.
+
+Subroutines may check 'pass0' to see if an optimizer pass is in
+progress (pass0==0). Many have arguments to tell what pass is in
+progress. But these variables are passed in as 'pass1' or 'pass2'.
+
+>From the sequences above, 'pass' bears no relation to the desired
+pass 1 or pass 2 behavior of the assembler. 'pass1' is used to tell
+parts of the assembler, on multiple occasions, that pass 1 is in
+progress, and only once that pass 2 is being performed. Other parts
+of the assembler need to be told only once that pass 1 is being
+performed, but may be told multiple times that pass 2 is being done.
+
+For instance, the preprocessor reset operation looks at pass1, and it
+thinks many pass 1 resets are being done, but only one pass 2 reset
+is done. Also, certain errors are non-fatal on pass 1, but fatal on
+pass 2; hence, they are tied to the 'pass1' variable to determine the
+assembler pass number.
+
+Further, segment definitions look at the 'pass2' variable, since they
+do some initialization on pass 1, but are pretty much no-ops on pass
+2. Hence, they should see pass 1 only once, but may see pass 2
+multiple times.
+
+
+
+[end]
+
diff --git a/doc/psfonts.ph b/doc/psfonts.ph
new file mode 100644
index 00000000..093d9dc4
--- /dev/null
+++ b/doc/psfonts.ph
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+#
+# Font metrics for the PS code generator
+#
+
+# Font substitution lists, in order of preference
+my @TText = ('SourceSansPro-Bold', 'ClearSans-Bold', 'LiberationSans-Bold',
+ 'Arial-Bold', 'Helvetica-Bold');
+my @TItal = ('SourceSansPro-BoldIt', 'ClearSans-BoldItalic', 'LiberationSans-BoldItalic',
+ 'Arial-BoldItalic', 'Helvetica-BoldItalic');
+my @TCode = ('SourceCodePro-Bold', 'LiberationMono-Bold', 'Courier-Bold');
+my @HText = ('SourceSansPro-Semibold', 'ClearSans-Bold', 'Arial-Bold', 'Helvetica-Bold');
+my @HItal = ('SourceSansPro-SemiboldIt', 'ClearSans-BoldItalic',
+ 'Arial-BoldItalic', 'Helvetica-BoldItalic');
+my @HCode = ('SourceCodePro-Semibold', 'LiberationMono-Bold', 'Courier-Bold');
+my @BText = ('SourceSansPro-Regular', 'ClearSans', 'LiberationSans', 'Arial', 'Helvetica');
+my @BItal = ('SourceSansPro-It', 'ClearSans-Italic', 'LiberationSans-Italic',
+ 'Arial-Italic', 'Helvetica-Italic');
+my @BCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier');
+my @QText = ('SourceSansPro-It', 'ClearSans-Italic', 'LiberationSans-Italic',
+ 'Arial-Italic', 'Helvetica-Italic');
+my @QBold = ('SourceSansPro-BoldIt', 'ClearSans-BoldItalic', 'LiberationSans-BoldItalic', 'Arial-Bold', 'Helvetica-BoldItalic');
+my @QCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier');
+
+# The fonts we want to use for various things
+# The order is: <normal> <emphatic> <code>
+
+%TitlFont = (name => 'tfont',
+ leading => 24,
+ fonts => [[20, \@TText], [20, \@TItal], [20, \@TCode]]);
+%ChapFont = (name => 'cfont',
+ leading => 21.6,
+ fonts => [[18, \@HText], [18, \@HItal], [18, \@HCode]]);
+%HeadFont = (name => 'hfont',
+ leading => 16.8,
+ fonts => [[14, \@HText], [14, \@HItal], [14, \@HCode]]);
+%SubhFont = (name => 'sfont',
+ leading => 14.4,
+ fonts => [[12, \@HText], [12, \@HItal], [12, \@HCode]]);
+%BodyFont = (name => 'bfont',
+ leading => 12,
+ fonts => [[10, \@BText], [10, \@BItal], [10, \@BCode]]);
+%BquoFont = (name => 'qfont',
+ leading => 10.8,
+ fonts => [[9, \@QText], [9, \@QBold], [9, \@QCode]]);
+#
+# List of all fontsets; used to compute the list of fonts needed
+#
+@AllFonts = ( \%TitlFont, \%ChapFont, \%HeadFont, \%SubhFont, \%BodyFont,
+ \%BquoFont);
+
+# OK
+1;
diff --git a/doc/pspdf.pl b/doc/pspdf.pl
new file mode 100755
index 00000000..ef9f2900
--- /dev/null
+++ b/doc/pspdf.pl
@@ -0,0 +1,118 @@
+#!/usr/bin/perl
+#
+# Wrapper around a variety of programs that can do PS -> PDF conversion
+#
+
+use strict;
+use File::Spec;
+
+my $compress = 1;
+
+my $win32_ok = eval {
+ require Win32::TieRegistry;
+ Win32::TieRegistry->import();
+ 1;
+};
+
+while ($ARGV[0] =~ /^-(.*)$/) {
+ my $opt = $1;
+ shift @ARGV;
+
+ if ($opt eq '-nocompress') {
+ $compress = 0;
+ }
+}
+
+# Ghostscript executable name. "gs" on Unix-based systems.
+my $gs = 'gs';
+
+my ($in, $out) = @ARGV;
+
+if (!defined($out)) {
+ die "Usage: $0 [-nocompress] infile ou{ tfile\n";
+}
+
+# If Win32, help GhostScript out with some defaults
+sub win32_gs_help() {
+ return if (!$win32_ok);
+
+ use Sort::Versions;
+ use sort 'stable';
+
+ my $Reg = $::Registry->Open('', {Access => 'KEY_READ', Delimiter => '/'});
+ my $dir;
+ my @gs;
+
+ foreach my $k1 ('HKEY_CURRENT_USER/Software/',
+ 'HKEY_LOCAL_MACHINE/SOFTWARE/') {
+ foreach my $k2 ('Artifex/', '') {
+ foreach my $k3 ('GPL Ghostscript/', 'AFPL Ghostscript/',
+ 'Ghostscript/') {
+ my $r = $Reg->{$k1.$k2.$k3};
+ if (ref($r) eq 'Win32::TieRegistry') {
+ foreach my $k (keys(%$r)) {
+ my $rk = $r->{$k};
+ if (ref($rk) eq 'Win32::TieRegistry' &&
+ defined($rk->{'/GS_LIB'})) {
+ push @gs, $rk;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @gs = sort {
+ my($av) = $a->Path =~ m:^.*/([^/]+)/$:;
+ my($bv) = $b->Path =~ m:^.*/([^/]+)/$:;
+ versioncmp($av, $bv);
+ } @gs;
+
+ return unless (scalar(@gs));
+
+ $ENV{'PATH'} .= ';' . $gs[0]->{'/GS_LIB'};
+ $ENV{'GS_FONTPATH'} .= (defined($ENV{'GS_FONTPATH'}) ? ';' : '')
+ . $ENV{'windir'}.'\\fonts';
+
+ my $gsp = undef;
+ foreach my $p (split(/\;/, $gs[0]->{'/GS_LIB'})) {
+ foreach my $exe ('gswin64c.exe', 'gswin32c.exe', 'gs.exe') {
+ last if (defined($gsp));
+ my $e = File::Spec->catpath($p, $exe);
+ $gsp = $e if (-f $e && -x _);
+ }
+ }
+
+ $gs = $gsp if (defined($gsp));
+}
+
+# Remove output file
+unlink($out);
+
+# 1. Acrobat distiller
+my $r = system('acrodist', '-n', '-q', '--nosecurity', '-o', $out, $in);
+exit 0 if ( !$r && -f $out );
+
+# 2. ps2pdf (from Ghostscript)
+#
+# GhostScript uses # rather than = to separate options and values on Windows,
+# it seems. Call gs directly rather than ps2pdf, because -dSAFER
+# breaks font discovery on some systems, apparently.
+win32_gs_help();
+my $o = $win32_ok ? '#' : '=';
+my $r = system($gs, "-dCompatibilityLevel${o}1.4", "-q",
+ "-P-", "-dNOPAUSE", "-dBATCH", "-sDEVICE${o}pdfwrite",
+ "-sstdout${o}%stderr", "-sOutputFile${o}${out}",
+ "-dOptimize${o}true", "-dEmbedAllFonts${o}true",
+ "-dCompressPages${o}" . ($compress ? 'true' : 'false'),
+ "-dUseFlateCompression${o}true",
+ "-c", ".setpdfwrite", "-f", $in);
+exit 0 if ( !$r && -f $out );
+
+# 3. pstopdf (BSD/MacOS X utility)
+my $r = system('pstopdf', $in, '-o', $out);
+exit 0 if ( !$r && -f $out );
+
+# Otherwise, fail
+unlink($out);
+exit 1;
diff --git a/doc/pswidth.ph b/doc/pswidth.ph
new file mode 100644
index 00000000..a2a90856
--- /dev/null
+++ b/doc/pswidth.ph
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# Get the width of a PostScript string in PostScript points (1/72")
+# given a set of font metrics and an encoding vector.
+#
+sub ps_width($$$) {
+ my($str, $met, $encoding) = @_;
+ my($w) = 0;
+ my($i,$c,$p);
+
+ $l = length($str);
+ undef $p;
+ for ( $i = 0 ; $i < $l ; $i++ ) {
+ $c = substr($str,$i,1);
+ $w += $$met{widths}{$encoding->[ord($c)]};
+ # The standard PostScript "show" operator doesn't do kerning.
+ # $w += $$met{kern}{$p.$c};
+ $p = $c;
+ }
+
+ return $w / $met->{scale};
+}
+
+# OK
+1;
diff --git a/doc/rdsrc.pl b/doc/rdsrc.pl
new file mode 100644
index 00000000..447bb9d4
--- /dev/null
+++ b/doc/rdsrc.pl
@@ -0,0 +1,1111 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2018 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+
+# Read the source-form of the NASM manual and generate the various
+# output forms.
+
+# TODO:
+#
+# Ellipsis support would be nice.
+
+# Source-form features:
+# ---------------------
+#
+# Bullet \b
+# Bullets the paragraph. Rest of paragraph is indented to cope. In
+# HTML, consecutive groups of bulleted paragraphs become unordered
+# lists.
+#
+# Indent \>
+# Indents the paragraph equvalently to a bulleted paragraph. In HTML,
+# an indented paragraph following a bulleted paragraph is included in the
+# same list item.
+#
+# Blockquote \q
+# Marks the paragraph as a block quote.
+#
+# Emphasis \e{foobar}
+# produces `_foobar_' in text and italics in HTML, PS, RTF
+#
+# Inline code \c{foobar}
+# produces ``foobar'' in text, and fixed-pitch font in HTML, PS, RTF
+#
+# Display code
+# \c line one
+# \c line two
+# produces fixed-pitch font where appropriate, and doesn't break
+# pages except sufficiently far into the middle of a display.
+#
+# Chapter, header and subheader
+# \C{intro} Introduction
+# \H{whatsnasm} What is NASM?
+# \S{free} NASM Is Free
+# dealt with as appropriate. Chapters begin on new sides, possibly
+# even new _pages_. (Sub)?headers are good places to begin new
+# pages. Just _after_ a (sub)?header isn't.
+# The keywords can be substituted with \K and \k.
+#
+# Keyword \K{cintro} \k{cintro}
+# Expands to `Chapter 1', `Section 1.1', `Section 1.1.1'. \K has an
+# initial capital whereas \k doesn't. In HTML, will produce
+# hyperlinks.
+#
+# Web link \W{http://foobar/}{text} or \W{mailto:me@here}\c{me@here}
+# the \W prefix is ignored except in HTML; in HTML the last part
+# becomes a hyperlink to the first part.
+#
+# Literals \{ \} \\
+# In case it's necessary, they expand to the real versions.
+#
+# Nonbreaking hyphen \-
+# Need more be said?
+#
+# Source comment \#
+# Causes everything after it on the line to be ignored by the
+# source-form processor.
+#
+# Indexable word \i{foobar} (or \i\e{foobar} or \i\c{foobar}, equally)
+# makes word appear in index, referenced to that point
+# \i\c comes up in code style even in the index; \i\e doesn't come
+# up in emphasised style.
+#
+# Indexable non-displayed word \I{foobar} or \I\c{foobar}
+# just as \i{foobar} except that nothing is displayed for it
+#
+# Index rewrite
+# \IR{foobar} \c{foobar} operator, uses of
+# tidies up the appearance in the index of something the \i or \I
+# operator was applied to
+#
+# Index alias
+# \IA{foobar}{bazquux}
+# aliases one index tag (as might be supplied to \i or \I) to
+# another, so that \I{foobar} has the effect of \I{bazquux}, and
+# \i{foobar} has the effect of \I{bazquux}foobar
+#
+# Metadata
+# \M{key}{something}
+# defines document metadata, such as authorship, title and copyright;
+# different output formats use this differently.
+#
+# Include subfile
+# \&{filename}
+# Includes filename. Recursion is allowed.
+#
+
+use File::Spec;
+
+@include_path = ();
+$out_path = File::Spec->curdir();
+
+while ($ARGV[0] =~ /^-/) {
+ my $opt = shift @ARGV;
+ if ($opt eq '-d') {
+ $diag = 1;
+ } elsif ($opt =~ /^\-[Ii](.*)$/) {
+ push(@include_path, $1);
+ } elsif ($opt =~ /^\-[Oo](.*)$/) {
+ $out_path = $1;
+ }
+}
+
+$out_format = shift(@ARGV);
+@files = @ARGV;
+@files = ('-') unless(scalar(@files));
+
+$| = 1;
+
+$tstruct_previtem = $node = "Top";
+$nodes = ($node);
+$tstruct_level{$tstruct_previtem} = 0;
+$tstruct_last[$tstruct_level{$tstruct_previtem}] = $tstruct_previtem;
+$MAXLEVEL = 10; # really 3, but play safe ;-)
+
+# Read the file; pass a paragraph at a time to the paragraph processor.
+print "Reading input...";
+$pname = "para000000";
+@pnames = @pflags = ();
+$para = undef;
+foreach $file (@files) {
+ &include($file);
+}
+&got_para($para);
+print "done.\n";
+
+# Now we've read in the entire document and we know what all the
+# heading keywords refer to. Go through and fix up the \k references.
+print "Fixing up cross-references...";
+&fixup_xrefs;
+print "done.\n";
+
+# Sort the index tags, according to the slightly odd order I've decided on.
+print "Sorting index tags...";
+&indexsort;
+print "done.\n";
+
+# Make output directory if necessary
+mkdir($out_path);
+
+if ($diag) {
+ print "Writing index-diagnostic file...";
+ &indexdiag;
+ print "done.\n";
+}
+
+# OK. Write out the various output files.
+if ($out_format eq 'txt') {
+ print "Producing text output: ";
+ &write_txt;
+ print "done.\n";
+} elsif ($out_format eq 'html') {
+ print "Producing HTML output: ";
+ &write_html;
+ print "done.\n";
+} elsif ($out_format eq 'dip') {
+ print "Producing Documentation Intermediate Paragraphs: ";
+ &write_dip;
+ print "done.\n";
+} else {
+ die "$0: unknown output format: $out_format\n";
+}
+
+sub untabify($) {
+ my($s) = @_;
+ my $o = '';
+ my($c, $i, $p);
+
+ $p = 0;
+ for ($i = 0; $i < length($s); $i++) {
+ $c = substr($s, $i, 1);
+ if ($c eq "\t") {
+ do {
+ $o .= ' ';
+ $p++;
+ } while ($p & 7);
+ } else {
+ $o .= $c;
+ $p++;
+ }
+ }
+ return $o;
+}
+sub read_line {
+ local $_ = shift;
+ $_ = &untabify($_);
+ if (/\\& (\S+)/) {
+ &include($1);
+ } else {
+ &get_para($_);
+ }
+}
+sub get_para($_) {
+ chomp;
+ if (!/\S/ || /^\\(IA|IR|M)/) { # special case: \IA \IR \M imply new-paragraph
+ &got_para($para);
+ $para = undef;
+ }
+ if (/\S/) {
+ s/(^|[^\\])\\#.*$/\1/; # strip comments
+ $para .= " " . $_;
+ }
+}
+sub include {
+ my $name = shift;
+ my $F;
+
+ if ($name eq '-') {
+ open($F, '<-'); # stdin
+ } else {
+ my $found = 0;
+ foreach my $idir ( File::Spec->curdir, @include_path ) {
+ my $fpath = File::Spec->catfile($idir, $name);
+ if (open($F, '<', $fpath)) {
+ $found = 1;
+ last;
+ }
+ }
+ die "Cannot open $name: $!\n" unless ($found);
+ }
+ while (defined($_ = <$F>)) {
+ &read_line($_);
+ }
+ close($F);
+}
+sub got_para {
+ local ($_) = @_;
+ my $pflags = "", $i, $w, $l, $t;
+ return if !/\S/;
+
+ @$pname = ();
+
+ # Strip off _leading_ spaces, then determine type of paragraph.
+ s/^\s*//;
+ $irewrite = undef;
+ if (/^\\c[^{]/) {
+ # A code paragraph. The paragraph-array will contain the simple
+ # strings which form each line of the paragraph.
+ $pflags = "code";
+ while (/^\\c (([^\\]|\\[^c])*)(.*)$/) {
+ $l = $1;
+ $_ = $3;
+ $l =~ s/\\\{/\{/g;
+ $l =~ s/\\\}/}/g;
+ $l =~ s/\\\\/\\/g;
+ push @$pname, $l;
+ }
+ $_ = ''; # suppress word-by-word code
+ } elsif (/^\\C/) {
+ # A chapter heading. Define the keyword and allocate a chapter
+ # number.
+ $cnum++;
+ $hnum = 0;
+ $snum = 0;
+ $xref = "chapter-$cnum";
+ $pflags = "chap $cnum :$xref";
+ die "badly formatted chapter heading: $_\n" if !/^\\C\{([^\}]*)\}\s*(.*)$/;
+ $refs{$1} = "chapter $cnum";
+ $node = "Chapter $cnum";
+ &add_item($node, 1);
+ $xrefnodes{$node} = $xref; $nodexrefs{$xref} = $node;
+ $xrefs{$1} = $xref;
+ $_ = $2;
+ # the standard word-by-word code will happen next
+ } elsif (/^\\A/) {
+ # An appendix heading. Define the keyword and allocate an appendix
+ # letter.
+ $cnum++;
+ $cnum = 'A' if $cnum =~ /[0-9]+/;
+ $hnum = 0;
+ $snum = 0;
+ $xref = "appendix-$cnum";
+ $pflags = "appn $cnum :$xref";
+ die "badly formatted appendix heading: $_\n" if !/^\\A\{([^\}]*)}\s*(.*)$/;
+ $refs{$1} = "appendix $cnum";
+ $node = "Appendix $cnum";
+ &add_item($node, 1);
+ $xrefnodes{$node} = $xref; $nodexrefs{$xref} = $node;
+ $xrefs{$1} = $xref;
+ $_ = $2;
+ # the standard word-by-word code will happen next
+ } elsif (/^\\H/) {
+ # A major heading. Define the keyword and allocate a section number.
+ $hnum++;
+ $snum = 0;
+ $xref = "section-$cnum.$hnum";
+ $pflags = "head $cnum.$hnum :$xref";
+ die "badly formatted heading: $_\n" if !/^\\[HP]\{([^\}]*)\}\s*(.*)$/;
+ $refs{$1} = "section $cnum.$hnum";
+ $node = "Section $cnum.$hnum";
+ &add_item($node, 2);
+ $xrefnodes{$node} = $xref; $nodexrefs{$xref} = $node;
+ $xrefs{$1} = $xref;
+ $_ = $2;
+ # the standard word-by-word code will happen next
+ } elsif (/^\\S/) {
+ # A sub-heading. Define the keyword and allocate a section number.
+ $snum++;
+ $xref = "section-$cnum.$hnum.$snum";
+ $pflags = "subh $cnum.$hnum.$snum :$xref";
+ die "badly formatted subheading: $_\n" if !/^\\S\{([^\}]*)\}\s*(.*)$/;
+ $refs{$1} = "section $cnum.$hnum.$snum";
+ $node = "Section $cnum.$hnum.$snum";
+ &add_item($node, 3);
+ $xrefnodes{$node} = $xref; $nodexrefs{$xref} = $node;
+ $xrefs{$1} = $xref;
+ $_ = $2;
+ # the standard word-by-word code will happen next
+ } elsif (/^\\IR/) {
+ # An index-rewrite.
+ die "badly formatted index rewrite: $_\n" if !/^\\IR\{([^\}]*)\}\s*(.*)$/;
+ $irewrite = $1;
+ $_ = $2;
+ # the standard word-by-word code will happen next
+ } elsif (/^\\IA/) {
+ # An index-alias.
+ die "badly formatted index alias: $_\n" if !/^\\IA\{([^\}]*)}\{([^\}]*)\}\s*$/;
+ $idxalias{$1} = $2;
+ return; # avoid word-by-word code
+ } elsif (/^\\M/) {
+ # Metadata
+ die "badly formed metadata: $_\n" if !/^\\M\{([^\}]*)}\{([^\}]*)\}\s*$/;
+ $metadata{$1} = $2;
+ return; # avoid word-by-word code
+ } elsif (/^\\([b\>q])/) {
+ # An indented paragraph of some sort. Strip off the initial \b and let the
+ # word-by-word code take care of the rest.
+ my %ipar = (
+ 'b' => 'bull',
+ '>' => 'indt',
+ 'q' => 'bquo',
+ );
+ $pflags = $ipar{$1};
+ s/^\\[b\>q]\s*//;
+ } else {
+ # A normal paragraph. Just set $pflags: the word-by-word code does
+ # the rest.
+ $pflags = "norm";
+ }
+
+ # The word-by-word code: unless @$pname is already defined (which it
+ # will be in the case of a code paragraph), split the paragraph up
+ # into words and push each on @$pname.
+ #
+ # Each thing pushed on @$pname should have a two-character type
+ # code followed by the text.
+ #
+ # Type codes are:
+ # "n " for normal
+ # "da" for an en dash
+ # "dm" for an em desh
+ # "es" for first emphasised word in emphasised bit
+ # "e " for emphasised in mid-emphasised-bit
+ # "ee" for last emphasised word in emphasised bit
+ # "eo" for single (only) emphasised word
+ # "c " for code
+ # "k " for cross-ref
+ # "kK" for capitalised cross-ref
+ # "w " for Web link
+ # "wc" for code-type Web link
+ # "x " for beginning of resolved cross-ref; generates no visible output,
+ # and the text is the cross-reference code
+ # "xe" for end of resolved cross-ref; text is same as for "x ".
+ # "i " for point to be indexed: the text is the internal index into the
+ # index-items arrays
+ # "sp" for space
+ while (/\S/) {
+ s/^\s*//, push @$pname, "sp" if /^\s/;
+ $indexing = $qindex = 0;
+ if (/^(\\[iI])?\\c/) {
+ $qindex = 1 if $1 eq "\\I";
+ $indexing = 1, s/^\\[iI]// if $1;
+ s/^\\c//;
+ die "badly formatted \\c: \\c$_\n" if !/\{(([^\\}]|\\.)*)\}(.*)$/;
+ $w = $1;
+ $_ = $3;
+ $w =~ s/\\\{/\{/g;
+ $w =~ s/\\\}/\}/g;
+ $w =~ s/\\-/-/g;
+ $w =~ s/\\\\/\\/g;
+ (push @$pname,"i"),$lastp = $#$pname if $indexing;
+ push @$pname,"c $w" if !$qindex;
+ $$pname[$lastp] = &addidx($node, $w, "c $w") if $indexing;
+ } elsif (/^\\[iIe]/) {
+ /^(\\[iI])?(\\e)?/;
+ $emph = 0;
+ $qindex = 1 if $1 eq "\\I";
+ $indexing = 1, $type = "\\i" if $1;
+ $emph = 1, $type = "\\e" if $2;
+ s/^(\\[iI])?(\\e?)//;
+ die "badly formatted $type: $type$_\n" if !/\{(([^\\}]|\\.)*)\}(.*)$/;
+ $w = $1;
+ $_ = $3;
+ $w =~ s/\\\{/\{/g;
+ $w =~ s/\\\}/\}/g;
+ $w =~ s/\\-/-/g;
+ $w =~ s/\\\\/\\/g;
+ $t = $emph ? "es" : "n ";
+ @ientry = ();
+ (push @$pname,"i"),$lastp = $#$pname if $indexing;
+ foreach $i (split /\s+/,$w) { # \e and \i can be multiple words
+ push @$pname,"$t$i","sp" if !$qindex;
+ ($ii=$i) =~ tr/A-Z/a-z/, push @ientry,"n $ii","sp" if $indexing;
+ $t = $emph ? "e " : "n ";
+ }
+ $w =~ tr/A-Z/a-z/, pop @ientry if $indexing;
+ $$pname[$lastp] = &addidx($node, $w, @ientry) if $indexing;
+ pop @$pname if !$qindex; # remove final space
+ if (substr($$pname[$#$pname],0,2) eq "es" && !$qindex) {
+ substr($$pname[$#$pname],0,2) = "eo";
+ } elsif ($emph && !$qindex) {
+ substr($$pname[$#$pname],0,2) = "ee";
+ }
+ } elsif (/^\\[kK]/) {
+ $t = "k ";
+ $t = "kK" if /^\\K/;
+ s/^\\[kK]//;
+ die "badly formatted \\k: \\k$_\n" if !/\{([^\}]*)\}(.*)$/;
+ $_ = $2;
+ push @$pname,"$t$1";
+ } elsif (/^\\W/) {
+ s/^\\W//;
+ die "badly formatted \\W: \\W$_\n"
+ if !/\{([^\}]*)\}(\\i)?(\\c)?\{(([^\\}]|\\.)*)\}(.*)$/;
+ $l = $1;
+ $w = $4;
+ $_ = $6;
+ $t = "w ";
+ $t = "wc" if $3 eq "\\c";
+ $indexing = 1 if $2;
+ $w =~ s/\\\{/\{/g;
+ $w =~ s/\\\}/\}/g;
+ $w =~ s/\\-/-/g;
+ $w =~ s/\\\\/\\/g;
+ (push @$pname,"i"),$lastp = $#$pname if $indexing;
+ push @$pname,"$t<$l>$w";
+ $$pname[$lastp] = &addidx($node, $w, "c $w") if $indexing;
+ } else {
+ die "what the hell? $_\n" if !/^(([^\s\\\-]|\\[\\{}\-])*-?)(.*)$/;
+ die "painful death! $_\n" if !length $1;
+ $w = $1;
+ $_ = $3;
+ $w =~ s/\\\{/\{/g;
+ $w =~ s/\\\}/\}/g;
+ $w =~ s/\\-/-/g;
+ $w =~ s/\\\\/\\/g;
+ if ($w eq '--') {
+ push @$pname, 'dm';
+ } elsif ($w eq '-') {
+ push @$pname, 'da';
+ } else {
+ push @$pname,"n $w";
+ }
+ }
+ }
+ if ($irewrite ne undef) {
+ &addidx(undef, $irewrite, @$pname);
+ @$pname = ();
+ } else {
+ push @pnames, $pname;
+ push @pflags, $pflags;
+ $pname++;
+ }
+}
+
+sub addidx {
+ my ($node, $text, @ientry) = @_;
+ $text = $idxalias{$text} || $text;
+ if ($node eq undef || !$idxmap{$text}) {
+ @$ientry = @ientry;
+ $idxmap{$text} = $ientry;
+ $ientry++;
+ }
+ if ($node) {
+ $idxnodes{$node,$text} = 1;
+ return "i $text";
+ }
+}
+
+sub indexsort {
+ my $iitem, $ientry, $i, $piitem, $pcval, $cval, $clrcval;
+
+ @itags = map { # get back the original data as the 1st elt of each list
+ $_->[0]
+ } sort { # compare auxiliary (non-first) elements of lists
+ $a->[1] cmp $b->[1] ||
+ $a->[2] cmp $b->[2] ||
+ $a->[0] cmp $b->[0]
+ } map { # transform array into list of 3-element lists
+ my $ientry = $idxmap{$_};
+ my $a = substr($$ientry[0],2);
+ $a =~ tr/A-Za-z0-9//cd;
+ [$_, uc($a), substr($$ientry[0],0,2)]
+ } keys %idxmap;
+
+ # Having done that, check for comma-hood.
+ $cval = 0;
+ foreach $iitem (@itags) {
+ $ientry = $idxmap{$iitem};
+ $clrcval = 1;
+ $pcval = $cval;
+ FL:for ($i=0; $i <= $#$ientry; $i++) {
+ if ($$ientry[$i] =~ /^(n .*,)(.*)/) {
+ $$ientry[$i] = $1;
+ splice @$ientry,$i+1,0,"n $2" if length $2;
+ $commapos{$iitem} = $i+1;
+ $cval = join("\002", @$ientry[0..$i]);
+ $clrcval = 0;
+ last FL;
+ }
+ }
+ $cval = undef if $clrcval;
+ $commanext{$iitem} = $commaafter{$piitem} = 1
+ if $cval and ($cval eq $pcval);
+ $piitem = $iitem;
+ }
+}
+
+sub indexdiag {
+ my $iitem,$ientry,$w,$ww,$foo,$node;
+ open INDEXDIAG, '>', File::Spec->catfile($out_path, 'index.diag');
+ foreach $iitem (@itags) {
+ $ientry = $idxmap{$iitem};
+ print INDEXDIAG "<$iitem> ";
+ foreach $w (@$ientry) {
+ $ww = &word_txt($w);
+ print INDEXDIAG $ww unless $ww eq "\001";
+ }
+ print INDEXDIAG ":";
+ $foo = " ";
+ foreach $node (@nodes) {
+ (print INDEXDIAG $foo,$node), $foo = ", " if $idxnodes{$node,$iitem};
+ }
+ print INDEXDIAG "\n";
+ }
+ close INDEXDIAG;
+}
+
+sub fixup_xrefs {
+ my $pname, $p, $i, $j, $k, $caps, @repl;
+
+ for ($p=0; $p<=$#pnames; $p++) {
+ next if $pflags[$p] eq "code";
+ $pname = $pnames[$p];
+ for ($i=$#$pname; $i >= 0; $i--) {
+ if ($$pname[$i] =~ /^k/) {
+ $k = $$pname[$i];
+ $caps = ($k =~ /^kK/);
+ $k = substr($k,2);
+ $repl = $refs{$k};
+ die "undefined keyword `$k'\n" unless $repl;
+ substr($repl,0,1) =~ tr/a-z/A-Z/ if $caps;
+ @repl = ();
+ push @repl,"x $xrefs{$k}";
+ foreach $j (split /\s+/,$repl) {
+ push @repl,"n $j";
+ push @repl,"sp";
+ }
+ pop @repl; # remove final space
+ push @repl,"xe$xrefs{$k}";
+ splice @$pname,$i,1,@repl;
+ }
+ }
+ }
+}
+
+sub write_txt {
+ # This is called from the top level, so I won't bother using
+ # my or local.
+
+ # Open file.
+ print "writing file...";
+ open TEXT, '>', File::Spec->catfile($out_path, 'nasmdoc.txt');
+ select TEXT;
+
+ # Preamble.
+ $title = $metadata{'title'};
+ $spaces = ' ' x ((75-(length $title))/2);
+ ($underscore = $title) =~ s/./=/g;
+ print "$spaces$title\n$spaces$underscore\n";
+
+ for ($para = 0; $para <= $#pnames; $para++) {
+ $pname = $pnames[$para];
+ $pflags = $pflags[$para];
+ $ptype = substr($pflags,0,4);
+
+ print "\n"; # always one of these before a new paragraph
+
+ if ($ptype eq "chap") {
+ # Chapter heading. "Chapter N: Title" followed by a line of
+ # minus signs.
+ $pflags =~ /chap (.*) :(.*)/;
+ $title = "Chapter $1: ";
+ foreach $i (@$pname) {
+ $ww = &word_txt($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "$title\n";
+ $title =~ s/./-/g;
+ print "$title\n";
+ } elsif ($ptype eq "appn") {
+ # Appendix heading. "Appendix N: Title" followed by a line of
+ # minus signs.
+ $pflags =~ /appn (.*) :(.*)/;
+ $title = "Appendix $1: ";
+ foreach $i (@$pname) {
+ $ww = &word_txt($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "$title\n";
+ $title =~ s/./-/g;
+ print "$title\n";
+ } elsif ($ptype eq "head" || $ptype eq "subh") {
+ # Heading or subheading. Just a number and some text.
+ $pflags =~ /.... (.*) :(.*)/;
+ $title = sprintf "%6s ", $1;
+ foreach $i (@$pname) {
+ $ww = &word_txt($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "$title\n";
+ } elsif ($ptype eq "code") {
+ # Code paragraph. Emit each line with a seven character indent.
+ foreach $i (@$pname) {
+ warn "code line longer than 68 chars: $i\n" if length $i > 68;
+ print ' 'x7, $i, "\n";
+ }
+ } elsif ($ptype =~ /^(norm|bull|indt|bquo)$/) {
+ # Ordinary paragraph, optionally indented. We wrap, with ragged
+ # 75-char right margin and either 7 or 11 char left margin
+ # depending on bullets.
+ if ($ptype ne 'norm') {
+ $line = ' 'x7 . (($ptype eq 'bull') ? '(*) ' : ' ');
+ $next = ' 'x11;
+ } else {
+ $line = $next = ' 'x7;
+ }
+ @a = @$pname;
+ $wd = $wprev = '';
+ do {
+ do { $w = &word_txt(shift @a) } while $w eq "\001"; # nasty hack
+ $wd .= $wprev;
+ if ($wprev =~ /-$/ || $w eq ' ' || $w eq '' || $w eq undef) {
+ if (length ($line . $wd) > 75) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print "$line\n";
+ $line = $next;
+ $wd =~ s/^\s*//; # trim leading spaces
+ }
+ $line .= $wd;
+ $wd = '';
+ }
+ $wprev = $w;
+ } while ($w ne '' && $w ne undef);
+ if ($line =~ /\S/) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print "$line\n";
+ }
+ }
+ }
+
+ # Close file.
+ select STDOUT;
+ close TEXT;
+}
+
+sub word_txt {
+ my ($w) = @_;
+ my $wtype, $wmajt;
+
+ return undef if $w eq '' || $w eq undef;
+ $wtype = substr($w,0,2);
+ $wmajt = substr($wtype,0,1);
+ $w = substr($w,2);
+ $w =~ s/<.*>// if $wmajt eq "w"; # remove web links
+ if ($wmajt eq "n" || $wtype eq "e " || $wtype eq "w ") {
+ return $w;
+ } elsif ($wtype eq "sp") {
+ return ' ';
+ } elsif ($wtype eq 'da' || $wtype eq 'dm') {
+ return '-';
+ } elsif ($wmajt eq "c" || $wtype eq "wc") {
+ return "`${w}'";
+ } elsif ($wtype eq "es") {
+ return "_${w}";
+ } elsif ($wtype eq "ee") {
+ return "${w}_";
+ } elsif ($wtype eq "eo") {
+ return "_${w}_";
+ } elsif ($wmajt eq "x" || $wmajt eq "i") {
+ return "\001";
+ } else {
+ die "panic in word_txt: $wtype$w\n";
+ }
+}
+
+sub write_html {
+ # This is called from the top level, so I won't bother using
+ # my or local.
+
+ # Write contents file. Just the preamble, then a menu of links to the
+ # separate chapter files and the nodes therein.
+ print "writing contents file...";
+ open TEXT, '>', File::Spec->catfile($out_path, 'nasmdoc0.html');
+ select TEXT;
+ &html_preamble(0);
+ print "<p>This manual documents NASM, the Netwide Assembler: an assembler\n";
+ print "targetting the Intel x86 series of processors, with portable source.\n</p>";
+ print "<div class=\"toc\">\n";
+ $level = 0;
+ for ($node = $tstruct_next{'Top'}; $node; $node = $tstruct_next{$node}) {
+ my $lastlevel = $level;
+ while ($tstruct_level{$node} < $level) {
+ print "</li>\n</ol>\n";
+ $level--;
+ }
+ while ($tstruct_level{$node} > $level) {
+ print "<ol class=\"toc", ++$level, "\">\n";
+ }
+ if ($lastlevel >= $level) {
+ print "</li>\n";
+ }
+ $level = $tstruct_level{$node};
+ if ($level == 1) {
+ # Invent a file name.
+ ($number = lc($xrefnodes{$node})) =~ s/.*-//;
+ $fname="nasmdocx.html";
+ substr($fname,8 - length $number, length $number) = $number;
+ $html_fnames{$node} = $fname;
+ $link = $fname;
+ } else {
+ # Use the preceding filename plus a marker point.
+ $link = $fname . "#$xrefnodes{$node}";
+ }
+ $title = '';
+ $pname = $tstruct_pname{$node};
+ foreach $i (@$pname) {
+ $ww = &word_html($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "<li class=\"toc${level}\">\n";
+ print "<span class=\"node\">$node: </span><a href=\"$link\">$title</a>\n";
+ }
+ while ($level--) {
+ print "</li>\n</ol>\n";
+ }
+ print "</div>\n";
+ print "</body>\n";
+ print "</html>\n";
+ select STDOUT;
+ close TEXT;
+
+ # Open a null file, to ensure output (eg random &html_jumppoints calls)
+ # goes _somewhere_.
+ print "writing chapter files...";
+ open TEXT, '>', File::Spec->devnull();
+ select TEXT;
+ undef $html_nav_last;
+ undef $html_nav_next;
+
+ $in_list = 0;
+ $in_bquo = 0;
+ $in_code = 0;
+
+ for ($para = 0; $para <= $#pnames; $para++) {
+ $pname = $pnames[$para];
+ $pflags = $pflags[$para];
+ $ptype = substr($pflags,0,4);
+
+ $in_code = 0, print "</pre>\n" if ($in_code && $ptype ne 'code');
+ $in_list = 0, print "</li>\n</ul>\n" if ($in_list && $ptype !~ /^(bull|indt|code)$/);
+ $in_bquo = 0, print "</blockquote>\n" if ($in_bquo && $ptype ne 'bquo');
+
+ $endtag = '';
+
+ if ($ptype eq "chap") {
+ # Chapter heading. Begin a new file.
+ $pflags =~ /chap (.*) :(.*)/;
+ $title = "Chapter $1: ";
+ $xref = $2;
+ &html_postamble; select STDOUT; close TEXT;
+ $html_nav_last = $chapternode;
+ $chapternode = $nodexrefs{$xref};
+ $html_nav_next = $tstruct_mnext{$chapternode};
+ open(TEXT, '>', File::Spec->catfile($out_path, $html_fnames{$chapternode}));
+ select TEXT;
+ &html_preamble(1);
+ foreach $i (@$pname) {
+ $ww = &word_html($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ $h = "<h2 id=\"$xref\">$title</h2>\n";
+ print $h; print FULL $h;
+ } elsif ($ptype eq "appn") {
+ # Appendix heading. Begin a new file.
+ $pflags =~ /appn (.*) :(.*)/;
+ $title = "Appendix $1: ";
+ $xref = $2;
+ &html_postamble; select STDOUT; close TEXT;
+ $html_nav_last = $chapternode;
+ $chapternode = $nodexrefs{$xref};
+ $html_nav_next = $tstruct_mnext{$chapternode};
+ open(TEXT, '>', File::Spec->catfile($out_path, $html_fnames{$chapternode}));
+ select TEXT;
+ &html_preamble(1);
+ foreach $i (@$pname) {
+ $ww = &word_html($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "<h2 id=\"$xref\">$title</h2>\n";
+ } elsif ($ptype eq "head" || $ptype eq "subh") {
+ # Heading or subheading.
+ $pflags =~ /.... (.*) :(.*)/;
+ $hdr = ($ptype eq "subh" ? "h4" : "h3");
+ $title = $1 . " ";
+ $xref = $2;
+ foreach $i (@$pname) {
+ $ww = &word_html($i);
+ $title .= $ww unless $ww eq "\001";
+ }
+ print "<$hdr id=\"$xref\">$title</$hdr>\n";
+ } elsif ($ptype eq "code") {
+ # Code paragraph.
+ $in_code = 1, print "<pre>" unless $in_code;
+ print "\n";
+ foreach $i (@$pname) {
+ $w = $i;
+ $w =~ s/&/&amp;/g;
+ $w =~ s/</&lt;/g;
+ $w =~ s/>/&gt;/g;
+ print $w, "\n";
+ }
+ } elsif ($ptype =~ /^(norm|bull|indt|bquo)$/) {
+ # Ordinary paragraph, optionally indented.
+ if ($ptype eq 'bull') {
+ if (!$in_list) {
+ $in_list = 1;
+ print "<ul>\n";
+ } else {
+ print "</li>\n";
+ }
+ print "<li>\n";
+ $line = '<p>';
+ $endtag = '</p>';
+ } elsif ($ptype eq 'indt') {
+ if (!$in_list) {
+ $in_list = 1;
+ print "<ul>\n";
+ print "<li class=\"indt\">\n"; # This is such a hack
+ }
+ $line = '<p>';
+ $endtag = '</p>';
+ } elsif ($ptype eq 'bquo') {
+ $in_bquo = 1, print "<blockquote>\n" unless $in_bquo;
+ $line = '<p>';
+ $endtag = '</p>';
+ } else {
+ $line = '<p>';
+ $endtag = '</p>';
+ }
+ @a = @$pname;
+ $wd = $wprev = '';
+ do {
+ do { $w = &word_html(shift @a) } while $w eq "\001"; # nasty hack
+ $wd .= $wprev;
+ if ($w eq ' ' || $w eq '' || $w eq undef) {
+ if (length ($line . $wd) > 75) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print "$line\n";
+ $line = '';
+ $wd =~ s/^\s*//; # trim leading spaces
+ }
+ $line .= $wd;
+ $wd = '';
+ }
+ $wprev = $w;
+ } while ($w ne '' && $w ne undef);
+ if ($line =~ /\S/) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print $line;
+ }
+ print $endtag, "\n";
+ }
+ }
+
+ # Close whichever file was open.
+ print "</pre>\n" if ($in_code);
+ print "</li>\n</ul>\n" if ($in_list);
+ print "</blockquote>\n" if ($in_bquo);
+ &html_postamble; select STDOUT; close TEXT;
+
+ print "\n writing index file...";
+ open TEXT, '>', File::Spec->catfile($out_path, 'nasmdoci.html');
+ select TEXT;
+ &html_preamble(0);
+ print "<h2 class=\"index\">Index</h2>\n";
+ print "<ul class=\"index\">\n";
+ &html_index;
+ print "</ul>\n</body>\n</html>\n";
+ select STDOUT;
+ close TEXT;
+}
+
+sub html_preamble {
+ print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n";
+ print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" ";
+ print "\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n";
+ print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
+ print "<head>\n";
+ print "<title>", $metadata{'title'}, "</title>\n";
+ print "<link href=\"nasmdoc.css\" rel=\"stylesheet\" type=\"text/css\" />\n";
+ print "<link href=\"local.css\" rel=\"stylesheet\" type=\"text/css\" />\n";
+ print "</head>\n";
+ print "<body>\n";
+
+ # Navigation bar
+ print "<ul class=\"navbar\">\n";
+ if (defined($html_nav_last)) {
+ my $lastf = $html_fnames{$html_nav_last};
+ print "<li class=\"first\"><a class=\"prev\" href=\"$lastf\">$html_nav_last</a></li>\n";
+ }
+ if (defined($html_nav_next)) {
+ my $nextf = $html_fnames{$html_nav_next};
+ print "<li><a class=\"next\" href=\"$nextf\">$html_nav_next</a></li>\n";
+ }
+ print "<li><a class=\"toc\" href=\"nasmdoc0.html\">Contents</a></li>\n";
+ print "<li class=\"last\"><a class=\"index\" href=\"nasmdoci.html\">Index</a></li>\n";
+ print "</ul>\n";
+
+ print "<div class=\"title\">\n";
+ print "<h1>", $metadata{'title'}, "</h1>\n";
+ print '<span class="subtitle">', $metadata{'subtitle'}, "</span>\n";
+ print "</div>\n";
+ print "<div class=\"contents\"\n>\n";
+}
+
+sub html_postamble {
+ # Common closing tags
+ print "</div>\n</body>\n</html>\n";
+}
+
+sub html_index {
+ my $itag, $a, @ientry, $sep, $w, $wd, $wprev, $line;
+
+ $chapternode = '';
+ foreach $itag (@itags) {
+ $ientry = $idxmap{$itag};
+ @a = @$ientry;
+ push @a, "n :";
+ $sep = 0;
+ foreach $node (@nodes) {
+ next if !$idxnodes{$node,$itag};
+ push @a, "n ," if $sep;
+ push @a, "sp", "x $xrefnodes{$node}", "n $node", "xe$xrefnodes{$node}";
+ $sep = 1;
+ }
+ print "<li class=\"index\">\n";
+ $line = '';
+ do {
+ do { $w = &word_html(shift @a) } while $w eq "\001"; # nasty hack
+ $wd .= $wprev;
+ if ($w eq ' ' || $w eq '' || $w eq undef) {
+ if (length ($line . $wd) > 75) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print "$line\n";
+ $line = '';
+ $wd =~ s/^\s*//; # trim leading spaces
+ }
+ $line .= $wd;
+ $wd = '';
+ }
+ $wprev = $w;
+ } while ($w ne '' && $w ne undef);
+ if ($line =~ /\S/) {
+ $line =~ s/\s*$//; # trim trailing spaces
+ print $line, "\n";
+ }
+ print "</li>\n";
+ }
+}
+
+sub word_html {
+ my ($w) = @_;
+ my $wtype, $wmajt, $pfx, $sfx;
+
+ return undef if $w eq '' || $w eq undef;
+
+ $wtype = substr($w,0,2);
+ $wmajt = substr($wtype,0,1);
+ $w = substr($w,2);
+ $pfx = $sfx = '';
+ $pfx = "<a href=\"$1\">", $sfx = "</a>", $w = $2
+ if $wmajt eq "w" && $w =~ /^<(.*)>(.*)$/;
+ $w =~ s/&/&amp;/g;
+ $w =~ s/</&lt;/g;
+ $w =~ s/>/&gt;/g;
+ if ($wmajt eq "n" || $wtype eq "e " || $wtype eq "w ") {
+ return $pfx . $w . $sfx;
+ } elsif ($wtype eq "sp") {
+ return ' ';
+ } elsif ($wtype eq "da") {
+ return '&ndash;';
+ } elsif ($wtype eq "dm") {
+ return '&mdash;';
+ } elsif ($wmajt eq "c" || $wtype eq "wc") {
+ return $pfx . "<code>${w}</code>" . $sfx;
+ } elsif ($wtype eq "es") {
+ return "<em>${w}";
+ } elsif ($wtype eq "ee") {
+ return "${w}</em>";
+ } elsif ($wtype eq "eo") {
+ return "<em>${w}</em>";
+ } elsif ($wtype eq "x ") {
+ # Magic: we must resolve the cross reference into file and marker
+ # parts, then dispose of the file part if it's us, and dispose of
+ # the marker part if the cross reference describes the top node of
+ # another file.
+ my $node = $nodexrefs{$w}; # find the node we're aiming at
+ my $level = $tstruct_level{$node}; # and its level
+ my $up = $node, $uplev = $level-1;
+ $up = $tstruct_up{$up} while $uplev--; # get top node of containing file
+ my $file = ($up ne $chapternode) ? $html_fnames{$up} : "";
+ my $marker = ($level == 1 and $file) ? "" : "#$w";
+ return "<a href=\"$file$marker\">";
+ } elsif ($wtype eq "xe") {
+ return "</a>";
+ } elsif ($wmajt eq "i") {
+ return "\001";
+ } else {
+ die "panic in word_html: $wtype$w\n";
+ }
+}
+
+# Make tree structures. $tstruct_* is top-level and global.
+sub add_item {
+ my ($item, $level) = @_;
+ my $i;
+
+ $tstruct_pname{$item} = $pname;
+ $tstruct_next{$tstruct_previtem} = $item;
+ $tstruct_prev{$item} = $tstruct_previtem;
+ $tstruct_level{$item} = $level;
+ $tstruct_up{$item} = $tstruct_last[$level-1];
+ $tstruct_mnext{$tstruct_last[$level]} = $item;
+ $tstruct_last[$level] = $item;
+ for ($i=$level+1; $i<$MAXLEVEL; $i++) { $tstruct_last[$i] = undef; }
+ $tstruct_previtem = $item;
+ push @nodes, $item;
+}
+
+#
+# This produces documentation intermediate paragraph format; this is
+# basically the digested output of the front end. Intended for use
+# by future backends, instead of putting it all in the same script.
+#
+sub write_dip {
+ open(PARAS, '>', File::Spec->catfile($out_path, 'nasmdoc.dip'));
+ foreach $k (sort(keys(%metadata))) {
+ print PARAS 'meta :', $k, "\n";
+ print PARAS $metadata{$k},"\n";
+ }
+ for ($para = 0; $para <= $#pnames; $para++) {
+ print PARAS $pflags[$para], "\n";
+ print PARAS join("\037", @{$pnames[$para]}, "\n");
+ }
+ foreach $k (@itags) {
+ print PARAS 'indx :', $k, "\n";
+ print PARAS join("\037", @{$idxmap{$k}}), "\n";
+ }
+ close(PARAS);
+}
diff --git a/doc/ttfmetrics.ph b/doc/ttfmetrics.ph
new file mode 100644
index 00000000..0eec5504
--- /dev/null
+++ b/doc/ttfmetrics.ph
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+
+use Font::TTF::Font;
+use Font::TTF::Head;
+use Font::TTF::Hmtx;
+use Font::TTF::Cmap;
+use Font::TTF::Maxp;
+use Font::TTF::PSNames;
+use Font::TTF::Post;
+
+use strict;
+
+sub parse_ttf_file($) {
+ my($filename) = @_;
+
+ my $fontdata = {
+ widths => {},
+ kern => {}
+ };
+
+ my $f = Font::TTF::Font->open($filename);
+
+ return undef if (!defined($f));
+
+ $fontdata->{file} = $filename;
+ $fontdata->{type} = defined($f->{' CFF'}) ? 'otf' : 'ttf';
+
+ $f->{head}->read();
+ $fontdata->{scale} = $f->{head}{unitsPerEm};
+
+ $f->{maxp}->read();
+ my $glyphs = $f->{maxp}{numGlyphs};
+
+ $f->{cmap}->read();
+ $f->{hmtx}->read();
+ $f->{name}->read();
+ $fontdata->{name} = $f->{name}->find_name(6); # PostScript name
+ $f->{post}->read();
+ my $psglyphs = 0;
+ my $psmap = $f->{post}->{VAL};
+ $psmap = [] if (!defined($psmap));
+ #printf "Glyphs with PostScript names: %d\n", scalar(@$psmap);
+
+ # Can be done as an array of arrays in case of multiple unicodes to
+ # one glyph...
+ my @unimap = $f->{cmap}->reverse();
+
+ for (my $i = 0; $i < $glyphs; $i++) {
+ my $width = $f->{hmtx}->{advance}[$i];
+ my $psname = $psmap->[$i];
+ if (!defined($psname)) {
+ $psname = Font::TTF::PSNames::lookup($unimap[$i]);
+ }
+ next if (!defined($psname) || ($psname eq '.notdef'));
+ $fontdata->{widths}{$psname} = $f->{hmtx}->{advance}[$i];
+ }
+
+ $f->release;
+
+ return $fontdata;
+}
+
+1;
diff --git a/find_patches.py b/find_patches.py
new file mode 100755
index 00000000..3a9f87c0
--- /dev/null
+++ b/find_patches.py
@@ -0,0 +1,266 @@
+#!/usr/bin/env python
+#
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+"""Usage: find_patches.py [origin_branch] [> patch_file]
+
+This will find all changes in |origin_branch| that are not part of upstream,
+and print a report. It tries to include deleted lines, though these are
+heuristic at best. If |origin_branch| is omitted, it will default to HEAD.
+
+Changes in the working directory are ignored.
+
+Output will be written to stdout, so you probably want to redirect it.
+
+For example, to generate the patches file for origin/merge-m68:
+find_patches.py origin/merge-m68 > patches.68
+"""
+
+from __future__ import print_function
+import collections
+import os
+import re
+import sys
+import subprocess
+
+# What directory will we look for patches in?
+# TODO(liberato): Should we find the root of the ffmpeg tree?
+PATH = "."
+
+
+def log(str):
+ print("[%s]" % str, file=sys.stderr)
+
+
+def run(command):
+ """ Runs a command and returns stdout.
+
+ Args:
+ command: Array of argv[] entries. E.g., ["path_to_executable", "arg1", ...].
+
+ Returns:
+ stdout as a a string.
+ """
+ return subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
+
+
+class PatchInfo:
+ """ Structure to keep track of one patch in a diff.
+
+ This class encapsulates how to handle inserted / deleted lines in a patch,
+ mostly so that we can decide if we should apply "deleted lines only"
+ processing to any them, to find what commit deleted them. Because deleted
+ lines result in an approximate search, we want to be reasonably sure that
+ any deleted lines aren't actually just changes ("delete old, add new").
+ """
+
+ def __init__(self):
+ # Does a diff insert any lines?
+ self._does_insert = False
+ # Set of lines that a diff deletes.
+ self._deleted_lines = set()
+
+ def record_inserted_line(self, line):
+ """ Records that |line| was inserted as part of the patch.
+
+ |line| is a string from the patch, e.g., "+ foo that was added;"
+ """
+ self._does_insert = True
+
+ def record_deleted_line(self, line):
+ """ Records that |line| was deleted as part of the patch.
+
+ |line| is a string from the patch, e.g., "- foo that was removed;"
+ """
+ self._deleted_lines.add(line)
+
+ def interesting_deleted_lines(self):
+ """ Return the (possibly empty) set of deleted lines that we should track.
+
+ In general, things that remove but also add probably are changes, and
+ can be ignored as noise. While, with perfect deleted line tracking,
+ this wouldn't actually change the result, we really just do a text
+ search for deleted lines later. So, avoiding noise is good.
+
+ Note that this is approximate -- a diff could have deleted and
+ inserted lines near each other, but from different patches. In other
+ words, patch A could delete lines and patch B could add / change them.
+ If those changes end up in the same diff block, then we'll miss A
+ because of this test. However, in practice, checking for both seems
+ to remove some noise.
+ """
+ if self._deleted_lines and not self._does_insert:
+ return self._deleted_lines
+ return set()
+
+
+def main(argv):
+ # Origin branch that contains the patches we want to find.
+ # Can specify, for example "origin/merge-m68" to get the patches file for
+ # that revision, regardless of the state of the working tree.
+ if len(argv) > 1:
+ origin_branch = argv[1]
+ else:
+ origin_branch = "HEAD"
+
+ # Make sure that upstream is up-to-date, else many things will likely not
+ # be reachable from it. We don't do this if run as part of a script.
+ if subprocess.call(["git", "fetch", "upstream"]):
+ raise Exception("Could not fetch from upstream")
+
+ write_patches_file(origin_branch, sys.stdout)
+
+
+def write_patches_file(origin_branch, output_file):
+ """Write the patches file for |origin_branch| to |output_file|."""
+ # Get the latest upstream commit that's reachable from the origin branch.
+ # We'll use that to compare against.
+ upstream = run(["git", "merge-base", "upstream/master",
+ origin_branch]).strip()
+ if not upstream:
+ raise Exception("Could not find upstream commit")
+
+ # "Everything reachable from |origin_branch| but not |upstream|". In other
+ # words, all and only chromium changes. Note that there are non-chromium
+ # authors here, since it will include cherry-picks to origin.
+ revision_range = "%s..%s" % (upstream, origin_branch)
+
+ log("Origin is %s" % origin_branch)
+ log("Upstream is %s" % upstream)
+
+ # Find diffs between the versions, excluding all files that are only on
+ # origin. We explicitly exclude .gitignore, since it exists in both places.
+ # Ask for no context, since we ignore it anyway.
+ diff = run([
+ "git", "diff", "--diff-filter=a", "-U0", revision_range, PATH,
+ ":!.gitignore"
+ ])
+
+ # Set of chromium patch sha1s we've seen.
+ sha1s = set()
+ # Map of sha1 to set of files that it affects.
+ sha1ToFiles = collections.defaultdict(set)
+ # Mapping of filename to set of lines that were deleted.
+ files_to_deleted_lines = {}
+ patch_info = PatchInfo()
+ filename = None
+
+ # Process each diff. Include a dummy line to flush out the last diff.
+ log("Scanning diffs between origin and upstream")
+ for line in diff.splitlines() + ["+++ just to handle deleted lines properly"]:
+ if line.startswith("+++"):
+ # If the previous patch was delete-only, then we need to search for it
+ # differently, since we don't get blame entries for deleted lines.
+ # Add the set of deleted lines to this filename.
+ deleted_lines = patch_info.interesting_deleted_lines()
+ if deleted_lines:
+ files_to_deleted_lines[filename] = deleted_lines
+
+ # Update to the new filename.
+ filename = line[6:]
+ log("Checking diffs in %s" % filename)
+
+ # Start of a new diff. We don't know if it inserts / deletes lines.
+ patch_info = PatchInfo()
+ elif line.startswith("@@"):
+ # @@ -linespec +linespec @@
+ # linespec is either "line_number,number_of_lines" or "line_number".
+ # Extract the "+linespec", which is what was added by |origin|.
+ # If the number of lines is specified as 0, then it's a deletion only.
+ # If the number of lines is unspecified, then it's 1.
+ added_linespec = re.sub(r"^.*\+(.*) @@.*", r"\1", line)
+ # Figure out the lines to blame. This is just "starting_line,+number".
+ if "," in added_linespec:
+ # linespec is "line_number,number_of_lines"
+ added_parts = added_linespec.split(",")
+ # Skip if this is a deletion.
+ if added_parts[1] == "0":
+ continue
+ blame_range = "%s,+%s" % (added_parts[0], added_parts[1])
+ else:
+ # One-line change
+ blame_range = "%s,+1" % added_linespec
+
+ blame = run([
+ "git", "blame", "-l",
+ "-L %s" % blame_range, revision_range, "--", filename
+ ])
+
+ # Collect sha1 lines, and create a mapping of files that is changed by
+ # each sha1.
+ for blame_line in blame.splitlines():
+ sha1 = blame_line.split(" ", 1)[0]
+ if sha1:
+ sha1s.add(sha1)
+ sha1ToFiles[sha1].add(filename)
+ elif line.startswith("---"):
+ # Do nothing. Just avoid matching "---" when we check for "-"
+ pass
+ elif line.startswith("-"):
+ # This diff does delete lines.
+ patch_info.record_deleted_line(line[1:])
+ elif line.startswith("+"):
+ # This diff does insert lines.
+ patch_info.record_inserted_line(line[1:])
+
+ # For all files that have deleted lines, look for the sha1 that deleted them.
+ # This is heuristic only; we're looking for "commits that contain some text".
+ for filename, deleted_lines in files_to_deleted_lines.items():
+ for deleted_line in deleted_lines:
+ # Make sure that the deleted line is long enough to provide context.
+ if len(deleted_line) < 4:
+ continue
+
+ log("Checking for deleted lines in %s" % filename)
+ # Specify "--first-parent" so that we find commits on (presumably) origin.
+ sha1 = run([
+ "git", "log", "-1", revision_range, "--format=%H", "-S", deleted_line,
+ origin_branch, "--", filename
+ ]).strip()
+
+ # Add the sha1 to the sets
+ sha1s.add(sha1)
+ sha1ToFiles[sha1].add(filename)
+
+ # Look up dates from sha1 hashes. We want to output them in a canonical order
+ # so that we can diff easier. Date order seems more convenient that sha1.
+ log("Looking up sha1 dates to sort them")
+ sha1_to_date = {}
+ for sha1 in sha1s:
+ date = run(["git", "log", "-1", "--format=%at", "%s" % sha1]).strip()
+ sha1_to_date[sha1] = date
+
+ # Print the patches file.
+ log("Writing patch file")
+ print(
+ "---------------------------------------------------------------------",
+ file=output_file)
+ print(
+ "-- Chromium Patches. Autogenerated by " + os.path.basename(__file__) +
+ ", do not edit --",
+ file=output_file)
+ print(
+ "---------------------------------------------------------------------",
+ file=output_file)
+ print("\n", file=output_file)
+ wd = os.getcwd()
+ for sha1, date in sorted(sha1_to_date.iteritems(), key=lambda (k, v): v):
+ print(
+ "------------------------------------------------------------------",
+ file=output_file)
+ for line in run(["git", "log", "-1", "%s" % sha1]).splitlines():
+ print(line.rstrip(), file=output_file)
+ print("\nAffects:", file=output_file)
+ # TODO(liberato): maybe add the lines that were affected.
+ for file in sorted(sha1ToFiles[sha1]):
+ relfile = os.path.relpath(file, wd).replace('\\', '/')
+ print(" " + relfile, file=output_file)
+ print(file=output_file)
+
+ log("Done")
+
+
+if __name__ == "__main__":
+ main(sys.argv)
diff --git a/generate_nasm_sources.py b/generate_nasm_sources.py
new file mode 100755
index 00000000..2b7bc59e
--- /dev/null
+++ b/generate_nasm_sources.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A script to parse nasm's file lists out of Makefile.in."""
+
+import os
+import sys
+
+def ParseFileLists(path):
+ ret = {}
+ with open(path) as f:
+ in_file_list = False
+ split_line = ""
+ for line in f:
+ line = line.rstrip()
+ if not in_file_list:
+ if "-- Begin File Lists --" in line:
+ in_file_list = True
+ continue
+ if "-- End File Lists --" in line:
+ if split_line:
+ raise ValueError("End comment was preceded by split line")
+ break
+ line = split_line + line
+ split_line = ""
+ if line.endswith('\\'):
+ split_line = line[:-1]
+ continue
+ line = line.strip()
+ if not line:
+ continue
+ name, value = line.split('=')
+ name = name.strip()
+ value = value.replace("$(O)", "c")
+ files = value.split()
+ files.sort()
+ files = [file for file in files]
+ ret[name] = files
+ return ret
+
+def PrintFileList(out, name, files):
+ if len(files) == 0:
+ print >>out, "%s = []" % (name,)
+ elif len(files) == 1:
+ print >>out, "%s = [ \"%s\" ]" % (name, files[0])
+ else:
+ print >>out, "%s = [" % (name,)
+ for f in files:
+ print >>out, " \"%s\"," % (f,)
+ print >>out, "]"
+
+def main():
+ file_lists = ParseFileLists("Makefile.in")
+ with open("nasm_sources.gni", "w") as out:
+ print >>out, """# Copyright (c) 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file is created by generate_nasm_sources.py. Do not edit manually.
+"""
+ PrintFileList(out, "ndisasm_sources", file_lists['NDISASM'])
+ PrintFileList(out, "nasmlib_sources", file_lists['LIBOBJ'])
+ PrintFileList(out, "nasm_sources", file_lists['NASM'])
+
+if __name__ == "__main__":
+ main()
diff --git a/headers/c b/headers/c
new file mode 100644
index 00000000..311e15b6
--- /dev/null
+++ b/headers/c
@@ -0,0 +1,33 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2010 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
diff --git a/headers/doc b/headers/doc
new file mode 100644
index 00000000..0a6c3812
--- /dev/null
+++ b/headers/doc
@@ -0,0 +1,33 @@
+\# --------------------------------------------------------------------------
+\#
+\# Copyright 1996-2010 The NASM Authors - All Rights Reserved
+\# See the file AUTHORS included with the NASM distribution for
+\# the specific copyright holders.
+\#
+\# Redistribution and use in source and binary forms, with or without
+\# modification, are permitted provided that the following
+\# conditions are met:
+\#
+\# * Redistributions of source code must retain the above copyright
+\# notice, this list of conditions and the following disclaimer.
+\# * 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 COPYRIGHT OWNER 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.
+\#
+\# --------------------------------------------------------------------------
+
diff --git a/headers/mac b/headers/mac
new file mode 100644
index 00000000..514315b6
--- /dev/null
+++ b/headers/mac
@@ -0,0 +1,33 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2010 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
diff --git a/headers/perl b/headers/perl
new file mode 100644
index 00000000..3ce5ad7b
--- /dev/null
+++ b/headers/perl
@@ -0,0 +1,33 @@
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2010 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
diff --git a/include/bytesex.h b/include/bytesex.h
new file mode 100644
index 00000000..186d5618
--- /dev/null
+++ b/include/bytesex.h
@@ -0,0 +1,261 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * bytesex.h - byte order helper functions
+ *
+ * In this function, be careful about getting X86_MEMORY versus
+ * LITTLE_ENDIAN correct: X86_MEMORY also means we are allowed to
+ * do unaligned memory references, and is probabilistic.
+ */
+
+#ifndef NASM_BYTEORD_H
+#define NASM_BYTEORD_H
+
+#include "compiler.h"
+
+/*
+ * Some handy macros that will probably be of use in more than one
+ * output format: convert integers into little-endian byte packed
+ * format in memory.
+ */
+
+#define WRITECHAR(p,v) \
+ do { \
+ uint8_t *_wc_p = (uint8_t *)(p); \
+ *_wc_p++ = (v); \
+ (p) = (void *)_wc_p; \
+ } while (0)
+
+#if X86_MEMORY
+
+#define WRITESHORT(p,v) \
+ do { \
+ uint16_t *_ws_p = (uint16_t *)(p); \
+ *_ws_p++ = (v); \
+ (p) = (void *)_ws_p; \
+ } while (0)
+
+#define WRITELONG(p,v) \
+ do { \
+ uint32_t *_wl_p = (uint32_t *)(p); \
+ *_wl_p++ = (v); \
+ (p) = (void *)_wl_p; \
+ } while (0)
+
+#define WRITEDLONG(p,v) \
+ do { \
+ uint64_t *_wq_p = (uint64_t *)(p); \
+ *_wq_p++ = (v); \
+ (p) = (void *)_wq_p; \
+ } while (0)
+
+#else /* !X86_MEMORY */
+
+#define WRITESHORT(p,v) \
+ do { \
+ uint8_t *_ws_p = (uint8_t *)(p); \
+ const uint16_t _ws_v = (v); \
+ WRITECHAR(_ws_p, _ws_v); \
+ WRITECHAR(_ws_p, _ws_v >> 8); \
+ (p) = (void *)_ws_p; \
+ } while (0)
+
+#define WRITELONG(p,v) \
+ do { \
+ uint8_t *_wl_p = (uint8_t *)(p); \
+ const uint32_t _wl_v = (v); \
+ WRITESHORT(_wl_p, _wl_v); \
+ WRITESHORT(_wl_p, _wl_v >> 16); \
+ (p) = (void *)_wl_p; \
+ } while (0)
+
+#define WRITEDLONG(p,v) \
+ do { \
+ uint8_t *_wq_p = (uint8_t *)(p); \
+ const uint64_t _wq_v = (v); \
+ WRITELONG(_wq_p, _wq_v); \
+ WRITELONG(_wq_p, _wq_v >> 32); \
+ (p) = (void *)_wq_p; \
+ } while (0)
+
+#endif /* X86_MEMORY */
+
+/*
+ * Endian control functions which work on a single integer
+ */
+#ifdef WORDS_LITTLEENDIAN
+
+#ifndef HAVE_CPU_TO_LE16
+# define cpu_to_le16(v) ((uint16_t)(v))
+#endif
+#ifndef HAVE_CPU_TO_LE32
+# define cpu_to_le32(v) ((uint32_t)(v))
+#endif
+#ifndef HAVE_CPU_TO_LE64
+# define cpu_to_le64(v) ((uint64_t)(v))
+#endif
+
+#elif defined(WORDS_BIGENDIAN)
+
+#ifndef HAVE_CPU_TO_LE16
+static inline uint16_t cpu_to_le16(uint16_t v)
+{
+# ifdef HAVE___CPU_TO_LE16
+ return __cpu_to_le16(v);
+# elif defined(HAVE_HTOLE16)
+ return htole16(v);
+# elif defined(HAVE___BSWAP_16)
+ return __bswap_16(v);
+# elif defined(HAVE___BUILTIN_BSWAP16)
+ return __builtin_bswap16(v);
+# elif defined(HAVE__BYTESWAP_USHORT) && (USHRT_MAX == 0xffffU)
+ return _byteswap_ushort(v);
+# else
+ return (v << 8) | (v >> 8);
+# endif
+}
+#endif
+
+#ifndef HAVE_CPU_TO_LE32
+static inline uint32_t cpu_to_le32(uint32_t v)
+{
+# ifdef HAVE___CPU_TO_LE32
+ return __cpu_to_le32(v);
+# elif defined(HAVE_HTOLE32)
+ return htole32(v);
+# elif defined(HAVE___BSWAP_32)
+ return __bswap_32(v);
+# elif defined(HAVE___BUILTIN_BSWAP32)
+ return __builtin_bswap32(v);
+# elif defined(HAVE__BYTESWAP_ULONG) && (ULONG_MAX == 0xffffffffUL)
+ return _byteswap_ulong(v);
+# else
+ v = ((v << 8) & 0xff00ff00 ) |
+ ((v >> 8) & 0x00ff00ff);
+ return (v << 16) | (v >> 16);
+# endif
+}
+#endif
+
+#ifndef HAVE_CPU_TO_LE64
+static inline uint64_t cpu_to_le64(uint64_t v)
+{
+# ifdef HAVE___CPU_TO_LE64
+ return __cpu_to_le64(v);
+# elif defined(HAVE_HTOLE64)
+ return htole64(v);
+# elif defined(HAVE___BSWAP_64)
+ return __bswap_64(v);
+# elif defined(HAVE___BUILTIN_BSWAP64)
+ return __builtin_bswap64(v);
+# elif defined(HAVE__BYTESWAP_UINT64)
+ return _byteswap_uint64(v);
+# else
+ v = ((v << 8) & 0xff00ff00ff00ff00ull) |
+ ((v >> 8) & 0x00ff00ff00ff00ffull);
+ v = ((v << 16) & 0xffff0000ffff0000ull) |
+ ((v >> 16) & 0x0000ffff0000ffffull);
+ return (v << 32) | (v >> 32);
+# endif
+}
+#endif
+
+#else /* not WORDS_LITTLEENDIAN or WORDS_BIGENDIAN */
+
+static inline uint16_t cpu_to_le16(uint16_t v)
+{
+ union u16 {
+ uint16_t v;
+ uint8_t c[2];
+ } x;
+ uint8_t *cp = &x.c;
+
+ WRITESHORT(cp, v);
+ return x.v;
+}
+
+static inline uint32_t cpu_to_le32(uint32_t v)
+{
+ union u32 {
+ uint32_t v;
+ uint8_t c[4];
+ } x;
+ uint8_t *cp = &x.c;
+
+ WRITELONG(cp, v);
+ return x.v;
+}
+
+static inline uint64_t cpu_to_le64(uint64_t v)
+{
+ union u64 {
+ uint64_t v;
+ uint8_t c[8];
+ } x;
+ uint8_t *cp = &x.c;
+
+ WRITEDLONG(cp, v);
+ return x.v;
+}
+
+#endif
+
+#define WRITEADDR(p,v,s) \
+ do { \
+ switch (is_constant(s) ? (s) : 0) { \
+ case 1: \
+ WRITECHAR(p,v); \
+ break; \
+ case 2: \
+ WRITESHORT(p,v); \
+ break; \
+ case 4: \
+ WRITELONG(p,v); \
+ break; \
+ case 8: \
+ WRITEDLONG(p,v); \
+ break; \
+ default: \
+ { \
+ const uint64_t _wa_v = cpu_to_le64(v); \
+ const size_t _wa_s = (s); \
+ uint8_t * const _wa_p = (uint8_t *)(p); \
+ memcpy(_wa_p, &_wa_v, _wa_s); \
+ (p) = (void *)(_wa_p + _wa_s); \
+ } \
+ break; \
+ } \
+ } while (0)
+
+#endif /* NASM_BYTESEX_H */
diff --git a/include/compiler.h b/include/compiler.h
new file mode 100644
index 00000000..fa63fea0
--- /dev/null
+++ b/include/compiler.h
@@ -0,0 +1,379 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2007-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * compiler.h
+ *
+ * Compiler-specific macros for NASM. Feel free to add support for
+ * other compilers in here.
+ *
+ * This header file should be included before any other header.
+ */
+
+#ifndef NASM_COMPILER_H
+#define NASM_COMPILER_H 1
+
+/*
+ * At least DJGPP and Cygwin have broken header files if __STRICT_ANSI__
+ * is defined.
+ */
+#ifdef __GNUC__
+# undef __STRICT_ANSI__
+#endif
+
+/* On Microsoft platforms we support multibyte character sets in filenames */
+#define _MBCS 1
+
+#ifdef HAVE_CONFIG_H
+# include "config/config.h"
+#elif defined(_MSC_VER) && (_MSC_VER >= 1310)
+# include "config/msvc.h"
+#elif defined(__WATCOMC__)
+# include "config/watcom.h"
+#else
+# include "config/unknown.h"
+#endif /* Configuration file */
+
+/* This is required to get the standard <inttypes.h> macros when compiling
+ with a C++ compiler. This must be defined *before* <inttypes.h> is
+ included, directly or indirectly. */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#define __STDC_FORMAT_MACROS 1
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# include "nasmint.h"
+#endif
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <limits.h>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_ENDIAN_H
+# include <endian.h>
+#elif defined(HAVE_SYS_ENDIAN_H)
+# include <sys/endian.h>
+#elif defined(HAVE_MACHINE_ENDIAN_H)
+# include <machine/endian.h>
+#endif
+
+/*
+ * If we have BYTE_ORDER defined, or the compiler provides
+ * __BIG_ENDIAN__ or __LITTLE_ENDIAN__, trust it over what autoconf
+ * came up with, especially since autoconf obviously can't figure
+ * things out for a universal compiler.
+ */
+#if defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
+# undef WORDS_LITTLEENDIAN
+# undef WORDS_BIGENDIAN
+# define WORDS_BIGENDIAN 1
+#elif defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
+# undef WORDS_LITTLEENDIAN
+# undef WORDS_BIGENDIAN
+# define WORDS_LITTLEENDIAN 1
+#elif defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
+# undef WORDS_LITTLEENDIAN
+# undef WORDS_BIGENDIAN
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define WORDS_LITTLEENDIAN 1
+# elif BYTE_ORDER == BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+#endif
+
+/*
+ * Define this to 1 for faster performance if this is a littleendian
+ * platform *and* it can do arbitrary unaligned memory references. It
+ * is safe to leave it defined to 0 even if that is true.
+ */
+#if defined(__386__) || defined(__i386__) || defined(__x86_64__) \
+ || defined(_M_IX86) || defined(_M_X64)
+# define X86_MEMORY 1
+# undef WORDS_BIGENDIAN
+# undef WORDS_LITTLEENDIAN
+# define WORDS_LITTLEENDIAN 1
+#else
+# define X86_MEMORY 0
+#endif
+
+/* Some versions of MSVC have these only with underscores in front */
+#ifndef HAVE_SNPRINTF
+# ifdef HAVE__SNPRINTF
+# define snprintf _snprintf
+# else
+int snprintf(char *, size_t, const char *, ...);
+# endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+# ifdef HAVE__VSNPRINTF
+# define vsnprintf _vsnprintf
+# else
+int vsnprintf(char *, size_t, const char *, va_list);
+# endif
+#endif
+
+#if !defined(HAVE_STRLCPY) || !HAVE_DECL_STRLCPY
+size_t strlcpy(char *, const char *, size_t);
+#endif
+
+#if !defined(HAVE_STRCHRNUL) || !HAVE_DECL_STRCHRNUL
+char *strrchrnul(const char *, int);
+#endif
+
+#ifndef __cplusplus /* C++ has false, true, bool as keywords */
+# ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+# elif defined(HAVE__BOOL)
+# typedef _Bool bool
+# define false 0
+# define true 1
+# else
+/* This is sort of dangerous, since casts will behave different than
+ casting to the standard boolean type. Always use !!, not (bool). */
+typedef enum bool { false, true } bool;
+# endif
+#endif
+
+/* Provide a substitute for offsetof() if we don't have one. This
+ variant works on most (but not *all*) systems... */
+#ifndef offsetof
+# define offsetof(t,m) ((size_t)&(((t *)0)->m))
+#endif
+
+/* The container_of construct: if p is a pointer to member m of
+ container class c, then return a pointer to the container of which
+ *p is a member. */
+#ifndef container_of
+# define container_of(p, c, m) ((c *)((char *)(p) - offsetof(c,m)))
+#endif
+
+/* Some misguided platforms hide the defs for these */
+#if defined(HAVE_STRCASECMP) && !HAVE_DECL_STRCASECMP
+int strcasecmp(const char *, const char *);
+#endif
+
+#if defined(HAVE_STRICMP) && !HAVE_DECL_STRICMP
+int stricmp(const char *, const char *);
+#endif
+
+#if defined(HAVE_STRNCASECMP) && !HAVE_DECL_STRNCASECMP
+int strncasecmp(const char *, const char *, size_t);
+#endif
+
+#if defined(HAVE_STRNICMP) && !HAVE_DECL_STRNICMP
+int strnicmp(const char *, const char *, size_t);
+#endif
+
+#if defined(HAVE_STRSEP) && !HAVE_DECL_STRSEP
+char *strsep(char **, const char *);
+#endif
+
+#if !HAVE_DECL_STRNLEN
+size_t strnlen(const char *s, size_t maxlen);
+#endif
+
+/*
+ * Hack to support external-linkage inline functions
+ */
+#ifndef HAVE_STDC_INLINE
+# ifdef __GNUC__
+# ifdef __GNUC_STDC_INLINE__
+# define HAVE_STDC_INLINE
+# else
+# define HAVE_GNU_INLINE
+# endif
+# elif defined(__GNUC_GNU_INLINE__)
+/* Some other compiler implementing only GNU inline semantics? */
+# define HAVE_GNU_INLINE
+# elif defined(_MSC_VER)
+/* In MSVC and clang when it is pretending to be MSVC, inline behaves it does in
+ * C++.
+ */
+# define HAVE_MSVC_INLINE
+# elif defined(__STDC_VERSION__)
+# if __STDC_VERSION__ >= 199901L
+# define HAVE_STDC_INLINE
+# endif
+# endif
+#endif
+
+#ifdef HAVE_STDC_INLINE
+# define extern_inline inline
+#elif defined(HAVE_GNU_INLINE)
+# define extern_inline extern inline
+# define inline_prototypes
+#elif defined(HAVE_MSVC_INLINE)
+# define extern_inline inline
+#else
+# define inline_prototypes
+#endif
+
+/*
+ * Hints to the compiler that a particular branch of code is more or
+ * less likely to be taken.
+ */
+#if HAVE___BUILTIN_EXPECT
+# define likely(x) __builtin_expect(!!(x), 1)
+# define unlikely(x) __builtin_expect(!!(x), 0)
+#else
+# define likely(x) (!!(x))
+# define unlikely(x) (!!(x))
+#endif
+
+/*
+ * Hints about malloc-like functions that never return NULL
+ */
+#ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL
+# define never_null __attribute__((returns_nonnull))
+#else
+# define never_null
+#endif
+
+#ifdef HAVE_FUNC_ATTRIBUTE_MALLOC
+# define safe_alloc never_null __attribute__((malloc))
+#else
+# define safe_alloc never_null
+#endif
+
+#ifdef HAVE_FUNC_ATTRIBUTE_ALLOC_SIZE
+# define safe_malloc(s) safe_alloc __attribute__((alloc_size(s)))
+# define safe_malloc2(s1,s2) safe_alloc __attribute__((alloc_size(s1,s2)))
+# define safe_realloc(s) never_null __attribute__((alloc_size(s)))
+#else
+# define safe_malloc(s) safe_alloc
+# define safe_malloc2(s1,s2) safe_alloc
+# define safe_realloc(s) never_null
+#endif
+
+#ifdef HAVE_FUNC_ATTRIBUTE_SENTINEL
+# define end_with_null __attribute__((sentinel))
+#else
+# define end_with_null
+#endif
+
+/*
+ * How to tell the compiler that a function doesn't return
+ */
+#ifdef HAVE_STDNORETURN_H
+# include <stdnoreturn.h>
+# define no_return noreturn void
+#elif defined(HAVE_FUNC_ATTRIBUTE_NORETURN)
+# define no_return void __attribute__((noreturn))
+#elif defined(_MSC_VER)
+# define no_return __declspec(noreturn) void
+#else
+# define no_return void
+#endif
+
+/*
+ * How to tell the compiler that a function is unlikely to be executed.
+ * This differs from unlikely() in that it is applied to a function call,
+ * not a boolean condition.
+ */
+#ifdef HAVE_FUNC_ATTRIBUTE_COLD
+# define unlikely_func __attribute__((cold))
+#else
+# define unlikely_func
+#endif
+
+/*
+ * A fatal function is both unlikely and no_return
+ */
+#define fatal_func no_return unlikely_func
+
+/*
+ * How to tell the compiler that a function takes a printf-like string
+ */
+#ifdef HAVE_FUNC_ATTRIBUTE_FORMAT
+# define printf_func(fmt, list) __attribute__((format(printf, fmt, list)))
+#else
+# define printf_func(fmt, list)
+#endif
+
+/*
+ * How to tell the compiler that a function is pure arithmetic
+ */
+#ifdef HAVE_FUNC_ATTRIBUTE_CONST
+# define const_func __attribute__((const))
+#else
+# define const_func
+#endif
+
+/*
+ * This function has no side effects, but depends on its arguments,
+ * memory pointed to by its arguments, or global variables.
+ * NOTE: functions that return a value by modifying memory pointed to
+ * by a pointer argument are *NOT* considered pure.
+ */
+#ifdef HAVE_FUNC_ATTRIBUTE_PURE
+# define pure_func __attribute__((pure))
+#else
+# define pure_func
+#endif
+
+/* Determine probabilistically if something is a compile-time constant */
+#ifdef HAVE___BUILTIN_CONSTANT_P
+# define is_constant(x) __builtin_constant_p(x)
+#else
+# define is_constant(x) false
+#endif
+
+/* Watcom doesn't handle switch statements with 64-bit types, hack around it */
+#ifdef __WATCOMC__
+# define BOGUS_CASE 0x76543210
+
+static inline unsigned int watcom_switch_hack(uint64_t x)
+{
+ if (x > (uint64_t)UINT_MAX)
+ return BOGUS_CASE;
+ else
+ return (unsigned int)x;
+}
+
+# define switch(x) switch(sizeof(x) > sizeof(unsigned int) \
+ ? watcom_switch_hack(x) : (unsigned int)(x))
+
+/* This is to make sure BOGUS_CASE doesn't conflict with anything real... */
+# define default case BOGUS_CASE: default
+#endif
+
+#endif /* NASM_COMPILER_H */
diff --git a/include/disp8.h b/include/disp8.h
new file mode 100644
index 00000000..fc18e4f3
--- /dev/null
+++ b/include/disp8.h
@@ -0,0 +1,45 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2013 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * disp8.h header file for disp8.c
+ */
+
+#ifndef NASM_DISP8_H
+#define NASM_DISP8_H
+
+#include "nasm.h"
+
+uint8_t get_disp8N(insn *ins);
+bool is_disp8n(operand *input, insn *ins, int8_t *compdisp);
+#endif /* NASM_DISP8_H */
diff --git a/include/error.h b/include/error.h
new file mode 100644
index 00000000..08d562b8
--- /dev/null
+++ b/include/error.h
@@ -0,0 +1,140 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Error reporting functions for the assembler
+ */
+
+#ifndef NASM_ERROR_H
+#define NASM_ERROR_H 1
+
+#include "compiler.h"
+
+/*
+ * An error reporting function should look like this.
+ */
+void printf_func(2, 3) nasm_error(int severity, const char *fmt, ...);
+fatal_func printf_func(1, 2) nasm_fatal(const char *fmt, ...);
+fatal_func printf_func(1, 2) nasm_panic(const char *fmt, ...);
+fatal_func printf_func(2, 3) nasm_fatal_fl(int flags, const char *fmt, ...);
+fatal_func printf_func(2, 3) nasm_panic_fl(int flags, const char *fmt, ...);
+fatal_func nasm_panic_from_macro(const char *file, int line);
+#define panic() nasm_panic_from_macro(__FILE__, __LINE__);
+
+typedef void (*vefunc) (int severity, const char *fmt, va_list ap);
+extern vefunc nasm_verror;
+static inline vefunc nasm_set_verror(vefunc ve)
+{
+ vefunc old_verror = nasm_verror;
+ nasm_verror = ve;
+ return old_verror;
+}
+
+/*
+ * These are the error severity codes which get passed as the first
+ * argument to an efunc.
+ */
+
+#define ERR_DEBUG 0x00000000 /* put out debugging message */
+#define ERR_WARNING 0x00000001 /* warn only: no further action */
+#define ERR_NONFATAL 0x00000002 /* terminate assembly after phase */
+#define ERR_FATAL 0x00000006 /* instantly fatal: exit with error */
+#define ERR_PANIC 0x00000007 /* internal error: panic instantly
+ * and dump core for reference */
+#define ERR_MASK 0x00000007 /* mask off the above codes */
+#define ERR_NOFILE 0x00000010 /* don't give source file name/line */
+#define ERR_TOPFILE 0x00000020 /* give the top input file name only */
+#define ERR_USAGE 0x00000040 /* print a usage message */
+#define ERR_PASS1 0x00000080 /* only print this error on pass one */
+#define ERR_PASS2 0x00000100 /* only print this error on pass one */
+
+#define ERR_NO_SEVERITY 0x00000200 /* suppress printing severity */
+#define ERR_PP_PRECOND 0x00000400 /* for preprocessor use */
+#define ERR_PP_LISTMACRO 0x00000800 /* from preproc->error_list_macros() */
+
+/*
+ * These codes define specific types of suppressible warning.
+ */
+
+#define ERR_WARN_MASK 0xFFFFF000 /* the mask for this feature */
+#define ERR_WARN_SHR 12 /* how far to shift right */
+
+#define WARN(x) ((x) << ERR_WARN_SHR)
+#define WARN_IDX(x) (((x) & ERR_WARN_MASK) >> ERR_WARN_SHR)
+
+#define ERR_WARN_OTHER WARN( 0) /* any noncategorized warning */
+#define ERR_WARN_MNP WARN( 1) /* macro-num-parameters warning */
+#define ERR_WARN_MSR WARN( 2) /* macro self-reference */
+#define ERR_WARN_MDP WARN( 3) /* macro default parameters check */
+#define ERR_WARN_OL WARN( 4) /* orphan label (no colon, and
+ * alone on line) */
+#define ERR_WARN_NOV WARN( 5) /* numeric overflow */
+#define ERR_WARN_GNUELF WARN( 6) /* using GNU ELF extensions */
+#define ERR_WARN_FL_OVERFLOW WARN( 7) /* FP overflow */
+#define ERR_WARN_FL_DENORM WARN( 8) /* FP denormal */
+#define ERR_WARN_FL_UNDERFLOW WARN( 9) /* FP underflow */
+#define ERR_WARN_FL_TOOLONG WARN(10) /* FP too many digits */
+#define ERR_WARN_USER WARN(11) /* %warning directives */
+#define ERR_WARN_LOCK WARN(12) /* bad LOCK prefixes */
+#define ERR_WARN_HLE WARN(13) /* bad HLE prefixes */
+#define ERR_WARN_BND WARN(14) /* bad BND prefixes */
+#define ERR_WARN_ZEXTRELOC WARN(15) /* relocation zero-extended */
+#define ERR_WARN_PTR WARN(16) /* not a NASM keyword */
+#define ERR_WARN_BAD_PRAGMA WARN(17) /* malformed pragma */
+#define ERR_WARN_UNKNOWN_PRAGMA WARN(18) /* unknown pragma */
+#define ERR_WARN_NOTMY_PRAGMA WARN(19) /* pragma inapplicable */
+#define ERR_WARN_UNK_WARNING WARN(20) /* unknown warning */
+#define ERR_WARN_NEG_REP WARN(21) /* negative repeat count */
+#define ERR_WARN_PHASE WARN(22) /* phase error in pass 1 */
+
+/* The "all" warning acts as a global switch, it must come last */
+#define ERR_WARN_ALL 23 /* Do not use WARN() here */
+
+struct warning {
+ const char *name;
+ const char *help;
+ bool enabled;
+};
+extern const struct warning warnings[ERR_WARN_ALL+1];
+
+/* This is a bitmask */
+#define WARN_ST_ENABLED 1 /* Warning is currently enabled */
+#define WARN_ST_ERROR 2 /* Treat this warning as an error */
+
+extern uint8_t warning_state[ERR_WARN_ALL];
+extern uint8_t warning_state_init[ERR_WARN_ALL];
+
+/* Process a warning option or directive */
+bool set_warning_status(const char *);
+
+#endif /* NASM_ERROR_H */
diff --git a/include/hashtbl.h b/include/hashtbl.h
new file mode 100644
index 00000000..25f2d2d5
--- /dev/null
+++ b/include/hashtbl.h
@@ -0,0 +1,86 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * hashtbl.h
+ *
+ * Efficient dictionary hash table class.
+ */
+
+#ifndef NASM_HASHTBL_H
+#define NASM_HASHTBL_H
+
+#include <stddef.h>
+#include "nasmlib.h"
+
+struct hash_tbl_node {
+ uint64_t hash;
+ const char *key;
+ void *data;
+};
+
+struct hash_table {
+ struct hash_tbl_node *table;
+ size_t load;
+ size_t size;
+ size_t max_load;
+};
+
+struct hash_insert {
+ uint64_t hash;
+ struct hash_table *head;
+ struct hash_tbl_node *where;
+};
+
+uint64_t crc64(uint64_t crc, const char *string);
+uint64_t crc64i(uint64_t crc, const char *string);
+#define CRC64_INIT UINT64_C(0xffffffffffffffff)
+
+/* Some reasonable initial sizes... */
+#define HASH_SMALL 4
+#define HASH_MEDIUM 16
+#define HASH_LARGE 256
+
+void hash_init(struct hash_table *head, size_t size);
+void **hash_find(struct hash_table *head, const char *string,
+ struct hash_insert *insert);
+void **hash_findi(struct hash_table *head, const char *string,
+ struct hash_insert *insert);
+void **hash_add(struct hash_insert *insert, const char *string, void *data);
+void *hash_iterate(const struct hash_table *head,
+ struct hash_tbl_node **iterator,
+ const char **key);
+void hash_free(struct hash_table *head);
+void hash_free_all(struct hash_table *head, bool free_keys);
+
+#endif /* NASM_HASHTBL_H */
diff --git a/include/iflag.h b/include/iflag.h
new file mode 100644
index 00000000..5280703e
--- /dev/null
+++ b/include/iflag.h
@@ -0,0 +1,173 @@
+#ifndef NASM_IFLAG_H
+#define NASM_IFLAG_H
+
+#include "compiler.h"
+#include "ilog2.h"
+
+#include <string.h>
+
+#include "iflaggen.h"
+
+#define IF_GENBIT(bit) (UINT32_C(1) << (bit))
+
+static inline bool iflag_test(const iflag_t *f, unsigned int bit)
+{
+ return !!(f->field[bit >> 5] & IF_GENBIT(bit & 31));
+}
+
+static inline void iflag_set(iflag_t *f, unsigned int bit)
+{
+ f->field[bit >> 5] |= IF_GENBIT(bit & 31);
+}
+
+static inline void iflag_clear(iflag_t *f, unsigned int bit)
+{
+ f->field[bit >> 5] &= ~IF_GENBIT(bit & 31);
+}
+
+static inline void iflag_clear_all(iflag_t *f)
+{
+ memset(f, 0, sizeof(*f));
+}
+
+static inline void iflag_set_all(iflag_t *f)
+{
+ memset(f, ~0, sizeof(*f));
+}
+
+#define iflag_for_each_field(v) for ((v) = 0; (v) < IF_FIELD_COUNT; (v)++)
+
+static inline int iflag_cmp(const iflag_t *a, const iflag_t *b)
+{
+ int i;
+
+ /* This is intentionally a reverse loop! */
+ for (i = IF_FIELD_COUNT-1; i >= 0; i--) {
+ if (a->field[i] == b->field[i])
+ continue;
+
+ return (int)(a->field[i] - b->field[i]);
+ }
+
+ return 0;
+}
+
+#define IF_GEN_HELPER(name, op) \
+ static inline iflag_t iflag_##name(const iflag_t *a, const iflag_t *b) \
+ { \
+ unsigned int i; \
+ iflag_t res; \
+ \
+ iflag_for_each_field(i) \
+ res.field[i] = a->field[i] op b->field[i]; \
+ \
+ return res; \
+ }
+
+IF_GEN_HELPER(xor, ^)
+
+/* Some helpers which are to work with predefined masks */
+#define IF_SMASK \
+ (IF_GENBIT(IF_SB) |\
+ IF_GENBIT(IF_SW) |\
+ IF_GENBIT(IF_SD) |\
+ IF_GENBIT(IF_SQ) |\
+ IF_GENBIT(IF_SO) |\
+ IF_GENBIT(IF_SY) |\
+ IF_GENBIT(IF_SZ) |\
+ IF_GENBIT(IF_SIZE))
+#define IF_ARMASK \
+ (IF_GENBIT(IF_AR0) |\
+ IF_GENBIT(IF_AR1) |\
+ IF_GENBIT(IF_AR2) |\
+ IF_GENBIT(IF_AR3) |\
+ IF_GENBIT(IF_AR4))
+
+#define _itemp_smask(idx) (insns_flags[(idx)].field[0] & IF_SMASK)
+#define _itemp_armask(idx) (insns_flags[(idx)].field[0] & IF_ARMASK)
+#define _itemp_arg(idx) ((_itemp_armask(idx) >> IF_AR0) - 1)
+
+#define itemp_smask(itemp) _itemp_smask((itemp)->iflag_idx)
+#define itemp_arg(itemp) _itemp_arg((itemp)->iflag_idx)
+#define itemp_armask(itemp) _itemp_armask((itemp)->iflag_idx)
+
+/*
+ * IF_8086 is the first CPU level flag and IF_PLEVEL the last
+ */
+#if IF_8086 & 31
+#error "IF_8086 must be on a uint32_t boundary"
+#endif
+#define IF_PLEVEL IF_IA64
+#define IF_CPU_FIELD (IF_8086 >> 5)
+#define IF_CPU_LEVEL_MASK ((IF_GENBIT(IF_PLEVEL & 31) << 1) - 1)
+
+/*
+ * IF_PRIV is the firstr instruction filtering flag
+ */
+#if IF_PRIV & 31
+#error "IF_PRIV must be on a uint32_t boundary"
+#endif
+#define IF_FEATURE_FIELD (IF_PRIV >> 5)
+
+static inline int iflag_cmp_cpu(const iflag_t *a, const iflag_t *b)
+{
+ return (int)(a->field[IF_CPU_FIELD] - b->field[IF_CPU_FIELD]);
+}
+
+static inline uint32_t _iflag_cpu_level(const iflag_t *a)
+{
+ return a->field[IF_CPU_FIELD] & IF_CPU_LEVEL_MASK;
+}
+
+static inline int iflag_cmp_cpu_level(const iflag_t *a, const iflag_t *b)
+{
+ uint32_t aa = _iflag_cpu_level(a);
+ uint32_t bb = _iflag_cpu_level(b);
+
+ return (int)(aa - bb);
+}
+
+/* Returns true if the CPU level is at least a certain value */
+static inline bool iflag_cpu_level_ok(const iflag_t *a, unsigned int bit)
+{
+ return _iflag_cpu_level(a) >= IF_GENBIT(bit & 31);
+}
+
+static inline void iflag_set_all_features(iflag_t *a)
+{
+ size_t i;
+
+ for (i = IF_FEATURE_FIELD; i < IF_CPU_FIELD; i++)
+ a->field[i] = ~UINT32_C(0);
+}
+
+static inline void iflag_set_cpu(iflag_t *a, unsigned int cpu)
+{
+ a->field[0] = 0; /* Not applicable to the CPU type */
+ iflag_set_all_features(a); /* All feature masking bits set for now */
+ a->field[IF_CPU_FIELD] &= ~IF_CPU_LEVEL_MASK;
+ iflag_set(a, cpu);
+}
+
+static inline void iflag_set_default_cpu(iflag_t *a)
+{
+ iflag_set_cpu(a, IF_PLEVEL);
+}
+
+static inline iflag_t _iflag_pfmask(const iflag_t *a)
+{
+ iflag_t r;
+
+ iflag_clear_all(&r);
+
+ if (iflag_test(a, IF_CYRIX))
+ iflag_set(&r, IF_CYRIX);
+ if (iflag_test(a, IF_AMD))
+ iflag_set(&r, IF_AMD);
+
+ return r;
+}
+
+#define iflag_pfmask(itemp) _iflag_pfmask(&insns_flags[(itemp)->iflag_idx])
+
+#endif /* NASM_IFLAG_H */
diff --git a/include/ilog2.h b/include/ilog2.h
new file mode 100644
index 00000000..295ca3f6
--- /dev/null
+++ b/include/ilog2.h
@@ -0,0 +1,204 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef ILOG2_H
+#define ILOG2_H
+
+#include "compiler.h"
+#include <limits.h>
+
+#ifdef ILOG2_C /* For generating the out-of-line functions */
+# ifndef HAVE_MSVC_INLINE
+# undef extern_inline
+# define extern_inline
+# endif
+# define inline_prototypes
+#endif
+
+#ifdef inline_prototypes
+extern unsigned int const_func ilog2_32(uint32_t v);
+extern unsigned int const_func ilog2_64(uint64_t v);
+extern unsigned int const_func ilog2_64(uint64_t vv);
+extern int const_func alignlog2_32(uint32_t v);
+extern int const_func alignlog2_64(uint64_t v);
+#endif
+
+#ifdef extern_inline
+
+#define ROUND(v, a, w) \
+ do { \
+ if (v & (((UINT32_C(1) << w) - 1) << w)) { \
+ a += w; \
+ v >>= w; \
+ } \
+ } while (0)
+
+
+#if defined(HAVE___BUILTIN_CLZ) && INT_MAX == 2147483647
+
+extern_inline unsigned int const_func ilog2_32(uint32_t v)
+{
+ if (!v)
+ return 0;
+
+ return __builtin_clz(v) ^ 31;
+}
+
+#elif defined(__GNUC__) && defined(__x86_64__)
+
+extern_inline unsigned int const_func ilog2_32(uint32_t v)
+{
+ unsigned int n;
+
+ __asm__("bsrl %1,%0"
+ : "=r" (n)
+ : "rm" (v), "0" (0));
+ return n;
+}
+
+#elif defined(__GNUC__) && defined(__i386__)
+
+extern_inline unsigned int const_func ilog2_32(uint32_t v)
+{
+ unsigned int n;
+
+#ifdef __i686__
+ __asm__("bsrl %1,%0 ; cmovz %2,%0\n"
+ : "=&r" (n)
+ : "rm" (v), "r" (0));
+#else
+ __asm__("bsrl %1,%0 ; jnz 1f ; xorl %0,%0\n"
+ "1:"
+ : "=&r" (n)
+ : "rm" (v));
+#endif
+ return n;
+}
+
+#elif defined(HAVE__BITSCANREVERSE)
+
+extern_inline unsigned int const_func ilog2_32(uint32_t v)
+{
+ unsigned long ix;
+ return _BitScanReverse(&ix, v) ? v : 0;
+}
+
+#else
+
+extern_inline unsigned int const_func ilog2_32(uint32_t v)
+{
+ unsigned int p = 0;
+
+ ROUND(v, p, 16);
+ ROUND(v, p, 8);
+ ROUND(v, p, 4);
+ ROUND(v, p, 2);
+ ROUND(v, p, 1);
+
+ return p;
+}
+
+#endif
+
+#if defined(HAVE__BUILTIN_CLZLL) && LLONG_MAX == 9223372036854775807LL
+
+extern_inline unsigned int const_func ilog2_64(uint64_t v)
+{
+ if (!v)
+ return 0;
+
+ return __builtin_clzll(v) ^ 63;
+}
+
+#elif defined(__GNUC__) && defined(__x86_64__)
+
+extern_inline unsigned int const_func ilog2_64(uint64_t v)
+{
+ uint64_t n;
+
+ __asm__("bsrq %1,%0"
+ : "=r" (n)
+ : "rm" (v), "0" (UINT64_C(0)));
+ return n;
+}
+
+#elif defined(HAVE__BITSCANREVERSE64)
+
+extern_inline unsigned int const_func ilog2_64(uint64_t v)
+{
+ unsigned long ix;
+ return _BitScanReverse64(&ix, v) ? ix : 0;
+}
+
+#else
+
+extern_inline unsigned int const_func ilog2_64(uint64_t vv)
+{
+ unsigned int p = 0;
+ uint32_t v;
+
+ v = vv >> 32;
+ if (v)
+ p += 32;
+ else
+ v = vv;
+
+ return p + ilog2_32(v);
+}
+
+#endif
+
+/*
+ * v == 0 ? 0 : is_power2(x) ? ilog2_X(v) : -1
+ */
+extern_inline int const_func alignlog2_32(uint32_t v)
+{
+ if (unlikely(v & (v-1)))
+ return -1; /* invalid alignment */
+
+ return ilog2_32(v);
+}
+
+extern_inline int const_func alignlog2_64(uint64_t v)
+{
+ if (unlikely(v & (v-1)))
+ return -1; /* invalid alignment */
+
+ return ilog2_64(v);
+}
+
+#undef ROUND
+
+#endif /* extern_inline */
+
+#endif /* ILOG2_H */
diff --git a/include/insns.h b/include/insns.h
new file mode 100644
index 00000000..00de2887
--- /dev/null
+++ b/include/insns.h
@@ -0,0 +1,132 @@
+/* insns.h header file for insns.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the license given in the file "LICENSE"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_INSNS_H
+#define NASM_INSNS_H
+
+#include "nasm.h"
+#include "tokens.h"
+#include "iflag.h"
+
+/* if changed, ITEMPLATE_END should be also changed accordingly */
+struct itemplate {
+ enum opcode opcode; /* the token, passed from "parser.c" */
+ int operands; /* number of operands */
+ opflags_t opd[MAX_OPERANDS]; /* bit flags for operand types */
+ decoflags_t deco[MAX_OPERANDS]; /* bit flags for operand decorators */
+ const uint8_t *code; /* the code it assembles to */
+ uint32_t iflag_idx; /* some flags referenced by index */
+};
+
+/* Use this helper to test instruction template flags */
+static inline bool itemp_has(const struct itemplate *itemp, unsigned int bit)
+{
+ return iflag_test(&insns_flags[itemp->iflag_idx], bit);
+}
+
+/* Disassembler table structure */
+
+/*
+ * If n == -1, then p points to another table of 256
+ * struct disasm_index, otherwise p points to a list of n
+ * struct itemplates to consider.
+ */
+struct disasm_index {
+ const void *p;
+ int n;
+};
+
+/* Tables for the assembler and disassembler, respectively */
+extern const struct itemplate * const nasm_instructions[];
+extern const struct disasm_index itable[256];
+extern const struct disasm_index * const itable_vex[NASM_VEX_CLASSES][32][4];
+
+/* Common table for the byte codes */
+extern const uint8_t nasm_bytecodes[];
+
+/*
+ * this define is used to signify the end of an itemplate
+ */
+#define ITEMPLATE_END {I_none,0,{0,},{0,},NULL,0}
+
+/*
+ * Pseudo-op tests
+ */
+/* DB-type instruction (DB, DW, ...) */
+static inline bool const_func opcode_is_db(enum opcode opcode)
+{
+ return opcode >= I_DB && opcode < I_RESB;
+}
+
+/* RESB-type instruction (RESB, RESW, ...) */
+static inline bool const_func opcode_is_resb(enum opcode opcode)
+{
+ return opcode >= I_RESB && opcode < I_INCBIN;
+}
+
+/* Width of Dx and RESx instructions */
+
+/*
+ * initialized data bytes length from opcode
+ */
+static inline int const_func db_bytes(enum opcode opcode)
+{
+ switch (opcode) {
+ case I_DB:
+ return 1;
+ case I_DW:
+ return 2;
+ case I_DD:
+ return 4;
+ case I_DQ:
+ return 8;
+ case I_DT:
+ return 10;
+ case I_DO:
+ return 16;
+ case I_DY:
+ return 32;
+ case I_DZ:
+ return 64;
+ case I_none:
+ return -1;
+ default:
+ return 0;
+ }
+}
+
+/*
+ * Uninitialized data bytes length from opcode
+ */
+static inline int const_func resb_bytes(enum opcode opcode)
+{
+ switch (opcode) {
+ case I_RESB:
+ return 1;
+ case I_RESW:
+ return 2;
+ case I_RESD:
+ return 4;
+ case I_RESQ:
+ return 8;
+ case I_REST:
+ return 10;
+ case I_RESO:
+ return 16;
+ case I_RESY:
+ return 32;
+ case I_RESZ:
+ return 64;
+ case I_none:
+ return -1;
+ default:
+ return 0;
+ }
+}
+
+#endif /* NASM_INSNS_H */
diff --git a/include/labels.h b/include/labels.h
new file mode 100644
index 00000000..9cf57c1b
--- /dev/null
+++ b/include/labels.h
@@ -0,0 +1,74 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * labels.h header file for labels.c
+ */
+
+#ifndef LABELS_H
+#define LABELS_H
+
+#include "compiler.h"
+
+enum mangle_index {
+ LM_LPREFIX, /* Local variable prefix */
+ LM_LSUFFIX, /* Local variable suffix */
+ LM_GPREFIX, /* Global variable prefix */
+ LM_GSUFFIX /* GLobal variable suffix */
+};
+
+enum label_type {
+ LBL_LOCAL, /* Must be zero */
+ LBL_GLOBAL,
+ LBL_STATIC,
+ LBL_EXTERN,
+ LBL_COMMON,
+ LBL_SPECIAL, /* Magic symbols like ..start */
+ LBL_BACKEND /* Backend-defined symbols like ..got */
+};
+
+bool lookup_label(const char *label, int32_t *segment, int64_t *offset);
+bool is_extern(const char *label);
+void define_label(const char *label, int32_t segment, int64_t offset,
+ bool normal);
+void backend_label(const char *label, int32_t segment, int64_t offset);
+bool declare_label(const char *label, enum label_type type,
+ const char *special);
+void set_label_mangle(enum mangle_index which, const char *what);
+int init_labels(void);
+void cleanup_labels(void);
+const char *local_scope(const char *label);
+
+extern uint64_t global_offset_changed;
+
+#endif /* LABELS_H */
diff --git a/include/md5.h b/include/md5.h
new file mode 100644
index 00000000..cb779105
--- /dev/null
+++ b/include/md5.h
@@ -0,0 +1,21 @@
+#ifndef MD5_H
+#define MD5_H
+
+#include "compiler.h"
+
+#define MD5_HASHBYTES 16
+
+typedef struct MD5Context {
+ uint32_t buf[4];
+ uint32_t bits[2];
+ unsigned char in[64];
+} MD5_CTX;
+
+extern void MD5Init(MD5_CTX *context);
+extern void MD5Update(MD5_CTX *context, unsigned char const *buf,
+ unsigned len);
+extern void MD5Final(unsigned char digest[MD5_HASHBYTES], MD5_CTX *context);
+extern void MD5Transform(uint32_t buf[4], uint32_t const in[16]);
+extern char * MD5End(MD5_CTX *, char *);
+
+#endif /* !MD5_H */
diff --git a/include/nasm.h b/include/nasm.h
new file mode 100644
index 00000000..463b91bf
--- /dev/null
+++ b/include/nasm.h
@@ -0,0 +1,1283 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasm.h main header file for the Netwide Assembler: inter-module interface
+ */
+
+#ifndef NASM_NASM_H
+#define NASM_NASM_H
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <time.h>
+
+#include "nasmlib.h"
+#include "strlist.h"
+#include "preproc.h"
+#include "insnsi.h" /* For enum opcode */
+#include "directiv.h" /* For enum directive */
+#include "labels.h" /* For enum mangle_index, enum label_type */
+#include "opflags.h"
+#include "regs.h"
+
+/* Time stamp for the official start of compilation */
+struct compile_time {
+ time_t t;
+ bool have_local, have_gm, have_posix;
+ int64_t posix;
+ struct tm local;
+ struct tm gm;
+};
+extern struct compile_time official_compile_time;
+
+#define NO_SEG INT32_C(-1) /* null segment value */
+#define SEG_ABS 0x40000000L /* mask for far-absolute segments */
+
+#define IDLEN_MAX 4096
+#define DECOLEN_MAX 32
+
+/*
+ * Name pollution problems: <time.h> on Digital UNIX pulls in some
+ * strange hardware header file which sees fit to define R_SP. We
+ * undefine it here so as not to break the enum below.
+ */
+#ifdef R_SP
+#undef R_SP
+#endif
+
+/*
+ * We must declare the existence of this structure type up here,
+ * since we have to reference it before we define it...
+ */
+struct ofmt;
+
+/*
+ * Values for the `type' parameter to an output function.
+ */
+enum out_type {
+ OUT_RAWDATA, /* Plain bytes */
+ OUT_RESERVE, /* Reserved bytes (RESB et al) */
+ OUT_ZERODATA, /* Initialized data, but all zero */
+ OUT_ADDRESS, /* An address (symbol value) */
+ OUT_RELADDR, /* A relative address */
+ OUT_SEGMENT, /* A segment number */
+
+ /*
+ * These values are used by the legacy backend interface only;
+ * see output/legacy.c for more information. These should never
+ * be used otherwise. Once all backends have been migrated to the
+ * new interface they should be removed.
+ */
+ OUT_REL1ADR,
+ OUT_REL2ADR,
+ OUT_REL4ADR,
+ OUT_REL8ADR
+};
+
+enum out_sign {
+ OUT_WRAP, /* Undefined signedness (wraps) */
+ OUT_SIGNED, /* Value is signed */
+ OUT_UNSIGNED /* Value is unsigned */
+};
+
+/*
+ * The data we send down to the backend.
+ * XXX: We still want to push down the base address symbol if
+ * available, and replace the segment numbers with a structure.
+ */
+struct out_data {
+ int64_t offset; /* Offset within segment */
+ int32_t segment; /* Segment written to */
+ enum out_type type; /* See above */
+ enum out_sign sign; /* See above */
+ int inslen; /* Length of instruction */
+ int insoffs; /* Offset inside instruction */
+ int bits; /* Bits mode of compilation */
+ uint64_t size; /* Size of output */
+ const struct itemplate *itemp; /* Instruction template */
+ const void *data; /* Data for OUT_RAWDATA */
+ uint64_t toffset; /* Target address offset for relocation */
+ int32_t tsegment; /* Target segment for relocation */
+ int32_t twrt; /* Relocation with respect to */
+ int64_t relbase; /* Relative base for OUT_RELADDR */
+};
+
+/*
+ * And a label-definition function. The boolean parameter
+ * `is_norm' states whether the label is a `normal' label (which
+ * should affect the local-label system), or something odder like
+ * an EQU or a segment-base symbol, which shouldn't.
+ */
+typedef void (*ldfunc)(char *label, int32_t segment, int64_t offset,
+ char *special, bool is_norm);
+
+/*
+ * Token types returned by the scanner, in addition to ordinary
+ * ASCII character values, and zero for end-of-string.
+ */
+enum token_type { /* token types, other than chars */
+ TOKEN_INVALID = -1, /* a placeholder value */
+ TOKEN_EOS = 0, /* end of string */
+ TOKEN_EQ = '=',
+ TOKEN_GT = '>',
+ TOKEN_LT = '<', /* aliases */
+ TOKEN_ID = 256, /* identifier */
+ TOKEN_NUM, /* numeric constant */
+ TOKEN_ERRNUM, /* malformed numeric constant */
+ TOKEN_STR, /* string constant */
+ TOKEN_ERRSTR, /* unterminated string constant */
+ TOKEN_FLOAT, /* floating-point constant */
+ TOKEN_REG, /* register name */
+ TOKEN_INSN, /* instruction name */
+ TOKEN_HERE, /* $ */
+ TOKEN_BASE, /* $$ */
+ TOKEN_SPECIAL, /* BYTE, WORD, DWORD, QWORD, FAR, NEAR, etc */
+ TOKEN_PREFIX, /* A32, O16, LOCK, REPNZ, TIMES, etc */
+ TOKEN_SHL, /* << or <<< */
+ TOKEN_SHR, /* >> */
+ TOKEN_SAR, /* >>> */
+ TOKEN_SDIV, /* // */
+ TOKEN_SMOD, /* %% */
+ TOKEN_GE, /* >= */
+ TOKEN_LE, /* <= */
+ TOKEN_NE, /* <> (!= is same as <>) */
+ TOKEN_DBL_AND, /* && */
+ TOKEN_DBL_OR, /* || */
+ TOKEN_DBL_XOR, /* ^^ */
+ TOKEN_SEG, /* SEG */
+ TOKEN_WRT, /* WRT */
+ TOKEN_FLOATIZE, /* __floatX__ */
+ TOKEN_STRFUNC, /* __utf16*__, __utf32*__ */
+ TOKEN_IFUNC, /* __ilog2*__ */
+ TOKEN_DECORATOR, /* decorators such as {...} */
+ TOKEN_OPMASK /* translated token for opmask registers */
+};
+
+enum floatize {
+ FLOAT_8,
+ FLOAT_16,
+ FLOAT_32,
+ FLOAT_64,
+ FLOAT_80M,
+ FLOAT_80E,
+ FLOAT_128L,
+ FLOAT_128H
+};
+
+/* Must match the list in string_transform(), in strfunc.c */
+enum strfunc {
+ STRFUNC_UTF16,
+ STRFUNC_UTF16LE,
+ STRFUNC_UTF16BE,
+ STRFUNC_UTF32,
+ STRFUNC_UTF32LE,
+ STRFUNC_UTF32BE
+};
+
+enum ifunc {
+ IFUNC_ILOG2E,
+ IFUNC_ILOG2W,
+ IFUNC_ILOG2F,
+ IFUNC_ILOG2C
+};
+
+size_t string_transform(char *, size_t, char **, enum strfunc);
+
+/*
+ * The expression evaluator must be passed a scanner function; a
+ * standard scanner is provided as part of nasmlib.c. The
+ * preprocessor will use a different one. Scanners, and the
+ * token-value structures they return, look like this.
+ *
+ * The return value from the scanner is always a copy of the
+ * `t_type' field in the structure.
+ */
+struct tokenval {
+ char *t_charptr;
+ int64_t t_integer;
+ int64_t t_inttwo;
+ enum token_type t_type;
+ int8_t t_flag;
+};
+typedef int (*scanner)(void *private_data, struct tokenval *tv);
+
+struct location {
+ int64_t offset;
+ int32_t segment;
+ int known;
+};
+extern struct location location;
+
+/*
+ * Expression-evaluator datatype. Expressions, within the
+ * evaluator, are stored as an array of these beasts, terminated by
+ * a record with type==0. Mostly, it's a vector type: each type
+ * denotes some kind of a component, and the value denotes the
+ * multiple of that component present in the expression. The
+ * exception is the WRT type, whose `value' field denotes the
+ * segment to which the expression is relative. These segments will
+ * be segment-base types, i.e. either odd segment values or SEG_ABS
+ * types. So it is still valid to assume that anything with a
+ * `value' field of zero is insignificant.
+ */
+typedef struct {
+ int32_t type; /* a register, or EXPR_xxx */
+ int64_t value; /* must be >= 32 bits */
+} expr;
+
+/*
+ * Library routines to manipulate expression data types.
+ */
+bool is_reloc(const expr *vect);
+bool is_simple(const expr *vect);
+bool is_really_simple(const expr *vect);
+bool is_unknown(const expr *vect);
+bool is_just_unknown(const expr *vect);
+int64_t reloc_value(const expr *vect);
+int32_t reloc_seg(const expr *vect);
+int32_t reloc_wrt(const expr *vect);
+bool is_self_relative(const expr *vect);
+void dump_expr(const expr *vect);
+
+/*
+ * The evaluator can also return hints about which of two registers
+ * used in an expression should be the base register. See also the
+ * `operand' structure.
+ */
+struct eval_hints {
+ int64_t base;
+ int type;
+};
+
+/*
+ * The actual expression evaluator function looks like this. When
+ * called, it expects the first token of its expression to already
+ * be in `*tv'; if it is not, set tv->t_type to TOKEN_INVALID and
+ * it will start by calling the scanner.
+ *
+ * If a forward reference happens during evaluation, the evaluator
+ * must set `*fwref' to true if `fwref' is non-NULL.
+ *
+ * `critical' is non-zero if the expression may not contain forward
+ * references. The evaluator will report its own error if this
+ * occurs; if `critical' is 1, the error will be "symbol not
+ * defined before use", whereas if `critical' is 2, the error will
+ * be "symbol undefined".
+ *
+ * If `critical' has bit 8 set (in addition to its main value: 0x101
+ * and 0x102 correspond to 1 and 2) then an extended expression
+ * syntax is recognised, in which relational operators such as =, <
+ * and >= are accepted, as well as low-precedence logical operators
+ * &&, ^^ and ||.
+ *
+ * If `hints' is non-NULL, it gets filled in with some hints as to
+ * the base register in complex effective addresses.
+ */
+#define CRITICAL 0x100
+typedef expr *(*evalfunc)(scanner sc, void *scprivate,
+ struct tokenval *tv, int *fwref, int critical,
+ struct eval_hints *hints);
+
+/*
+ * Special values for expr->type.
+ * These come after EXPR_REG_END as defined in regs.h.
+ * Expr types : 0 ~ EXPR_REG_END, EXPR_UNKNOWN, EXPR_...., EXPR_RDSAE,
+ * EXPR_SEGBASE ~ EXPR_SEGBASE + SEG_ABS, ...
+ */
+#define EXPR_UNKNOWN (EXPR_REG_END+1) /* forward references */
+#define EXPR_SIMPLE (EXPR_REG_END+2)
+#define EXPR_WRT (EXPR_REG_END+3)
+#define EXPR_RDSAE (EXPR_REG_END+4)
+#define EXPR_SEGBASE (EXPR_REG_END+5)
+
+/*
+ * preprocessors ought to look like this:
+ */
+struct preproc_ops {
+ /*
+ * Called once at the very start of assembly.
+ */
+ void (*init)(void);
+
+ /*
+ * Called at the start of a pass; given a file name, the number
+ * of the pass, an error reporting function, an evaluator
+ * function, and a listing generator to talk to.
+ */
+ void (*reset)(const char *file, int pass, StrList *deplist);
+
+ /*
+ * Called to fetch a line of preprocessed source. The line
+ * returned has been malloc'ed, and so should be freed after
+ * use.
+ */
+ char *(*getline)(void);
+
+ /* Called at the end of a pass */
+ void (*cleanup)(int pass);
+
+ /* Additional macros specific to output format */
+ void (*extra_stdmac)(macros_t *macros);
+
+ /* Early definitions and undefinitions for macros */
+ void (*pre_define)(char *definition);
+ void (*pre_undefine)(char *definition);
+
+ /* Include file from command line */
+ void (*pre_include)(char *fname);
+
+ /* Add a command from the command line */
+ void (*pre_command)(const char *what, char *str);
+
+ /* Include path from command line */
+ void (*include_path)(const char *path);
+
+ /* Unwind the macro stack when printing an error message */
+ void (*error_list_macros)(int severity);
+};
+
+extern const struct preproc_ops nasmpp;
+extern const struct preproc_ops preproc_nop;
+
+/* List of dependency files */
+extern StrList *depend_list;
+
+/*
+ * Some lexical properties of the NASM source language, included
+ * here because they are shared between the parser and preprocessor.
+ */
+
+/*
+ * isidstart matches any character that may start an identifier, and isidchar
+ * matches any character that may appear at places other than the start of an
+ * identifier. E.g. a period may only appear at the start of an identifier
+ * (for local labels), whereas a number may appear anywhere *but* at the
+ * start.
+ * isbrcchar matches any character that may placed inside curly braces as a
+ * decorator. E.g. {rn-sae}, {1to8}, {k1}{z}
+ */
+
+#define isidstart(c) (nasm_isalpha(c) || \
+ (c) == '_' || \
+ (c) == '.' || \
+ (c) == '?' || \
+ (c) == '@')
+
+#define isidchar(c) (isidstart(c) || \
+ nasm_isdigit(c) || \
+ (c) == '$' || \
+ (c) == '#' || \
+ (c) == '~')
+
+#define isbrcchar(c) (isidchar(c) || \
+ (c) == '-')
+
+/* Ditto for numeric constants. */
+
+#define isnumstart(c) (nasm_isdigit(c) || (c) == '$')
+#define isnumchar(c) (nasm_isalnum(c) || (c) == '_')
+
+/*
+ * inline function to skip past an identifier; returns the first character past
+ * the identifier if valid, otherwise NULL.
+ */
+static inline char *nasm_skip_identifier(const char *str)
+{
+ const char *p = str;
+
+ if (!isidstart(*p++)) {
+ p = NULL;
+ } else {
+ while (isidchar(*p++))
+ ;
+ }
+ return (char *)p;
+}
+
+/*
+ * Data-type flags that get passed to listing-file routines.
+ */
+enum {
+ LIST_READ,
+ LIST_MACRO,
+ LIST_MACRO_NOLIST,
+ LIST_INCLUDE,
+ LIST_INCBIN,
+ LIST_TIMES
+};
+
+/*
+ * -----------------------------------------------------------
+ * Format of the `insn' structure returned from `parser.c' and
+ * passed into `assemble.c'
+ * -----------------------------------------------------------
+ */
+
+/* Verify value to be a valid register */
+static inline bool is_register(int reg)
+{
+ return reg >= EXPR_REG_START && reg < REG_ENUM_LIMIT;
+}
+
+enum ccode { /* condition code names */
+ C_A, C_AE, C_B, C_BE, C_C, C_E, C_G, C_GE, C_L, C_LE, C_NA, C_NAE,
+ C_NB, C_NBE, C_NC, C_NE, C_NG, C_NGE, C_NL, C_NLE, C_NO, C_NP,
+ C_NS, C_NZ, C_O, C_P, C_PE, C_PO, C_S, C_Z,
+ C_none = -1
+};
+
+/*
+ * token flags
+ */
+#define TFLAG_BRC (1 << 0) /* valid only with braces. {1to8}, {rd-sae}, ...*/
+#define TFLAG_BRC_OPT (1 << 1) /* may or may not have braces. opmasks {k1} */
+#define TFLAG_BRC_ANY (TFLAG_BRC | TFLAG_BRC_OPT)
+#define TFLAG_BRDCAST (1 << 2) /* broadcasting decorator */
+#define TFLAG_WARN (1 << 3) /* warning only, treat as ID */
+
+static inline uint8_t get_cond_opcode(enum ccode c)
+{
+ static const uint8_t ccode_opcodes[] = {
+ 0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xf, 0xd, 0xc, 0xe, 0x6, 0x2,
+ 0x3, 0x7, 0x3, 0x5, 0xe, 0xc, 0xd, 0xf, 0x1, 0xb, 0x9, 0x5,
+ 0x0, 0xa, 0xa, 0xb, 0x8, 0x4
+ };
+
+ return ccode_opcodes[(int)c];
+}
+
+/*
+ * REX flags
+ */
+#define REX_MASK 0x4f /* Actual REX prefix bits */
+#define REX_B 0x01 /* ModRM r/m extension */
+#define REX_X 0x02 /* SIB index extension */
+#define REX_R 0x04 /* ModRM reg extension */
+#define REX_W 0x08 /* 64-bit operand size */
+#define REX_L 0x20 /* Use LOCK prefix instead of REX.R */
+#define REX_P 0x40 /* REX prefix present/required */
+#define REX_H 0x80 /* High register present, REX forbidden */
+#define REX_V 0x0100 /* Instruction uses VEX/XOP instead of REX */
+#define REX_NH 0x0200 /* Instruction which doesn't use high regs */
+#define REX_EV 0x0400 /* Instruction uses EVEX instead of REX */
+
+/*
+ * EVEX bit field
+ */
+#define EVEX_P0MM 0x0f /* EVEX P[3:0] : Opcode map */
+#define EVEX_P0RP 0x10 /* EVEX P[4] : High-16 reg */
+#define EVEX_P0X 0x40 /* EVEX P[6] : High-16 rm */
+#define EVEX_P1PP 0x03 /* EVEX P[9:8] : Legacy prefix */
+#define EVEX_P1VVVV 0x78 /* EVEX P[14:11] : NDS register */
+#define EVEX_P1W 0x80 /* EVEX P[15] : Osize extension */
+#define EVEX_P2AAA 0x07 /* EVEX P[18:16] : Embedded opmask */
+#define EVEX_P2VP 0x08 /* EVEX P[19] : High-16 NDS reg */
+#define EVEX_P2B 0x10 /* EVEX P[20] : Broadcast / RC / SAE */
+#define EVEX_P2LL 0x60 /* EVEX P[22:21] : Vector length */
+#define EVEX_P2RC EVEX_P2LL /* EVEX P[22:21] : Rounding control */
+#define EVEX_P2Z 0x80 /* EVEX P[23] : Zeroing/Merging */
+
+/*
+ * REX_V "classes" (prefixes which behave like VEX)
+ */
+enum vex_class {
+ RV_VEX = 0, /* C4/C5 */
+ RV_XOP = 1, /* 8F */
+ RV_EVEX = 2 /* 62 */
+};
+
+/*
+ * Note that because segment registers may be used as instruction
+ * prefixes, we must ensure the enumerations for prefixes and
+ * register names do not overlap.
+ */
+enum prefixes { /* instruction prefixes */
+ P_none = 0,
+ PREFIX_ENUM_START = REG_ENUM_LIMIT,
+ P_A16 = PREFIX_ENUM_START,
+ P_A32,
+ P_A64,
+ P_ASP,
+ P_LOCK,
+ P_O16,
+ P_O32,
+ P_O64,
+ P_OSP,
+ P_REP,
+ P_REPE,
+ P_REPNE,
+ P_REPNZ,
+ P_REPZ,
+ P_TIMES,
+ P_WAIT,
+ P_XACQUIRE,
+ P_XRELEASE,
+ P_BND,
+ P_NOBND,
+ P_EVEX,
+ P_VEX3,
+ P_VEX2,
+ PREFIX_ENUM_LIMIT
+};
+
+enum extop_type { /* extended operand types */
+ EOT_NOTHING,
+ EOT_DB_STRING, /* Byte string */
+ EOT_DB_STRING_FREE, /* Byte string which should be nasm_free'd*/
+ EOT_DB_NUMBER /* Integer */
+};
+
+enum ea_flags { /* special EA flags */
+ EAF_BYTEOFFS = 1, /* force offset part to byte size */
+ EAF_WORDOFFS = 2, /* force offset part to [d]word size */
+ EAF_TIMESTWO = 4, /* really do EAX*2 not EAX+EAX */
+ EAF_REL = 8, /* IP-relative addressing */
+ EAF_ABS = 16, /* non-IP-relative addressing */
+ EAF_FSGS = 32, /* fs/gs segment override present */
+ EAF_MIB = 64 /* mib operand */
+};
+
+enum eval_hint { /* values for `hinttype' */
+ EAH_NOHINT = 0, /* no hint at all - our discretion */
+ EAH_MAKEBASE = 1, /* try to make given reg the base */
+ EAH_NOTBASE = 2, /* try _not_ to make reg the base */
+ EAH_SUMMED = 3 /* base and index are summed into index */
+};
+
+typedef struct operand { /* operand to an instruction */
+ opflags_t type; /* type of operand */
+ int disp_size; /* 0 means default; 16; 32; 64 */
+ enum reg_enum basereg;
+ enum reg_enum indexreg; /* address registers */
+ int scale; /* index scale */
+ int hintbase;
+ enum eval_hint hinttype; /* hint as to real base register */
+ int32_t segment; /* immediate segment, if needed */
+ int64_t offset; /* any immediate number */
+ int32_t wrt; /* segment base it's relative to */
+ int eaflags; /* special EA flags */
+ int opflags; /* see OPFLAG_* defines below */
+ decoflags_t decoflags; /* decorator flags such as {...} */
+} operand;
+
+#define OPFLAG_FORWARD 1 /* operand is a forward reference */
+#define OPFLAG_EXTERN 2 /* operand is an external reference */
+#define OPFLAG_UNKNOWN 4 /* operand is an unknown reference
+ (always a forward reference also) */
+#define OPFLAG_RELATIVE 8 /* operand is self-relative, e.g. [foo - $]
+ where foo is not in the current segment */
+
+typedef struct extop { /* extended operand */
+ struct extop *next; /* linked list */
+ char *stringval; /* if it's a string, then here it is */
+ size_t stringlen; /* ... and here's how long it is */
+ int64_t offset; /* ... it's given here ... */
+ int32_t segment; /* if it's a number/address, then... */
+ int32_t wrt; /* ... and here */
+ bool relative; /* self-relative expression */
+ enum extop_type type; /* defined above */
+} extop;
+
+enum ea_type {
+ EA_INVALID, /* Not a valid EA at all */
+ EA_SCALAR, /* Scalar EA */
+ EA_XMMVSIB, /* XMM vector EA */
+ EA_YMMVSIB, /* YMM vector EA */
+ EA_ZMMVSIB /* ZMM vector EA */
+};
+
+/*
+ * Prefix positions: each type of prefix goes in a specific slot.
+ * This affects the final ordering of the assembled output, which
+ * shouldn't matter to the processor, but if you have stylistic
+ * preferences, you can change this. REX prefixes are handled
+ * differently for the time being.
+ *
+ * LOCK and REP used to be one slot; this is no longer the case since
+ * the introduction of HLE.
+ */
+enum prefix_pos {
+ PPS_WAIT, /* WAIT (technically not a prefix!) */
+ PPS_REP, /* REP/HLE prefix */
+ PPS_LOCK, /* LOCK prefix */
+ PPS_SEG, /* Segment override prefix */
+ PPS_OSIZE, /* Operand size prefix */
+ PPS_ASIZE, /* Address size prefix */
+ PPS_VEX, /* VEX type */
+ MAXPREFIX /* Total number of prefix slots */
+};
+
+/*
+ * Tuple types that are used when determining Disp8*N eligibility
+ * The order must match with a hash %tuple_codes in insns.pl
+ */
+enum ttypes {
+ FV = 001,
+ HV = 002,
+ FVM = 003,
+ T1S8 = 004,
+ T1S16 = 005,
+ T1S = 006,
+ T1F32 = 007,
+ T1F64 = 010,
+ T2 = 011,
+ T4 = 012,
+ T8 = 013,
+ HVM = 014,
+ QVM = 015,
+ OVM = 016,
+ M128 = 017,
+ DUP = 020
+};
+
+/* EVEX.L'L : Vector length on vector insns */
+enum vectlens {
+ VL128 = 0,
+ VL256 = 1,
+ VL512 = 2,
+ VLMAX = 3
+};
+
+/* If you need to change this, also change it in insns.pl */
+#define MAX_OPERANDS 5
+
+typedef struct insn { /* an instruction itself */
+ char *label; /* the label defined, or NULL */
+ int prefixes[MAXPREFIX]; /* instruction prefixes, if any */
+ enum opcode opcode; /* the opcode - not just the string */
+ enum ccode condition; /* the condition code, if Jcc/SETcc */
+ int operands; /* how many operands? 0-3 (more if db et al) */
+ int addr_size; /* address size */
+ operand oprs[MAX_OPERANDS]; /* the operands, defined as above */
+ extop *eops; /* extended operands */
+ int eops_float; /* true if DD and floating */
+ int32_t times; /* repeat count (TIMES prefix) */
+ bool forw_ref; /* is there a forward reference? */
+ bool rex_done; /* REX prefix emitted? */
+ int rex; /* Special REX Prefix */
+ int vexreg; /* Register encoded in VEX prefix */
+ int vex_cm; /* Class and M field for VEX prefix */
+ int vex_wlp; /* W, P and L information for VEX prefix */
+ uint8_t evex_p[3]; /* EVEX.P0: [RXB,R',00,mm], P1: [W,vvvv,1,pp] */
+ /* EVEX.P2: [z,L'L,b,V',aaa] */
+ enum ttypes evex_tuple; /* Tuple type for compressed Disp8*N */
+ int evex_rm; /* static rounding mode for AVX512 (EVEX) */
+ int8_t evex_brerop; /* BR/ER/SAE operand position */
+} insn;
+
+/* Instruction flags type: IF_* flags are defined in insns.h */
+typedef uint64_t iflags_t;
+
+/*
+ * What to return from a directive- or pragma-handling function.
+ * Currently DIRR_OK and DIRR_ERROR are treated the same way;
+ * in both cases the backend is expected to produce the appropriate
+ * error message on its own.
+ *
+ * DIRR_BADPARAM causes a generic error message to be printed. Note
+ * that it is an error, not a warning, even in the case of pragmas;
+ * don't use it where forward compatiblity would be compromised
+ * (instead consider adding a DIRR_WARNPARAM.)
+ */
+enum directive_result {
+ DIRR_UNKNOWN, /* Directive not handled by backend */
+ DIRR_OK, /* Directive processed */
+ DIRR_ERROR, /* Directive processed unsuccessfully */
+ DIRR_BADPARAM /* Print bad argument error message */
+};
+
+/*
+ * A pragma facility: this structure is used to request passing a
+ * parsed pragma directive for a specific facility. If the handler is
+ * NULL then this pragma facility is recognized but ignored; pragma
+ * processing stops at that point.
+ *
+ * Note that the handler is passed a pointer to the facility structure
+ * as part of the struct pragma.
+ */
+struct pragma;
+typedef enum directive_result (*pragma_handler)(const struct pragma *);
+
+struct pragma_facility {
+ const char *name;
+ pragma_handler handler;
+};
+
+/*
+ * This structure defines how a pragma directive is passed to a
+ * facility. This structure may be augmented in the future.
+ *
+ * Any facility MAY, but is not required to, add its operations
+ * keywords or a subset thereof into asm/directiv.dat, in which case
+ * the "opcode" field will be set to the corresponding D_ constant
+ * from directiv.h; otherwise it will be D_unknown.
+ */
+struct pragma {
+ const struct pragma_facility *facility;
+ const char *facility_name; /* Facility name exactly as entered by user */
+ const char *opname; /* First word after the facility name */
+ const char *tail; /* Anything after the operation */
+ enum directive opcode; /* Operation as a D_ directives constant */
+};
+
+/*
+ * These are semi-arbitrary limits to keep the assembler from going
+ * into a black hole on certain kinds of bugs. They can be overridden
+ * by command-line options or %pragma.
+ */
+enum nasm_limit {
+ LIMIT_PASSES,
+ LIMIT_STALLED,
+ LIMIT_MACROS,
+ LIMIT_REP,
+ LIMIT_EVAL,
+ LIMIT_LINES
+};
+#define LIMIT_MAX LIMIT_LINES
+extern int64_t nasm_limit[LIMIT_MAX+1];
+extern enum directive_result nasm_set_limit(const char *, const char *);
+
+/*
+ * The data structure defining an output format driver, and the
+ * interfaces to the functions therein.
+ */
+struct ofmt {
+ /*
+ * This is a short (one-liner) description of the type of
+ * output generated by the driver.
+ */
+ const char *fullname;
+
+ /*
+ * This is a single keyword used to select the driver.
+ */
+ const char *shortname;
+
+ /*
+ * Default output filename extension, or a null string
+ */
+ const char *extension;
+
+ /*
+ * Output format flags.
+ */
+#define OFMT_TEXT 1 /* Text file format */
+#define OFMT_KEEP_ADDR 2 /* Keep addr; no conversion to data */
+
+ unsigned int flags;
+
+ int maxbits; /* Maximum segment bits supported */
+
+ /*
+ * this is a pointer to the first element of the debug information
+ */
+ const struct dfmt * const *debug_formats;
+
+ /*
+ * the default debugging format if -F is not specified
+ */
+ const struct dfmt *default_dfmt;
+
+ /*
+ * This, if non-NULL, is a NULL-terminated list of `char *'s
+ * pointing to extra standard macros supplied by the object
+ * format (e.g. a sensible initial default value of __SECT__,
+ * and user-level equivalents for any format-specific
+ * directives).
+ */
+ macros_t *stdmac;
+
+ /*
+ * This procedure is called at the start of an output session to set
+ * up internal parameters.
+ */
+ void (*init)(void);
+
+ /*
+ * This procedure is called at the start of each pass.
+ */
+ void (*reset)(void);
+
+ /*
+ * This is the modern output function, which gets passed
+ * a struct out_data with much more information. See the
+ * definition of struct out_data.
+ */
+ void (*output)(const struct out_data *data);
+
+ /*
+ * This procedure is called by assemble() to write actual
+ * generated code or data to the object file. Typically it
+ * doesn't have to actually _write_ it, just store it for
+ * later.
+ *
+ * The `type' argument specifies the type of output data, and
+ * usually the size as well: its contents are described below.
+ *
+ * This is used for backends which have not yet been ported to
+ * the new interface, and should be NULL on ported backends.
+ * To use this entry point, set the output pointer to
+ * nasm_do_legacy_output.
+ */
+ void (*legacy_output)(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt);
+
+ /*
+ * This procedure is called once for every symbol defined in
+ * the module being assembled. It gives the name and value of
+ * the symbol, in NASM's terms, and indicates whether it has
+ * been declared to be global. Note that the parameter "name",
+ * when passed, will point to a piece of static storage
+ * allocated inside the label manager - it's safe to keep using
+ * that pointer, because the label manager doesn't clean up
+ * until after the output driver has.
+ *
+ * Values of `is_global' are: 0 means the symbol is local; 1
+ * means the symbol is global; 2 means the symbol is common (in
+ * which case `offset' holds the _size_ of the variable).
+ * Anything else is available for the output driver to use
+ * internally.
+ *
+ * This routine explicitly _is_ allowed to call the label
+ * manager to define further symbols, if it wants to, even
+ * though it's been called _from_ the label manager. That much
+ * re-entrancy is guaranteed in the label manager. However, the
+ * label manager will in turn call this routine, so it should
+ * be prepared to be re-entrant itself.
+ *
+ * The `special' parameter contains special information passed
+ * through from the command that defined the label: it may have
+ * been an EXTERN, a COMMON or a GLOBAL. The distinction should
+ * be obvious to the output format from the other parameters.
+ */
+ void (*symdef)(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special);
+
+ /*
+ * This procedure is called when the source code requests a
+ * segment change. It should return the corresponding segment
+ * _number_ for the name, or NO_SEG if the name is not a valid
+ * segment name.
+ *
+ * It may also be called with NULL, in which case it is to
+ * return the _default_ section number for starting assembly in.
+ *
+ * It is allowed to modify the string it is given a pointer to.
+ *
+ * It is also allowed to specify a default instruction size for
+ * the segment, by setting `*bits' to 16 or 32. Or, if it
+ * doesn't wish to define a default, it can leave `bits' alone.
+ */
+ int32_t (*section)(char *name, int pass, int *bits);
+
+ /*
+ * This function is called when a label is defined
+ * in the source code. It is allowed to change the section
+ * number as a result, but not the bits value.
+ * This is *only* called if the symbol defined is at the
+ * current offset, i.e. "foo:" or "foo equ $".
+ * The offset isn't passed; and may not be stable at this point.
+ * The subsection number is a field available for use by the
+ * backend. It is initialized to NO_SEG.
+ *
+ * If "copyoffset" is set by the backend then the offset is
+ * copied from the previous segment, otherwise the new segment
+ * is treated as a new segment the normal way.
+ */
+ int32_t (*herelabel)(const char *name, enum label_type type,
+ int32_t seg, int32_t *subsection,
+ bool *copyoffset);
+
+ /*
+ * This procedure is called to modify section alignment,
+ * note there is a trick, the alignment can only increase
+ */
+ void (*sectalign)(int32_t seg, unsigned int value);
+
+ /*
+ * This procedure is called to modify the segment base values
+ * returned from the SEG operator. It is given a segment base
+ * value (i.e. a segment value with the low bit set), and is
+ * required to produce in return a segment value which may be
+ * different. It can map segment bases to absolute numbers by
+ * means of returning SEG_ABS types.
+ *
+ * It should return NO_SEG if the segment base cannot be
+ * determined; the evaluator (which calls this routine) is
+ * responsible for throwing an error condition if that occurs
+ * in pass two or in a critical expression.
+ */
+ int32_t (*segbase)(int32_t segment);
+
+ /*
+ * This procedure is called to allow the output driver to
+ * process its own specific directives. When called, it has the
+ * directive word in `directive' and the parameter string in
+ * `value'. It is called in both assembly passes, and `pass'
+ * will be either 1 or 2.
+ *
+ * The following values are (currently) possible for
+ * directive_result:
+ *
+ * 0 - DIRR_UNKNOWN - directive not recognized by backend
+ * 1 - DIRR_OK - directive processed ok
+ * 2 - DIRR_ERROR - backend printed its own error message
+ * 3 - DIRR_BADPARAM - print the generic message
+ * "invalid parameter to [*] directive"
+ */
+ enum directive_result
+ (*directive)(enum directive directive, char *value, int pass);
+
+ /*
+ * This procedure is called after assembly finishes, to allow
+ * the output driver to clean itself up and free its memory.
+ * Typically, it will also be the point at which the object
+ * file actually gets _written_.
+ *
+ * One thing the cleanup routine should always do is to close
+ * the output file pointer.
+ */
+ void (*cleanup)(void);
+
+ /*
+ * List of pragma facility names that apply to this backend.
+ */
+ const struct pragma_facility *pragmas;
+};
+
+/*
+ * Output format driver alias
+ */
+struct ofmt_alias {
+ const char *shortname;
+ const char *fullname;
+ const struct ofmt *ofmt;
+};
+
+extern const struct ofmt *ofmt;
+extern FILE *ofile;
+
+/*
+ * ------------------------------------------------------------
+ * The data structure defining a debug format driver, and the
+ * interfaces to the functions therein.
+ * ------------------------------------------------------------
+ */
+
+struct dfmt {
+ /*
+ * This is a short (one-liner) description of the type of
+ * output generated by the driver.
+ */
+ const char *fullname;
+
+ /*
+ * This is a single keyword used to select the driver.
+ */
+ const char *shortname;
+
+ /*
+ * init - called initially to set up local pointer to object format.
+ */
+ void (*init)(void);
+
+ /*
+ * linenum - called any time there is output with a change of
+ * line number or file.
+ */
+ void (*linenum)(const char *filename, int32_t linenumber, int32_t segto);
+
+ /*
+ * debug_deflabel - called whenever a label is defined. Parameters
+ * are the same as to 'symdef()' in the output format. This function
+ * is called after the output format version.
+ */
+
+ void (*debug_deflabel)(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special);
+ /*
+ * debug_directive - called whenever a DEBUG directive other than 'LINE'
+ * is encountered. 'directive' contains the first parameter to the
+ * DEBUG directive, and params contains the rest. For example,
+ * 'DEBUG VAR _somevar:int' would translate to a call to this
+ * function with 'directive' equal to "VAR" and 'params' equal to
+ * "_somevar:int".
+ */
+ void (*debug_directive)(const char *directive, const char *params);
+
+ /*
+ * typevalue - called whenever the assembler wishes to register a type
+ * for the last defined label. This routine MUST detect if a type was
+ * already registered and not re-register it.
+ */
+ void (*debug_typevalue)(int32_t type);
+
+ /*
+ * debug_output - called whenever output is required
+ * 'type' is the type of info required, and this is format-specific
+ */
+ void (*debug_output)(int type, void *param);
+
+ /*
+ * cleanup - called after processing of file is complete
+ */
+ void (*cleanup)(void);
+
+ /*
+ * List of pragma facility names that apply to this backend.
+ */
+ const struct pragma_facility *pragmas;
+};
+
+extern const struct dfmt *dfmt;
+
+/*
+ * The type definition macros
+ * for debugging
+ *
+ * low 3 bits: reserved
+ * next 5 bits: type
+ * next 24 bits: number of elements for arrays (0 for labels)
+ */
+
+#define TY_UNKNOWN 0x00
+#define TY_LABEL 0x08
+#define TY_BYTE 0x10
+#define TY_WORD 0x18
+#define TY_DWORD 0x20
+#define TY_FLOAT 0x28
+#define TY_QWORD 0x30
+#define TY_TBYTE 0x38
+#define TY_OWORD 0x40
+#define TY_YWORD 0x48
+#define TY_ZWORD 0x50
+#define TY_COMMON 0xE0
+#define TY_SEG 0xE8
+#define TY_EXTERN 0xF0
+#define TY_EQU 0xF8
+
+#define TYM_TYPE(x) ((x) & 0xF8)
+#define TYM_ELEMENTS(x) (((x) & 0xFFFFFF00) >> 8)
+
+#define TYS_ELEMENTS(x) ((x) << 8)
+
+enum special_tokens {
+ SPECIAL_ENUM_START = PREFIX_ENUM_LIMIT,
+ S_ABS = SPECIAL_ENUM_START,
+ S_BYTE,
+ S_DWORD,
+ S_FAR,
+ S_LONG,
+ S_NEAR,
+ S_NOSPLIT,
+ S_OWORD,
+ S_QWORD,
+ S_REL,
+ S_SHORT,
+ S_STRICT,
+ S_TO,
+ S_TWORD,
+ S_WORD,
+ S_YWORD,
+ S_ZWORD,
+ SPECIAL_ENUM_LIMIT
+};
+
+enum decorator_tokens {
+ DECORATOR_ENUM_START = SPECIAL_ENUM_LIMIT,
+ BRC_1TO2 = DECORATOR_ENUM_START,
+ BRC_1TO4,
+ BRC_1TO8,
+ BRC_1TO16,
+ BRC_RN,
+ BRC_RD,
+ BRC_RU,
+ BRC_RZ,
+ BRC_SAE,
+ BRC_Z,
+ DECORATOR_ENUM_LIMIT
+};
+
+/*
+ * AVX512 Decorator (decoflags_t) bits distribution (counted from 0)
+ * 3 2 1
+ * 10987654321098765432109876543210
+ * |
+ * | word boundary
+ * ............................1111 opmask
+ * ...........................1.... zeroing / merging
+ * ..........................1..... broadcast
+ * .........................1...... static rounding
+ * ........................1....... SAE
+ * ......................11........ broadcast element size
+ * ....................11.......... number of broadcast elements
+ */
+#define OP_GENVAL(val, bits, shift) (((val) & ((UINT64_C(1) << (bits)) - 1)) << (shift))
+
+/*
+ * Opmask register number
+ * identical to EVEX.aaa
+ *
+ * Bits: 0 - 3
+ */
+#define OPMASK_SHIFT (0)
+#define OPMASK_BITS (4)
+#define OPMASK_MASK OP_GENMASK(OPMASK_BITS, OPMASK_SHIFT)
+#define GEN_OPMASK(bit) OP_GENBIT(bit, OPMASK_SHIFT)
+#define VAL_OPMASK(val) OP_GENVAL(val, OPMASK_BITS, OPMASK_SHIFT)
+
+/*
+ * zeroing / merging control available
+ * matching to EVEX.z
+ *
+ * Bits: 4
+ */
+#define Z_SHIFT (4)
+#define Z_BITS (1)
+#define Z_MASK OP_GENMASK(Z_BITS, Z_SHIFT)
+#define GEN_Z(bit) OP_GENBIT(bit, Z_SHIFT)
+
+/*
+ * broadcast - Whether this operand can be broadcasted
+ *
+ * Bits: 5
+ */
+#define BRDCAST_SHIFT (5)
+#define BRDCAST_BITS (1)
+#define BRDCAST_MASK OP_GENMASK(BRDCAST_BITS, BRDCAST_SHIFT)
+#define GEN_BRDCAST(bit) OP_GENBIT(bit, BRDCAST_SHIFT)
+
+/*
+ * Whether this instruction can have a static rounding mode.
+ * It goes with the last simd operand because the static rounding mode
+ * decorator is located between the last simd operand and imm8 (if any).
+ *
+ * Bits: 6
+ */
+#define STATICRND_SHIFT (6)
+#define STATICRND_BITS (1)
+#define STATICRND_MASK OP_GENMASK(STATICRND_BITS, STATICRND_SHIFT)
+#define GEN_STATICRND(bit) OP_GENBIT(bit, STATICRND_SHIFT)
+
+/*
+ * SAE(Suppress all exception) available
+ *
+ * Bits: 7
+ */
+#define SAE_SHIFT (7)
+#define SAE_BITS (1)
+#define SAE_MASK OP_GENMASK(SAE_BITS, SAE_SHIFT)
+#define GEN_SAE(bit) OP_GENBIT(bit, SAE_SHIFT)
+
+/*
+ * Broadcasting element size.
+ *
+ * Bits: 8 - 9
+ */
+#define BRSIZE_SHIFT (8)
+#define BRSIZE_BITS (2)
+#define BRSIZE_MASK OP_GENMASK(BRSIZE_BITS, BRSIZE_SHIFT)
+#define GEN_BRSIZE(bit) OP_GENBIT(bit, BRSIZE_SHIFT)
+
+#define BR_BITS32 GEN_BRSIZE(0)
+#define BR_BITS64 GEN_BRSIZE(1)
+
+/*
+ * Number of broadcasting elements
+ *
+ * Bits: 10 - 11
+ */
+#define BRNUM_SHIFT (10)
+#define BRNUM_BITS (2)
+#define BRNUM_MASK OP_GENMASK(BRNUM_BITS, BRNUM_SHIFT)
+#define VAL_BRNUM(val) OP_GENVAL(val, BRNUM_BITS, BRNUM_SHIFT)
+
+#define BR_1TO2 VAL_BRNUM(0)
+#define BR_1TO4 VAL_BRNUM(1)
+#define BR_1TO8 VAL_BRNUM(2)
+#define BR_1TO16 VAL_BRNUM(3)
+
+#define MASK OPMASK_MASK /* Opmask (k1 ~ 7) can be used */
+#define Z Z_MASK
+#define B32 (BRDCAST_MASK|BR_BITS32) /* {1to16} : broadcast 32b * 16 to zmm(512b) */
+#define B64 (BRDCAST_MASK|BR_BITS64) /* {1to8} : broadcast 64b * 8 to zmm(512b) */
+#define ER STATICRND_MASK /* ER(Embedded Rounding) == Static rounding mode */
+#define SAE SAE_MASK /* SAE(Suppress All Exception) */
+
+/*
+ * Global modes
+ */
+
+/*
+ * This declaration passes the "pass" number to all other modules
+ * "pass0" assumes the values: 0, 0, ..., 0, 1, 2
+ * where 0 = optimizing pass
+ * 1 = pass 1
+ * 2 = pass 2
+ */
+
+/*
+ * flag to disable optimizations selectively
+ * this is useful to turn-off certain optimizations
+ */
+enum optimization_disable_flag {
+ OPTIM_ALL_ENABLED = 0,
+ OPTIM_DISABLE_JMP_MATCH = 1
+};
+
+struct optimization {
+ int level;
+ int flag;
+};
+
+extern int pass0;
+extern int64_t passn; /* Actual pass number */
+
+extern bool tasm_compatible_mode;
+extern struct optimization optimizing;
+extern int globalbits; /* 16, 32 or 64-bit mode */
+extern int globalrel; /* default to relative addressing? */
+extern int globalbnd; /* default to using bnd prefix? */
+
+extern const char *inname; /* primary input filename */
+extern const char *outname; /* output filename */
+
+/*
+ * Switch to a different segment and return the current offset
+ */
+int64_t switch_segment(int32_t segment);
+
+#endif
diff --git a/include/nasmint.h b/include/nasmint.h
new file mode 100644
index 00000000..6be623bf
--- /dev/null
+++ b/include/nasmint.h
@@ -0,0 +1,219 @@
+/*
+ * nasmint.h
+ *
+ * Small ersatz subset of <inttypes.h>, deriving the types from
+ * <limits.h>.
+ *
+ * Important: the preprocessor may truncate numbers too large for it.
+ * Therefore, test the signed types only ... truncation won't generate
+ * a 01111111... bit pattern.
+ */
+
+#ifndef NASM_NASMINT_H
+#define NASM_NASMINT_H
+
+#include <limits.h>
+
+/*** 64-bit type: __int64, long or long long ***/
+
+/* Some old versions of gcc <limits.h> omit LLONG_MAX */
+#ifndef LLONG_MAX
+# ifdef __LONG_LONG_MAX__
+# define LLONG_MAX __LONG_LONG_MAX__
+# else
+# define LLONG_MAX 0 /* Assume long long is unusable */
+# endif
+#endif
+
+#ifndef _I64_MAX
+# ifdef _MSC_VER
+# define _I64_MAX 9223372036854775807
+# else
+# define _I64_MAX 0
+# endif
+#endif
+
+#if _I64_MAX == 9223372036854775807
+
+/* Windows-based compiler: use __int64 */
+typedef signed __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#define _scn64 "I64"
+#define _pri64 "I64"
+#define INT64_C(x) x ## i64
+#define UINT64_C(x) x ## ui64
+
+#elif LONG_MAX == 9223372036854775807L
+
+/* long is 64 bits */
+typedef signed long int64_t;
+typedef unsigned long uint64_t;
+#define _scn64 "l"
+#define _pri64 "l"
+#define INT64_C(x) x ## L
+#define UINT64_C(x) x ## UL
+
+#elif LLONG_MAX == 9223372036854775807LL
+
+/* long long is 64 bits */
+typedef signed long long int64_t;
+typedef unsigned long long uint64_t;
+#define _scn64 "ll"
+#define _pri64 "ll"
+#define INT64_C(x) x ## LL
+#define UINT64_C(x) x ## ULL
+
+#else
+
+#error "Neither long nor long long is 64 bits in size"
+
+#endif
+
+/*** 32-bit type: int or long ***/
+
+#if INT_MAX == 2147483647
+
+/* int is 32 bits */
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+#define _scn32 ""
+#define _pri32 ""
+#define INT32_C(x) x
+#define UINT32_C(x) x ## U
+
+#elif LONG_MAX == 2147483647L
+
+/* long is 32 bits */
+typedef signed long int32_t;
+typedef unsigned long uint32_t;
+#define _scn32 "l"
+#define _pri32 "l"
+#define INT32_C(x) x ## L
+#define UINT32_C(x) x ## UL
+
+#else
+
+#error "Neither int nor long is 32 bits in size"
+
+#endif
+
+/*** 16-bit size: int or short ***/
+
+#if INT_MAX == 32767
+
+/* int is 16 bits */
+typedef signed int int16_t;
+typedef unsigned int uint16_t;
+#define _scn16 ""
+#define _pri16 ""
+#define INT16_C(x) x
+#define UINT16_C(x) x ## U
+
+#elif SHRT_MAX == 32767
+
+/* short is 16 bits */
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+#define _scn16 "h"
+#define _pri16 ""
+#define INT16_C(x) x
+#define UINT16_C(x) x ## U
+
+#else
+
+#error "Neither short nor int is 16 bits in size"
+
+#endif
+
+/*** 8-bit size: char ***/
+
+#if SCHAR_MAX == 127
+
+/* char is 8 bits */
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+#define _scn8 "hh"
+#define _pri8 ""
+#define INT8_C(x) x
+#define UINT8_C(x) x ## U
+
+#else
+
+#error "char is not 8 bits in size"
+
+#endif
+
+/* The rest of this is common to all models */
+
+#define PRId8 _pri8 "d"
+#define PRId16 _pri16 "d"
+#define PRId32 _pri32 "d"
+#define PRId64 _pri64 "d"
+
+#define PRIi8 _pri8 "i"
+#define PRIi16 _pri16 "i"
+#define PRIi32 _pri32 "i"
+#define PRIi64 _pri64 "i"
+
+#define PRIo8 _pri8 "o"
+#define PRIo16 _pri16 "o"
+#define PRIo32 _pri32 "o"
+#define PRIo64 _pri64 "o"
+
+#define PRIu8 _pri8 "u"
+#define PRIu16 _pri16 "u"
+#define PRIu32 _pri32 "u"
+#define PRIu64 _pri64 "u"
+
+#define PRIx8 _pri8 "x"
+#define PRIx16 _pri16 "x"
+#define PRIx32 _pri32 "x"
+#define PRIx64 _pri64 "x"
+
+#define PRIX8 _pri8 "X"
+#define PRIX16 _pri16 "X"
+#define PRIX32 _pri32 "X"
+#define PRIX64 _pri64 "X"
+
+#define SCNd8 _scn8 "d"
+#define SCNd16 _scn16 "d"
+#define SCNd32 _scn32 "d"
+#define SCNd64 _scn64 "d"
+
+#define SCNi8 _scn8 "i"
+#define SCNi16 _scn16 "i"
+#define SCNi32 _scn32 "i"
+#define SCNi64 _scn64 "i"
+
+#define SCNo8 _scn8 "o"
+#define SCNo16 _scn16 "o"
+#define SCNo32 _scn32 "o"
+#define SCNo64 _scn64 "o"
+
+#define SCNu8 _scn8 "u"
+#define SCNu16 _scn16 "u"
+#define SCNu32 _scn32 "u"
+#define SCNu64 _scn64 "u"
+
+#define SCNx8 _scn8 "x"
+#define SCNx16 _scn16 "x"
+#define SCNx32 _scn32 "x"
+#define SCNx64 _scn64 "x"
+
+#define INT8_MIN INT8_C(-128)
+#define INT8_MAX INT8_C(127)
+#define UINT8_MAX UINT8_C(255)
+
+#define INT16_MIN INT16_C(-32768)
+#define INT16_MAX INT16_C(32767)
+#define UINT16_MAX UINT16_C(65535)
+
+#define INT32_MIN INT32_C(-2147483648)
+#define INT32_MAX INT32_C(2147483647)
+#define UINT32_MAX UINT32_C(4294967295)
+
+#define INT64_MIN INT64_C(-9223372036854775808)
+#define INT64_MAX INT64_C(9223372036854775807)
+#define UINT64_MAX UINT64_C(18446744073709551615)
+
+#endif /* NASM_NASMINT_H */
diff --git a/include/nasmlib.h b/include/nasmlib.h
new file mode 100644
index 00000000..e57d0e6d
--- /dev/null
+++ b/include/nasmlib.h
@@ -0,0 +1,414 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.h header file for nasmlib.c
+ */
+
+#ifndef NASM_NASMLIB_H
+#define NASM_NASMLIB_H
+
+#include "compiler.h"
+#include "bytesex.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+/*
+ * tolower table -- avoids a function call on some platforms.
+ * NOTE: unlike the tolower() function in ctype, EOF is *NOT*
+ * a permitted value, for obvious reasons.
+ */
+void tolower_init(void);
+extern unsigned char nasm_tolower_tab[256];
+#define nasm_tolower(x) nasm_tolower_tab[(unsigned char)(x)]
+
+/* Wrappers around <ctype.h> functions */
+/* These are only valid for values that cannot include EOF */
+#define nasm_isspace(x) isspace((unsigned char)(x))
+#define nasm_isalpha(x) isalpha((unsigned char)(x))
+#define nasm_isdigit(x) isdigit((unsigned char)(x))
+#define nasm_isalnum(x) isalnum((unsigned char)(x))
+#define nasm_isxdigit(x) isxdigit((unsigned char)(x))
+
+/*
+ * Wrappers around malloc, realloc and free. nasm_malloc will
+ * fatal-error and die rather than return NULL; nasm_realloc will
+ * do likewise, and will also guarantee to work right on being
+ * passed a NULL pointer; nasm_free will do nothing if it is passed
+ * a NULL pointer.
+ */
+void * safe_malloc(1) nasm_malloc(size_t);
+void * safe_malloc(1) nasm_zalloc(size_t);
+void * safe_malloc2(1,2) nasm_calloc(size_t, size_t);
+void * safe_realloc(2) nasm_realloc(void *, size_t);
+void nasm_free(void *);
+char * safe_alloc nasm_strdup(const char *);
+char * safe_alloc nasm_strndup(const char *, size_t);
+char * safe_alloc nasm_strcat(const char *one, const char *two);
+char * safe_alloc end_with_null nasm_strcatn(const char *one, ...);
+
+/* Assert the argument is a pointer without evaluating it */
+#define nasm_assert_pointer(p) ((void)sizeof(*(p)))
+
+#define nasm_new(p) ((p) = nasm_zalloc(sizeof(*(p))))
+#define nasm_newn(p,n) ((p) = nasm_calloc(sizeof(*(p)),(n)))
+/*
+ * This is broken on platforms where there are pointers which don't
+ * match void * in their internal layout. It unfortunately also
+ * loses any "const" part of the argument, although hopefully the
+ * compiler will warn in that case.
+ */
+#define nasm_delete(p) \
+ do { \
+ void **_pp = (void **)&(p); \
+ nasm_assert_pointer(p); \
+ nasm_free(*_pp); \
+ *_pp = NULL; \
+ } while (0)
+#define nasm_zero(x) (memset(&(x), 0, sizeof(x)))
+#define nasm_zeron(p,n) (memset((p), 0, (n)*sizeof(*(p))))
+
+/*
+ * Wrappers around fread()/fwrite() which fatal-errors on failure.
+ * For fread(), only use this if EOF is supposed to be a fatal error!
+ */
+void nasm_read(void *, size_t, FILE *);
+void nasm_write(const void *, size_t, FILE *);
+
+/*
+ * NASM assert failure
+ */
+fatal_func nasm_assert_failed(const char *, int, const char *);
+#define nasm_assert(x) \
+ do { \
+ if (unlikely(!(x))) \
+ nasm_assert_failed(__FILE__,__LINE__,#x); \
+ } while (0)
+
+/*
+ * NASM failure at build time if the argument is false
+ */
+#ifdef static_assert
+# define nasm_static_assert(x) static_assert(x, #x)
+#elif defined(HAVE_FUNC_ATTRIBUTE_ERROR) && defined(__OPTIMIZE__)
+# define nasm_static_assert(x) \
+ if (!(x)) { \
+ extern void __attribute__((error("assertion " #x " failed"))) \
+ _nasm_static_fail(void); \
+ _nasm_static_fail(); \
+ }
+#else
+/* See http://www.drdobbs.com/compile-time-assertions/184401873 */
+# define nasm_static_assert(x) \
+ do { enum { _static_assert_failed = 1/(!!(x)) }; } while (0)
+#endif
+
+/* Utility function to generate a string for an invalid enum */
+const char *invalid_enum_str(int);
+
+/*
+ * ANSI doesn't guarantee the presence of `stricmp' or
+ * `strcasecmp'.
+ */
+#if defined(HAVE_STRCASECMP)
+#define nasm_stricmp strcasecmp
+#elif defined(HAVE_STRICMP)
+#define nasm_stricmp stricmp
+#else
+int pure_func nasm_stricmp(const char *, const char *);
+#endif
+
+#if defined(HAVE_STRNCASECMP)
+#define nasm_strnicmp strncasecmp
+#elif defined(HAVE_STRNICMP)
+#define nasm_strnicmp strnicmp
+#else
+int pure_func nasm_strnicmp(const char *, const char *, size_t);
+#endif
+
+int pure_func nasm_memicmp(const char *, const char *, size_t);
+
+#if defined(HAVE_STRSEP)
+#define nasm_strsep strsep
+#else
+char *nasm_strsep(char **stringp, const char *delim);
+#endif
+
+#ifndef HAVE_DECL_STRNLEN
+size_t pure_func strnlen(const char *, size_t);
+#endif
+
+/* This returns the numeric value of a given 'digit'. */
+#define numvalue(c) ((c) >= 'a' ? (c) - 'a' + 10 : (c) >= 'A' ? (c) - 'A' + 10 : (c) - '0')
+
+/*
+ * Convert a string into a number, using NASM number rules. Sets
+ * `*error' to true if an error occurs, and false otherwise.
+ */
+int64_t readnum(const char *str, bool *error);
+
+/*
+ * Convert a character constant into a number. Sets
+ * `*warn' to true if an overflow occurs, and false otherwise.
+ * str points to and length covers the middle of the string,
+ * without the quotes.
+ */
+int64_t readstrnum(char *str, int length, bool *warn);
+
+/*
+ * seg_alloc: allocate a hitherto unused segment number.
+ */
+int32_t seg_alloc(void);
+
+/*
+ * Add/replace or remove an extension to the end of a filename
+ */
+const char *filename_set_extension(const char *inname, const char *extension);
+
+/*
+ * Utility macros...
+ *
+ * This is a useful #define which I keep meaning to use more often:
+ * the number of elements of a statically defined array.
+ */
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+/*
+ * List handling
+ *
+ * list_for_each - regular iterator over list
+ * list_for_each_safe - the same but safe against list items removal
+ * list_last - find the last element in a list
+ */
+#define list_for_each(pos, head) \
+ for (pos = head; pos; pos = pos->next)
+#define list_for_each_safe(pos, n, head) \
+ for (pos = head, n = (pos ? pos->next : NULL); pos; \
+ pos = n, n = (n ? n->next : NULL))
+#define list_last(pos, head) \
+ for (pos = head; pos && pos->next; pos = pos->next) \
+ ;
+#define list_reverse(head, prev, next) \
+ do { \
+ if (!head || !head->next) \
+ break; \
+ prev = NULL; \
+ while (head) { \
+ next = head->next; \
+ head->next = prev; \
+ prev = head; \
+ head = next; \
+ } \
+ head = prev; \
+ } while (0)
+
+/*
+ * Power of 2 align helpers
+ */
+#undef ALIGN_MASK /* Some BSD flavors define these in system headers */
+#undef ALIGN
+#define ALIGN_MASK(v, mask) (((v) + (mask)) & ~(mask))
+#define ALIGN(v, a) ALIGN_MASK(v, (a) - 1)
+#define IS_ALIGNED(v, a) (((v) & ((a) - 1)) == 0)
+
+/*
+ * Routines to write littleendian data to a file
+ */
+#define fwriteint8_t(d,f) putc(d,f)
+void fwriteint16_t(uint16_t data, FILE * fp);
+void fwriteint32_t(uint32_t data, FILE * fp);
+void fwriteint64_t(uint64_t data, FILE * fp);
+void fwriteaddr(uint64_t data, int size, FILE * fp);
+
+/*
+ * Binary search routine. Returns index into `array' of an entry
+ * matching `string', or <0 if no match. `array' is taken to
+ * contain `size' elements.
+ *
+ * bsi() is case sensitive, bsii() is case insensitive.
+ */
+int bsi(const char *string, const char **array, int size);
+int bsii(const char *string, const char **array, int size);
+
+/*
+ * These functions are used to keep track of the source code file and name.
+ */
+void src_init(void);
+void src_free(void);
+const char *src_set_fname(const char *newname);
+const char *src_get_fname(void);
+int32_t src_set_linnum(int32_t newline);
+int32_t src_get_linnum(void);
+/* Can be used when there is no need for the old information */
+void src_set(int32_t line, const char *filename);
+/*
+ * src_get gets both the source file name and line.
+ * It is also used if you maintain private status about the source location
+ * It return 0 if the information was the same as the last time you
+ * checked, -2 if the name changed and (new-old) if just the line changed.
+ */
+int32_t src_get(int32_t *xline, const char **xname);
+
+char *nasm_skip_spaces(const char *p);
+char *nasm_skip_word(const char *p);
+char *nasm_zap_spaces_fwd(char *p);
+char *nasm_zap_spaces_rev(char *p);
+char *nasm_trim_spaces(char *p);
+char *nasm_get_word(char *p, char **tail);
+char *nasm_opt_val(char *p, char **opt, char **val);
+
+/*
+ * Converts a relative pathname rel_path into an absolute path name.
+ *
+ * The buffer returned must be freed by the caller
+ */
+char * safe_alloc nasm_realpath(const char *rel_path);
+
+/*
+ * Path-splitting and merging functions
+ */
+char * safe_alloc nasm_dirname(const char *path);
+char * safe_alloc nasm_basename(const char *path);
+char * safe_alloc nasm_catfile(const char *dir, const char *path);
+
+const char * pure_func prefix_name(int);
+
+/*
+ * Wrappers around fopen()... for future change to a dedicated structure
+ */
+enum file_flags {
+ NF_BINARY = 0x00000000, /* Binary file (default) */
+ NF_TEXT = 0x00000001, /* Text file */
+ NF_NONFATAL = 0x00000000, /* Don't die on open failure (default) */
+ NF_FATAL = 0x00000002, /* Die on open failure */
+ NF_FORMAP = 0x00000004 /* Intended to use nasm_map_file() */
+};
+
+FILE *nasm_open_read(const char *filename, enum file_flags flags);
+FILE *nasm_open_write(const char *filename, enum file_flags flags);
+
+/* Probe for existence of a file */
+bool nasm_file_exists(const char *filename);
+
+#define ZERO_BUF_SIZE 65536 /* Default value */
+#if defined(BUFSIZ) && (BUFSIZ > ZERO_BUF_SIZE)
+# undef ZERO_BUF_SIZE
+# define ZERO_BUF_SIZE BUFSIZ
+#endif
+extern const uint8_t zero_buffer[ZERO_BUF_SIZE];
+
+/* Missing fseeko/ftello */
+#ifndef HAVE_FSEEKO
+# undef off_t /* Just in case it is a macro */
+# ifdef HAVE__FSEEKI64
+# define fseeko _fseeki64
+# define ftello _ftelli64
+# define off_t int64_t
+# else
+# define fseeko fseek
+# define ftello ftell
+# define off_t long
+# endif
+#endif
+
+const void *nasm_map_file(FILE *fp, off_t start, off_t len);
+void nasm_unmap_file(const void *p, size_t len);
+off_t nasm_file_size(FILE *f);
+off_t nasm_file_size_by_path(const char *pathname);
+bool nasm_file_time(time_t *t, const char *pathname);
+void fwritezero(off_t bytes, FILE *fp);
+
+static inline bool const_func overflow_general(int64_t value, int bytes)
+{
+ int sbit;
+ int64_t vmax, vmin;
+
+ if (bytes >= 8)
+ return false;
+
+ sbit = (bytes << 3) - 1;
+ vmax = ((int64_t)2 << sbit) - 1;
+ vmin = -((int64_t)2 << sbit);
+
+ return value < vmin || value > vmax;
+}
+
+static inline bool const_func overflow_signed(int64_t value, int bytes)
+{
+ int sbit;
+ int64_t vmax, vmin;
+
+ if (bytes >= 8)
+ return false;
+
+ sbit = (bytes << 3) - 1;
+ vmax = ((int64_t)1 << sbit) - 1;
+ vmin = -((int64_t)1 << sbit);
+
+ return value < vmin || value > vmax;
+}
+
+static inline bool const_func overflow_unsigned(int64_t value, int bytes)
+{
+ int sbit;
+ int64_t vmax, vmin;
+
+ if (bytes >= 8)
+ return false;
+
+ sbit = (bytes << 3) - 1;
+ vmax = ((int64_t)2 << sbit) - 1;
+ vmin = 0;
+
+ return value < vmin || value > vmax;
+}
+
+static inline int64_t const_func signed_bits(int64_t value, int bits)
+{
+ if (bits < 64) {
+ value &= ((int64_t)1 << bits) - 1;
+ if (value & (int64_t)1 << (bits - 1))
+ value |= (int64_t)((uint64_t)-1 << bits);
+ }
+ return value;
+}
+
+/* check if value is power of 2 */
+#define is_power2(v) ((v) && ((v) & ((v) - 1)) == 0)
+
+#endif
diff --git a/include/opflags.h b/include/opflags.h
new file mode 100644
index 00000000..28bb236f
--- /dev/null
+++ b/include/opflags.h
@@ -0,0 +1,299 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * opflags.h - operand flags
+ */
+
+#ifndef NASM_OPFLAGS_H
+#define NASM_OPFLAGS_H
+
+#include "compiler.h"
+#include "tables.h" /* for opflags_t and nasm_reg_flags[] */
+#include "regs.h"
+
+/*
+ * Here we define the operand types. These are implemented as bit
+ * masks, since some are subsets of others; e.g. AX in a MOV
+ * instruction is a special operand type, whereas AX in other
+ * contexts is just another 16-bit register. (Also, consider CL in
+ * shift instructions, DX in OUT, etc.)
+ *
+ * The basic concept here is that
+ * (class & ~operand) == 0
+ *
+ * if and only if "operand" belongs to class type "class".
+ */
+
+#define OP_GENMASK(bits, shift) (((UINT64_C(1) << (bits)) - 1) << (shift))
+#define OP_GENBIT(bit, shift) (UINT64_C(1) << ((shift) + (bit)))
+
+/*
+ * Type of operand: memory reference, register, etc.
+ *
+ * Bits: 0 - 3
+ */
+#define OPTYPE_SHIFT (0)
+#define OPTYPE_BITS (4)
+#define OPTYPE_MASK OP_GENMASK(OPTYPE_BITS, OPTYPE_SHIFT)
+#define GEN_OPTYPE(bit) OP_GENBIT(bit, OPTYPE_SHIFT)
+
+/*
+ * Modifiers.
+ *
+ * Bits: 4 - 6
+ */
+#define MODIFIER_SHIFT (4)
+#define MODIFIER_BITS (3)
+#define MODIFIER_MASK OP_GENMASK(MODIFIER_BITS, MODIFIER_SHIFT)
+#define GEN_MODIFIER(bit) OP_GENBIT(bit, MODIFIER_SHIFT)
+
+/*
+ * Register classes.
+ *
+ * Bits: 7 - 16
+ */
+#define REG_CLASS_SHIFT (7)
+#define REG_CLASS_BITS (10)
+#define REG_CLASS_MASK OP_GENMASK(REG_CLASS_BITS, REG_CLASS_SHIFT)
+#define GEN_REG_CLASS(bit) OP_GENBIT(bit, REG_CLASS_SHIFT)
+
+/*
+ * Subclasses. Depends on type of operand.
+ *
+ * Bits: 17 - 24
+ */
+#define SUBCLASS_SHIFT (17)
+#define SUBCLASS_BITS (8)
+#define SUBCLASS_MASK OP_GENMASK(SUBCLASS_BITS, SUBCLASS_SHIFT)
+#define GEN_SUBCLASS(bit) OP_GENBIT(bit, SUBCLASS_SHIFT)
+
+/*
+ * Special flags. Context dependant.
+ *
+ * Bits: 25 - 31
+ */
+#define SPECIAL_SHIFT (25)
+#define SPECIAL_BITS (7)
+#define SPECIAL_MASK OP_GENMASK(SPECIAL_BITS, SPECIAL_SHIFT)
+#define GEN_SPECIAL(bit) OP_GENBIT(bit, SPECIAL_SHIFT)
+
+/*
+ * Sizes of the operands and attributes.
+ *
+ * Bits: 32 - 42
+ */
+#define SIZE_SHIFT (32)
+#define SIZE_BITS (11)
+#define SIZE_MASK OP_GENMASK(SIZE_BITS, SIZE_SHIFT)
+#define GEN_SIZE(bit) OP_GENBIT(bit, SIZE_SHIFT)
+
+/*
+ * Register set count
+ *
+ * Bits: 47 - 43
+ */
+#define REGSET_SHIFT (43)
+#define REGSET_BITS (5)
+#define REGSET_MASK OP_GENMASK(REGSET_BITS, REGSET_SHIFT)
+#define GEN_REGSET(bit) OP_GENBIT(bit, REGSET_SHIFT)
+
+/*
+ * Bits distribution (counted from 0)
+ *
+ * 6 5 4 3 2 1
+ * 3210987654321098765432109876543210987654321098765432109876543210
+ * |
+ * | dword bound
+ *
+ * ............................................................1111 optypes
+ * .........................................................111.... modifiers
+ * ...............................................1111111111....... register classes
+ * .......................................11111111................. subclasses
+ * ................................1111111......................... specials
+ * .....................11111111111................................ sizes
+ * ................11111........................................... regset count
+ */
+
+#define REGISTER GEN_OPTYPE(0) /* register number in 'basereg' */
+#define IMMEDIATE GEN_OPTYPE(1)
+#define REGMEM GEN_OPTYPE(2) /* for r/m, ie EA, operands */
+#define MEMORY (GEN_OPTYPE(3) | REGMEM)
+
+#define BITS8 GEN_SIZE(0) /* 8 bits (BYTE) */
+#define BITS16 GEN_SIZE(1) /* 16 bits (WORD) */
+#define BITS32 GEN_SIZE(2) /* 32 bits (DWORD) */
+#define BITS64 GEN_SIZE(3) /* 64 bits (QWORD), x64 and FPU only */
+#define BITS80 GEN_SIZE(4) /* 80 bits (TWORD), FPU only */
+#define BITS128 GEN_SIZE(5) /* 128 bits (OWORD) */
+#define BITS256 GEN_SIZE(6) /* 256 bits (YWORD) */
+#define BITS512 GEN_SIZE(7) /* 512 bits (ZWORD) */
+#define FAR GEN_SIZE(8) /* grotty: this means 16:16 or 16:32, like in CALL/JMP */
+#define NEAR GEN_SIZE(9)
+#define SHORT GEN_SIZE(10) /* and this means what it says :) */
+
+#define TO GEN_MODIFIER(0) /* reverse effect in FADD, FSUB &c */
+#define COLON GEN_MODIFIER(1) /* operand is followed by a colon */
+#define STRICT GEN_MODIFIER(2) /* do not optimize this operand */
+
+#define REG_CLASS_CDT GEN_REG_CLASS(0)
+#define REG_CLASS_GPR GEN_REG_CLASS(1)
+#define REG_CLASS_SREG GEN_REG_CLASS(2)
+#define REG_CLASS_FPUREG GEN_REG_CLASS(3)
+#define REG_CLASS_RM_MMX GEN_REG_CLASS(4)
+#define REG_CLASS_RM_XMM GEN_REG_CLASS(5)
+#define REG_CLASS_RM_YMM GEN_REG_CLASS(6)
+#define REG_CLASS_RM_ZMM GEN_REG_CLASS(7)
+#define REG_CLASS_OPMASK GEN_REG_CLASS(8)
+#define REG_CLASS_BND GEN_REG_CLASS(9)
+
+static inline bool is_class(opflags_t class, opflags_t op)
+{
+ return !(class & ~op);
+}
+
+static inline bool is_reg_class(opflags_t class, opflags_t reg)
+{
+ if (reg >= EXPR_REG_START && reg <= EXPR_REG_END)
+ return is_class(class, nasm_reg_flags[reg]);
+ return false;
+}
+
+#define IS_SREG(reg) is_reg_class(REG_SREG, (reg))
+#define IS_FSGS(reg) is_reg_class(REG_FSGS, (reg))
+
+/* Register classes */
+#define REG_EA ( REGMEM | REGISTER) /* 'normal' reg, qualifies as EA */
+#define RM_GPR ( REG_CLASS_GPR | REGMEM) /* integer operand */
+#define REG_GPR ( REG_CLASS_GPR | REGMEM | REGISTER) /* integer register */
+#define REG8 ( REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* 8-bit GPR */
+#define REG16 ( REG_CLASS_GPR | BITS16 | REGMEM | REGISTER) /* 16-bit GPR */
+#define REG32 ( REG_CLASS_GPR | BITS32 | REGMEM | REGISTER) /* 32-bit GPR */
+#define REG64 ( REG_CLASS_GPR | BITS64 | REGMEM | REGISTER) /* 64-bit GPR */
+#define FPUREG ( REG_CLASS_FPUREG | REGISTER) /* floating point stack registers */
+#define FPU0 (GEN_SUBCLASS(1) | REG_CLASS_FPUREG | REGISTER) /* FPU stack register zero */
+#define RM_MMX ( REG_CLASS_RM_MMX | REGMEM) /* MMX operand */
+#define MMXREG ( REG_CLASS_RM_MMX | REGMEM | REGISTER) /* MMX register */
+#define RM_XMM ( REG_CLASS_RM_XMM | REGMEM) /* XMM (SSE) operand */
+#define XMMREG ( REG_CLASS_RM_XMM | REGMEM | REGISTER) /* XMM (SSE) register */
+#define RM_YMM ( REG_CLASS_RM_YMM | REGMEM) /* YMM (AVX) operand */
+#define YMMREG ( REG_CLASS_RM_YMM | REGMEM | REGISTER) /* YMM (AVX) register */
+#define RM_ZMM ( REG_CLASS_RM_ZMM | REGMEM) /* ZMM (AVX512) operand */
+#define ZMMREG ( REG_CLASS_RM_ZMM | REGMEM | REGISTER) /* ZMM (AVX512) register */
+#define RM_OPMASK ( REG_CLASS_OPMASK | REGMEM) /* Opmask operand */
+#define OPMASKREG ( REG_CLASS_OPMASK | REGMEM | REGISTER) /* Opmask register */
+#define OPMASK0 (GEN_SUBCLASS(1) | REG_CLASS_OPMASK | REGMEM | REGISTER) /* Opmask register zero (k0) */
+#define RM_K RM_OPMASK
+#define KREG OPMASKREG
+#define RM_BND ( REG_CLASS_BND | REGMEM) /* Bounds operand */
+#define BNDREG ( REG_CLASS_BND | REGMEM | REGISTER) /* Bounds register */
+#define REG_CDT ( REG_CLASS_CDT | BITS32 | REGISTER) /* CRn, DRn and TRn */
+#define REG_CREG (GEN_SUBCLASS(1) | REG_CLASS_CDT | BITS32 | REGISTER) /* CRn */
+#define REG_DREG (GEN_SUBCLASS(2) | REG_CLASS_CDT | BITS32 | REGISTER) /* DRn */
+#define REG_TREG (GEN_SUBCLASS(3) | REG_CLASS_CDT | BITS32 | REGISTER) /* TRn */
+#define REG_SREG ( REG_CLASS_SREG | BITS16 | REGISTER) /* any segment register */
+
+/* Segment registers */
+#define REG_ES (GEN_SUBCLASS(0) | GEN_SUBCLASS(2) | REG_CLASS_SREG | BITS16 | REGISTER) /* ES */
+#define REG_CS (GEN_SUBCLASS(1) | GEN_SUBCLASS(2) | REG_CLASS_SREG | BITS16 | REGISTER) /* CS */
+#define REG_SS (GEN_SUBCLASS(0) | GEN_SUBCLASS(3) | REG_CLASS_SREG | BITS16 | REGISTER) /* SS */
+#define REG_DS (GEN_SUBCLASS(1) | GEN_SUBCLASS(3) | REG_CLASS_SREG | BITS16 | REGISTER) /* DS */
+#define REG_FS (GEN_SUBCLASS(0) | GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* FS */
+#define REG_GS (GEN_SUBCLASS(1) | GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* GS */
+#define REG_FSGS ( GEN_SUBCLASS(4) | REG_CLASS_SREG | BITS16 | REGISTER) /* FS or GS */
+#define REG_SEG67 ( GEN_SUBCLASS(5) | REG_CLASS_SREG | BITS16 | REGISTER) /* Unimplemented segment registers */
+
+/* Special GPRs */
+#define REG_SMASK SUBCLASS_MASK /* a mask for the following */
+#define REG_ACCUM (GEN_SUBCLASS(1) | REG_CLASS_GPR | REGMEM | REGISTER) /* accumulator: AL, AX, EAX, RAX */
+#define REG_AL (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER)
+#define REG_AX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
+#define REG_EAX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
+#define REG_RAX (GEN_SUBCLASS(1) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
+#define REG_COUNT (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | REGMEM | REGISTER) /* counter: CL, CX, ECX, RCX */
+#define REG_CL (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER)
+#define REG_CX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
+#define REG_ECX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
+#define REG_RCX (GEN_SUBCLASS(5) | GEN_SUBCLASS(2) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
+#define REG_DL (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* data: DL, DX, EDX, RDX */
+#define REG_DX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER)
+#define REG_EDX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER)
+#define REG_RDX (GEN_SUBCLASS(5) | GEN_SUBCLASS(3) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER)
+#define REG_HIGH (GEN_SUBCLASS(5) | GEN_SUBCLASS(4) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* high regs: AH, CH, DH, BH */
+#define REG_NOTACC GEN_SUBCLASS(5) /* non-accumulator register */
+#define REG8NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS8 | REGMEM | REGISTER) /* 8-bit non-acc GPR */
+#define REG16NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS16 | REGMEM | REGISTER) /* 16-bit non-acc GPR */
+#define REG32NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS32 | REGMEM | REGISTER) /* 32-bit non-acc GPR */
+#define REG64NA (GEN_SUBCLASS(5) | REG_CLASS_GPR | BITS64 | REGMEM | REGISTER) /* 64-bit non-acc GPR */
+
+/* special types of EAs */
+#define MEM_OFFS (GEN_SUBCLASS(1) | MEMORY) /* simple [address] offset - absolute! */
+#define IP_REL (GEN_SUBCLASS(2) | MEMORY) /* IP-relative offset */
+#define XMEM (GEN_SUBCLASS(3) | MEMORY) /* 128-bit vector SIB */
+#define YMEM (GEN_SUBCLASS(4) | MEMORY) /* 256-bit vector SIB */
+#define ZMEM (GEN_SUBCLASS(5) | MEMORY) /* 512-bit vector SIB */
+
+/* memory which matches any type of r/m operand */
+#define MEMORY_ANY (MEMORY | RM_GPR | RM_MMX | RM_XMM_L16 | RM_YMM_L16 | RM_ZMM_L16 | RM_OPMASK | RM_BND)
+
+/* special immediate values */
+#define UNITY (GEN_SUBCLASS(0) | IMMEDIATE) /* operand equals 1 */
+#define SBYTEWORD (GEN_SUBCLASS(1) | IMMEDIATE) /* operand is in the range -128..127 mod 2^16 */
+#define SBYTEDWORD (GEN_SUBCLASS(2) | IMMEDIATE) /* operand is in the range -128..127 mod 2^32 */
+#define SDWORD (GEN_SUBCLASS(3) | IMMEDIATE) /* operand is in the range -0x80000000..0x7FFFFFFF */
+#define UDWORD (GEN_SUBCLASS(4) | IMMEDIATE) /* operand is in the range 0..0xFFFFFFFF */
+
+/*
+ * Subset of vector registers: register 0 only and registers 0-15.
+ * Avoid conflicts in subclass bitfield with any of special EA types!
+ */
+#define RM_XMM_L16 (GEN_SUBCLASS(6) | RM_XMM) /* XMM r/m operand 0 ~ 15 */
+#define XMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | XMMREG) /* XMM register zero */
+#define XMM_L16 ( GEN_SUBCLASS(6) | XMMREG) /* XMM register 0 ~ 15 */
+
+#define RM_YMM_L16 (GEN_SUBCLASS(6) | RM_YMM) /* YMM r/m operand 0 ~ 15 */
+#define YMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | YMMREG) /* YMM register zero */
+#define YMM_L16 ( GEN_SUBCLASS(6) | YMMREG) /* YMM register 0 ~ 15 */
+
+#define RM_ZMM_L16 (GEN_SUBCLASS(6) | RM_ZMM) /* ZMM r/m operand 0 ~ 15 */
+#define ZMM0 (GEN_SUBCLASS(1) | GEN_SUBCLASS(6) | ZMMREG) /* ZMM register zero */
+#define ZMM_L16 ( GEN_SUBCLASS(6) | ZMMREG) /* ZMM register 0 ~ 15 */
+
+/* Register set sizes */
+#define RS2 GEN_REGSET(0)
+#define RS4 GEN_REGSET(1)
+#define RS8 GEN_REGSET(2)
+#define RS16 GEN_REGSET(3)
+#define RS32 GEN_REGSET(4)
+
+#endif /* NASM_OPFLAGS_H */
diff --git a/include/perfhash.h b/include/perfhash.h
new file mode 100644
index 00000000..43e536c1
--- /dev/null
+++ b/include/perfhash.h
@@ -0,0 +1,52 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef PERFHASH_H
+#define PERFHASH_H 1
+
+#include "compiler.h"
+#include "nasmlib.h" /* For invalid_enum_str() */
+
+struct perfect_hash {
+ uint64_t crcinit;
+ uint32_t hashmask;
+ uint32_t tbllen;
+ int tbloffs;
+ int errval;
+ const int16_t *hashvals;
+ const char * const *strings;
+};
+
+int perfhash_find(const struct perfect_hash *, const char *);
+
+#endif /* PERFHASH_H */
diff --git a/include/raa.h b/include/raa.h
new file mode 100644
index 00000000..e08d90bc
--- /dev/null
+++ b/include/raa.h
@@ -0,0 +1,49 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_RAA_H
+#define NASM_RAA_H 1
+
+#include "compiler.h"
+
+struct RAA;
+typedef uint64_t raaindex;
+
+#define raa_init() NULL
+void raa_free(struct RAA *);
+int64_t raa_read(struct RAA *, raaindex);
+void *raa_read_ptr(struct RAA *, raaindex);
+struct RAA * never_null raa_write(struct RAA *r, raaindex posn, int64_t value);
+struct RAA * never_null raa_write_ptr(struct RAA *r, raaindex posn, void *value);
+
+#endif /* NASM_RAA_H */
diff --git a/include/rbtree.h b/include/rbtree.h
new file mode 100644
index 00000000..f0ffb914
--- /dev/null
+++ b/include/rbtree.h
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_RBTREE_H
+#define NASM_RBTREE_H
+
+#include "compiler.h"
+
+/* This structure should be embedded in a larger data structure;
+ the final output from rb_search() can then be converted back
+ to the larger data structure via container_of(). */
+struct rbtree {
+ uint64_t key;
+ struct rbtree *left, *right;
+ bool red;
+};
+
+struct rbtree *rb_insert(struct rbtree *, struct rbtree *);
+struct rbtree *rb_search(struct rbtree *, uint64_t);
+
+#endif /* NASM_RBTREE_H */
diff --git a/include/rdoff.h b/include/rdoff.h
new file mode 100644
index 00000000..973be8c0
--- /dev/null
+++ b/include/rdoff.h
@@ -0,0 +1,169 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdoff.h RDOFF Object File manipulation routines header file
+ */
+
+#ifndef RDOFF_H
+#define RDOFF_H 1
+
+/*
+ * RDOFF definitions. They are used by RDOFF utilities and by NASM's
+ * 'outrdf2.c' output module.
+ */
+
+/* RDOFF format revision (currently used only when printing the version) */
+#define RDOFF2_REVISION "0.6.1"
+
+/* RDOFF2 file signature */
+#define RDOFF2_SIGNATURE "RDOFF2"
+
+/* Maximum size of an import/export label (including trailing zero) */
+#define EXIM_LABEL_MAX 256
+
+/* Maximum size of library or module name (including trailing zero) */
+#define MODLIB_NAME_MAX 128
+
+/* Maximum number of segments that we can handle in one file */
+#define RDF_MAXSEGS 64
+
+/* Record types that may present the RDOFF header */
+#define RDFREC_GENERIC 0
+#define RDFREC_RELOC 1
+#define RDFREC_IMPORT 2
+#define RDFREC_GLOBAL 3
+#define RDFREC_DLL 4
+#define RDFREC_BSS 5
+#define RDFREC_SEGRELOC 6
+#define RDFREC_FARIMPORT 7
+#define RDFREC_MODNAME 8
+#define RDFREC_COMMON 10
+
+/*
+ * Generic record - contains the type and length field, plus a 128 byte
+ * array 'data'
+ */
+struct GenericRec {
+ uint8_t type;
+ uint8_t reclen;
+ char data[128];
+};
+
+/*
+ * Relocation record
+ */
+struct RelocRec {
+ uint8_t type; /* must be 1 */
+ uint8_t reclen; /* content length */
+ uint8_t segment; /* only 0 for code, or 1 for data supported,
+ but add 64 for relative refs (ie do not require
+ reloc @ loadtime, only linkage) */
+ int32_t offset; /* from start of segment in which reference is loc'd */
+ uint8_t length; /* 1 2 or 4 bytes */
+ uint16_t refseg; /* segment to which reference refers to */
+};
+
+/*
+ * Extern/import record
+ */
+struct ImportRec {
+ uint8_t type; /* must be 2 */
+ uint8_t reclen; /* content length */
+ uint8_t flags; /* SYM_* flags (see below) */
+ uint16_t segment; /* segment number allocated to the label for reloc
+ records - label is assumed to be at offset zero
+ in this segment, so linker must fix up with offset
+ of segment and of offset within segment */
+ char label[EXIM_LABEL_MAX]; /* zero terminated, should be written to file
+ until the zero, but not after it */
+};
+
+/*
+ * Public/export record
+ */
+struct ExportRec {
+ uint8_t type; /* must be 3 */
+ uint8_t reclen; /* content length */
+ uint8_t flags; /* SYM_* flags (see below) */
+ uint8_t segment; /* segment referred to (0/1/2) */
+ int32_t offset; /* offset within segment */
+ char label[EXIM_LABEL_MAX]; /* zero terminated as in import */
+};
+
+/*
+ * DLL record
+ */
+struct DLLRec {
+ uint8_t type; /* must be 4 */
+ uint8_t reclen; /* content length */
+ char libname[MODLIB_NAME_MAX]; /* name of library to link with at load time */
+};
+
+/*
+ * BSS record
+ */
+struct BSSRec {
+ uint8_t type; /* must be 5 */
+ uint8_t reclen; /* content length */
+ int32_t amount; /* number of bytes BSS to reserve */
+};
+
+/*
+ * Module name record
+ */
+struct ModRec {
+ uint8_t type; /* must be 8 */
+ uint8_t reclen; /* content length */
+ char modname[MODLIB_NAME_MAX]; /* module name */
+};
+
+/*
+ * Common variable record
+ */
+struct CommonRec {
+ uint8_t type; /* must be 10 */
+ uint8_t reclen; /* equals 7+label length */
+ uint16_t segment; /* segment number */
+ int32_t size; /* size of common variable */
+ uint16_t align; /* alignment (power of two) */
+ char label[EXIM_LABEL_MAX]; /* zero terminated as in import */
+};
+
+/* Flags for ExportRec */
+#define SYM_DATA 1
+#define SYM_FUNCTION 2
+#define SYM_GLOBAL 4
+#define SYM_IMPORT 8
+
+#endif /* RDOFF_H */
diff --git a/include/saa.h b/include/saa.h
new file mode 100644
index 00000000..9d939ef5
--- /dev/null
+++ b/include/saa.h
@@ -0,0 +1,94 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_SAA_H
+#define NASM_SAA_H
+
+#include "compiler.h"
+
+/*
+ * Routines to manage a dynamic sequential-access array, under the
+ * same restriction on maximum mallocable block. This array may be
+ * written to in two ways: a contiguous chunk can be reserved of a
+ * given size with a pointer returned OR single-byte data may be
+ * written. The array can also be read back in the same two ways:
+ * as a series of big byte-data blocks or as a list of structures
+ * of a given size.
+ */
+
+struct SAA {
+ /*
+ * members `end' and `elem_len' are only valid in first link in
+ * list; `rptr' and `rpos' are used for reading
+ */
+ size_t elem_len; /* Size of each element */
+ size_t blk_len; /* Size of each allocation block */
+ size_t nblks; /* Total number of allocated blocks */
+ size_t nblkptrs; /* Total number of allocation block pointers */
+ size_t length; /* Total allocated length of the array */
+ size_t datalen; /* Total data length of the array */
+ char **wblk; /* Write block pointer */
+ size_t wpos; /* Write position inside block */
+ size_t wptr; /* Absolute write position */
+ char **rblk; /* Read block pointer */
+ size_t rpos; /* Read position inside block */
+ size_t rptr; /* Absolute read position */
+ char **blk_ptrs; /* Pointer to pointer blocks */
+};
+
+struct SAA * never_null saa_init(size_t elem_len); /* 1 == byte */
+void saa_free(struct SAA *);
+void *saa_wstruct(struct SAA *); /* return a structure of elem_len */
+void saa_wbytes(struct SAA *, const void *, size_t); /* write arbitrary bytes */
+size_t saa_wcstring(struct SAA *s, const char *str); /* write a C string */
+void saa_rewind(struct SAA *); /* for reading from beginning */
+void *saa_rstruct(struct SAA *); /* return NULL on EOA */
+const void *saa_rbytes(struct SAA *, size_t *); /* return 0 on EOA */
+void saa_rnbytes(struct SAA *, void *, size_t); /* read a given no. of bytes */
+/* random access */
+void saa_fread(struct SAA *, size_t, void *, size_t);
+void saa_fwrite(struct SAA *, size_t, const void *, size_t);
+
+/* dump to file */
+void saa_fpwrite(struct SAA *, FILE *);
+
+/* Write specific-sized values */
+void saa_write8(struct SAA *s, uint8_t v);
+void saa_write16(struct SAA *s, uint16_t v);
+void saa_write32(struct SAA *s, uint32_t v);
+void saa_write64(struct SAA *s, uint64_t v);
+void saa_wleb128u(struct SAA *, int); /* write unsigned LEB128 value */
+void saa_wleb128s(struct SAA *, int); /* write signed LEB128 value */
+void saa_writeaddr(struct SAA *, uint64_t, size_t);
+
+#endif /* NASM_SAA_H */
diff --git a/include/strlist.h b/include/strlist.h
new file mode 100644
index 00000000..caf11e18
--- /dev/null
+++ b/include/strlist.h
@@ -0,0 +1,60 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * strlist.h - simple linked list of strings
+ */
+
+#ifndef NASM_STRLIST_H
+#define NASM_STRLIST_H
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "hashtbl.h"
+
+struct strlist_entry {
+ struct strlist_entry *next;
+ size_t len;
+ char str[1];
+};
+
+typedef struct string_list {
+ struct hash_table hash;
+ struct strlist_entry *head, **tailp;
+} StrList;
+
+StrList safe_alloc *strlist_allocate(void);
+bool strlist_add_string(StrList *list, const char *str);
+void strlist_free(StrList *list);
+
+#endif /* NASM_STRLIST_H */
diff --git a/include/tables.h b/include/tables.h
new file mode 100644
index 00000000..24a665e2
--- /dev/null
+++ b/include/tables.h
@@ -0,0 +1,70 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * tables.h
+ *
+ * Declarations for auto-generated tables
+ */
+
+#ifndef NASM_TABLES_H
+#define NASM_TABLES_H
+
+#include "compiler.h"
+#include "insnsi.h" /* For enum opcode */
+
+/* --- From standard.mac via macros.pl: --- */
+
+/* macros.c */
+extern const unsigned char nasm_stdmac_tasm[];
+extern const unsigned char nasm_stdmac_nasm[];
+extern const unsigned char nasm_stdmac_version[];
+const unsigned char *nasm_stdmac_find_package(const char *);
+
+/* --- From insns.dat via insns.pl: --- */
+
+/* insnsn.c */
+extern const char * const nasm_insn_names[];
+
+/* --- From regs.dat via regs.pl: --- */
+
+/* regs.c */
+extern const char * const nasm_reg_names[];
+/* regflags.c */
+typedef uint64_t opflags_t;
+typedef uint16_t decoflags_t;
+extern const opflags_t nasm_reg_flags[];
+/* regvals.c */
+extern const int nasm_regvals[];
+
+#endif /* NASM_TABLES_H */
diff --git a/include/ver.h b/include/ver.h
new file mode 100644
index 00000000..6c93fe15
--- /dev/null
+++ b/include/ver.h
@@ -0,0 +1,46 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * NASM version strings, defined in ver.c
+ */
+
+#ifndef NASM_VER_H
+#define NASM_VER_H
+
+extern const char nasm_version[];
+extern const char nasm_compile_options[];
+extern const char nasm_comment[];
+extern const char nasm_signature[];
+
+#endif /* NASM_VER_H */
diff --git a/install-sh b/install-sh
new file mode 100755
index 00000000..f39433a7
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/macros/altreg.mac b/macros/altreg.mac
new file mode 100644
index 00000000..16134cdc
--- /dev/null
+++ b/macros/altreg.mac
@@ -0,0 +1,107 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;;
+;; altreg.mac
+;;
+;; Alternate register names for 64-bit mode
+;;
+
+USE: altreg
+
+;;
+;; Intel documents R8L-R15L instead of R8B-R15B
+;; (Warning: this may confuse people with an AT&T-style assembly
+;; background, where "r8l" means R8D, etc.)
+;;
+%idefine r8l r8b
+%idefine r9l r9b
+%idefine r10l r10b
+%idefine r11l r11b
+%idefine r12l r12b
+%idefine r13l r13b
+%idefine r14l r14b
+%idefine r15l r15b
+
+;;
+;; Numeric register names for the lower 8 registers
+;;
+%idefine r0 rax
+%idefine r1 rcx
+%idefine r2 rdx
+%idefine r3 rbx
+%idefine r4 rsp
+%idefine r5 rbp
+%idefine r6 rsi
+%idefine r7 rdi
+
+%idefine r0d eax
+%idefine r1d ecx
+%idefine r2d edx
+%idefine r3d ebx
+%idefine r4d esp
+%idefine r5d ebp
+%idefine r6d esi
+%idefine r7d edi
+
+%idefine r0w ax
+%idefine r1w cx
+%idefine r2w dx
+%idefine r3w bx
+%idefine r4w sp
+%idefine r5w bp
+%idefine r6w si
+%idefine r7w di
+
+%idefine r0b al
+%idefine r1b cl
+%idefine r2b dl
+%idefine r3b bl
+%idefine r4b spl
+%idefine r5b bpl
+%idefine r6b sil
+%idefine r7b dil
+
+%idefine r0l al
+%idefine r1l cl
+%idefine r2l dl
+%idefine r3l bl
+%idefine r4l spl
+%idefine r5l bpl
+%idefine r6l sil
+%idefine r7l dil
+
+%idefine r0h ah
+%idefine r1h ch
+%idefine r2h dh
+%idefine r3h bh
diff --git a/macros/fp.mac b/macros/fp.mac
new file mode 100644
index 00000000..1334784b
--- /dev/null
+++ b/macros/fp.mac
@@ -0,0 +1,54 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 2010 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;;
+;; fp.mac
+;;
+;; Floating-point utility macros
+;;
+
+USE: fp
+
+%define Inf __Infinity__
+%define NaN __QNaN__
+%define QNaN __QNaN__
+%define SNaN __SNaN__
+
+%define float8(x) __float8__(x)
+%define float16(x) __float16__(x)
+%define float32(x) __float32__(x)
+%define float64(x) __float64__(x)
+%define float80m(x) __float80m__(x)
+%define float80e(x) __float80e__(x)
+%define float128l(x) __float128l__(x)
+%define float128h(x) __float128h__(x)
diff --git a/macros/ifunc.mac b/macros/ifunc.mac
new file mode 100644
index 00000000..0fafe8d6
--- /dev/null
+++ b/macros/ifunc.mac
@@ -0,0 +1,48 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 2012-2016 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;;
+;; ifunc.mac
+;;
+;; Integer function utility macros
+;;
+
+USE: ifunc
+
+%idefine ilog2(x) (__ilog2e__(x))
+%idefine ilog2e(x) (__ilog2e__(x))
+%idefine ilog2w(x) (__ilog2w__(x))
+%idefine ilog2fw(x) (__ilog2w__(x))
+%idefine ilog2f(x) (__ilog2f__(x))
+%idefine ilog2cw(x) (__ilog2w__(x) * 0 + __ilog2c__(x))
+%idefine ilog2c(x) (__ilog2c__(x))
diff --git a/macros/macros.c b/macros/macros.c
new file mode 100644
index 00000000..97bc50d4
--- /dev/null
+++ b/macros/macros.c
@@ -0,0 +1,641 @@
+/*
+ * Do not edit - this file auto-generated by macros.pl from:
+ * version.mac
+ * ./macros/altreg.mac
+ * ./macros/fp.mac
+ * ./macros/ifunc.mac
+ * ./macros/smartalign.mac
+ * ./macros/standard.mac
+ * ./output/outaout.mac
+ * ./output/outas86.mac
+ * ./output/outbin.mac
+ * ./output/outcoff.mac
+ * ./output/outdbg.mac
+ * ./output/outelf.mac
+ * ./output/outmacho.mac
+ * ./output/outobj.mac
+ * ./output/outrdf2.mac
+ * ./output/outrdf.mac
+ */
+
+#include "tables.h"
+#include "nasmlib.h"
+#include "hashtbl.h"
+#include "outform.h"
+
+
+#if 1
+const unsigned char nasm_stdmac_version[] = {
+ /* From version.mac */
+ /* 0 */ 195,'_','_','N','A','S','M','_','M','A','J','O','R','_','_',' ','2',0,
+ /* 18 */ 195,'_','_','N','A','S','M','_','M','I','N','O','R','_','_',' ','1','4',0,
+ /* 37 */ 195,'_','_','N','A','S','M','_','S','U','B','M','I','N','O','R','_','_',' ','9','9',0,
+ /* 59 */ 195,'_','_','N','A','S','M','_','P','A','T','C','H','L','E','V','E','L','_','_',' ','9','0',0,
+ /* 83 */ 195,'_','_','N','A','S','M','_','V','E','R','S','I','O','N','_','I','D','_','_',' ','0','0','2','0','E','6','3','5','A','h',0,
+ /* 115 */ 195,'_','_','N','A','S','M','_','V','E','R','_','_',' ', 34,'2','.','1','5','r','c','0', 34,0,
+ /* 139 */ 0
+};
+#endif
+
+#if 1
+static const unsigned char nasm_usemac_altreg[] = {
+ /* From ./macros/altreg.mac */
+ /* 0 */ 195,'_','_','U','S','E','_','A','L','T','R','E','G','_','_',0,
+ /* 16 */ 209,'r','8','l',' ','r','8','b',0,
+ /* 26 */ 209,'r','9','l',' ','r','9','b',0,
+ /* 36 */ 209,'r','1','0','l',' ','r','1','0','b',0,
+ /* 47 */ 209,'r','1','1','l',' ','r','1','1','b',0,
+ /* 58 */ 209,'r','1','2','l',' ','r','1','2','b',0,
+ /* 69 */ 209,'r','1','3','l',' ','r','1','3','b',0,
+ /* 80 */ 209,'r','1','4','l',' ','r','1','4','b',0,
+ /* 91 */ 209,'r','1','5','l',' ','r','1','5','b',0,
+ /* 102 */ 209,'r','0',' ','r','a','x',0,
+ /* 111 */ 209,'r','1',' ','r','c','x',0,
+ /* 120 */ 209,'r','2',' ','r','d','x',0,
+ /* 129 */ 209,'r','3',' ','r','b','x',0,
+ /* 138 */ 209,'r','4',' ','r','s','p',0,
+ /* 147 */ 209,'r','5',' ','r','b','p',0,
+ /* 156 */ 209,'r','6',' ','r','s','i',0,
+ /* 165 */ 209,'r','7',' ','r','d','i',0,
+ /* 174 */ 209,'r','0','d',' ','e','a','x',0,
+ /* 183 */ 209,'r','1','d',' ','e','c','x',0,
+ /* 192 */ 209,'r','2','d',' ','e','d','x',0,
+ /* 201 */ 209,'r','3','d',' ','e','b','x',0,
+ /* 210 */ 209,'r','4','d',' ','e','s','p',0,
+ /* 219 */ 209,'r','5','d',' ','e','b','p',0,
+ /* 228 */ 209,'r','6','d',' ','e','s','i',0,
+ /* 237 */ 209,'r','7','d',' ','e','d','i',0,
+ /* 246 */ 209,'r','0','w',' ','a','x',0,
+ /* 254 */ 209,'r','1','w',' ','c','x',0,
+ /* 262 */ 209,'r','2','w',' ','d','x',0,
+ /* 270 */ 209,'r','3','w',' ','b','x',0,
+ /* 278 */ 209,'r','4','w',' ','s','p',0,
+ /* 286 */ 209,'r','5','w',' ','b','p',0,
+ /* 294 */ 209,'r','6','w',' ','s','i',0,
+ /* 302 */ 209,'r','7','w',' ','d','i',0,
+ /* 310 */ 209,'r','0','b',' ','a','l',0,
+ /* 318 */ 209,'r','1','b',' ','c','l',0,
+ /* 326 */ 209,'r','2','b',' ','d','l',0,
+ /* 334 */ 209,'r','3','b',' ','b','l',0,
+ /* 342 */ 209,'r','4','b',' ','s','p','l',0,
+ /* 351 */ 209,'r','5','b',' ','b','p','l',0,
+ /* 360 */ 209,'r','6','b',' ','s','i','l',0,
+ /* 369 */ 209,'r','7','b',' ','d','i','l',0,
+ /* 378 */ 209,'r','0','l',' ','a','l',0,
+ /* 386 */ 209,'r','1','l',' ','c','l',0,
+ /* 394 */ 209,'r','2','l',' ','d','l',0,
+ /* 402 */ 209,'r','3','l',' ','b','l',0,
+ /* 410 */ 209,'r','4','l',' ','s','p','l',0,
+ /* 419 */ 209,'r','5','l',' ','b','p','l',0,
+ /* 428 */ 209,'r','6','l',' ','s','i','l',0,
+ /* 437 */ 209,'r','7','l',' ','d','i','l',0,
+ /* 446 */ 209,'r','0','h',' ','a','h',0,
+ /* 454 */ 209,'r','1','h',' ','c','h',0,
+ /* 462 */ 209,'r','2','h',' ','d','h',0,
+ /* 470 */ 209,'r','3','h',' ','b','h',0,
+ /* 478 */ 0
+};
+#endif
+
+#if 1
+static const unsigned char nasm_usemac_fp[] = {
+ /* From ./macros/fp.mac */
+ /* 0 */ 195,'_','_','U','S','E','_','F','P','_','_',0,
+ /* 12 */ 195,'I','n','f',' ','_','_','I','n','f','i','n','i','t','y','_','_',0,
+ /* 31 */ 195,'N','a','N',' ','_','_','Q','N','a','N','_','_',0,
+ /* 46 */ 195,'Q','N','a','N',' ','_','_','Q','N','a','N','_','_',0,
+ /* 62 */ 195,'S','N','a','N',' ','_','_','S','N','a','N','_','_',0,
+ /* 78 */ 195,'f','l','o','a','t','8','(','x',')',' ','_','_','f','l','o','a','t','8','_','_','(','x',')',0,
+ /* 103 */ 195,'f','l','o','a','t','1','6','(','x',')',' ','_','_','f','l','o','a','t','1','6','_','_','(','x',')',0,
+ /* 130 */ 195,'f','l','o','a','t','3','2','(','x',')',' ','_','_','f','l','o','a','t','3','2','_','_','(','x',')',0,
+ /* 157 */ 195,'f','l','o','a','t','6','4','(','x',')',' ','_','_','f','l','o','a','t','6','4','_','_','(','x',')',0,
+ /* 184 */ 195,'f','l','o','a','t','8','0','m','(','x',')',' ','_','_','f','l','o','a','t','8','0','m','_','_','(','x',')',0,
+ /* 213 */ 195,'f','l','o','a','t','8','0','e','(','x',')',' ','_','_','f','l','o','a','t','8','0','e','_','_','(','x',')',0,
+ /* 242 */ 195,'f','l','o','a','t','1','2','8','l','(','x',')',' ','_','_','f','l','o','a','t','1','2','8','l','_','_','(','x',')',0,
+ /* 273 */ 195,'f','l','o','a','t','1','2','8','h','(','x',')',' ','_','_','f','l','o','a','t','1','2','8','h','_','_','(','x',')',0,
+ /* 304 */ 0
+};
+#endif
+
+#if 1
+static const unsigned char nasm_usemac_ifunc[] = {
+ /* From ./macros/ifunc.mac */
+ /* 0 */ 195,'_','_','U','S','E','_','I','F','U','N','C','_','_',0,
+ /* 15 */ 209,'i','l','o','g','2','(','x',')',' ','(','_','_','i','l','o','g','2','e','_','_','(','x',')',')',0,
+ /* 41 */ 209,'i','l','o','g','2','e','(','x',')',' ','(','_','_','i','l','o','g','2','e','_','_','(','x',')',')',0,
+ /* 68 */ 209,'i','l','o','g','2','w','(','x',')',' ','(','_','_','i','l','o','g','2','w','_','_','(','x',')',')',0,
+ /* 95 */ 209,'i','l','o','g','2','f','w','(','x',')',' ','(','_','_','i','l','o','g','2','w','_','_','(','x',')',')',0,
+ /* 123 */ 209,'i','l','o','g','2','f','(','x',')',' ','(','_','_','i','l','o','g','2','f','_','_','(','x',')',')',0,
+ /* 150 */ 209,'i','l','o','g','2','c','w','(','x',')',' ','(','_','_','i','l','o','g','2','w','_','_','(','x',')',' ','*',' ','0',' ','+',' ','_','_','i','l','o','g','2','c','_','_','(','x',')',')',0,
+ /* 198 */ 209,'i','l','o','g','2','c','(','x',')',' ','(','_','_','i','l','o','g','2','c','_','_','(','x',')',')',0,
+ /* 225 */ 0
+};
+#endif
+
+#if 1
+static const unsigned char nasm_usemac_smartalign[] = {
+ /* From ./macros/smartalign.mac */
+ /* 0 */ 195,'_','_','U','S','E','_','S','M','A','R','T','A','L','I','G','N','_','_',0,
+ /* 20 */ 212,'a','l','i','g','n','m','o','d','e',' ','1','-','2','.','n','o','l','i','s','t',0,
+ /* 42 */ 174,'%','1',',','n','o','p',0,
+ /* 50 */ 195,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','1','6',0,
+ /* 78 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 103 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','G','R','O','U','P','_','_',' ','1',0,
+ /* 128 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 153 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','G','R','O','U','P','_','_',' ','1',0,
+ /* 178 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 203 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','1',0,
+ /* 228 */ 142,'%','1',',','g','e','n','e','r','i','c',0,
+ /* 240 */ 195,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','8',0,
+ /* 267 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 292 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','2','B','_','_',' ','0','x','8','9',',','0','x','f','6',0,
+ /* 322 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','3','B','_','_',' ','0','x','8','d',',','0','x','7','4',',','0','x','0','0',0,
+ /* 357 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','4','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','0','0',',','0','x','0','0',0,
+ /* 397 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','5','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','0','0',',','0','x','0','0',',','0','x','9','0',0,
+ /* 442 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','6','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','0','0',',','0','x','0','0',',','0','x','8','9',',','0','x','f','f',0,
+ /* 492 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','7','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','0','0',',','0','x','0','0',',','0','x','8','d',',','0','x','7','d',',','0','x','0','0',0,
+ /* 547 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','8','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','0','0',',','0','x','0','0',',','0','x','8','d',',','0','x','b','d',',','0','x','0','0',',','0','x','0','0',0,
+ /* 607 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','G','R','O','U','P','_','_',' ','8',0,
+ /* 632 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 657 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','2','B','_','_',' ','0','x','8','9',',','0','x','f','6',0,
+ /* 687 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','3','B','_','_',' ','0','x','8','d',',','0','x','7','6',',','0','x','0','0',0,
+ /* 722 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','4','B','_','_',' ','0','x','8','d',',','0','x','7','4',',','0','x','2','6',',','0','x','0','0',0,
+ /* 762 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','5','B','_','_',' ','0','x','9','0',',','0','x','8','d',',','0','x','7','4',',','0','x','2','6',',','0','x','0','0',0,
+ /* 807 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','6','B','_','_',' ','0','x','8','d',',','0','x','b','6',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 857 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','7','B','_','_',' ','0','x','8','d',',','0','x','b','4',',','0','x','2','6',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 912 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','G','R','O','U','P','_','_',' ','7',0,
+ /* 937 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 962 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 992 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1027 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1067 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 1092 */ 142,'%','1',',','k','8',0,
+ /* 1099 */ 195,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','1','6',0,
+ /* 1127 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 1152 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 1182 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1217 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1257 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 1282 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 1307 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 1337 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1372 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1412 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 1437 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 1462 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 1492 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1527 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1567 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 1592 */ 142,'%','1',',','k','7',0,
+ /* 1599 */ 195,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','1','6',0,
+ /* 1627 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 1652 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 1682 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1717 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 1757 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 1782 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 1807 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','2','B','_','_',' ','0','x','8','b',',','0','x','c','0',0,
+ /* 1837 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','3','B','_','_',' ','0','x','8','d',',','0','x','0','4',',','0','x','2','0',0,
+ /* 1872 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','4','B','_','_',' ','0','x','8','d',',','0','x','4','4',',','0','x','2','0',',','0','x','0','0',0,
+ /* 1912 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','5','B','_','_',' ','0','x','8','d',',','0','x','4','4',',','0','x','2','0',',','0','x','0','0',',','0','x','9','0',0,
+ /* 1957 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','6','B','_','_',' ','0','x','8','d',',','0','x','8','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2007 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','7','B','_','_',' ','0','x','8','d',',','0','x','0','4',',','0','x','0','5',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2062 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','G','R','O','U','P','_','_',' ','7',0,
+ /* 2087 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 2112 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 2142 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','3','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 2177 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','4','B','_','_',' ','0','x','6','6',',','0','x','6','6',',','0','x','6','6',',','0','x','9','0',0,
+ /* 2217 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 2242 */ 142,'%','1',',','p','6',0,
+ /* 2249 */ 195,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','1','6',0,
+ /* 2277 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 2302 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 2332 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','3','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','0','0',0,
+ /* 2367 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','4','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','4','0',',','0','x','0','0',0,
+ /* 2407 */ 195,'_','_','A','L','I','G','N','_','1','6','B','I','T','_','G','R','O','U','P','_','_',' ','4',0,
+ /* 2432 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 2457 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 2487 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','3','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','0','0',0,
+ /* 2522 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','4','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','4','0',',','0','x','0','0',0,
+ /* 2562 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','5','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','4','4',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2607 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','6','B','_','_',' ','0','x','6','6',',','0','x','0','f',',','0','x','1','f',',','0','x','4','4',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2657 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','7','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','8','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2712 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','8','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','8','4',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2772 */ 195,'_','_','A','L','I','G','N','_','3','2','B','I','T','_','G','R','O','U','P','_','_',' ','8',0,
+ /* 2797 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','1','B','_','_',' ','0','x','9','0',0,
+ /* 2822 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','2','B','_','_',' ','0','x','6','6',',','0','x','9','0',0,
+ /* 2852 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','3','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','0','0',0,
+ /* 2887 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','4','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','4','0',',','0','x','0','0',0,
+ /* 2927 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','5','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','4','4',',','0','x','0','0',',','0','x','0','0',0,
+ /* 2972 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','6','B','_','_',' ','0','x','6','6',',','0','x','0','f',',','0','x','1','f',',','0','x','4','4',',','0','x','0','0',',','0','x','0','0',0,
+ /* 3022 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','7','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','8','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 3077 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','8','B','_','_',' ','0','x','0','f',',','0','x','1','f',',','0','x','8','4',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',',','0','x','0','0',0,
+ /* 3137 */ 195,'_','_','A','L','I','G','N','_','6','4','B','I','T','_','G','R','O','U','P','_','_',' ','8',0,
+ /* 3162 */ 199,0,
+ /* 3164 */ 204,'u','n','k','n','o','w','n',' ','a','l','i','g','n','m','e','n','t',' ','m','o','d','e',':',' ','%','1',0,
+ /* 3192 */ 200,0,
+ /* 3194 */ 167,'%','2',0,
+ /* 3198 */ 174,'%','2',',','n','o','j','m','p',0,
+ /* 3208 */ 236,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','-','1',0,
+ /* 3236 */ 199,0,
+ /* 3238 */ 236,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','%','2',0,
+ /* 3266 */ 200,0,
+ /* 3268 */ 200,0,
+ /* 3270 */ 236,'_','_','A','L','I','G','N','M','O','D','E','_','_',' ','%','1',',','_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',0,
+ /* 3312 */ 202,0,
+ /* 3314 */ 232,'a','l','i','g','n',' ','1','-','2','+','.','n','o','l','i','s','t',0,
+ /* 3333 */ 212,'a','l','i','g','n',' ','1','-','2','+','.','n','o','l','i','s','t',0,
+ /* 3352 */ 's','e','c','t','a','l','i','g','n',' ','%','1',0,
+ /* 3365 */ 167,'%','2',0,
+ /* 3369 */ 't','i','m','e','s',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',' ','%','2',0,
+ /* 3412 */ 128,'_','_','P','A','S','S','_','_',' ','=','=',' ','0',' ','|','|',' ','_','_','P','A','S','S','_','_',' ','=','=',' ','3',0,
+ /* 3444 */ 't','i','m','e','s',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',' ','n','o','p',0,
+ /* 3488 */ 199,0,
+ /* 3490 */ 222,0,
+ /* 3492 */ 193,'%','$','p','a','d',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',0,
+ /* 3533 */ 160,'_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',' ','!','=',' ','-','1',' ','&','&',' ','%','$','p','a','d',' ','>',' ','_','_','A','L','I','G','N','_','J','M','P','_','T','H','R','E','S','H','O','L','D','_','_',0,
+ /* 3599 */ 'j','m','p',' ','%','$','e','n','d',0,
+ /* 3609 */ 't','i','m','e','s',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',' ','n','o','p',0,
+ /* 3653 */ 199,0,
+ /* 3655 */ 't','i','m','e','s',' ','(','%','$','p','a','d',' ','/',' ','_','_','A','L','I','G','N','_','%','[','_','_','B','I','T','S','_','_',']','B','I','T','_','G','R','O','U','P','_','_',')',' ','d','b',' ','_','_','A','L','I','G','N','_','%','[','_','_','B','I','T','S','_','_',']','B','I','T','_','%','[','_','_','A','L','I','G','N','_','%','[','_','_','B','I','T','S','_','_',']','B','I','T','_','G','R','O','U','P','_','_',']','B','_','_',0,
+ /* 3773 */ 193,'%','$','p','a','d',' ','%','$','p','a','d',' ','%',' ','_','_','A','L','I','G','N','_','%','[','_','_','B','I','T','S','_','_',']','B','I','T','_','G','R','O','U','P','_','_',0,
+ /* 3819 */ 160,'%','$','p','a','d',' ','>',' ','0',0,
+ /* 3830 */ 'd','b',' ','_','_','A','L','I','G','N','_','%','[','_','_','B','I','T','S','_','_',']','B','I','T','_','%','[','%','$','p','a','d',']','B','_','_',0,
+ /* 3868 */ 200,0,
+ /* 3870 */ 200,0,
+ /* 3872 */ '%','$','e','n','d',':',0,
+ /* 3879 */ 220,0,
+ /* 3881 */ 200,0,
+ /* 3883 */ 202,0,
+ /* 3885 */ 'a','l','i','g','n','m','o','d','e',' ','g','e','n','e','r','i','c',0,
+ /* 3903 */ 0
+};
+#endif
+
+#if 1
+const unsigned char nasm_stdmac_tasm[] = {
+ /* From ./macros/standard.mac */
+ /* 0 */ 209,'I','D','E','A','L',0,
+ /* 7 */ 209,'J','U','M','P','S',0,
+ /* 14 */ 209,'P','3','8','6',0,
+ /* 20 */ 209,'P','4','8','6',0,
+ /* 26 */ 209,'P','5','8','6',0,
+ /* 32 */ 209,'E','N','D',0,
+ /* 37 */ 0
+};
+#endif
+
+#if 1
+const unsigned char nasm_stdmac_nasm[] = {
+ /* From ./macros/standard.mac */
+ /* 0 */ 195,'_','_','F','I','L','E','_','_',0,
+ /* 10 */ 195,'_','_','L','I','N','E','_','_',0,
+ /* 20 */ 195,'_','_','B','I','T','S','_','_',0,
+ /* 30 */ 195,'_','_','S','E','C','T','_','_',0,
+ /* 40 */ 212,'s','e','c','t','i','o','n',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 59 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','%','1',']',0,
+ /* 82 */ '_','_','S','E','C','T','_','_',0,
+ /* 91 */ 202,0,
+ /* 93 */ 212,'s','e','g','m','e','n','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 112 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','g','m','e','n','t',' ','%','1',']',0,
+ /* 135 */ '_','_','S','E','C','T','_','_',0,
+ /* 144 */ 202,0,
+ /* 146 */ 195,'_','_','S','E','C','T','A','L','I','G','N','_','A','L','I','G','N','_','U','P','D','A','T','E','S','_','S','E','C','T','I','O','N','_','_',' ','1',0,
+ /* 185 */ 212,'s','e','c','t','a','l','i','g','n',' ','1','.','n','o','l','i','s','t',0,
+ /* 205 */ 178,'%','1',0,
+ /* 209 */ 160,'_','_','S','E','C','T','A','L','I','G','N','_','A','L','I','G','N','_','U','P','D','A','T','E','S','_','S','E','C','T','I','O','N','_','_',' ','=',' ','1',0,
+ /* 250 */ '[','s','e','c','t','a','l','i','g','n',' ','%','1',']',0,
+ /* 265 */ 200,0,
+ /* 267 */ 199,0,
+ /* 269 */ 174,'%','1',',','o','f','f',0,
+ /* 277 */ 195,'_','_','S','E','C','T','A','L','I','G','N','_','A','L','I','G','N','_','U','P','D','A','T','E','S','_','S','E','C','T','I','O','N','_','_',' ','0',0,
+ /* 316 */ 142,'%','1',',','o','n',0,
+ /* 323 */ 195,'_','_','S','E','C','T','A','L','I','G','N','_','A','L','I','G','N','_','U','P','D','A','T','E','S','_','S','E','C','T','I','O','N','_','_',' ','1',0,
+ /* 362 */ 200,0,
+ /* 364 */ 200,0,
+ /* 366 */ 202,0,
+ /* 368 */ 212,'a','b','s','o','l','u','t','e',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 388 */ 195,'_','_','S','E','C','T','_','_',' ','[','a','b','s','o','l','u','t','e',' ','%','1',']',0,
+ /* 412 */ '_','_','S','E','C','T','_','_',0,
+ /* 421 */ 202,0,
+ /* 423 */ 212,'s','t','r','u','c',' ','1','-','2','.','n','o','l','i','s','t',' ','0',0,
+ /* 443 */ 222,0,
+ /* 445 */ 195,'%','$','s','t','r','u','c','n','a','m','e',' ','%','1',0,
+ /* 461 */ '[','a','b','s','o','l','u','t','e',' ','%','2',']',0,
+ /* 475 */ '%','$','s','t','r','u','c','n','a','m','e',':',0,
+ /* 488 */ 202,0,
+ /* 490 */ 212,'e','n','d','s','t','r','u','c',' ','0','.','n','o','l','i','s','t',0,
+ /* 509 */ '%','{','$','s','t','r','u','c','n','a','m','e','}','_','s','i','z','e',' ','e','q','u',' ','(','$','-','%','$','s','t','r','u','c','n','a','m','e',')',0,
+ /* 548 */ 220,0,
+ /* 550 */ '_','_','S','E','C','T','_','_',0,
+ /* 559 */ 202,0,
+ /* 561 */ 212,'i','s','t','r','u','c',' ','1','.','n','o','l','i','s','t',0,
+ /* 578 */ 222,0,
+ /* 580 */ 195,'%','$','s','t','r','u','c','n','a','m','e',' ','%','1',0,
+ /* 596 */ '%','$','s','t','r','u','c','s','t','a','r','t',':',0,
+ /* 610 */ 202,0,
+ /* 612 */ 212,'a','t',' ','1','-','2','+','.','n','o','l','i','s','t',0,
+ /* 628 */ 't','i','m','e','s',' ','(','%','1','-','%','$','s','t','r','u','c','n','a','m','e',')','-','(','$','-','%','$','s','t','r','u','c','s','t','a','r','t',')',' ','d','b',' ','0',0,
+ /* 673 */ '%','2',0,
+ /* 676 */ 202,0,
+ /* 678 */ 212,'i','e','n','d',' ','0','.','n','o','l','i','s','t',0,
+ /* 693 */ 't','i','m','e','s',' ','%','{','$','s','t','r','u','c','n','a','m','e','}','_','s','i','z','e','-','(','$','-','%','$','s','t','r','u','c','s','t','a','r','t',')',' ','d','b',' ','0',0,
+ /* 740 */ 220,0,
+ /* 742 */ 202,0,
+ /* 744 */ 212,'a','l','i','g','n',' ','1','-','2','+','.','n','o','l','i','s','t',' ','n','o','p',0,
+ /* 767 */ 's','e','c','t','a','l','i','g','n',' ','%','1',0,
+ /* 780 */ 't','i','m','e','s',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',' ','%','2',0,
+ /* 823 */ 202,0,
+ /* 825 */ 212,'a','l','i','g','n','b',' ','1','-','2','+','.','n','o','l','i','s','t',0,
+ /* 845 */ 's','e','c','t','a','l','i','g','n',' ','%','1',0,
+ /* 858 */ 166,'%','2',0,
+ /* 862 */ 'r','e','s','b',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',0,
+ /* 901 */ 199,0,
+ /* 903 */ 't','i','m','e','s',' ','(','(','(','%','1',')',' ','-',' ','(','(','$','-','$','$',')',' ','%',' ','(','%','1',')',')',')',' ','%',' ','(','%','1',')',')',' ','%','2',0,
+ /* 946 */ 200,0,
+ /* 948 */ 202,0,
+ /* 950 */ 212,'b','i','t','s',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 966 */ '[','b','i','t','s',' ','%','1',']',0,
+ /* 976 */ 202,0,
+ /* 978 */ 212,'u','s','e','1','6',' ','0','.','n','o','l','i','s','t',0,
+ /* 994 */ '[','b','i','t','s',' ','1','6',']',0,
+ /* 1004 */ 202,0,
+ /* 1006 */ 212,'u','s','e','3','2',' ','0','.','n','o','l','i','s','t',0,
+ /* 1022 */ '[','b','i','t','s',' ','3','2',']',0,
+ /* 1032 */ 202,0,
+ /* 1034 */ 212,'u','s','e','6','4',' ','0','.','n','o','l','i','s','t',0,
+ /* 1050 */ '[','b','i','t','s',' ','6','4',']',0,
+ /* 1060 */ 202,0,
+ /* 1062 */ 212,'e','x','t','e','r','n',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 1081 */ 223,'%','0',0,
+ /* 1085 */ '[','e','x','t','e','r','n',' ','%','1',']',0,
+ /* 1097 */ 226,'1',0,
+ /* 1100 */ 203,0,
+ /* 1102 */ 202,0,
+ /* 1104 */ 212,'s','t','a','t','i','c',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 1123 */ 223,'%','0',0,
+ /* 1127 */ '[','s','t','a','t','i','c',' ','%','1',']',0,
+ /* 1139 */ 226,'1',0,
+ /* 1142 */ 203,0,
+ /* 1144 */ 202,0,
+ /* 1146 */ 212,'g','l','o','b','a','l',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 1165 */ 223,'%','0',0,
+ /* 1169 */ '[','g','l','o','b','a','l',' ','%','1',']',0,
+ /* 1181 */ 226,'1',0,
+ /* 1184 */ 203,0,
+ /* 1186 */ 202,0,
+ /* 1188 */ 212,'c','o','m','m','o','n',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 1207 */ 223,'%','0',0,
+ /* 1211 */ '[','c','o','m','m','o','n',' ','%','1',']',0,
+ /* 1223 */ 226,'1',0,
+ /* 1226 */ 203,0,
+ /* 1228 */ 202,0,
+ /* 1230 */ 212,'c','p','u',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 1245 */ '[','c','p','u',' ','%','1',']',0,
+ /* 1254 */ 202,0,
+ /* 1256 */ 195,'_','_','F','L','O','A','T','_','D','A','Z','_','_',' ','n','o','d','a','z',0,
+ /* 1277 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','n','e','a','r',0,
+ /* 1299 */ 195,'_','_','F','L','O','A','T','_','_',' ','_','_','F','L','O','A','T','_','D','A','Z','_','_',',','_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',0,
+ /* 1340 */ 212,'f','l','o','a','t',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 1358 */ 223,'%','0',0,
+ /* 1362 */ '[','f','l','o','a','t',' ','%','1',']',0,
+ /* 1373 */ 174,'%','1',',','d','a','z',0,
+ /* 1381 */ 195,'_','_','F','L','O','A','T','_','D','A','Z','_','_',' ','d','a','z',0,
+ /* 1400 */ 142,'%','1',',','n','o','d','a','z',0,
+ /* 1410 */ 195,'_','_','F','L','O','A','T','_','D','A','Z','_','_',' ','n','o','d','a','z',0,
+ /* 1431 */ 142,'%','1',',','n','e','a','r',0,
+ /* 1440 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','n','e','a','r',0,
+ /* 1462 */ 142,'%','1',',','u','p',0,
+ /* 1469 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','u','p',0,
+ /* 1489 */ 142,'%','1',',','d','o','w','n',0,
+ /* 1498 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','d','o','w','n',0,
+ /* 1520 */ 142,'%','1',',','z','e','r','o',0,
+ /* 1529 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','z','e','r','o',0,
+ /* 1551 */ 142,'%','1',',','d','e','f','a','u','l','t',0,
+ /* 1563 */ 195,'_','_','F','L','O','A','T','_','D','A','Z','_','_',' ','n','o','d','a','z',0,
+ /* 1584 */ 195,'_','_','F','L','O','A','T','_','R','O','U','N','D','_','_',' ','n','e','a','r',0,
+ /* 1606 */ 200,0,
+ /* 1608 */ 226,'1',0,
+ /* 1611 */ 203,0,
+ /* 1613 */ 202,0,
+ /* 1615 */ 212,'d','e','f','a','u','l','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 1634 */ '[','d','e','f','a','u','l','t',' ','%','1',']',0,
+ /* 1647 */ 202,0,
+ /* 1649 */ 212,'u','s','e','r','e','l',' ','0','.','n','o','l','i','s','t',0,
+ /* 1666 */ '[','d','e','f','a','u','l','t',' ','r','e','l',']',0,
+ /* 1680 */ 202,0,
+ /* 1682 */ 212,'u','s','e','a','b','s',' ','0','.','n','o','l','i','s','t',0,
+ /* 1699 */ '[','d','e','f','a','u','l','t',' ','a','b','s',']',0,
+ /* 1713 */ 202,0,
+ /* 1715 */ 212,'u','s','e','b','n','d',' ','0','.','n','o','l','i','s','t',0,
+ /* 1732 */ '[','d','e','f','a','u','l','t',' ','b','n','d',']',0,
+ /* 1746 */ 202,0,
+ /* 1748 */ 212,'u','s','e','n','o','b','n','d',' ','0','.','n','o','l','i','s','t',0,
+ /* 1767 */ '[','d','e','f','a','u','l','t',' ','n','o','b','n','d',']',0,
+ /* 1783 */ 202,0,
+ /* 1785 */ 212,'i','n','c','b','i','n',' ','1','-','2','+','.','n','o','l','i','s','t',' ','0',0,
+ /* 1807 */ 222,0,
+ /* 1809 */ 219,'%','$','d','e','p',' ','%','1',0,
+ /* 1819 */ 198,'%','$','d','e','p',0,
+ /* 1826 */ '%','?',' ','%','$','d','e','p',',','%','2',0,
+ /* 1838 */ 220,0,
+ /* 1840 */ 202,0,
+ /* 1842 */ 0
+};
+#endif
+
+#if defined(OF_AOUT) || defined(OF_AOUTB)
+const unsigned char aout_stdmac[] = {
+ /* From ./output/outaout.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 44 */ 202,0,
+ /* 46 */ 0
+};
+#endif
+
+#if defined(OF_AS86)
+const unsigned char as86_stdmac[] = {
+ /* From ./output/outas86.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 44 */ 202,0,
+ /* 46 */ 0
+};
+#endif
+
+#if defined(OF_BIN)
+const unsigned char bin_stdmac[] = {
+ /* From ./output/outbin.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 212,'o','r','g',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 41 */ '[','o','r','g',' ','%','1',']',0,
+ /* 50 */ 202,0,
+ /* 52 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 70 */ 202,0,
+ /* 72 */ 0
+};
+#endif
+
+#if defined(OF_COFF) || defined(OF_WIN32) || defined(OF_WIN64)
+const unsigned char coff_stdmac[] = {
+ /* From ./output/outcoff.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 44 */ 202,0,
+ /* 46 */ 212,'e','x','p','o','r','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 64 */ '[','e','x','p','o','r','t',' ','%','1',']',0,
+ /* 76 */ 202,0,
+ /* 78 */ 212,'s','a','f','e','s','e','h',' ','1','.','n','o','l','i','s','t',0,
+ /* 96 */ '[','s','a','f','e','s','e','h',' ','%','1',']',0,
+ /* 109 */ 202,0,
+ /* 111 */ 0
+};
+#endif
+
+#if defined(OF_DBG)
+const unsigned char dbg_stdmac[] = {
+ /* From ./output/outdbg.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 212,'g','r','o','u','p',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 43 */ '[','g','r','o','u','p',' ','%','1',']',0,
+ /* 54 */ 202,0,
+ /* 56 */ 212,'u','p','p','e','r','c','a','s','e',' ','0','+','.','n','o','l','i','s','t',0,
+ /* 77 */ 221,'d','b','g',' ','u','p','p','e','r','c','a','s','e',' ','%','1',0,
+ /* 95 */ 202,0,
+ /* 97 */ 212,'e','x','p','o','r','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 115 */ 221,'d','b','g',' ','e','x','p','o','r','t',' ','%','1',0,
+ /* 130 */ 202,0,
+ /* 132 */ 212,'i','m','p','o','r','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 150 */ 221,'d','b','g',' ','i','m','p','o','r','t',' ','%','1',0,
+ /* 165 */ 202,0,
+ /* 167 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 185 */ 202,0,
+ /* 187 */ 0
+};
+#endif
+
+#if defined(OF_ELF) || defined(OF_ELF32) || defined(OF_ELF64)
+const unsigned char elf_stdmac[] = {
+ /* From ./output/outelf.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 44 */ 195,'$','_','%','1',' ','$','%','1',0,
+ /* 54 */ 202,0,
+ /* 56 */ 212,'o','s','a','b','i',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 73 */ '[','%','?',' ','%','1',']',0,
+ /* 81 */ 202,0,
+ /* 83 */ 0
+};
+#endif
+
+#if defined(OF_MACHO) || defined(OF_MACHO32) || defined(OF_MACHO64)
+const unsigned char macho_stdmac[] = {
+ /* From ./output/outmacho.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 44 */ 202,0,
+ /* 46 */ 212,'s','u','b','s','e','c','t','i','o','n','s','_','v','i','a','_','s','y','m','b','o','l','s',' ','0','.','n','o','l','i','s','t',0,
+ /* 80 */ 221,'_','_','O','U','T','P','U','T','_','F','O','R','M','A','T','_','_',' ','%','?',0,
+ /* 102 */ 202,0,
+ /* 104 */ 212,'n','o','_','d','e','a','d','_','s','t','r','i','p',' ','1','-','*','.','n','o','l','i','s','t',0,
+ /* 130 */ 223,'%','0',0,
+ /* 134 */ 221,'_','_','O','U','T','P','U','T','_','F','O','R','M','A','T','_','_',' ','%','?',' ','%','1',0,
+ /* 159 */ 226,'1',0,
+ /* 162 */ 203,0,
+ /* 164 */ 202,0,
+ /* 166 */ 0
+};
+#endif
+
+#if defined(OF_OBJ)
+const unsigned char obj_stdmac[] = {
+ /* From ./output/outobj.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 212,'g','r','o','u','p',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 43 */ '[','g','r','o','u','p',' ','%','1',']',0,
+ /* 54 */ 202,0,
+ /* 56 */ 212,'u','p','p','e','r','c','a','s','e',' ','0','+','.','n','o','l','i','s','t',0,
+ /* 77 */ '[','u','p','p','e','r','c','a','s','e',' ','%','1',']',0,
+ /* 92 */ 202,0,
+ /* 94 */ 212,'e','x','p','o','r','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 112 */ '[','e','x','p','o','r','t',' ','%','1',']',0,
+ /* 124 */ 202,0,
+ /* 126 */ 212,'i','m','p','o','r','t',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 144 */ '[','i','m','p','o','r','t',' ','%','1',']',0,
+ /* 156 */ 202,0,
+ /* 158 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 176 */ 202,0,
+ /* 178 */ 0
+};
+#endif
+
+#if defined(OF_RDF2)
+const unsigned char rdf2_stdmac[] = {
+ /* From ./output/outrdf2.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 212,'l','i','b','r','a','r','y',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 45 */ '[','l','i','b','r','a','r','y',' ','%','1',']',0,
+ /* 58 */ 202,0,
+ /* 60 */ 212,'m','o','d','u','l','e',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 78 */ '[','m','o','d','u','l','e',' ','%','1',']',0,
+ /* 90 */ 202,0,
+ /* 92 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 110 */ 202,0,
+ /* 112 */ 0
+};
+#endif
+
+#if defined(OF_RDF)
+const unsigned char rdf_stdmac[] = {
+ /* From ./output/outrdf.mac */
+ /* 0 */ 195,'_','_','S','E','C','T','_','_',' ','[','s','e','c','t','i','o','n',' ','.','t','e','x','t',']',0,
+ /* 26 */ 212,'l','i','b','r','a','r','y',' ','1','+','.','n','o','l','i','s','t',0,
+ /* 45 */ '[','l','i','b','r','a','r','y',' ','%','1',']',0,
+ /* 58 */ 202,0,
+ /* 60 */ 218,'_','_','N','A','S','M','_','C','D','e','c','l','_','_',' ','1',0,
+ /* 78 */ 202,0,
+ /* 80 */ 0
+};
+#endif
+const unsigned char *nasm_stdmac_find_package(const char *package)
+{
+ static const struct {
+ const char *package;
+ const unsigned char *macros;
+ } packages[4] = {
+ { "altreg", nasm_usemac_altreg },
+ { "fp", nasm_usemac_fp },
+ { "ifunc", nasm_usemac_ifunc },
+ { "smartalign", nasm_usemac_smartalign },
+ };
+#define UNUSED (65535/3)
+ static const int16_t hash1[4] = {
+ 0,
+ 0,
+ 2,
+ -1,
+ };
+ static const int16_t hash2[4] = {
+ 1,
+ 2,
+ UNUSED,
+ UNUSED,
+ };
+ uint32_t k1, k2;
+ uint64_t crc;
+ uint16_t ix;
+
+ crc = crc64i(UINT64_C(0x076259c3e291c26c), package);
+ k1 = (uint32_t)crc;
+ k2 = (uint32_t)(crc >> 32);
+
+ ix = hash1[k1 & 0x3] + hash2[k2 & 0x3];
+ if (ix >= 4)
+ return NULL;
+
+ if (nasm_stricmp(packages[ix].package, package))
+ return NULL;
+
+ return packages[ix].macros;
+}
diff --git a/macros/macros.pl b/macros/macros.pl
new file mode 100755
index 00000000..d4bfa9fa
--- /dev/null
+++ b/macros/macros.pl
@@ -0,0 +1,294 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# macros.pl produce macros.c from standard.mac
+#
+
+require 'phash.ph';
+require 'asm/pptok.ph';
+
+use bytes;
+
+my $fname;
+my $line = 0;
+my $index = 0;
+my $tasm_count = 0;
+
+#
+# Print out a string as a character array
+#
+sub charcify(@) {
+ my $l = '';
+ my $c, $o;
+ my $space = 1;
+ my $quote = 0;
+
+ foreach $o (unpack("C*", join('',@_))) {
+ $c = pack("C", $o);
+ if ($quote) {
+ if ($o == $quote) {
+ $quote = 0;
+ }
+ } elsif ($c =~ /^[\'\"\`]$/) {
+ $quote = $o;
+ } else {
+ if ($c =~ /\s/) {
+ next if ($space);
+ $o = 32;
+ $c = ' ';
+ $space = 1;
+ } elsif ($o > 126) {
+ $space = 1; # Implicit space after compacted directive
+ } else {
+ $space = 0;
+ }
+ }
+
+ if ($o < 32 || $o > 126 || $c eq '"' || $c eq "\\") {
+ $l .= sprintf("%3d,", $o);
+ } else {
+ $c =~ s/\'/\\'/; # << sanitize single quote.
+ $l .= "\'".$c."\',";
+ }
+ }
+ return $l;
+}
+
+
+#
+# Generate macros.c
+#
+open(OUT, '>', 'macros/macros.c') or die "unable to open macros.c\n";
+
+print OUT "/*\n";
+print OUT " * Do not edit - this file auto-generated by macros.pl from:\n";
+print OUT " * ", join("\n * ", @ARGV), "\n";
+print OUT " */\n";
+print OUT "\n";
+print OUT "#include \"tables.h\"\n";
+print OUT "#include \"nasmlib.h\"\n";
+print OUT "#include \"hashtbl.h\"\n";
+print OUT "#include \"outform.h\"\n";
+print OUT "\n";
+
+my $name = undef;
+my $npkg = 0;
+my @pkg_list = ();
+my %pkg_number = ();
+my $pkg;
+my @out_list = ();
+my $outfmt;
+my $lastname;
+my $z;
+
+foreach $args ( @ARGV ) {
+ my @file_list = glob ( $args );
+ foreach $fname ( @file_list ) {
+ open(INPUT,'<', $fname) or die "$0: $fname: $!\n";
+ while (<INPUT>) {
+ $line++;
+ chomp;
+ while (/^(.*)\\$/) {
+ $_ = $1;
+ $_ .= <INPUT>;
+ chomp;
+ $line++;
+ }
+ if (m/^OUT:\s*(.*\S)\s*$/) {
+ undef $pkg;
+ my @out_alias = split(/\s+/, $1);
+ if (defined($name)) {
+ printf OUT " /* %4d */ 0\n", $index++;
+ print OUT "};\n#endif\n";
+ undef $name;
+ }
+ $index = 0;
+ print OUT "\n";
+ my $pfx = '#if';
+ foreach my $al (@out_alias) {
+ print OUT $pfx, " defined(OF_\U${al}\E)";
+ $pfx = ' ||';
+ }
+ $name = $out_alias[0] . '_stdmac';
+ print OUT "\nconst unsigned char ${name}[] = {\n";
+ print OUT " /* From $fname */\n";
+ $lastname = $fname;
+ push(@out_list, $out_alias[0]);
+ $out_index{$out_alias[0]} = $index;
+ } elsif (m/^STD:\s*(.*\S)\s*$/) {
+ undef $pkg;
+ my @out_alias = split(/\s+/, $1);
+ if (defined($name)) {
+ printf OUT " /* %4d */ 0\n", $index++;
+ print OUT "};\n#endif\n";
+ undef $name;
+ }
+ $index = 0;
+ print OUT "\n#if 1";
+ $name = 'nasm_stdmac_' . $out_alias[0];
+ print OUT "\nconst unsigned char ${name}[] = {\n";
+ print OUT " /* From $fname */\n";
+ $lastname = $fname;
+ push(@std_list, $out_alias[0]);
+ $std_index{$std_alias[0]} = $index;
+ } elsif (m/^USE:\s*(\S+)\s*$/) {
+ $pkg = $1;
+ if (defined($pkg_number{$pkg})) {
+ die "$0: $fname: duplicate package: $pkg\n";
+ }
+ if (defined($name)) {
+ printf OUT " /* %4d */ 0\n", $index++;
+ print OUT "};\n#endif\n";
+ undef $name;
+ }
+ $index = 0;
+ print OUT "\n#if 1";
+ $name = 'nasm_usemac_' . $pkg;
+ print OUT "\nstatic const unsigned char ${name}[] = {\n";
+ print OUT " /* From $fname */\n";
+ $lastname = $fname;
+ push(@pkg_list, $pkg);
+ $pkg_number{$pkg} = $npkg++;
+ $z = pack("C", $pptok_hash{'%define'}+128)."__USE_\U$pkg\E__";
+ printf OUT " /* %4d */ %s0,\n", $index, charcify($z);
+ $index += length($z)+1;
+ } elsif (m/^\s*((\s*([^\"\';\s]+|\"[^\"]*\"|\'[^\']*\'))*)\s*(;.*)?$/) {
+ my $s1, $s2, $pd, $ws;
+
+ if (!defined($name)) {
+ die "$0: $fname: macro declarations outside a known block\n";
+ }
+
+ $s1 = $1;
+ $s2 = '';
+ while ($s1 =~ /(\%[a-zA-Z_][a-zA-Z0-9_]*)((\s+)(.*)|)$/) {
+ $s2 .= "$'";
+ $pd = $1;
+ $ws = $3;
+ $s1 = $4;
+ if (defined($pptok_hash{$pd}) &&
+ $pptok_hash{$pd} <= 127) {
+ $s2 .= pack("C", $pptok_hash{$pd}+128);
+ } else {
+ $s2 .= $pd.$ws;
+ }
+ }
+ $s2 .= $s1;
+ if (length($s2) > 0) {
+ if ($lastname ne $fname) {
+ print OUT "\n /* From $fname */\n";
+ $lastname = $fname;
+ }
+ printf OUT " /* %4d */ %s0,\n",
+ $index, charcify($s2);
+ $index += length($s2)+1;
+ }
+ } else {
+ die "$fname:$line: error unterminated quote";
+ }
+ }
+ close(INPUT);
+ }
+}
+
+if (defined($name)) {
+ printf OUT " /* %4d */ 0\n", $index++;
+ print OUT "};\n#endif\n";
+ undef $name;
+}
+
+my @hashinfo = gen_perfect_hash(\%pkg_number);
+if (!@hashinfo) {
+ die "$0: no hash found\n";
+}
+# Paranoia...
+verify_hash_table(\%pkg_number, \@hashinfo);
+my ($n, $sv, $g) = @hashinfo;
+die if ($n & ($n-1));
+
+print OUT "const unsigned char *nasm_stdmac_find_package(const char *package)\n";
+print OUT "{\n";
+print OUT " static const struct {\n";
+print OUT " const char *package;\n";
+print OUT " const unsigned char *macros;\n";
+print OUT " } packages[$npkg] = {\n";
+foreach $pkg (@pkg_list) {
+ printf OUT " { \"%s\", nasm_usemac_%s },\n",
+ $pkg, $pkg;
+}
+print OUT " };\n";
+
+# Put a large value in unused slots. This makes it extremely unlikely
+# that any combination that involves unused slot will pass the range test.
+# This speeds up rejection of unrecognized tokens, i.e. identifiers.
+print OUT "#define UNUSED (65535/3)\n";
+
+print OUT " static const int16_t hash1[$n] = {\n";
+for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+0];
+ print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
+}
+print OUT " };\n";
+
+print OUT " static const int16_t hash2[$n] = {\n";
+for ($i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+1];
+ print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
+}
+print OUT " };\n";
+
+print OUT " uint32_t k1, k2;\n";
+print OUT " uint64_t crc;\n";
+# For correct overflow behavior, "ix" should be unsigned of the same
+# width as the hash arrays.
+print OUT " uint16_t ix;\n";
+print OUT "\n";
+
+printf OUT " crc = crc64i(UINT64_C(0x%08x%08x), package);\n",
+ $$sv[0], $$sv[1];
+print OUT " k1 = (uint32_t)crc;\n";
+print OUT " k2 = (uint32_t)(crc >> 32);\n";
+print OUT "\n";
+printf OUT " ix = hash1[k1 & 0x%x] + hash2[k2 & 0x%x];\n", $n-1, $n-1;
+printf OUT " if (ix >= %d)\n", scalar(@pkg_list);
+print OUT " return NULL;\n";
+print OUT "\n";
+print OUT " if (nasm_stricmp(packages[ix].package, package))\n";
+print OUT " return NULL;\n";
+print OUT "\n";
+print OUT " return packages[ix].macros;\n";
+print OUT "}\n";
+
+close(OUT);
diff --git a/macros/smartalign.mac b/macros/smartalign.mac
new file mode 100644
index 00000000..0f81ae87
--- /dev/null
+++ b/macros/smartalign.mac
@@ -0,0 +1,189 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;
+; Smart alignment macros
+;
+USE: smartalign
+
+%imacro alignmode 1-2.nolist
+ %ifidni %1,nop
+ %define __ALIGN_JMP_THRESHOLD__ 16
+
+ %define __ALIGN_16BIT_1B__ 0x90
+ %define __ALIGN_16BIT_GROUP__ 1
+
+ %define __ALIGN_32BIT_1B__ 0x90
+ %define __ALIGN_32BIT_GROUP__ 1
+
+ %define __ALIGN_64BIT_1B__ 0x90
+ %define __ALIGN_64BIT_GROUP__ 1
+ %elifidni %1,generic
+ %define __ALIGN_JMP_THRESHOLD__ 8
+
+ %define __ALIGN_16BIT_1B__ 0x90
+ %define __ALIGN_16BIT_2B__ 0x89,0xf6
+ %define __ALIGN_16BIT_3B__ 0x8d,0x74,0x00
+ %define __ALIGN_16BIT_4B__ 0x8d,0xb4,0x00,0x00
+ %define __ALIGN_16BIT_5B__ 0x8d,0xb4,0x00,0x00,0x90
+ %define __ALIGN_16BIT_6B__ 0x8d,0xb4,0x00,0x00,0x89,0xff
+ %define __ALIGN_16BIT_7B__ 0x8d,0xb4,0x00,0x00,0x8d,0x7d,0x00
+ %define __ALIGN_16BIT_8B__ 0x8d,0xb4,0x00,0x00,0x8d,0xbd,0x00,0x00
+ %define __ALIGN_16BIT_GROUP__ 8
+
+ %define __ALIGN_32BIT_1B__ 0x90
+ %define __ALIGN_32BIT_2B__ 0x89,0xf6
+ %define __ALIGN_32BIT_3B__ 0x8d,0x76,0x00
+ %define __ALIGN_32BIT_4B__ 0x8d,0x74,0x26,0x00
+ %define __ALIGN_32BIT_5B__ 0x90,0x8d,0x74,0x26,0x00
+ %define __ALIGN_32BIT_6B__ 0x8d,0xb6,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_7B__ 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_GROUP__ 7
+
+ %define __ALIGN_64BIT_1B__ 0x90
+ %define __ALIGN_64BIT_2B__ 0x66,0x90
+ %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 4
+ %elifidni %1,k8
+ %define __ALIGN_JMP_THRESHOLD__ 16
+
+ %define __ALIGN_16BIT_1B__ 0x90
+ %define __ALIGN_16BIT_2B__ 0x66,0x90
+ %define __ALIGN_16BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_16BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_16BIT_GROUP__ 4
+
+ %define __ALIGN_32BIT_1B__ 0x90
+ %define __ALIGN_32BIT_2B__ 0x66,0x90
+ %define __ALIGN_32BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_32BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_32BIT_GROUP__ 4
+
+ %define __ALIGN_64BIT_1B__ 0x90
+ %define __ALIGN_64BIT_2B__ 0x66,0x90
+ %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 4
+ %elifidni %1,k7
+ %define __ALIGN_JMP_THRESHOLD__ 16
+
+ %define __ALIGN_16BIT_1B__ 0x90
+ %define __ALIGN_16BIT_2B__ 0x66,0x90
+ %define __ALIGN_16BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_16BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 4
+
+ %define __ALIGN_32BIT_1B__ 0x90
+ %define __ALIGN_32BIT_2B__ 0x8b,0xc0
+ %define __ALIGN_32BIT_3B__ 0x8d,0x04,0x20
+ %define __ALIGN_32BIT_4B__ 0x8d,0x44,0x20,0x00
+ %define __ALIGN_32BIT_5B__ 0x8d,0x44,0x20,0x00,0x90
+ %define __ALIGN_32BIT_6B__ 0x8d,0x80,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_7B__ 0x8d,0x04,0x05,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_GROUP__ 7
+
+ %define __ALIGN_64BIT_1B__ 0x90
+ %define __ALIGN_64BIT_2B__ 0x66,0x90
+ %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
+ %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 4
+ %elifidni %1,p6
+ %define __ALIGN_JMP_THRESHOLD__ 16
+
+ %define __ALIGN_16BIT_1B__ 0x90
+ %define __ALIGN_16BIT_2B__ 0x66,0x90
+ %define __ALIGN_16BIT_3B__ 0x0f,0x1f,0x00
+ %define __ALIGN_16BIT_4B__ 0x0f,0x1f,0x40,0x00
+ %define __ALIGN_16BIT_GROUP__ 4
+
+ %define __ALIGN_32BIT_1B__ 0x90
+ %define __ALIGN_32BIT_2B__ 0x66,0x90
+ %define __ALIGN_32BIT_3B__ 0x0f,0x1f,0x00
+ %define __ALIGN_32BIT_4B__ 0x0f,0x1f,0x40,0x00
+ %define __ALIGN_32BIT_5B__ 0x0f,0x1f,0x44,0x00,0x00
+ %define __ALIGN_32BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
+ %define __ALIGN_32BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_GROUP__ 8
+
+ %define __ALIGN_64BIT_1B__ 0x90
+ %define __ALIGN_64BIT_2B__ 0x66,0x90
+ %define __ALIGN_64BIT_3B__ 0x0f,0x1f,0x00
+ %define __ALIGN_64BIT_4B__ 0x0f,0x1f,0x40,0x00
+ %define __ALIGN_64BIT_5B__ 0x0f,0x1f,0x44,0x00,0x00
+ %define __ALIGN_64BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
+ %define __ALIGN_64BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
+ %define __ALIGN_64BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
+ %define __ALIGN_64BIT_GROUP__ 8
+ %else
+ %error unknown alignment mode: %1
+ %endif
+ %ifnempty %2
+ %ifidni %2,nojmp
+ %xdefine __ALIGN_JMP_THRESHOLD__ -1
+ %else
+ %xdefine __ALIGN_JMP_THRESHOLD__ %2
+ %endif
+ %endif
+ %xdefine __ALIGNMODE__ %1,__ALIGN_JMP_THRESHOLD__
+%endmacro
+
+%unimacro align 1-2+.nolist
+%imacro align 1-2+.nolist
+ sectalign %1 ; align a segment as well
+ %ifnempty %2
+ times (((%1) - (($-$$) % (%1))) % (%1)) %2
+ %elif __PASS__ == 0 || __PASS__ == 3
+ times (((%1) - (($-$$) % (%1))) % (%1)) nop
+ %else
+ %push
+ %assign %$pad (((%1) - (($-$$) % (%1))) % (%1))
+ %if __ALIGN_JMP_THRESHOLD__ != -1 && %$pad > __ALIGN_JMP_THRESHOLD__
+ jmp %$end
+ ; We can't re-use %$pad here as $ will have changed!
+ times (((%1) - (($-$$) % (%1))) % (%1)) nop
+ %else
+ times (%$pad / __ALIGN_%[__BITS__]BIT_GROUP__) \
+ db __ALIGN_%[__BITS__]BIT_%[__ALIGN_%[__BITS__]BIT_GROUP__]B__
+ %assign %$pad %$pad % __ALIGN_%[__BITS__]BIT_GROUP__
+ %if %$pad > 0
+ db __ALIGN_%[__BITS__]BIT_%[%$pad]B__
+ %endif
+ %endif
+%$end:
+ %pop
+ %endif
+%endmacro
+
+ alignmode generic
diff --git a/macros/standard.mac b/macros/standard.mac
new file mode 100644
index 00000000..a6c50b68
--- /dev/null
+++ b/macros/standard.mac
@@ -0,0 +1,233 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2016 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+; Standard macro set for NASM -*- nasm -*-
+
+; Macros to make NASM ignore some TASM directives
+STD: tasm
+ %idefine IDEAL
+ %idefine JUMPS
+ %idefine P386
+ %idefine P486
+ %idefine P586
+ %idefine END
+
+; The normal standard macros
+STD: nasm
+
+; Note that although some user-level forms of directives are defined
+; here, not all of them are: the user-level form of a format-specific
+; directive should be defined in the module for that directive.
+
+; These three need to be defined, though the actual definitions will
+; be constantly updated during preprocessing.
+%define __FILE__
+%define __LINE__
+%define __BITS__
+
+%define __SECT__ ; it ought to be defined, even if as nothing
+
+%imacro section 1+.nolist
+ %define __SECT__ [section %1]
+ __SECT__
+%endmacro
+
+%imacro segment 1+.nolist
+ %define __SECT__ [segment %1]
+ __SECT__
+%endmacro
+
+%define __SECTALIGN_ALIGN_UPDATES_SECTION__ 1
+%imacro sectalign 1.nolist
+ %ifnum %1
+ %if __SECTALIGN_ALIGN_UPDATES_SECTION__ = 1
+ [sectalign %1]
+ %endif
+ %else
+ %ifidni %1,off
+ %define __SECTALIGN_ALIGN_UPDATES_SECTION__ 0
+ %elifidni %1,on
+ %define __SECTALIGN_ALIGN_UPDATES_SECTION__ 1
+ %endif
+ %endif
+%endmacro
+
+%imacro absolute 1+.nolist
+ %define __SECT__ [absolute %1]
+ __SECT__
+%endmacro
+
+%imacro struc 1-2.nolist 0
+ %push
+ %define %$strucname %1
+ [absolute %2]
+ %$strucname: ; allow definition of `.member' to work sanely
+%endmacro
+
+%imacro endstruc 0.nolist
+ %{$strucname}_size equ ($-%$strucname)
+ %pop
+ __SECT__
+%endmacro
+
+%imacro istruc 1.nolist
+ %push
+ %define %$strucname %1
+ %$strucstart:
+%endmacro
+
+%imacro at 1-2+.nolist
+ times (%1-%$strucname)-($-%$strucstart) db 0
+ %2
+%endmacro
+
+%imacro iend 0.nolist
+ times %{$strucname}_size-($-%$strucstart) db 0
+ %pop
+%endmacro
+
+%imacro align 1-2+.nolist nop
+ sectalign %1
+ times (((%1) - (($-$$) % (%1))) % (%1)) %2
+%endmacro
+
+%imacro alignb 1-2+.nolist
+ sectalign %1
+ %ifempty %2
+ resb (((%1) - (($-$$) % (%1))) % (%1))
+ %else
+ times (((%1) - (($-$$) % (%1))) % (%1)) %2
+ %endif
+%endmacro
+
+%imacro bits 1+.nolist
+ [bits %1]
+%endmacro
+
+%imacro use16 0.nolist
+ [bits 16]
+%endmacro
+
+%imacro use32 0.nolist
+ [bits 32]
+%endmacro
+
+%imacro use64 0.nolist
+ [bits 64]
+%endmacro
+
+%imacro extern 1-*.nolist
+ %rep %0
+ [extern %1]
+ %rotate 1
+ %endrep
+%endmacro
+
+%imacro static 1-*.nolist
+ %rep %0
+ [static %1]
+ %rotate 1
+ %endrep
+%endmacro
+
+%imacro global 1-*.nolist
+ %rep %0
+ [global %1]
+ %rotate 1
+ %endrep
+%endmacro
+
+%imacro common 1-*.nolist
+ %rep %0
+ [common %1]
+ %rotate 1
+ %endrep
+%endmacro
+
+%imacro cpu 1+.nolist
+ [cpu %1]
+%endmacro
+
+%define __FLOAT_DAZ__ nodaz
+%define __FLOAT_ROUND__ near
+; __FLOAT__ contains the whole floating-point configuration so it can
+; be saved and restored
+%define __FLOAT__ __FLOAT_DAZ__,__FLOAT_ROUND__
+
+%imacro float 1-*.nolist
+ %rep %0
+ [float %1]
+ %ifidni %1,daz
+ %define __FLOAT_DAZ__ daz
+ %elifidni %1,nodaz
+ %define __FLOAT_DAZ__ nodaz
+ %elifidni %1,near
+ %define __FLOAT_ROUND__ near
+ %elifidni %1,up
+ %define __FLOAT_ROUND__ up
+ %elifidni %1,down
+ %define __FLOAT_ROUND__ down
+ %elifidni %1,zero
+ %define __FLOAT_ROUND__ zero
+ %elifidni %1,default
+ %define __FLOAT_DAZ__ nodaz
+ %define __FLOAT_ROUND__ near
+ %endif
+ %rotate 1
+ %endrep
+%endmacro
+
+%imacro default 1+.nolist
+ [default %1]
+%endmacro
+
+%imacro userel 0.nolist
+ [default rel]
+%endmacro
+%imacro useabs 0.nolist
+ [default abs]
+%endmacro
+%imacro usebnd 0.nolist
+ [default bnd]
+%endmacro
+%imacro usenobnd 0.nolist
+ [default nobnd]
+%endmacro
+
+%imacro incbin 1-2+.nolist 0
+ %push
+ %pathsearch %$dep %1
+ %depend %$dep
+ %? %$dep,%2
+ %pop
+%endmacro
diff --git a/misc/Doxyfile b/misc/Doxyfile
new file mode 100644
index 00000000..1bb1cc3b
--- /dev/null
+++ b/misc/Doxyfile
@@ -0,0 +1,752 @@
+# Doxyfile 1.2.5
+
+# This file describes the settings to be used by doxygen for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "NASM - the Netwide Assembler"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.98
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doxy
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
+# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian,
+# Polish, Portuguese and Slovene.
+
+OUTPUT_LANGUAGE = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these class will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH =
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a class diagram (in Html and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off.
+
+CLASS_DIAGRAMS = YES
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower case letters. If set to YES upper case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# The ENABLE_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consist of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = .
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+FILE_PATTERNS = *.c *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse.
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript and frames is required (for instance Netscape 4.0+
+# or Internet explorer 4.0+).
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = YES
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using a WORD or other.
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other
+# documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented header file showing
+# the documented files that directly or indirectly include this file
+
+INCLUDED_BY_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME = search.cgi
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH = /usr/local/bin/
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
diff --git a/misc/Nindent b/misc/Nindent
new file mode 100755
index 00000000..a6c806ca
--- /dev/null
+++ b/misc/Nindent
@@ -0,0 +1,18 @@
+#!/bin/sh
+PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"
+RES=`indent --version`
+V1=`echo $RES | cut -d' ' -f3 | cut -d'.' -f1`
+V2=`echo $RES | cut -d' ' -f3 | cut -d'.' -f2`
+V3=`echo $RES | cut -d' ' -f3 | cut -d'.' -f3`
+if [ $V1 -gt 2 ]; then
+ PARAM="$PARAM -il0"
+elif [ $V1 -eq 2 ]; then
+ if [ $V2 -gt 2 ]; then
+ PARAM="$PARAM -il0";
+ elif [ $V2 -eq 2 ]; then
+ if [ $V3 -ge 10 ]; then
+ PARAM="$PARAM -il0"
+ fi
+ fi
+fi
+exec indent $PARAM "$@"
diff --git a/misc/README b/misc/README
new file mode 100644
index 00000000..f39ba4d2
--- /dev/null
+++ b/misc/README
@@ -0,0 +1,2 @@
+There are various helpful bits and pieces for NASM,
+including but not limited to Simon photograph =)
diff --git a/misc/c16.mac b/misc/c16.mac
new file mode 100644
index 00000000..50b5d5ee
--- /dev/null
+++ b/misc/c16.mac
@@ -0,0 +1,82 @@
+; NASM macro set to make interfacing to 16-bit programs easier -*- nasm -*-
+
+
+
+%imacro proc 1 ; begin a procedure definition
+
+%push proc
+
+ global %1
+
+%1: push bp
+
+ mov bp,sp
+
+%ifdef FARCODE PASCAL ; arguments may start at bp+4 or bp+6
+
+%assign %$arg 6
+
+%define %$firstarg 6
+
+%else
+
+%assign %$arg 4
+
+%define %$firstarg 4
+
+%endif
+
+%define %$procname %1
+
+%endmacro
+
+
+
+%imacro arg 0-1 2 ; used with the argument name as a label
+
+%00 equ %$arg
+
+ ; we could possibly be adding some
+
+ ; debug information at this point...?
+
+%assign %$arg %1+%$arg
+
+%endmacro
+
+
+
+%imacro endproc 0
+
+%ifnctx proc
+
+%error Mismatched `endproc'/`proc'
+
+%else
+
+ mov sp,bp
+
+ pop bp
+
+%ifdef PASCAL
+
+ retf %$arg - %$firstarg
+
+%elifdef FARCODE
+
+ retf
+
+%else
+
+ retn
+
+%endif
+
+__end_%$procname: ; useful for calculating function size
+
+%pop
+
+%endif
+
+%endmacro
+
diff --git a/misc/c32.mac b/misc/c32.mac
new file mode 100644
index 00000000..f0c116ba
--- /dev/null
+++ b/misc/c32.mac
@@ -0,0 +1,52 @@
+; NASM macro set to make interfacing to 32-bit programs easier -*- nasm -*-
+
+
+
+%imacro proc 1 ; begin a procedure definition
+
+%push proc
+
+ global %1
+
+%1: push ebp
+
+ mov ebp,esp
+
+%assign %$arg 8
+
+%define %$procname %1
+
+%endmacro
+
+
+
+%imacro arg 0-1 4 ; used with the argument name as a label
+
+%00 equ %$arg
+
+%assign %$arg %1+%$arg
+
+%endmacro
+
+
+
+%imacro endproc 0
+
+%ifnctx proc
+
+%error Mismatched `endproc'/`proc'
+
+%else
+
+ leave
+
+ ret
+
+__end_%$procname: ; useful for calculating function size
+
+%pop
+
+%endif
+
+%endmacro
+
diff --git a/misc/crcgen.c b/misc/crcgen.c
new file mode 100644
index 00000000..f11e252f
--- /dev/null
+++ b/misc/crcgen.c
@@ -0,0 +1,44 @@
+#include <inttypes.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ /* Polynomial in bit-reversed notation */
+ uint64_t poly;
+ uint64_t crctab[256], v;
+ int i, j;
+
+ poly = strtoumax(argv[1], NULL, 0);
+
+ printf("/* C */\n");
+ printf("static const uint64_t crc64_tab[256] = {\n");
+ for (i = 0; i < 256; i++) {
+ v = i;
+ for (j = 0; j < 8; j++)
+ v = (v >> 1) ^ ((v & 1) ? poly : 0);
+ crctab[i] = v;
+ }
+
+ for (i = 0; i < 256; i += 2) {
+ printf(" /* %02x */ UINT64_C(0x%016"PRIx64"), "
+ "UINT64_C(0x%016"PRIx64")%s\n",
+ i, crctab[i], crctab[i+1], (i == 254) ? "" : ",");
+ }
+ printf("};\n\n");
+
+ printf("# perl\n");
+ printf("@crc64_tab = (\n");
+ for (i = 0; i < 256; i += 2) {
+ printf(" [0x%08"PRIx32", 0x%08"PRIx32"], "
+ "[0x%08"PRIx32", 0x%08"PRIx32"]%-1s # %02x\n",
+ (uint32_t)(crctab[i] >> 32),
+ (uint32_t)(crctab[i]),
+ (uint32_t)(crctab[i+1] >> 32),
+ (uint32_t)(crctab[i+1]),
+ (i == 254) ? "" : ",",
+ i);
+ }
+ printf(");\n");
+
+ return 0;
+}
diff --git a/misc/exebin.mac b/misc/exebin.mac
new file mode 100644
index 00000000..8d1eaf8c
--- /dev/null
+++ b/misc/exebin.mac
@@ -0,0 +1,57 @@
+; -*- nasm -*-
+; NASM macro file to allow the `bin' output format to generate
+; simple .EXE files by constructing the EXE header by hand.
+; Adapted from a contribution by Yann Guidon <whygee_corp@hol.fr>
+
+%define EXE_stack_size EXE_realstacksize
+
+%macro EXE_begin 0
+ ORG 0E0h
+ section .text
+
+header_start:
+ db 4Dh,5Ah ; EXE file signature
+ dw EXE_allocsize % 512
+ dw (EXE_allocsize + 511) / 512
+ dw 0 ; relocation information: none
+ dw (header_end-header_start)/16 ; header size in paragraphs
+ dw (EXE_absssize + EXE_realstacksize) / 16 ; min extra mem
+ dw (EXE_absssize + EXE_realstacksize) / 16 ; max extra mem
+ dw -10h ; Initial SS (before fixup)
+ dw EXE_endbss + EXE_realstacksize ; Initial SP (1K DPMI+1K STACK)
+ dw 0 ; (no) Checksum
+ dw 100h ; Initial IP - start just after the header
+ dw -10h ; Initial CS (before fixup)
+ dw 0 ; file offset to relocation table: none
+ dw 0 ; (no overlay)
+ align 16,db 0
+header_end:
+
+EXE_startcode:
+ section .data
+EXE_startdata:
+ section .bss
+EXE_startbss:
+%endmacro
+
+%macro EXE_stack 1
+EXE_realstacksize equ %1
+%define EXE_stack_size EXE_bogusstacksize ; defeat EQU in EXE_end
+%endmacro
+
+%macro EXE_end 0
+ section .text
+EXE_endcode:
+ section .data
+EXE_enddata:
+ section .bss
+ alignb 4
+EXE_endbss:
+
+EXE_acodesize equ (EXE_endcode-EXE_startcode+3) & (~3)
+EXE_datasize equ EXE_enddata-EXE_startdata
+EXE_absssize equ (EXE_endbss-EXE_startbss+3) & (~3)
+EXE_allocsize equ EXE_acodesize + EXE_datasize
+
+EXE_stack_size equ 0x800 ; default if nothing else was used
+%endmacro
diff --git a/misc/exebin2.mac b/misc/exebin2.mac
new file mode 100644
index 00000000..89c68898
--- /dev/null
+++ b/misc/exebin2.mac
@@ -0,0 +1,114 @@
+; -*- nasm -*-
+
+; NASM macro file to allow the `bin' output format to generate
+
+; simple .EXE files by constructing the EXE header by hand.
+
+; Adapted from a contribution by Yann Guidon <whygee_corp@hol.fr>
+
+
+
+%define EXE_stack_size EXE_realstacksize
+
+
+
+%macro EXE_begin 0
+
+ ORG 0E0h
+
+ section .text
+
+
+
+header_start:
+
+ db 4Dh,5Ah ; EXE file signature
+
+ dw EXE_allocsize % 512
+
+ dw (EXE_allocsize + 511) / 512
+
+ dw 0 ; relocation information: none
+
+ dw (header_end-header_start)/16 ; header size in paragraphs
+
+ dw (EXE_absssize + EXE_realstacksize) / 16 ; min extra mem
+
+ dw (EXE_absssize + EXE_realstacksize) / 16 ; max extra mem
+
+ dw -10h ; Initial SS (before fixup)
+
+ dw EXE_endbss + EXE_realstacksize ; Initial SP (1K DPMI+1K STACK)
+
+ dw 0 ; (no) Checksum
+
+ dw 100h ; Initial IP - start just after the header
+
+ dw -10h ; Initial CS (before fixup)
+
+ dw 0 ; file offset to relocation table: none
+
+ dw 0 ; (no overlay)
+
+ align 16,db 0
+
+header_end:
+
+
+
+EXE_startcode:
+
+ section .data
+
+EXE_startdata:
+
+ section .bss
+
+EXE_startbss:
+
+%endmacro
+
+
+
+%macro EXE_stack 1
+
+EXE_realstacksize equ %1
+
+%define EXE_stack_size EXE_bogusstacksize ; defeat EQU in EXE_end
+
+%endmacro
+
+
+
+%macro EXE_end 0
+
+ section .text
+
+EXE_endcode:
+
+ section .data
+
+EXE_enddata:
+
+ section .bss
+
+ alignb 4
+
+EXE_endbss:
+
+
+
+EXE_acodesize equ (EXE_endcode-EXE_startcode+3) & (~3)
+
+EXE_datasize equ EXE_enddata-EXE_startdata
+
+EXE_absssize equ (EXE_endbss-EXE_startbss+3) & (~3)
+
+EXE_allocsize equ EXE_acodesize + EXE_datasize
+
+
+
+EXE_stack_size equ 0x800 ; default if nothing else was used
+
+%endmacro
+
diff --git a/misc/fmtinsns.pl b/misc/fmtinsns.pl
new file mode 100755
index 00000000..848ee2de
--- /dev/null
+++ b/misc/fmtinsns.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+#
+# Re-align the columns in insns.dat, and enforce case conventions
+#
+
+@cols = (0, 16, 48, 96);
+
+while ($line = <STDIN>) {
+ chomp $line;
+ if ($line !~ /^\s*(\;.*|)$/) {
+ ($ln = $line) =~ s/\s+$//;
+ if ($line =~ /^\s*(\S+)\s+(\S+)\s+(\S+|\[.*\])\s+(\S+)\s*$/) {
+ @fields = ($1, $2, $3, $4);
+ $fields[0] = "\U$fields[0]" unless ($fields[0] =~ /^[^a-z]+cc$/);
+ $fields[3] =~ s/\,+$//;
+ $fields[3] = "\U$fields[3]" unless ($fields[3] eq 'ignore');
+ $c = 0;
+ $line = '';
+ for ($i = 0; $i < scalar(@fields); $i++) {
+ if ($i > 0 && $c >= $cols[$i]) {
+ $line .= ' ';
+ $c++;
+ }
+ while ($c < $cols[$i]) {
+ $line .= "\t";
+ $c = ($c+8) & ~7;
+ }
+ $line .= $fields[$i];
+ for ($j = 0; $j < length($fields[$i]); $j++) {
+ if (substr($fields[$i], $j, 1) eq "\t") {
+ $c = ($c+8) & ~7;
+ } else {
+ $c++;
+ }
+ }
+ }
+ }
+ }
+ print $line, "\n";
+}
diff --git a/misc/genfma.pl b/misc/genfma.pl
new file mode 100755
index 00000000..2b6a65c5
--- /dev/null
+++ b/misc/genfma.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+%packed_insns = (
+ 'vfmadd' => 0x98,
+ 'vfmaddsub' => 0x96,
+ 'vfmsubadd' => 0x97,
+ 'vfmsub' => 0x9a,
+ 'vfnmadd' => 0x9c,
+ 'vfnmsub' => 0x9e
+ );
+
+%scalar_insns = (
+ 'vfmadd' => 0x99,
+ 'vfmsub' => 0x9b,
+ 'vfnmadd' => 0x9d,
+ 'vfnmsub' => 0x9f
+ );
+
+foreach $pi ( sort(keys(%packed_insns)) ) {
+ $op = $packed_insns{$pi};
+ foreach $order ('132', '213', '231') {
+ $xorder = substr($order,1,1).substr($order,0,1).substr($order,2,1);
+ foreach $o ($order, $xorder) {
+ for ($w = 0; $w < 2; $w++) {
+ $suf = $w ? 'pd' : 'ps';
+ for ($l = 128; $l <= 256; $l <<= 1) {
+ $sx = ($l == 256) ? 'SY' : 'SO';
+ $mm = ($l == 256) ? 'ymm' : 'xmm';
+ printf "%-15s %-31s %-8s%-39s %s\n",
+ "\U${pi}${o}${suf}",
+ "${mm}reg,${mm}reg,${mm}rm",
+ "[rvm:",
+ sprintf("vex.dds.%d.66.0f38.w%d %02x /r]",
+ $l, $w, $op),
+ "FMA,FUTURE,${sx}";
+ }
+ }
+ }
+ $op += 0x10;
+ }
+}
+
+foreach $si ( sort(keys(%scalar_insns)) ) {
+ $op = $scalar_insns{$si};
+ foreach $order ('132', '213', '231') {
+ $xorder = substr($order,1,1).substr($order,0,1).substr($order,2,1);
+ foreach $o ($order, $xorder) {
+ for ($w = 0; $w < 2; $w++) {
+ $suf = $w ? 'sd' : 'ss';
+ $sx = $w ? 'SQ' : 'SD';
+ $l = 128;
+ $mm = 'xmm';
+ printf "%-15s %-31s %-8s%-39s %s\n",
+ "\U${si}${o}${suf}",
+ "${mm}reg,${mm}reg,${mm}rm",
+ '[rvm:',
+ sprintf("vex.dds.%d.66.0f38.w%d %02x /r]",
+ $l, $w, $op),
+ "FMA,FUTURE,${sx}";
+ }
+ }
+ $op += 0x10;
+ }
+}
diff --git a/misc/hints.txt b/misc/hints.txt
new file mode 100644
index 00000000..576e1cf3
--- /dev/null
+++ b/misc/hints.txt
@@ -0,0 +1,26 @@
+Subject: Re: [nasm-devel] P4 insns
+Date: Sat, 05 May 2001 11:39:36 -0500
+From: Kyle Markley <kmarkley@seffera.net>
+Reply-To: nasm-devel@yahoogroups.com
+To: nasm-devel@yahoogroups.com
+
+berkus wrote:
+>
+> Use The Source, NASM!
+>
+> Do we have the P4 'probable branch taken' (3e) and 'probable branch
+> not taken' (2e) prefixes opcodes?
+
+They're just segment override prefixes: 2e is CS, 3e is DS. You can just
+say
+"cs jnz foo" for a not-taken hint, "ds jnz foo" for a taken hint.
+
+Maybe it would be nice to have a more suggestive name, but you could just
+%define one.
+
+---
+Kyle Markley
+
+
+
+Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
diff --git a/misc/magic b/misc/magic
new file mode 100644
index 00000000..0172f4a0
--- /dev/null
+++ b/misc/magic
@@ -0,0 +1,6 @@
+# Put the following lines in your /etc/magic file to get 'file' to recognise
+# RDOFF Object Files
+
+0 string RDOFF RDOFF Object File
+>5 byte >32 version %c (little endian)
+>5 byte <32 version %d (big endian)
diff --git a/misc/myC32.mac b/misc/myC32.mac
new file mode 100644
index 00000000..e70fc82b
--- /dev/null
+++ b/misc/myC32.mac
@@ -0,0 +1,121 @@
+; NASM macro set to make interfacing to 32-bit programs easier
+; Also cool little macros to make NASM emulate some MASM things.
+;
+; Originally included in NASM. Modifications by Peter Johnson, 1999.
+;
+
+%imacro proc 1 ; begin a procedure definition
+%push proc
+ global %1
+%1: push ebp
+ mov ebp, esp
+%assign %$arg 8
+;%assign %$argnum 0
+%define %$procname %1
+%endmacro
+
+%imacro arg 0-1 4 ; used with the argument name as a label
+%00 equ %$arg
+;%assign %$argnum %$argnum+1
+;.arg%$argnum equ %1
+%assign %$arg %1+%$arg
+%endmacro
+
+%imacro endproc 0
+%ifnctx proc
+%error Mismatched `endproc'/`proc'
+%else
+; mov esp, ebp
+; pop ebp
+%ifdef LEGACY_ENDPROC
+ ret
+%endif
+;__end_%$procname: ; useful for calculating function size
+; global %{$procname}_arglen
+;%{$procname}_arglen equ %$arg-8
+;%assign %$i 1
+;%rep %$argnum
+; global %{$procname}_arg%$i
+;%{$procname}_arg%$i equ %{$procname}.arg%$i
+;%assign %$i %$i+1
+;%endrep
+%pop
+%endif
+%endmacro
+
+; redefine ret instructions for in-proc cases
+%imacro ret 0-1
+%ifnctx proc
+ ret %1
+%else
+ mov esp, ebp
+ pop ebp
+ ret %1
+%endif
+%endmacro
+
+%imacro retf 0-1
+%ifnctx proc
+ retf %1
+%else
+ mov esp, ebp
+ pop ebp
+ retf %1
+%endif
+%endmacro
+
+%imacro retn 0-1
+%ifnctx proc
+ retn %1
+%else
+ mov esp, ebp
+ pop ebp
+ retn %1
+%endif
+%endmacro
+
+; invoke calls a C function
+; defaults to word (16 bit) size parameters
+%macro invoke 1-*
+%rotate -1
+;%define invoketype word
+%rep (%0-1)
+; %ifidni %1,dword
+; %define invoketype dword
+; %elifidni %1,word
+; %define invoketype word
+; %elifidni %1,byte
+; %define invoketype byte
+; %else
+ %ifidni %1, cs
+ o16 push %1
+ %elifidni %1, ds
+ o16 push %1
+ %elifidni %1, es
+ o16 push %1
+ %elifidni %1, fs
+ o16 push %1
+ %elifidni %1, gs
+ o16 push %1
+ %elifidni %1, word cs
+ o16 push %1
+ %elifidni %1, word ds
+ o16 push %1
+ %elifidni %1, word es
+ o16 push %1
+ %elifidni %1, word fs
+ o16 push %1
+ %elifidni %1, word gs
+ o16 push %1
+ %else
+ push %1
+ %endif
+; %endif
+ %rotate -1
+%endrep
+call %1
+%if (%0!=1)
+ add esp, byte %{1}_arglen
+%endif
+%endmacro
+
diff --git a/misc/nasm.sl b/misc/nasm.sl
new file mode 100644
index 00000000..2ddb5c13
--- /dev/null
+++ b/misc/nasm.sl
@@ -0,0 +1,320 @@
+% This file defines a NASM editor mode for the JED editor.
+% JED's home page is http://space.mit.edu/~davis/jed.html.
+%
+% To install, copy this file into your JED_LIBRARY directory
+% (/usr/local/jed/lib or C:\JED\LIB or whatever), then add the
+% following lines to your .jedrc or jed.rc file:
+% autoload("nasm_mode", "nasm");
+% add_mode_for_extension("nasm", "asm");
+% (you can of course replace "asm" with whatever file extension
+% you like to use for your NASM source files).
+
+variable Nasm_Instruction_Indent = 10;
+variable Nasm_Comment_Column = 33;
+variable Nasm_Comment_Space = 1;
+
+variable nasm_kw_2 = strcat("ahalaxbhblbpbtbxchclcscxdbdddhdidldqdsdtdwdxes",
+ "fsgsinjajbjcjejgjljojpjsjzorsispssto");
+variable nasm_kw_3 = strncat("a16a32aaaaadaamaasadcaddandbsfbsrbtcbtrbtscbw",
+ "cdqclccldclicmccmpcr0cr2cr3cr4cwddaadasdecdiv",
+ "dr0dr1dr2dr3dr6dr7eaxebpebxecxediedxequesiesp",
+ "farfldfsthltincintjaejbejgejlejmpjnajnbjncjne",
+ "jngjnljnojnpjnsjnzjpejpolarldslealeslfslgslsl",
+ "lssltrmm0mm1mm2mm3mm4mm5mm6mm7movmulnegnopnot",
+ "o16o32outpopporrclrcrrepretrolrorrsmsalsarsbb",
+ "segshlshrsmist0st1st2st3st4st5st6st7stcstdsti",
+ "strsubtr3tr4tr5tr6tr7wrtxor", 9);
+variable nasm_kw_4 = strncat("arplbytecallcltscwdeemmsfabsfaddfbldfchsfcom",
+ "fcosfdivfenifildfistfld1fldzfmulfnopfsinfstp",
+ "fsubftstfxamfxchibtsidivimulinsbinsdinswint1",
+ "int3intoinvdiretjcxzjnaejnbejngejnlelahflgdt",
+ "lidtlldtlmswlocklongloopmovdmovqnearpandpopa",
+ "popfpushpxorreperepzresbresdresqrestreswretf",
+ "retnsahfsalcsetasetbsetcsetesetgsetlsetosetp",
+ "setssetzsgdtshldshrdsidtsldtsmswtestumovverr",
+ "verwwaitwordxaddxbtsxchg", 9);
+variable nasm_kw_5 = strncat("boundbswapcmovacmovbcmovccmovecmovgcmovlcmovo",
+ "cmovpcmovscmovzcmpsbcmpsdcmpswcpuiddwordenter",
+ "f2xm1faddpfbstpfclexfcomifcompfdisifdivpfdivr",
+ "ffreefiaddficomfidivfimulfinitfistpfisubfldcw",
+ "fldpifmulpfpremfptanfsavefsqrtfstcwfstswfsubp",
+ "fsubrfucomfyl2xicebpint01iretdiretwjecxzleave",
+ "lodsblodsdlodswloopeloopzmovsbmovsdmovswmovsx",
+ "movzxoutsboutsdoutswpaddbpadddpaddwpandnpopad",
+ "popawpopfdpopfwpslldpsllqpsllwpsradpsrawpsrld",
+ "psrlqpsrlwpsubbpsubdpsubwpushapushfqwordrdmsr",
+ "rdpmcrdtscrepnerepnzscasbscasdscaswsetaesetbe",
+ "setgesetlesetnasetnbsetncsetnesetngsetnlsetno",
+ "setnpsetnssetnzsetpesetposhortstosbstosdstosw",
+ "timestwordwrmsrxlatb", 14);
+variable nasm_kw_6 = strncat("cmovaecmovbecmovgecmovlecmovnacmovnbcmovnc",
+ "cmovnecmovngcmovnlcmovnocmovnpcmovnscmovnz",
+ "cmovpecmovpofcmovbfcmovefcmovufcomipfcompp",
+ "fdivrpficompfidivrfisubrfldenvfldl2efldl2t",
+ "fldlg2fldln2fpatanfprem1frstorfscalefsetpm",
+ "fstenvfsubrpfucomifucompincbininvlpgloopne",
+ "loopnzpaddsbpaddswpmulhwpmullwpsubsbpsubsw",
+ "pushadpushawpushfdpushfwsetnaesetnbesetnge",
+ "setnlewbinvd", 9);
+variable nasm_kw_7 = strncat("cmovnaecmovnbecmovngecmovnlecmpxchgfcmovbe",
+ "fcmovnbfcmovnefcmovnufdecstpfincstpfrndint",
+ "fsincosfucomipfucomppfxtractfyl2xp1loadall",
+ "paddusbpadduswpcmpeqbpcmpeqdpcmpeqwpcmpgtb",
+ "pcmpgtdpcmpgtwpmaddwdpsubusbpsubusw", 5);
+variable nasm_kw_8 = "fcmovnbepackssdwpacksswbpackuswb";
+variable nasm_kw_9 = strcat("cmpxchg8bpunpckhbwpunpckhdqpunpckhwdpunpcklbw",
+ "punpckldqpunpcklwd");
+variable nasm_kw_10 = "cmpxchg486loadall286";
+
+define nasm_indent_line() {
+ variable word, len, e, c;
+
+ e = eolp();
+
+ push_spot();
+ EXIT_BLOCK {
+ pop_spot();
+ if (what_column() <= Nasm_Instruction_Indent)
+ skip_white();
+ }
+
+ bol_skip_white();
+ c = what_column();
+
+ if (orelse
+ {looking_at_char(';')}
+ {looking_at_char('#')}
+ {looking_at_char('[')}) {
+ bol_trim();
+ pop_spot();
+ EXIT_BLOCK {
+ }
+ return;
+ }
+
+ if (looking_at_char('%')) {
+ go_right_1();
+ !if (orelse
+ {looking_at_char('$')}
+ {looking_at_char('%')}
+ {looking_at_char('+')}
+ {looking_at_char('-')}
+ {looking_at_char('0')}
+ {looking_at_char('1')}
+ {looking_at_char('2')}
+ {looking_at_char('3')}
+ {looking_at_char('4')}
+ {looking_at_char('5')}
+ {looking_at_char('6')}
+ {looking_at_char('7')}
+ {looking_at_char('8')}
+ {looking_at_char('9')}) {
+ bol_trim();
+ pop_spot();
+ EXIT_BLOCK {
+ }
+ return;
+ }
+ go_left_1();
+ }
+
+ push_mark();
+ skip_chars("%$+-");
+ skip_chars("0-9a-zA-Z_.");
+ word = bufsubstr();
+
+ if (orelse
+ {c == 1}
+ {looking_at_char(':')}) {
+ push_spot();
+ bol_trim();
+ pop_spot();
+ len = strlen(word);
+ if (looking_at_char(':')) {
+ go_right_1();
+ len++;
+ }
+ trim();
+ if (e or not(eolp())) {
+ if (len >= Nasm_Instruction_Indent) {
+ pop();
+ whitespace(1);
+ } else
+ whitespace(Nasm_Instruction_Indent - len);
+ if (e) {
+ pop_spot();
+ eol();
+ push_spot();
+ }
+ }
+ } else {
+ bol_trim();
+ whitespace(Nasm_Instruction_Indent);
+ }
+}
+
+define nasm_newline_indent() {
+ push_spot();
+ bol_skip_white();
+ if (eolp())
+ trim();
+ pop_spot();
+ newline();
+ nasm_indent_line();
+}
+
+define nasm_bol_self_ins() {
+ push_spot();
+ bskip_white();
+ bolp();
+ pop_spot();
+
+ call("self_insert_cmd");
+
+ % Grotty: force immediate update of the syntax highlighting.
+ insert_char('.');
+ deln(left(1));
+
+ if (())
+ nasm_indent_line();
+}
+
+define nasm_self_ins_ind() {
+ call("self_insert_cmd");
+
+ % Grotty: force immediate update of the syntax highlighting.
+ insert_char('.');
+ deln(left(1));
+
+ nasm_indent_line();
+}
+
+define nasm_insert_comment() {
+ variable spc;
+
+ bol_skip_white();
+ if (looking_at_char(';')) {
+ bol_trim();
+ go_right(1);
+ skip_white();
+ return;
+ } else if (eolp()) {
+ bol_trim();
+ insert("; ");
+ return;
+ }
+
+ forever {
+ skip_chars("^;\n'\"");
+ if (looking_at_char('\'')) {
+ go_right_1();
+ skip_chars("^'\n");
+ !if (eolp())
+ go_right_1();
+ } else if (looking_at_char('\"')) {
+ go_right_1();
+ skip_chars("^\"\n");
+ !if (eolp())
+ go_right_1();
+ } else if (looking_at_char(';')) {
+ !if (bolp()) {
+ go_left_1();
+ trim();
+ !if (looking_at_char(';'))
+ go_right_1();
+ }
+ break;
+ } else {
+ break;
+ }
+ }
+ spc = Nasm_Comment_Column - what_column();
+ if (spc < Nasm_Comment_Space)
+ spc = Nasm_Comment_Space;
+ whitespace(spc);
+ if (eolp()) {
+ insert("; ");
+ } else {
+ go_right_1();
+ skip_white();
+ }
+}
+
+$1 = "NASM";
+create_syntax_table($1);
+
+define_syntax (";", "", '%', $1);
+define_syntax ("([", ")]", '(', $1);
+define_syntax ('"', '"', $1);
+define_syntax ('\'', '\'', $1);
+define_syntax ("0-9a-zA-Z_.@#", 'w', $1);
+define_syntax ("-+0-9a-fA-F.xXL", '0', $1);
+define_syntax (",:", ',', $1);
+define_syntax ('%', '#', $1);
+define_syntax ("|^&<>+-*/%~", '+', $1);
+
+set_syntax_flags($1,1);
+
+#ifdef HAS_DFA_SYNTAX
+
+dfa_enable_highlight_cache("nasm.dfa", $1);
+dfa_define_highlight_rule(";.*$", "comment", $1);
+dfa_define_highlight_rule("[A-Za-z_\\.\\?][A-Za-z0-9_\\.\\?\\$#@~]*",
+ "Knormal", $1);
+dfa_define_highlight_rule("$([A-Za-z_\\.\\?][A-Za-z0-9_\\.\\?\\$#@~]*)?",
+ "normal", $1);
+dfa_define_highlight_rule("[0-9]+(\\.[0-9]*)?([Ee][\\+\\-]?[0-9]*)?",
+ "number", $1);
+dfa_define_highlight_rule("[0-9]+[QqBb]", "number", $1);
+dfa_define_highlight_rule("(0x|\\$[0-9A-Fa-f])[0-9A-Fa-f]*", "number", $1);
+dfa_define_highlight_rule("[0-9A-Fa-f]+[Hh]", "number", $1);
+dfa_define_highlight_rule("\"[^\"]*\"", "string", $1);
+dfa_define_highlight_rule("\"[^\"]*$", "string", $1);
+dfa_define_highlight_rule("'[^']*'", "string", $1);
+dfa_define_highlight_rule("'[^']*$", "string", $1);
+dfa_define_highlight_rule("[\\(\\)\\[\\],:]*", "delimiter", $1);
+dfa_define_highlight_rule("^[ \t]*#", "PQpreprocess", $1);
+dfa_define_highlight_rule("^[ \t]*\\%{?[^%\\$\\+\\-0-9]", "PQpreprocess", $1);
+dfa_define_highlight_rule("^%$", "preprocess", $1);
+dfa_define_highlight_rule("[\\|\\^&<>\\+\\-\\*/%~]*", "operator", $1);
+dfa_define_highlight_rule("%([%\\$]?-?[0-9A-Za-z_\\.\\?\\$~@]+|{[^}]*}?)",
+ "preprocess", $1);
+dfa_define_highlight_rule("[ \t]*", "normal", $1);
+dfa_define_highlight_rule(".", "normal", $1);
+dfa_build_highlight_table($1);
+#endif
+
+define_keywords_n($1, nasm_kw_2, 2, 0);
+define_keywords_n($1, nasm_kw_3, 3, 0);
+define_keywords_n($1, nasm_kw_4, 4, 0);
+define_keywords_n($1, nasm_kw_5, 5, 0);
+define_keywords_n($1, nasm_kw_6, 6, 0);
+define_keywords_n($1, nasm_kw_7, 7, 0);
+define_keywords_n($1, nasm_kw_8, 8, 0);
+define_keywords_n($1, nasm_kw_9, 9, 0);
+define_keywords_n($1, nasm_kw_10, 10, 0);
+
+define_keywords_n($1, "org", 3, 1);
+define_keywords_n($1, "bitsiend", 4, 1);
+define_keywords_n($1, "aligngroupstruc", 5, 1);
+define_keywords_n($1, "alignbcommonexternglobalistruc", 6, 1);
+define_keywords_n($1, "sectionsegmentlibrary", 7, 1);
+define_keywords_n($1, "absoluteendstruc", 8, 1);
+define_keywords_n($1, "uppercase", 9, 1);
+
+!if (keymap_p ($1)) make_keymap ($1);
+definekey("nasm_bol_self_ins", ";", $1);
+definekey("nasm_bol_self_ins", "#", $1);
+definekey("nasm_bol_self_ins", "%", $1);
+definekey("nasm_bol_self_ins", "[", $1);
+definekey("nasm_self_ins_ind", ":", $1);
+definekey("nasm_insert_comment", "^[;", $1);
+
+define nasm_mode() {
+ set_mode("NASM", 4);
+ use_keymap ("NASM");
+ use_syntax_table ("NASM");
+ set_buffer_hook ("indent_hook", "nasm_indent_line");
+ set_buffer_hook ("newline_indent_hook", "nasm_newline_indent");
+ runhooks("nasm_mode_hook");
+}
diff --git a/misc/nasmstab b/misc/nasmstab
new file mode 100644
index 00000000..32ef67e0
--- /dev/null
+++ b/misc/nasmstab
@@ -0,0 +1,296 @@
+#!/usr/bin/perl
+
+sub StabLine ($ $ $ $ $ $) {
+ local ($comment,$n_strx,$type,$other,$desc,$value) = @_;
+ print $comment;
+ print "","dd",$n_strx;
+ print "","db",$type;
+ print "","db",$other;
+ print "","dw",$desc;
+ print "","dd","0" . $value . "h";
+}
+
+sub RStabLine ($ $ $ $ $) {
+ local ($comment,$offset,$info,$type,$symbol) = @_;
+ print $comment;
+ print "","dd",$offset;
+ print "","db",$type;
+ print "","db",$symbol;
+ print "","dw",$info;
+}
+
+#this sub exists because i've no idea how to print non-ascii numbers in perl
+
+sub OutBin ( $ $ ) {
+ local ($offset, $shnum) = @_;
+ seek(FINAL,$offset,0);
+ if ( $shnum == 2 ) { printf FINAL "\x02" } ;
+ if ( $shnum == 3 ) { printf FINAL "\x03" } ;
+ if ( $shnum == 4 ) { printf FINAL "\x04" } ;
+ if ( $shnum == 5 ) { printf FINAL "\x05" } ;
+ if ( $shnum == 6 ) { printf FINAL "\x06" } ;
+ if ( $shnum == 7 ) { printf FINAL "\x07" } ;
+ if ( $shnum == 8 ) { printf FINAL "\x08" } ;
+ if ( $shnum == 9 ) { printf FINAL "\x09" } ;
+ if ( $shnum == 10 ) { printf FINAL "\x0a" } ;
+ if ( $shnum == 11 ) { printf FINAL "\x0b" } ;
+ if ( $shnum == 12 ) { printf FINAL "\x0c" } ;
+ if ( $shnum == 13 ) { printf FINAL "\x0d" } ;
+ if ( $shnum == 14 ) { printf FINAL "\x0e" } ;
+ if ( $shnum == 15 ) { printf FINAL "\x0f" } ;
+}
+
+sub DispHelp () {
+ $\="\n";
+ print "Usage:";
+ print "\t-f,--input-file";
+ print "\t\tThe input file name (only required option)";
+ print "\t-o,--output-file";
+ print "\t\tThe output file name (if not specified, *.asm becomes *.o";
+ print "\t\tand anything else becomes a.out)";
+ print "\t-l,--list-file";
+ print "\t\tThe listing file's name (default: trailing .asm is
+removed";
+ print "\t\tif there and .lst is appended)";
+ print "\t-s,--second-asm-file";
+ print "\t\tThe second asm file's name (default: trailing .asm is";
+ print "\t\tremoved if there and .nasm is appended)";
+ print "\n";
+ exit ;
+}
+
+if ( $ARGV[0] eq "" ) { $ARGV[0] = "-h" };
+
+$i = 0;
+$filename = "";
+$outname = "";
+
+while ( $ARGV[$i] ne "" ) {
+ $_ = $ARGV[$i];
+ if ( m/^-/ ) {
+ if ( m/^-f$/ ) { $filename = $ARGV[++$i] };
+ if ( m/^-o$/ ) { $outname = $ARGV[++$i] };
+ if ( m/^-l$/ ) { $listname = $ARGV[++$i] };
+ if ( m/^-s$/ ) { $asmname = $ARGV[++$i] };
+ if ( m/^-h$/ ) { DispHelp };
+ } elsif ( m/^--\w+/ ) {
+ if ( m/^--input-file$/ ) { $filename = $ARGV[++$i] };
+ if ( m/^--output-file$/ ) { $outname = $ARGV[++$i] };
+ if ( m/^--list-file$/ ) { $listname = $ARGV[++$i] };
+ if ( m/^--second-asm-file$/ ) { $asmname = $ARGV[++$i] };
+ if ( m/^--help/ ) { DispHelp };
+ } elsif ( m/^--$/ ) {
+ while ( $ARGV[++$i] ) {
+ $NasmOptions .= " ";
+ $NasmOptions .= $_;
+ };
+ } else {
+ DispHelp()
+ };
+ $i++;
+};
+
+if ( $filename eq "" ) { DispHelp() };
+
+if ( $outname eq "" ) {
+ $outname = $filename;
+ $outname =~ s/\.asm/.o/;
+ if ( $outname eq $filename ) { $outname = "a.out" };
+};
+
+if ( $listname eq "" ) {
+ $listname = $filename;
+ $listname =~ s/\.asm//;
+ $listname .= ".lst";
+};
+
+if ( $asmname eq "" ) {
+ $asmname = $filename;
+ $asmname =~ s/\.asm//;
+ $asmname .= ".nasm";
+};
+
+$err = `nasm -f elf ${filename} -l ${listname} -o ${outname} `;
+
+if ( $err ) { die "\n$err\n"};
+
+open(LISTFILE,"${listname}") or die "\n $0: Could not reopen list file!\n";
+open(ASMFILE,">${asmname}") or die "\n $0: Could not open asm file!\n";
+
+select ASMFILE;
+
+open(OLDASM,$filename) or die "\n$0: Cannot open file $filename\n";
+
+while ( $x = <OLDASM> ) {
+ print $x;
+}
+
+@stab = ("n_desc", "value");
+@rel_stab = ("offset");
+$i = 0;
+$current_section = "";
+$has_text = 'FALSE';
+$midst_of_macro = 'FALSE';
+$line_dec = 0 ;
+
+while ( $x = <LISTFILE> ) {
+ if ( $x =~ m/[^;]*%include/ ) {
+ $x = <LISTFILE>;
+ while ( $x =~ m/\s+\d+\s+\<\d+\>\s+/ ) {
+ $x = <LISTFILE>;
+ $line_dec++;
+ }
+ }
+ if ( $current_section eq ".text" ) {
+ if ( $x =~ m/^\s+(\S+)\s+(\S+)\s+(\S+)\s+[^<]+$/ ) {
+ $stab[$i++] = $1-$line_dec; #linenum
+ $stab[$i++] = $2; #offset
+ $count++;
+ if ( $3 =~ m/-/ ) {
+ $x = <LISTFILE>;
+ $line_dec++;
+ }
+ $midst_of_macro = 'FALSE';
+ } elsif ( $x =~ m/^\s+(\S+)\s+(\S+)\s+(\S+)\s+<\d+>/ ) {
+ if ( $midst_of_macro eq 'TRUE' ) {
+ $stab[$i] = $stab[$i-2]; #same linenum
+ $line_dec++;
+ } else {
+ $stab[$i] = $1 - ++$line_dec;
+ $midst_of_macro = 'TRUE';
+ }
+ $count++;
+ $i++;
+ $stab[$i++] = $2;
+ if ( $3 =~ m/-/ ) {
+ $x = <LISTFILE>;
+ $line_dec++;
+ }
+
+ }
+ $has_text = 'TRUE';
+ } elsif ( $x =~ m/\s+\S+\s+\S+\s+\S+\s+<\d+>/ ) { # is it a macro?
+ $line_dec++;
+ }
+ if ( $x =~ s/(section|segment)\s+([^\s]+)/$2/ ) {
+ $current_section = $2;
+ }
+};
+
+close LISTFILE;
+
+unless ( $has_text eq "TRUE" ) {
+ $err = `nasm -f elf ${asmname} -o ${outname}`;
+ print STDERR $err;
+ exit;
+}
+
+#Write Stab section
+$, = "\t"; #output field separator
+$\ = "\n"; #output record separator
+
+print "section .stab noalloc";
+StabLine(";header",1,0,0,$count+1,length($filename)*2+3);
+StabLine(";so",length($asmname)+2,"064h",0,0,0);
+
+$offset = 12;
+$i = 0;
+$j = 0;
+$rel_stab[$j++] = $offset + 8;
+
+while ( $stab[$i] ) {
+ StabLine(";N_SLINE" . " " . ( ($i+2) / 2 ), 0, "044h", 0,
+ $stab[$i++], $stab[$i++]);
+ $offset += 12;
+ $rel_stab[$j++] = $offset + 8;
+}
+
+#Write .rel.stab section
+print "\n\nsection .rel.stab noalloc";
+
+open (READELF,"readelf -s ${outname} |") or die "\n$0: Could not run readelf\n";
+
+while ( $x = <READELF> ) {
+ if ( $x =~ m/\s+(\d+):\s+00000000\s+\d+\s+SECTION\s+\w+\s+\w+\s+1\s+/){ $textsymnum = $1;
+ };
+};
+close READELF;
+
+$i = 0;
+
+while ( $rel_stab[$i] ne "" ) {
+ RStabLine(";relocation for N_SLINE " . ($i), $rel_stab[$i], 0, 1, $textsymnum);
+ $i++;
+} ;
+
+#Write .stabstr section
+
+print "\n\nsection .stabstr noalloc";
+
+print "","db","0";
+print "","db",'"' . $asmname . '"';
+print "","db","0";
+print "","db",'"' . $asmname . '"' ;
+print "","db","0";
+
+close ASMFILE;
+
+$err = `nasm -f elf ${asmname} -o ${outname}`;
+
+if ( $err ) { die "\n$err\n" } ;
+
+open (READELF,"readelf -h -S ${outname} |") or die "\n$0: Could not run readelf\n";
+
+
+while ( $x = <READELF> ) {
+ if ( $x =~ m/Start\s+of\s+section\s+headers:\s+(\d+)\s+/ ) {
+ $shoff = $1;
+ }
+ if ( $x =~ m/Size\s+of\s+section\s+headers:\s+(\d+)\s+/ ) {
+ $shentsize = $1;
+ }
+ if ( $x =~ m/\[\s*(\d+)\]\s+.rel.stab\s+/ ) {
+ $relnum = $1;
+ }
+ if ( $x =~ m/\[\s*(\d+)\]\s+.stab\s+/ ) {
+ $stabnum = $1;
+ }
+ if ( $x =~ m/\[\s*(\d+)\]\s+.stabstr\s+/ ) {
+ $stabstrnum = $1;
+ }
+ if ( $x =~ m/\[\s*(\d+)\]\s+.symtab\s+/ ) {
+ $symtabnum = $1;
+ }
+}
+close READELF;
+
+sysopen (FINAL,"${outname}",2,0) or die "\n$0: Could not open ${outname}";
+$, = ""; #output field separator
+$\ = ""; #output record separator
+
+#set .rel.stab->type to rel
+OutBin($shoff + ($shentsize * $relnum) + 4,9);
+
+#set .rel.stab->link to .symtab
+OutBin($shoff + ($shentsize * $relnum) + 24,$symtabnum);
+
+#set .rel.stab->info to .stab
+OutBin($shoff + ($shentsize * $relnum) + 28,$stabnum);
+
+#set .rel.stab->entsize to 8
+OutBin($shoff + ($shentsize * $relnum) + 36,8);
+
+#set .stab->link to .stabstr
+OutBin($shoff + ($shentsize * $stabnum) + 24,$stabstrnum);
+
+#set .stab->entsize to 12
+OutBin($shoff + ($shentsize * $stabnum) + 36,12);
+
+#set .stabstr->type to strtab
+OutBin($shoff + ($shentsize * $stabstrnum) + 4,3);
+
+close FINAL;
+
+#Date: 17 Mar 2002 15:51:20 -0800
+#From: kitsred@hotmail.com (kired)
+#Newsgroups: alt.lang.asm
diff --git a/misc/omfdump.c b/misc/omfdump.c
new file mode 100644
index 00000000..b990b68e
--- /dev/null
+++ b/misc/omfdump.c
@@ -0,0 +1,517 @@
+/*
+ * omfdump.c
+ *
+ * Very simple program to dump the contents of an OMF (OBJ) file
+ *
+ * This assumes a littleendian, unaligned-load-capable host and a
+ * C compiler which handles basic C99.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+const char *progname;
+
+static const char *record_types[256] =
+{
+ [0x80] = "THEADR",
+ [0x82] = "LHEADR",
+ [0x88] = "COMENT",
+ [0x8a] = "MODEND16",
+ [0x8b] = "MODEND32",
+ [0x8c] = "EXTDEF",
+ [0x90] = "PUBDEF16",
+ [0x91] = "PUBDEF32",
+ [0x94] = "LINNUM16",
+ [0x95] = "LINNUM32",
+ [0x96] = "LNAMES",
+ [0x98] = "SEGDEF16",
+ [0x99] = "SEGDEF32",
+ [0x9a] = "GRPDEF",
+ [0x9c] = "FIXUPP16",
+ [0x9d] = "FIXUPP32",
+ [0xa0] = "LEDATA16",
+ [0xa1] = "LEDATA32",
+ [0xa2] = "LIDATA16",
+ [0xa3] = "LIDATA32",
+ [0xb0] = "COMDEF",
+ [0xb2] = "BAKPAT16",
+ [0xb3] = "BAKPAT32",
+ [0xb4] = "LEXTDEF",
+ [0xb6] = "LPUBDEF16",
+ [0xb7] = "LPUBDEF32",
+ [0xb8] = "LCOMDEF",
+ [0xbc] = "CEXTDEF",
+ [0xc2] = "COMDAT16",
+ [0xc3] = "COMDAT32",
+ [0xc4] = "LINSYM16",
+ [0xc5] = "LINSYM32",
+ [0xc6] = "ALIAS",
+ [0xc8] = "NBKPAT16",
+ [0xc9] = "NBKPAT32",
+ [0xca] = "LLNAMES",
+ [0xcc] = "VERNUM",
+ [0xce] = "VENDEXT",
+ [0xf0] = "LIBHDR",
+ [0xf1] = "LIBEND",
+};
+
+typedef void (*dump_func)(uint8_t, const uint8_t *, size_t);
+
+/* Ordered collection type */
+struct collection {
+ size_t n; /* Elements in collection (not including 0) */
+ size_t s; /* Elements allocated (not including 0) */
+ const void **p; /* Element pointers */
+};
+
+struct collection c_names, c_lsegs, c_groups, c_extsym;
+
+static void nomem(void)
+{
+ fprintf(stderr, "%s: memory allocation error\n", progname);
+ exit(1);
+}
+
+#define INIT_SIZE 64
+static void add_collection(struct collection *c, const void *p)
+{
+ if (c->n >= c->s) {
+ size_t cs = c->s ? (c->s << 1) : INIT_SIZE;
+ const void **cp = realloc(c->p, cs*sizeof(const void *));
+
+ if (!cp)
+ nomem();
+
+ c->p = cp;
+ c->s = cs;
+
+ memset(cp + c->n, 0, (cs - c->n)*sizeof(const void *));
+ }
+
+ c->p[++c->n] = p;
+}
+
+static const void *get_collection(struct collection *c, size_t index)
+{
+ if (index >= c->n)
+ return NULL;
+
+ return c->p[index];
+}
+
+static void hexdump_data(unsigned int offset, const uint8_t *data,
+ size_t n, size_t field)
+{
+ unsigned int i, j;
+
+ for (i = 0; i < n; i += 16) {
+ printf(" %04x: ", i+offset);
+ for (j = 0; j < 16; j++) {
+ char sep = (j == 7) ? '-' : ' ';
+ if (i+j < field)
+ printf("%02x%c", data[i+j], sep);
+ else if (i+j < n)
+ printf("xx%c", sep); /* Beyond end of... */
+ else
+ printf(" "); /* No separator */
+ }
+ printf(" : ");
+ for (j = 0; j < 16; j++) {
+ if (i+j < n)
+ putchar((i+j >= field) ? 'x' :
+ isprint(data[i+j]) ? data[i+j] : '.');
+ }
+ putchar('\n');
+ }
+}
+
+static void dump_unknown(uint8_t type, const uint8_t *data, size_t n)
+{
+ (void)type;
+ hexdump_data(0, data, n, n);
+}
+
+static void print_dostime(const uint8_t *p)
+{
+ uint16_t da = (p[3] << 8) + p[2];
+ uint16_t ti = (p[1] << 8) + p[0];
+
+ printf("%04u-%02u-%02u %02u:%02u:%02u",
+ (da >> 9) + 1980, (da >> 5) & 15, da & 31,
+ (ti >> 11), (ti >> 5) & 63, (ti << 1) & 63);
+}
+
+static void dump_coment_depfile(uint8_t type, const uint8_t *data, size_t n)
+{
+ if (n > 4 && data[4] == n-5) {
+ printf(" # ");
+ print_dostime(data);
+ printf(" %.*s\n", n-5, data+5);
+ }
+
+ hexdump_data(2, data, n, n);
+}
+
+static const dump_func dump_coment_class[256] = {
+ [0xe9] = dump_coment_depfile
+};
+
+static void dump_coment(uint8_t type, const uint8_t *data, size_t n)
+{
+ uint8_t class;
+ static const char *coment_class[256] = {
+ [0x00] = "Translator",
+ [0x01] = "Copyright",
+ [0x81] = "Library specifier",
+ [0x9c] = "MS-DOS version",
+ [0x9d] = "Memory model",
+ [0x9e] = "DOSSEG",
+ [0x9f] = "Library search",
+ [0xa0] = "OMF extensions",
+ [0xa1] = "New OMF extension",
+ [0xa2] = "Link pass separator",
+ [0xa3] = "LIBMOD",
+ [0xa4] = "EXESTR",
+ [0xa6] = "INCERR",
+ [0xa7] = "NOPAD",
+ [0xa8] = "WKEXT",
+ [0xa9] = "LZEXT",
+ [0xda] = "Comment",
+ [0xdb] = "Compiler",
+ [0xdc] = "Date",
+ [0xdd] = "Timestamp",
+ [0xdf] = "User",
+ [0xe3] = "Type definition",
+ [0xe8] = "Filename",
+ [0xe9] = "Dependency file",
+ [0xff] = "Command line"
+ };
+
+ if (n < 2) {
+ hexdump_data(type, data, 2, n);
+ return;
+ }
+
+ type = data[0];
+ class = data[1];
+
+ printf(" [NP=%d NL=%d UD=%02X] %02X %s\n",
+ (type >> 7) & 1,
+ (type >> 6) & 1,
+ type & 0x3f,
+ class,
+ coment_class[class] ? coment_class[class] : "???");
+
+ if (dump_coment_class[class])
+ dump_coment_class[class](class, data+2, n-2);
+ else
+ hexdump_data(2, data+2, n-2, n-2);
+}
+
+/* Parse an index field */
+static uint16_t get_index(const uint8_t **pp)
+{
+ uint8_t c;
+
+ c = *(*pp)++;
+ if (c & 0x80) {
+ return ((c & 0x7f) << 8) + *(*pp)++;
+ } else {
+ return c;
+ }
+}
+
+static uint16_t get_16(const uint8_t **pp)
+{
+ uint16_t v = *(const uint16_t *)(*pp);
+ (*pp) += 2;
+
+ return v;
+}
+
+static uint32_t get_32(const uint8_t **pp)
+{
+ const uint32_t v = *(const uint32_t *)(*pp);
+ (*pp) += 4;
+
+ return v;
+}
+
+/* Returns a name as a C string in a newly allocated buffer */
+char *lname(int index)
+{
+ char *s;
+ const char *p = get_collection(&c_names, index);
+ size_t len;
+
+ if (!p)
+ return NULL;
+
+ len = (uint8_t)p[0];
+
+ s = malloc(len+1);
+ if (!s)
+ nomem();
+
+ memcpy(s, p+1, len);
+ s[len] = '\0';
+
+ return s;
+}
+
+/* LNAMES or LLNAMES */
+static void dump_lnames(uint8_t type, const uint8_t *data, size_t n)
+{
+ const uint8_t *p = data;
+ const uint8_t *end = data + n;
+
+ while (p < end) {
+ size_t l = *p+1;
+ if (l > n) {
+ add_collection(&c_names, NULL);
+ printf(" # %4u 0x%04x: \"%.*s... <%zu missing bytes>\n",
+ c_names.n, c_names.n, n-1, p+1, l-n);
+ } else {
+ add_collection(&c_names, p);
+ printf(" # %4u 0x%04x: \"%.*s\"\n",
+ c_names.n, c_names.n, l-1, p+1);
+ }
+ hexdump_data(p-data, p, l, n);
+ p += l;
+ n -= l;
+ }
+}
+
+/* SEGDEF16 or SEGDEF32 */
+static void dump_segdef(uint8_t type, const uint8_t *data, size_t n)
+{
+ bool big = type & 1;
+ const uint8_t *p = data;
+ const uint8_t *end = data+n;
+ uint8_t attr;
+ static const char * const alignment[8] =
+ { "ABS", "BYTE", "WORD", "PARA", "PAGE", "DWORD", "LTL", "?ALIGN" };
+ static const char * const combine[8] =
+ { "PRIVATE", "?COMMON", "PUBLIC", "?COMBINE", "?PUBLIC", "STACK", "COMMON", "?PUBLIC" };
+ uint16_t idx;
+ char *s;
+
+ if (p >= end)
+ return;
+
+ attr = *p++;
+
+ printf(" # %s (A%u) %s (C%u) %s%s",
+ alignment[(attr >> 5) & 7], (attr >> 5) & 7,
+ combine[(attr >> 2) & 7], (attr >> 2) & 7,
+ (attr & 0x02) ? "MAXSIZE " : "",
+ (attr & 0x01) ? "USE32" : "USE16");
+
+ if (((attr >> 5) & 7) == 0) {
+ /* Absolute segment */
+ if (p+3 > end)
+ goto dump;
+ printf(" AT %04x:", get_16(&p));
+ printf("%02x", *p++);
+ }
+
+ if (big) {
+ if (p+4 > end)
+ goto dump;
+ printf(" size 0x%08x", get_32(&p));
+ } else {
+ if (p+2 > end)
+ goto dump;
+ printf(" size 0x%04x", get_16(&p));
+ }
+
+ idx = get_index(&p);
+ if (p > end)
+ goto dump;
+ s = lname(idx);
+ printf(" name '%s'", s);
+
+ idx = get_index(&p);
+ if (p > end)
+ goto dump;
+ s = lname(idx);
+ printf(" class '%s'", s);
+
+ idx = get_index(&p);
+ if (p > end)
+ goto dump;
+ s = lname(idx);
+ printf(" ovl '%s'", s);
+
+dump:
+ putchar('\n');
+ hexdump_data(0, data, n, n);
+}
+
+/* FIXUPP16 or FIXUPP32 */
+static void dump_fixupp(uint8_t type, const uint8_t *data, size_t n)
+{
+ bool big = type & 1;
+ const uint8_t *p = data;
+ const uint8_t *end = data + n;
+ static const char * const method_base[4] =
+ { "SEGDEF", "GRPDEF", "EXTDEF", "frame#" };
+
+ while (p < end) {
+ const uint8_t *start = p;
+ uint8_t op = *p++;
+ uint16_t index;
+ uint32_t disp;
+
+ if (!(op & 0x80)) {
+ /* THREAD record */
+ bool frame = !!(op & 0x40);
+
+ printf(" THREAD %-7s%d%s method %c%d (%s)",
+ frame ? "frame" : "target", op & 3,
+ (op & 0x20) ? " +flag5?" : "",
+ (op & 0x40) ? 'F' : 'T',
+ op & 3, method_base[op & 3]);
+
+ if ((op & 0x50) != 0x50) {
+ printf(" index 0x%04x", get_index(&p));
+ }
+ putchar('\n');
+ } else {
+ /* FIXUP subrecord */
+ uint8_t fix;
+
+ printf(" FIXUP %s-rel location %2d offset 0x%03x",
+ (op & 0x40) ? "seg" : "self",
+ (op & 0x3c) >> 2,
+ ((op & 3) << 8) + *p++);
+
+ fix = *p++;
+ printf("\n frame %s%d%s",
+ (fix & 0x80) ? "thread " : "F",
+ ((fix & 0x70) >> 4),
+ ((fix & 0xc0) == 0xc0) ? "?" : "");
+
+ if ((fix & 0xc0) == 0)
+ printf(" datum 0x%04x", get_index(&p));
+
+ printf("\n target %s%d",
+ (fix & 0x10) ? "thread " : "method T",
+ fix & 3);
+
+ if ((fix & 0x10) == 0)
+ printf(" (%s)", method_base[fix & 3]);
+
+ printf(" datum 0x%04x", get_index(&p));
+
+ if ((fix & 0x08) == 0) {
+ if (big) {
+ printf(" disp 0x%08x", get_32(&p));
+ } else {
+ printf(" disp 0x%04x", get_16(&p));
+ }
+ }
+ putchar('\n');
+ }
+ hexdump_data(start-data, start, p-start, n-(start-data));
+ }
+}
+
+static const dump_func dump_type[256] =
+{
+ [0x88] = dump_coment,
+ [0x96] = dump_lnames,
+ [0x98] = dump_segdef,
+ [0x99] = dump_segdef,
+ [0x9c] = dump_fixupp,
+ [0x9d] = dump_fixupp,
+ [0xca] = dump_lnames,
+};
+
+int dump_omf(int fd)
+{
+ struct stat st;
+ size_t len, n;
+ uint8_t type;
+ const uint8_t *p, *data;
+
+ if (fstat(fd, &st))
+ return -1;
+
+ len = st.st_size;
+
+ data = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (data == MAP_FAILED)
+ return -1;
+
+ p = data;
+ while (len >= 3) {
+ uint8_t csum;
+ int i;
+
+ type = p[0];
+ n = *(uint16_t *)(p+1);
+
+ printf("%02x %-10s %4zd bytes",
+ type,
+ record_types[type] ? record_types[type] : "???",
+ n);
+
+ if (len < n+3) {
+ printf("\n (truncated, only %zd bytes left)\n", len-3);
+ break; /* Truncated */
+ }
+
+ p += 3; /* Header doesn't count in the length */
+ n--; /* Remove checksum byte */
+
+ csum = 0;
+ for (i = -3; i < (int)n; i++)
+ csum -= p[i];
+
+ printf(", checksum %02X", p[i]);
+ if (csum == p[i])
+ printf(" (valid)\n");
+ else
+ printf(" (actual = %02X)\n", csum);
+
+ if (dump_type[type])
+ dump_type[type](type, p, n);
+ else
+ dump_unknown(type, p, n);
+
+ p += n+1;
+ len -= (n+4);
+ }
+
+ munmap((void *)data, st.st_size);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int fd;
+ int i;
+
+ progname = argv[0];
+
+ for (i = 1; i < argc; i++) {
+ fd = open(argv[i], O_RDONLY);
+ if (fd < 0 || dump_omf(fd)) {
+ perror(argv[i]);
+ return 1;
+ }
+ close(fd);
+ }
+
+ return 0;
+}
diff --git a/misc/pmw.bat b/misc/pmw.bat
new file mode 100644
index 00000000..88b67a59
--- /dev/null
+++ b/misc/pmw.bat
@@ -0,0 +1,9 @@
+@echo off
+rem some batch file to bind nasm and ndisasm with pmode/w
+rem a mega cool dos extender for watcom done by tran
+rem
+rem max 8 megs, dpmi stack 256*16=4096, no banner
+pmwlite.exe nasm.exe
+pmwsetup.exe /X8388608 /P256 /B0 nasm.exe
+pmwlite.exe ndisasm.exe
+pmwsetup.exe /X8388608 /P256 /B0 ndisasm.exe
diff --git a/misc/proc32.ash b/misc/proc32.ash
new file mode 100644
index 00000000..f513b733
--- /dev/null
+++ b/misc/proc32.ash
@@ -0,0 +1,441 @@
+;--------=========xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=========--------
+;
+; Copyright (C) 1999 by Andrew Zabolotny
+; Miscelaneous NASM macros that makes use of new preprocessor features
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Library General Public
+; License as published by the Free Software Foundation; either
+; version 2 of the License, or (at your option) any later version.
+;
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+; Library General Public License for more details.
+;
+; You should have received a copy of the GNU Library General Public
+; License along with this library; if not, write to the Free
+; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;
+;--------=========xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=========--------
+
+; The macros in this file provides support for writing 32-bit C-callable
+; NASM routines. For a short description of every macros see the
+; corresponding comment before every one. Simple usage example:
+;
+; proc sin,1
+; targ %$angle
+; fld %$angle
+; fsin
+; endproc sin
+
+%ifndef __PROC32_ASH__
+%define __PROC32_ASH__
+
+[WARNING -macro-selfref]
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Mangle a name to be compatible with the C compiler
+; Arguments:
+; The name
+; Example:
+; cname (my_func)
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%ifdef EXTERNC_UNDERSCORE
+ %define cname(x) _ %+ x
+%else
+ %define cname(x) x
+%endif
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Import an external C procedure definition
+; Arguments:
+; The name of external C procedure
+; Example:
+; cextern printf
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro cextern 1
+ %xdefine %1 cname(%1)
+ %ifidni __OUTPUT_FORMAT__,obj
+ extern %1:wrt FLAT
+ %else
+ extern %1
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Export an C procedure definition
+; Arguments:
+; The name of C procedure
+; Example:
+; cglobal my_printf
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro cglobal 1
+ %xdefine %1 cname(%1)
+ global %1
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Misc macros to deal with PIC shared libraries
+; Comment:
+; Note that we have a different syntax for working with and without
+; PIC shared libraries. In a PIC environment we should load first
+; the address of the variable into a register and then work through
+; that address, i.e: mov eax,myvar; mov [eax],1
+; In a non-PIC environment we should directly write: mov myvar,1
+; Example:
+; extvar myvar
+; GetGOT
+; %ifdef PIC
+; mov ebx,myvar ; get offset of myvar into ebx
+; %else
+; lea ebx,myvar
+; %endif
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%ifdef PIC
+ cextern _GLOBAL_OFFSET_TABLE_
+ %macro GetGOT 0
+ %ifdef .$proc.stkofs
+ %assign .$proc.stkofs .$proc.stkofs+4
+ %endif
+ call %$Get_GOT
+ %$Get_GOT:
+ pop ebx
+ add ebx,_GLOBAL_OFFSET_TABLE_ + $$ - %$Get_GOT wrt ..gotpc
+ %endmacro
+ %macro extvar 1
+ cextern %1
+ %xdefine %1 [ebx+%1 wrt ..got]
+ %endmacro
+%else
+ %define GetGOT
+ %macro extvar 1
+ cextern %1
+ %endmacro
+%endif
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Begin a procedure definition
+; For performance reasons we don't use stack frame pointer EBP,
+; instead we're using the [esp+xx] addressing. Because of this
+; you should be careful when you work with stack pointer.
+; The push/pop instructions are macros that are defined to
+; deal correctly with these issues.
+; Arguments:
+; First argument - the procedure name
+; Second optional argument - the number of bytes for local variables
+; The following arguments could specify the registers that should be
+; pushed at beginning of procedure and popped before exiting
+; Example:
+; proc MyTestProc
+; proc MyTestProc,4,ebx,esi,edi
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro proc 1-3+ 0
+ cglobal %1
+ %push %1
+ align 16
+%1:
+ %xdefine %$proc.name %1
+ ; total size of local arguments
+ %assign %$proc.locsize (%2+3) & 0xFFFC
+ ; offset from esp to argument
+ %assign %$proc.argofs 4+%$proc.locsize
+ ; additional offset to args (tracks push/pops)
+ %assign .$proc.stkofs 0
+ ; offset from esp to local arguments
+ %assign %$proc.locofs 0
+ ; Now push the registers that we should save
+ %define %$proc.save %3
+ %if %$proc.locsize != 0
+ sub esp,%$proc.locsize
+ %endif
+ push %$proc.save
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Declare an argument passed on stack
+; This macro defines two additional macros:
+; first (with the name given by first argument) - [esp+xx]
+; second (with a underscore appended to first argument) - esp+xx
+; Arguments:
+; First argument defines the procedure argument name
+; Second optional parameter defines the size of the argument
+; Default value is 4 (a double word)
+; Example:
+; arg .my_float
+; arg .my_double,8
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro arg 1-2 4
+ %ifndef %$proc.argofs
+ %error "`arg' not in a proc context"
+ %else
+ ; Trick: temporary undefine .$proc.stkofs so that it won't be expanded
+ %assign %%. .$proc.stkofs
+ %undef .$proc.stkofs
+ %xdefine %{1}_ esp+%$proc.argofs+.$proc.stkofs
+ %xdefine %1 [esp+%$proc.argofs+.$proc.stkofs]
+ %assign .$proc.stkofs %%.
+ %assign %$proc.argofs %2+%$proc.argofs
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Declare an local variable
+; first (with the name given by first argument) - [esp+xx]
+; second (with a slash prefixing the first argument) - esp+xx
+; Arguments:
+; First argument defines the procedure argument name
+; Second optional parameter defines the size of the argument
+; Default value is 4 (a double word)
+; Example:
+; loc .int_value
+; loc .double_value,8
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro loc 1-2 4
+ %ifndef %$proc.locofs
+ %error "`loc' not in a proc context"
+ %elif %$proc.locofs + %2 > %$proc.locsize
+ %error "local stack space exceeded"
+ %else
+ %assign %%. .$proc.stkofs
+ %undef .$proc.stkofs
+ %xdefine %{1}_ esp+%$proc.locofs+.$proc.stkofs
+ %xdefine %1 [esp+%$proc.locofs+.$proc.stkofs]
+ %assign .$proc.stkofs %%.
+ %assign %$proc.locofs %$proc.locofs+%2
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Get the type of given size into context-local variable %$type
+; Arguments:
+; Size of type we want (1,2,4,8 or 10)
+; Example:
+; type 4 ; gives "dword"
+; type 10 ; gives "tword"
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro type 1
+ %if %1 = 1
+ %define %$type byte
+ %elif %1 = 2
+ %define %$type word
+ %elif %1 = 4
+ %define %$type dword
+ %elif %1 = 8
+ %define %$type qword
+ %elif %1 = 10
+ %define %$type tword
+ %else
+ %define %$. %1
+ %error "unknown type for argument size %$."
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Same as `arg' but prepends "word", "dword" etc (typed arg)
+; first (with the name given by first argument) - dword [esp+xx]
+; second (with a slash prefixing the first argument) - esp+xx
+; Arguments:
+; Same as for `arg'
+; Example:
+; targ .my_float ; .my_float is now "dword [esp+xxx]"
+; targ .my_double,8 ; .my_double is now "qword [esp+xxx]"
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro targ 1-2 4
+ %ifndef %$proc.argofs
+ %error "`targ' not in a proc context"
+ %else
+ arg %1,%2
+ type %2
+ %assign %%. .$proc.stkofs
+ %undef .$proc.stkofs
+ %xdefine %1 %$type %1
+ %assign .$proc.stkofs %%.
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Same as `loc' but prepends "word", "dword" etc (typed loc)
+; first (with the name given by first argument) - dword [esp+xx]
+; second (with a slash prefixing the first argument) - esp+xx
+; Arguments:
+; Same as for `loc'
+; Example:
+; tloc int_value
+; tloc double_value,8
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro tloc 1-2 4
+ %ifndef %$proc.locofs
+ %error "`tloc' not in a proc context"
+ %else
+ loc %1,%2
+ type %2
+ %assign %%. .$proc.stkofs
+ %undef .$proc.stkofs
+ %xdefine %1 %$type %1
+ %assign .$proc.stkofs %%.
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Finish a procedure
+; Gives an error if proc/endproc pairs mismatch
+; Defines an label called __end_(procedure name)
+; which is useful for calculating function size
+; Arguments:
+; (optional) The name of procedure
+; Example:
+; endproc MyTestProc
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%push tmp ; trick: define a dummy context to avoid error in next line
+%macro endproc 0-1 %$proc.name
+ %ifndef %$proc.argofs
+ %error "`endproc' not in a proc context"
+ %elifnidn %$proc.name,%1
+ %define %$. %1
+ %error "endproc names mismatch: expected `%$proc.name'"
+ %error "but got `%$.' instead"
+ %elif %$proc.locofs < %$proc.locsize
+ %error "unused local space declared (used %$proc.locofs, requested %$proc.locsize)"
+ %else
+%$exit:
+ ; Now pop the registers that we should restore on exit
+ pop %$proc.save
+ %if %$proc.locsize != 0
+ add esp,%$proc.locsize
+ %endif
+ ret
+__end_%1:
+ %pop
+ %endif
+%endmacro
+%pop
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; A replacement for "push" for use within procedures
+; Arguments:
+; any number of registers which will be push'ed successively
+; Example:
+; push eax,ebx,ecx,edx
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro push 0-*
+; dummy comment to avoid problems with "push" on the same line with a label
+ %rep %0
+ push %1
+ %rotate 1
+ %assign .$proc.stkofs .$proc.stkofs+4
+ %endrep
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; A replacement for "pop" for use within procedures
+; Arguments:
+; any number of registers which will be pop'ed in reverse order
+; Example:
+; pop eax,ebx,ecx,edx
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro pop 0-*
+; dummy comment to avoid problems with "pop" on the same line with a label
+ %rep %0
+ %rotate -1
+ pop %1
+ %assign .$proc.stkofs .$proc.stkofs-4
+ %endrep
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Replacements for "pushfd" and "popfd" that takes care of esp
+; Example:
+; pushfd
+; popfd
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro pushfd 0
+ pushfd
+ %assign .$proc.stkofs .$proc.stkofs+4
+%endmacro
+%macro popfd 0
+ popfd
+ %assign .$proc.stkofs .$proc.stkofs-4
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Exit from current procedure (optionally on given condition)
+; Arguments:
+; Either none or a condition code
+; Example:
+; exit
+; exit nz
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro exit 0-1 mp
+ j%1 near %$exit
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; start an conditional branch
+; Arguments:
+; A condition code
+; second (optional) argument - "short" (by default - "near")
+; Example:
+; if nz
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro if 1-2 near
+; dummy comment to avoid problems with "if" on the same line with a label
+ %push if
+ j%-1 %2 %$elseif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; define the "else" branch of a conditional statement
+; Arguments:
+; optionaly: "short" if jmp to endif is less than 128 bytes away
+; Example:
+; else
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro else 0-1
+ %ifnctx if
+ %error "`else' without matching `if'"
+ %else
+ jmp %1 %$endif
+%$elseif:
+ %define %$elseif_defined
+ %endif
+%endmacro
+
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+; Summary:
+; Finish am conditional statement
+; Arguments:
+; none
+; Example:
+; endif
+;-----======xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx======-----
+%macro endif 0
+ %ifnctx if
+ %error "`endif' without matching `if'"
+ %else
+ %ifndef %$elseif_defined
+%$elseif:
+ %endif
+%$endif:
+ %pop
+ %endif
+%endmacro
+
+%endif ; __PROC32_ASH__
diff --git a/misc/scitech.mac b/misc/scitech.mac
new file mode 100644
index 00000000..26f85f49
--- /dev/null
+++ b/misc/scitech.mac
@@ -0,0 +1,1223 @@
+;****************************************************************************
+;*
+;* ========================================================================
+;*
+;* The contents of this file are subject to the SciTech MGL Public
+;* License Version 1.0 (the "License"); you may not use this file
+;* except in compliance with the License. You may obtain a copy of
+;* the License at http://www.scitechsoft.com/mgl-license.txt
+;*
+;* Software distributed under the License is distributed on an
+;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+;* implied. See the License for the specific language governing
+;* rights and limitations under the License.
+;*
+;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+;*
+;* The Initial Developer of the Original Code is SciTech Software, Inc.
+;* All Rights Reserved.
+;*
+;* ========================================================================
+;*
+;* Language: NetWide Assembler (NASM) or Turbo Assembler (TASM)
+;* Environment: Any Intel Environment
+;*
+;* Description: Macros to provide memory model independant assembly language
+;* module for C programming. Supports the large and flat memory
+;* models.
+;*
+;* The defines that you should use when assembling modules that
+;* use this macro package are:
+;*
+;* __LARGE__ Assemble for 16-bit large model
+;* __FLAT__ Assemble for 32-bit FLAT memory model
+;* __NOU__ No underscore for all external C labels
+;* __NOU_VAR__ No underscore for global variables only
+;*
+;* The default settings are for 16-bit large memory model with
+;* leading underscores for symbol names.
+;*
+;* The main intent of the macro file is to enable programmers
+;* to write _one_ set of source that can be assembled to run
+;* in either 16 bit real and protected modes or 32 bit
+;* protected mode without the need to riddle the code with
+;* 'if flatmodel' style conditional assembly (it is still there
+;* but nicely hidden by a macro layer that enhances the
+;* readability and understandability of the resulting code).
+;*
+;****************************************************************************
+
+; Include the appropriate version in here depending on the assembler. NASM
+; appears to always try and parse code, even if it is in a non-compiling
+; block of a ifdef expression, and hence crashes if we include the TASM
+; macro package in the same header file. Hence we split the macros up into
+; two separate header files.
+
+ifdef __NASM_MAJOR__
+
+;============================================================================
+; Macro package when compiling with NASM.
+;============================================================================
+
+; Turn off underscores for globals if disabled for all externals
+
+%ifdef __NOU__
+%define __NOU_VAR__
+%endif
+
+; Define the __WINDOWS__ symbol if we are compiling for any Windows
+; environment
+
+%ifdef __WINDOWS16__
+%define __WINDOWS__ 1
+%endif
+%ifdef __WINDOWS32__
+%define __WINDOWS__ 1
+%define __WINDOWS32_386__ 1
+%endif
+
+; Macros for accessing 'generic' registers
+
+%ifdef __FLAT__
+%idefine _ax eax
+%idefine _bx ebx
+%idefine _cx ecx
+%idefine _dx edx
+%idefine _si esi
+%idefine _di edi
+%idefine _bp ebp
+%idefine _sp esp
+%idefine _es
+%idefine UCHAR BYTE ; Size of a character
+%idefine USHORT WORD ; Size of a short
+%idefine UINT DWORD ; Size of an integer
+%idefine ULONG DWORD ; Size of a long
+%idefine BOOL DWORD ; Size of a boolean
+%idefine DPTR DWORD ; Size of a data pointer
+%idefine FDPTR FWORD ; Size of a far data pointer
+%idefine NDPTR DWORD ; Size of a near data pointer
+%idefine CPTR DWORD ; Size of a code pointer
+%idefine FCPTR FWORD ; Size of a far code pointer
+%idefine NCPTR DWORD ; Size of a near code pointer
+%idefine FPTR NEAR ; Distance for function pointers
+%idefine DUINT dd ; Declare a integer variable
+%idefine intsize 4
+%idefine flatmodel 1
+%else
+%idefine _ax ax
+%idefine _bx bx
+%idefine _cx cx
+%idefine _dx dx
+%idefine _si si
+%idefine _di di
+%idefine _bp bp
+%idefine _sp sp
+%idefine _es es:
+%idefine UCHAR BYTE ; Size of a character
+%idefine USHORT WORD ; Size of a short
+%idefine UINT WORD ; Size of an integer
+%idefine ULONG DWORD ; Size of a long
+%idefine BOOL WORD ; Size of a boolean
+%idefine DPTR DWORD ; Size of a data pointer
+%idefine FDPTR DWORD ; Size of a far data pointer
+%idefine NDPTR WORD ; Size of a near data pointer
+%idefine CPTR DWORD ; Size of a code pointer
+%idefine FCPTR DWORD ; Size of a far code pointer
+%idefine NCPTR WORD ; Size of a near code pointer
+%idefine FPTR FAR ; Distance for function pointers
+%idefine DUINT dw ; Declare a integer variable
+%idefine intsize 2
+%endif
+%idefine invert ~
+%idefine offset
+%idefine use_nasm
+
+; Convert all jumps to near jumps, since NASM does not so this automatically
+
+%idefine jo jo near
+%idefine jno jno near
+%idefine jz jz near
+%idefine jnz jnz near
+%idefine je je near
+%idefine jne jne near
+%idefine jb jb near
+%idefine jbe jbe near
+%idefine ja ja near
+%idefine jae jae near
+%idefine jl jl near
+%idefine jle jle near
+%idefine jg jg near
+%idefine jge jge near
+%idefine jc jc near
+%idefine jnc jnc near
+%idefine js js near
+%idefine jns jns near
+
+%ifdef DOUBLE
+%idefine REAL QWORD
+%idefine DREAL dq
+%else
+%idefine REAL DWORD
+%idefine DREAL dd
+%endif
+
+; Boolean truth values (same as those in debug.h)
+
+%idefine False 0
+%idefine True 1
+%idefine No 0
+%idefine Yes 1
+%idefine Yes 1
+
+; Macro to be invoked at the start of all modules to set up segments for
+; later use. Does nothing for NASM.
+
+%imacro header 1
+%endmacro
+
+; Macro to begin a data segment
+
+%imacro begdataseg 1
+%ifdef __GNUC__
+segment .data public class=DATA use32 flat
+%else
+%ifdef flatmodel
+segment _DATA public align=4 class=DATA use32 flat
+%else
+segment _DATA public align=4 class=DATA use16
+%endif
+%endif
+%endmacro
+
+; Macro to end a data segment
+
+%imacro enddataseg 1
+%endmacro
+
+; Macro to begin a code segment
+
+%imacro begcodeseg 1
+%ifdef __GNUC__
+segment .text public class=CODE use32 flat
+%else
+%ifdef flatmodel
+segment _TEXT public align=16 class=CODE use32 flat
+%else
+segment %1_TEXT public align=16 class=CODE use16
+%endif
+%endif
+%endmacro
+
+; Macro to begin a near code segment
+
+%imacro begcodeseg_near 0
+%ifdef __GNUC__
+segment .text public class=CODE use32 flat
+%else
+%ifdef flatmodel
+segment _TEXT public align=16 class=CODE use32 flat
+%else
+segment _TEXT public align=16 class=CODE use16
+%endif
+%endif
+%endmacro
+
+; Macro to end a code segment
+
+%imacro endcodeseg 1
+%endmacro
+
+; Macro to end a near code segment
+
+%imacro endcodeseg_near 0
+%endmacro
+
+; Macro for an extern C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cextern 2
+%ifdef __NOU_VAR__
+extern %1
+%else
+extern _%1
+%define %1 _%1
+%endif
+%endmacro
+
+%imacro cexternfunc 2
+%ifdef __NOU__
+extern %1
+%else
+extern _%1
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for a public C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cpublic 1
+%ifdef __NOU_VAR__
+global %1
+%1:
+%else
+global _%1
+_%1:
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for an global C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cglobal 1
+%ifdef __NOU_VAR__
+global %1
+%else
+global _%1
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for an global C function symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cglobalfunc 1
+%ifdef __NOU__
+global %1
+%else
+global _%1
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro to start a C callable function. This will be a far function for
+; 16-bit code, and a near function for 32-bit code.
+
+%imacro cprocstatic 1
+%push cproc
+%1:
+%ifdef flatmodel
+%stacksize flat
+%define ret retn
+%else
+%stacksize large
+%define ret retf
+%endif
+%assign %$localsize 0
+%endmacro
+
+%imacro cprocstart 1
+%push cproc
+ cglobalfunc %1
+%1:
+%ifdef flatmodel
+%stacksize flat
+%define ret retn
+%else
+%stacksize large
+%define ret retf
+%endif
+%assign %$localsize 0
+%endmacro
+
+; This macro sets up a procedure to be exported from a 16 bit DLL. Since the
+; calling conventions are always _far _pascal for 16 bit DLL's, we actually
+; rename this routine with an extra underscore with 'C' calling conventions
+; and a small DLL stub will be provided by the high level code to call the
+; assembler routine.
+
+%imacro cprocstartdll16 1
+%ifdef __WINDOWS16__
+cprocstart _%1
+%else
+cprocstart %1
+%endif
+%endmacro
+
+; Macro to start a C callable near function.
+
+%imacro cprocnear 1
+%push cproc
+ cglobalfunc %1
+%1:
+%define ret retn
+%ifdef flatmodel
+%stacksize flat
+%else
+%stacksize small
+%endif
+%assign %$localsize 0
+%endmacro
+
+; Macro to start a C callable far function.
+
+%imacro cprocfar 1
+%push cproc
+ cglobalfunc %1
+%1:
+%define ret retf
+%ifdef flatmodel
+%stacksize flat
+%else
+%stacksize large
+%endif
+%assign %$localsize 0
+%endmacro
+
+; Macro to end a C function
+
+%imacro cprocend 0
+%pop
+%endmacro
+
+; Macros for entering and exiting C callable functions. Note that we must
+; always save and restore the SI and DI registers for C functions, and for
+; 32 bit C functions we also need to save and restore EBX and clear the
+; direction flag.
+
+%imacro enter_c 0
+ push _bp
+ mov _bp,_sp
+%ifnidn %$localsize,0
+ sub _sp,%$localsize
+%endif
+%ifdef flatmodel
+ push ebx
+%endif
+ push _si
+ push _di
+%endmacro
+
+%imacro leave_c 0
+ pop _di
+ pop _si
+%ifdef flatmodel
+ pop ebx
+ cld
+%endif
+%ifnidn %$localsize,0
+ mov _sp,_bp
+%endif
+ pop _bp
+%endmacro
+
+%imacro use_ebx 0
+%ifdef flatmodel
+ push ebx
+%endif
+%endmacro
+
+%imacro unuse_ebx 0
+%ifdef flatmodel
+ pop ebx
+%endif
+%endmacro
+
+; Macros for saving and restoring the value of DS,ES,FS,GS when it is to
+; be used in assembly routines. This evaluates to nothing in the flat memory
+; model, but is saves and restores DS in the large memory model.
+
+%imacro use_ds 0
+%ifndef flatmodel
+ push ds
+%endif
+%endmacro
+
+%imacro unuse_ds 0
+%ifndef flatmodel
+ pop ds
+%endif
+%endmacro
+
+%imacro use_es 0
+%ifndef flatmodel
+ push es
+%endif
+%endmacro
+
+%imacro unuse_es 0
+%ifndef flatmodel
+ pop es
+%endif
+%endmacro
+
+; Macros for loading the address of a data pointer into a segment and
+; index register pair. The %imacro explicitly loads DS or ES in the 16 bit
+; memory model, or it simply loads the offset into the register in the flat
+; memory model since DS and ES always point to all addressable memory. You
+; must use the correct _REG (ie: _BX) %imacros for documentation purposes.
+
+%imacro _lds 2
+%ifdef flatmodel
+ mov %1,%2
+%else
+ lds %1,%2
+%endif
+%endmacro
+
+%imacro _les 2
+%ifdef flatmodel
+ mov %1,%2
+%else
+ les %1,%2
+%endif
+%endmacro
+
+; Macros for adding and subtracting a value from registers. Two value are
+; provided, one for 16 bit modes and another for 32 bit modes (the extended
+; register is used in 32 bit modes).
+
+%imacro _add 3
+%ifdef flatmodel
+ add e%1, %3
+%else
+ add %1, %2
+%endif
+%endmacro
+
+%imacro _sub 3
+%ifdef flatmodel
+ sub e%1, %3
+%else
+ sub %1, %2
+%endif
+%endmacro
+
+; Macro to clear the high order word for the 32 bit extended registers.
+; This is used to convert an unsigned 16 bit value to an unsigned 32 bit
+; value, and will evaluate to nothing in 16 bit modes.
+
+%imacro clrhi 1
+%ifdef flatmodel
+ movzx e%1,%1
+%endif
+%endmacro
+
+%imacro sgnhi 1
+%ifdef flatmodel
+ movsx e%1,%1
+%endif
+%endmacro
+
+; Macro to load an extended register with an integer value in either mode
+
+%imacro loadint 2
+%ifdef flatmodel
+ mov e%1,%2
+%else
+ xor e%1,e%1
+ mov %1,%2
+%endif
+%endmacro
+
+; Macros to load and store integer values with string instructions
+
+%imacro LODSINT 0
+%ifdef flatmodel
+ lodsd
+%else
+ lodsw
+%endif
+%endmacro
+
+%imacro STOSINT 0
+%ifdef flatmodel
+ stosd
+%else
+ stosw
+%endif
+%endmacro
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+%imacro dclb 1
+times %1 db 0
+%endmacro
+
+%imacro dclw 1
+times %1 dw 0
+%endmacro
+
+%imacro dcld 1
+times %1 dd 0
+%endmacro
+
+; macros to declare assembler function stubs for function structures
+
+%imacro BEGIN_STUBS_DEF 2
+begdataseg _STUBS
+%ifdef __NOU_VAR__
+extern %1
+%define STUBS_START %1
+%else
+extern _%1
+%define STUBS_START _%1
+%endif
+enddataseg _STUBS
+begcodeseg _STUBS
+%assign off %2
+%endmacro
+
+%imacro DECLARE_STUB 1
+%ifdef __NOU__
+ global %1
+%1:
+%else
+ global _%1
+_%1:
+%endif
+ jmp [DWORD STUBS_START+off]
+%assign off off+4
+%endmacro
+
+%imacro DECLARE_STDCALL 2
+%ifdef STDCALL_MANGLE
+ global _%1@%2
+_%1@%2:
+%else
+%ifdef __GNUC__
+ global _%1
+_%1:
+%else
+ global %1
+%1:
+%endif
+%endif
+ jmp [DWORD STUBS_START+off]
+%assign off off+4
+%endmacro
+
+%imacro END_STUBS_DEF 0
+endcodeseg _STUBS
+%endmacro
+
+; macros to declare assembler import stubs for binary loadable drivers
+
+%imacro BEGIN_IMPORTS_DEF 1
+BEGIN_STUBS_DEF %1,4
+%endmacro
+
+%imacro DECLARE_IMP 1
+DECLARE_STUB %1
+%endmacro
+
+%imacro END_IMPORTS_DEF 0
+END_STUBS_DEF
+%endmacro
+
+else ; __NASM_MAJOR__
+
+;============================================================================
+; Macro package when compiling with TASM.
+;============================================================================
+
+; Turn off underscores for globals if disabled for all externals
+
+ifdef __NOU__
+__NOU_VAR__ = 1
+endif
+
+; Define the __WINDOWS__ symbol if we are compiling for any Windows
+; environment
+
+ifdef __WINDOWS16__
+__WINDOWS__ = 1
+endif
+ifdef __WINDOWS32__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+endif
+ifdef __WIN386__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+endif
+ifdef __VXD__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+ MASM
+ .386
+ NO_SEGMENTS = 1
+ include vmm.inc ; IGNORE DEPEND
+ include vsegment.inc ; IGNORE DEPEND
+ IDEAL
+endif
+
+; Macros for accessing 'generic' registers
+
+ifdef __FLAT__
+ _ax EQU eax ; EAX is used for accumulator
+ _bx EQU ebx ; EBX is used for accumulator
+ _cx EQU ecx ; ECX is used for looping
+ _dx EQU edx ; EDX is used for data register
+ _si EQU esi ; ESI is the source index register
+ _di EQU edi ; EDI is the destination index register
+ _bp EQU ebp ; EBP is used for base pointer register
+ _sp EQU esp ; ESP is used for stack pointer register
+ _es EQU ; ES and DS are the same in 32 bit PM
+ typedef UCHAR BYTE ; Size of a character
+ typedef USHORT WORD ; Size of a short
+ typedef UINT DWORD ; Size of an integer
+ typedef ULONG DWORD ; Size of a long
+ typedef BOOL DWORD ; Size of a boolean
+ typedef DPTR DWORD ; Size of a data pointer
+ typedef FDPTR FWORD ; Size of a far data pointer
+ typedef NDPTR DWORD ; Size of a near data pointer
+ typedef CPTR DWORD ; Size of a code pointer
+ typedef FCPTR FWORD ; Size of a far code pointer
+ typedef NCPTR DWORD ; Size of a near code pointer
+ typedef DUINT DWORD ; Declare a integer variable
+ FPTR EQU NEAR ; Distance for function pointers
+ intsize = 4 ; Size of an integer
+ flatmodel = 1 ; This is a flat memory model
+ P386 ; Turn on 386 code generation
+ MODEL FLAT ; Set up for 32 bit simplified FLAT model
+else
+ _ax EQU ax ; AX is used for accumulator
+ _bx EQU bx ; BX is used for accumulator
+ _cx EQU cx ; CX is used for looping
+ _dx EQU dx ; DX is used for data register
+ _si EQU si ; SI is the source index register
+ _di EQU di ; DI is the destination index register
+ _bp EQU bp ; BP is used for base pointer register
+ _sp EQU sp ; SP is used for stack pointer register
+ _es EQU es: ; ES is used for segment override
+ typedef UCHAR BYTE ; Size of a character
+ typedef USHORT WORD ; Size of a short
+ typedef UINT WORD ; Size of an integer
+ typedef ULONG DWORD ; Size of a long
+ typedef BOOL WORD ; Size of a boolean
+ typedef DPTR DWORD ; Size of a data pointer
+ typedef FDPTR DWORD ; Size of a far data pointer
+ typedef NDPTR WORD ; Size of a near data pointer
+ typedef CPTR DWORD ; Size of a code pointer
+ typedef FCPTR DWORD ; Size of a far code pointer
+ typedef NCPTR WORD ; Size of a near code pointer
+ typedef DUINT WORD ; Declare a integer variable
+ FPTR EQU FAR ; Distance for function pointers
+ intsize = 2 ; Size of an integer
+ P386 ; Turn on 386 code generation
+endif
+ invert EQU not
+
+; Provide a typedef for real floating point numbers
+
+ifdef DOUBLE
+typedef REAL QWORD
+typedef DREAL QWORD
+else
+typedef REAL DWORD
+typedef DREAL DWORD
+endif
+
+; Macros to access the floating point stack registers to convert them
+; from NASM style to TASM style
+
+st0 EQU st(0)
+st1 EQU st(1)
+st2 EQU st(2)
+st3 EQU st(3)
+st4 EQU st(4)
+st5 EQU st(5)
+st6 EQU st(6)
+st7 EQU st(7)
+st8 EQU st(8)
+
+; Boolean truth values (same as those in debug.h)
+
+ifndef __VXD__
+False = 0
+True = 1
+No = 0
+Yes = 1
+Yes = 1
+endif
+
+; Macros for the _DATA data segment. This segment contains initialised data.
+
+MACRO begdataseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_DATA_SEG
+ IDEAL
+else
+ifdef flatmodel
+ DATASEG
+else
+SEGMENT _DATA DWORD PUBLIC USE16 'DATA'
+endif
+endif
+ENDM
+
+MACRO enddataseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_DATA_ENDS
+ IDEAL
+else
+ifndef flatmodel
+ENDS _DATA
+endif
+endif
+ENDM
+
+; Macro for the main code segment.
+
+MACRO begcodeseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_CODE_SEG
+ IDEAL
+else
+ifdef flatmodel
+ CODESEG
+ ASSUME CS:FLAT,DS:FLAT,SS:FLAT
+else
+SEGMENT &name&_TEXT PARA PUBLIC USE16 'CODE'
+ ASSUME CS:&name&_TEXT,DS:_DATA
+endif
+endif
+ENDM
+
+; Macro for a near code segment
+
+MACRO begcodeseg_near
+ifdef flatmodel
+ CODESEG
+ ASSUME CS:FLAT,DS:FLAT,SS:FLAT
+else
+SEGMENT _TEXT PARA PUBLIC USE16 'CODE'
+ ASSUME CS:_TEXT,DS:_DATA
+endif
+ENDM
+
+MACRO endcodeseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_CODE_ENDS
+ IDEAL
+else
+ifndef flatmodel
+ENDS &name&_TEXT
+endif
+endif
+ENDM
+
+MACRO endcodeseg_near
+ifndef flatmodel
+ENDS _TEXT
+endif
+ENDM
+
+; Macro to be invoked at the start of all modules to set up segments for
+; later use.
+
+MACRO header name
+begdataseg name
+enddataseg name
+ENDM
+
+; Macro for an extern C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cextern name,size
+ifdef __NOU_VAR__
+ EXTRN name:size
+else
+ EXTRN _&name&:size
+name EQU _&name&
+endif
+ENDM
+
+MACRO cexternfunc name,size
+ifdef __NOU__
+ EXTRN name:size
+else
+ EXTRN _&name&:size
+name EQU _&name&
+endif
+ENDM
+
+MACRO stdexternfunc name,args,size
+ifdef STDCALL_MANGLE
+ EXTRN _&name&@&num_args&:size
+name EQU _&name&@&num_args
+else
+ EXTRN name:size
+endif
+ENDM
+
+; Macro for a public C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cpublic name
+ifdef __NOU_VAR__
+name:
+ PUBLIC name
+else
+_&name&:
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro for an global C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cglobal name
+ifdef __NOU_VAR__
+ PUBLIC name
+else
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro for an global C function symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cglobalfunc name
+ifdef __NOU__
+ PUBLIC name
+else
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro to start a C callable function. This will be a far function for
+; 16-bit code, and a near function for 32-bit code.
+
+MACRO cprocstatic name ; Set up model independant private proc
+ifdef flatmodel
+PROC name NEAR
+else
+PROC name FAR
+endif
+LocalSize = 0
+ENDM
+
+MACRO cprocstart name ; Set up model independant proc
+ifdef flatmodel
+ifdef __NOU__
+PROC name NEAR
+else
+PROC _&name& NEAR
+endif
+else
+ifdef __NOU__
+PROC name FAR
+else
+PROC _&name& FAR
+endif
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocnear name ; Set up near proc
+ifdef __NOU__
+PROC name NEAR
+else
+PROC _&name& NEAR
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocfar name ; Set up far proc
+ifdef __NOU__
+PROC name FAR
+else
+PROC _&name& FAR
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocend ; End procedure macro
+ENDP
+ENDM
+
+; This macro sets up a procedure to be exported from a 16 bit DLL. Since the
+; calling conventions are always _far _pascal for 16 bit DLL's, we actually
+; rename this routine with an extra underscore with 'C' calling conventions
+; and a small DLL stub will be provided by the high level code to call the
+; assembler routine.
+
+MACRO cprocstartdll16 name
+ifdef __WINDOWS16__
+cprocstart _&name&
+else
+cprocstart name
+endif
+ENDM
+
+; Macros for entering and exiting C callable functions. Note that we must
+; always save and restore the SI and DI registers for C functions, and for
+; 32 bit C functions we also need to save and restore EBX and clear the
+; direction flag.
+
+MACRO save_c_regs
+ifdef flatmodel
+ push ebx
+endif
+ push _si
+ push _di
+ENDM
+
+MACRO enter_c
+ push _bp
+ mov _bp,_sp
+ IFDIFI <LocalSize>,<0>
+ sub _sp,LocalSize
+ ENDIF
+ save_c_regs
+ENDM
+
+MACRO restore_c_regs
+ pop _di
+ pop _si
+ifdef flatmodel
+ pop ebx
+endif
+ENDM
+
+MACRO leave_c
+ restore_c_regs
+ cld
+ IFDIFI <LocalSize>,<0>
+ mov _sp,_bp
+ ENDIF
+ pop _bp
+ENDM
+
+MACRO use_ebx
+ifdef flatmodel
+ push ebx
+endif
+ENDM
+
+MACRO unuse_ebx
+ifdef flatmodel
+ pop ebx
+endif
+ENDM
+
+; Macros for saving and restoring the value of DS,ES,FS,GS when it is to
+; be used in assembly routines. This evaluates to nothing in the flat memory
+; model, but is saves and restores DS in the large memory model.
+
+MACRO use_ds
+ifndef flatmodel
+ push ds
+endif
+ENDM
+
+MACRO unuse_ds
+ifndef flatmodel
+ pop ds
+endif
+ENDM
+
+MACRO use_es
+ifndef flatmodel
+ push es
+endif
+ENDM
+
+MACRO unuse_es
+ifndef flatmodel
+ pop es
+endif
+ENDM
+
+; Macros for loading the address of a data pointer into a segment and
+; index register pair. The macro explicitly loads DS or ES in the 16 bit
+; memory model, or it simply loads the offset into the register in the flat
+; memory model since DS and ES always point to all addressable memory. You
+; must use the correct _REG (ie: _BX) macros for documentation purposes.
+
+MACRO _lds reg, addr
+ifdef flatmodel
+ mov reg,addr
+else
+ lds reg,addr
+endif
+ENDM
+
+MACRO _les reg, addr
+ifdef flatmodel
+ mov reg,addr
+else
+ les reg,addr
+endif
+ENDM
+
+; Macros for adding and subtracting a value from registers. Two value are
+; provided, one for 16 bit modes and another for 32 bit modes (the extended
+; register is used in 32 bit modes).
+
+MACRO _add reg, val16, val32
+ifdef flatmodel
+ add e&reg&, val32
+else
+ add reg, val16
+endif
+ENDM
+
+MACRO _sub reg, val16, val32
+ifdef flatmodel
+ sub e&reg&, val32
+else
+ sub reg, val16
+endif
+ENDM
+
+; Macro to clear the high order word for the 32 bit extended registers.
+; This is used to convert an unsigned 16 bit value to an unsigned 32 bit
+; value, and will evaluate to nothing in 16 bit modes.
+
+MACRO clrhi reg
+ifdef flatmodel
+ movzx e&reg&,reg
+endif
+ENDM
+
+MACRO sgnhi reg
+ifdef flatmodel
+ movsx e&reg&,reg
+endif
+ENDM
+
+; Macro to load an extended register with an integer value in either mode
+
+MACRO loadint reg,val
+ifdef flatmodel
+ mov e&reg&,val
+else
+ xor e&reg&,e&reg&
+ mov reg,val
+endif
+ENDM
+
+; Macros to load and store integer values with string instructions
+
+MACRO LODSINT
+ifdef flatmodel
+ lodsd
+else
+ lodsw
+endif
+ENDM
+
+MACRO STOSINT
+ifdef flatmodel
+ stosd
+else
+ stosw
+endif
+ENDM
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+MACRO dclb count
+db count dup (0)
+ENDM
+
+MACRO dclw count
+dw count dup (0)
+ENDM
+
+MACRO dcld count
+dd count dup (0)
+ENDM
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+MACRO resb count
+db count dup (?)
+ENDM
+
+MACRO resw count
+dw count dup (?)
+ENDM
+
+MACRO resd count
+dd count dup (?)
+ENDM
+
+; Macros to declare assembler stubs for function structures
+
+MACRO BEGIN_STUBS_DEF name, firstOffset
+begdataseg _STUBS
+ifdef __NOU_VAR__
+ EXTRN name:DWORD
+STUBS_START = name
+else
+ EXTRN _&name&:DWORD
+name EQU _&name&
+STUBS_START = _&name
+endif
+enddataseg _STUBS
+begcodeseg _STUBS
+off = firstOffset
+ENDM
+
+MACRO DECLARE_STUB name
+ifdef __NOU__
+name:
+ PUBLIC name
+else
+_&name:
+ PUBLIC _&name
+endif
+ jmp [DWORD STUBS_START+off]
+off = off + 4
+ENDM
+
+MACRO DECLARE_STDCALL name,num_args
+ifdef STDCALL_MANGLE
+_&name&@&num_args&:
+ PUBLIC _&name&@&num_args&
+else
+name:
+ PUBLIC name
+endif
+ jmp [DWORD STUBS_START+off]
+off = off + 4
+ENDM
+
+MACRO END_STUBS_DEF
+endcodeseg _STUBS
+ENDM
+
+MACRO BEGIN_IMPORTS_DEF name
+BEGIN_STUBS_DEF name,4
+ENDM
+
+MACRO DECLARE_IMP name
+DECLARE_STUB name
+ENDM
+
+MACRO END_IMPORTS_DEF
+END_STUBS_DEF
+ENDM
+
+endif
diff --git a/misc/xcrcgen.c b/misc/xcrcgen.c
new file mode 100644
index 00000000..acfd48e0
--- /dev/null
+++ b/misc/xcrcgen.c
@@ -0,0 +1,80 @@
+/*
+ * Produce a "generalized CRC" table. Assumes a platform with
+ * /dev/urandom -- otherwise reimplement get_random_byte().
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static uint8_t get_random_byte(void)
+{
+ static int fd = -1;
+ uint8_t buf;
+ int rv;
+
+ if (fd < 0)
+ fd = open("/dev/urandom", O_RDONLY);
+
+ do {
+ errno = 0;
+ rv = read(fd, &buf, 1);
+ if (rv < 1 && errno != EAGAIN)
+ abort();
+ } while (rv < 1);
+
+ return buf;
+}
+
+static void random_permute(uint8_t *buf)
+{
+ int i, j, k;
+ int m;
+
+ for (i = 0; i < 256; i++)
+ buf[i] = i;
+
+ m = 255;
+ for (i = 255; i > 0; i--) {
+ if (i <= (m >> 1))
+ m >>= 1;
+ do {
+ j = get_random_byte() & m;
+ } while (j > i);
+ k = buf[i];
+ buf[i] = buf[j];
+ buf[j] = k;
+ }
+}
+
+static void xcrc_table(uint64_t *buf)
+{
+ uint8_t perm[256];
+ int i, j;
+
+ memset(buf, 0, 8*256); /* Make static checkers happy */
+
+ for (i = 0; i < 8; i++) {
+ random_permute(perm);
+ for (j = 0; j < 256; j++)
+ buf[j] = (buf[j] << 8) | perm[j];
+ }
+}
+
+int main(void)
+{
+ int i;
+ uint64_t buf[256];
+
+ xcrc_table(buf);
+
+ for (i = 0; i < 256; i++) {
+ printf("%016"PRIx64"\n", buf[i]);
+ }
+
+ return 0;
+}
diff --git a/nasm.spec.in b/nasm.spec.in
new file mode 100644
index 00000000..317e2d80
--- /dev/null
+++ b/nasm.spec.in
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+%define nasm_version @@NASM_VER@@
+Summary: The Netwide Assembler, a portable x86 assembler with Intel-like syntax
+Name: nasm
+Version: @@NASM_MANGLED_VER@@
+Release: 0%{?dist}
+License: BSD
+Source: http://www.nasm.us/pub/nasm/releasebuilds/%{nasm_version}/nasm-%{nasm_version}.tar.xz
+URL: http://www.nasm.us/
+BuildRoot: /tmp/rpm-build-nasm
+Prefix: %{_prefix}
+@@PERLBUILDREQS@@
+BuildRequires: autoconf
+BuildRequires: asciidoc
+BuildRequires: xmlto
+BuildRequires: xz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%package doc
+Summary: Detailed manual for the Netwide Assembler
+BuildArch: noarch
+BuildRequires: ghostscript
+BuildRequires: fontconfig
+BuildRequires: adobe-source-sans-pro-fonts
+BuildRequires: adobe-source-code-pro-fonts
+
+%package rdoff
+Summary: Tools for the RDOFF binary format, sometimes used with NASM.
+
+%description
+NASM is the Netwide Assembler, a free portable assembler for the Intel
+80x86 microprocessor series, using primarily the traditional Intel
+instruction mnemonics and syntax.
+
+%description doc
+Extensive documentation for the Netwide Assembler (NASM) in HTML and
+PDF formats.
+
+%description rdoff
+Tools for the operating-system independent RDOFF binary format, which
+is sometimes used with the Netwide Assembler (NASM). These tools
+include linker, library manager, loader, and information dump.
+
+%prep
+%setup -q -n nasm-%{nasm_version}
+
+%build
+autoreconf
+%configure --disable-pdf-compression --enable-sections
+make %{?_smp_mflags} everything
+xz -9ef doc/nasmdoc.pdf
+
+%install
+rm -rf "%{buildroot}"
+mkdir -p "%{buildroot}"/%{_bindir}
+mkdir -p "%{buildroot}"/%{_mandir}/man1
+make DESTDIR="%{buildroot}" install install_rdf
+
+%files
+%doc AUTHORS CHANGES README TODO
+%{_bindir}/nasm
+%{_bindir}/ndisasm
+%{_mandir}/man1/nasm.1*
+%{_mandir}/man1/ndisasm.1*
+
+%files doc
+%doc doc/html doc/nasmdoc.pdf.xz
+
+%files rdoff
+%{_bindir}/ldrdf
+%{_bindir}/rdf2bin
+%{_bindir}/rdf2com
+%{_bindir}/rdf2ihx
+%{_bindir}/rdf2ith
+%{_bindir}/rdf2srec
+%{_bindir}/rdfdump
+%{_bindir}/rdflib
+%{_bindir}/rdx
+%{_mandir}/man1/ldrdf.1*
+%{_mandir}/man1/rd*.1*
+
+# This is the upstream spec file; the change log is in git
+%changelog
diff --git a/nasm.spec.sed b/nasm.spec.sed
new file mode 100644
index 00000000..ae0d039b
--- /dev/null
+++ b/nasm.spec.sed
@@ -0,0 +1,3 @@
+# Replace @@PERLBUILDREQS@@ with the file perlbreq.si
+/@@PERLBUILDREQS@@/{r perlbreq.si
+d}
diff --git a/nasm.txt b/nasm.txt
new file mode 100644
index 00000000..a28202f9
--- /dev/null
+++ b/nasm.txt
@@ -0,0 +1,306 @@
+nasm(1)
+=======
+:doctype: manpage
+:man source: NASM
+:man manual: The Netwide Assembler Project
+
+NAME
+----
+nasm - the Netwide Assembler, a portable 80x86 assembler
+
+SYNOPSIS
+--------
+*nasm* [*-@* response file] [*-f* format] [*-o* outfile] [*-l* listfile] ['options'...] filename
+
+DESCRIPTION
+-----------
+The *nasm* command assembles the file 'filename' and directs output to the file
+'outfile' if specified. If 'outfile' is not specified, *nasm* will derive a default
+output file name from the name of its input file, usually by appending `.o' or
+`.obj', or by removing all extensions for a raw binary file. Failing that, the
+output file name will be `nasm.out'.
+
+OPTIONS
+-------
+*-@* 'filename'::
+ Causes *nasm* to process options from filename as if they were included on
+ the command line.
+
+*-a*::
+ Causes *nasm* to assemble the given input file without first applying the
+ macro preprocessor.
+
+*-D*|*-d* 'macro[=value]'::
+ Pre-defines a single-line macro.
+
+*-E*|*-e*::
+ Causes *nasm* to preprocess the given input file, and write the output to
+ 'stdout' (or the specified output file name), and not actually assemble
+ anything.
+
+*-f* 'format'::
+ Specifies the output file format. To see a list of valid output formats,
+ use the *-hf* option.
+
+*-F* 'format'::
+ Specifies the debug information format. To see a list of valid output
+ formats, use the *-y* option (for example *-felf -y*).
+
+*-g*::
+ Causes *nasm* to generate debug information.
+
+*-g*'format'::
+ Equivalent to **-g -F**__ format__.
+
+*-h*::
+ Causes *nasm* to exit immediately, after giving a summary of its
+ invocation options.
+
+*-hf*::
+ Same as *-h* , but also lists all valid output formats.
+
+*-I*|*-i* 'directory'::
+ Adds a directory to the search path for include files. The directory
+ specification must include the trailing slash, as it will be directly
+ prepended to the name of the include file.
+
+*-l* 'listfile'::
+ Causes an assembly listing to be directed to the given file, in which
+ the original source is displayed on the right hand side (plus the source
+ for included files and the expansions of multi-line macros) and the
+ generated code is shown in hex on the left.
+
+*-M*::
+ Causes *nasm* to output Makefile-style dependencies to stdout; normal
+ output is suppressed.
+
+*-MG* 'file'::
+ Same as *-M* but assumes that missing Makefile dependecies are generated
+ and added to dependency list without a prefix.
+
+*-MF* 'file'::
+ Output Makefile-style dependencies to the specified file.
+
+*-MD* 'file'::
+ Same as a combination of *-M* and *-MF* options.
+
+*-MT* 'file'::
+ Override the default name of the dependency target dependency target name.
+ This is normally the same as the output filename, specified by
+ the *-o* option.
+
+*-MQ* 'file'::
+ The same as *-MT* except it tries to quote characters that have special
+ meaning in Makefile syntax. This is not foolproof, as not all characters
+ with special meaning are quotable in Make.
+
+*-MP*::
+ Emit phony target.
+
+*-O* 'number'::
+ Optimize branch offsets.
+ * *-O0*: No optimization
+ * *-O1*: Minimal optimization
+ * *-Ox*: Multipass optimization (default)
+
+*-o* 'outfile'::
+ Specifies a precise name for the output file, overriding *nasm*'s default
+ means of determining it.
+
+*-P*|*-p* 'file'::
+ Specifies a file to be pre-included, before the main source file
+ starts to be processed.
+
+*-s*::
+ Causes *nasm* to send its error messages and/or help text to stdout
+ instead of stderr.
+
+*-t*::
+ Causes *nasm* to assemble in SciTech TASM compatible mode.
+
+*-U*|*-u* 'macro'::
+ Undefines a single-line macro.
+
+*-v*::
+ Causes *nasm* to exit immediately, after displaying its version number.
+
+*-W[no-]foo'::
+ Causes *nasm* to enable or disable certain classes of warning messages,
+ in gcc-like style, for example *-Worphan-labels* or *-Wno-orphan-labels*.
+
+*-w*'[+-]foo'::
+ Causes *nasm* to enable or disable certain classes of warning messages,
+ for example *-w+orphan-labels* or *-w-macro-params*.
+
+*-X* 'format'::
+ Specifies error reporting format (gnu or vc).
+
+*-y*::
+ Causes *nasm* to list supported debug formats.
+
+*-Z* 'filename'::
+ Causes *nasm* to redirect error messages to 'filename'. This option exists
+ to support operating systems on which stderr is not easily redirected.
+
+--prefix::
+--postfix::
+ Prepend or append (respectively) the given argument to all global or
+ extern variables.
+
+SYNTAX
+------
+This man page does not fully describe the syntax of *nasm*'s assembly language,
+but does give a summary of the differences from other assemblers.
+
+'Registers' have no leading `%' sign, unlike *gas*, and floating-point stack
+registers are referred to as 'st0', 'st1', and so on.
+
+'Floating-point instructions' may use either the single-operand form or the
+double. A 'TO' keyword is provided; thus, one could either write
+
+ fadd st0,st1
+ fadd st1,st0
+
+or one could use the alternative single-operand forms
+
+ fadd st1
+ fadd to st1
+
+'Uninitialised storage' is reserved using the 'RESB', 'RESW', 'RESD', 'RESQ',
+'REST' and 'RESO' pseudo-opcodes, each taking one parameter which gives the
+number of bytes, words, doublewords, quadwords or ten-byte words to reserve.
+
+'Repetition' of data items is not done by the 'DUP' keyword as seen in DOS
+assemblers, but by the use of the 'TIMES' prefix, like this:
+
+ message: times 3 db 'abc'
+ times 64-$+message db 0
+
+which defines the string `abcabcabc`, followed by the right number of zero
+bytes to make the total length up to 64 bytes.
+
+'Symbol references' are always understood to be immediate (i.e. the address
+of the symbol), unless square brackets are used, in which case the contents
+of the memory location are used. Thus:
+
+ mov ax,wordvar
+
+loads AX with the address of the variable `wordvar`, whereas
+
+ mov ax,[wordvar]
+ mov ax,[wordvar+1]
+ mov ax,[es:wordvar+bx]
+
+all refer to the 'contents' of memory locations. The syntaxes
+
+ mov ax,es:wordvar[bx]
+ es mov ax,wordvar[1]
+
+are not legal at all, although the use of a segment register name as an instruction
+prefix is valid, and can be used with instructions such as 'LODSB' which can't
+be overridden any other way.
+
+'Constants' may be expressed numerically in most formats: a trailing H, Q or
+B denotes hex, octal or binary respectively, and a leading `0x' or `$' denotes
+hex as well. Leading zeros are not treated specially at all. Character constants
+may be enclosed in single or double quotes; there is no escape character. The
+ordering is little-endian (reversed), so that the character constant ''abcd''
+denotes 0x64636261 and not 0x61626364.
+
+Local labels begin with a period, and their `locality' is granted by the assembler
+prepending the name of the previous non-local symbol. Thus declaring a label
+`.loop' after a label `label' has actually defined a symbol called `label.loop'.
+
+DIRECTIVES
+----------
+'SECTION' 'name' or 'SEGMENT' 'name' causes *nasm* to direct all following code
+to the named section. Section names vary with output file format, although most
+formats support the names '.text', '.data' and '.bss'. (The exception is the
+'obj' format, in which all segments are user-definable.)
+
+'ABSOLUTE' 'address' causes *nasm* to position its notional assembly point at
+an absolute address: so no code or data may be generated, but you can use 'RESB',
+'RESW' and 'RESD' to move the assembly point further on, and you can define labels.
+So this directive may be used to define data structures. When you have finished
+doing absolute assembly, you must issue another 'SECTION' directive to return to
+normal assembly.
+
+'BITS' '16', 'BITS' '32' or 'BITS' '64' switches the default processor mode for
+which *nasm* is generating code: it is equivalent to 'USE16' or 'USE32' in DOS
+assemblers.
+
+'EXTERN' 'symbol' and 'GLOBAL' 'symbol' import and export symbol definitions,
+respectively, from and to other modules. Note that the 'GLOBAL' directive must
+appear before the definition of the symbol it refers to.
+
+'STRUC' 'strucname' and 'ENDSTRUC', when used to bracket a number of 'RESB',
+'RESW' or similar instructions, define a data structure. In addition to
+defining the offsets of the structure members, the construct also defines a symbol
+for the size of the structure, which is simply the structure name with 'size'
+tacked on to the end.
+
+FORMAT-SPECIFIC DIRECTIVES
+--------------------------
+'ORG' 'address' is used by the 'bin' flat-form binary output format, and
+specifies the address at which the output code will eventually be loaded.
+
+'GROUP' 'grpname' 'seg1' 'seg2'... is used by the obj (Microsoft 16-bit)
+output format, and defines segment groups. This format also uses 'UPPERCASE',
+which directs that all segment, group and symbol names output to the object
+file should be in uppercase. Note that the actual assembly is still case
+sensitive.
+
+'LIBRARY' 'libname' is used by the 'rdf' output format, and causes a
+dependency record to be written to the output file which indicates that
+the program requires a certain library in order to run.
+
+MACRO PREPROCESSOR
+------------------
+Single-line macros are defined using the '%define' or '%idefine' commands, in
+a similar fashion to the C preprocessor. They can be overloaded with respect
+to number of parameters, although defining a macro with no parameters prevents
+the definition of any macro with the same name taking parameters, and vice versa.
+'%define' defines macros whose names match case-sensitively, whereas '%idefine'
+defines case-insensitive macros.
+
+Multi-line macros are defined using '%macro' and '%imacro' (the distinction is the
+same as that between '%define' and '%idefine'), whose syntax is as follows
+
+ %macro name minprm[-maxprm][+][.nolist] [defaults]
+ <some lines of macro expansion text>
+ %endmacro
+
+Again, these macros may be overloaded. The trailing plus sign indicates that
+any parameters after the last one get subsumed, with their separating commas,
+into the last parameter. The 'defaults' part can be used to specify defaults for
+unspecified macro parameters after 'minparam'. '%endm' is a valid synonym for
+'%endmacro'.
+
+To refer to the macro parameters within a macro expansion, you use '%1', '%2' and
+so on. You can also enforce that a macro parameter should contain a condition
+code by using '%+1', and you can invert the condition code by using '%-1'. You can also
+define a label specific to a macro invocation by prefixing it with a double `%' sign.
+
+Files can be included using the '%include' directive, which works like C.
+
+The preprocessor has a `context stack', which may be used by one macro to store
+information that a later one will retrieve. You can push a context on the stack
+using '%push', remove one using '%pop', and change the name of the top context (without
+disturbing any associated definitions) using '%repl'. Labels and '%define' macros
+specific to the top context may be defined by prefixing their names with %$,
+and things specific to the next context down with %$$, and so on.
+
+Conditional assembly is done by means of '%ifdef', '%ifndef', '%else' and '%endif'
+as in C. (Except that '%ifdef' can accept several putative macro names, and
+will evaluate TRUE if any of them is defined.) In addition, the directives
+'%ifctx' and '%ifnctx' can be used to condition on the name of the top context
+on the context stack. The obvious set of `else-if' directives, '%elifdef',
+'%elifndef', '%elifctx' and '%elifnctx' are also supported.
+
+BUGS
+----
+Please report bugs through the bug tracker function at http://nasm.us.
+
+SEE ALSO
+--------
+*as*(1), *ld*(1).
diff --git a/nasm_assemble.gni b/nasm_assemble.gni
new file mode 100644
index 00000000..902a6320
--- /dev/null
+++ b/nasm_assemble.gni
@@ -0,0 +1,172 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This provides the nasm_assemble() template which uses NASM to assemble
+# assembly files.
+#
+# Files to be assembled with NASM should have an extension of .asm.
+#
+# Parameters
+#
+# nasm_flags (optional)
+# [list of strings] Pass additional flags into NASM. These are appended
+# to the command line. Note that the output format is already set up
+# based on the current toolchain so you don't need to specify these
+# things (see below).
+#
+# Example: nasm_flags = [ "-Wall" ]
+#
+# include_dirs (optional)
+# [list of dir names] List of additional include dirs. Note that the
+# source root and the root generated file dir is always added, just like
+# our C++ build sets up.
+#
+# Example: include_dirs = [ "//some/other/path", target_gen_dir ]
+#
+# defines (optional)
+# [list of strings] List of defines, as with the native code defines.
+#
+# Example: defines = [ "FOO", "BAR=1" ]
+#
+# inputs, deps, visibility (optional)
+# These have the same meaning as in an action.
+#
+# Example
+#
+# nasm_assemble("my_nasm_target") {
+# sources = [
+# "ultra_optimized_awesome.asm",
+# ]
+# include_dirs = [ "assembly_include" ]
+# }
+
+import("//build/compiled_action.gni")
+
+if (is_mac || is_ios) {
+ if (current_cpu == "x86") {
+ _nasm_flags = [ "-fmacho32" ]
+ } else if (current_cpu == "x64") {
+ _nasm_flags = [ "-fmacho64" ]
+ }
+} else if (is_posix || is_fuchsia) {
+ if (current_cpu == "x86") {
+ _nasm_flags = [ "-felf32" ]
+ } else if (current_cpu == "x64") {
+ _nasm_flags = [
+ "-DPIC",
+ "-felf64",
+ ]
+ }
+} else if (is_win) {
+ if (current_cpu == "x86") {
+ _nasm_flags = [
+ "-DPREFIX",
+ "-fwin32",
+ ]
+ } else if (current_cpu == "x64") {
+ _nasm_flags = [ "-fwin64" ]
+ }
+}
+
+if (is_win) {
+ asm_obj_extension = "obj"
+} else {
+ asm_obj_extension = "o"
+}
+
+template("nasm_assemble") {
+ assert(defined(invoker.sources), "Need sources defined for $target_name")
+
+ # Only depend on NASM on x86 systems. Force compilation of .asm files for
+ # ARM to fail.
+ assert(current_cpu == "x86" || current_cpu == "x64")
+
+ action_name = "${target_name}_action"
+ source_set_name = target_name
+
+ compiled_action_foreach(action_name) {
+ # Only the source set can depend on this.
+ visibility = [ ":$source_set_name" ]
+
+ tool = "//third_party/nasm"
+
+ forward_variables_from(invoker,
+ [
+ "sources",
+ "inputs",
+ "deps",
+ ])
+
+ # Flags.
+ args = _nasm_flags
+ if (defined(invoker.nasm_flags)) {
+ args += invoker.nasm_flags
+ }
+
+ # User defined include dirs go first.
+ if (defined(invoker.include_dirs)) {
+ foreach(include, invoker.include_dirs) {
+ # NASM does not append path separators when processing the -I flags, so
+ # -Ifoo means includes of bar look up "foobar" rather than "foo/bar".
+ # Add the trailing slash for it.
+ args += [ "-I" + rebase_path(include, root_build_dir) + "/" ]
+ }
+ }
+
+ # Default nasm include dirs. Make it match the native build (source root and
+ # root generated code directory).
+ # This goes to the end of include list. Note that, as above, we must append
+ # path separators because NASM does not do it itself.
+ args += [
+ "-I./",
+
+ # rebase_path("//") already includes a trailing slash.
+ "-I" + rebase_path("//", root_build_dir),
+ "-I" + rebase_path(root_gen_dir, root_build_dir) + "/",
+ ]
+
+ # Extra defines.
+ if (defined(invoker.defines)) {
+ foreach(def, invoker.defines) {
+ args += [ "-D$def" ]
+ }
+ }
+
+ # Output file.
+ outputs = [
+ "$target_out_dir/$source_set_name/{{source_name_part}}.o",
+ ]
+ args += [
+ "-MD",
+ rebase_path(outputs[0] + ".d", root_build_dir),
+ "-o",
+ rebase_path(outputs[0], root_build_dir),
+ "{{source}}",
+ ]
+
+ depfile = outputs[0] + ".d"
+ }
+
+ # Gather the .o files into a linkable thing. This doesn't actually link
+ # anything (a source set just compiles files to link later), but will pass
+ # the object files generated by the action up the dependency chain.
+ static_library(source_set_name) {
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
+
+ if (defined(invoker.all_dependent_configs)) {
+ all_dependent_configs = invoker.all_dependent_configs
+ }
+
+ sources = get_target_outputs(":$action_name")
+
+ # Do not publicize any header to remove build dependency.
+ public = []
+
+ deps = [
+ ":$action_name",
+ ]
+ }
+}
diff --git a/nasm_sources.gni b/nasm_sources.gni
new file mode 100644
index 00000000..93742d82
--- /dev/null
+++ b/nasm_sources.gni
@@ -0,0 +1,89 @@
+# Copyright (c) 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file is created by generate_nasm_sources.py. Do not edit manually.
+
+ndisasm_sources = [ "disasm/ndisasm.c" ]
+nasmlib_sources = [
+ "asm/assemble.c",
+ "asm/directbl.c",
+ "asm/directiv.c",
+ "asm/error.c",
+ "asm/eval.c",
+ "asm/exprdump.c",
+ "asm/exprlib.c",
+ "asm/float.c",
+ "asm/labels.c",
+ "asm/listing.c",
+ "asm/parser.c",
+ "asm/pptok.c",
+ "asm/pragma.c",
+ "asm/preproc-nop.c",
+ "asm/preproc.c",
+ "asm/quote.c",
+ "asm/rdstrnum.c",
+ "asm/segalloc.c",
+ "asm/stdscan.c",
+ "asm/strfunc.c",
+ "asm/tokhash.c",
+ "common/common.c",
+ "disasm/disasm.c",
+ "disasm/sync.c",
+ "macros/macros.c",
+ "nasmlib/badenum.c",
+ "nasmlib/bsi.c",
+ "nasmlib/crc64.c",
+ "nasmlib/file.c",
+ "nasmlib/filename.c",
+ "nasmlib/hashtbl.c",
+ "nasmlib/ilog2.c",
+ "nasmlib/malloc.c",
+ "nasmlib/md5c.c",
+ "nasmlib/mmap.c",
+ "nasmlib/path.c",
+ "nasmlib/perfhash.c",
+ "nasmlib/raa.c",
+ "nasmlib/rbtree.c",
+ "nasmlib/readnum.c",
+ "nasmlib/realpath.c",
+ "nasmlib/saa.c",
+ "nasmlib/srcfile.c",
+ "nasmlib/string.c",
+ "nasmlib/strlist.c",
+ "nasmlib/ver.c",
+ "nasmlib/zerobuf.c",
+ "output/codeview.c",
+ "output/legacy.c",
+ "output/nulldbg.c",
+ "output/nullout.c",
+ "output/outaout.c",
+ "output/outas86.c",
+ "output/outbin.c",
+ "output/outcoff.c",
+ "output/outdbg.c",
+ "output/outelf.c",
+ "output/outform.c",
+ "output/outieee.c",
+ "output/outlib.c",
+ "output/outmacho.c",
+ "output/outobj.c",
+ "output/outrdf2.c",
+ "output/strtbl.c",
+ "stdlib/snprintf.c",
+ "stdlib/strlcpy.c",
+ "stdlib/strnlen.c",
+ "stdlib/strrchrnul.c",
+ "stdlib/vsnprintf.c",
+ "x86/disp8.c",
+ "x86/iflag.c",
+ "x86/insnsa.c",
+ "x86/insnsb.c",
+ "x86/insnsd.c",
+ "x86/insnsn.c",
+ "x86/regdis.c",
+ "x86/regflags.c",
+ "x86/regs.c",
+ "x86/regvals.c",
+]
+nasm_sources = [ "asm/nasm.c" ]
diff --git a/nasmlib/badenum.c b/nasmlib/badenum.c
new file mode 100644
index 00000000..6f880c85
--- /dev/null
+++ b/nasmlib/badenum.c
@@ -0,0 +1,43 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "nasmlib.h"
+
+/* Used to avoid returning NULL to a debug printing function */
+const char *invalid_enum_str(int x)
+{
+ static char buf[64];
+
+ snprintf(buf, sizeof buf, "<invalid %d>", x);
+ return buf;
+}
diff --git a/nasmlib/bsi.c b/nasmlib/bsi.c
new file mode 100644
index 00000000..a811e45e
--- /dev/null
+++ b/nasmlib/bsi.c
@@ -0,0 +1,77 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <string.h>
+
+#include "nasmlib.h"
+
+/*
+ * Binary search.
+ */
+int bsi(const char *string, const char **array, int size)
+{
+ int i = -1, j = size; /* always, i < index < j */
+ while (j - i >= 2) {
+ int k = (i + j) / 2;
+ int l = strcmp(string, array[k]);
+ if (l < 0) /* it's in the first half */
+ j = k;
+ else if (l > 0) /* it's in the second half */
+ i = k;
+ else /* we've got it :) */
+ return k;
+ }
+ return -1; /* we haven't got it :( */
+}
+
+int bsii(const char *string, const char **array, int size)
+{
+ int i = -1, j = size; /* always, i < index < j */
+ while (j - i >= 2) {
+ int k = (i + j) / 2;
+ int l = nasm_stricmp(string, array[k]);
+ if (l < 0) /* it's in the first half */
+ j = k;
+ else if (l > 0) /* it's in the second half */
+ i = k;
+ else /* we've got it :) */
+ return k;
+ }
+ return -1; /* we haven't got it :( */
+}
diff --git a/nasmlib/crc64.c b/nasmlib/crc64.c
new file mode 100644
index 00000000..338e0be4
--- /dev/null
+++ b/nasmlib/crc64.c
@@ -0,0 +1,189 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "hashtbl.h"
+
+static const uint64_t crc64_tab[256] = {
+ UINT64_C(0x0000000000000000), UINT64_C(0x7ad870c830358979),
+ UINT64_C(0xf5b0e190606b12f2), UINT64_C(0x8f689158505e9b8b),
+ UINT64_C(0xc038e5739841b68f), UINT64_C(0xbae095bba8743ff6),
+ UINT64_C(0x358804e3f82aa47d), UINT64_C(0x4f50742bc81f2d04),
+ UINT64_C(0xab28ecb46814fe75), UINT64_C(0xd1f09c7c5821770c),
+ UINT64_C(0x5e980d24087fec87), UINT64_C(0x24407dec384a65fe),
+ UINT64_C(0x6b1009c7f05548fa), UINT64_C(0x11c8790fc060c183),
+ UINT64_C(0x9ea0e857903e5a08), UINT64_C(0xe478989fa00bd371),
+ UINT64_C(0x7d08ff3b88be6f81), UINT64_C(0x07d08ff3b88be6f8),
+ UINT64_C(0x88b81eabe8d57d73), UINT64_C(0xf2606e63d8e0f40a),
+ UINT64_C(0xbd301a4810ffd90e), UINT64_C(0xc7e86a8020ca5077),
+ UINT64_C(0x4880fbd87094cbfc), UINT64_C(0x32588b1040a14285),
+ UINT64_C(0xd620138fe0aa91f4), UINT64_C(0xacf86347d09f188d),
+ UINT64_C(0x2390f21f80c18306), UINT64_C(0x594882d7b0f40a7f),
+ UINT64_C(0x1618f6fc78eb277b), UINT64_C(0x6cc0863448deae02),
+ UINT64_C(0xe3a8176c18803589), UINT64_C(0x997067a428b5bcf0),
+ UINT64_C(0xfa11fe77117cdf02), UINT64_C(0x80c98ebf2149567b),
+ UINT64_C(0x0fa11fe77117cdf0), UINT64_C(0x75796f2f41224489),
+ UINT64_C(0x3a291b04893d698d), UINT64_C(0x40f16bccb908e0f4),
+ UINT64_C(0xcf99fa94e9567b7f), UINT64_C(0xb5418a5cd963f206),
+ UINT64_C(0x513912c379682177), UINT64_C(0x2be1620b495da80e),
+ UINT64_C(0xa489f35319033385), UINT64_C(0xde51839b2936bafc),
+ UINT64_C(0x9101f7b0e12997f8), UINT64_C(0xebd98778d11c1e81),
+ UINT64_C(0x64b116208142850a), UINT64_C(0x1e6966e8b1770c73),
+ UINT64_C(0x8719014c99c2b083), UINT64_C(0xfdc17184a9f739fa),
+ UINT64_C(0x72a9e0dcf9a9a271), UINT64_C(0x08719014c99c2b08),
+ UINT64_C(0x4721e43f0183060c), UINT64_C(0x3df994f731b68f75),
+ UINT64_C(0xb29105af61e814fe), UINT64_C(0xc849756751dd9d87),
+ UINT64_C(0x2c31edf8f1d64ef6), UINT64_C(0x56e99d30c1e3c78f),
+ UINT64_C(0xd9810c6891bd5c04), UINT64_C(0xa3597ca0a188d57d),
+ UINT64_C(0xec09088b6997f879), UINT64_C(0x96d1784359a27100),
+ UINT64_C(0x19b9e91b09fcea8b), UINT64_C(0x636199d339c963f2),
+ UINT64_C(0xdf7adabd7a6e2d6f), UINT64_C(0xa5a2aa754a5ba416),
+ UINT64_C(0x2aca3b2d1a053f9d), UINT64_C(0x50124be52a30b6e4),
+ UINT64_C(0x1f423fcee22f9be0), UINT64_C(0x659a4f06d21a1299),
+ UINT64_C(0xeaf2de5e82448912), UINT64_C(0x902aae96b271006b),
+ UINT64_C(0x74523609127ad31a), UINT64_C(0x0e8a46c1224f5a63),
+ UINT64_C(0x81e2d7997211c1e8), UINT64_C(0xfb3aa75142244891),
+ UINT64_C(0xb46ad37a8a3b6595), UINT64_C(0xceb2a3b2ba0eecec),
+ UINT64_C(0x41da32eaea507767), UINT64_C(0x3b024222da65fe1e),
+ UINT64_C(0xa2722586f2d042ee), UINT64_C(0xd8aa554ec2e5cb97),
+ UINT64_C(0x57c2c41692bb501c), UINT64_C(0x2d1ab4dea28ed965),
+ UINT64_C(0x624ac0f56a91f461), UINT64_C(0x1892b03d5aa47d18),
+ UINT64_C(0x97fa21650afae693), UINT64_C(0xed2251ad3acf6fea),
+ UINT64_C(0x095ac9329ac4bc9b), UINT64_C(0x7382b9faaaf135e2),
+ UINT64_C(0xfcea28a2faafae69), UINT64_C(0x8632586aca9a2710),
+ UINT64_C(0xc9622c4102850a14), UINT64_C(0xb3ba5c8932b0836d),
+ UINT64_C(0x3cd2cdd162ee18e6), UINT64_C(0x460abd1952db919f),
+ UINT64_C(0x256b24ca6b12f26d), UINT64_C(0x5fb354025b277b14),
+ UINT64_C(0xd0dbc55a0b79e09f), UINT64_C(0xaa03b5923b4c69e6),
+ UINT64_C(0xe553c1b9f35344e2), UINT64_C(0x9f8bb171c366cd9b),
+ UINT64_C(0x10e3202993385610), UINT64_C(0x6a3b50e1a30ddf69),
+ UINT64_C(0x8e43c87e03060c18), UINT64_C(0xf49bb8b633338561),
+ UINT64_C(0x7bf329ee636d1eea), UINT64_C(0x012b592653589793),
+ UINT64_C(0x4e7b2d0d9b47ba97), UINT64_C(0x34a35dc5ab7233ee),
+ UINT64_C(0xbbcbcc9dfb2ca865), UINT64_C(0xc113bc55cb19211c),
+ UINT64_C(0x5863dbf1e3ac9dec), UINT64_C(0x22bbab39d3991495),
+ UINT64_C(0xadd33a6183c78f1e), UINT64_C(0xd70b4aa9b3f20667),
+ UINT64_C(0x985b3e827bed2b63), UINT64_C(0xe2834e4a4bd8a21a),
+ UINT64_C(0x6debdf121b863991), UINT64_C(0x1733afda2bb3b0e8),
+ UINT64_C(0xf34b37458bb86399), UINT64_C(0x8993478dbb8deae0),
+ UINT64_C(0x06fbd6d5ebd3716b), UINT64_C(0x7c23a61ddbe6f812),
+ UINT64_C(0x3373d23613f9d516), UINT64_C(0x49aba2fe23cc5c6f),
+ UINT64_C(0xc6c333a67392c7e4), UINT64_C(0xbc1b436e43a74e9d),
+ UINT64_C(0x95ac9329ac4bc9b5), UINT64_C(0xef74e3e19c7e40cc),
+ UINT64_C(0x601c72b9cc20db47), UINT64_C(0x1ac40271fc15523e),
+ UINT64_C(0x5594765a340a7f3a), UINT64_C(0x2f4c0692043ff643),
+ UINT64_C(0xa02497ca54616dc8), UINT64_C(0xdafce7026454e4b1),
+ UINT64_C(0x3e847f9dc45f37c0), UINT64_C(0x445c0f55f46abeb9),
+ UINT64_C(0xcb349e0da4342532), UINT64_C(0xb1eceec59401ac4b),
+ UINT64_C(0xfebc9aee5c1e814f), UINT64_C(0x8464ea266c2b0836),
+ UINT64_C(0x0b0c7b7e3c7593bd), UINT64_C(0x71d40bb60c401ac4),
+ UINT64_C(0xe8a46c1224f5a634), UINT64_C(0x927c1cda14c02f4d),
+ UINT64_C(0x1d148d82449eb4c6), UINT64_C(0x67ccfd4a74ab3dbf),
+ UINT64_C(0x289c8961bcb410bb), UINT64_C(0x5244f9a98c8199c2),
+ UINT64_C(0xdd2c68f1dcdf0249), UINT64_C(0xa7f41839ecea8b30),
+ UINT64_C(0x438c80a64ce15841), UINT64_C(0x3954f06e7cd4d138),
+ UINT64_C(0xb63c61362c8a4ab3), UINT64_C(0xcce411fe1cbfc3ca),
+ UINT64_C(0x83b465d5d4a0eece), UINT64_C(0xf96c151de49567b7),
+ UINT64_C(0x76048445b4cbfc3c), UINT64_C(0x0cdcf48d84fe7545),
+ UINT64_C(0x6fbd6d5ebd3716b7), UINT64_C(0x15651d968d029fce),
+ UINT64_C(0x9a0d8ccedd5c0445), UINT64_C(0xe0d5fc06ed698d3c),
+ UINT64_C(0xaf85882d2576a038), UINT64_C(0xd55df8e515432941),
+ UINT64_C(0x5a3569bd451db2ca), UINT64_C(0x20ed197575283bb3),
+ UINT64_C(0xc49581ead523e8c2), UINT64_C(0xbe4df122e51661bb),
+ UINT64_C(0x3125607ab548fa30), UINT64_C(0x4bfd10b2857d7349),
+ UINT64_C(0x04ad64994d625e4d), UINT64_C(0x7e7514517d57d734),
+ UINT64_C(0xf11d85092d094cbf), UINT64_C(0x8bc5f5c11d3cc5c6),
+ UINT64_C(0x12b5926535897936), UINT64_C(0x686de2ad05bcf04f),
+ UINT64_C(0xe70573f555e26bc4), UINT64_C(0x9ddd033d65d7e2bd),
+ UINT64_C(0xd28d7716adc8cfb9), UINT64_C(0xa85507de9dfd46c0),
+ UINT64_C(0x273d9686cda3dd4b), UINT64_C(0x5de5e64efd965432),
+ UINT64_C(0xb99d7ed15d9d8743), UINT64_C(0xc3450e196da80e3a),
+ UINT64_C(0x4c2d9f413df695b1), UINT64_C(0x36f5ef890dc31cc8),
+ UINT64_C(0x79a59ba2c5dc31cc), UINT64_C(0x037deb6af5e9b8b5),
+ UINT64_C(0x8c157a32a5b7233e), UINT64_C(0xf6cd0afa9582aa47),
+ UINT64_C(0x4ad64994d625e4da), UINT64_C(0x300e395ce6106da3),
+ UINT64_C(0xbf66a804b64ef628), UINT64_C(0xc5bed8cc867b7f51),
+ UINT64_C(0x8aeeace74e645255), UINT64_C(0xf036dc2f7e51db2c),
+ UINT64_C(0x7f5e4d772e0f40a7), UINT64_C(0x05863dbf1e3ac9de),
+ UINT64_C(0xe1fea520be311aaf), UINT64_C(0x9b26d5e88e0493d6),
+ UINT64_C(0x144e44b0de5a085d), UINT64_C(0x6e963478ee6f8124),
+ UINT64_C(0x21c640532670ac20), UINT64_C(0x5b1e309b16452559),
+ UINT64_C(0xd476a1c3461bbed2), UINT64_C(0xaeaed10b762e37ab),
+ UINT64_C(0x37deb6af5e9b8b5b), UINT64_C(0x4d06c6676eae0222),
+ UINT64_C(0xc26e573f3ef099a9), UINT64_C(0xb8b627f70ec510d0),
+ UINT64_C(0xf7e653dcc6da3dd4), UINT64_C(0x8d3e2314f6efb4ad),
+ UINT64_C(0x0256b24ca6b12f26), UINT64_C(0x788ec2849684a65f),
+ UINT64_C(0x9cf65a1b368f752e), UINT64_C(0xe62e2ad306bafc57),
+ UINT64_C(0x6946bb8b56e467dc), UINT64_C(0x139ecb4366d1eea5),
+ UINT64_C(0x5ccebf68aecec3a1), UINT64_C(0x2616cfa09efb4ad8),
+ UINT64_C(0xa97e5ef8cea5d153), UINT64_C(0xd3a62e30fe90582a),
+ UINT64_C(0xb0c7b7e3c7593bd8), UINT64_C(0xca1fc72bf76cb2a1),
+ UINT64_C(0x45775673a732292a), UINT64_C(0x3faf26bb9707a053),
+ UINT64_C(0x70ff52905f188d57), UINT64_C(0x0a2722586f2d042e),
+ UINT64_C(0x854fb3003f739fa5), UINT64_C(0xff97c3c80f4616dc),
+ UINT64_C(0x1bef5b57af4dc5ad), UINT64_C(0x61372b9f9f784cd4),
+ UINT64_C(0xee5fbac7cf26d75f), UINT64_C(0x9487ca0fff135e26),
+ UINT64_C(0xdbd7be24370c7322), UINT64_C(0xa10fceec0739fa5b),
+ UINT64_C(0x2e675fb4576761d0), UINT64_C(0x54bf2f7c6752e8a9),
+ UINT64_C(0xcdcf48d84fe75459), UINT64_C(0xb71738107fd2dd20),
+ UINT64_C(0x387fa9482f8c46ab), UINT64_C(0x42a7d9801fb9cfd2),
+ UINT64_C(0x0df7adabd7a6e2d6), UINT64_C(0x772fdd63e7936baf),
+ UINT64_C(0xf8474c3bb7cdf024), UINT64_C(0x829f3cf387f8795d),
+ UINT64_C(0x66e7a46c27f3aa2c), UINT64_C(0x1c3fd4a417c62355),
+ UINT64_C(0x935745fc4798b8de), UINT64_C(0xe98f353477ad31a7),
+ UINT64_C(0xa6df411fbfb21ca3), UINT64_C(0xdc0731d78f8795da),
+ UINT64_C(0x536fa08fdfd90e51), UINT64_C(0x29b7d047efec8728),
+};
+
+uint64_t crc64(uint64_t crc, const char *str)
+{
+ uint8_t c;
+
+ while ((c = *str++) != 0) {
+ crc = crc64_tab[(uint8_t)crc ^ c] ^ (crc >> 8);
+ }
+
+ return crc;
+}
+
+uint64_t crc64i(uint64_t crc, const char *str)
+{
+ uint8_t c;
+
+ while ((c = *str++) != 0) {
+ crc = crc64_tab[(uint8_t)crc ^ nasm_tolower(c)] ^ (crc >> 8);
+ }
+
+ return crc;
+}
diff --git a/nasmlib/file.c b/nasmlib/file.c
new file mode 100644
index 00000000..c7bd1a62
--- /dev/null
+++ b/nasmlib/file.c
@@ -0,0 +1,228 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "file.h"
+
+void nasm_read(void *ptr, size_t size, FILE *f)
+{
+ size_t n = fread(ptr, 1, size, f);
+ if (ferror(f)) {
+ nasm_fatal("unable to read input: %s", strerror(errno));
+ } else if (n != size || feof(f)) {
+ nasm_fatal("fatal short read on input");
+ }
+}
+
+void nasm_write(const void *ptr, size_t size, FILE *f)
+{
+ size_t n = fwrite(ptr, 1, size, f);
+ if (n != size || ferror(f) || feof(f))
+ nasm_fatal("unable to write output: %s", strerror(errno));
+}
+
+void fwriteint16_t(uint16_t data, FILE * fp)
+{
+ data = cpu_to_le16(data);
+ nasm_write(&data, 2, fp);
+}
+
+void fwriteint32_t(uint32_t data, FILE * fp)
+{
+ data = cpu_to_le32(data);
+ nasm_write(&data, 4, fp);
+}
+
+void fwriteint64_t(uint64_t data, FILE * fp)
+{
+ data = cpu_to_le64(data);
+ nasm_write(&data, 8, fp);
+}
+
+void fwriteaddr(uint64_t data, int size, FILE * fp)
+{
+ data = cpu_to_le64(data);
+ nasm_write(&data, size, fp);
+}
+
+void fwritezero(off_t bytes, FILE *fp)
+{
+ size_t blksize;
+
+#ifdef nasm_ftruncate
+ if (bytes >= BUFSIZ && !ferror(fp) && !feof(fp)) {
+ off_t pos = ftello(fp);
+ if (pos >= 0) {
+ pos += bytes;
+ if (!fflush(fp) &&
+ !nasm_ftruncate(fileno(fp), pos) &&
+ !fseeko(fp, pos, SEEK_SET))
+ return;
+ }
+ }
+#endif
+
+ while (bytes > 0) {
+ blksize = (bytes < ZERO_BUF_SIZE) ? bytes : ZERO_BUF_SIZE;
+
+ nasm_write(zero_buffer, blksize, fp);
+ bytes -= blksize;
+ }
+}
+
+FILE *nasm_open_read(const char *filename, enum file_flags flags)
+{
+ FILE *f = NULL;
+ bool again = true;
+
+#ifdef __GLIBC__
+ /*
+ * Try to open this file with memory mapping for speed, unless we are
+ * going to do it "manually" with nasm_map_file()
+ */
+ if (!(flags & NF_FORMAP)) {
+ f = fopen(filename, (flags & NF_TEXT) ? "rtm" : "rbm");
+ again = (!f) && (errno == EINVAL); /* Not supported, try without m */
+ }
+#endif
+
+ if (again)
+ f = fopen(filename, (flags & NF_TEXT) ? "rt" : "rb");
+
+ if (!f && (flags & NF_FATAL))
+ nasm_fatal_fl(ERR_NOFILE, "unable to open input file: `%s': %s",
+ filename, strerror(errno));
+
+ return f;
+}
+
+FILE *nasm_open_write(const char *filename, enum file_flags flags)
+{
+ FILE *f;
+
+ f = fopen(filename, (flags & NF_TEXT) ? "wt" : "wb");
+
+ if (!f && (flags & NF_FATAL))
+ nasm_fatal_fl(ERR_NOFILE, "unable to open output file: `%s': %s",
+ filename, strerror(errno));
+
+ return f;
+}
+
+/*
+ * Report the existence of a file
+ */
+bool nasm_file_exists(const char *filename)
+{
+#if defined(HAVE_FACCESSAT) && defined(AT_EACCESS)
+ return faccessat(AT_FDCWD, filename, R_OK, AT_EACCESS) == 0;
+#elif defined(HAVE_ACCESS)
+ return access(filename, R_OK) == 0;
+#else
+ FILE *f;
+
+ f = fopen(filename, "rb");
+ if (f) {
+ fclose(f);
+ return true;
+ } else {
+ return false;
+ }
+#endif
+}
+
+/*
+ * Report file size. This MAY move the file pointer.
+ */
+off_t nasm_file_size(FILE *f)
+{
+#ifdef HAVE__FILELENGTHI64
+ return _filelengthi64(fileno(f));
+#elif defined(nasm_fstat)
+ nasm_struct_stat st;
+
+ if (nasm_fstat(fileno(f), &st))
+ return (off_t)-1;
+
+ return st.st_size;
+#else
+ if (fseeko(f, 0, SEEK_END))
+ return (off_t)-1;
+
+ return ftello(f);
+#endif
+}
+
+/*
+ * Report file size given pathname
+ */
+off_t nasm_file_size_by_path(const char *pathname)
+{
+#ifdef nasm_stat
+ nasm_struct_stat st;
+
+ if (nasm_stat(pathname, &st))
+ return (off_t)-1;
+
+ return st.st_size;
+#else
+ FILE *fp;
+ off_t len;
+
+ fp = nasm_open_read(pathname, NF_BINARY);
+ if (!fp)
+ return (off_t)-1;
+
+ len = nasm_file_size(fp);
+ fclose(fp);
+
+ return len;
+#endif
+}
+
+/*
+ * Report the timestamp on a file, returns true if successful
+ */
+bool nasm_file_time(time_t *t, const char *pathname)
+{
+#ifdef nasm_stat
+ nasm_struct_stat st;
+
+ if (nasm_stat(pathname, &st))
+ return false;
+
+ *t = st.st_mtime;
+ return true;
+#else
+ return false; /* No idea how to do this on this OS */
+#endif
+}
diff --git a/nasmlib/file.h b/nasmlib/file.h
new file mode 100644
index 00000000..4069ec64
--- /dev/null
+++ b/nasmlib/file.h
@@ -0,0 +1,128 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASMLIB_FILE_H
+#define NASMLIB_FILE_H
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "error.h"
+
+#include <errno.h>
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_IO_H
+# include <io.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
+
+#if !defined(HAVE_ACCESS) && defined(HAVE__ACCESS)
+# define HAVE_ACCESS 1
+# define access _access
+#endif
+#ifndef R_OK
+# define R_OK 4 /* Classic Unix constant, same on Windows */
+#endif
+
+/* Can we adjust the file size without actually writing all the bytes? */
+#ifdef HAVE__CHSIZE_S
+# define nasm_ftruncate(fd,size) _chsize_s(fd,size)
+#elif defined(HAVE__CHSIZE)
+# define nasm_ftruncate(fd,size) _chsize(fd,size)
+#elif defined(HAVE_FTRUNCATE)
+# define nasm_ftruncate(fd,size) ftruncate(fd,size)
+#endif
+
+/*
+ * On Win32/64, stat has a 32-bit file size but _stati64 has a 64-bit file
+ * size. Things get complicated because some of these may be macros,
+ * which autoconf won't pick up on as the standard autoconf tests do
+ * #undef.
+ */
+#ifdef _stati64
+# define HAVE_STRUCT__STATI64 1
+# define HAVE__STATI64 1
+#endif
+#ifdef _fstati64
+# define HAVE__FSTATI64 1
+#endif
+
+#ifdef HAVE_STRUCT__STATI64
+typedef struct _stati64 nasm_struct_stat;
+# ifdef HAVE__STATI64
+# define nasm_stat _stati64
+# endif
+# ifdef HAVE__FSTATI64
+# define nasm_fstat _fstati64
+# endif
+#elif defined(HAVE_STRUCT_STAT)
+typedef struct stat nasm_struct_stat;
+# ifdef HAVE_STAT
+# define nasm_stat stat
+# endif
+# ifdef HAVE_FSTAT
+# define nasm_fstat fstat
+# endif
+#endif
+
+#ifndef HAVE_FILENO
+# ifdef fileno /* autoconf doesn't always pick up macros */
+# define HAVE_FILENO 1
+# elif defined(HAVE__FILENO)
+# define HAVE_FILENO 1
+# define fileno _fileno
+# endif
+#endif
+
+/* These functions are utterly useless without fileno() */
+#ifndef HAVE_FILENO
+# undef nasm_fstat
+# undef nasm_ftruncate
+# undef HAVE_MMAP
+# undef HAVE__FILELENGTHI64
+#endif
+
+#endif /* NASMLIB_FILE_H */
diff --git a/nasmlib/filename.c b/nasmlib/filename.c
new file mode 100644
index 00000000..172ae0bc
--- /dev/null
+++ b/nasmlib/filename.c
@@ -0,0 +1,63 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "error.h"
+
+/*
+ * Add/modify a filename extension, assumed to be a period-delimited
+ * field at the very end of the filename. Returns a newly allocated
+ * string buffer.
+ */
+const char *filename_set_extension(const char *inname, const char *extension)
+{
+ const char *q = inname;
+ char *p;
+ size_t elen = strlen(extension);
+ size_t baselen;
+
+ q = strrchrnul(inname, '.'); /* find extension or end of string */
+ baselen = q - inname;
+
+ p = nasm_malloc(baselen + elen + 1);
+
+ memcpy(p, inname, baselen);
+ memcpy(p+baselen, extension, elen+1);
+
+ return p;
+}
diff --git a/nasmlib/hashtbl.c b/nasmlib/hashtbl.c
new file mode 100644
index 00000000..bc0776b8
--- /dev/null
+++ b/nasmlib/hashtbl.c
@@ -0,0 +1,256 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * hashtbl.c
+ *
+ * Efficient dictionary hash table class.
+ */
+
+#include "compiler.h"
+
+#include <string.h>
+#include "nasm.h"
+#include "hashtbl.h"
+
+#define HASH_MAX_LOAD 2 /* Higher = more memory-efficient, slower */
+
+#define hash_calc(key) crc64(CRC64_INIT, (key))
+#define hash_calci(key) crc64i(CRC64_INIT, (key))
+#define hash_max_load(size) ((size) * (HASH_MAX_LOAD - 1) / HASH_MAX_LOAD)
+#define hash_expand(size) ((size) << 1)
+#define hash_mask(size) ((size) - 1)
+#define hash_pos(hash, mask) ((hash) & (mask))
+#define hash_inc(hash, mask) ((((hash) >> 32) & (mask)) | 1) /* always odd */
+#define hash_pos_next(pos, inc, mask) (((pos) + (inc)) & (mask))
+
+static struct hash_tbl_node *alloc_table(size_t newsize)
+{
+ size_t bytes = newsize * sizeof(struct hash_tbl_node);
+ return nasm_zalloc(bytes);
+}
+
+void hash_init(struct hash_table *head, size_t size)
+{
+ nasm_assert(is_power2(size));
+ head->table = alloc_table(size);
+ head->load = 0;
+ head->size = size;
+ head->max_load = hash_max_load(size);
+}
+
+/*
+ * Find an entry in a hash table.
+ *
+ * On failure, if "insert" is non-NULL, store data in that structure
+ * which can be used to insert that node using hash_add().
+ *
+ * WARNING: this data is only valid until the very next call of
+ * hash_add(); it cannot be "saved" to a later date.
+ *
+ * On success, return a pointer to the "data" element of the hash
+ * structure.
+ */
+void **hash_find(struct hash_table *head, const char *key,
+ struct hash_insert *insert)
+{
+ struct hash_tbl_node *np;
+ struct hash_tbl_node *tbl = head->table;
+ uint64_t hash = hash_calc(key);
+ size_t mask = hash_mask(head->size);
+ size_t pos = hash_pos(hash, mask);
+ size_t inc = hash_inc(hash, mask);
+
+ while ((np = &tbl[pos])->key) {
+ if (hash == np->hash && !strcmp(key, np->key))
+ return &np->data;
+ pos = hash_pos_next(pos, inc, mask);
+ }
+
+ /* Not found. Store info for insert if requested. */
+ if (insert) {
+ insert->head = head;
+ insert->hash = hash;
+ insert->where = np;
+ }
+ return NULL;
+}
+
+/*
+ * Same as hash_find, but for case-insensitive hashing.
+ */
+void **hash_findi(struct hash_table *head, const char *key,
+ struct hash_insert *insert)
+{
+ struct hash_tbl_node *np;
+ struct hash_tbl_node *tbl = head->table;
+ uint64_t hash = hash_calci(key);
+ size_t mask = hash_mask(head->size);
+ size_t pos = hash_pos(hash, mask);
+ size_t inc = hash_inc(hash, mask);
+
+ while ((np = &tbl[pos])->key) {
+ if (hash == np->hash && !nasm_stricmp(key, np->key))
+ return &np->data;
+ pos = hash_pos_next(pos, inc, mask);
+ }
+
+ /* Not found. Store info for insert if requested. */
+ if (insert) {
+ insert->head = head;
+ insert->hash = hash;
+ insert->where = np;
+ }
+ return NULL;
+}
+
+/*
+ * Insert node. Return a pointer to the "data" element of the newly
+ * created hash node.
+ */
+void **hash_add(struct hash_insert *insert, const char *key, void *data)
+{
+ struct hash_table *head = insert->head;
+ struct hash_tbl_node *np = insert->where;
+
+ /*
+ * Insert node. We can always do this, even if we need to
+ * rebalance immediately after.
+ */
+ np->hash = insert->hash;
+ np->key = key;
+ np->data = data;
+
+ if (++head->load > head->max_load) {
+ /* Need to expand the table */
+ size_t newsize = hash_expand(head->size);
+ struct hash_tbl_node *newtbl = alloc_table(newsize);
+ size_t mask = hash_mask(newsize);
+
+ if (head->table) {
+ struct hash_tbl_node *op, *xp;
+ size_t i;
+
+ /* Rebalance all the entries */
+ for (i = 0, op = head->table; i < head->size; i++, op++) {
+ if (op->key) {
+ size_t pos = hash_pos(op->hash, mask);
+ size_t inc = hash_inc(op->hash, mask);
+
+ while ((xp = &newtbl[pos])->key)
+ pos = hash_pos_next(pos, inc, mask);
+
+ *xp = *op;
+ if (op == np)
+ np = xp;
+ }
+ }
+ nasm_free(head->table);
+ }
+
+ head->table = newtbl;
+ head->size = newsize;
+ head->max_load = hash_max_load(newsize);
+ }
+
+ return &np->data;
+}
+
+/*
+ * Iterate over all members of a hash set. For the first call,
+ * iterator should be initialized to NULL. Returns the data pointer,
+ * or NULL on failure.
+ */
+void *hash_iterate(const struct hash_table *head,
+ struct hash_tbl_node **iterator,
+ const char **key)
+{
+ struct hash_tbl_node *np = *iterator;
+ struct hash_tbl_node *ep = head->table + head->size;
+
+ if (!np) {
+ np = head->table;
+ if (!np)
+ return NULL; /* Uninitialized table */
+ }
+
+ while (np < ep) {
+ if (np->key) {
+ *iterator = np + 1;
+ if (key)
+ *key = np->key;
+ return np->data;
+ }
+ np++;
+ }
+
+ *iterator = NULL;
+ if (key)
+ *key = NULL;
+ return NULL;
+}
+
+/*
+ * Free the hash itself. Doesn't free the data elements; use
+ * hash_iterate() to do that first, if needed. This function is normally
+ * used when the hash data entries are either freed separately, or
+ * compound objects which can't be freed in a single operation.
+ */
+void hash_free(struct hash_table *head)
+{
+ void *p = head->table;
+ head->table = NULL;
+ nasm_free(p);
+}
+
+/*
+ * Frees the hash *and* all data elements. This is applicable only in
+ * the case where the data element is a single allocation. If the
+ * second argument is false, the key string is part of the data
+ * allocation or belongs to an allocation which will be freed
+ * separately, if it is true the keys are also freed.
+ */
+void hash_free_all(struct hash_table *head, bool free_keys)
+{
+ struct hash_tbl_node *iter = NULL;
+ const char *keyp;
+ void *d;
+
+ while ((d = hash_iterate(head, &iter, &keyp))) {
+ nasm_free(d);
+ if (free_keys)
+ nasm_free((void *)keyp);
+ }
+
+ hash_free(head);
+}
diff --git a/nasmlib/ilog2.c b/nasmlib/ilog2.c
new file mode 100644
index 00000000..cba22248
--- /dev/null
+++ b/nasmlib/ilog2.c
@@ -0,0 +1,2 @@
+#define ILOG2_C
+#include "ilog2.h"
diff --git a/nasmlib/malloc.c b/nasmlib/malloc.c
new file mode 100644
index 00000000..1e643185
--- /dev/null
+++ b/nasmlib/malloc.c
@@ -0,0 +1,163 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+
+#include "nasmlib.h"
+#include "error.h"
+
+static no_return nasm_alloc_failed(void)
+{
+ nasm_fatal("out of memory");
+}
+
+static inline void *validate_ptr(void *p)
+{
+ if (unlikely(!p))
+ nasm_alloc_failed();
+ return p;
+}
+
+void *nasm_malloc(size_t size)
+{
+ return validate_ptr(malloc(size));
+}
+
+void *nasm_calloc(size_t size, size_t nelem)
+{
+ return validate_ptr(calloc(size, nelem));
+}
+
+void *nasm_zalloc(size_t size)
+{
+ return validate_ptr(calloc(1, size));
+}
+
+void *nasm_realloc(void *q, size_t size)
+{
+ return validate_ptr(q ? realloc(q, size) : malloc(size));
+}
+
+void nasm_free(void *q)
+{
+ if (q)
+ free(q);
+}
+
+char *nasm_strdup(const char *s)
+{
+ char *p;
+ size_t size = strlen(s) + 1;
+
+ p = nasm_malloc(size);
+ return memcpy(p, s, size);
+}
+
+char *nasm_strndup(const char *s, size_t len)
+{
+ char *p;
+
+ len = strnlen(s, len);
+ p = nasm_malloc(len+1);
+ p[len] = '\0';
+ return memcpy(p, s, len);
+}
+
+char *nasm_strcat(const char *one, const char *two)
+{
+ char *rslt;
+ size_t l1 = strlen(one);
+ size_t l2 = strlen(two);
+ rslt = nasm_malloc(l1 + l2 + 1);
+ memcpy(rslt, one, l1);
+ memcpy(rslt + l1, two, l2+1);
+ return rslt;
+}
+
+char *nasm_strcatn(const char *str1, ...)
+{
+ va_list ap;
+ char *rslt; /* Output buffer */
+ size_t s; /* Total buffer size */
+ size_t n; /* Number of arguments */
+ size_t *ltbl; /* Table of lengths */
+ size_t l, *lp; /* Length for current argument */
+ const char *p; /* Currently examined argument */
+ char *q; /* Output pointer */
+
+ n = 0; /* No strings encountered yet */
+ p = str1;
+ va_start(ap, str1);
+ while (p) {
+ n++;
+ p = va_arg(ap, const char *);
+ }
+ va_end(ap);
+
+ ltbl = nasm_malloc(n * sizeof(size_t));
+
+ s = 1; /* Space for final NULL */
+ p = str1;
+ lp = ltbl;
+ va_start(ap, str1);
+ while (p) {
+ *lp++ = l = strlen(p);
+ s += l;
+ p = va_arg(ap, const char *);
+ }
+ va_end(ap);
+
+ q = rslt = nasm_malloc(s);
+
+ p = str1;
+ lp = ltbl;
+ va_start(ap, str1);
+ while (p) {
+ l = *lp++;
+ memcpy(q, p, l);
+ q += l;
+ p = va_arg(ap, const char *);
+ }
+ va_end(ap);
+ *q = '\0';
+
+ nasm_free(ltbl);
+
+ return rslt;
+}
diff --git a/nasmlib/md5c.c b/nasmlib/md5c.c
new file mode 100644
index 00000000..9b061361
--- /dev/null
+++ b/nasmlib/md5c.c
@@ -0,0 +1,247 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+#include "md5.h"
+#include <string.h> /* for memcpy() */
+
+#ifdef WORDS_LITTLEENDIAN
+#define byteReverse(buf, len) /* Nothing */
+#else
+static void byteReverse(unsigned char *buf, unsigned longs);
+
+/*
+ * Note: this code is harmless on little-endian machines.
+ */
+static void byteReverse(unsigned char *buf, unsigned longs)
+{
+ uint32_t t;
+ do {
+ t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
+ ((unsigned) buf[1] << 8 | buf[0]);
+ *(uint32_t *) buf = t;
+ buf += 4;
+ } while (--longs);
+}
+#endif
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void MD5Init(MD5_CTX *ctx)
+{
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void MD5Update(MD5_CTX *ctx, unsigned char const *buf, unsigned len)
+{
+ uint32_t t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t) {
+ unsigned char *p = (unsigned char *) ctx->in + t;
+
+ t = 64 - t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ buf += t;
+ len -= t;
+ }
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void MD5Final(unsigned char digest[16], MD5_CTX *ctx)
+{
+ unsigned count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count - 8);
+ }
+ byteReverse(ctx->in, 14);
+
+ /* Append length in bits and transform */
+ ((uint32_t *) ctx->in)[14] = ctx->bits[0];
+ ((uint32_t *) ctx->in)[15] = ctx->bits[1];
+
+ MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ byteReverse((unsigned char *) ctx->buf, 4);
+ memcpy(digest, ctx->buf, 16);
+ memset((char *) ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
+}
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void MD5Transform(uint32_t buf[4], uint32_t const in[16])
+{
+ register uint32_t a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
diff --git a/nasmlib/mmap.c b/nasmlib/mmap.c
new file mode 100644
index 00000000..5fc5646f
--- /dev/null
+++ b/nasmlib/mmap.c
@@ -0,0 +1,139 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "file.h"
+
+/* ----------------------------------------------------------------------- *
+ * Unix-style memory mapping, using mmap().
+ * ----------------------------------------------------------------------- */
+#if defined(HAVE_FILENO) && defined(HAVE_MMAP)
+
+/*
+ * System page size
+ */
+
+/* File scope since not all compilers like static data in inline functions */
+static size_t nasm_pagemask;
+
+static size_t get_pagemask(void)
+{
+ size_t ps = 0;
+
+# if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
+ ps = sysconf(_SC_PAGESIZE);
+# elif defined(HAVE_GETPAGESIZE)
+ ps = getpagesize();
+# elif defined(PAGE_SIZE)
+ ps = PAGE_SIZE;
+# endif
+
+ nasm_pagemask = ps = is_power2(ps) ? (ps - 1) : 0;
+ return ps;
+}
+
+static inline size_t pagemask(void)
+{
+ size_t pm = nasm_pagemask;
+
+ if (unlikely(!pm))
+ return get_pagemask();
+
+ return pm;
+}
+
+/*
+ * Try to map an input file into memory
+ */
+const void *nasm_map_file(FILE *fp, off_t start, off_t len)
+{
+ const char *p;
+ off_t astart; /* Aligned start */
+ size_t salign; /* Amount of start adjustment */
+ size_t alen; /* Aligned length */
+ const size_t page_mask = pagemask();
+
+ if (unlikely(!page_mask))
+ return NULL; /* Page size undefined? */
+
+ if (unlikely(!len))
+ return NULL; /* Mapping nothing... */
+
+ if (unlikely(len != (off_t)(size_t)len))
+ return NULL; /* Address space insufficient */
+
+ astart = start & ~(off_t)page_mask;
+ salign = start - astart;
+ alen = (len + salign + page_mask) & ~page_mask;
+
+ p = mmap(NULL, alen, PROT_READ, MAP_SHARED, fileno(fp), astart);
+ return unlikely(p == MAP_FAILED) ? NULL : p + salign;
+}
+
+/*
+ * Unmap an input file
+ */
+void nasm_unmap_file(const void *p, size_t len)
+{
+ const size_t page_mask = pagemask();
+ uintptr_t astart;
+ size_t salign;
+ size_t alen;
+
+ if (unlikely(!page_mask))
+ return;
+
+ astart = (uintptr_t)p & ~(uintptr_t)page_mask;
+ salign = (uintptr_t)p - astart;
+ alen = (len + salign + page_mask) & ~page_mask;
+
+ munmap((void *)astart, alen);
+}
+
+/* ----------------------------------------------------------------------- *
+ * No memory map support at all
+ * XXX: Add a section with Windows support
+ * ----------------------------------------------------------------------- */
+#else
+
+const void *nasm_map_file(FILE *fp, off_t start, off_t len)
+{
+ (void)fp; (void)start; (void)len;
+ return NULL;
+}
+
+void nasm_unmap_file(const void *p, size_t len)
+{
+ (void)p; (void)len;
+}
+
+#endif
diff --git a/nasmlib/path.c b/nasmlib/path.c
new file mode 100644
index 00000000..d228ed1e
--- /dev/null
+++ b/nasmlib/path.c
@@ -0,0 +1,186 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * path.c - host operating system specific pathname manipulation functions
+ *
+ * This file is inherently nonportable ... please help adjusting it to
+ * any new platforms that may be necessary.
+ */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "error.h"
+
+#if defined(__MSDOS__) || defined(__DOS__) || \
+ defined(__WINDOWS__) || defined(_Windows) || \
+ defined(__OS2__) || defined(_WIN16) || defined(WIN32) || defined(_WIN32)
+/* MS-DOS/Windows and like operating systems */
+# define separators "/\\:"
+# define cleandirend "/\\"
+# define catsep '\\'
+# define leaveonclean 2 /* Leave \\ at the start alone */
+# define curdir "."
+#elif defined(unix) || defined(__unix) || defined(__unix__) || \
+ defined(__UNIX__) || defined(__Unix__) || \
+ defined(__MACH__) || defined(__BEOS__)
+/* Unix and Unix-like operating systems and others using
+ * the equivalent syntax (slashes as only separators, no concept of volume)
+ *
+ * This must come after the __MSDOS__ section, since it seems that at
+ * least DJGPP defines __unix__ despite not being a Unix environment at all.
+ */
+# define separators "/"
+# define cleandirend "/"
+# define catsep '/'
+# define leaveonclean 1
+# define curdir "."
+#elif defined(Macintosh) || defined(macintosh)
+/* MacOS classic */
+# define separators ":"
+# define curdir ":"
+# define catsep ':'
+# define cleandirend ":"
+# define leaveonclean 0
+# define leave_leading 1
+#elif defined(__VMS)
+/* VMS *
+ *
+ * VMS filenames may have ;version at the end. Assume we should count that
+ * as part of the filename anyway.
+ */
+# define separators ":]"
+# define curdir "[]"
+#else
+/* No idea what to do here, do nothing. Feel free to add new ones. */
+# define curdir ""
+#endif
+
+/*
+ * This is an inline, because most compilers can greatly simplify this
+ * for a fixed string, like we have here.
+ */
+static inline bool ismatch(const char *charset, char ch)
+{
+ const char *p;
+
+ for (p = charset; *p; p++) {
+ if (ch == *p)
+ return true;
+ }
+
+ return false;
+}
+
+static const char *first_filename_char(const char *path)
+{
+#ifdef separators
+ const char *p = path + strlen(path);
+
+ while (p > path) {
+ if (ismatch(separators, p[-1]))
+ return p;
+ p--;
+ }
+
+ return p;
+#else
+ return path;
+#endif
+}
+
+/* Return the filename portion of a PATH as a new string */
+char *nasm_basename(const char *path)
+{
+ return nasm_strdup(first_filename_char(path));
+}
+
+/* Return the directory name portion of a PATH as a new string */
+char *nasm_dirname(const char *path)
+{
+ const char *p = first_filename_char(path);
+ const char *p0 = p;
+ (void)p0; /* Don't warn if unused */
+
+ if (p == path)
+ return nasm_strdup(curdir);
+
+#ifdef cleandirend
+ while (p > path+leaveonclean) {
+ if (ismatch(cleandirend, p[-1]))
+ break;
+ p--;
+ }
+#endif
+
+#ifdef leave_leading
+ /* If the directory contained ONLY separators, leave as-is */
+ if (p == path+leaveonclean)
+ p = p0;
+#endif
+
+ return nasm_strndup(path, p-path);
+}
+
+/*
+ * Concatenate a directory path and a filename. Note that this function
+ * currently does NOT handle the case where file itself contains
+ * directory components (except on Unix platforms, because it is trivial.)
+ */
+char *nasm_catfile(const char *dir, const char *file)
+{
+#ifndef catsep
+ return nasm_strcat(dir, file);
+#else
+ size_t dl = strlen(dir);
+ size_t fl = strlen(file);
+ char *p, *pp;
+ bool dosep = true;
+
+ if (!dl || ismatch(separators, dir[dl-1])) {
+ /* No separator necessary */
+ dosep = false;
+ }
+
+ p = pp = nasm_malloc(dl + fl + dosep + 1);
+
+ memcpy(pp, dir, dl);
+ pp += dl;
+ if (dosep)
+ *pp++ = catsep;
+
+ memcpy(pp, file, fl+1);
+
+ return p;
+#endif
+}
diff --git a/nasmlib/perfhash.c b/nasmlib/perfhash.c
new file mode 100644
index 00000000..5cd6714e
--- /dev/null
+++ b/nasmlib/perfhash.c
@@ -0,0 +1,55 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "perfhash.h"
+#include "hashtbl.h" /* For crc64i() */
+
+int perfhash_find(const struct perfect_hash *hash, const char *str)
+{
+ uint32_t k1, k2;
+ uint64_t crc;
+ uint16_t ix;
+
+ crc = crc64i(hash->crcinit, str);
+ k1 = (uint32_t)crc & hash->hashmask;
+ k2 = (uint32_t)(crc >> 32) & hash->hashmask;
+
+ ix = hash->hashvals[k1] + hash->hashvals[k2 + hash->hashmask + 1];
+
+ if (ix >= hash->tbllen ||
+ !hash->strings[ix] ||
+ nasm_stricmp(str, hash->strings[ix]))
+ return hash->errval;
+
+ return hash->tbloffs + ix;
+}
diff --git a/nasmlib/perfhash.pl b/nasmlib/perfhash.pl
new file mode 100755
index 00000000..639b347f
--- /dev/null
+++ b/nasmlib/perfhash.pl
@@ -0,0 +1,362 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Generate a perfect hash for general case-insensitive string-to-enum
+# lookup. This generates an enum and the corresponding hash, but
+# relies on a common function to parse the hash.
+#
+# Usage:
+# perfhash.pl h foohash.dat foohash.h (to generate C header)
+# perfhash.pl c foohash.dat foohash.c (to generate C source)
+#
+
+use strict;
+
+require 'phash.ph';
+
+sub basename($) {
+ my($s) = @_;
+ $s =~ s/^.*[^-[:alnum:]_\.]//; # Remove path component as best we can
+ return $s;
+}
+
+sub intval($) {
+ my($s) = @_;
+
+ if ($s =~ /^0/) {
+ return oct($s); # Handles octal or hexadecimal
+ } elsif ($s =~ /^\-(0.*)$/) {
+ return -oct($1);
+ } else {
+ return $s + 0; # Forcibly convert to number
+ }
+}
+
+my($output, $infile, $outfile) = @ARGV;
+my $me = basename($0);
+
+# The following special things are allowed in the input file:
+# #<space> or ; begins a comment
+# #include filename
+# #name str
+# The name of the hash
+# #prefix str
+# Defines the prefix before enum
+# #guard str
+# Defines the header guard string
+# #special str [= value]
+# Generate an enum value without a corresponding string; not capitalized.
+# #header str
+# Indicates the name of the .h file to include from the .c file
+# #errval str
+# Define the value to be returned if a string is not found
+# (defaults to -1). This can be any constant C expression,
+# including one of the enum values.
+#
+# Regular lines are just str [= value]
+#
+# Enumeration is generated in the order listed in the file, just as in C
+# specifying a value causes the values to increase by 1 from that point on
+# unless specified.
+
+my $name;
+my $prefix;
+my $guard;
+my $hfile;
+
+my %strings = ();
+my %specials = ();
+my $next_value = 0;
+my $errval = '-1';
+
+my @incstack = ();
+my @filenames = ($infile);
+my @linenums = (0);
+my $dd = undef;
+my $err = 0;
+
+while (scalar(@filenames)) {
+ if (!defined($dd)) {
+ open($dd, '<', $filenames[-1])
+ or die "$0: cannot open: $filenames[-1]: $!\n";
+ }
+
+ my $line = <$dd>;
+ if (!defined($line)) {
+ close($dd);
+ $dd = pop @incstack;
+ pop @filenames;
+ pop @linenums;
+ next;
+ }
+
+ $linenums[-1]++;
+
+ chomp $line;
+ $line =~ s/\s*(|\;.*|\#\s.*|\#)$//; # Remove comments and trailing space
+ $line =~ s/^\s+//; # Remove leading space
+ if ($line eq '') {
+ # Do nothing
+ } elsif ($line =~ /^\#name\s+([[:alnum:]_]+)$/) {
+ $name = $1;
+ } elsif ($line =~ /^\#prefix\s+([[:alnum:]_]+)$/) {
+ $prefix = $1;
+ } elsif ($line =~ /^\#guard\s+([[:alnum:]_]+)$/) {
+ $guard = $1;
+ } elsif ($line =~ /^\#errval\s+(\S.*)$/) {
+ $errval = $1;
+ } elsif ($line =~ /^\#header\s+(\"(.+)\"|\S+)$/) {
+ $hfile = ($2 ne '') ? $2 : $1;
+ } elsif ($line =~ /^\#include\s+(\"(.+)\"|\S+)$/) {
+ push @incstack, $dd;
+ push @filenames, (($2 ne '') ? $2 : $1);
+ push @linenums, 0;
+ undef $dd; # Open a new file
+ } elsif ($line =~ /^(|\#special\s+)(\S+)\s*(|=\s*(\-?(0[Xx][[:xdigit:]]+|0[0-7]*|[0-9]+)))$/) {
+ $next_value = intval($4) if ($4 ne '');
+ if ($1 eq '') {
+ $strings{$2} = $next_value++;
+ } else {
+ $specials{$2} = $next_value++;
+ }
+ } else {
+ printf STDERR "%s:%d:%s syntax error: \"%s\"\n",
+ $filenames[-1], $linenums[-1],
+ (scalar(@incstack) == 1) ? '' : "(from $infile)", $line;
+ $err++;
+ }
+}
+
+exit 1 if ($err);
+
+# Default name, prefix, and header guard name
+if (!defined($name)) {
+ $name = basename($infile);
+ $name =~ s/(\..*)$//; # Strip extension, if any
+}
+if (!defined($prefix)) {
+ $prefix = "\U${name}\E_";
+}
+if (!defined($hfile)) {
+ $hfile = $outfile;
+ $hfile =~ s/\.c$/\.h/;
+}
+if (!defined($guard)) {
+ $guard = basename($hfile);
+ $guard =~ s/[^[:alnum:]_]/_/g;
+ $guard =~ s/__+/_/g;
+ $guard = "\U$guard";
+}
+
+# Verify input. We can't have more than one constant with the same
+# enumeration value, nor the same enumeration string.
+if (scalar(keys(%strings)) == 0) {
+ die "$0: $infile: no strings to hash!\n";
+}
+
+my %enums;
+my %enumvals;
+my %stringbyval;
+my $max_enum;
+my $tbllen = 0;
+my $tbloffs;
+foreach my $s (keys(%strings)) {
+ my $es = "${prefix}\U${s}";
+ $es =~ s/[^[:alnum:]_]/_/g;
+ $es =~ s/__+/_/g;
+ my $v = $strings{$s};
+ $stringbyval{$v} = $s;
+ if (defined($enums{$es})) {
+ printf STDERR "%s: string \"%s\" duplicates existing enum %s\n",
+ $infile, $s, $es;
+ $err++;
+ } else {
+ $enums{$es} = $v;
+ }
+ if (defined($enumvals{$v})) {
+ printf STDERR "%s: string \"%s\" duplicates existing enum constant %d\n", $v;
+ $err++;
+ } else {
+ $enumvals{$v} = $es;
+ }
+ $max_enum = $v if ($v > $max_enum || !defined($max_enum));
+ $tbloffs = $v if ($v < $tbloffs || !defined($tbloffs));
+ $tbllen = $v+1 if ($v >= $tbllen || !defined($tbllen));
+}
+foreach my $s (keys(%specials)) {
+ my $es = $prefix . $s; # No string mangling here
+ my $v = $specials{$s};
+ if (defined($enums{$es})) {
+ printf STDERR "%s: special \"%s\" duplicates existing enum %s\n",
+ $infile, $s, $es;
+ $err++;
+ } else {
+ $enums{$es} = $v;
+ }
+ if (defined ($enumvals{$v})) {
+ printf STDERR "%s: special \"%s\" duplicates existing enum constant %d\n", $v;
+ $err++;
+ } else {
+ $enumvals{$v} = $es;
+ }
+ $max_enum = $v if ($v > $max_enum || !defined($max_enum));
+}
+
+$tbllen -= $tbloffs;
+if ($tbllen > 65536) {
+ printf STDERR "%s: span of enumeration values too large\n";
+ $err++;
+}
+
+exit 1 if ($err);
+
+open(F, '>', $outfile)
+ or die "$0: cannot create: ${outfile}: $!\n";
+
+if ($output eq 'h') {
+ print F "/*\n";
+ print F " * This file is generated from $infile\n";
+ print F " * by $me; do not edit.\n";
+ print F " */\n";
+ print F "\n";
+
+ print F "#ifndef $guard\n";
+ print F "#define $guard 1\n\n";
+ print F "#include \"perfhash.h\"\n\n";
+
+ my $c = '{';
+ $next_value = 0;
+ print F "enum ${name} ";
+ foreach my $v (sort { $a <=> $b } keys(%enumvals)) {
+ my $s = $enumvals{$v};
+ print F "$c\n $s";
+ print F " = $v" if ($v != $next_value);
+ $next_value = $v + 1;
+ $c = ',';
+ }
+ print F "\n};\n\n";
+ print F "extern const struct perfect_hash ${name}_hash;\n";
+ printf F "extern const char * const %s_tbl[%d];\n", $name, $tbllen;
+
+ print F "\nstatic inline enum ${name} ${name}_find(const char *str)\n";
+ print F "{\n";
+ print F " return perfhash_find(&${name}_hash, str);\n";
+ print F "}\n";
+
+ print F "\nstatic inline const char * ${name}_name(enum ${name} x)\n";
+ print F "{\n";
+ printf F " size_t ix = (size_t)x - (%d);\n", $tbloffs;
+ printf F " if (ix >= %d)\n", $tbllen;
+ print F " return NULL;\n";
+ print F " return ${name}_tbl[ix];\n";
+ print F "}\n";
+
+ print F "\nstatic inline const char * ${name}_dname(enum ${name} x)\n";
+ print F "{\n";
+ print F " const char *y = ${name}_name(x);\n";
+ print F " return y ? y : invalid_enum_str(x);\n";
+ print F "}\n";
+
+ print F "\n#endif /* $guard */\n";
+} elsif ($output eq 'c') {
+ # The strings we hash must all be lower case, even if the string
+ # table doesn't contain them that way.
+
+ my %lcstrings;
+ foreach my $s (keys(%strings)) {
+ my $ls = "\L$s";
+ if (defined($lcstrings{$ls})) {
+ printf STDERR "%s: strings \"%s\" and \"%s\" differ only in case\n",
+ $infile, $s, $strings{$lcstrings{$s}};
+ } else {
+ $lcstrings{$ls} = $strings{$s} - $tbloffs;
+ }
+ }
+
+ my @hashinfo = gen_perfect_hash(\%lcstrings);
+ if (!@hashinfo) {
+ die "$0: no hash found\n";
+ }
+
+ # Paranoia...
+ verify_hash_table(\%lcstrings, \@hashinfo);
+
+ my ($n, $sv, $g) = @hashinfo;
+
+ die if ($n & ($n-1));
+
+ print F "/*\n";
+ print F " * This file is generated from $infile\n";
+ print F " * by $me; do not edit.\n";
+ print F " */\n";
+ print F "\n";
+
+ print F "#include \"$hfile\"\n\n";
+
+ printf F "const char * const %s_tbl[%d] = ", $name, $tbllen;
+ my $c = '{';
+ for (my $i = $tbloffs; $i < $tbloffs+$tbllen; $i++) {
+ printf F "%s\n %s", $c,
+ defined($stringbyval{$i}) ? '"'.$stringbyval{$i}.'"' : 'NULL';
+ $c = ',';
+ }
+ print F "\n};\n\n";
+
+ print F "#define UNUSED (65536/3)\n\n";
+
+ printf F "static const int16_t %s_hashvals[%d] = ", $name, $n*2;
+ $c = '{';
+ for (my $i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+0];
+ print F "$c\n ", defined($h) ? $h : 'UNUSED';
+ $c = ',';
+ }
+ for (my $i = 0; $i < $n; $i++) {
+ my $h = ${$g}[$i*2+1];
+ print F "$c\n ", defined($h) ? $h : 'UNUSED';
+ $c = ',';
+ }
+ print F "\n};\n\n";
+
+ print F "const struct perfect_hash ${name}_hash = {\n";
+ printf F " UINT64_C(0x%08x%08x),\n", $$sv[0], $$sv[1]; # crcinit
+ printf F " UINT32_C(0x%x),\n", $n-1; # hashmask
+ printf F " UINT32_C(%u),\n", $tbllen; # tbllen
+ printf F " %d,\n", $tbloffs; # tbloffs
+ printf F " (%s),\n", $errval; # errval
+ printf F " ${name}_hashvals,\n"; # hashvals
+ printf F " ${name}_tbl\n"; # strings
+ print F "};\n";
+}
diff --git a/nasmlib/raa.c b/nasmlib/raa.c
new file mode 100644
index 00000000..feb86970
--- /dev/null
+++ b/nasmlib/raa.c
@@ -0,0 +1,203 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "nasmlib.h"
+#include "raa.h"
+#include "ilog2.h"
+
+/*
+ * Routines to manage a dynamic random access array of int64_ts which
+ * may grow in size to be more than the largest single malloc'able
+ * chunk.
+ */
+
+#define RAA_LAYERSHIFT 11 /* 2^this many items per layer */
+#define RAA_LAYERSIZE ((size_t)1 << RAA_LAYERSHIFT)
+#define RAA_LAYERMASK (RAA_LAYERSIZE-1)
+
+typedef struct RAA RAA;
+typedef union RAA_UNION RAA_UNION;
+typedef struct RAA_LEAF RAA_LEAF;
+typedef struct RAA_BRANCH RAA_BRANCH;
+
+union intorptr {
+ int64_t i;
+ void *p;
+};
+
+struct RAA {
+ /* Last position in this RAA */
+ raaindex endposn;
+
+ /*
+ * Number of layers below this one to get to the real data. 0
+ * means this structure is a leaf, holding RAA_LAYERSIZE real
+ * data items; 1 and above mean it's a branch, holding
+ * RAA_LAYERSIZE pointers to the next level branch or leaf
+ * structures.
+ */
+ unsigned int layers;
+
+ /*
+ * Number of real data items spanned by one position in the
+ * `data' array at this level. This number is 0 trivially, for
+ * a leaf (level 0): for a level n branch it should be
+ * n*RAA_LAYERSHIFT.
+ */
+ unsigned int shift;
+
+ /*
+ * The actual data
+ */
+ union RAA_UNION {
+ struct RAA_LEAF {
+ union intorptr data[RAA_LAYERSIZE];
+ } l;
+ struct RAA_BRANCH {
+ struct RAA *data[RAA_LAYERSIZE];
+ } b;
+ } u;
+};
+
+#define LEAFSIZ (sizeof(RAA)-sizeof(RAA_UNION)+sizeof(RAA_LEAF))
+#define BRANCHSIZ (sizeof(RAA)-sizeof(RAA_UNION)+sizeof(RAA_BRANCH))
+
+static struct RAA *raa_init_layer(raaindex posn, unsigned int layers)
+{
+ struct RAA *r;
+ raaindex posmask;
+
+ r = nasm_zalloc((layers == 0) ? LEAFSIZ : BRANCHSIZ);
+ r->shift = layers * RAA_LAYERSHIFT;
+ r->layers = layers;
+ posmask = ((raaindex)RAA_LAYERSIZE << r->shift) - 1;
+ r->endposn = posn | posmask;
+ return r;
+}
+
+void raa_free(struct RAA *r)
+{
+ if (!r)
+ return;
+
+ if (r->layers) {
+ struct RAA **p = r->u.b.data;
+ size_t i;
+ for (i = 0; i < RAA_LAYERSIZE; i++)
+ raa_free(*p++);
+ }
+ nasm_free(r);
+}
+
+static const union intorptr *real_raa_read(struct RAA *r, raaindex posn)
+{
+ nasm_assert(posn <= (~(raaindex)0 >> 1));
+
+ if (unlikely(!r || posn > r->endposn))
+ return NULL; /* Beyond the end */
+
+ while (r->layers) {
+ size_t l = (posn >> r->shift) & RAA_LAYERMASK;
+ r = r->u.b.data[l];
+ if (!r)
+ return NULL; /* Not present */
+ }
+ return &r->u.l.data[posn & RAA_LAYERMASK];
+}
+
+int64_t raa_read(struct RAA *r, raaindex pos)
+{
+ const union intorptr *ip;
+
+ ip = real_raa_read(r, pos);
+ return ip ? ip->i : 0;
+}
+
+void *raa_read_ptr(struct RAA *r, raaindex pos)
+{
+ const union intorptr *ip;
+
+ ip = real_raa_read(r, pos);
+ return ip ? ip->p : NULL;
+}
+
+
+static struct RAA *
+real_raa_write(struct RAA *r, raaindex posn, union intorptr value)
+{
+ struct RAA *result;
+
+ nasm_assert(posn <= (~(raaindex)0 >> 1));
+
+ if (unlikely(!r)) {
+ /* Create a new top-level RAA */
+ r = raa_init_layer(posn, ilog2_64(posn)/RAA_LAYERSHIFT);
+ } else {
+ while (unlikely(r->endposn < posn)) {
+ /* We need to add layers to an existing RAA */
+ struct RAA *s = raa_init_layer(r->endposn, r->layers + 1);
+ s->u.b.data[0] = r;
+ r = s;
+ }
+ }
+
+ result = r;
+
+ while (r->layers) {
+ struct RAA **s;
+ size_t l = (posn >> r->shift) & RAA_LAYERMASK;
+ s = &r->u.b.data[l];
+ if (unlikely(!*s))
+ *s = raa_init_layer(posn, r->layers - 1);
+ r = *s;
+ }
+ r->u.l.data[posn & RAA_LAYERMASK] = value;
+
+ return result;
+}
+
+struct RAA *raa_write(struct RAA *r, raaindex posn, int64_t value)
+{
+ union intorptr ip;
+
+ ip.i = value;
+ return real_raa_write(r, posn, ip);
+}
+
+struct RAA *raa_write_ptr(struct RAA *r, raaindex posn, void *value)
+{
+ union intorptr ip;
+
+ ip.p = value;
+ return real_raa_write(r, posn, ip);
+}
diff --git a/nasmlib/rbtree.c b/nasmlib/rbtree.c
new file mode 100644
index 00000000..5af6067d
--- /dev/null
+++ b/nasmlib/rbtree.c
@@ -0,0 +1,119 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rbtree.c
+ *
+ * Simple implementation of a left-leaning red-black tree with 64-bit
+ * integer keys. The search operation will return the highest node <=
+ * the key; only search and insert are supported, but additional
+ * standard llrbtree operations can be coded up at will.
+ *
+ * See http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf for
+ * information about left-leaning red-black trees.
+ */
+
+#include "rbtree.h"
+
+struct rbtree *rb_search(struct rbtree *tree, uint64_t key)
+{
+ struct rbtree *best = NULL;
+
+ while (tree) {
+ if (tree->key == key)
+ return tree;
+ else if (tree->key > key)
+ tree = tree->left;
+ else {
+ best = tree;
+ tree = tree->right;
+ }
+ }
+ return best;
+}
+
+static bool is_red(struct rbtree *h)
+{
+ return h && h->red;
+}
+
+static struct rbtree *rotate_left(struct rbtree *h)
+{
+ struct rbtree *x = h->right;
+ h->right = x->left;
+ x->left = h;
+ x->red = x->left->red;
+ x->left->red = true;
+ return x;
+}
+
+static struct rbtree *rotate_right(struct rbtree *h)
+{
+ struct rbtree *x = h->left;
+ h->left = x->right;
+ x->right = h;
+ x->red = x->right->red;
+ x->right->red = true;
+ return x;
+}
+
+static void color_flip(struct rbtree *h)
+{
+ h->red = !h->red;
+ h->left->red = !h->left->red;
+ h->right->red = !h->right->red;
+}
+
+struct rbtree *rb_insert(struct rbtree *tree, struct rbtree *node)
+{
+ if (!tree) {
+ node->red = true;
+ return node;
+ }
+
+ if (is_red(tree->left) && is_red(tree->right))
+ color_flip(tree);
+
+ if (node->key < tree->key)
+ tree->left = rb_insert(tree->left, node);
+ else
+ tree->right = rb_insert(tree->right, node);
+
+ if (is_red(tree->right))
+ tree = rotate_left(tree);
+
+ if (is_red(tree->left) && is_red(tree->left->left))
+ tree = rotate_right(tree);
+
+ return tree;
+}
diff --git a/nasmlib/readnum.c b/nasmlib/readnum.c
new file mode 100644
index 00000000..47080884
--- /dev/null
+++ b/nasmlib/readnum.c
@@ -0,0 +1,172 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <ctype.h>
+
+#include "nasmlib.h"
+#include "error.h"
+#include "nasm.h" /* For globalbits */
+
+#define lib_isnumchar(c) (nasm_isalnum(c) || (c) == '$' || (c) == '_')
+
+static int radix_letter(char c)
+{
+ switch (c) {
+ case 'b': case 'B':
+ case 'y': case 'Y':
+ return 2; /* Binary */
+ case 'o': case 'O':
+ case 'q': case 'Q':
+ return 8; /* Octal */
+ case 'h': case 'H':
+ case 'x': case 'X':
+ return 16; /* Hexadecimal */
+ case 'd': case 'D':
+ case 't': case 'T':
+ return 10; /* Decimal */
+ default:
+ return 0; /* Not a known radix letter */
+ }
+}
+
+int64_t readnum(const char *str, bool *error)
+{
+ const char *r = str, *q;
+ int32_t pradix, sradix, radix;
+ int plen, slen, len;
+ uint64_t result, checklimit;
+ int digit, last;
+ bool warn = false;
+ int sign = 1;
+
+ *error = false;
+
+ while (nasm_isspace(*r))
+ r++; /* find start of number */
+
+ /*
+ * If the number came from make_tok_num (as a result of an %assign), it
+ * might have a '-' built into it (rather than in a preceeding token).
+ */
+ if (*r == '-') {
+ r++;
+ sign = -1;
+ }
+
+ q = r;
+
+ while (lib_isnumchar(*q))
+ q++; /* find end of number */
+
+ len = q-r;
+ if (!len) {
+ /* Not numeric */
+ *error = true;
+ return 0;
+ }
+
+ /*
+ * Handle radix formats:
+ *
+ * 0<radix-letter><string>
+ * $<string> (hexadecimal)
+ * <string><radix-letter>
+ */
+ pradix = sradix = 0;
+ plen = slen = 0;
+
+ if (len > 2 && *r == '0' && (pradix = radix_letter(r[1])) != 0)
+ plen = 2;
+ else if (len > 1 && *r == '$')
+ pradix = 16, plen = 1;
+
+ if (len > 1 && (sradix = radix_letter(q[-1])) != 0)
+ slen = 1;
+
+ if (pradix > sradix) {
+ radix = pradix;
+ r += plen;
+ } else if (sradix > pradix) {
+ radix = sradix;
+ q -= slen;
+ } else {
+ /* Either decimal, or invalid -- if invalid, we'll trip up
+ further down. */
+ radix = 10;
+ }
+
+ /*
+ * `checklimit' must be 2**64 / radix. We can't do that in
+ * 64-bit arithmetic, which we're (probably) using, so we
+ * cheat: since we know that all radices we use are even, we
+ * can divide 2**63 by radix/2 instead.
+ */
+ checklimit = UINT64_C(0x8000000000000000) / (radix >> 1);
+
+ /*
+ * Calculate the highest allowable value for the last digit of a
+ * 64-bit constant... in radix 10, it is 6, otherwise it is 0
+ */
+ last = (radix == 10 ? 6 : 0);
+
+ result = 0;
+ while (*r && r < q) {
+ if (*r != '_') {
+ if (*r < '0' || (*r > '9' && *r < 'A')
+ || (digit = numvalue(*r)) >= radix) {
+ *error = true;
+ return 0;
+ }
+ if (result > checklimit ||
+ (result == checklimit && digit >= last)) {
+ warn = true;
+ }
+
+ result = radix * result + digit;
+ }
+ r++;
+ }
+
+ if (warn)
+ nasm_error(ERR_WARNING | ERR_PASS1 | ERR_WARN_NOV,
+ "numeric constant %s does not fit in 64 bits",
+ str);
+
+ return result * sign;
+}
diff --git a/nasmlib/realpath.c b/nasmlib/realpath.c
new file mode 100644
index 00000000..d93dc15f
--- /dev/null
+++ b/nasmlib/realpath.c
@@ -0,0 +1,135 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * realpath.c As system-independent as possible implementation of realpath()
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#include "nasmlib.h"
+
+#ifdef HAVE_CANONICALIZE_FILE_NAME
+
+/*
+ * GNU-specific, but avoids the realpath(..., NULL)
+ * portability problem if it exists.
+ */
+char *nasm_realpath(const char *rel_path)
+{
+ char *rp = canonicalize_file_name(rel_path);
+ return rp ? rp : nasm_strdup(rel_path);
+}
+
+#elif defined(HAVE_REALPATH)
+
+/*
+ * POSIX.1-2008 defines realpath(..., NULL); POSIX.1-2001 doesn't guarantee
+ * that a NULL second argument is supported.
+ */
+
+char *nasm_realpath(const char *rel_path)
+{
+ char *rp;
+
+ rp = realpath(rel_path, NULL);
+
+ /* Not all implemetations of realpath() support a NULL second argument */
+ if (!rp && errno == EINVAL) {
+ long path_max = -1;
+ char *rp;
+
+#if defined(HAVE_PATHCONF) && defined(_PC_PATH_MAX)
+ path_max = pathconf(rel_path, _PC_PATH_MAX); /* POSIX */
+#endif
+
+ if (path_max < 0) {
+#ifdef PATH_MAX
+ path_max = PATH_MAX; /* SUSv2 */
+#elif defined(MAXPATHLEN)
+ path_max = MAXPATHLEN; /* Solaris */
+#else
+ path_max = 65536; /* Crazily high, we hope */
+#endif
+ }
+
+ rp = nasm_malloc(path_max);
+
+ if (!realpath(rel_path, rp)) {
+ nasm_free(rp);
+ rp = NULL;
+ } else {
+ /* On some systems, pathconf() can return a very large value */
+
+ rp[path_max - 1] = '\0'; /* Just in case overrun is possible */
+ rp = nasm_realloc(rp, strlen(rp) + 1);
+ }
+ }
+
+ return rp ? rp : nasm_strdup(rel_path);
+}
+
+#elif defined(HAVE__FULLPATH)
+
+/*
+ * win32/win64 API
+ */
+
+char *nasm_realpath(const char *rel_path)
+{
+ char *rp = _fullpath(NULL, rel_path, 0);
+ return rp ? rp : nasm_strdup(rel_path);
+}
+
+#else
+
+/*
+ * There is nothing we know how to do here, so hope it just works anyway.
+ */
+
+char *nasm_realpath(const char *rel_path)
+{
+ return nasm_strdup(rel_path);
+}
+
+#endif
diff --git a/nasmlib/saa.c b/nasmlib/saa.c
new file mode 100644
index 00000000..fe7741a4
--- /dev/null
+++ b/nasmlib/saa.c
@@ -0,0 +1,377 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "saa.h"
+
+/* Aggregate SAA components smaller than this */
+#define SAA_BLKSHIFT 16
+#define SAA_BLKLEN ((size_t)1 << SAA_BLKSHIFT)
+
+struct SAA *saa_init(size_t elem_len)
+{
+ struct SAA *s;
+ char *data;
+
+ s = nasm_zalloc(sizeof(struct SAA));
+
+ if (elem_len >= SAA_BLKLEN)
+ s->blk_len = elem_len;
+ else
+ s->blk_len = SAA_BLKLEN - (SAA_BLKLEN % elem_len);
+
+ s->elem_len = elem_len;
+ s->length = s->blk_len;
+ data = nasm_malloc(s->blk_len);
+ s->nblkptrs = s->nblks = 1;
+ s->blk_ptrs = nasm_malloc(sizeof(char *));
+ s->blk_ptrs[0] = data;
+ s->wblk = s->rblk = &s->blk_ptrs[0];
+
+ return s;
+}
+
+void saa_free(struct SAA *s)
+{
+ char **p;
+ size_t n;
+
+ for (p = s->blk_ptrs, n = s->nblks; n; p++, n--)
+ nasm_free(*p);
+
+ nasm_free(s->blk_ptrs);
+ nasm_free(s);
+}
+
+/* Add one allocation block to an SAA */
+static void saa_extend(struct SAA *s)
+{
+ size_t blkn = s->nblks++;
+
+ if (blkn >= s->nblkptrs) {
+ size_t rindex = s->rblk - s->blk_ptrs;
+ size_t windex = s->wblk - s->blk_ptrs;
+
+ s->nblkptrs <<= 1;
+ s->blk_ptrs =
+ nasm_realloc(s->blk_ptrs, s->nblkptrs * sizeof(char *));
+
+ s->rblk = s->blk_ptrs + rindex;
+ s->wblk = s->blk_ptrs + windex;
+ }
+
+ s->blk_ptrs[blkn] = nasm_malloc(s->blk_len);
+ s->length += s->blk_len;
+}
+
+void *saa_wstruct(struct SAA *s)
+{
+ void *p;
+
+ nasm_assert((s->wpos % s->elem_len) == 0);
+
+ if (s->wpos + s->elem_len > s->blk_len) {
+ nasm_assert(s->wpos == s->blk_len);
+ if (s->wptr + s->elem_len > s->length)
+ saa_extend(s);
+ s->wblk++;
+ s->wpos = 0;
+ }
+
+ p = *s->wblk + s->wpos;
+ s->wpos += s->elem_len;
+ s->wptr += s->elem_len;
+
+ if (s->wptr > s->datalen)
+ s->datalen = s->wptr;
+
+ return p;
+}
+
+void saa_wbytes(struct SAA *s, const void *data, size_t len)
+{
+ const char *d = data;
+
+ while (len) {
+ size_t l = s->blk_len - s->wpos;
+ if (l > len)
+ l = len;
+ if (l) {
+ if (d) {
+ memcpy(*s->wblk + s->wpos, d, l);
+ d += l;
+ } else
+ memset(*s->wblk + s->wpos, 0, l);
+ s->wpos += l;
+ s->wptr += l;
+ len -= l;
+
+ if (s->datalen < s->wptr)
+ s->datalen = s->wptr;
+ }
+ if (len) {
+ if (s->wptr >= s->length)
+ saa_extend(s);
+ s->wblk++;
+ s->wpos = 0;
+ }
+ }
+}
+
+/*
+ * Writes a string, *including* the final null, to the specified SAA,
+ * and return the number of bytes written.
+ */
+size_t saa_wcstring(struct SAA *s, const char *str)
+{
+ size_t bytes = strlen(str) + 1;
+
+ saa_wbytes(s, str, bytes);
+
+ return bytes;
+}
+
+void saa_rewind(struct SAA *s)
+{
+ s->rblk = s->blk_ptrs;
+ s->rpos = s->rptr = 0;
+}
+
+void *saa_rstruct(struct SAA *s)
+{
+ void *p;
+
+ if (s->rptr + s->elem_len > s->datalen)
+ return NULL;
+
+ nasm_assert((s->rpos % s->elem_len) == 0);
+
+ if (s->rpos + s->elem_len > s->blk_len) {
+ s->rblk++;
+ s->rpos = 0;
+ }
+
+ p = *s->rblk + s->rpos;
+ s->rpos += s->elem_len;
+ s->rptr += s->elem_len;
+
+ return p;
+}
+
+const void *saa_rbytes(struct SAA *s, size_t * lenp)
+{
+ const void *p;
+ size_t len;
+
+ if (s->rptr >= s->datalen) {
+ *lenp = 0;
+ return NULL;
+ }
+
+ if (s->rpos >= s->blk_len) {
+ s->rblk++;
+ s->rpos = 0;
+ }
+
+ len = *lenp;
+ if (len > s->datalen - s->rptr)
+ len = s->datalen - s->rptr;
+ if (len > s->blk_len - s->rpos)
+ len = s->blk_len - s->rpos;
+
+ *lenp = len;
+ p = *s->rblk + s->rpos;
+
+ s->rpos += len;
+ s->rptr += len;
+
+ return p;
+}
+
+void saa_rnbytes(struct SAA *s, void *data, size_t len)
+{
+ char *d = data;
+
+ nasm_assert(s->rptr + len <= s->datalen);
+
+ while (len) {
+ size_t l;
+ const void *p;
+
+ l = len;
+ p = saa_rbytes(s, &l);
+
+ memcpy(d, p, l);
+ d += l;
+ len -= l;
+ }
+}
+
+/* Same as saa_rnbytes, except position the counter first */
+void saa_fread(struct SAA *s, size_t posn, void *data, size_t len)
+{
+ size_t ix;
+
+ nasm_assert(posn + len <= s->datalen);
+
+ if (likely(s->blk_len == SAA_BLKLEN)) {
+ ix = posn >> SAA_BLKSHIFT;
+ s->rpos = posn & (SAA_BLKLEN - 1);
+ } else {
+ ix = posn / s->blk_len;
+ s->rpos = posn % s->blk_len;
+ }
+ s->rptr = posn;
+ s->rblk = &s->blk_ptrs[ix];
+
+ saa_rnbytes(s, data, len);
+}
+
+/* Same as saa_wbytes, except position the counter first */
+void saa_fwrite(struct SAA *s, size_t posn, const void *data, size_t len)
+{
+ size_t ix;
+
+ /* Seek beyond the end of the existing array not supported */
+ nasm_assert(posn <= s->datalen);
+
+ if (likely(s->blk_len == SAA_BLKLEN)) {
+ ix = posn >> SAA_BLKSHIFT;
+ s->wpos = posn & (SAA_BLKLEN - 1);
+ } else {
+ ix = posn / s->blk_len;
+ s->wpos = posn % s->blk_len;
+ }
+ s->wptr = posn;
+ s->wblk = &s->blk_ptrs[ix];
+
+ if (!s->wpos) {
+ s->wpos = s->blk_len;
+ s->wblk--;
+ }
+
+ saa_wbytes(s, data, len);
+}
+
+void saa_fpwrite(struct SAA *s, FILE * fp)
+{
+ const char *data;
+ size_t len;
+
+ saa_rewind(s);
+ while (len = s->datalen, (data = saa_rbytes(s, &len)) != NULL)
+ nasm_write(data, len, fp);
+}
+
+void saa_write8(struct SAA *s, uint8_t v)
+{
+ saa_wbytes(s, &v, 1);
+}
+
+void saa_write16(struct SAA *s, uint16_t v)
+{
+ v = cpu_to_le16(v);
+ saa_wbytes(s, &v, 2);
+}
+
+void saa_write32(struct SAA *s, uint32_t v)
+{
+ v = cpu_to_le32(v);
+ saa_wbytes(s, &v, 4);
+}
+
+void saa_write64(struct SAA *s, uint64_t v)
+{
+ v = cpu_to_le64(v);
+ saa_wbytes(s, &v, 8);
+}
+
+void saa_writeaddr(struct SAA *s, uint64_t v, size_t len)
+{
+ v = cpu_to_le64(v);
+ saa_wbytes(s, &v, len);
+}
+
+/* write unsigned LEB128 value to SAA */
+void saa_wleb128u(struct SAA *psaa, int value)
+{
+ char temp[64], *ptemp;
+ uint8_t byte;
+ int len;
+
+ ptemp = temp;
+ len = 0;
+ do {
+ byte = value & 127;
+ value >>= 7;
+ if (value != 0) /* more bytes to come */
+ byte |= 0x80;
+ *ptemp = byte;
+ ptemp++;
+ len++;
+ } while (value != 0);
+ saa_wbytes(psaa, temp, len);
+}
+
+/* write signed LEB128 value to SAA */
+void saa_wleb128s(struct SAA *psaa, int value)
+{
+ char temp[64], *ptemp;
+ uint8_t byte;
+ bool more, negative;
+ int size, len;
+
+ ptemp = temp;
+ more = 1;
+ negative = (value < 0);
+ size = sizeof(int) * 8;
+ len = 0;
+ while (more) {
+ byte = value & 0x7f;
+ value >>= 7;
+ if (negative)
+ /* sign extend */
+ value |= -(1 << (size - 7));
+ /* sign bit of byte is second high order bit (0x40) */
+ if ((value == 0 && !(byte & 0x40)) ||
+ ((value == -1) && (byte & 0x40)))
+ more = 0;
+ else
+ byte |= 0x80;
+ *ptemp = byte;
+ ptemp++;
+ len++;
+ }
+ saa_wbytes(psaa, temp, len);
+}
diff --git a/nasmlib/srcfile.c b/nasmlib/srcfile.c
new file mode 100644
index 00000000..6fbe763f
--- /dev/null
+++ b/nasmlib/srcfile.c
@@ -0,0 +1,122 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * srcfile.c - keep track of the current position in the input stream
+ */
+
+#include "compiler.h"
+
+#include <string.h>
+#include <inttypes.h>
+
+#include "nasmlib.h"
+#include "hashtbl.h"
+
+static const char *file_name = NULL;
+static int32_t line_number = 0;
+
+static struct hash_table filename_hash;
+
+void src_init(void)
+{
+ hash_init(&filename_hash, HASH_MEDIUM);
+}
+
+void src_free(void)
+{
+ hash_free_all(&filename_hash, false);
+}
+
+/*
+ * Set the current filename, returning the old one. The input
+ * filename is duplicated if needed.
+ */
+const char *src_set_fname(const char *newname)
+{
+ struct hash_insert hi;
+ const char *oldname;
+ void **dp;
+
+ if (newname) {
+ dp = hash_find(&filename_hash, newname, &hi);
+ if (dp) {
+ newname = (const char *)(*dp);
+ } else {
+ newname = nasm_strdup(newname);
+ hash_add(&hi, newname, (void *)newname);
+ }
+ }
+
+ oldname = file_name;
+ file_name = newname;
+ return oldname;
+}
+
+int32_t src_set_linnum(int32_t newline)
+{
+ int32_t oldline = line_number;
+ line_number = newline;
+ return oldline;
+}
+
+void src_set(int32_t line, const char *fname)
+{
+ src_set_fname(fname);
+ src_set_linnum(line);
+}
+
+const char *src_get_fname(void)
+{
+ return file_name;
+}
+
+int32_t src_get_linnum(void)
+{
+ return line_number;
+}
+
+int32_t src_get(int32_t *xline, const char **xname)
+{
+ const char *xn = *xname;
+ int32_t xl = *xline;
+
+ *xline = line_number;
+ *xname = file_name;
+
+ /* XXX: Is the strcmp() really needed here? */
+ if (!file_name || !xn || (xn != file_name && strcmp(xn, file_name)))
+ return -2;
+ else
+ return line_number - xl;
+}
diff --git a/nasmlib/string.c b/nasmlib/string.c
new file mode 100644
index 00000000..907df32f
--- /dev/null
+++ b/nasmlib/string.c
@@ -0,0 +1,242 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "nasmlib.h"
+
+/*
+ * Prepare a table of tolower() results. This avoids function calls
+ * on some platforms.
+ */
+
+unsigned char nasm_tolower_tab[256];
+
+void tolower_init(void)
+{
+ int i;
+
+ for (i = 0; i < 256; i++)
+ nasm_tolower_tab[i] = tolower(i);
+}
+
+#ifndef nasm_stricmp
+int nasm_stricmp(const char *s1, const char *s2)
+{
+ unsigned char c1, c2;
+ int d;
+
+ while (1) {
+ c1 = nasm_tolower(*s1++);
+ c2 = nasm_tolower(*s2++);
+ d = c1-c2;
+
+ if (d)
+ return d;
+ if (!c1)
+ break;
+ }
+ return 0;
+}
+#endif
+
+#ifndef nasm_strnicmp
+int nasm_strnicmp(const char *s1, const char *s2, size_t n)
+{
+ unsigned char c1, c2;
+ int d;
+
+ while (n--) {
+ c1 = nasm_tolower(*s1++);
+ c2 = nasm_tolower(*s2++);
+ d = c1-c2;
+
+ if (d)
+ return d;
+ if (!c1)
+ break;
+ }
+ return 0;
+}
+#endif
+
+int nasm_memicmp(const char *s1, const char *s2, size_t n)
+{
+ unsigned char c1, c2;
+ int d;
+
+ while (n--) {
+ c1 = nasm_tolower(*s1++);
+ c2 = nasm_tolower(*s2++);
+ d = c1-c2;
+ if (d)
+ return d;
+ }
+ return 0;
+}
+
+#ifndef nasm_strsep
+char *nasm_strsep(char **stringp, const char *delim)
+{
+ char *s = *stringp;
+ char *e;
+
+ if (!s)
+ return NULL;
+
+ e = strpbrk(s, delim);
+ if (e)
+ *e++ = '\0';
+
+ *stringp = e;
+ return s;
+}
+#endif
+
+/* skip leading spaces */
+char *nasm_skip_spaces(const char *p)
+{
+ if (p)
+ while (*p && nasm_isspace(*p))
+ p++;
+ return (char *)p;
+}
+
+/* skip leading non-spaces */
+char *nasm_skip_word(const char *p)
+{
+ if (p)
+ while (*p && !nasm_isspace(*p))
+ p++;
+ return (char *)p;
+}
+
+/* zap leading spaces with zero */
+char *nasm_zap_spaces_fwd(char *p)
+{
+ if (p)
+ while (*p && nasm_isspace(*p))
+ *p++ = 0x0;
+ return p;
+}
+
+/* zap spaces with zero in reverse order */
+char *nasm_zap_spaces_rev(char *p)
+{
+ if (p)
+ while (*p && nasm_isspace(*p))
+ *p-- = 0x0;
+ return p;
+}
+
+/* zap leading and trailing spaces */
+char *nasm_trim_spaces(char *p)
+{
+ p = nasm_zap_spaces_fwd(p);
+ nasm_zap_spaces_fwd(nasm_skip_word(p));
+
+ return p;
+}
+
+/*
+ * return the word extracted from a stream
+ * or NULL if nothing left
+ */
+char *nasm_get_word(char *p, char **tail)
+{
+ char *word = nasm_skip_spaces(p);
+ char *next = nasm_skip_word(word);
+
+ if (word && *word) {
+ if (*next)
+ *next++ = '\0';
+ } else
+ word = next = NULL;
+
+ /* NOTE: the tail may start with spaces */
+ *tail = next;
+
+ return word;
+}
+
+/*
+ * Extract "opt=val" values from the stream and
+ * returns "opt"
+ *
+ * Exceptions:
+ * 1) If "=val" passed the NULL returned though
+ * you may continue handling the tail via "next"
+ * 2) If "=" passed the NULL is returned and "val"
+ * is set to NULL as well
+ */
+char *nasm_opt_val(char *p, char **val, char **next)
+{
+ char *q, *nxt;
+
+ *val = *next = NULL;
+
+ p = nasm_get_word(p, &nxt);
+ if (!p)
+ return NULL;
+
+ q = strchr(p, '=');
+ if (q) {
+ if (q == p)
+ p = NULL;
+ *q++='\0';
+ if (*q) {
+ *val = q;
+ } else {
+ q = nasm_get_word(q + 1, &nxt);
+ if (q)
+ *val = q;
+ }
+ } else {
+ q = nasm_skip_spaces(nxt);
+ if (q && *q == '=') {
+ q = nasm_get_word(q + 1, &nxt);
+ if (q)
+ *val = q;
+ }
+ }
+
+ *next = nxt;
+ return p;
+}
diff --git a/nasmlib/strlist.c b/nasmlib/strlist.c
new file mode 100644
index 00000000..8a8213ae
--- /dev/null
+++ b/nasmlib/strlist.c
@@ -0,0 +1,93 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * strlist.c - list of unique, ordered strings
+ */
+
+#include "strlist.h"
+
+/*
+ * Create a string list
+ */
+StrList *strlist_allocate(void)
+{
+ StrList *list;
+
+ nasm_new(list);
+ hash_init(&list->hash, HASH_MEDIUM);
+ list->tailp = &list->head;
+
+ return list;
+}
+
+/*
+ * Append a string to a string list if and only if it isn't
+ * already there. Return true if it was added.
+ */
+bool strlist_add_string(StrList *list, const char *str)
+{
+ struct hash_insert hi;
+ struct strlist_entry *sl;
+ size_t l;
+
+ if (!list)
+ return false;
+
+ if (hash_find(&list->hash, str, &hi))
+ return false; /* Already present */
+
+ l = strlen(str);
+
+ sl = nasm_malloc(sizeof(struct strlist_entry) + l);
+ sl->len = l;
+ memcpy(sl->str, str, l+1);
+ sl->next = NULL;
+ *list->tailp = sl;
+ list->tailp = &sl->next;
+
+ hash_add(&hi, sl->str, (void *)sl);
+ return true;
+}
+
+/*
+ * Free a string list
+ */
+void strlist_free(StrList *list)
+{
+ if (!list)
+ return;
+
+ hash_free_all(&list->hash, false);
+ nasm_free(list);
+}
diff --git a/nasmlib/ver.c b/nasmlib/ver.c
new file mode 100644
index 00000000..826ff159
--- /dev/null
+++ b/nasmlib/ver.c
@@ -0,0 +1,50 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "ver.h"
+#include "version.h"
+
+/* This is printed when entering nasm -v */
+const char nasm_version[] = NASM_VER;
+const char nasm_compile_options[] = ""
+#ifdef DEBUG
+ " with -DDEBUG"
+#endif
+ ;
+
+/* These are used by some backends. */
+const char nasm_comment[] =
+ "The Netwide Assembler " NASM_VER;
+
+const char nasm_signature[] =
+ "NASM " NASM_VER;
diff --git a/nasmlib/zerobuf.c b/nasmlib/zerobuf.c
new file mode 100644
index 00000000..651c0fd4
--- /dev/null
+++ b/nasmlib/zerobuf.c
@@ -0,0 +1,42 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * nasmlib.c library routines for the Netwide Assembler
+ */
+
+#include "compiler.h"
+#include "nasmlib.h"
+
+/* Uninitialized -> all zero by C spec */
+const uint8_t zero_buffer[ZERO_BUF_SIZE];
diff --git a/ndisasm.txt b/ndisasm.txt
new file mode 100644
index 00000000..eaccfe4e
--- /dev/null
+++ b/ndisasm.txt
@@ -0,0 +1,94 @@
+ndisasm(1)
+==========
+:doctype: manpage
+:man source: NASM
+:man manual: The Netwide Assembler Project
+
+NAME
+----
+ndisasm - the Netwide Disassembler, an 80x86 binary file disassembler
+
+SYNOPSIS
+--------
+*ndisasm* [ *-o* origin ] [ *-s* sync-point [...]] [ *-a* | *-i* ]
+ [ *-b* bits ] [ *-u* ] [ *-e* hdrlen ] [ *-p* vendor ]
+ [ *-k* offset,length [...]] infile
+
+DESCRIPTION
+-----------
+The *ndisasm* command generates a disassembly listing of the binary file
+infile and directs it to stdout.
+
+OPTIONS
+-------
+*-h*::
+ Causes *ndisasm* to exit immediately, after giving a summary
+ of its invocation options.
+
+*-r*|*-v*::
+ Causes *ndisasm* to exit immediately, after displaying its
+ version number.
+
+*-o* 'origin'::
+ Specifies the notional load address for the file. This
+ option causes *ndisasm* to get the addresses it lists
+ down the left hand margin, and the target addresses
+ of PC-relative jumps and calls, right.
+
+*-s* 'sync-point'::
+ Manually specifies a synchronisation address, such that
+ *ndisasm* will not output any machine instruction which
+ encompasses bytes on both sides of the address. Hence
+ the instruction which starts at that address will be
+ correctly disassembled.
+
+*-e* 'hdrlen'::
+ Specifies a number of bytes to discard from the beginning
+ of the file before starting disassembly. This does not
+ count towards the calculation of the disassembly offset:
+ the first 'disassembled' instruction will be shown starting
+ at the given load address.
+
+*-k* 'offset,length'::
+ Specifies that 'length' bytes, starting from disassembly
+ offset 'offset', should be skipped over without generating
+ any output. The skipped bytes still count towards the
+ calculation of the disassembly offset.
+
+*-a*|*-i*::
+ Enables automatic (or intelligent) sync mode, in which
+ *ndisasm* will attempt to guess where synchronisation should
+ be performed, by means of examining the target addresses
+ of the relative jumps and calls it disassembles.
+
+*-b* 'bits'::
+ Specifies 16-, 32- or 64-bit mode. The default is 16-bit
+ mode.
+
+*-u*::
+ Specifies 32-bit mode, more compactly than using `-b 32'.
+
+*-p* 'vendor'::
+ Prefers instructions as defined by 'vendor' in case of
+ a conflict. Known 'vendor' names include *intel*, *amd*,
+ *cyrix*, and *idt*. The default is *intel*.
+
+RESTRICTIONS
+------------
+*ndisasm* only disassembles binary files: it has no understanding of
+the header information present in object or executable files.
+If you want to disassemble an object file, you should probably
+be using *objdump*(1).
+
+Auto-sync mode won't necessarily cure all your synchronisation
+problems: a sync marker can only be placed automatically if a
+jump or call instruction is found to refer to it 'before'
+*ndisasm* actually disassembles that part of the code. Also,
+if spurious jumps or calls result from disassembling
+non-machine-code data, sync markers may get placed in strange
+places. Feel free to turn auto-sync off and go back to doing
+it manually if necessary.
+
+SEE ALSO
+--------
+*objdump*(1)
diff --git a/nsis/NASMMultiUser.nsh b/nsis/NASMMultiUser.nsh
new file mode 100755
index 00000000..a5dc3a4a
--- /dev/null
+++ b/nsis/NASMMultiUser.nsh
@@ -0,0 +1,478 @@
+/*
+
+MultiUser.nsh
+
+Installer configuration for multi-user Windows environments
+
+Copyright 2008-2009 Joost Verburg
+Updated 2016 by H. Peter Anvin to handle 64-bit Windows
+
+*/
+
+!ifndef MULTIUSER_INCLUDED
+!define MULTIUSER_INCLUDED
+!verbose push
+!verbose 3
+
+;Standard NSIS header files
+
+!ifdef MULTIUSER_MUI
+ !include MUI2.nsh
+!endif
+!include nsDialogs.nsh
+!include LogicLib.nsh
+!include WinVer.nsh
+!include FileFunc.nsh
+
+;Variables
+
+Var MultiUser.Privileges
+Var MultiUser.InstallMode
+
+;Command line installation mode setting
+
+!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
+ !include StrFunc.nsh
+ !ifndef StrStr_INCLUDED
+ ${StrStr}
+ !endif
+ !ifndef MULTIUSER_NOUNINSTALL
+ !ifndef UnStrStr_INCLUDED
+ ${UnStrStr}
+ !endif
+ !endif
+
+ Var MultiUser.Parameters
+ Var MultiUser.Result
+!endif
+
+;Installation folder stored in registry
+
+!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+ Var MultiUser.InstDir
+!endif
+
+!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
+ Var MultiUser.DefaultKeyValue
+!endif
+
+;Windows Vista UAC setting
+
+!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
+ RequestExecutionLevel admin
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
+ RequestExecutionLevel admin
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
+ RequestExecutionLevel highest
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else
+ RequestExecutionLevel user
+!endif
+
+/*
+
+Install modes
+
+*/
+
+!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Install mode initialization - per-machine
+
+ ${ifnot} ${IsNT}
+ ${orif} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+
+ StrCpy $MultiUser.InstallMode AllUsers
+
+ SetShellVarContext all
+
+ !if "${UNINSTALLER_PREFIX}" != UN
+ ;Set default installation location for installer
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR
+ StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ !endif
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+
+ ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
+
+ ${if} $MultiUser.InstDir != ""
+ StrCpy $INSTDIR $MultiUser.InstDir
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
+ Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
+ !endif
+
+ ${endif}
+
+!macroend
+
+!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Install mode initialization - per-user
+
+ ${if} ${IsNT}
+
+ StrCpy $MultiUser.InstallMode CurrentUser
+
+ SetShellVarContext current
+
+ !if "${UNINSTALLER_PREFIX}" != UN
+ ;Set default installation location for installer
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR
+ ${if} ${AtLeastWin2000}
+ StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ ${else}
+ StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ ${endif}
+ !endif
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+
+ ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
+
+ ${if} $MultiUser.InstDir != ""
+ StrCpy $INSTDIR $MultiUser.InstDir
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
+ Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
+ !endif
+
+ ${endif}
+
+!macroend
+
+Function MultiUser.InstallMode.AllUsers
+ !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
+FunctionEnd
+
+Function MultiUser.InstallMode.CurrentUser
+ !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
+FunctionEnd
+
+!ifndef MULTIUSER_NOUNINSTALL
+
+Function un.MultiUser.InstallMode.AllUsers
+ !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
+FunctionEnd
+
+Function un.MultiUser.InstallMode.CurrentUser
+ !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
+FunctionEnd
+
+!endif
+
+/*
+
+Installer/uninstaller initialization
+
+*/
+
+!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
+
+ !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
+ Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
+ !else
+ Quit
+ !endif
+
+!macroend
+
+!macro MULTIUSER_INIT_TEXTS
+
+ !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
+ !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges."
+ !endif
+
+ !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
+ !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
+ !endif
+
+ !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
+ !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
+ !endif
+
+!macroend
+
+!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Installer initialization - check privileges and set install mode
+
+ !insertmacro MULTIUSER_INIT_TEXTS
+
+ UserInfo::GetAccountType
+ Pop $MultiUser.Privileges
+
+ ${if} ${IsNT}
+
+ ;Check privileges
+
+ !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
+
+ ${if} $MultiUser.Privileges != "Admin"
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
+ !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
+ ${endif}
+
+ !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
+
+ ${if} $MultiUser.Privileges != "Power"
+ ${andif} $MultiUser.Privileges != "Admin"
+ ${if} ${AtMostWinXP}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
+ ${else}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
+ ${endif}
+ !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+
+ ;Default to per-machine installation if possible
+
+ ${if} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+ !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ !else
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
+
+ ;Set installation mode to setting from a previous installation
+
+ !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
+ ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue == ""
+ ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+ ${endif}
+ !else
+ ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue == ""
+ ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ ${endif}
+ ${endif}
+ !endif
+
+ !endif
+
+ ${else}
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ !else
+
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
+
+ ;Check for install mode setting on command line
+
+ ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
+
+ ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
+
+ ${if} $MultiUser.Result != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"
+
+ ${if} $MultiUser.Result != ""
+ ${if} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ ${else}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
+ ${endif}
+ ${endif}
+
+ !endif
+
+ ${else}
+
+ ;Not running Windows NT, per-user installation not supported
+
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+
+ ${endif}
+
+!macroend
+
+!macro MULTIUSER_INIT
+ !verbose push
+ !verbose 3
+
+ !insertmacro MULTIUSER_INIT_CHECKS "" ""
+
+ !verbose pop
+!macroend
+
+!ifndef MULTIUSER_NOUNINSTALL
+
+!macro MULTIUSER_UNINIT
+ !verbose push
+ !verbose 3
+
+ !insertmacro MULTIUSER_INIT_CHECKS Un un.
+
+ !verbose pop
+!macroend
+
+!endif
+
+/*
+
+Modern UI 2 page
+
+*/
+
+!ifdef MULTIUSER_MUI
+
+!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
+
+ !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
+ !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
+ Var MultiUser.InstallModePage
+
+ Var MultiUser.InstallModePage.Text
+
+ Var MultiUser.InstallModePage.AllUsers
+ Var MultiUser.InstallModePage.CurrentUser
+
+ Var MultiUser.InstallModePage.ReturnValue
+ !endif
+
+!macroend
+
+!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
+
+ !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
+ !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"
+
+ PageEx custom
+
+ PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
+
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
+
+!macroend
+
+!macro MULTIUSER_PAGE_INSTALLMODE
+
+ ;Modern UI page for install mode
+
+ !verbose push
+ !verbose 3
+
+ !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+ !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
+ !endif
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
+
+ !verbose pop
+
+!macroend
+
+!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
+
+ !ifndef MULTIUSER_TEXT_NOTADMIN
+ !define MULTIUSER_TEXT_NOTADMIN "The installer is currently running as an unprivileged user. It will not be possible to install this software for all users on the system. Cancel and re-run the installer as Administrator to install system-wide."
+ !endif
+
+ ;Page functions of Modern UI page
+
+ Function "${PRE}"
+
+ ${ifnot} ${IsNT}
+ Abort
+ ${endif}
+
+ ${if} $MultiUser.Privileges != "Power"
+ ${andif} $MultiUser.Privileges != "Admin"
+ MessageBox MB_OKCANCEL "${MULTIUSER_TEXT_NOTADMIN}" /SD IDOK IDABORT nofun
+ Abort
+
+ nofun:
+ Quit
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
+
+ nsDialogs::Create 1018
+ Pop $MultiUser.InstallModePage
+
+ ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
+ Pop $MultiUser.InstallModePage.Text
+
+ ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
+ Pop $MultiUser.InstallModePage.AllUsers
+
+ ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
+ Pop $MultiUser.InstallModePage.CurrentUser
+
+ ${if} $MultiUser.InstallMode == "AllUsers"
+ SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${else}
+ SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ nsDialogs::Show
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+ SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
+
+ ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
+ Call MultiUser.InstallMode.AllUsers
+ ${else}
+ Call MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+ FunctionEnd
+
+!macroend
+
+!endif
+
+!verbose pop
+!endif
diff --git a/nsis/getpearch.pl b/nsis/getpearch.pl
new file mode 100644
index 00000000..e524372b
--- /dev/null
+++ b/nsis/getpearch.pl
@@ -0,0 +1,76 @@
+#!/usr/bin/perl
+#
+# Get the appropriate variables to make an NSIS installer file
+# based on the PE architecture of a specific file
+#
+
+use strict;
+use bytes;
+
+my %archnames = (
+ 0x01de => 'am33',
+ 0x8664 => 'x64',
+ 0x01c0 => 'arm32',
+ 0x01c4 => 'thumb',
+ 0xaa64 => 'arm64',
+ 0x0ebc => 'efi',
+ 0x014c => 'x86',
+ 0x0200 => 'ia64',
+ 0x9041 => 'm32r',
+ 0x0266 => 'mips16',
+ 0x0366 => 'mips',
+ 0x0466 => 'mips16',
+ 0x01f0 => 'powerpc',
+ 0x01f1 => 'powerpc',
+ 0x0166 => 'mips',
+ 0x01a2 => 'sh3',
+ 0x01a3 => 'sh3',
+ 0x01a6 => 'sh4',
+ 0x01a8 => 'sh5',
+ 0x01c2 => 'arm32',
+ 0x0169 => 'wcemipsv2'
+);
+
+my ($file) = @ARGV;
+open(my $fh, '<', $file)
+ or die "$0: cannot open file: $file: $!\n";
+
+read($fh, my $mz, 2);
+exit 1 if ($mz ne 'MZ');
+
+exit 0 unless (seek($fh, 0x3c, 0));
+exit 0 unless (read($fh, my $pe_offset, 4) == 4);
+$pe_offset = unpack("V", $pe_offset);
+
+exit 1 unless (seek($fh, $pe_offset, 0));
+read($fh, my $pe, 4);
+exit 1 unless ($pe eq "PE\0\0");
+
+exit 1 unless (read($fh, my $arch, 2) == 2);
+$arch = $archnames{unpack("v", $arch)};
+if (defined($arch)) {
+ print "!define ARCH ${arch}\n";
+}
+
+exit 1 unless (seek($fh, 14, 1));
+exit 1 unless (read($fh, my $auxheaderlen, 2) == 2);
+exit 1 unless (unpack("v", $auxheaderlen) >= 2);
+
+exit 1 unless (seek($fh, 2, 1));
+exit 1 unless (read($fh, my $petype, 2) == 2);
+$petype = unpack("v", $petype);
+if ($petype == 0x010b) {
+ # It is a 32-bit PE32 file
+ print "!define BITS 32\n";
+ print "!define GLOBALINSTDIR \$PROGRAMFILES\n";
+} elsif ($petype == 0x020b) {
+ # It is a 64-bit PE32+ file
+ print "!define BITS 64\n";
+ print "!define GLOBALINSTDIR \$PROGRAMFILES64\n";
+} else {
+ # No idea...
+ exit 1;
+}
+
+close($fh);
+exit 0;
diff --git a/nsis/nasm-un.ico b/nsis/nasm-un.ico
new file mode 100644
index 00000000..18c92d07
--- /dev/null
+++ b/nsis/nasm-un.ico
Binary files differ
diff --git a/nsis/nasm.ico b/nsis/nasm.ico
new file mode 100644
index 00000000..37e1c3dc
--- /dev/null
+++ b/nsis/nasm.ico
Binary files differ
diff --git a/nsis/nasm.nsi b/nsis/nasm.nsi
new file mode 100644
index 00000000..ad368e57
--- /dev/null
+++ b/nsis/nasm.nsi
@@ -0,0 +1,241 @@
+#!Nsis Installer Command Script
+
+#
+# Copyright (c) 2009, Shao Miller (shao.miller@yrdsb.edu.on.ca)
+# Copyright (c) 2009, Cyrill Gorcunov (gorcunov@gmail.com)
+# All rights reserved.
+#
+# The script requires NSIS v2.45 (or any later)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * 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 <copyright holder> 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.
+
+!addincludedir "${objdir}\nsis"
+!addincludedir "${srcdir}\nsis"
+!include "version.nsh"
+!include "arch.nsh"
+
+!define PRODUCT_NAME "Netwide Assembler"
+!define PRODUCT_SHORT_NAME "nasm"
+!define PACKAGE_NAME "${PRODUCT_NAME} ${VERSION}"
+!define PACKAGE_SHORT_NAME "${PRODUCT_SHORT_NAME}-${VERSION}"
+
+SetCompressor /solid lzma
+
+!if "${NSIS_PACKEDVERSION}" >= 0x3000000
+Unicode true
+!endif
+
+!define MULTIUSER_EXECUTIONLEVEL Highest
+!define MULTIUSER_MUI
+!define MULTIUSER_INSTALLMODE_COMMANDLINE
+!define MULTIUSER_INSTALLMODE_INSTDIR "NASM"
+!include "NASMMultiUser.nsh"
+
+!insertmacro MULTIUSER_PAGE_INSTALLMODE
+!insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
+
+;--------------------------------
+;General
+
+;Name and file
+Name "${PACKAGE_NAME}"
+OutFile "${objdir}\${PACKAGE_SHORT_NAME}-installer-${ARCH}.exe"
+
+;Get installation folder from registry if available
+InstallDirRegKey HKCU "Software\${PRODUCT_SHORT_NAME}" ""
+
+;Request application privileges for Windows Vista
+RequestExecutionLevel user
+
+;--------------------------------
+;Variables
+
+Var StartMenuFolder
+Var CmdFailed
+
+;--------------------------------
+;Interface Settings
+Caption "${PACKAGE_SHORT_NAME} installation"
+Icon "${srcdir}\nsis\nasm.ico"
+UninstallIcon "${srcdir}\nsis\nasm-un.ico"
+
+!define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+
+;Start Menu Folder Page Configuration
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${PRODUCT_SHORT_NAME}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_SHORT_NAME}"
+
+!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
+
+!insertmacro MUI_PAGE_INSTFILES
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Installer Sections
+
+!insertmacro MUI_LANGUAGE English
+
+Section "NASM" SecNasm
+ Sectionin RO
+ SetOutPath "$INSTDIR"
+ File "${srcdir}\LICENSE"
+ File "${objdir}\nasm.exe"
+ File "${objdir}\ndisasm.exe"
+ File "${srcdir}\nsis\nasm.ico"
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\${PRODUCT_SHORT_NAME}" "" $INSTDIR
+
+ ;Store shortcuts folder
+ WriteRegStr HKCU "Software\${PRODUCT_SHORT_NAME}\" "lnk" $SMPROGRAMS\$StartMenuFolder
+ WriteRegStr HKCU "Software\${PRODUCT_SHORT_NAME}\" "bat-lnk" $DESKTOP\${PRODUCT_SHORT_NAME}.lnk
+
+ ;
+ ; the bat we need
+ StrCpy $CmdFailed "true"
+ FileOpen $0 "nasmpath.bat" w
+ IfErrors skip
+ StrCpy $CmdFailed "false"
+ FileWrite $0 "@set path=$INSTDIR;%path%$\r$\n"
+ FileWrite $0 "@%comspec%"
+ FileClose $0
+ CreateShortCut "$DESKTOP\${PRODUCT_SHORT_NAME}.lnk" "$INSTDIR\nasmpath.bat" "" "$INSTDIR\nasm.ico" 0
+skip:
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+ ;Create shortcuts
+ CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
+ StrCmp $CmdFailed "true" +2
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_SHORT_NAME}-shell.lnk" "$INSTDIR\nasmpath.bat"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_SHORT_NAME}.lnk" "$INSTDIR\nasm.exe" "" "$INSTDIR\nasm.ico" 0
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+
+ !insertmacro MUI_STARTMENU_WRITE_END
+SectionEnd
+
+Section "RDOFF" SecRdoff
+ File "${objdir}\rdoff\ldrdf.exe"
+ File "${objdir}\rdoff\rdf2bin.exe"
+ File "${objdir}\rdoff\rdf2com.exe"
+ File "${objdir}\rdoff\rdf2ith.exe"
+ File "${objdir}\rdoff\rdf2ihx.exe"
+ File "${objdir}\rdoff\rdf2srec.exe"
+ File "${objdir}\rdoff\rdfdump.exe"
+ File "${objdir}\rdoff\rdflib.exe"
+SectionEnd
+
+Section "Manual" SecManual
+ SetOutPath "$INSTDIR"
+ File "${objdir}\doc\nasmdoc.pdf"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Manual.lnk" "$INSTDIR\nasmdoc.pdf"
+SectionEnd
+
+Section "VS8 integration" SecVS8
+ CreateDirectory "$INSTDIR\VSrules"
+ SetOutPath "$INSTDIR\VSrules"
+ File "${srcdir}\contrib\VSrules\nasm.README"
+ File "${srcdir}\contrib\VSrules\nasm.rules"
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;Language strings
+ LangString DESC_SecNasm ${LANG_ENGLISH} "NASM assembler and disassember modules"
+ LangString DESC_SecManual ${LANG_ENGLISH} "Complete NASM manual (pdf file)"
+ LangString DESC_SecRdoff ${LANG_ENGLISH} "RDOFF utilities (you may not need it if you don't know what is it)"
+ LangString DESC_SecVS8 ${LANG_ENGLISH} "Visual Studio 2008 NASM integration (rules file)"
+
+ ;Assign language strings to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecNasm} $(DESC_SecNasm)
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecRdoff} $(DESC_SecRdoff)
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecManual} $(DESC_SecManual)
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecVS8} $(DESC_SecVS8)
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+ ;
+ ; files on HDD
+ IfFileExists "$INSTDIR" +3 +1
+ MessageBox MB_OK "No files found, aborting."
+ Abort
+ MessageBox MB_YESNO "The following directory will be deleted$\n$INSTDIR" IDYES rm_instdir_true IDNO rm_instdir_false
+ rm_instdir_true:
+ RMDir /r /rebootok "$INSTDIR"
+ rm_instdir_false:
+
+ ;
+ ; Desktop link
+ ReadRegStr $0 HKCU Software\${PRODUCT_SHORT_NAME} "bat-lnk"
+ StrCmp $0 0 +1 +3
+ MessageBox MB_OK "Invalid path to a bat-lnk file, aborting"
+ Abort
+ IfFileExists $0 +3 +1
+ MessageBox MB_OK "No bat-lnk files found, aborting."
+ Abort
+ MessageBox MB_YESNO "The following file will be deleted$\n$0" IDYES rm_batlinks_true IDNO rm_batlinks_false
+ rm_batlinks_true:
+ Delete /rebootok "$0"
+ RMDir "$0"
+ rm_batlinks_false:
+
+ ;
+ ; Start menu folder
+ ReadRegStr $0 HKCU Software\${PRODUCT_SHORT_NAME} "lnk"
+ StrCmp $0 0 +1 +3
+ MessageBox MB_OK "Invalid path to a lnk file, aborting"
+ Abort
+ IfFileExists $0 +3 +1
+ MessageBox MB_OK "No lnk files found, aborting."
+ Abort
+ MessageBox MB_YESNO "The following directory will be deleted$\n$0" IDYES rm_links_true IDNO rm_links_false
+ rm_links_true:
+ Delete /rebootok "$0\*"
+ RMDir "$0"
+ rm_links_false:
+ DeleteRegKey /ifempty HKCU "Software\${PRODUCT_SHORT_NAME}"
+SectionEnd
+
+;
+; MUI requires this hooks
+Function .onInit
+ SetRegView ${BITS}
+ !insertmacro MULTIUSER_INIT
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MULTIUSER_UNINIT
+FunctionEnd
diff --git a/output/codeview.c b/output/codeview.c
new file mode 100644
index 00000000..0fbdcab7
--- /dev/null
+++ b/output/codeview.c
@@ -0,0 +1,826 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * codeview.c Codeview Debug Format support for COFF
+ */
+
+#include "version.h"
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "preproc.h"
+#include "saa.h"
+#include "hashtbl.h"
+#include "outlib.h"
+#include "pecoff.h"
+#include "md5.h"
+
+static void cv8_init(void);
+static void cv8_linenum(const char *filename, int32_t linenumber,
+ int32_t segto);
+static void cv8_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special);
+static void cv8_typevalue(int32_t type);
+static void cv8_output(int type, void *param);
+static void cv8_cleanup(void);
+
+const struct dfmt df_cv8 = {
+ "Codeview 8", /* .fullname */
+ "cv8", /* .shortname */
+ cv8_init, /* .init */
+ cv8_linenum, /* .linenum */
+ cv8_deflabel, /* .debug_deflabel */
+ null_debug_directive, /* .debug_directive */
+ cv8_typevalue, /* .debug_typevalue */
+ cv8_output, /* .debug_output */
+ cv8_cleanup, /* .cleanup */
+ NULL /* pragma list */
+};
+
+/*******************************************************************************
+ * dfmt callbacks
+ ******************************************************************************/
+struct source_file;
+
+struct source_file {
+ const char *filename;
+ char *fullname;
+ uint32_t fullnamelen;
+
+ struct source_file *next;
+
+ uint32_t filetbl_off;
+ uint32_t sourcetbl_off;
+
+ struct SAA *lines;
+ uint32_t num_lines;
+
+ unsigned char md5sum[MD5_HASHBYTES];
+};
+
+struct linepair {
+ uint32_t file_offset;
+ uint32_t linenumber;
+};
+
+enum symbol_type {
+ SYMTYPE_CODE,
+ SYMTYPE_PROC,
+ SYMTYPE_LDATA,
+ SYMTYPE_GDATA,
+
+ SYMTYPE_MAX
+};
+
+struct cv8_symbol {
+ enum symbol_type type;
+ char *name;
+
+ uint32_t secrel;
+ uint16_t section;
+ uint32_t size;
+ uint32_t typeindex;
+
+ enum symtype {
+ TYPE_UNREGISTERED = 0x0000, /* T_NOTYPE */
+ TYPE_BYTE = 0x0020,
+ TYPE_WORD = 0x0021,
+ TYPE_DWORD= 0x0022,
+ TYPE_QUAD = 0x0023,
+
+ TYPE_REAL32 = 0x0040,
+ TYPE_REAL64 = 0x0041,
+ TYPE_REAL80 = 0x0042,
+ TYPE_REAL128= 0x0043,
+ TYPE_REAL256= 0x0044,
+ TYPE_REAL512= 0x0045
+ } symtype;
+};
+
+struct cv8_state {
+ int symbol_sect;
+ int type_sect;
+
+ uint32_t text_offset;
+
+ struct source_file *source_files, **source_files_tail;
+ const char *last_filename;
+ struct source_file *last_source_file;
+ struct hash_table file_hash;
+ unsigned num_files;
+ uint32_t total_filename_len;
+
+
+ unsigned total_lines;
+
+ struct SAA *symbols;
+ struct cv8_symbol *last_sym;
+ unsigned num_syms[SYMTYPE_MAX];
+ unsigned symbol_lengths;
+ unsigned total_syms;
+
+ struct {
+ char *name;
+ size_t namebytes;
+ } outfile;
+};
+struct cv8_state cv8_state;
+
+static void cv8_init(void)
+{
+ const uint32_t sect_flags = IMAGE_SCN_MEM_READ |
+ IMAGE_SCN_MEM_DISCARDABLE |
+ IMAGE_SCN_CNT_INITIALIZED_DATA |
+ IMAGE_SCN_ALIGN_1BYTES;
+
+ cv8_state.symbol_sect = coff_make_section(".debug$S", sect_flags);
+ cv8_state.type_sect = coff_make_section(".debug$T", sect_flags);
+
+ cv8_state.text_offset = 0;
+
+ cv8_state.source_files = NULL;
+ cv8_state.source_files_tail = &cv8_state.source_files;
+ hash_init(&cv8_state.file_hash, HASH_MEDIUM);
+
+ cv8_state.num_files = 0;
+ cv8_state.total_filename_len = 0;
+
+ cv8_state.total_lines = 0;
+
+ cv8_state.symbols = saa_init(sizeof(struct cv8_symbol));
+ cv8_state.last_sym = NULL;
+}
+
+static struct source_file *register_file(const char *filename);
+static struct coff_Section *find_section(int32_t segto);
+
+static void cv8_linenum(const char *filename, int32_t linenumber,
+ int32_t segto)
+{
+ struct coff_Section *s;
+ struct linepair *li;
+ struct source_file *file;
+
+ file = register_file(filename);
+
+ s = find_section(segto);
+ if (s == NULL)
+ return;
+
+ if ((s->flags & IMAGE_SCN_MEM_EXECUTE) == 0)
+ return;
+
+ li = saa_wstruct(file->lines);
+ li->file_offset = cv8_state.text_offset;
+ li->linenumber = linenumber;
+
+ file->num_lines++;
+ cv8_state.total_lines++;
+}
+
+static void cv8_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ struct cv8_symbol *sym;
+ struct coff_Section *s;
+
+ (void)special;
+
+ s = find_section(segment);
+ if (s == NULL)
+ return;
+
+ sym = saa_wstruct(cv8_state.symbols);
+
+ if (s->flags & IMAGE_SCN_MEM_EXECUTE)
+ sym->type = is_global ? SYMTYPE_PROC : SYMTYPE_CODE;
+ else
+ sym->type = is_global ? SYMTYPE_GDATA : SYMTYPE_LDATA;
+ cv8_state.num_syms[sym->type]++;
+ cv8_state.total_syms++;
+
+ sym->section = segment;
+ sym->secrel = offset;
+ sym->symtype = TYPE_UNREGISTERED;
+ sym->size = 0;
+ sym->typeindex = 0;
+
+ sym->name = nasm_strdup(name);
+ cv8_state.symbol_lengths += strlen(sym->name) + 1;
+
+ if (cv8_state.last_sym && cv8_state.last_sym->section == segment)
+ cv8_state.last_sym->size = offset - cv8_state.last_sym->secrel;
+ cv8_state.last_sym = sym;
+}
+
+static void cv8_typevalue(int32_t type)
+{
+ if (!cv8_state.last_sym)
+ return;
+ if (cv8_state.last_sym->symtype != TYPE_UNREGISTERED)
+ return;
+
+ switch (TYM_TYPE(type)) {
+ case TY_BYTE:
+ cv8_state.last_sym->symtype = TYPE_BYTE;
+ break;
+ case TY_WORD:
+ cv8_state.last_sym->symtype = TYPE_WORD;
+ break;
+ case TY_DWORD:
+ cv8_state.last_sym->symtype = TYPE_DWORD;
+ break;
+ case TY_QWORD:
+ cv8_state.last_sym->symtype = TYPE_QUAD;
+ break;
+ case TY_FLOAT:
+ cv8_state.last_sym->symtype = TYPE_REAL32;
+ break;
+ case TY_TBYTE:
+ cv8_state.last_sym->symtype = TYPE_REAL80;
+ break;
+ case TY_OWORD:
+ cv8_state.last_sym->symtype = TYPE_REAL128;
+ break;
+ case TY_YWORD:
+ cv8_state.last_sym->symtype = TYPE_REAL256;
+ break;
+ case TY_ZWORD:
+ cv8_state.last_sym->symtype = TYPE_REAL512;
+ break;
+ case TY_UNKNOWN:
+ break;
+ case TY_LABEL:
+ break;
+ }
+}
+
+static void cv8_output(int type, void *param)
+{
+ struct coff_DebugInfo *dinfo = param;
+
+ (void)type;
+
+ if (dinfo->section && dinfo->section->name &&
+ !strncmp(dinfo->section->name, ".text", 5))
+ cv8_state.text_offset += dinfo->size;
+}
+
+static void build_symbol_table(struct coff_Section *const sect);
+static void build_type_table(struct coff_Section *const sect);
+
+static void cv8_cleanup(void)
+{
+ struct cv8_symbol *sym;
+ struct source_file *file;
+
+ struct coff_Section *symbol_sect = coff_sects[cv8_state.symbol_sect];
+ struct coff_Section *type_sect = coff_sects[cv8_state.type_sect];
+
+ cv8_state.outfile.name = nasm_realpath(outname);
+ cv8_state.outfile.namebytes = strlen(cv8_state.outfile.name) + 1;
+
+ build_symbol_table(symbol_sect);
+ build_type_table(type_sect);
+
+ list_for_each(file, cv8_state.source_files) {
+ nasm_free(file->fullname);
+ saa_free(file->lines);
+ free(file);
+ }
+ hash_free(&cv8_state.file_hash);
+
+ saa_rewind(cv8_state.symbols);
+ while ((sym = saa_rstruct(cv8_state.symbols)))
+ nasm_free(sym->name);
+ saa_free(cv8_state.symbols);
+
+ nasm_free(cv8_state.outfile.name);
+}
+
+/*******************************************************************************
+ * implementation
+ ******************************************************************************/
+static void calc_md5(const char *const filename,
+ unsigned char sum[MD5_HASHBYTES])
+{
+ int success = 0;
+ unsigned char *file_buf;
+ FILE *f;
+ MD5_CTX ctx;
+
+ f = pp_input_fopen(filename, NF_BINARY);
+ if (!f)
+ goto done;
+
+ file_buf = nasm_zalloc(BUFSIZ);
+
+ MD5Init(&ctx);
+ while (!feof(f)) {
+ size_t i = fread(file_buf, 1, BUFSIZ, f);
+ if (ferror(f))
+ goto done_0;
+ else if (i == 0)
+ break;
+ MD5Update(&ctx, file_buf, i);
+ }
+ MD5Final(sum, &ctx);
+
+ success = 1;
+done_0:
+ nasm_free(file_buf);
+ fclose(f);
+done:
+ if (!success) {
+ nasm_error(ERR_NONFATAL, "unable to hash file %s. "
+ "Debug information may be unavailable.\n",
+ filename);
+ }
+ return;
+}
+
+static struct source_file *register_file(const char *filename)
+{
+ struct source_file *file;
+ void **filep;
+ char *fullpath;
+ struct hash_insert hi;
+
+ /*
+ * The common case is that we are invoked with the same filename
+ * as we were last time. Make this a pointer comparison: this is
+ * safe because the NASM core code allocates each filename once
+ * and never frees it.
+ */
+ if (likely(cv8_state.last_filename == filename))
+ return cv8_state.last_source_file;
+
+ cv8_state.last_filename = filename;
+
+ filep = hash_find(&cv8_state.file_hash, filename, &hi);
+ if (likely(filep)) {
+ file = *filep;
+ } else {
+ /* New filename encounter */
+
+ fullpath = nasm_realpath(filename);
+
+ file = nasm_zalloc(sizeof(*file));
+
+ file->filename = filename;
+ file->fullname = fullpath;
+ file->fullnamelen = strlen(fullpath);
+ file->lines = saa_init(sizeof(struct linepair));
+ *cv8_state.source_files_tail = file;
+ cv8_state.source_files_tail = &file->next;
+ calc_md5(fullpath, file->md5sum);
+
+ hash_add(&hi, filename, file);
+
+ cv8_state.num_files++;
+ cv8_state.total_filename_len += file->fullnamelen + 1;
+ }
+
+ cv8_state.last_source_file = file;
+ return file;
+}
+
+static struct coff_Section *find_section(int32_t segto)
+{
+ int i;
+
+ for (i = 0; i < coff_nsects; i++) {
+ struct coff_Section *sec;
+
+ sec = coff_sects[i];
+ if (segto == sec->index)
+ return sec;
+ }
+ return NULL;
+}
+
+static void register_reloc(struct coff_Section *const sect,
+ char *sym, uint32_t addr, uint16_t type)
+{
+ struct coff_Reloc *r;
+ struct coff_Section *sec;
+ uint32_t i;
+
+ r = *sect->tail = nasm_malloc(sizeof(struct coff_Reloc));
+ sect->tail = &r->next;
+ r->next = NULL;
+ sect->nrelocs++;
+
+ r->address = addr;
+ r->symbase = SECT_SYMBOLS;
+ r->type = type;
+
+ r->symbol = 0;
+ for (i = 0; i < (uint32_t)coff_nsects; i++) {
+ sec = coff_sects[i];
+ if (!strcmp(sym, sec->name)) {
+ return;
+ }
+ r->symbol += 2;
+ }
+
+ saa_rewind(coff_syms);
+ for (i = 0; i < coff_nsyms; i++) {
+ struct coff_Symbol *s = saa_rstruct(coff_syms);
+ r->symbol++;
+ if (s->strpos == -1 && !strcmp(sym, s->name)) {
+ return;
+ } else if (s->strpos != -1) {
+ int res;
+ char *symname;
+
+ symname = nasm_malloc(s->namlen + 1);
+ saa_fread(coff_strs, s->strpos-4, symname, s->namlen);
+ symname[s->namlen] = '\0';
+ res = strcmp(sym, symname);
+ nasm_free(symname);
+ if (!res)
+ return;
+ }
+ }
+ nasm_panic("codeview: relocation for unregistered symbol: %s", sym);
+}
+
+static inline void section_write32(struct coff_Section *sect, uint32_t val)
+{
+ saa_write32(sect->data, val);
+ sect->len += 4;
+}
+
+static inline void section_write16(struct coff_Section *sect, uint16_t val)
+{
+ saa_write16(sect->data, val);
+ sect->len += 2;
+}
+
+static inline void section_write8(struct coff_Section *sect, uint8_t val)
+{
+ saa_write8(sect->data, val);
+ sect->len++;
+}
+
+static inline void section_wbytes(struct coff_Section *sect, const void *buf,
+ size_t len)
+{
+ saa_wbytes(sect->data, buf, len);
+ sect->len += len;
+}
+
+static void write_filename_table(struct coff_Section *const sect)
+{
+ uint32_t field_length;
+ uint32_t tbl_off = 1; /* offset starts at 1 to skip NULL entry */
+ struct source_file *file;
+
+ nasm_assert(cv8_state.source_files != NULL);
+ nasm_assert(cv8_state.num_files > 0);
+ nasm_assert(cv8_state.total_filename_len > 0);
+
+ field_length = 1 + cv8_state.total_filename_len;
+
+ section_write32(sect, 0x000000F3);
+ section_write32(sect, field_length);
+
+ section_write8(sect, 0);
+
+ list_for_each(file, cv8_state.source_files) {
+ section_wbytes(sect, file->fullname, file->fullnamelen + 1);
+ file->filetbl_off = tbl_off;
+ tbl_off += file->fullnamelen + 1;
+ }
+}
+
+static void write_sourcefile_table(struct coff_Section *const sect)
+{
+ const uint32_t entry_size = 4 + 2 + MD5_HASHBYTES + 2;
+
+ uint32_t field_length = 0;
+ uint32_t tbl_off = 0;
+ struct source_file *file;
+
+ field_length = entry_size * cv8_state.num_files;
+
+ section_write32(sect, 0x000000F4);
+ section_write32(sect, field_length);
+
+ list_for_each(file, cv8_state.source_files) {
+ nasm_assert(file->filetbl_off > 0);
+ section_write32(sect, file->filetbl_off);
+ section_write16(sect, 0x0110);
+ section_wbytes(sect, file->md5sum, MD5_HASHBYTES);
+ section_write16(sect, 0);
+
+ file->sourcetbl_off = tbl_off;
+ tbl_off += entry_size;
+ }
+}
+
+static void write_linenumber_table(struct coff_Section *const sect)
+{
+ const uint32_t file_field_len = 12;
+ const uint32_t line_field_len = 8;
+
+ int i;
+ uint32_t field_length = 0;
+ size_t field_base;
+ struct source_file *file;
+ struct coff_Section *s;
+
+ for (i = 0; i < coff_nsects; i++) {
+ if (!strncmp(coff_sects[i]->name, ".text", 5))
+ break;
+ }
+
+ if (i == coff_nsects)
+ return;
+ s = coff_sects[i];
+
+ field_length = 12;
+ field_length += (cv8_state.num_files * file_field_len);
+ field_length += (cv8_state.total_lines * line_field_len);
+
+ section_write32(sect, 0x000000F2);
+ section_write32(sect, field_length);
+
+ field_base = sect->len;
+ section_write32(sect, 0); /* SECREL, updated by relocation */
+ section_write16(sect, 0); /* SECTION, updated by relocation*/
+ section_write16(sect, 0); /* pad */
+ section_write32(sect, s->len);
+
+ register_reloc(sect, ".text", field_base,
+ win64 ? IMAGE_REL_AMD64_SECREL : IMAGE_REL_I386_SECREL);
+
+ register_reloc(sect, ".text", field_base + 4,
+ win64 ? IMAGE_REL_AMD64_SECTION : IMAGE_REL_I386_SECTION);
+
+ list_for_each(file, cv8_state.source_files) {
+ struct linepair *li;
+
+ /* source mapping */
+ section_write32(sect, file->sourcetbl_off);
+ section_write32(sect, file->num_lines);
+ section_write32(sect, file_field_len + (file->num_lines * line_field_len));
+
+ /* the pairs */
+ saa_rewind(file->lines);
+ while ((li = saa_rstruct(file->lines))) {
+ section_write32(sect, li->file_offset);
+ section_write32(sect, li->linenumber |= 0x80000000);
+ }
+ }
+}
+
+static uint16_t write_symbolinfo_obj(struct coff_Section *sect)
+{
+ uint16_t obj_len;
+
+ obj_len = 2 + 4 + cv8_state.outfile.namebytes;
+
+ section_write16(sect, obj_len);
+ section_write16(sect, 0x1101);
+ section_write32(sect, 0); /* ASM language */
+ section_wbytes(sect, cv8_state.outfile.name, cv8_state.outfile.namebytes);
+
+ return obj_len;
+}
+
+static uint16_t write_symbolinfo_properties(struct coff_Section *sect,
+ const char *const creator_str)
+{
+ /* https://github.com/Microsoft/microsoft-pdb/blob/1d60e041/include/cvinfo.h#L3313 */
+ uint16_t creator_len;
+
+ creator_len = 2 + 4 + 2 + 3*2 + 3*2 + strlen(creator_str)+1 + 2;
+
+ /*
+ * We used to use a language ID of 3 for "MASM", since it's closest of the
+ * options available; however, BinScope from WACK (the Windows Application
+ * Certification Kit) tests for specific minimum MASM versions and trying to
+ * match an increasing sequence of random MASM version/build numbers seems
+ * like a fool's errand.
+ *
+ * Instead, use a different language ID (NASM is, after all, not MASM
+ * syntax) and just write the actual NASM version number. BinScope appears
+ * to be happy with that.
+ */
+
+ section_write16(sect, creator_len);
+ section_write16(sect, 0x1116);
+ section_write32(sect, 'N'); /* language: 'N' (0x4e) for "NASM"; flags are 0 */
+ if (win64)
+ section_write16(sect, 0x00D0); /* machine */
+ else if (win32)
+ section_write16(sect, 0x0006); /* machine */
+ else
+ nasm_assert(!"neither win32 nor win64 are set!");
+ section_write16(sect, 0); /* verFEMajor */
+ section_write16(sect, 0); /* verFEMinor */
+ section_write16(sect, 0); /* verFEBuild */
+
+ /* BinScope/WACK insist on version >= 8.0.50727 */
+ section_write16(sect, NASM_MAJOR_VER); /* verMajor */
+ section_write16(sect, NASM_MINOR_VER); /* verMinor */
+ section_write16(sect, NASM_SUBMINOR_VER*100 + NASM_PATCHLEVEL_VER); /* verBuild */
+
+ section_wbytes(sect, creator_str, strlen(creator_str)+1); /* verSt */
+ /*
+ * normally there would be key/value pairs here, but they aren't
+ * necessary. They are terminated by 2B
+ */
+ section_write16(sect, 0);
+
+ return creator_len;
+}
+
+static uint16_t write_symbolinfo_symbols(struct coff_Section *sect)
+{
+ uint16_t len = 0, field_len;
+ uint32_t field_base;
+ struct cv8_symbol *sym;
+
+ saa_rewind(cv8_state.symbols);
+ while ((sym = saa_rstruct(cv8_state.symbols))) {
+ switch (sym->type) {
+ case SYMTYPE_LDATA:
+ case SYMTYPE_GDATA:
+ field_len = 12 + strlen(sym->name) + 1;
+ len += field_len - 2;
+ section_write16(sect, field_len);
+ if (sym->type == SYMTYPE_LDATA)
+ section_write16(sect, 0x110C);
+ else
+ section_write16(sect, 0x110D);
+ section_write32(sect, sym->symtype);
+
+ field_base = sect->len;
+ section_write32(sect, 0); /* SECREL */
+ section_write16(sect, 0); /* SECTION */
+ break;
+ case SYMTYPE_PROC:
+ case SYMTYPE_CODE:
+ field_len = 9 + strlen(sym->name) + 1;
+ len += field_len - 2;
+ section_write16(sect, field_len);
+ section_write16(sect, 0x1105);
+
+ field_base = sect->len;
+ section_write32(sect, 0); /* SECREL */
+ section_write16(sect, 0); /* SECTION */
+ section_write8(sect, 0); /* FLAG */
+ break;
+ default:
+ nasm_assert(!"unknown symbol type");
+ }
+
+ section_wbytes(sect, sym->name, strlen(sym->name) + 1);
+
+ register_reloc(sect, sym->name, field_base,
+ win64 ? IMAGE_REL_AMD64_SECREL :
+ IMAGE_REL_I386_SECREL);
+ register_reloc(sect, sym->name, field_base + 4,
+ win64 ? IMAGE_REL_AMD64_SECTION :
+ IMAGE_REL_I386_SECTION);
+ }
+
+ return len;
+}
+
+static void write_symbolinfo_table(struct coff_Section *const sect)
+{
+ static const char creator_str[] = "The Netwide Assembler " NASM_VER;
+ uint16_t obj_length, creator_length, sym_length;
+ uint32_t field_length = 0, out_len;
+
+ nasm_assert(cv8_state.outfile.namebytes);
+
+ /* signature, language, outfile NULL */
+ obj_length = 2 + 4 + cv8_state.outfile.namebytes;
+ creator_length = 2 + 4 + 2 + 3*2 + 3*2 + strlen(creator_str)+1 + 2;
+
+ sym_length = ( cv8_state.num_syms[SYMTYPE_CODE] * 7) +
+ ( cv8_state.num_syms[SYMTYPE_PROC] * 7) +
+ ( cv8_state.num_syms[SYMTYPE_LDATA] * 10) +
+ ( cv8_state.num_syms[SYMTYPE_GDATA] * 10) +
+ cv8_state.symbol_lengths;
+
+ field_length = 2 + obj_length +
+ 2 + creator_length +
+ (4 * cv8_state.total_syms) + sym_length;
+
+ section_write32(sect, 0x000000F1);
+ section_write32(sect, field_length);
+
+ /* for sub fields, length preceeds type */
+
+ out_len = write_symbolinfo_obj(sect);
+ nasm_assert(out_len == obj_length);
+
+ out_len = write_symbolinfo_properties(sect, creator_str);
+ nasm_assert(out_len == creator_length);
+
+ out_len = write_symbolinfo_symbols(sect);
+ nasm_assert(out_len == sym_length);
+}
+
+static inline void align4_table(struct coff_Section *const sect)
+{
+ unsigned diff;
+ uint32_t zero = 0;
+ struct SAA *data = sect->data;
+
+ if (data->wptr % 4 == 0)
+ return;
+
+ diff = 4 - (data->wptr % 4);
+ if (diff)
+ section_wbytes(sect, &zero, diff);
+}
+
+static void build_symbol_table(struct coff_Section *const sect)
+{
+ section_write32(sect, 0x00000004);
+
+ write_filename_table(sect);
+ align4_table(sect);
+ write_sourcefile_table(sect);
+ align4_table(sect);
+ write_linenumber_table(sect);
+ align4_table(sect);
+ write_symbolinfo_table(sect);
+ align4_table(sect);
+}
+
+static void build_type_table(struct coff_Section *const sect)
+{
+ uint16_t field_len;
+ struct cv8_symbol *sym;
+
+ section_write32(sect, 0x00000004);
+
+ saa_rewind(cv8_state.symbols);
+ while ((sym = saa_rstruct(cv8_state.symbols))) {
+ if (sym->type != SYMTYPE_PROC)
+ continue;
+
+ /* proc leaf */
+
+ field_len = 2 + 4 + 4 + 4 + 2;
+ section_write16(sect, field_len);
+ section_write16(sect, 0x1008); /* PROC type */
+
+ section_write32(sect, 0x00000003); /* return type */
+ section_write32(sect, 0); /* calling convention (default) */
+ section_write32(sect, sym->typeindex);
+ section_write16(sect, 0); /* # params */
+
+ /* arglist */
+
+ field_len = 2 + 4;
+ section_write16(sect, field_len);
+ section_write16(sect, 0x1201); /* ARGLIST */
+ section_write32(sect, 0); /*num params */
+ }
+}
diff --git a/output/dwarf.h b/output/dwarf.h
new file mode 100644
index 00000000..f846b2be
--- /dev/null
+++ b/output/dwarf.h
@@ -0,0 +1,621 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef OUTPUT_DWARF_H
+#define OUTPUT_DWARF_H
+
+/*
+ * based on DWARF 3 standart
+ */
+
+enum dwarf_tag {
+ DW_TAG_padding = 0x00,
+ DW_TAG_array_type = 0x01,
+ DW_TAG_class_type = 0x02,
+ DW_TAG_entry_point = 0x03,
+ DW_TAG_enumeration_type = 0x04,
+ DW_TAG_formal_parameter = 0x05,
+ DW_TAG_global_subroutine = 0x06,
+ DW_TAG_global_variable = 0x07,
+ DW_TAG_label = 0x0a,
+ DW_TAG_lexical_block = 0x0b,
+ DW_TAG_local_variable = 0x0c,
+ DW_TAG_member = 0x0d,
+ DW_TAG_pointer_type = 0x0f,
+ DW_TAG_reference_type = 0x10,
+ DW_TAG_compile_unit = 0x11,
+ DW_TAG_string_type = 0x12,
+ DW_TAG_structure_type = 0x13,
+ DW_TAG_subroutine = 0x14,
+ DW_TAG_subroutine_type = 0x15,
+ DW_TAG_typedef = 0x16,
+ DW_TAG_union_type = 0x17,
+ DW_TAG_unspecified_parameters = 0x18,
+ DW_TAG_variant = 0x19,
+ DW_TAG_common_block = 0x1a,
+ DW_TAG_common_inclusion = 0x1b,
+ DW_TAG_inheritance = 0x1c,
+ DW_TAG_inlined_subroutine = 0x1d,
+ DW_TAG_module = 0x1e,
+ DW_TAG_ptr_to_member_type = 0x1f,
+ DW_TAG_set_type = 0x20,
+ DW_TAG_subrange_type = 0x21,
+ DW_TAG_with_stmt = 0x22,
+ DW_TAG_access_declaration = 0x23,
+ DW_TAG_base_type = 0x24,
+ DW_TAG_catch_block = 0x25,
+ DW_TAG_const_type = 0x26,
+ DW_TAG_constant = 0x27,
+ DW_TAG_enumerator = 0x28,
+ DW_TAG_file_type = 0x29,
+ DW_TAG_friend = 0x2a,
+ DW_TAG_namelist = 0x2b,
+ DW_TAG_namelist_item = 0x2c,
+ DW_TAG_packed_type = 0x2d,
+ DW_TAG_subprogram = 0x2e,
+ DW_TAG_template_type_parameter = 0x2f,
+ DW_TAG_template_value_parameter = 0x30,
+ DW_TAG_thrown_type = 0x31,
+ DW_TAG_try_block = 0x32,
+ DW_TAG_variant_part = 0x33,
+ DW_TAG_variable = 0x34,
+ DW_TAG_volatile_type = 0x35,
+ /* DWARF 3 */
+ DW_TAG_dwarf_procedure = 0x36,
+ DW_TAG_restrict_type = 0x37,
+ DW_TAG_interface_type = 0x38,
+ DW_TAG_namespace = 0x39,
+ DW_TAG_imported_module = 0x3a,
+ DW_TAG_unspecified_type = 0x3b,
+ DW_TAG_partial_unit = 0x3c,
+ DW_TAG_imported_unit = 0x3d,
+ DW_TAG_condition = 0x3f,
+ DW_TAG_shared_type = 0x40,
+ /* DWARF 4 */
+ DW_TAG_type_unit = 0x41,
+ DW_TAG_rvalue_reference_type = 0x42,
+ DW_TAG_template_alias = 0x43,
+ /* DWARF 5 */
+ DW_TAG_atomic_type = 0x47,
+
+ DW_TAG_lo_user = 0x4080,
+ DW_TAG_hi_user = 0xffff
+};
+
+enum dwarf_child {
+ DW_CHILDREN_no = 0x00,
+ DW_CHILDREN_yes = 0x01
+};
+
+enum dwarf_form {
+ DW_FORM_addr = 0x01,
+ DW_FORM_block2 = 0x03,
+ DW_FORM_block4 = 0x04,
+ DW_FORM_data2 = 0x05,
+ DW_FORM_data4 = 0x06,
+ DW_FORM_data8 = 0x07,
+ DW_FORM_string = 0x08,
+ DW_FORM_block = 0x09,
+ DW_FORM_block1 = 0x0a,
+ DW_FORM_data1 = 0x0b,
+ DW_FORM_flag = 0x0c,
+ DW_FORM_sdata = 0x0d,
+ DW_FORM_strp = 0x0e,
+ DW_FORM_udata = 0x0f,
+ DW_FORM_ref_addr = 0x10,
+ DW_FORM_ref1 = 0x11,
+ DW_FORM_ref2 = 0x12,
+ DW_FORM_ref4 = 0x13,
+ DW_FORM_ref8 = 0x14,
+ DW_FORM_ref_udata = 0x15,
+ DW_FORM_indirect = 0x16,
+ /* DWARF 4 */
+ DW_FORM_sec_offset = 0x17,
+ DW_FORM_exprloc = 0x18,
+ DW_FORM_flag_present = 0x19,
+ DW_FORM_ref_sig8 = 0x20
+};
+
+enum dwarf_attribute {
+ DW_AT_sibling = 0x01,
+ DW_AT_location = 0x02,
+ DW_AT_name = 0x03,
+ DW_AT_ordering = 0x09,
+ DW_AT_byte_size = 0x0b,
+ DW_AT_bit_offset = 0x0c,
+ DW_AT_bit_size = 0x0d,
+ DW_AT_stmt_list = 0x10,
+ DW_AT_low_pc = 0x11,
+ DW_AT_high_pc = 0x12,
+ DW_AT_language = 0x13,
+ DW_AT_discr = 0x15,
+ DW_AT_discr_value = 0x16,
+ DW_AT_visibility = 0x17,
+ DW_AT_import = 0x18,
+ DW_AT_string_length = 0x19,
+ DW_AT_common_reference = 0x1a,
+ DW_AT_comp_dir = 0x1b,
+ DW_AT_const_value = 0x1c,
+ DW_AT_containing_type = 0x1d,
+ DW_AT_default_value = 0x1e,
+ DW_AT_inline = 0x20,
+ DW_AT_is_optional = 0x21,
+ DW_AT_lower_bound = 0x22,
+ DW_AT_producer = 0x25,
+ DW_AT_prototyped = 0x27,
+ DW_AT_return_addr = 0x2a,
+ DW_AT_start_scope = 0x2c,
+ DW_AT_bit_stride = 0x2e,
+ DW_AT_upper_bound = 0x2f,
+ DW_AT_abstract_origin = 0x31,
+ DW_AT_accessibility = 0x32,
+ DW_AT_address_class = 0x33,
+ DW_AT_artificial = 0x34,
+ DW_AT_base_types = 0x35,
+ DW_AT_calling_convention= 0x36,
+ DW_AT_count = 0x37,
+ DW_AT_data_member_location = 0x38,
+ DW_AT_decl_column = 0x39,
+ DW_AT_decl_file = 0x3a,
+ DW_AT_decl_line = 0x3b,
+ DW_AT_declaration = 0x3c,
+ DW_AT_discr_list = 0x3d,
+ DW_AT_encoding = 0x3e,
+ DW_AT_external = 0x3f,
+ DW_AT_frame_base = 0x40,
+ DW_AT_friend = 0x41,
+ DW_AT_identifier_case = 0x42,
+ DW_AT_macro_info = 0x43,
+ DW_AT_namelist_item = 0x44,
+ DW_AT_priority = 0x45,
+ DW_AT_segment = 0x46,
+ DW_AT_specification = 0x47,
+ DW_AT_static_link = 0x48,
+ DW_AT_type = 0x49,
+ DW_AT_use_location = 0x4a,
+ DW_AT_variable_parameter = 0x4b,
+ DW_AT_virtuality = 0x4c,
+ DW_AT_vtable_elem_location = 0x4d,
+ /* DWARF 3 */
+ DW_AT_allocated = 0x4e,
+ DW_AT_associated = 0x4f,
+ DW_AT_data_location = 0x50,
+ DW_AT_byte_stride = 0x51,
+ DW_AT_entry_pc = 0x52,
+ DW_AT_use_UTF8 = 0x53,
+ DW_AT_extension = 0x54,
+ DW_AT_ranges = 0x55,
+ DW_AT_trampoline = 0x56,
+ DW_AT_call_column = 0x57,
+ DW_AT_call_file = 0x58,
+ DW_AT_call_line = 0x59,
+ DW_AT_description = 0x5a,
+ DW_AT_binary_scale = 0x5b,
+ DW_AT_decimal_scale = 0x5c,
+ DW_AT_small = 0x5d,
+ DW_AT_decimal_sign = 0x5e,
+ DW_AT_digit_count = 0x5f,
+ DW_AT_picture_string = 0x60,
+ DW_AT_mutable = 0x61,
+ DW_AT_threads_scaled = 0x62,
+ DW_AT_explicit = 0x63,
+ DW_AT_object_pointer = 0x64,
+ DW_AT_endianity = 0x65,
+ DW_AT_elemental = 0x66,
+ DW_AT_pure = 0x67,
+ DW_AT_recursive = 0x68,
+ /* DWARF 4 */
+ DW_AT_signature = 0x69,
+ DW_AT_main_subprogram = 0x6a,
+ DW_AT_data_bit_offset = 0x6b,
+ DW_AT_const_expr = 0x6c,
+ DW_AT_enum_class = 0x6d,
+ DW_AT_linkage_name = 0x6e,
+ /* DWARF 5 */
+ DW_AT_noreturn = 0x87,
+
+ DW_AT_lo_user = 0x2000,
+ DW_AT_hi_user = 0x3fff
+};
+
+enum dwarf_op {
+ DW_OP_addr = 0x03,
+ DW_OP_deref = 0x06,
+ DW_OP_const1u = 0x08,
+ DW_OP_const1s = 0x09,
+ DW_OP_const2u = 0x0a,
+ DW_OP_const2s = 0x0b,
+ DW_OP_const4u = 0x0c,
+ DW_OP_const4s = 0x0d,
+ DW_OP_const8u = 0x0e,
+ DW_OP_const8s = 0x0f,
+ DW_OP_constu = 0x10,
+ DW_OP_consts = 0x11,
+ DW_OP_dup = 0x12,
+ DW_OP_drop = 0x13,
+ DW_OP_over = 0x14,
+ DW_OP_pick = 0x15,
+ DW_OP_swap = 0x16,
+ DW_OP_rot = 0x17,
+ DW_OP_xderef = 0x18,
+ DW_OP_abs = 0x19,
+ DW_OP_and = 0x1a,
+ DW_OP_div = 0x1b,
+ DW_OP_minus = 0x1c,
+ DW_OP_mod = 0x1d,
+ DW_OP_mul = 0x1e,
+ DW_OP_neg = 0x1f,
+ DW_OP_not = 0x20,
+ DW_OP_or = 0x21,
+ DW_OP_plus = 0x22,
+ DW_OP_plus_uconst = 0x23,
+ DW_OP_shl = 0x24,
+ DW_OP_shr = 0x25,
+ DW_OP_shra = 0x26,
+ DW_OP_xor = 0x27,
+ DW_OP_skip = 0x2f,
+ DW_OP_bra = 0x28,
+ DW_OP_eq = 0x29,
+ DW_OP_ge = 0x2a,
+ DW_OP_gt = 0x2b,
+ DW_OP_le = 0x2c,
+ DW_OP_lt = 0x2d,
+ DW_OP_ne = 0x2e,
+ DW_OP_lit0 = 0x30,
+ DW_OP_lit1 = 0x31,
+ DW_OP_lit2 = 0x32,
+ DW_OP_lit3 = 0x33,
+ DW_OP_lit4 = 0x34,
+ DW_OP_lit5 = 0x35,
+ DW_OP_lit6 = 0x36,
+ DW_OP_lit7 = 0x37,
+ DW_OP_lit8 = 0x38,
+ DW_OP_lit9 = 0x39,
+ DW_OP_lit10 = 0x3a,
+ DW_OP_lit11 = 0x3b,
+ DW_OP_lit12 = 0x3c,
+ DW_OP_lit13 = 0x3d,
+ DW_OP_lit14 = 0x3e,
+ DW_OP_lit15 = 0x3f,
+ DW_OP_lit16 = 0x40,
+ DW_OP_lit17 = 0x41,
+ DW_OP_lit18 = 0x42,
+ DW_OP_lit19 = 0x43,
+ DW_OP_lit20 = 0x44,
+ DW_OP_lit21 = 0x45,
+ DW_OP_lit22 = 0x46,
+ DW_OP_lit23 = 0x47,
+ DW_OP_lit24 = 0x48,
+ DW_OP_lit25 = 0x49,
+ DW_OP_lit26 = 0x4a,
+ DW_OP_lit27 = 0x4b,
+ DW_OP_lit28 = 0x4c,
+ DW_OP_lit29 = 0x4d,
+ DW_OP_lit30 = 0x4e,
+ DW_OP_lit31 = 0x4f,
+ DW_OP_reg0 = 0x50,
+ DW_OP_reg1 = 0x51,
+ DW_OP_reg2 = 0x52,
+ DW_OP_reg3 = 0x53,
+ DW_OP_reg4 = 0x54,
+ DW_OP_reg5 = 0x55,
+ DW_OP_reg6 = 0x56,
+ DW_OP_reg7 = 0x57,
+ DW_OP_reg8 = 0x58,
+ DW_OP_reg9 = 0x59,
+ DW_OP_reg10 = 0x5a,
+ DW_OP_reg11 = 0x5b,
+ DW_OP_reg12 = 0x5c,
+ DW_OP_reg13 = 0x5d,
+ DW_OP_reg14 = 0x5e,
+ DW_OP_reg15 = 0x5f,
+ DW_OP_reg16 = 0x60,
+ DW_OP_reg17 = 0x61,
+ DW_OP_reg18 = 0x62,
+ DW_OP_reg19 = 0x63,
+ DW_OP_reg20 = 0x64,
+ DW_OP_reg21 = 0x65,
+ DW_OP_reg22 = 0x66,
+ DW_OP_reg23 = 0x67,
+ DW_OP_reg24 = 0x68,
+ DW_OP_reg25 = 0x69,
+ DW_OP_reg26 = 0x6a,
+ DW_OP_reg27 = 0x6b,
+ DW_OP_reg28 = 0x6c,
+ DW_OP_reg29 = 0x6d,
+ DW_OP_reg30 = 0x6e,
+ DW_OP_reg31 = 0x6f,
+ DW_OP_breg0 = 0x70,
+ DW_OP_breg1 = 0x71,
+ DW_OP_breg2 = 0x72,
+ DW_OP_breg3 = 0x73,
+ DW_OP_breg4 = 0x74,
+ DW_OP_breg5 = 0x75,
+ DW_OP_breg6 = 0x76,
+ DW_OP_breg7 = 0x77,
+ DW_OP_breg8 = 0x78,
+ DW_OP_breg9 = 0x79,
+ DW_OP_breg10 = 0x7a,
+ DW_OP_breg11 = 0x7b,
+ DW_OP_breg12 = 0x7c,
+ DW_OP_breg13 = 0x7d,
+ DW_OP_breg14 = 0x7e,
+ DW_OP_breg15 = 0x7f,
+ DW_OP_breg16 = 0x80,
+ DW_OP_breg17 = 0x81,
+ DW_OP_breg18 = 0x82,
+ DW_OP_breg19 = 0x83,
+ DW_OP_breg20 = 0x84,
+ DW_OP_breg21 = 0x85,
+ DW_OP_breg22 = 0x86,
+ DW_OP_breg23 = 0x87,
+ DW_OP_breg24 = 0x88,
+ DW_OP_breg25 = 0x89,
+ DW_OP_breg26 = 0x8a,
+ DW_OP_breg27 = 0x8b,
+ DW_OP_breg28 = 0x8c,
+ DW_OP_breg29 = 0x8d,
+ DW_OP_breg30 = 0x8e,
+ DW_OP_breg31 = 0x8f,
+ DW_OP_regx = 0x90,
+ DW_OP_fbreg = 0x91,
+ DW_OP_bregx = 0x92,
+ DW_OP_piece = 0x93,
+ DW_OP_deref_size = 0x94,
+ DW_OP_xderef_size = 0x95,
+ DW_OP_nop = 0x96,
+ /* DWARF 3 */
+ DW_OP_push_object_address = 0x97,
+ DW_OP_call2 = 0x98,
+ DW_OP_call4 = 0x99,
+ DW_OP_call_ref = 0x9a ,
+ DW_OP_form_tls_address = 0x9b,
+ DW_OP_call_frame_cfa = 0x9c,
+ DW_OP_bit_piece = 0x9d,
+ /* DWARF 4 */
+ DW_OP_implicit_value = 0x9e,
+ DW_OP_stack_value = 0x9f,
+
+ DW_OP_lo_user = 0xe0,
+ DW_OP_hi_user = 0xff
+};
+
+enum dwarf_base_type {
+ DW_ATE_address = 0x01,
+ DW_ATE_boolean = 0x02,
+ DW_ATE_complex_float = 0x03,
+ DW_ATE_float = 0x04,
+ DW_ATE_signed = 0x05,
+ DW_ATE_signed_char = 0x06,
+ DW_ATE_unsigned = 0x07,
+ DW_ATE_unsigned_char = 0x08,
+ /* DWARF 3 */
+ DW_ATE_imaginary_float = 0x09,
+ DW_ATE_packed_decimal = 0x0a,
+ DW_ATE_numeric_string = 0x0b,
+ DW_ATE_edited = 0x0c,
+ DW_ATE_signed_fixed = 0x0d,
+ DW_ATE_unsigned_fixed = 0x0e,
+ DW_ATE_decimal_float = 0x0f,
+ /* DWARF 4 */
+ DW_ATE_UTF = 0x10,
+
+ DW_ATE_lo_user = 0x80,
+ DW_ATE_hi_user = 0xff
+};
+
+enum dwarf_decimal_sign {
+ DW_DS_unsigned = 0x01,
+ DW_DS_leading_overpunch = 0x02,
+ DW_DS_trailing_overpunch = 0x03,
+ DW_DS_leading_separate = 0x04,
+ DW_DS_trailing_separate = 0x05
+};
+
+enum dwarf_endianity {
+ DW_END_default = 0x00,
+ DW_END_big = 0x01,
+ DW_END_little = 0x02,
+
+ DW_END_lo_user = 0x40,
+ DW_END_hi_user = 0xff
+};
+
+enum dwarf_accessibility {
+ DW_ACCESS_public = 0x01,
+ DW_ACCESS_protected = 0x02,
+ DW_ACCESS_private = 0x03
+};
+
+enum dwarf_visibility {
+ DW_VIS_local = 0x01,
+ DW_VIS_exported = 0x02,
+ DW_VIS_qualified = 0x03
+};
+
+enum dwarf_virtuality {
+ DW_VIRTUALITY_none = 0x00,
+ DW_VIRTUALITY_virtual = 0x01,
+ DW_VIRTUALITY_pure_virtual = 0x02
+};
+
+enum dwarf_language {
+ DW_LANG_C89 = 0x0001,
+ DW_LANG_C = 0x0002,
+ DW_LANG_Ada83 = 0x0003,
+ DW_LANG_C_plus_plus = 0x0004,
+ DW_LANG_Cobol74 = 0x0005,
+ DW_LANG_Cobol85 = 0x0006,
+ DW_LANG_Fortran77 = 0x0007,
+ DW_LANG_Fortran90 = 0x0008,
+ DW_LANG_Pascal83 = 0x0009,
+ DW_LANG_Modula2 = 0x000a,
+ DW_LANG_Java = 0x000b,
+ DW_LANG_C99 = 0x000c,
+ DW_LANG_Ada95 = 0x000d,
+ DW_LANG_Fortran95 = 0x000e,
+ DW_LANG_PLI = 0x000f,
+ DW_LANG_ObjC = 0x0010,
+ DW_LANG_ObjC_plus_plus = 0x0011,
+ DW_LANG_UPC = 0x0012,
+ DW_LANG_D = 0x0013,
+ DW_LANG_Python = 0x0014,
+ DW_LANG_OpenCL = 0x0015,
+ DW_LANG_Go = 0x0016,
+ DW_LANG_Modula3 = 0x0017,
+ DW_LANG_Haskell = 0x0018,
+ DW_LANG_C_plus_plus_03 = 0x0019,
+ DW_LANG_C_plus_plus_11 = 0x001a,
+ DW_LANG_OCaml = 0x001b,
+ DW_LANG_Rust = 0x001c,
+ DW_LANG_C11 = 0x001d,
+ DW_LANG_Swift = 0x001e,
+ DW_LANG_Julia = 0x001f,
+ DW_LANG_Dylan = 0x0020,
+ DW_LANG_C_plus_plus_14 = 0x0021,
+ DW_LANG_Fortran03 = 0x0022,
+ DW_LANG_Fortran08 = 0x0023,
+ DW_LANG_RenderScript = 0x0024,
+
+ DW_LANG_Mips_Assembler = 0x8001,
+
+ DW_LANG_lo_user = 0x8000,
+ DW_LANG_hi_user = 0xffff,
+
+ DW_LANG_Rust_old = 0x9000
+};
+
+enum dwarf_identifier_case {
+ DW_ID_case_sensitive = 0x00,
+ DW_ID_up_case = 0x01,
+ DW_ID_down_case = 0x02,
+ DW_ID_case_insensitive = 0x03
+};
+
+enum dwarf_calling_conversion {
+ DW_CC_normal = 0x01,
+ DW_CC_program = 0x02,
+ DW_CC_nocall = 0x03,
+ DW_CC_pass_by_reference = 0x4,
+ DW_CC_pass_by_value = 0x5,
+
+ DW_CC_lo_user = 0x40,
+ DW_CC_hi_user = 0xff,
+
+ DW_CC_GNU_renesas_sh = 0x40,
+ DW_CC_GNU_borland_fastcall_i386 = 0x41
+};
+
+enum dwarf_inline {
+ DW_INL_not_inlined = 0x00,
+ DW_INL_inlined = 0x01,
+ DW_INL_declared_not_inlined = 0x02,
+ DW_INL_declared_inlined = 0x03
+};
+
+enum dwarf_ordering {
+ DW_ORD_row_major = 0x00,
+ DW_ORD_col_major = 0x01
+};
+
+enum dwarf_discriminant {
+ DW_DSC_label = 0x00,
+ DW_DSC_range = 0x01
+};
+
+enum dwarf_line_number {
+ DW_LNS_extended_op = 0x00,
+ DW_LNS_copy = 0x01,
+ DW_LNS_advance_pc = 0x02,
+ DW_LNS_advance_line = 0x03,
+ DW_LNS_set_file = 0x04,
+ DW_LNS_set_column = 0x05,
+ DW_LNS_negate_stmt = 0x06,
+ DW_LNS_set_basic_block = 0x07,
+ DW_LNS_const_add_pc = 0x08,
+ DW_LNS_fixed_advance_pc = 0x09,
+ DW_LNS_set_prologue_end = 0x0a,
+ DW_LNS_set_epilogue_begin = 0x0b,
+ DW_LNS_set_isa = 0x0c
+};
+
+enum dwarf_line_number_extended {
+ DW_LNE_end_sequence = 0x01,
+ DW_LNE_set_address = 0x02,
+ DW_LNE_define_file = 0x03,
+ DW_LNE_set_discriminator= 0x04,
+ DW_LNE_lo_user = 0x80,
+ DW_LNE_hi_user = 0xff
+};
+
+enum dwarf_macinfo_type {
+ DW_MACINFO_define = 0x01,
+ DW_MACINFO_undef = 0x02,
+ DW_MACINFO_start_file = 0x03,
+ DW_MACINFO_end_file = 0x04,
+ DW_MACINFO_vendor_ext = 0xff
+};
+
+enum dwarf_call_frame {
+ DW_CFA_advance_loc = 0x01,
+ DW_CFA_offset = 0x02,
+ DW_CFA_restore = 0x03,
+ DW_CFA_nop = 0x00,
+ DW_CFA_set_loc = 0x01,
+ DW_CFA_advance_loc1 = 0x02,
+ DW_CFA_advance_loc2 = 0x03,
+ DW_CFA_advance_loc4 = 0x04,
+ DW_CFA_offset_extended = 0x05,
+ DW_CFA_restore_extended = 0x06,
+ DW_CFA_undefined = 0x07,
+ DW_CFA_same_value = 0x08,
+ DW_CFA_register = 0x09,
+ DW_CFA_remember_state = 0x0a,
+ DW_CFA_restore_state = 0x0b,
+ DW_CFA_def_cfa = 0x0c,
+ DW_CFA_def_cfa_register = 0x0d,
+ DW_CFA_def_cfa_offset = 0x0e,
+ /* DWARF 3 */
+ DW_CFA_def_cfa_expression = 0x0f,
+ DW_CFA_expression = 0x10,
+ DW_CFA_offset_extended_sf = 0x11,
+ DW_CFA_def_cfa_sf = 0x12,
+ DW_CFA_def_cfa_offset_sf = 0x13,
+ DW_CFA_val_offset = 0x14,
+ DW_CFA_val_offset_sf = 0x15,
+ DW_CFA_val_expression = 0x16,
+ DW_CFA_lo_user = 0x1c,
+ DW_CFA_hi_user = 0x3f
+};
+
+#endif /* OUTPUT_DWARF_H */
diff --git a/output/elf.h b/output/elf.h
new file mode 100644
index 00000000..ab992cec
--- /dev/null
+++ b/output/elf.h
@@ -0,0 +1,539 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef OUTPUT_ELF_H
+#define OUTPUT_ELF_H
+
+/*
+ * Since NASM support both Elf32/64 file formats
+ * we need to cover all types, structures, typedefs and etc
+ */
+
+#include "compiler.h"
+
+/* Segment types */
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_LOOS 0x60000000
+#define PT_HIOS 0x6fffffff
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+#define PT_GNU_EH_FRAME 0x6474e550 /* Extension, eh? */
+
+/* ELF file types */
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/* ELF machine types */
+#define EM_NONE 0
+#define EM_M32 1
+#define EM_SPARC 2
+#define EM_386 3
+#define EM_68K 4
+#define EM_88K 5
+#define EM_486 6 /* Not used in Linux at least */
+#define EM_860 7
+#define EM_MIPS 8 /* R3k, bigendian(?) */
+#define EM_MIPS_RS4_BE 10 /* R4k BE */
+#define EM_PARISC 15
+#define EM_SPARC32PLUS 18
+#define EM_PPC 20
+#define EM_PPC64 21
+#define EM_S390 22
+#define EM_SH 42
+#define EM_SPARCV9 43 /* v9 = SPARC64 */
+#define EM_H8_300H 47
+#define EM_H8S 48
+#define EM_IA_64 50
+#define EM_X86_64 62
+#define EM_CRIS 76
+#define EM_V850 87
+#define EM_ALPHA 0x9026 /* Interrim Alpha that stuck around */
+#define EM_CYGNUS_V850 0x9080 /* Old v850 ID used by Cygnus */
+#define EM_S390_OLD 0xA390 /* Obsolete interrim value for S/390 */
+
+/* Dynamic type values */
+#define DT_NULL 0
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_STRSZ 10
+#define DT_SYMENT 11
+#define DT_INIT 12
+#define DT_FINI 13
+#define DT_SONAME 14
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+#define DT_REL 17
+#define DT_RELSZ 18
+#define DT_RELENT 19
+#define DT_PLTREL 20
+#define DT_DEBUG 21
+#define DT_TEXTREL 22
+#define DT_JMPREL 23
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7fffffff
+
+/* Auxilliary table entries */
+#define AT_NULL 0 /* end of vector */
+#define AT_IGNORE 1 /* entry should be ignored */
+#define AT_EXECFD 2 /* file descriptor of program */
+#define AT_PHDR 3 /* program headers for program */
+#define AT_PHENT 4 /* size of program header entry */
+#define AT_PHNUM 5 /* number of program headers */
+#define AT_PAGESZ 6 /* system page size */
+#define AT_BASE 7 /* base address of interpreter */
+#define AT_FLAGS 8 /* flags */
+#define AT_ENTRY 9 /* entry point of program */
+#define AT_NOTELF 10 /* program is not ELF */
+#define AT_UID 11 /* real uid */
+#define AT_EUID 12 /* effective uid */
+#define AT_GID 13 /* real gid */
+#define AT_EGID 14 /* effective gid */
+#define AT_PLATFORM 15 /* string identifying CPU for optimizations */
+#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
+#define AT_CLKTCK 17 /* frequency at which times() increments */
+/* 18..22 = ? */
+#define AT_SECURE 23 /* secure mode boolean */
+
+/* Program header permission flags */
+#define PF_X 0x1
+#define PF_W 0x2
+#define PF_R 0x4
+
+/* Section header types */
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_NUM 12
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xffffffff
+
+/* Section header flags */
+#define SHF_WRITE (1 << 0) /* Writable */
+#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */
+#define SHF_EXECINSTR (1 << 2) /* Executable */
+#define SHF_MERGE (1 << 4) /* Might be merged */
+#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */
+#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */
+#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling required */
+#define SHF_GROUP (1 << 9) /* Section is member of a group */
+#define SHF_TLS (1 << 10) /* Section hold thread-local data */
+
+/* Special section numbers */
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xff00
+#define SHN_LOPROC 0xff00
+#define SHN_HIPROC 0xff1f
+#define SHN_ABS 0xfff1
+#define SHN_COMMON 0xfff2
+#define SHN_HIRESERVE 0xffff
+
+/* Section align flag */
+#define SHA_ANY 1 /* No alignment constraint */
+
+/* Lenght of magic at the start of a file */
+#define EI_NIDENT 16
+
+/* Magic number constants... */
+#define EI_MAG0 0 /* e_ident[] indexes */
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_OSABI 7
+#define EI_ABIVERSION 8
+#define EI_NINDENT 16
+
+#define ELFMAG0 0x7f /* EI_MAG */
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define ELFCLASSNONE 0 /* EI_CLASS */
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+#define ELFCLASSNUM 3
+
+#define ELFDATANONE 0 /* e_ident[EI_DATA] */
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+#define EV_NONE 0 /* e_version, EI_VERSION */
+#define EV_CURRENT 1
+#define EV_NUM 2
+
+#define ELFOSABI_NONE 0
+#define ELFOSABI_LINUX 3
+
+/* Legal values for ST_BIND subfield of st_info (symbol binding) */
+#define STB_LOCAL 0 /* Local symbol */
+#define STB_GLOBAL 1 /* Global symbol */
+#define STB_WEAK 2 /* Weak symbol */
+#define STB_NUM 3 /* Number of defined types */
+#define STB_LOOS 10 /* Start of OS-specific */
+#define STB_HIOS 12 /* End of OS-specific */
+#define STB_LOPROC 13 /* Start of processor-specific */
+#define STB_HIPROC 15 /* End of processor-specific */
+
+/* Symbol types */
+#define STT_NOTYPE 0 /* Symbol type is unspecified */
+#define STT_OBJECT 1 /* Symbol is a data object */
+#define STT_FUNC 2 /* Symbol is a code object */
+#define STT_SECTION 3 /* Symbol associated with a section */
+#define STT_FILE 4 /* Symbol's name is file name */
+#define STT_COMMON 5 /* Symbol is a common data object */
+#define STT_TLS 6 /* Symbol is thread-local data object */
+#define STT_NUM 7 /* Number of defined types */
+
+/* Symbol visibilities */
+#define STV_DEFAULT 0 /* Default symbol visibility rules */
+#define STV_INTERNAL 1 /* Processor specific hidden class */
+#define STV_HIDDEN 2 /* Sym unavailable in other modules */
+#define STV_PROTECTED 3 /* Not preemptible, not exported */
+
+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field */
+#define ELF32_ST_BIND(i) ((i) >> 4)
+#define ELF32_ST_MKBIND(i) ((i) << 4) /* just a helper */
+#define ELF32_ST_TYPE(i) ((i) & 0xf)
+#define ELF32_ST_INFO(b, i) (ELF32_ST_MKBIND(b) + ELF32_ST_TYPE(i))
+
+#define ELF64_ST_BIND(i) ELF32_ST_BIND(i)
+#define ELF64_ST_MKBIND(i) ELF32_ST_MKBIND(i)
+#define ELF64_ST_TYPE(i) ELF32_ST_TYPE(i)
+#define ELF64_ST_INFO(b, i) ELF32_ST_INFO(b, i)
+
+/*
+ * ELF standard typedefs (yet more proof that <stdint.h> was way overdue)
+ */
+
+typedef uint16_t Elf32_Half;
+typedef int16_t Elf32_SHalf;
+typedef uint32_t Elf32_Word;
+typedef int32_t Elf32_Sword;
+typedef uint64_t Elf32_Xword;
+typedef int64_t Elf32_Sxword;
+
+typedef uint32_t Elf32_Off;
+typedef uint32_t Elf32_Addr;
+typedef uint16_t Elf32_Section;
+
+typedef uint16_t Elf64_Half;
+typedef int16_t Elf64_SHalf;
+typedef uint32_t Elf64_Word;
+typedef int32_t Elf64_Sword;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+typedef uint64_t Elf64_Off;
+typedef uint64_t Elf64_Addr;
+typedef uint16_t Elf64_Section;
+
+/*
+ * Dynamic header
+ */
+
+typedef struct elf32_dyn {
+ Elf32_Sword d_tag;
+ union {
+ Elf32_Sword d_val;
+ Elf32_Addr d_ptr;
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct elf64_dyn {
+ Elf64_Sxword d_tag;
+ union {
+ Elf64_Xword d_val;
+ Elf64_Addr d_ptr;
+ } d_un;
+} Elf64_Dyn;
+
+/*
+ * Relocations
+ */
+
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+#define ELF32_R_INFO(s,t) (((Elf32_Word)(s) << 8) + ELF32_R_TYPE(t))
+
+typedef struct elf32_rel {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+} Elf32_Rel;
+
+typedef struct elf32_rela {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+ Elf32_Sword r_addend;
+} Elf32_Rela;
+
+enum reloc32_type {
+ R_386_32 = 1, /* ordinary absolute relocation */
+ R_386_PC32 = 2, /* PC-relative relocation */
+ R_386_GOT32 = 3, /* an offset into GOT */
+ R_386_PLT32 = 4, /* a PC-relative offset into PLT */
+ R_386_COPY = 5, /* ??? */
+ R_386_GLOB_DAT = 6, /* ??? */
+ R_386_JUMP_SLOT = 7, /* ??? */
+ R_386_RELATIVE = 8, /* ??? */
+ R_386_GOTOFF = 9, /* an offset from GOT base */
+ R_386_GOTPC = 10, /* a PC-relative offset _to_ GOT */
+ R_386_TLS_TPOFF = 14, /* Offset in static TLS block */
+ R_386_TLS_IE = 15, /* Address of GOT entry for static TLS block offset */
+ /* These are GNU extensions, but useful */
+ R_386_16 = 20, /* A 16-bit absolute relocation */
+ R_386_PC16 = 21, /* A 16-bit PC-relative relocation */
+ R_386_8 = 22, /* An 8-bit absolute relocation */
+ R_386_PC8 = 23 /* An 8-bit PC-relative relocation */
+};
+
+#define ELF64_R_SYM(x) ((x) >> 32)
+#define ELF64_R_TYPE(x) ((x) & 0xffffffff)
+#define ELF64_R_INFO(s,t) (((Elf64_Xword)(s) << 32) + ELF64_R_TYPE(t))
+
+typedef struct elf64_rel {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+} Elf64_Rel;
+
+typedef struct elf64_rela {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+ Elf64_Sxword r_addend;
+} Elf64_Rela;
+
+enum reloc64_type {
+ R_X86_64_NONE = 0, /* No reloc */
+ R_X86_64_64 = 1, /* Direct 64 bit */
+ R_X86_64_PC32 = 2, /* PC relative 32 bit signed */
+ R_X86_64_GOT32 = 3, /* 32 bit GOT entry */
+ R_X86_64_PLT32 = 4, /* 32 bit PLT address */
+ R_X86_64_COPY = 5, /* Copy symbol at runtime */
+ R_X86_64_GLOB_DAT = 6, /* Create GOT entry */
+ R_X86_64_JUMP_SLOT = 7, /* Create PLT entry */
+ R_X86_64_RELATIVE = 8, /* Adjust by program base */
+ R_X86_64_GOTPCREL = 9, /* 32 bit signed PC relative offset to GOT */
+ R_X86_64_32 = 10, /* Direct 32 bit zero extended */
+ R_X86_64_32S = 11, /* Direct 32 bit sign extended */
+ R_X86_64_16 = 12, /* Direct 16 bit zero extended */
+ R_X86_64_PC16 = 13, /* 16 bit sign extended pc relative */
+ R_X86_64_8 = 14, /* Direct 8 bit sign extended */
+ R_X86_64_PC8 = 15, /* 8 bit sign extended pc relative */
+ R_X86_64_DTPMOD64 = 16, /* ID of module containing symbol */
+ R_X86_64_DTPOFF64 = 17, /* Offset in module's TLS block */
+ R_X86_64_TPOFF64 = 18, /* Offset in initial TLS block */
+ R_X86_64_TLSGD = 19, /* 32 bit signed PC relative offset to two GOT entries for GD symbol */
+ R_X86_64_TLSLD = 20, /* 32 bit signed PC relative offset to two GOT entries for LD symbol */
+ R_X86_64_DTPOFF32 = 21, /* Offset in TLS block */
+ R_X86_64_GOTTPOFF = 22, /* 32 bit signed PC relative offset to GOT entry for IE symbol */
+ R_X86_64_TPOFF32 = 23, /* Offset in initial TLS block */
+ R_X86_64_PC64 = 24, /* word64 S + A - P */
+ R_X86_64_GOTOFF64 = 25, /* word64 S + A - GOT */
+ R_X86_64_GOTPC32 = 26, /* word32 GOT + A - P */
+ R_X86_64_GOT64 = 27, /* word64 G + A */
+ R_X86_64_GOTPCREL64 = 28, /* word64 G + GOT - P + A */
+ R_X86_64_GOTPC64 = 29, /* word64 GOT - P + A */
+ R_X86_64_GOTPLT64 = 30, /* word64 G + A */
+ R_X86_64_PLTOFF64 = 31, /* word64 L - GOT + A */
+ R_X86_64_SIZE32 = 32, /* word32 Z + A */
+ R_X86_64_SIZE64 = 33, /* word64 Z + A */
+ R_X86_64_GOTPC32_TLSDESC= 34, /* word32 */
+ R_X86_64_TLSDESC_CALL = 35, /* none */
+ R_X86_64_TLSDESC = 36 /* word64?2 */
+};
+
+/*
+ * Symbol
+ */
+
+typedef struct elf32_sym {
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_Sym;
+
+typedef struct elf64_sym {
+ Elf64_Word st_name;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf64_Half st_shndx;
+ Elf64_Addr st_value;
+ Elf64_Xword st_size;
+} Elf64_Sym;
+
+/*
+ * Main file header
+ */
+
+typedef struct elf32_hdr {
+ unsigned char e_ident[EI_NIDENT];
+ Elf32_Half e_type;
+ Elf32_Half e_machine;
+ Elf32_Word e_version;
+ Elf32_Addr e_entry;
+ Elf32_Off e_phoff;
+ Elf32_Off e_shoff;
+ Elf32_Word e_flags;
+ Elf32_Half e_ehsize;
+ Elf32_Half e_phentsize;
+ Elf32_Half e_phnum;
+ Elf32_Half e_shentsize;
+ Elf32_Half e_shnum;
+ Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct elf64_hdr {
+ unsigned char e_ident[EI_NIDENT];
+ Elf64_Half e_type;
+ Elf64_Half e_machine;
+ Elf64_Word e_version;
+ Elf64_Addr e_entry;
+ Elf64_Off e_phoff;
+ Elf64_Off e_shoff;
+ Elf64_Word e_flags;
+ Elf64_Half e_ehsize;
+ Elf64_Half e_phentsize;
+ Elf64_Half e_phnum;
+ Elf64_Half e_shentsize;
+ Elf64_Half e_shnum;
+ Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+
+/*
+ * Program header
+ */
+
+typedef struct elf32_phdr {
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
+} Elf32_Phdr;
+
+typedef struct elf64_phdr {
+ Elf64_Word p_type;
+ Elf64_Word p_flags;
+ Elf64_Off p_offset;
+ Elf64_Addr p_vaddr;
+ Elf64_Addr p_paddr;
+ Elf64_Xword p_filesz;
+ Elf64_Xword p_memsz;
+ Elf64_Xword p_align;
+} Elf64_Phdr;
+
+/*
+ * Section header
+ */
+
+typedef struct elf32_shdr {
+ Elf32_Word sh_name;
+ Elf32_Word sh_type;
+ Elf32_Word sh_flags;
+ Elf32_Addr sh_addr;
+ Elf32_Off sh_offset;
+ Elf32_Word sh_size;
+ Elf32_Word sh_link;
+ Elf32_Word sh_info;
+ Elf32_Word sh_addralign;
+ Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+typedef struct elf64_shdr {
+ Elf64_Word sh_name;
+ Elf64_Word sh_type;
+ Elf64_Xword sh_flags;
+ Elf64_Addr sh_addr;
+ Elf64_Off sh_offset;
+ Elf64_Xword sh_size;
+ Elf64_Word sh_link;
+ Elf64_Word sh_info;
+ Elf64_Xword sh_addralign;
+ Elf64_Xword sh_entsize;
+} Elf64_Shdr;
+
+/*
+ * Note header
+ */
+typedef struct elf32_note {
+ Elf32_Word n_namesz; /* Name size */
+ Elf32_Word n_descsz; /* Content size */
+ Elf32_Word n_type; /* Content type */
+} Elf32_Nhdr;
+
+typedef struct elf64_note {
+ Elf64_Word n_namesz; /* Name size */
+ Elf64_Word n_descsz; /* Content size */
+ Elf64_Word n_type; /* Content type */
+} Elf64_Nhdr;
+
+#endif /* OUTPUT_ELF_H */
diff --git a/output/legacy.c b/output/legacy.c
new file mode 100644
index 00000000..39793205
--- /dev/null
+++ b/output/legacy.c
@@ -0,0 +1,124 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2016-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * output/legacy.c
+ *
+ * Mangle a struct out_data to match the rather bizarre legacy
+ * backend interface.
+ *
+ * The "data" parameter for the output function points to a "int64_t",
+ * containing the address of the target in question, unless the type is
+ * OUT_RAWDATA, in which case it points to an "uint8_t"
+ * array.
+ *
+ * Exceptions are OUT_RELxADR, which denote an x-byte relocation
+ * which will be a relative jump. For this we need to know the
+ * distance in bytes from the start of the relocated record until
+ * the end of the containing instruction. _This_ is what is stored
+ * in the size part of the parameter, in this case.
+ *
+ * Also OUT_RESERVE denotes reservation of N bytes of BSS space,
+ * and the contents of the "data" parameter is irrelevant.
+ */
+
+#include "nasm.h"
+#include "outlib.h"
+
+void nasm_do_legacy_output(const struct out_data *data)
+{
+ const void *dptr = data->data;
+ enum out_type type = data->type;
+ int32_t tsegment = data->tsegment;
+ int32_t twrt = data->twrt;
+ uint64_t size = data->size;
+
+ switch (data->type) {
+ case OUT_RELADDR:
+ switch (data->size) {
+ case 1:
+ type = OUT_REL1ADR;
+ break;
+ case 2:
+ type = OUT_REL2ADR;
+ break;
+ case 4:
+ type = OUT_REL4ADR;
+ break;
+ case 8:
+ type = OUT_REL8ADR;
+ break;
+ default:
+ panic();
+ break;
+ }
+
+ dptr = &data->toffset;
+ size = data->relbase - data->offset;
+ break;
+
+ case OUT_SEGMENT:
+ type = OUT_ADDRESS;
+ dptr = zero_buffer;
+ size = (data->sign == OUT_SIGNED) ? -data->size : data->size;
+ tsegment |= 1;
+ break;
+
+ case OUT_ADDRESS:
+ dptr = &data->toffset;
+ size = (data->sign == OUT_SIGNED) ? -data->size : data->size;
+ break;
+
+ case OUT_RAWDATA:
+ case OUT_RESERVE:
+ tsegment = twrt = NO_SEG;
+ break;
+
+ case OUT_ZERODATA:
+ tsegment = twrt = NO_SEG;
+ type = OUT_RAWDATA;
+ dptr = zero_buffer;
+ while (size > ZERO_BUF_SIZE) {
+ ofmt->legacy_output(data->segment, dptr, type,
+ ZERO_BUF_SIZE, tsegment, twrt);
+ size -= ZERO_BUF_SIZE;
+ }
+ break;
+
+ default:
+ panic();
+ break;
+ }
+
+ ofmt->legacy_output(data->segment, dptr, type, size, tsegment, twrt);
+}
diff --git a/output/macho.h b/output/macho.h
new file mode 100644
index 00000000..538c531e
--- /dev/null
+++ b/output/macho.h
@@ -0,0 +1,282 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef OUTPUT_MACHO_H
+#define OUTPUT_MACHO_H
+
+#include "compiler.h"
+
+/* Magics */
+#define MH_MAGIC 0xfeedface
+#define MH_MAGIC_64 0xfeedfacf
+
+/* File types */
+#define MH_OBJECT 0x1
+
+/* CPUs */
+#define CPU_ARCH_MASK 0xff000000
+#define CPU_ARCH_ABI64 0x01000000
+#define CPU_TYPE_X86 7
+#define CPU_TYPE_I386 CPU_TYPE_X86
+#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64)
+
+#define CPU_SUBTYPE_MASK 0xff000000
+#define CPU_SUBTYPE_I386_ALL 3
+
+/* Header flags */
+#define MH_SUBSECTIONS_VIA_SYMBOLS 0x00002000
+
+/* Load commands */
+#define LC_SEGMENT 0x1
+#define LC_SEGMENT_64 0x19
+#define LC_SYMTAB 0x2
+
+/* Symbol type bits */
+#define N_STAB 0xe0
+#define N_PEXT 0x10
+#define N_TYPE 0x0e
+#define N_EXT 0x01
+
+/* To mask with N_TYPE */
+#define N_UNDF 0x00
+#define N_ABS 0x02
+#define N_INDR 0x0a
+#define N_PBUD 0x0c
+#define N_SECT 0x0e
+
+/* Section ordinals */
+#define NO_SECT 0x00
+#define MAX_SECT 0xff
+
+/* Section bits */
+#define SECTION_TYPE 0x000000ff
+#define SECTION_ATTRIBUTES 0xffffff00
+#define SECTION_ATTRIBUTES_USR 0xff000000
+#define SECTION_ATTRIBUTES_SYS 0x00ffff00
+
+#define S_REGULAR 0x00
+#define S_ZEROFILL 0x01
+#define S_CSTRING_LITERALS 0x02
+#define S_4BYTE_LITERALS 0x03
+#define S_8BYTE_LITERALS 0x04
+#define S_LITERAL_POINTERS 0x05
+#define S_NON_LAZY_SYMBOL_POINTERS 0x06
+#define S_LAZY_SYMBOL_POINTERS 0x07
+#define S_SYMBOL_STUBS 0x08
+#define S_MOD_INIT_FUNC_POINTERS 0x09
+#define S_MOD_TERM_FUNC_POINTERS 0x0a
+#define S_COALESCED 0x0b
+#define S_GB_ZEROFILL 0x0c
+#define S_INTERPOSING 0x0d
+#define S_16BYTE_LITERALS 0x0e
+#define S_DTRACE_DOF 0x0f
+#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10
+#define S_THREAD_LOCAL_REGULAR 0x11
+#define S_THREAD_LOCAL_ZEROFILL 0x12
+#define S_THREAD_LOCAL_VARIABLES 0x13
+#define S_THREAD_LOCAL_VARIABLE_POINTERS 0x14
+#define S_THREAD_LOCAL_INIT_FUNCTION_POINTERS 0x15
+
+#define S_ATTR_PURE_INSTRUCTIONS 0x80000000
+#define S_ATTR_NO_TOC 0x40000000
+#define S_ATTR_STRIP_STATIC_SYMS 0x20000000
+#define S_ATTR_NO_DEAD_STRIP 0x10000000
+#define S_ATTR_LIVE_SUPPORT 0x08000000
+#define S_ATTR_SELF_MODIFYING_CODE 0x04000000
+#define S_ATTR_DEBUG 0x02000000
+
+#define S_ATTR_SOME_INSTRUCTIONS 0x00000400
+#define S_ATTR_EXT_RELOC 0x00000200
+#define S_ATTR_LOC_RELOC 0x00000100
+#define INDIRECT_SYMBOL_LOCAL 0x80000000
+#define INDIRECT_SYMBOL_ABS 0x40000000
+
+/* Relocation info type */
+#define GENERIC_RELOC_VANILLA 0
+#define GENERIC_RELOC_PAIR 1
+#define GENERIC_RELOC_SECTDIFF 2
+#define GENERIC_RELOC_PB_LA_PTR 3
+#define GENERIC_RELOC_LOCAL_SECTDIFF 4
+#define GENERIC_RELOC_TLV 5
+
+#define X86_64_RELOC_UNSIGNED 0
+#define X86_64_RELOC_SIGNED 1
+#define X86_64_RELOC_BRANCH 2
+#define X86_64_RELOC_GOT_LOAD 3
+#define X86_64_RELOC_GOT 4
+#define X86_64_RELOC_SUBTRACTOR 5
+#define X86_64_RELOC_SIGNED_1 6
+#define X86_64_RELOC_SIGNED_2 7
+#define X86_64_RELOC_SIGNED_4 8
+#define X86_64_RELOC_TLV 9
+
+/* Relocation info */
+#define R_ABS 0
+#define R_SCATTERED 0x80000000
+
+/* VM permission constants */
+#define VM_PROT_NONE 0x00
+#define VM_PROT_READ 0x01
+#define VM_PROT_WRITE 0x02
+#define VM_PROT_EXECUTE 0x04
+
+typedef struct {
+ uint32_t magic;
+ uint32_t cputype;
+ uint32_t cpusubtype;
+ uint32_t filetype;
+ uint32_t ncmds;
+ uint32_t sizeofcmds;
+ uint32_t flags;
+} macho_header_t;
+
+typedef struct {
+ uint32_t magic;
+ uint32_t cputype;
+ uint32_t cpusubtype;
+ uint32_t filetype;
+ uint32_t ncmds;
+ uint32_t sizeofcmds;
+ uint32_t flags;
+ uint32_t reserved;
+} macho_header_64_t;
+
+typedef struct {
+ uint32_t cmd;
+ uint32_t cmdsize;
+} macho_load_command_t;
+
+typedef struct {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ char segname[16];
+ uint32_t vmaddr;
+ uint32_t vmsize;
+ uint32_t fileoff;
+ uint32_t filesize;
+ uint32_t maxprot;
+ uint32_t initprot;
+ uint32_t nsects;
+ uint32_t flags;
+} macho_segment_command_t;
+
+typedef struct {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ char segname[16];
+ uint64_t vmaddr;
+ uint64_t vmsize;
+ uint64_t fileoff;
+ uint64_t filesize;
+ uint32_t maxprot;
+ uint32_t initprot;
+ uint32_t nsects;
+ uint32_t flags;
+} macho_segment_command_64_t;
+
+typedef struct {
+ char sectname[16];
+ char segname[16];
+ uint32_t addr;
+ uint32_t size;
+ uint32_t offset;
+ uint32_t align;
+ uint32_t reloff;
+ uint32_t nreloc;
+ uint32_t flags;
+ uint32_t reserved1;
+ uint32_t reserved2;
+} macho_section_t;
+
+typedef struct {
+ char sectname[16];
+ char segname[16];
+ uint64_t addr;
+ uint64_t size;
+ uint32_t offset;
+ uint32_t align;
+ uint32_t reloff;
+ uint32_t nreloc;
+ uint32_t flags;
+ uint32_t reserved1;
+ uint32_t reserved2;
+ uint32_t reserved3;
+} macho_section_64_t;
+
+typedef struct {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ uint32_t symoff;
+ uint32_t nsyms;
+ uint32_t stroff;
+ uint32_t strsize;
+} macho_symtab_command_t;
+
+typedef struct {
+ int32_t r_address;
+ union {
+ struct {
+ uint32_t r_symbolnum: 24,
+ r_pcrel: 1,
+ r_length: 2,
+ r_extern: 1,
+ r_type: 4;
+ } s;
+ uint32_t r_raw;
+ } u;
+} macho_relocation_info_t;
+
+typedef struct nlist_base {
+ uint32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_sect;
+ uint16_t n_desc;
+} macho_nlist_base_t;
+
+typedef struct nlist {
+ uint32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_sect;
+ int16_t n_desc;
+ uint32_t n_value;
+} macho_nlist_t;
+
+typedef struct {
+ uint32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_sect;
+ uint16_t n_desc;
+ uint64_t n_value;
+} macho_nlist_64_t;
+
+#endif /* OUTPUT_MACHO_H */
diff --git a/output/nulldbg.c b/output/nulldbg.c
new file mode 100644
index 00000000..c09ccd4b
--- /dev/null
+++ b/output/nulldbg.c
@@ -0,0 +1,93 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outlib.h"
+
+void null_debug_init(void)
+{
+}
+
+void null_debug_linenum(const char *filename, int32_t linenumber, int32_t segto)
+{
+ (void)filename;
+ (void)linenumber;
+ (void)segto;
+}
+
+void null_debug_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ (void)name;
+ (void)segment;
+ (void)offset;
+ (void)is_global;
+ (void)special;
+}
+
+void null_debug_directive(const char *directive, const char *params)
+{
+ (void)directive;
+ (void)params;
+}
+
+void null_debug_typevalue(int32_t type)
+{
+ (void)type;
+}
+
+void null_debug_output(int type, void *param)
+{
+ (void)type;
+ (void)param;
+}
+
+void null_debug_cleanup(void)
+{
+}
+
+const struct dfmt null_debug_form = {
+ "Null debug format",
+ "null",
+ null_debug_init,
+ null_debug_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ null_debug_typevalue,
+ null_debug_output,
+ null_debug_cleanup,
+ NULL /* pragma list */
+};
+
+const struct dfmt * const null_debug_arr[2] = { &null_debug_form, NULL };
diff --git a/output/nullout.c b/output/nullout.c
new file mode 100644
index 00000000..ad451e8b
--- /dev/null
+++ b/output/nullout.c
@@ -0,0 +1,61 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outlib.h"
+
+enum directive_result
+null_directive(enum directive directive, char *value, int pass)
+{
+ (void)directive;
+ (void)value;
+ (void)pass;
+ return DIRR_UNKNOWN;
+}
+
+void null_sectalign(int32_t seg, unsigned int value)
+{
+ (void)seg;
+ (void)value;
+}
+
+void null_reset(void)
+{
+ /* Nothing to do */
+}
+
+int32_t null_segbase(int32_t segment)
+{
+ return segment;
+}
diff --git a/output/outaout.c b/output/outaout.c
new file mode 100644
index 00000000..0ad797e4
--- /dev/null
+++ b/output/outaout.c
@@ -0,0 +1,932 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2013 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outaout.c output routines for the Netwide Assembler to produce
+ * Linux a.out object files
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "stdscan.h"
+#include "eval.h"
+#include "outform.h"
+#include "outlib.h"
+
+#if defined OF_AOUT || defined OF_AOUTB
+
+#define RELTYPE_ABSOLUTE 0x00
+#define RELTYPE_RELATIVE 0x01
+#define RELTYPE_GOTPC 0x01 /* no explicit GOTPC in a.out */
+#define RELTYPE_GOTOFF 0x10
+#define RELTYPE_GOT 0x10 /* distinct from GOTOFF bcos sym not sect */
+#define RELTYPE_PLT 0x21
+#define RELTYPE_SYMFLAG 0x08
+
+struct Reloc {
+ struct Reloc *next;
+ int32_t address; /* relative to _start_ of section */
+ int32_t symbol; /* symbol number or -ve section id */
+ int bytes; /* 2 or 4 */
+ int reltype; /* see above */
+};
+
+struct Symbol {
+ int32_t strpos; /* string table position of name */
+ int type; /* symbol type - see flags below */
+ int32_t value; /* address, or COMMON variable size */
+ int32_t size; /* size for data or function exports */
+ int32_t segment; /* back-reference used by gsym_reloc */
+ struct Symbol *next; /* list of globals in each section */
+ struct Symbol *nextfwd; /* list of unresolved-size symbols */
+ char *name; /* for unresolved-size symbols */
+ int32_t symnum; /* index into symbol table */
+};
+
+/*
+ * Section IDs - used in Reloc.symbol when negative, and in
+ * Symbol.type when positive.
+ */
+#define SECT_ABS 2 /* absolute value */
+#define SECT_TEXT 4 /* text section */
+#define SECT_DATA 6 /* data section */
+#define SECT_BSS 8 /* bss section */
+#define SECT_MASK 0xE /* mask out any of the above */
+
+/*
+ * More flags used in Symbol.type.
+ */
+#define SYM_GLOBAL 1 /* it's a global symbol */
+#define SYM_DATA 0x100 /* used for shared libs */
+#define SYM_FUNCTION 0x200 /* used for shared libs */
+#define SYM_WITH_SIZE 0x4000 /* not output; internal only */
+
+/*
+ * Bit more explanation of symbol types: SECT_xxx denotes a local
+ * symbol. SECT_xxx|SYM_GLOBAL denotes a global symbol, defined in
+ * this module. Just SYM_GLOBAL, with zero value, denotes an
+ * external symbol referenced in this module. And just SYM_GLOBAL,
+ * but with a non-zero value, declares a C `common' variable, of
+ * size `value'.
+ */
+
+struct Section {
+ struct SAA *data;
+ uint32_t len, size, nrelocs;
+ int32_t index;
+ struct Reloc *head, **tail;
+ struct Symbol *gsyms, *asym;
+};
+
+static struct Section stext, sdata, sbss;
+
+static struct SAA *syms;
+static uint32_t nsyms;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static uint32_t strslen;
+
+static struct Symbol *fwds;
+
+static int bsd;
+static int is_pic;
+
+static void aout_write(void);
+static void aout_write_relocs(struct Reloc *);
+static void aout_write_syms(void);
+static void aout_sect_write(struct Section *, const uint8_t *,
+ uint32_t);
+static void aout_pad_sections(void);
+static void aout_fixup_relocs(struct Section *);
+
+/*
+ * Special section numbers which are used to define special
+ * symbols, which can be used with WRT to provide PIC relocation
+ * types.
+ */
+static int32_t aout_gotpc_sect, aout_gotoff_sect;
+static int32_t aout_got_sect, aout_plt_sect;
+static int32_t aout_sym_sect;
+
+static void aoutg_init(void)
+{
+ stext.data = saa_init(1L);
+ stext.head = NULL;
+ stext.tail = &stext.head;
+ sdata.data = saa_init(1L);
+ sdata.head = NULL;
+ sdata.tail = &sdata.head;
+ stext.len = stext.size = sdata.len = sdata.size = sbss.len = 0;
+ stext.nrelocs = sdata.nrelocs = 0;
+ stext.gsyms = sdata.gsyms = sbss.gsyms = NULL;
+ stext.index = seg_alloc();
+ sdata.index = seg_alloc();
+ sbss.index = seg_alloc();
+ stext.asym = sdata.asym = sbss.asym = NULL;
+ syms = saa_init((int32_t)sizeof(struct Symbol));
+ nsyms = 0;
+ bsym = raa_init();
+ strs = saa_init(1L);
+ strslen = 0;
+ fwds = NULL;
+}
+
+#ifdef OF_AOUT
+
+static void aout_init(void)
+{
+ bsd = false;
+ aoutg_init();
+
+ aout_gotpc_sect = aout_gotoff_sect = aout_got_sect =
+ aout_plt_sect = aout_sym_sect = NO_SEG;
+}
+
+#endif
+
+#ifdef OF_AOUTB
+
+extern const struct ofmt of_aoutb;
+
+static void aoutb_init(void)
+{
+ bsd = true;
+ aoutg_init();
+
+ is_pic = 0x00; /* may become 0x40 */
+
+ aout_gotpc_sect = seg_alloc();
+ backend_label("..gotpc", aout_gotpc_sect + 1, 0L);
+ aout_gotoff_sect = seg_alloc();
+ backend_label("..gotoff", aout_gotoff_sect + 1, 0L);
+ aout_got_sect = seg_alloc();
+ backend_label("..got", aout_got_sect + 1, 0L);
+ aout_plt_sect = seg_alloc();
+ backend_label("..plt", aout_plt_sect + 1, 0L);
+ aout_sym_sect = seg_alloc();
+ backend_label("..sym", aout_sym_sect + 1, 0L);
+}
+
+#endif
+
+static void aout_cleanup(void)
+{
+ struct Reloc *r;
+
+ aout_pad_sections();
+ aout_fixup_relocs(&stext);
+ aout_fixup_relocs(&sdata);
+ aout_write();
+ saa_free(stext.data);
+ while (stext.head) {
+ r = stext.head;
+ stext.head = stext.head->next;
+ nasm_free(r);
+ }
+ saa_free(sdata.data);
+ while (sdata.head) {
+ r = sdata.head;
+ sdata.head = sdata.head->next;
+ nasm_free(r);
+ }
+ saa_free(syms);
+ raa_free(bsym);
+ saa_free(strs);
+}
+
+static int32_t aout_section_names(char *name, int pass, int *bits)
+{
+
+ (void)pass;
+
+ /*
+ * Default to 32 bits.
+ */
+ if (!name) {
+ *bits = 32;
+ return stext.index;
+ }
+
+ if (!strcmp(name, ".text"))
+ return stext.index;
+ else if (!strcmp(name, ".data"))
+ return sdata.index;
+ else if (!strcmp(name, ".bss"))
+ return sbss.index;
+ else
+ return NO_SEG;
+}
+
+static void aout_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ int pos = strslen + 4;
+ struct Symbol *sym;
+ int special_used = false;
+
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ /*
+ * This is a NASM special symbol. We never allow it into
+ * the a.out symbol table, even if it's a valid one. If it
+ * _isn't_ a valid one, we should barf immediately.
+ */
+ if (strcmp(name, "..gotpc") && strcmp(name, "..gotoff") &&
+ strcmp(name, "..got") && strcmp(name, "..plt") &&
+ strcmp(name, "..sym"))
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ return;
+ }
+
+ if (is_global == 3) {
+ struct Symbol **s;
+ /*
+ * Fix up a forward-reference symbol size from the first
+ * pass.
+ */
+ for (s = &fwds; *s; s = &(*s)->nextfwd)
+ if (!strcmp((*s)->name, name)) {
+ struct tokenval tokval;
+ expr *e;
+ char *p = special;
+
+ p = nasm_skip_spaces(nasm_skip_word(p));
+ stdscan_reset();
+ stdscan_set(p);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, 1, NULL);
+ if (e) {
+ if (!is_simple(e))
+ nasm_error(ERR_NONFATAL, "cannot use relocatable"
+ " expression as symbol size");
+ else
+ (*s)->size = reloc_value(e);
+ }
+
+ /*
+ * Remove it from the list of unresolved sizes.
+ */
+ nasm_free((*s)->name);
+ *s = (*s)->nextfwd;
+ return;
+ }
+ return; /* it wasn't an important one */
+ }
+
+ saa_wbytes(strs, name, (int32_t)(1 + strlen(name)));
+ strslen += 1 + strlen(name);
+
+ sym = saa_wstruct(syms);
+
+ sym->strpos = pos;
+ sym->type = is_global ? SYM_GLOBAL : 0;
+ sym->segment = segment;
+ if (segment == NO_SEG)
+ sym->type |= SECT_ABS;
+ else if (segment == stext.index) {
+ sym->type |= SECT_TEXT;
+ if (is_global) {
+ sym->next = stext.gsyms;
+ stext.gsyms = sym;
+ } else if (!stext.asym)
+ stext.asym = sym;
+ } else if (segment == sdata.index) {
+ sym->type |= SECT_DATA;
+ if (is_global) {
+ sym->next = sdata.gsyms;
+ sdata.gsyms = sym;
+ } else if (!sdata.asym)
+ sdata.asym = sym;
+ } else if (segment == sbss.index) {
+ sym->type |= SECT_BSS;
+ if (is_global) {
+ sym->next = sbss.gsyms;
+ sbss.gsyms = sym;
+ } else if (!sbss.asym)
+ sbss.asym = sym;
+ } else
+ sym->type = SYM_GLOBAL;
+ if (is_global == 2)
+ sym->value = offset;
+ else
+ sym->value = (sym->type == SYM_GLOBAL ? 0 : offset);
+
+ if (is_global && sym->type != SYM_GLOBAL) {
+ /*
+ * Global symbol exported _from_ this module. We must check
+ * the special text for type information.
+ */
+
+ if (special) {
+ int n = strcspn(special, " ");
+
+ if (!nasm_strnicmp(special, "function", n))
+ sym->type |= SYM_FUNCTION;
+ else if (!nasm_strnicmp(special, "data", n) ||
+ !nasm_strnicmp(special, "object", n))
+ sym->type |= SYM_DATA;
+ else
+ nasm_error(ERR_NONFATAL, "unrecognised symbol type `%.*s'",
+ n, special);
+ if (special[n]) {
+ struct tokenval tokval;
+ expr *e;
+ int fwd = false;
+ char *saveme = stdscan_get();
+
+ if (!bsd) {
+ nasm_error(ERR_NONFATAL, "Linux a.out does not support"
+ " symbol size information");
+ } else {
+ while (special[n] && nasm_isspace(special[n]))
+ n++;
+ /*
+ * We have a size expression; attempt to
+ * evaluate it.
+ */
+ sym->type |= SYM_WITH_SIZE;
+ stdscan_reset();
+ stdscan_set(special + n);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, &fwd, 0, NULL);
+ if (fwd) {
+ sym->nextfwd = fwds;
+ fwds = sym;
+ sym->name = nasm_strdup(name);
+ } else if (e) {
+ if (!is_simple(e))
+ nasm_error(ERR_NONFATAL, "cannot use relocatable"
+ " expression as symbol size");
+ else
+ sym->size = reloc_value(e);
+ }
+ }
+ stdscan_set(saveme);
+ }
+ special_used = true;
+ }
+ }
+
+ /*
+ * define the references from external-symbol segment numbers
+ * to these symbol records.
+ */
+ if (segment != NO_SEG && segment != stext.index &&
+ segment != sdata.index && segment != sbss.index)
+ bsym = raa_write(bsym, segment, nsyms);
+ sym->symnum = nsyms;
+
+ nsyms++;
+ if (sym->type & SYM_WITH_SIZE)
+ nsyms++; /* and another for the size */
+
+ if (special && !special_used)
+ nasm_error(ERR_NONFATAL, "no special symbol features supported here");
+}
+
+static void aout_add_reloc(struct Section *sect, int32_t segment,
+ int reltype, int bytes)
+{
+ struct Reloc *r;
+
+ r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+ sect->tail = &r->next;
+ r->next = NULL;
+
+ r->address = sect->len;
+ r->symbol = (segment == NO_SEG ? -SECT_ABS :
+ segment == stext.index ? -SECT_TEXT :
+ segment == sdata.index ? -SECT_DATA :
+ segment == sbss.index ? -SECT_BSS :
+ raa_read(bsym, segment));
+ r->reltype = reltype;
+ if (r->symbol >= 0)
+ r->reltype |= RELTYPE_SYMFLAG;
+ r->bytes = bytes;
+
+ sect->nrelocs++;
+}
+
+/*
+ * This routine deals with ..got and ..sym relocations: the more
+ * complicated kinds. In shared-library writing, some relocations
+ * with respect to global symbols must refer to the precise symbol
+ * rather than referring to an offset from the base of the section
+ * _containing_ the symbol. Such relocations call to this routine,
+ * which searches the symbol list for the symbol in question.
+ *
+ * RELTYPE_GOT references require the _exact_ symbol address to be
+ * used; RELTYPE_ABSOLUTE references can be at an offset from the
+ * symbol. The boolean argument `exact' tells us this.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the symbol rather than the section. Should always be
+ * zero when returning from an exact call.
+ *
+ * Limitation: if you define two symbols at the same place,
+ * confusion will occur.
+ *
+ * Inefficiency: we search, currently, using a linked list which
+ * isn't even necessarily sorted.
+ */
+static int32_t aout_add_gsym_reloc(struct Section *sect,
+ int32_t segment, int32_t offset,
+ int type, int bytes, int exact)
+{
+ struct Symbol *sym, *sm, *shead;
+ struct Reloc *r;
+
+ /*
+ * First look up the segment to find whether it's text, data,
+ * bss or an external symbol.
+ */
+ shead = NULL;
+ if (segment == stext.index)
+ shead = stext.gsyms;
+ else if (segment == sdata.index)
+ shead = sdata.gsyms;
+ else if (segment == sbss.index)
+ shead = sbss.gsyms;
+ if (!shead) {
+ if (exact && offset != 0)
+ nasm_error(ERR_NONFATAL, "unable to find a suitable global symbol"
+ " for this reference");
+ else
+ aout_add_reloc(sect, segment, type, bytes);
+ return offset;
+ }
+
+ if (exact) {
+ /*
+ * Find a symbol pointing _exactly_ at this one.
+ */
+ list_for_each(sym, shead)
+ if (sym->value == offset)
+ break;
+ } else {
+ /*
+ * Find the nearest symbol below this one.
+ */
+ sym = NULL;
+ list_for_each(sm, shead)
+ if (sm->value <= offset && (!sym || sm->value > sym->value))
+ sym = sm;
+ }
+ if (!sym && exact) {
+ nasm_error(ERR_NONFATAL, "unable to find a suitable global symbol"
+ " for this reference");
+ return 0;
+ }
+
+ r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+ sect->tail = &r->next;
+ r->next = NULL;
+
+ r->address = sect->len;
+ r->symbol = sym->symnum;
+ r->reltype = type | RELTYPE_SYMFLAG;
+ r->bytes = bytes;
+
+ sect->nrelocs++;
+
+ return offset - sym->value;
+}
+
+/*
+ * This routine deals with ..gotoff relocations. These _must_ refer
+ * to a symbol, due to a perversity of *BSD's PIC implementation,
+ * and it must be a non-global one as well; so we store `asym', the
+ * first nonglobal symbol defined in each section, and always work
+ * from that. Relocation type is always RELTYPE_GOTOFF.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the `asym' symbol rather than the section.
+ */
+static int32_t aout_add_gotoff_reloc(struct Section *sect, int32_t segment,
+ int32_t offset, int bytes)
+{
+ struct Reloc *r;
+ struct Symbol *asym;
+
+ /*
+ * First look up the segment to find whether it's text, data,
+ * bss or an external symbol.
+ */
+ asym = NULL;
+ if (segment == stext.index)
+ asym = stext.asym;
+ else if (segment == sdata.index)
+ asym = sdata.asym;
+ else if (segment == sbss.index)
+ asym = sbss.asym;
+ if (!asym)
+ nasm_error(ERR_NONFATAL, "`..gotoff' relocations require a non-global"
+ " symbol in the section");
+
+ r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+ sect->tail = &r->next;
+ r->next = NULL;
+
+ r->address = sect->len;
+ r->symbol = asym->symnum;
+ r->reltype = RELTYPE_GOTOFF;
+ r->bytes = bytes;
+
+ sect->nrelocs++;
+
+ return offset - asym->value;
+}
+
+static void aout_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct Section *s;
+ int32_t addr;
+ uint8_t mydata[4], *p;
+
+ if (segto == stext.index)
+ s = &stext;
+ else if (segto == sdata.index)
+ s = &sdata;
+ else if (segto == sbss.index)
+ s = NULL;
+ else {
+ nasm_error(ERR_WARNING, "attempt to assemble code in"
+ " segment %d: defaulting to `.text'", segto);
+ s = &stext;
+ }
+
+ if (!s && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in the"
+ " BSS section: ignored");
+ sbss.len += realsize(type, size);
+ return;
+ }
+
+ memset(mydata, 0, sizeof(mydata));
+
+ if (type == OUT_RESERVE) {
+ if (s) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " %s section: zeroing",
+ (segto == stext.index ? "code" : "data"));
+ aout_sect_write(s, NULL, size);
+ } else
+ sbss.len += size;
+ } else if (type == OUT_RAWDATA) {
+ aout_sect_write(s, data, size);
+ } else if (type == OUT_ADDRESS) {
+ int asize = abs((int)size);
+ addr = *(int64_t *)data;
+ if (segment != NO_SEG) {
+ if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "a.out format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ aout_add_reloc(s, segment, RELTYPE_ABSOLUTE, asize);
+ } else if (!bsd) {
+ nasm_error(ERR_NONFATAL,
+ "Linux a.out format does not support"
+ " any use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ } else if (wrt == aout_gotpc_sect + 1) {
+ is_pic = 0x40;
+ aout_add_reloc(s, segment, RELTYPE_GOTPC, asize);
+ } else if (wrt == aout_gotoff_sect + 1) {
+ is_pic = 0x40;
+ addr = aout_add_gotoff_reloc(s, segment, addr, asize);
+ } else if (wrt == aout_got_sect + 1) {
+ is_pic = 0x40;
+ addr = aout_add_gsym_reloc(s, segment, addr, RELTYPE_GOT,
+ asize, true);
+ } else if (wrt == aout_sym_sect + 1) {
+ addr = aout_add_gsym_reloc(s, segment, addr,
+ RELTYPE_ABSOLUTE, asize,
+ false);
+ } else if (wrt == aout_plt_sect + 1) {
+ is_pic = 0x40;
+ nasm_error(ERR_NONFATAL,
+ "a.out format cannot produce non-PC-"
+ "relative PLT references");
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "a.out format does not support this"
+ " use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ }
+ }
+ }
+ p = mydata;
+ if (asize == 2)
+ WRITESHORT(p, addr);
+ else
+ WRITELONG(p, addr);
+ aout_sect_write(s, mydata, asize);
+ } else if (type == OUT_REL2ADR) {
+ if (segment != NO_SEG && segment % 2) {
+ nasm_error(ERR_NONFATAL, "a.out format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ aout_add_reloc(s, segment, RELTYPE_RELATIVE, 2);
+ } else if (!bsd) {
+ nasm_error(ERR_NONFATAL, "Linux a.out format does not support"
+ " any use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ } else if (wrt == aout_plt_sect + 1) {
+ is_pic = 0x40;
+ aout_add_reloc(s, segment, RELTYPE_PLT, 2);
+ } else if (wrt == aout_gotpc_sect + 1 ||
+ wrt == aout_gotoff_sect + 1 ||
+ wrt == aout_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "a.out format cannot produce PC-"
+ "relative GOT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "a.out format does not support this"
+ " use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ }
+ }
+ p = mydata;
+ WRITESHORT(p, *(int64_t *)data - (size + s->len));
+ aout_sect_write(s, mydata, 2L);
+ } else if (type == OUT_REL4ADR) {
+ if (segment != NO_SEG && segment % 2) {
+ nasm_error(ERR_NONFATAL, "a.out format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ aout_add_reloc(s, segment, RELTYPE_RELATIVE, 4);
+ } else if (!bsd) {
+ nasm_error(ERR_NONFATAL, "Linux a.out format does not support"
+ " any use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ } else if (wrt == aout_plt_sect + 1) {
+ is_pic = 0x40;
+ aout_add_reloc(s, segment, RELTYPE_PLT, 4);
+ } else if (wrt == aout_gotpc_sect + 1 ||
+ wrt == aout_gotoff_sect + 1 ||
+ wrt == aout_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "a.out format cannot produce PC-"
+ "relative GOT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "a.out format does not support this"
+ " use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ }
+ }
+ p = mydata;
+ WRITELONG(p, *(int64_t *)data - (size + s->len));
+ aout_sect_write(s, mydata, 4L);
+ }
+}
+
+static void aout_pad_sections(void)
+{
+ static uint8_t pad[] = { 0x90, 0x90, 0x90, 0x90 };
+ /*
+ * Pad each of the text and data sections with NOPs until their
+ * length is a multiple of four. (NOP == 0x90.) Also increase
+ * the length of the BSS section similarly.
+ */
+ aout_sect_write(&stext, pad, (-(int32_t)stext.len) & 3);
+ aout_sect_write(&sdata, pad, (-(int32_t)sdata.len) & 3);
+ sbss.len = ALIGN(sbss.len, 4);
+}
+
+/*
+ * a.out files have the curious property that all references to
+ * things in the data or bss sections are done by addresses which
+ * are actually relative to the start of the _text_ section, in the
+ * _file_. (No relation to what happens after linking. No idea why
+ * this should be so. It's very strange.) So we have to go through
+ * the relocation table, _after_ the final size of each section is
+ * known, and fix up the relocations pointed to.
+ */
+static void aout_fixup_relocs(struct Section *sect)
+{
+ struct Reloc *r;
+
+ saa_rewind(sect->data);
+ list_for_each(r, sect->head) {
+ uint8_t *p, *q, blk[4];
+ int32_t l;
+
+ saa_fread(sect->data, r->address, blk, (int32_t)r->bytes);
+ p = q = blk;
+ l = *p++;
+ if (r->bytes > 1) {
+ l += ((int32_t)*p++) << 8;
+ if (r->bytes == 4) {
+ l += ((int32_t)*p++) << 16;
+ l += ((int32_t)*p++) << 24;
+ }
+ }
+ if (r->symbol == -SECT_DATA)
+ l += stext.len;
+ else if (r->symbol == -SECT_BSS)
+ l += stext.len + sdata.len;
+ if (r->bytes == 4)
+ WRITELONG(q, l);
+ else if (r->bytes == 2)
+ WRITESHORT(q, l);
+ else
+ *q++ = l & 0xFF;
+ saa_fwrite(sect->data, r->address, blk, (int32_t)r->bytes);
+ }
+}
+
+static void aout_write(void)
+{
+ /*
+ * Emit the a.out header.
+ */
+ /* OMAGIC, M_386 or MID_I386, no flags */
+ fwriteint32_t(bsd ? 0x07018600 | is_pic : 0x640107L, ofile);
+ fwriteint32_t(stext.len, ofile);
+ fwriteint32_t(sdata.len, ofile);
+ fwriteint32_t(sbss.len, ofile);
+ fwriteint32_t(nsyms * 12, ofile); /* length of symbol table */
+ fwriteint32_t(0L, ofile); /* object files have no entry point */
+ fwriteint32_t(stext.nrelocs * 8, ofile); /* size of text relocs */
+ fwriteint32_t(sdata.nrelocs * 8, ofile); /* size of data relocs */
+
+ /*
+ * Write out the code section and the data section.
+ */
+ saa_fpwrite(stext.data, ofile);
+ saa_fpwrite(sdata.data, ofile);
+
+ /*
+ * Write out the relocations.
+ */
+ aout_write_relocs(stext.head);
+ aout_write_relocs(sdata.head);
+
+ /*
+ * Write the symbol table.
+ */
+ aout_write_syms();
+
+ /*
+ * And the string table.
+ */
+ fwriteint32_t(strslen + 4, ofile); /* length includes length count */
+ saa_fpwrite(strs, ofile);
+}
+
+static void aout_write_relocs(struct Reloc *r)
+{
+ list_for_each(r, r) {
+ uint32_t word2;
+
+ fwriteint32_t(r->address, ofile);
+
+ if (r->symbol >= 0)
+ word2 = r->symbol;
+ else
+ word2 = -r->symbol;
+ word2 |= r->reltype << 24;
+ word2 |= (r->bytes == 1 ? 0 :
+ r->bytes == 2 ? 0x2000000L : 0x4000000L);
+ fwriteint32_t(word2, ofile);
+ }
+}
+
+static void aout_write_syms(void)
+{
+ uint32_t i;
+
+ saa_rewind(syms);
+ for (i = 0; i < nsyms; i++) {
+ struct Symbol *sym = saa_rstruct(syms);
+ fwriteint32_t(sym->strpos, ofile);
+ fwriteint32_t((int32_t)sym->type & ~SYM_WITH_SIZE, ofile);
+ /*
+ * Fix up the symbol value now we know the final section
+ * sizes.
+ */
+ if ((sym->type & SECT_MASK) == SECT_DATA)
+ sym->value += stext.len;
+ if ((sym->type & SECT_MASK) == SECT_BSS)
+ sym->value += stext.len + sdata.len;
+ fwriteint32_t(sym->value, ofile);
+ /*
+ * Output a size record if necessary.
+ */
+ if (sym->type & SYM_WITH_SIZE) {
+ fwriteint32_t(sym->strpos, ofile);
+ fwriteint32_t(0x0DL, ofile); /* special value: means size */
+ fwriteint32_t(sym->size, ofile);
+ i++; /* use up another of `nsyms' */
+ }
+ }
+}
+
+static void aout_sect_write(struct Section *sect,
+ const uint8_t *data, uint32_t len)
+{
+ saa_wbytes(sect->data, data, len);
+ sect->len += len;
+}
+
+extern macros_t aout_stdmac[];
+
+#endif /* OF_AOUT || OF_AOUTB */
+
+#ifdef OF_AOUT
+
+const struct ofmt of_aout = {
+ "Linux a.out object files",
+ "aout",
+ ".o",
+ 0,
+ 32,
+ null_debug_arr,
+ &null_debug_form,
+ aout_stdmac,
+ aout_init,
+ null_reset,
+ nasm_do_legacy_output,
+ aout_out,
+ aout_deflabel,
+ aout_section_names,
+ NULL,
+ null_sectalign,
+ null_segbase,
+ null_directive,
+ aout_cleanup,
+ NULL /* pragma list */
+};
+
+#endif
+
+#ifdef OF_AOUTB
+
+const struct ofmt of_aoutb = {
+ "NetBSD/FreeBSD a.out object files",
+ "aoutb",
+ ".o",
+ 0,
+ 32,
+ null_debug_arr,
+ &null_debug_form,
+ aout_stdmac,
+ aoutb_init,
+ null_reset,
+ nasm_do_legacy_output,
+ aout_out,
+ aout_deflabel,
+ aout_section_names,
+ NULL,
+ null_sectalign,
+ null_segbase,
+ null_directive,
+ aout_cleanup,
+ NULL /* pragma list */
+};
+
+#endif
diff --git a/output/outaout.mac b/output/outaout.mac
new file mode 100644
index 00000000..cd23852d
--- /dev/null
+++ b/output/outaout.mac
@@ -0,0 +1,37 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: aout aoutb
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outas86.c b/output/outas86.c
new file mode 100644
index 00000000..13578f06
--- /dev/null
+++ b/output/outas86.c
@@ -0,0 +1,617 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outas86.c output routines for the Netwide Assembler to produce
+ * Linux as86 (bin86-0.3) object files
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "outform.h"
+#include "outlib.h"
+
+#ifdef OF_AS86
+
+struct Piece {
+ struct Piece *next;
+ int type; /* 0 = absolute, 1 = seg, 2 = sym */
+ int32_t offset; /* relative offset */
+ int number; /* symbol/segment number (4=bss) */
+ int32_t bytes; /* size of reloc or of absolute data */
+ bool relative; /* relative address? */
+};
+
+struct Symbol {
+ int32_t strpos; /* string table position of name */
+ int flags; /* symbol flags */
+ int segment; /* 4=bss at this point */
+ int32_t value; /* address, or COMMON variable size */
+};
+
+/*
+ * Section IDs - used in Piece.number and Symbol.segment.
+ */
+#define SECT_TEXT 0 /* text section */
+#define SECT_DATA 3 /* data section */
+#define SECT_BSS 4 /* bss section */
+
+/*
+ * Flags used in Symbol.flags.
+ */
+#define SYM_ENTRY (1<<8)
+#define SYM_EXPORT (1<<7)
+#define SYM_IMPORT (1<<6)
+#define SYM_ABSOLUTE (1<<4)
+
+struct Section {
+ struct SAA *data;
+ uint32_t datalen, size, len;
+ int32_t index;
+ struct Piece *head, *last, **tail;
+};
+
+static struct Section stext, sdata;
+static uint32_t bsslen;
+static int32_t bssindex;
+
+static struct SAA *syms;
+static uint32_t nsyms;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static size_t strslen;
+
+static int as86_reloc_size;
+
+static void as86_write(void);
+static void as86_write_section(struct Section *, int);
+static size_t as86_add_string(const char *name);
+static void as86_sect_write(struct Section *, const uint8_t *,
+ uint32_t);
+
+static void as86_init(void)
+{
+ stext.data = saa_init(1L);
+ stext.datalen = 0L;
+ stext.head = stext.last = NULL;
+ stext.tail = &stext.head;
+ sdata.data = saa_init(1L);
+ sdata.datalen = 0L;
+ sdata.head = sdata.last = NULL;
+ sdata.tail = &sdata.head;
+ bsslen =
+ stext.len = stext.datalen = stext.size =
+ sdata.len = sdata.datalen = sdata.size = 0;
+ stext.index = seg_alloc();
+ sdata.index = seg_alloc();
+ bssindex = seg_alloc();
+ syms = saa_init((int32_t)sizeof(struct Symbol));
+ nsyms = 0;
+ bsym = raa_init();
+ strs = saa_init(1L);
+ strslen = 0;
+
+ /* as86 module name = input file minus extension */
+ as86_add_string(filename_set_extension(inname, ""));
+}
+
+static void as86_cleanup(void)
+{
+ struct Piece *p;
+
+ as86_write();
+ saa_free(stext.data);
+ while (stext.head) {
+ p = stext.head;
+ stext.head = stext.head->next;
+ nasm_free(p);
+ }
+ saa_free(sdata.data);
+ while (sdata.head) {
+ p = sdata.head;
+ sdata.head = sdata.head->next;
+ nasm_free(p);
+ }
+ saa_free(syms);
+ raa_free(bsym);
+ saa_free(strs);
+}
+
+static int32_t as86_section_names(char *name, int pass, int *bits)
+{
+
+ (void)pass;
+
+ /*
+ * Default is 16 bits.
+ */
+ if (!name) {
+ *bits = 16;
+ return stext.index;
+ }
+
+ if (!strcmp(name, ".text"))
+ return stext.index;
+ else if (!strcmp(name, ".data"))
+ return sdata.index;
+ else if (!strcmp(name, ".bss"))
+ return bssindex;
+ else
+ return NO_SEG;
+}
+
+static size_t as86_add_string(const char *name)
+{
+ size_t pos = strslen;
+ size_t length = strlen(name);
+
+ saa_wbytes(strs, name, length + 1);
+ strslen += 1 + length;
+
+ return pos;
+}
+
+static void as86_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ bool is_start = false;
+ struct Symbol *sym;
+
+ if (special)
+ nasm_error(ERR_NONFATAL, "as86 format does not support any"
+ " special symbol types");
+
+
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ if (strcmp(name, "..start")) {
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ return;
+ } else {
+ is_start = true;
+ }
+ }
+
+ sym = saa_wstruct(syms);
+
+ sym->strpos = as86_add_string(name);
+ sym->flags = 0;
+
+ if (is_start)
+ sym->flags = SYM_ENTRY;
+
+ if (segment == NO_SEG)
+ sym->flags |= SYM_ABSOLUTE, sym->segment = 0;
+ else if (segment == stext.index)
+ sym->segment = SECT_TEXT;
+ else if (segment == sdata.index)
+ sym->segment = SECT_DATA;
+ else if (segment == bssindex)
+ sym->segment = SECT_BSS;
+ else {
+ sym->flags |= SYM_IMPORT;
+ sym->segment = 15;
+ }
+
+ if (is_global == 2)
+ sym->segment = 3; /* already have IMPORT */
+
+ if (is_global && !(sym->flags & SYM_IMPORT))
+ sym->flags |= SYM_EXPORT;
+
+ sym->value = offset;
+
+ /*
+ * define the references from external-symbol segment numbers
+ * to these symbol records.
+ */
+ if (segment != NO_SEG && segment != stext.index &&
+ segment != sdata.index && segment != bssindex)
+ bsym = raa_write(bsym, segment, nsyms);
+
+ nsyms++;
+}
+
+static void as86_add_piece(struct Section *sect, int type, int32_t offset,
+ int32_t segment, int32_t bytes, int relative)
+{
+ struct Piece *p;
+
+ sect->len += bytes;
+
+ if (type == 0 && sect->last && sect->last->type == 0) {
+ sect->last->bytes += bytes;
+ return;
+ }
+
+ p = sect->last = *sect->tail = nasm_malloc(sizeof(struct Piece));
+ sect->tail = &p->next;
+ p->next = NULL;
+
+ p->type = type;
+ p->offset = offset;
+ p->bytes = bytes;
+ p->relative = relative;
+
+ if (type == 1 && segment == stext.index)
+ p->number = SECT_TEXT;
+ else if (type == 1 && segment == sdata.index)
+ p->number = SECT_DATA;
+ else if (type == 1 && segment == bssindex)
+ p->number = SECT_BSS;
+ else if (type == 1)
+ p->number = raa_read(bsym, segment), p->type = 2;
+}
+
+static void as86_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct Section *s;
+ int32_t offset;
+ uint8_t mydata[4], *p;
+
+ if (wrt != NO_SEG) {
+ wrt = NO_SEG; /* continue to do _something_ */
+ nasm_error(ERR_NONFATAL, "WRT not supported by as86 output format");
+ }
+
+ if (segto == stext.index)
+ s = &stext;
+ else if (segto == sdata.index)
+ s = &sdata;
+ else if (segto == bssindex)
+ s = NULL;
+ else {
+ nasm_error(ERR_WARNING, "attempt to assemble code in"
+ " segment %d: defaulting to `.text'", segto);
+ s = &stext;
+ }
+
+ if (!s && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in the"
+ " BSS section: ignored");
+ bsslen += realsize(type, size);
+ return;
+ }
+
+ memset(mydata, 0, sizeof(mydata));
+
+ if (type == OUT_RESERVE) {
+ if (s) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " %s section: zeroing",
+ (segto == stext.index ? "code" : "data"));
+ as86_sect_write(s, NULL, size);
+ as86_add_piece(s, 0, 0L, 0L, size, 0);
+ } else
+ bsslen += size;
+ } else if (type == OUT_RAWDATA) {
+ as86_sect_write(s, data, size);
+ as86_add_piece(s, 0, 0L, 0L, size, 0);
+ } else if (type == OUT_ADDRESS) {
+ int asize = abs((int)size);
+ if (segment != NO_SEG) {
+ if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "as86 format does not support"
+ " segment base references");
+ } else {
+ offset = *(int64_t *)data;
+ as86_add_piece(s, 1, offset, segment, asize, 0);
+ }
+ } else {
+ p = mydata;
+ WRITELONG(p, *(int64_t *)data);
+ as86_sect_write(s, data, asize);
+ as86_add_piece(s, 0, 0L, 0L, asize, 0);
+ }
+ } else if (type == OUT_REL2ADR) {
+ if (segment != NO_SEG) {
+ if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "as86 format does not support"
+ " segment base references");
+ } else {
+ offset = *(int64_t *)data;
+ as86_add_piece(s, 1, offset - size + 2, segment, 2L,
+ 1);
+ }
+ }
+ } else if (type == OUT_REL4ADR) {
+ if (segment != NO_SEG) {
+ if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "as86 format does not support"
+ " segment base references");
+ } else {
+ offset = *(int64_t *)data;
+ as86_add_piece(s, 1, offset - size + 4, segment, 4L,
+ 1);
+ }
+ }
+ }
+}
+
+static void as86_write(void)
+{
+ uint32_t i;
+ int32_t symlen, seglen, segsize;
+
+ /*
+ * First, go through the symbol records working out how big
+ * each will be. Also fix up BSS references at this time, and
+ * set the flags words up completely.
+ */
+ symlen = 0;
+ saa_rewind(syms);
+ for (i = 0; i < nsyms; i++) {
+ struct Symbol *sym = saa_rstruct(syms);
+ if (sym->segment == SECT_BSS)
+ sym->segment = SECT_DATA, sym->value += sdata.len;
+ sym->flags |= sym->segment;
+ if (sym->value == 0)
+ sym->flags |= 0 << 14, symlen += 4;
+ else if (sym->value >= 0 && sym->value <= 255)
+ sym->flags |= 1 << 14, symlen += 5;
+ else if (sym->value >= 0 && sym->value <= 65535L)
+ sym->flags |= 2 << 14, symlen += 6;
+ else
+ sym->flags |= 3 << 14, symlen += 8;
+ }
+
+ /*
+ * Now do the same for the segments, and get the segment size
+ * descriptor word at the same time.
+ */
+ seglen = segsize = 0;
+ if ((uint32_t)stext.len > 65535L)
+ segsize |= 0x03000000L, seglen += 4;
+ else
+ segsize |= 0x02000000L, seglen += 2;
+ if ((uint32_t)sdata.len > 65535L)
+ segsize |= 0xC0000000L, seglen += 4;
+ else
+ segsize |= 0x80000000L, seglen += 2;
+
+ /*
+ * Emit the as86 header.
+ */
+ fwriteint32_t(0x000186A3L, ofile);
+ fputc(0x2A, ofile);
+ fwriteint32_t(27 + symlen + seglen + strslen, ofile); /* header length */
+ fwriteint32_t(stext.len + sdata.len + bsslen, ofile);
+ fwriteint16_t(strslen, ofile);
+ fwriteint16_t(0, ofile); /* class = revision = 0 */
+ fwriteint32_t(0x55555555L, ofile); /* segment max sizes: always this */
+ fwriteint32_t(segsize, ofile); /* segment size descriptors */
+ if (segsize & 0x01000000L)
+ fwriteint32_t(stext.len, ofile);
+ else
+ fwriteint16_t(stext.len, ofile);
+ if (segsize & 0x40000000L)
+ fwriteint32_t(sdata.len + bsslen, ofile);
+ else
+ fwriteint16_t(sdata.len + bsslen, ofile);
+ fwriteint16_t(nsyms, ofile);
+
+ /*
+ * Write the symbol table.
+ */
+ saa_rewind(syms);
+ for (i = 0; i < nsyms; i++) {
+ struct Symbol *sym = saa_rstruct(syms);
+ fwriteint16_t(sym->strpos, ofile);
+ fwriteint16_t(sym->flags, ofile);
+ switch (sym->flags & (3 << 14)) {
+ case 0 << 14:
+ break;
+ case 1 << 14:
+ fputc(sym->value, ofile);
+ break;
+ case 2 << 14:
+ fwriteint16_t(sym->value, ofile);
+ break;
+ case 3 << 14:
+ fwriteint32_t(sym->value, ofile);
+ break;
+ }
+ }
+
+ /*
+ * Write out the string table.
+ */
+ saa_fpwrite(strs, ofile);
+
+ /*
+ * Write the program text.
+ */
+ as86_reloc_size = -1;
+ as86_write_section(&stext, SECT_TEXT);
+ as86_write_section(&sdata, SECT_DATA);
+ /*
+ * Append the BSS section to the .data section
+ */
+ if (bsslen > 65535L) {
+ fputc(0x13, ofile);
+ fwriteint32_t(bsslen, ofile);
+ } else if (bsslen > 255) {
+ fputc(0x12, ofile);
+ fwriteint16_t(bsslen, ofile);
+ } else if (bsslen) {
+ fputc(0x11, ofile);
+ fputc(bsslen, ofile);
+ }
+
+ fputc(0, ofile); /* termination */
+}
+
+static void as86_set_rsize(int size)
+{
+ if (as86_reloc_size != size) {
+ switch (as86_reloc_size = size) {
+ case 1:
+ fputc(0x01, ofile);
+ break;
+ case 2:
+ fputc(0x02, ofile);
+ break;
+ case 4:
+ fputc(0x03, ofile);
+ break;
+ default:
+ nasm_panic("bizarre relocation size %d", size);
+ break;
+ }
+ }
+}
+
+static void as86_write_section(struct Section *sect, int index)
+{
+ struct Piece *p;
+ uint32_t s;
+ int32_t length;
+
+ fputc(0x20 + index, ofile); /* select the right section */
+
+ saa_rewind(sect->data);
+
+ for (p = sect->head; p; p = p->next)
+ switch (p->type) {
+ case 0:
+ /*
+ * Absolute data. Emit it in chunks of at most 64
+ * bytes.
+ */
+ length = p->bytes;
+ do {
+ char buf[64];
+ int32_t tmplen = (length > 64 ? 64 : length);
+ fputc(0x40 | (tmplen & 0x3F), ofile);
+ saa_rnbytes(sect->data, buf, tmplen);
+ nasm_write(buf, tmplen, ofile);
+ length -= tmplen;
+ } while (length > 0);
+ break;
+ case 1:
+ /*
+ * A segment-type relocation. First fix up the BSS.
+ */
+ if (p->number == SECT_BSS)
+ p->number = SECT_DATA, p->offset += sdata.len;
+ as86_set_rsize(p->bytes);
+ fputc(0x80 | (p->relative ? 0x20 : 0) | p->number, ofile);
+ if (as86_reloc_size == 2)
+ fwriteint16_t(p->offset, ofile);
+ else
+ fwriteint32_t(p->offset, ofile);
+ break;
+ case 2:
+ /*
+ * A symbol-type relocation.
+ */
+ as86_set_rsize(p->bytes);
+ s = p->offset;
+ if (s > 65535L)
+ s = 3;
+ else if (s > 255)
+ s = 2;
+ else if (s > 0)
+ s = 1;
+ else
+ s = 0;
+ fputc(0xC0 |
+ (p->relative ? 0x20 : 0) |
+ (p->number > 255 ? 0x04 : 0) | s, ofile);
+ if (p->number > 255)
+ fwriteint16_t(p->number, ofile);
+ else
+ fputc(p->number, ofile);
+ switch (s) {
+ case 0:
+ break;
+ case 1:
+ fputc(p->offset, ofile);
+ break;
+ case 2:
+ fwriteint16_t(p->offset, ofile);
+ break;
+ case 3:
+ fwriteint32_t(p->offset, ofile);
+ break;
+ }
+ break;
+ }
+}
+
+static void as86_sect_write(struct Section *sect,
+ const uint8_t *data, uint32_t len)
+{
+ saa_wbytes(sect->data, data, len);
+ sect->datalen += len;
+}
+
+extern macros_t as86_stdmac[];
+
+const struct ofmt of_as86 = {
+ "Linux as86 (bin86 version 0.3) object files",
+ "as86",
+ ".o",
+ 0,
+ 32,
+ null_debug_arr,
+ &null_debug_form,
+ as86_stdmac,
+ as86_init,
+ null_reset,
+ nasm_do_legacy_output,
+ as86_out,
+ as86_deflabel,
+ as86_section_names,
+ NULL,
+ null_sectalign,
+ null_segbase,
+ null_directive,
+ as86_cleanup,
+ NULL /* pragma list */
+};
+
+#endif /* OF_AS86 */
diff --git a/output/outas86.mac b/output/outas86.mac
new file mode 100644
index 00000000..f0bd2e41
--- /dev/null
+++ b/output/outas86.mac
@@ -0,0 +1,37 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: as86
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outbin.c b/output/outbin.c
new file mode 100644
index 00000000..ea49abb5
--- /dev/null
+++ b/output/outbin.c
@@ -0,0 +1,1685 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outbin.c output routines for the Netwide Assembler to produce
+ * flat-form binary files
+ */
+
+/* This is the extended version of NASM's original binary output
+ * format. It is backward compatible with the original BIN format,
+ * and contains support for multiple sections and advanced section
+ * ordering.
+ *
+ * Feature summary:
+ *
+ * - Users can create an arbitrary number of sections; they are not
+ * limited to just ".text", ".data", and ".bss".
+ *
+ * - Sections can be either progbits or nobits type.
+ *
+ * - You can specify that they be aligned at a certian boundary
+ * following the previous section ("align="), or positioned at an
+ * arbitrary byte-granular location ("start=").
+ *
+ * - You can specify a "virtual" start address for a section, which
+ * will be used for the calculation for all address references
+ * with respect to that section ("vstart=").
+ *
+ * - The ORG directive, as well as the section/segment directive
+ * arguments ("align=", "start=", "vstart="), can take a critical
+ * expression as their value. For example: "align=(1 << 12)".
+ *
+ * - You can generate map files using the 'map' directive.
+ *
+ */
+
+/* Uncomment the following define if you want sections to adapt
+ * their progbits/nobits state depending on what type of
+ * instructions are issued, rather than defaulting to progbits.
+ * Note that this behavior violates the specification.
+
+#define ABIN_SMART_ADAPT
+
+*/
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "stdscan.h"
+#include "labels.h"
+#include "eval.h"
+#include "outform.h"
+#include "outlib.h"
+
+#ifdef OF_BIN
+
+static FILE *rf = NULL;
+static void (*do_output)(void);
+
+/* Section flags keep track of which attributes the user has defined. */
+#define START_DEFINED 0x001
+#define ALIGN_DEFINED 0x002
+#define FOLLOWS_DEFINED 0x004
+#define VSTART_DEFINED 0x008
+#define VALIGN_DEFINED 0x010
+#define VFOLLOWS_DEFINED 0x020
+#define TYPE_DEFINED 0x040
+#define TYPE_PROGBITS 0x080
+#define TYPE_NOBITS 0x100
+
+/* This struct is used to keep track of symbols for map-file generation. */
+static struct bin_label {
+ char *name;
+ struct bin_label *next;
+} *no_seg_labels, **nsl_tail;
+
+static struct Section {
+ char *name;
+ struct SAA *contents;
+ int64_t length; /* section length in bytes */
+
+/* Section attributes */
+ int flags; /* see flag definitions above */
+ uint64_t align; /* section alignment */
+ uint64_t valign; /* notional section alignment */
+ uint64_t start; /* section start address */
+ uint64_t vstart; /* section virtual start address */
+ char *follows; /* the section that this one will follow */
+ char *vfollows; /* the section that this one will notionally follow */
+ int32_t start_index; /* NASM section id for non-relocated version */
+ int32_t vstart_index; /* the NASM section id */
+
+ struct bin_label *labels; /* linked-list of label handles for map output. */
+ struct bin_label **labels_end; /* Holds address of end of labels list. */
+ struct Section *prev; /* Points to previous section (implicit follows). */
+ struct Section *next; /* This links sections with a defined start address. */
+
+/* The extended bin format allows for sections to have a "virtual"
+ * start address. This is accomplished by creating two sections:
+ * one beginning at the Load Memory Address and the other beginning
+ * at the Virtual Memory Address. The LMA section is only used to
+ * define the section.<section_name>.start label, but there isn't
+ * any other good way for us to handle that label.
+ */
+
+} *sections, *last_section;
+
+static struct Reloc {
+ struct Reloc *next;
+ int32_t posn;
+ int32_t bytes;
+ int32_t secref;
+ int32_t secrel;
+ struct Section *target;
+} *relocs, **reloctail;
+
+static uint64_t origin;
+static int origin_defined;
+
+/* Stuff we need for map-file generation. */
+#define MAP_ORIGIN 1
+#define MAP_SUMMARY 2
+#define MAP_SECTIONS 4
+#define MAP_SYMBOLS 8
+static int map_control = 0;
+
+extern macros_t bin_stdmac[];
+
+static void add_reloc(struct Section *s, int32_t bytes, int32_t secref,
+ int32_t secrel)
+{
+ struct Reloc *r;
+
+ r = *reloctail = nasm_malloc(sizeof(struct Reloc));
+ reloctail = &r->next;
+ r->next = NULL;
+ r->posn = s->length;
+ r->bytes = bytes;
+ r->secref = secref;
+ r->secrel = secrel;
+ r->target = s;
+}
+
+static struct Section *find_section_by_name(const char *name)
+{
+ struct Section *s;
+
+ list_for_each(s, sections)
+ if (!strcmp(s->name, name))
+ break;
+ return s;
+}
+
+static struct Section *find_section_by_index(int32_t index)
+{
+ struct Section *s;
+
+ list_for_each(s, sections)
+ if ((index == s->vstart_index) || (index == s->start_index))
+ break;
+ return s;
+}
+
+static struct Section *create_section(char *name)
+{
+ struct Section *s = nasm_zalloc(sizeof(*s));
+
+ s->prev = last_section;
+ s->name = nasm_strdup(name);
+ s->labels_end = &(s->labels);
+ s->contents = saa_init(1L);
+
+ /* Register our sections with NASM. */
+ s->vstart_index = seg_alloc();
+ s->start_index = seg_alloc();
+
+ /* FIXME: Append to a tail, we need some helper */
+ last_section->next = s;
+ last_section = s;
+
+ return last_section;
+}
+
+static void bin_cleanup(void)
+{
+ struct Section *g, **gp;
+ struct Section *gs = NULL, **gsp;
+ struct Section *s, **sp;
+ struct Section *nobits = NULL, **nt;
+ struct Section *last_progbits;
+ struct bin_label *l;
+ struct Reloc *r;
+ uint64_t pend;
+ int h;
+
+#ifdef DEBUG
+ nasm_error(ERR_DEBUG,
+ "bin_cleanup: Sections were initially referenced in this order:\n");
+ for (h = 0, s = sections; s; h++, s = s->next)
+ fprintf(stdout, "%i. %s\n", h, s->name);
+#endif
+
+ /* Assembly has completed, so now we need to generate the output file.
+ * Step 1: Separate progbits and nobits sections into separate lists.
+ * Step 2: Sort the progbits sections into their output order.
+ * Step 3: Compute start addresses for all progbits sections.
+ * Step 4: Compute vstart addresses for all sections.
+ * Step 5: Apply relocations.
+ * Step 6: Write the sections' data to the output file.
+ * Step 7: Generate the map file.
+ * Step 8: Release all allocated memory.
+ */
+
+ /* To do: Smart section-type adaptation could leave some empty sections
+ * without a defined type (progbits/nobits). Won't fix now since this
+ * feature will be disabled. */
+
+ /* Step 1: Split progbits and nobits sections into separate lists. */
+
+ nt = &nobits;
+ /* Move nobits sections into a separate list. Also pre-process nobits
+ * sections' attributes. */
+ for (sp = &sections->next, s = sections->next; s; s = *sp) { /* Skip progbits sections. */
+ if (s->flags & TYPE_PROGBITS) {
+ sp = &s->next;
+ continue;
+ }
+ /* Do some special pre-processing on nobits sections' attributes. */
+ if (s->flags & (START_DEFINED | ALIGN_DEFINED | FOLLOWS_DEFINED)) { /* Check for a mixture of real and virtual section attributes. */
+ if (s->flags & (VSTART_DEFINED | VALIGN_DEFINED |
+ VFOLLOWS_DEFINED))
+ nasm_fatal("cannot mix real and virtual attributes"
+ " in nobits section (%s)", s->name);
+ /* Real and virtual attributes mean the same thing for nobits sections. */
+ if (s->flags & START_DEFINED) {
+ s->vstart = s->start;
+ s->flags |= VSTART_DEFINED;
+ }
+ if (s->flags & ALIGN_DEFINED) {
+ s->valign = s->align;
+ s->flags |= VALIGN_DEFINED;
+ }
+ if (s->flags & FOLLOWS_DEFINED) {
+ s->vfollows = s->follows;
+ s->flags |= VFOLLOWS_DEFINED;
+ s->flags &= ~FOLLOWS_DEFINED;
+ }
+ }
+ /* Every section must have a start address. */
+ if (s->flags & VSTART_DEFINED) {
+ s->start = s->vstart;
+ s->flags |= START_DEFINED;
+ }
+ /* Move the section into the nobits list. */
+ *sp = s->next;
+ s->next = NULL;
+ *nt = s;
+ nt = &s->next;
+ }
+
+ /* Step 2: Sort the progbits sections into their output order. */
+
+ /* In Step 2 we move around sections in groups. A group
+ * begins with a section (group leader) that has a user-
+ * defined start address or follows section. The remainder
+ * of the group is made up of the sections that implicitly
+ * follow the group leader (i.e., they were defined after
+ * the group leader and were not given an explicit start
+ * address or follows section by the user). */
+
+ /* For anyone attempting to read this code:
+ * g (group) points to a group of sections, the first one of which has
+ * a user-defined start address or follows section.
+ * gp (g previous) holds the location of the pointer to g.
+ * gs (g scan) is a temp variable that we use to scan to the end of the group.
+ * gsp (gs previous) holds the location of the pointer to gs.
+ * nt (nobits tail) points to the nobits section-list tail.
+ */
+
+ /* Link all 'follows' groups to their proper position. To do
+ * this we need to know three things: the start of the group
+ * to relocate (g), the section it is following (s), and the
+ * end of the group we're relocating (gs). */
+ for (gp = &sections, g = sections; g; g = gs) { /* Find the next follows group that is out of place (g). */
+ if (!(g->flags & FOLLOWS_DEFINED)) {
+ while (g->next) {
+ if ((g->next->flags & FOLLOWS_DEFINED) &&
+ strcmp(g->name, g->next->follows))
+ break;
+ g = g->next;
+ }
+ if (!g->next)
+ break;
+ gp = &g->next;
+ g = g->next;
+ }
+ /* Find the section that this group follows (s). */
+ for (sp = &sections, s = sections;
+ s && strcmp(s->name, g->follows);
+ sp = &s->next, s = s->next) ;
+ if (!s)
+ nasm_fatal("section %s follows an invalid or"
+ " unknown section (%s)", g->name, g->follows);
+ if (s->next && (s->next->flags & FOLLOWS_DEFINED) &&
+ !strcmp(s->name, s->next->follows))
+ nasm_fatal("sections %s and %s can't both follow"
+ " section %s", g->name, s->next->name, s->name);
+ /* Find the end of the current follows group (gs). */
+ for (gsp = &g->next, gs = g->next;
+ gs && (gs != s) && !(gs->flags & START_DEFINED);
+ gsp = &gs->next, gs = gs->next) {
+ if (gs->next && (gs->next->flags & FOLLOWS_DEFINED) &&
+ strcmp(gs->name, gs->next->follows)) {
+ gsp = &gs->next;
+ gs = gs->next;
+ break;
+ }
+ }
+ /* Re-link the group after its follows section. */
+ *gsp = s->next;
+ s->next = g;
+ *gp = gs;
+ }
+
+ /* Link all 'start' groups to their proper position. Once
+ * again we need to know g, s, and gs (see above). The main
+ * difference is we already know g since we sort by moving
+ * groups from the 'unsorted' list into a 'sorted' list (g
+ * will always be the first section in the unsorted list). */
+ for (g = sections, sections = NULL; g; g = gs) { /* Find the section that we will insert this group before (s). */
+ for (sp = &sections, s = sections; s; sp = &s->next, s = s->next)
+ if ((s->flags & START_DEFINED) && (g->start < s->start))
+ break;
+ /* Find the end of the group (gs). */
+ for (gs = g->next, gsp = &g->next;
+ gs && !(gs->flags & START_DEFINED);
+ gsp = &gs->next, gs = gs->next) ;
+ /* Re-link the group before the target section. */
+ *sp = g;
+ *gsp = s;
+ }
+
+ /* Step 3: Compute start addresses for all progbits sections. */
+
+ /* Make sure we have an origin and a start address for the first section. */
+ if (origin_defined) {
+ if (sections->flags & START_DEFINED) {
+ /* Make sure this section doesn't begin before the origin. */
+ if (sections->start < origin)
+ nasm_fatal("section %s begins"
+ " before program origin", sections->name);
+ } else if (sections->flags & ALIGN_DEFINED) {
+ sections->start = ALIGN(origin, sections->align);
+ } else {
+ sections->start = origin;
+ }
+ } else {
+ if (!(sections->flags & START_DEFINED))
+ sections->start = 0;
+ origin = sections->start;
+ }
+ sections->flags |= START_DEFINED;
+
+ /* Make sure each section has an explicit start address. If it
+ * doesn't, then compute one based its alignment and the end of
+ * the previous section. */
+ for (pend = sections->start, g = s = sections; g; g = g->next) { /* Find the next section that could cause an overlap situation
+ * (has a defined start address, and is not zero length). */
+ if (g == s)
+ for (s = g->next;
+ s && ((s->length == 0) || !(s->flags & START_DEFINED));
+ s = s->next) ;
+ /* Compute the start address of this section, if necessary. */
+ if (!(g->flags & START_DEFINED)) { /* Default to an alignment of 4 if unspecified. */
+ if (!(g->flags & ALIGN_DEFINED)) {
+ g->align = 4;
+ g->flags |= ALIGN_DEFINED;
+ }
+ /* Set the section start address. */
+ g->start = ALIGN(pend, g->align);
+ g->flags |= START_DEFINED;
+ }
+ /* Ugly special case for progbits sections' virtual attributes:
+ * If there is a defined valign, but no vstart and no vfollows, then
+ * we valign after the previous progbits section. This case doesn't
+ * really make much sense for progbits sections with a defined start
+ * address, but it is possible and we must do *something*.
+ * Not-so-ugly special case:
+ * If a progbits section has no virtual attributes, we set the
+ * vstart equal to the start address. */
+ if (!(g->flags & (VSTART_DEFINED | VFOLLOWS_DEFINED))) {
+ if (g->flags & VALIGN_DEFINED)
+ g->vstart = ALIGN(pend, g->valign);
+ else
+ g->vstart = g->start;
+ g->flags |= VSTART_DEFINED;
+ }
+ /* Ignore zero-length sections. */
+ if (g->start < pend)
+ continue;
+ /* Compute the span of this section. */
+ pend = g->start + g->length;
+ /* Check for section overlap. */
+ if (s) {
+ if (s->start < origin)
+ nasm_fatal("section %s beings before program origin",
+ s->name);
+ if (g->start > s->start)
+ nasm_fatal("sections %s ~ %s and %s overlap!",
+ gs->name, g->name, s->name);
+ if (pend > s->start)
+ nasm_fatal("sections %s and %s overlap!",
+ g->name, s->name);
+ }
+ /* Remember this section as the latest >0 length section. */
+ gs = g;
+ }
+
+ /* Step 4: Compute vstart addresses for all sections. */
+
+ /* Attach the nobits sections to the end of the progbits sections. */
+ for (s = sections; s->next; s = s->next) ;
+ s->next = nobits;
+ last_progbits = s;
+ /*
+ * Scan for sections that don't have a vstart address. If we find
+ * one we'll attempt to compute its vstart. If we can't compute
+ * the vstart, we leave it alone and come back to it in a
+ * subsequent scan. We continue scanning and re-scanning until
+ * we've gone one full cycle without computing any vstarts.
+ */
+ do { /* Do one full scan of the sections list. */
+ for (h = 0, g = sections; g; g = g->next) {
+ if (g->flags & VSTART_DEFINED)
+ continue;
+ /* Find the section that this one virtually follows. */
+ if (g->flags & VFOLLOWS_DEFINED) {
+ for (s = sections; s && strcmp(g->vfollows, s->name);
+ s = s->next) ;
+ if (!s)
+ nasm_fatal("section %s vfollows unknown section (%s)",
+ g->name, g->vfollows);
+ } else if (g->prev != NULL)
+ for (s = sections; s && (s != g->prev); s = s->next) ;
+ /* The .bss section is the only one with prev = NULL.
+ In this case we implicitly follow the last progbits
+ section. */
+ else
+ s = last_progbits;
+
+ /* If the section we're following has a vstart, we can proceed. */
+ if (s->flags & VSTART_DEFINED) { /* Default to virtual alignment of four. */
+ if (!(g->flags & VALIGN_DEFINED)) {
+ g->valign = 4;
+ g->flags |= VALIGN_DEFINED;
+ }
+ /* Compute the vstart address. */
+ g->vstart = ALIGN(s->vstart + s->length, g->valign);
+ g->flags |= VSTART_DEFINED;
+ h++;
+ /* Start and vstart mean the same thing for nobits sections. */
+ if (g->flags & TYPE_NOBITS)
+ g->start = g->vstart;
+ }
+ }
+ } while (h);
+
+ /* Now check for any circular vfollows references, which will manifest
+ * themselves as sections without a defined vstart. */
+ for (h = 0, s = sections; s; s = s->next) {
+ if (!(s->flags & VSTART_DEFINED)) { /* Non-fatal errors after assembly has completed are generally a
+ * no-no, but we'll throw a fatal one eventually so it's ok. */
+ nasm_error(ERR_NONFATAL, "cannot compute vstart for section %s",
+ s->name);
+ h++;
+ }
+ }
+ if (h)
+ nasm_fatal("circular vfollows path detected");
+
+#ifdef DEBUG
+ nasm_error(ERR_DEBUG,
+ "bin_cleanup: Confirm final section order for output file:\n");
+ for (h = 0, s = sections; s && (s->flags & TYPE_PROGBITS);
+ h++, s = s->next)
+ fprintf(stdout, "%i. %s\n", h, s->name);
+#endif
+
+ /* Step 5: Apply relocations. */
+
+ /* Prepare the sections for relocating. */
+ list_for_each(s, sections)
+ saa_rewind(s->contents);
+ /* Apply relocations. */
+ list_for_each(r, relocs) {
+ uint8_t *p, mydata[8];
+ int64_t l;
+ int b;
+
+ nasm_assert(r->bytes <= 8);
+
+ memset(mydata, 0, sizeof(mydata));
+
+ saa_fread(r->target->contents, r->posn, mydata, r->bytes);
+ p = mydata;
+ l = 0;
+ for (b = r->bytes - 1; b >= 0; b--)
+ l = (l << 8) + mydata[b];
+
+ s = find_section_by_index(r->secref);
+ if (s) {
+ if (r->secref == s->start_index)
+ l += s->start;
+ else
+ l += s->vstart;
+ }
+ s = find_section_by_index(r->secrel);
+ if (s) {
+ if (r->secrel == s->start_index)
+ l -= s->start;
+ else
+ l -= s->vstart;
+ }
+
+ WRITEADDR(p, l, r->bytes);
+ saa_fwrite(r->target->contents, r->posn, mydata, r->bytes);
+ }
+
+ /* Step 6: Write the section data to the output file. */
+ do_output();
+
+ /* Step 7: Generate the map file. */
+
+ if (map_control) {
+ static const char not_defined[] = "not defined";
+
+ /* Display input and output file names. */
+ fprintf(rf, "\n- NASM Map file ");
+ for (h = 63; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\nSource file: %s\nOutput file: %s\n\n",
+ inname, outname);
+
+ if (map_control & MAP_ORIGIN) { /* Display program origin. */
+ fprintf(rf, "-- Program origin ");
+ for (h = 61; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\n%08"PRIX64"\n\n", origin);
+ }
+ /* Display sections summary. */
+ if (map_control & MAP_SUMMARY) {
+ fprintf(rf, "-- Sections (summary) ");
+ for (h = 57; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\nVstart Start Stop "
+ "Length Class Name\n");
+ list_for_each(s, sections) {
+ fprintf(rf, "%16"PRIX64" %16"PRIX64" %16"PRIX64" %08"PRIX64" ",
+ s->vstart, s->start, s->start + s->length,
+ s->length);
+ if (s->flags & TYPE_PROGBITS)
+ fprintf(rf, "progbits ");
+ else
+ fprintf(rf, "nobits ");
+ fprintf(rf, "%s\n", s->name);
+ }
+ fprintf(rf, "\n");
+ }
+ /* Display detailed section information. */
+ if (map_control & MAP_SECTIONS) {
+ fprintf(rf, "-- Sections (detailed) ");
+ for (h = 56; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\n");
+ list_for_each(s, sections) {
+ fprintf(rf, "---- Section %s ", s->name);
+ for (h = 65 - strlen(s->name); h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\nclass: ");
+ if (s->flags & TYPE_PROGBITS)
+ fprintf(rf, "progbits");
+ else
+ fprintf(rf, "nobits");
+ fprintf(rf, "\nlength: %16"PRIX64"\nstart: %16"PRIX64""
+ "\nalign: ", s->length, s->start);
+ if (s->flags & ALIGN_DEFINED)
+ fprintf(rf, "%16"PRIX64"", s->align);
+ else
+ fputs(not_defined, rf);
+ fprintf(rf, "\nfollows: ");
+ if (s->flags & FOLLOWS_DEFINED)
+ fprintf(rf, "%s", s->follows);
+ else
+ fputs(not_defined, rf);
+ fprintf(rf, "\nvstart: %16"PRIX64"\nvalign: ", s->vstart);
+ if (s->flags & VALIGN_DEFINED)
+ fprintf(rf, "%16"PRIX64"", s->valign);
+ else
+ fputs(not_defined, rf);
+ fprintf(rf, "\nvfollows: ");
+ if (s->flags & VFOLLOWS_DEFINED)
+ fprintf(rf, "%s", s->vfollows);
+ else
+ fputs(not_defined, rf);
+ fprintf(rf, "\n\n");
+ }
+ }
+ /* Display symbols information. */
+ if (map_control & MAP_SYMBOLS) {
+ int32_t segment;
+ int64_t offset;
+ bool found_label;
+
+ fprintf(rf, "-- Symbols ");
+ for (h = 68; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\n");
+ if (no_seg_labels) {
+ fprintf(rf, "---- No Section ");
+ for (h = 63; h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\nValue Name\n");
+ list_for_each(l, no_seg_labels) {
+ found_label = lookup_label(l->name, &segment, &offset);
+ nasm_assert(found_label);
+ fprintf(rf, "%08"PRIX64" %s\n", offset, l->name);
+ }
+ fprintf(rf, "\n\n");
+ }
+ list_for_each(s, sections) {
+ if (s->labels) {
+ fprintf(rf, "---- Section %s ", s->name);
+ for (h = 65 - strlen(s->name); h; h--)
+ fputc('-', rf);
+ fprintf(rf, "\n\nReal Virtual Name\n");
+ list_for_each(l, s->labels) {
+ found_label = lookup_label(l->name, &segment, &offset);
+ nasm_assert(found_label);
+ fprintf(rf, "%16"PRIX64" %16"PRIX64" %s\n",
+ s->start + offset, s->vstart + offset,
+ l->name);
+ }
+ fprintf(rf, "\n");
+ }
+ }
+ }
+ }
+
+ /* Close the report file. */
+ if (map_control && (rf != stdout) && (rf != stderr))
+ fclose(rf);
+
+ /* Step 8: Release all allocated memory. */
+
+ /* Free sections, label pointer structs, etc.. */
+ while (sections) {
+ s = sections;
+ sections = s->next;
+ saa_free(s->contents);
+ nasm_free(s->name);
+ if (s->flags & FOLLOWS_DEFINED)
+ nasm_free(s->follows);
+ if (s->flags & VFOLLOWS_DEFINED)
+ nasm_free(s->vfollows);
+ while (s->labels) {
+ l = s->labels;
+ s->labels = l->next;
+ nasm_free(l);
+ }
+ nasm_free(s);
+ }
+
+ /* Free no-section labels. */
+ while (no_seg_labels) {
+ l = no_seg_labels;
+ no_seg_labels = l->next;
+ nasm_free(l);
+ }
+
+ /* Free relocation structures. */
+ while (relocs) {
+ r = relocs->next;
+ nasm_free(relocs);
+ relocs = r;
+ }
+}
+
+static void bin_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ uint8_t *p, mydata[8];
+ struct Section *s;
+
+ if (wrt != NO_SEG) {
+ wrt = NO_SEG; /* continue to do _something_ */
+ nasm_error(ERR_NONFATAL, "WRT not supported by binary output format");
+ }
+
+ /* Find the segment we are targeting. */
+ s = find_section_by_index(segto);
+ if (!s)
+ nasm_panic("code directed to nonexistent segment?");
+
+ /* "Smart" section-type adaptation code. */
+ if (!(s->flags & TYPE_DEFINED)) {
+ if (type == OUT_RESERVE)
+ s->flags |= TYPE_DEFINED | TYPE_NOBITS;
+ else
+ s->flags |= TYPE_DEFINED | TYPE_PROGBITS;
+ }
+
+ if ((s->flags & TYPE_NOBITS) && (type != OUT_RESERVE))
+ nasm_error(ERR_WARNING, "attempt to initialize memory in a"
+ " nobits section: ignored");
+
+ switch (type) {
+ case OUT_ADDRESS:
+ {
+ int asize = abs((int)size);
+
+ if (segment != NO_SEG && !find_section_by_index(segment)) {
+ if (segment % 2)
+ nasm_error(ERR_NONFATAL, "binary output format does not support"
+ " segment base references");
+ else
+ nasm_error(ERR_NONFATAL, "binary output format does not support"
+ " external references");
+ segment = NO_SEG;
+ }
+ if (s->flags & TYPE_PROGBITS) {
+ if (segment != NO_SEG)
+ add_reloc(s, asize, segment, -1L);
+ p = mydata;
+ WRITEADDR(p, *(int64_t *)data, asize);
+ saa_wbytes(s->contents, mydata, asize);
+ }
+
+ /*
+ * Reassign size with sign dropped, we will need it
+ * for section length calculation.
+ */
+ size = asize;
+ break;
+ }
+
+ case OUT_RAWDATA:
+ if (s->flags & TYPE_PROGBITS)
+ saa_wbytes(s->contents, data, size);
+ break;
+
+ case OUT_RESERVE:
+ if (s->flags & TYPE_PROGBITS) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " %s section: zeroing", s->name);
+ saa_wbytes(s->contents, NULL, size);
+ }
+ break;
+
+ case OUT_REL1ADR:
+ case OUT_REL2ADR:
+ case OUT_REL4ADR:
+ case OUT_REL8ADR:
+ {
+ int64_t addr = *(int64_t *)data - size;
+ size = realsize(type, size);
+ if (segment != NO_SEG && !find_section_by_index(segment)) {
+ if (segment % 2)
+ nasm_error(ERR_NONFATAL, "binary output format does not support"
+ " segment base references");
+ else
+ nasm_error(ERR_NONFATAL, "binary output format does not support"
+ " external references");
+ segment = NO_SEG;
+ }
+ if (s->flags & TYPE_PROGBITS) {
+ add_reloc(s, size, segment, segto);
+ p = mydata;
+ WRITEADDR(p, addr - s->length, size);
+ saa_wbytes(s->contents, mydata, size);
+ }
+ break;
+ }
+
+ default:
+ nasm_error(ERR_NONFATAL, "unsupported relocation type %d\n", type);
+ break;
+ }
+
+ s->length += size;
+}
+
+static void bin_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ (void)segment; /* Don't warn that this parameter is unused */
+ (void)offset; /* Don't warn that this parameter is unused */
+
+ if (special)
+ nasm_error(ERR_NONFATAL, "binary format does not support any"
+ " special symbol types");
+ else if (name[0] == '.' && name[1] == '.' && name[2] != '@')
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ else if (is_global == 2)
+ nasm_error(ERR_NONFATAL, "binary output format does not support common"
+ " variables");
+ else {
+ struct Section *s;
+ struct bin_label ***ltp;
+
+ /* Remember label definition so we can look it up later when
+ * creating the map file. */
+ s = find_section_by_index(segment);
+ if (s)
+ ltp = &(s->labels_end);
+ else
+ ltp = &nsl_tail;
+ (**ltp) = nasm_malloc(sizeof(struct bin_label));
+ (**ltp)->name = name;
+ (**ltp)->next = NULL;
+ *ltp = &((**ltp)->next);
+ }
+
+}
+
+/* These constants and the following function are used
+ * by bin_secname() to parse attribute assignments. */
+
+enum { ATTRIB_START, ATTRIB_ALIGN, ATTRIB_FOLLOWS,
+ ATTRIB_VSTART, ATTRIB_VALIGN, ATTRIB_VFOLLOWS,
+ ATTRIB_NOBITS, ATTRIB_PROGBITS
+};
+
+static int bin_read_attribute(char **line, int *attribute,
+ uint64_t *value)
+{
+ expr *e;
+ int attrib_name_size;
+ struct tokenval tokval;
+ char *exp;
+
+ /* Skip whitespace. */
+ while (**line && nasm_isspace(**line))
+ (*line)++;
+ if (!**line)
+ return 0;
+
+ /* Figure out what attribute we're reading. */
+ if (!nasm_strnicmp(*line, "align=", 6)) {
+ *attribute = ATTRIB_ALIGN;
+ attrib_name_size = 6;
+ } else {
+ if (!nasm_strnicmp(*line, "start=", 6)) {
+ *attribute = ATTRIB_START;
+ attrib_name_size = 6;
+ } else if (!nasm_strnicmp(*line, "follows=", 8)) {
+ *attribute = ATTRIB_FOLLOWS;
+ *line += 8;
+ return 1;
+ } else if (!nasm_strnicmp(*line, "vstart=", 7)) {
+ *attribute = ATTRIB_VSTART;
+ attrib_name_size = 7;
+ } else if (!nasm_strnicmp(*line, "valign=", 7)) {
+ *attribute = ATTRIB_VALIGN;
+ attrib_name_size = 7;
+ } else if (!nasm_strnicmp(*line, "vfollows=", 9)) {
+ *attribute = ATTRIB_VFOLLOWS;
+ *line += 9;
+ return 1;
+ } else if (!nasm_strnicmp(*line, "nobits", 6) &&
+ (nasm_isspace((*line)[6]) || ((*line)[6] == '\0'))) {
+ *attribute = ATTRIB_NOBITS;
+ *line += 6;
+ return 1;
+ } else if (!nasm_strnicmp(*line, "progbits", 8) &&
+ (nasm_isspace((*line)[8]) || ((*line)[8] == '\0'))) {
+ *attribute = ATTRIB_PROGBITS;
+ *line += 8;
+ return 1;
+ } else
+ return 0;
+ }
+
+ /* Find the end of the expression. */
+ if ((*line)[attrib_name_size] != '(') {
+ /* Single term (no parenthesis). */
+ exp = *line += attrib_name_size;
+ while (**line && !nasm_isspace(**line))
+ (*line)++;
+ if (**line) {
+ **line = '\0';
+ (*line)++;
+ }
+ } else {
+ char c;
+ int pcount = 1;
+
+ /* Full expression (delimited by parenthesis) */
+ exp = *line += attrib_name_size + 1;
+ while (1) {
+ (*line) += strcspn(*line, "()'\"");
+ if (**line == '(') {
+ ++(*line);
+ ++pcount;
+ }
+ if (**line == ')') {
+ ++(*line);
+ --pcount;
+ if (!pcount)
+ break;
+ }
+ if ((**line == '"') || (**line == '\'')) {
+ c = **line;
+ while (**line) {
+ ++(*line);
+ if (**line == c)
+ break;
+ }
+ if (!**line) {
+ nasm_error(ERR_NONFATAL,
+ "invalid syntax in `section' directive");
+ return -1;
+ }
+ ++(*line);
+ }
+ if (!**line) {
+ nasm_error(ERR_NONFATAL, "expecting `)'");
+ return -1;
+ }
+ }
+ *(*line - 1) = '\0'; /* Terminate the expression. */
+ }
+
+ /* Check for no value given. */
+ if (!*exp) {
+ nasm_error(ERR_WARNING, "No value given to attribute in"
+ " `section' directive");
+ return -1;
+ }
+
+ /* Read and evaluate the expression. */
+ stdscan_reset();
+ stdscan_set(exp);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, 1, NULL);
+ if (e) {
+ if (!is_really_simple(e)) {
+ nasm_error(ERR_NONFATAL, "section attribute value must be"
+ " a critical expression");
+ return -1;
+ }
+ } else {
+ nasm_error(ERR_NONFATAL, "Invalid attribute value"
+ " specified in `section' directive.");
+ return -1;
+ }
+ *value = (uint64_t)reloc_value(e);
+ return 1;
+}
+
+static void bin_sectalign(int32_t seg, unsigned int value)
+{
+ struct Section *s = find_section_by_index(seg);
+
+ if (!s || !is_power2(value))
+ return;
+
+ if (value > s->align)
+ s->align = value;
+
+ if (!(s->flags & ALIGN_DEFINED))
+ s->flags |= ALIGN_DEFINED;
+}
+
+static void bin_assign_attributes(struct Section *sec, char *astring)
+{
+ int attribute, check;
+ uint64_t value;
+ char *p;
+
+ while (1) { /* Get the next attribute. */
+ check = bin_read_attribute(&astring, &attribute, &value);
+ /* Skip bad attribute. */
+ if (check == -1)
+ continue;
+ /* Unknown section attribute, so skip it and warn the user. */
+ if (!check) {
+ if (!*astring)
+ break; /* End of line. */
+ else {
+ p = astring;
+ while (*astring && !nasm_isspace(*astring))
+ astring++;
+ if (*astring) {
+ *astring = '\0';
+ astring++;
+ }
+ nasm_error(ERR_WARNING, "ignoring unknown section attribute:"
+ " \"%s\"", p);
+ }
+ continue;
+ }
+
+ switch (attribute) { /* Handle nobits attribute. */
+ case ATTRIB_NOBITS:
+ if ((sec->flags & TYPE_DEFINED)
+ && (sec->flags & TYPE_PROGBITS))
+ nasm_error(ERR_NONFATAL,
+ "attempt to change section type"
+ " from progbits to nobits");
+ else
+ sec->flags |= TYPE_DEFINED | TYPE_NOBITS;
+ continue;
+
+ /* Handle progbits attribute. */
+ case ATTRIB_PROGBITS:
+ if ((sec->flags & TYPE_DEFINED) && (sec->flags & TYPE_NOBITS))
+ nasm_error(ERR_NONFATAL, "attempt to change section type"
+ " from nobits to progbits");
+ else
+ sec->flags |= TYPE_DEFINED | TYPE_PROGBITS;
+ continue;
+
+ /* Handle align attribute. */
+ case ATTRIB_ALIGN:
+ if (!value || ((value - 1) & value)) {
+ nasm_error(ERR_NONFATAL,
+ "argument to `align' is not a power of two");
+ } else {
+ /*
+ * Alignment is already satisfied if
+ * the previous align value is greater
+ */
+ if ((sec->flags & ALIGN_DEFINED) && (value < sec->align))
+ value = sec->align;
+
+ /* Don't allow a conflicting align value. */
+ if ((sec->flags & START_DEFINED) && (sec->start & (value - 1))) {
+ nasm_error(ERR_NONFATAL,
+ "`align' value conflicts with section start address");
+ } else {
+ sec->align = value;
+ sec->flags |= ALIGN_DEFINED;
+ }
+ }
+ continue;
+
+ /* Handle valign attribute. */
+ case ATTRIB_VALIGN:
+ if (!value || ((value - 1) & value))
+ nasm_error(ERR_NONFATAL, "argument to `valign' is not a"
+ " power of two");
+ else { /* Alignment is already satisfied if the previous
+ * align value is greater. */
+ if ((sec->flags & VALIGN_DEFINED) && (value < sec->valign))
+ value = sec->valign;
+
+ /* Don't allow a conflicting valign value. */
+ if ((sec->flags & VSTART_DEFINED)
+ && (sec->vstart & (value - 1)))
+ nasm_error(ERR_NONFATAL,
+ "`valign' value conflicts "
+ "with `vstart' address");
+ else {
+ sec->valign = value;
+ sec->flags |= VALIGN_DEFINED;
+ }
+ }
+ continue;
+
+ /* Handle start attribute. */
+ case ATTRIB_START:
+ if (sec->flags & FOLLOWS_DEFINED)
+ nasm_error(ERR_NONFATAL, "cannot combine `start' and `follows'"
+ " section attributes");
+ else if ((sec->flags & START_DEFINED) && (value != sec->start))
+ nasm_error(ERR_NONFATAL, "section start address redefined");
+ else {
+ sec->start = value;
+ sec->flags |= START_DEFINED;
+ if (sec->flags & ALIGN_DEFINED) {
+ if (sec->start & (sec->align - 1))
+ nasm_error(ERR_NONFATAL, "`start' address conflicts"
+ " with section alignment");
+ sec->flags ^= ALIGN_DEFINED;
+ }
+ }
+ continue;
+
+ /* Handle vstart attribute. */
+ case ATTRIB_VSTART:
+ if (sec->flags & VFOLLOWS_DEFINED)
+ nasm_error(ERR_NONFATAL,
+ "cannot combine `vstart' and `vfollows'"
+ " section attributes");
+ else if ((sec->flags & VSTART_DEFINED)
+ && (value != sec->vstart))
+ nasm_error(ERR_NONFATAL,
+ "section virtual start address"
+ " (vstart) redefined");
+ else {
+ sec->vstart = value;
+ sec->flags |= VSTART_DEFINED;
+ if (sec->flags & VALIGN_DEFINED) {
+ if (sec->vstart & (sec->valign - 1))
+ nasm_error(ERR_NONFATAL, "`vstart' address conflicts"
+ " with `valign' value");
+ sec->flags ^= VALIGN_DEFINED;
+ }
+ }
+ continue;
+
+ /* Handle follows attribute. */
+ case ATTRIB_FOLLOWS:
+ p = astring;
+ astring += strcspn(astring, " \t");
+ if (astring == p)
+ nasm_error(ERR_NONFATAL, "expecting section name for `follows'"
+ " attribute");
+ else {
+ *(astring++) = '\0';
+ if (sec->flags & START_DEFINED)
+ nasm_error(ERR_NONFATAL,
+ "cannot combine `start' and `follows'"
+ " section attributes");
+ sec->follows = nasm_strdup(p);
+ sec->flags |= FOLLOWS_DEFINED;
+ }
+ continue;
+
+ /* Handle vfollows attribute. */
+ case ATTRIB_VFOLLOWS:
+ if (sec->flags & VSTART_DEFINED)
+ nasm_error(ERR_NONFATAL,
+ "cannot combine `vstart' and `vfollows'"
+ " section attributes");
+ else {
+ p = astring;
+ astring += strcspn(astring, " \t");
+ if (astring == p)
+ nasm_error(ERR_NONFATAL,
+ "expecting section name for `vfollows'"
+ " attribute");
+ else {
+ *(astring++) = '\0';
+ sec->vfollows = nasm_strdup(p);
+ sec->flags |= VFOLLOWS_DEFINED;
+ }
+ }
+ continue;
+ }
+ }
+}
+
+static void bin_define_section_labels(void)
+{
+ static int labels_defined = 0;
+ struct Section *sec;
+ char *label_name;
+ size_t base_len;
+
+ if (labels_defined)
+ return;
+ list_for_each(sec, sections) {
+ base_len = strlen(sec->name) + 8;
+ label_name = nasm_malloc(base_len + 8);
+ strcpy(label_name, "section.");
+ strcpy(label_name + 8, sec->name);
+
+ /* section.<name>.start */
+ strcpy(label_name + base_len, ".start");
+ define_label(label_name, sec->start_index, 0L, false);
+
+ /* section.<name>.vstart */
+ strcpy(label_name + base_len, ".vstart");
+ define_label(label_name, sec->vstart_index, 0L, false);
+
+ nasm_free(label_name);
+ }
+ labels_defined = 1;
+}
+
+static int32_t bin_secname(char *name, int pass, int *bits)
+{
+ char *p;
+ struct Section *sec;
+
+ /* bin_secname is called with *name = NULL at the start of each
+ * pass. Use this opportunity to establish the default section
+ * (default is BITS-16 ".text" segment).
+ */
+ if (!name) { /* Reset ORG and section attributes at the start of each pass. */
+ origin_defined = 0;
+ list_for_each(sec, sections)
+ sec->flags &= ~(START_DEFINED | VSTART_DEFINED |
+ ALIGN_DEFINED | VALIGN_DEFINED);
+
+ /* Define section start and vstart labels. */
+ if (pass != 1)
+ bin_define_section_labels();
+
+ /* Establish the default (.text) section. */
+ *bits = 16;
+ sec = find_section_by_name(".text");
+ sec->flags |= TYPE_DEFINED | TYPE_PROGBITS;
+ return sec->vstart_index;
+ }
+
+ /* Attempt to find the requested section. If it does not
+ * exist, create it. */
+ p = name;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+ sec = find_section_by_name(name);
+ if (!sec) {
+ sec = create_section(name);
+ if (!strcmp(name, ".data"))
+ sec->flags |= TYPE_DEFINED | TYPE_PROGBITS;
+ else if (!strcmp(name, ".bss")) {
+ sec->flags |= TYPE_DEFINED | TYPE_NOBITS;
+ sec->prev = NULL;
+ }
+ }
+
+ /* Handle attribute assignments. */
+ if (pass != 1)
+ bin_assign_attributes(sec, p);
+
+#ifndef ABIN_SMART_ADAPT
+ /* The following line disables smart adaptation of
+ * PROGBITS/NOBITS section types (it forces sections to
+ * default to PROGBITS). */
+ if ((pass != 1) && !(sec->flags & TYPE_DEFINED))
+ sec->flags |= TYPE_DEFINED | TYPE_PROGBITS;
+#endif
+
+ return sec->vstart_index;
+}
+
+static enum directive_result
+bin_directive(enum directive directive, char *args, int pass)
+{
+ switch (directive) {
+ case D_ORG:
+ {
+ struct tokenval tokval;
+ uint64_t value;
+ expr *e;
+
+ stdscan_reset();
+ stdscan_set(args);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, 1, NULL);
+ if (e) {
+ if (!is_really_simple(e))
+ nasm_error(ERR_NONFATAL, "org value must be a critical"
+ " expression");
+ else {
+ value = reloc_value(e);
+ /* Check for ORG redefinition. */
+ if (origin_defined && (value != origin))
+ nasm_error(ERR_NONFATAL, "program origin redefined");
+ else {
+ origin = value;
+ origin_defined = 1;
+ }
+ }
+ } else
+ nasm_error(ERR_NONFATAL, "No or invalid offset specified"
+ " in ORG directive.");
+ return DIRR_OK;
+ }
+ case D_MAP:
+ {
+ /* The 'map' directive allows the user to generate section
+ * and symbol information to stdout, stderr, or to a file. */
+ char *p;
+
+ if (pass != 1)
+ return DIRR_OK;
+ args += strspn(args, " \t");
+ while (*args) {
+ p = args;
+ args += strcspn(args, " \t");
+ if (*args != '\0')
+ *(args++) = '\0';
+ if (!nasm_stricmp(p, "all"))
+ map_control |=
+ MAP_ORIGIN | MAP_SUMMARY | MAP_SECTIONS | MAP_SYMBOLS;
+ else if (!nasm_stricmp(p, "brief"))
+ map_control |= MAP_ORIGIN | MAP_SUMMARY;
+ else if (!nasm_stricmp(p, "sections"))
+ map_control |= MAP_ORIGIN | MAP_SUMMARY | MAP_SECTIONS;
+ else if (!nasm_stricmp(p, "segments"))
+ map_control |= MAP_ORIGIN | MAP_SUMMARY | MAP_SECTIONS;
+ else if (!nasm_stricmp(p, "symbols"))
+ map_control |= MAP_SYMBOLS;
+ else if (!rf) {
+ if (!nasm_stricmp(p, "stdout"))
+ rf = stdout;
+ else if (!nasm_stricmp(p, "stderr"))
+ rf = stderr;
+ else { /* Must be a filename. */
+ rf = nasm_open_write(p, NF_TEXT);
+ if (!rf) {
+ nasm_error(ERR_WARNING, "unable to open map file `%s'",
+ p);
+ map_control = 0;
+ return DIRR_OK;
+ }
+ }
+ } else
+ nasm_error(ERR_WARNING, "map file already specified");
+ }
+ if (map_control == 0)
+ map_control |= MAP_ORIGIN | MAP_SUMMARY;
+ if (!rf)
+ rf = stdout;
+ return DIRR_OK;
+ }
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+const struct ofmt of_bin, of_ith, of_srec;
+static void binfmt_init(void);
+static void do_output_bin(void);
+static void do_output_ith(void);
+static void do_output_srec(void);
+
+static void bin_init(void)
+{
+ do_output = do_output_bin;
+ binfmt_init();
+}
+
+static void ith_init(void)
+{
+ do_output = do_output_ith;
+ binfmt_init();
+}
+
+static void srec_init(void)
+{
+ do_output = do_output_srec;
+ binfmt_init();
+}
+
+static void binfmt_init(void)
+{
+ relocs = NULL;
+ reloctail = &relocs;
+ origin_defined = 0;
+ no_seg_labels = NULL;
+ nsl_tail = &no_seg_labels;
+
+ /* Create default section (.text). */
+ sections = last_section = nasm_zalloc(sizeof(struct Section));
+ last_section->name = nasm_strdup(".text");
+ last_section->contents = saa_init(1L);
+ last_section->flags = TYPE_DEFINED | TYPE_PROGBITS;
+ last_section->labels_end = &(last_section->labels);
+ last_section->start_index = seg_alloc();
+ last_section->vstart_index = seg_alloc();
+}
+
+/* Generate binary file output */
+static void do_output_bin(void)
+{
+ struct Section *s;
+ uint64_t addr = origin;
+
+ /* Write the progbits sections to the output file. */
+ list_for_each(s, sections) {
+ /* Skip non-progbits sections */
+ if (!(s->flags & TYPE_PROGBITS))
+ continue;
+ /* Skip zero-length sections */
+ if (s->length == 0)
+ continue;
+
+ /* Pad the space between sections. */
+ nasm_assert(addr <= s->start);
+ fwritezero(s->start - addr, ofile);
+
+ /* Write the section to the output file. */
+ saa_fpwrite(s->contents, ofile);
+
+ /* Keep track of the current file position */
+ addr = s->start + s->length;
+ }
+}
+
+/* Generate Intel hex file output */
+static void write_ith_record(unsigned int len, uint16_t addr,
+ uint8_t type, void *data)
+{
+ char buf[1+2+4+2+255*2+2+2];
+ char *p = buf;
+ uint8_t csum, *dptr = data;
+ unsigned int i;
+
+ nasm_assert(len <= 255);
+
+ csum = len + addr + (addr >> 8) + type;
+ for (i = 0; i < len; i++)
+ csum += dptr[i];
+ csum = -csum;
+
+ p += sprintf(p, ":%02X%04X%02X", len, addr, type);
+ for (i = 0; i < len; i++)
+ p += sprintf(p, "%02X", dptr[i]);
+ p += sprintf(p, "%02X\n", csum);
+
+ nasm_write(buf, p-buf, ofile);
+}
+
+static void do_output_ith(void)
+{
+ uint8_t buf[32];
+ struct Section *s;
+ uint64_t addr, hiaddr, hilba;
+ uint64_t length;
+ unsigned int chunk;
+
+ /* Write the progbits sections to the output file. */
+ hilba = 0;
+ list_for_each(s, sections) {
+ /* Skip non-progbits sections */
+ if (!(s->flags & TYPE_PROGBITS))
+ continue;
+ /* Skip zero-length sections */
+ if (s->length == 0)
+ continue;
+
+ addr = s->start;
+ length = s->length;
+ saa_rewind(s->contents);
+
+ while (length) {
+ hiaddr = addr >> 16;
+ if (hiaddr != hilba) {
+ buf[0] = hiaddr >> 8;
+ buf[1] = hiaddr;
+ write_ith_record(2, 0, 4, buf);
+ hilba = hiaddr;
+ }
+
+ chunk = 32 - (addr & 31);
+ if (length < chunk)
+ chunk = length;
+
+ saa_rnbytes(s->contents, buf, chunk);
+ write_ith_record(chunk, (uint16_t)addr, 0, buf);
+
+ addr += chunk;
+ length -= chunk;
+ }
+ }
+
+ /* Write closing record */
+ write_ith_record(0, 0, 1, NULL);
+}
+
+/* Generate Motorola S-records */
+static void write_srecord(unsigned int len, unsigned int alen,
+ uint32_t addr, uint8_t type, void *data)
+{
+ char buf[2+2+8+255*2+2+2];
+ char *p = buf;
+ uint8_t csum, *dptr = data;
+ unsigned int i;
+
+ nasm_assert(len <= 255);
+
+ switch (alen) {
+ case 2:
+ addr &= 0xffff;
+ break;
+ case 3:
+ addr &= 0xffffff;
+ break;
+ case 4:
+ break;
+ default:
+ nasm_assert(0);
+ break;
+ }
+
+ csum = (len+alen+1) + addr + (addr >> 8) + (addr >> 16) + (addr >> 24);
+ for (i = 0; i < len; i++)
+ csum += dptr[i];
+ csum = 0xff-csum;
+
+ p += sprintf(p, "S%c%02X%0*X", type, len+alen+1, alen*2, addr);
+ for (i = 0; i < len; i++)
+ p += sprintf(p, "%02X", dptr[i]);
+ p += sprintf(p, "%02X\n", csum);
+
+ nasm_write(buf, p-buf, ofile);
+}
+
+static void do_output_srec(void)
+{
+ uint8_t buf[32];
+ struct Section *s;
+ uint64_t addr, maxaddr;
+ uint64_t length;
+ int alen;
+ unsigned int chunk;
+ char dtype, etype;
+
+ maxaddr = 0;
+ list_for_each(s, sections) {
+ /* Skip non-progbits sections */
+ if (!(s->flags & TYPE_PROGBITS))
+ continue;
+ /* Skip zero-length sections */
+ if (s->length == 0)
+ continue;
+
+ addr = s->start + s->length - 1;
+ if (addr > maxaddr)
+ maxaddr = addr;
+ }
+
+ if (maxaddr <= 0xffff) {
+ alen = 2;
+ dtype = '1'; /* S1 = 16-bit data */
+ etype = '9'; /* S9 = 16-bit end */
+ } else if (maxaddr <= 0xffffff) {
+ alen = 3;
+ dtype = '2'; /* S2 = 24-bit data */
+ etype = '8'; /* S8 = 24-bit end */
+ } else {
+ alen = 4;
+ dtype = '3'; /* S3 = 32-bit data */
+ etype = '7'; /* S7 = 32-bit end */
+ }
+
+ /* Write head record */
+ write_srecord(0, 2, 0, '0', NULL);
+
+ /* Write the progbits sections to the output file. */
+ list_for_each(s, sections) {
+ /* Skip non-progbits sections */
+ if (!(s->flags & TYPE_PROGBITS))
+ continue;
+ /* Skip zero-length sections */
+ if (s->length == 0)
+ continue;
+
+ addr = s->start;
+ length = s->length;
+ saa_rewind(s->contents);
+
+ while (length) {
+ chunk = 32 - (addr & 31);
+ if (length < chunk)
+ chunk = length;
+
+ saa_rnbytes(s->contents, buf, chunk);
+ write_srecord(chunk, alen, (uint32_t)addr, dtype, buf);
+
+ addr += chunk;
+ length -= chunk;
+ }
+ }
+
+ /* Write closing record */
+ write_srecord(0, alen, 0, etype, NULL);
+}
+
+
+const struct ofmt of_bin = {
+ "flat-form binary files (e.g. DOS .COM, .SYS)",
+ "bin",
+ "",
+ 0,
+ 64,
+ null_debug_arr,
+ &null_debug_form,
+ bin_stdmac,
+ bin_init,
+ null_reset,
+ nasm_do_legacy_output,
+ bin_out,
+ bin_deflabel,
+ bin_secname,
+ NULL,
+ bin_sectalign,
+ null_segbase,
+ bin_directive,
+ bin_cleanup,
+ NULL /* pragma list */
+};
+
+const struct ofmt of_ith = {
+ "Intel hex",
+ "ith",
+ ".ith", /* really should have been ".hex"... */
+ OFMT_TEXT,
+ 64,
+ null_debug_arr,
+ &null_debug_form,
+ bin_stdmac,
+ ith_init,
+ null_reset,
+ nasm_do_legacy_output,
+ bin_out,
+ bin_deflabel,
+ bin_secname,
+ NULL,
+ bin_sectalign,
+ null_segbase,
+ bin_directive,
+ bin_cleanup,
+ NULL /* pragma list */
+};
+
+const struct ofmt of_srec = {
+ "Motorola S-records",
+ "srec",
+ ".srec",
+ OFMT_TEXT,
+ 64,
+ null_debug_arr,
+ &null_debug_form,
+ bin_stdmac,
+ srec_init,
+ null_reset,
+ nasm_do_legacy_output,
+ bin_out,
+ bin_deflabel,
+ bin_secname,
+ NULL,
+ bin_sectalign,
+ null_segbase,
+ bin_directive,
+ bin_cleanup,
+ NULL /* pragma list */
+};
+
+#endif /* #ifdef OF_BIN */
diff --git a/output/outbin.mac b/output/outbin.mac
new file mode 100644
index 00000000..be7fefae
--- /dev/null
+++ b/output/outbin.mac
@@ -0,0 +1,40 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: bin
+%define __SECT__ [section .text]
+%imacro org 1+.nolist
+[org %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outcoff.c b/output/outcoff.c
new file mode 100644
index 00000000..c7af1b7c
--- /dev/null
+++ b/output/outcoff.c
@@ -0,0 +1,1215 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outcoff.c output routines for the Netwide Assembler to produce
+ * COFF object files (for DJGPP and Win32)
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "ilog2.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "eval.h"
+#include "outform.h"
+#include "outlib.h"
+#include "pecoff.h"
+
+#if defined(OF_COFF) || defined(OF_WIN32) || defined(OF_WIN64)
+
+/*
+ * Notes on COFF:
+ *
+ * (0) When I say `standard COFF' below, I mean `COFF as output and
+ * used by DJGPP'. I assume DJGPP gets it right.
+ *
+ * (1) Win32 appears to interpret the term `relative relocation'
+ * differently from standard COFF. Standard COFF understands a
+ * relative relocation to mean that during relocation you add the
+ * address of the symbol you're referencing, and subtract the base
+ * address of the section you're in. Win32 COFF, by contrast, seems
+ * to add the address of the symbol and then subtract the address
+ * of THE BYTE AFTER THE RELOCATED DWORD. Hence the two formats are
+ * subtly incompatible.
+ *
+ * (2) Win32 doesn't bother putting any flags in the header flags
+ * field (at offset 0x12 into the file).
+ *
+ * (3) Win32 uses some extra flags into the section header table:
+ * it defines flags 0x80000000 (writable), 0x40000000 (readable)
+ * and 0x20000000 (executable), and uses them in the expected
+ * combinations. It also defines 0x00100000 through 0x00700000 for
+ * section alignments of 1 through 64 bytes.
+ *
+ * (4) Both standard COFF and Win32 COFF seem to use the DWORD
+ * field directly after the section name in the section header
+ * table for something strange: they store what the address of the
+ * section start point _would_ be, if you laid all the sections end
+ * to end starting at zero. Dunno why. Microsoft's documentation
+ * lists this field as "Virtual Size of Section", which doesn't
+ * seem to fit at all. In fact, Win32 even includes non-linked
+ * sections such as .drectve in this calculation.
+ *
+ * Newer versions of MASM seem to have changed this to be zero, and
+ * that apparently matches the COFF spec, so go with that.
+ *
+ * (5) Standard COFF does something very strange to common
+ * variables: the relocation point for a common variable is as far
+ * _before_ the variable as its size stretches out _after_ it. So
+ * we must fix up common variable references. Win32 seems to be
+ * sensible on this one.
+ */
+
+/* Flag which version of COFF we are currently outputting. */
+bool win32, win64;
+
+static int32_t imagebase_sect;
+#define WRT_IMAGEBASE "..imagebase"
+
+/*
+ * Some common section flags by default
+ */
+#define TEXT_FLAGS_WIN \
+ (IMAGE_SCN_CNT_CODE | \
+ IMAGE_SCN_ALIGN_16BYTES | \
+ IMAGE_SCN_MEM_EXECUTE | \
+ IMAGE_SCN_MEM_READ)
+#define TEXT_FLAGS_DOS \
+ (IMAGE_SCN_CNT_CODE)
+
+#define DATA_FLAGS_WIN \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA | \
+ IMAGE_SCN_ALIGN_4BYTES | \
+ IMAGE_SCN_MEM_READ | \
+ IMAGE_SCN_MEM_WRITE)
+#define DATA_FLAGS_DOS \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA)
+
+#define BSS_FLAGS_WIN \
+ (IMAGE_SCN_CNT_UNINITIALIZED_DATA | \
+ IMAGE_SCN_ALIGN_4BYTES | \
+ IMAGE_SCN_MEM_READ | \
+ IMAGE_SCN_MEM_WRITE)
+#define BSS_FLAGS_DOS \
+ (IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+
+#define RDATA_FLAGS_WIN \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA | \
+ IMAGE_SCN_ALIGN_8BYTES | \
+ IMAGE_SCN_MEM_READ)
+
+#define RDATA_FLAGS_DOS \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA)
+
+#define PDATA_FLAGS \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA | \
+ IMAGE_SCN_ALIGN_4BYTES | \
+ IMAGE_SCN_MEM_READ)
+
+#define XDATA_FLAGS \
+ (IMAGE_SCN_CNT_INITIALIZED_DATA | \
+ IMAGE_SCN_ALIGN_8BYTES | \
+ IMAGE_SCN_MEM_READ)
+
+#define INFO_FLAGS \
+ (IMAGE_SCN_ALIGN_1BYTES | \
+ IMAGE_SCN_LNK_INFO | \
+ IMAGE_SCN_LNK_REMOVE)
+
+#define TEXT_FLAGS ((win32 | win64) ? TEXT_FLAGS_WIN : TEXT_FLAGS_DOS)
+#define DATA_FLAGS ((win32 | win64) ? DATA_FLAGS_WIN : DATA_FLAGS_DOS)
+#define BSS_FLAGS ((win32 | win64) ? BSS_FLAGS_WIN : BSS_FLAGS_DOS)
+#define RDATA_FLAGS ((win32 | win64) ? RDATA_FLAGS_WIN : RDATA_FLAGS_DOS)
+
+#define SECT_DELTA 32
+struct coff_Section **coff_sects;
+static int sectlen;
+int coff_nsects;
+
+struct SAA *coff_syms;
+uint32_t coff_nsyms;
+
+static int32_t def_seg;
+
+static int initsym;
+
+static struct RAA *bsym, *symval;
+
+struct SAA *coff_strs;
+static uint32_t strslen;
+
+static void coff_gen_init(void);
+static void coff_sect_write(struct coff_Section *, const uint8_t *, uint32_t);
+static void coff_write(void);
+static void coff_section_header(char *, int32_t, int32_t, int32_t, int32_t, int32_t, int, int32_t);
+static void coff_write_relocs(struct coff_Section *);
+static void coff_write_symbols(void);
+
+static void coff_win32_init(void)
+{
+ win32 = true;
+ win64 = false;
+ coff_gen_init();
+}
+
+static void coff_win64_init(void)
+{
+ win32 = false;
+ win64 = true;
+ coff_gen_init();
+ imagebase_sect = seg_alloc()+1;
+ backend_label(WRT_IMAGEBASE, imagebase_sect, 0);
+}
+
+static void coff_std_init(void)
+{
+ win32 = win64 = false;
+ coff_gen_init();
+}
+
+static void coff_gen_init(void)
+{
+
+ coff_sects = NULL;
+ coff_nsects = sectlen = 0;
+ coff_syms = saa_init(sizeof(struct coff_Symbol));
+ coff_nsyms = 0;
+ bsym = raa_init();
+ symval = raa_init();
+ coff_strs = saa_init(1);
+ strslen = 0;
+ def_seg = seg_alloc();
+}
+
+static void coff_cleanup(void)
+{
+ struct coff_Reloc *r;
+ int i;
+
+ dfmt->cleanup();
+
+ coff_write();
+ for (i = 0; i < coff_nsects; i++) {
+ if (coff_sects[i]->data)
+ saa_free(coff_sects[i]->data);
+ while (coff_sects[i]->head) {
+ r = coff_sects[i]->head;
+ coff_sects[i]->head = coff_sects[i]->head->next;
+ nasm_free(r);
+ }
+ nasm_free(coff_sects[i]->name);
+ nasm_free(coff_sects[i]);
+ }
+ nasm_free(coff_sects);
+ saa_free(coff_syms);
+ raa_free(bsym);
+ raa_free(symval);
+ saa_free(coff_strs);
+}
+
+int coff_make_section(char *name, uint32_t flags)
+{
+ struct coff_Section *s;
+ size_t namelen;
+
+ s = nasm_zalloc(sizeof(*s));
+
+ if (flags != BSS_FLAGS)
+ s->data = saa_init(1);
+ s->tail = &s->head;
+ if (!strcmp(name, ".text"))
+ s->index = def_seg;
+ else
+ s->index = seg_alloc();
+ s->namepos = -1;
+ namelen = strlen(name);
+ if (namelen > 8) {
+ if (win32 || win64) {
+ s->namepos = strslen + 4;
+ saa_wbytes(coff_strs, name, namelen + 1);
+ strslen += namelen + 1;
+ } else {
+ namelen = 8;
+ }
+ }
+ s->name = nasm_malloc(namelen + 1);
+ strncpy(s->name, name, namelen);
+ s->name[namelen] = '\0';
+ s->flags = flags;
+
+ if (coff_nsects >= sectlen) {
+ sectlen += SECT_DELTA;
+ coff_sects = nasm_realloc(coff_sects, sectlen * sizeof(*coff_sects));
+ }
+ coff_sects[coff_nsects++] = s;
+
+ return coff_nsects - 1;
+}
+
+static inline int32_t coff_sectalign_flags(unsigned int align)
+{
+ return (ilog2_32(align) + 1) << 20;
+}
+
+static int32_t coff_section_names(char *name, int pass, int *bits)
+{
+ char *p;
+ uint32_t flags, align_and = ~0L, align_or = 0L;
+ int i;
+
+ /*
+ * Set default bits.
+ */
+ if (!name) {
+ if(win64)
+ *bits = 64;
+ else
+ *bits = 32;
+
+ return def_seg;
+ }
+
+ p = name;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+ if (strlen(name) > 8) {
+ if (!win32 && !win64) {
+ nasm_error(ERR_WARNING,
+ "COFF section names limited to 8 characters: truncating");
+ name[8] = '\0';
+ }
+ }
+ flags = 0;
+
+ while (*p && nasm_isspace(*p))
+ p++;
+ while (*p) {
+ char *q = p;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+ while (*p && nasm_isspace(*p))
+ p++;
+
+ if (!nasm_stricmp(q, "code") || !nasm_stricmp(q, "text")) {
+ flags = TEXT_FLAGS;
+ } else if (!nasm_stricmp(q, "data")) {
+ flags = DATA_FLAGS;
+ } else if (!nasm_stricmp(q, "rdata")) {
+ if (win32 | win64)
+ flags = RDATA_FLAGS;
+ else {
+ flags = DATA_FLAGS; /* gotta do something */
+ nasm_error(ERR_NONFATAL, "standard COFF does not support"
+ " read-only data sections");
+ }
+ } else if (!nasm_stricmp(q, "bss")) {
+ flags = BSS_FLAGS;
+ } else if (!nasm_stricmp(q, "info")) {
+ if (win32 | win64)
+ flags = INFO_FLAGS;
+ else {
+ flags = DATA_FLAGS; /* gotta do something */
+ nasm_error(ERR_NONFATAL, "standard COFF does not support"
+ " informational sections");
+ }
+ } else if (!nasm_strnicmp(q, "align=", 6)) {
+ if (!(win32 | win64))
+ nasm_error(ERR_NONFATAL, "standard COFF does not support"
+ " section alignment specification");
+ else {
+ if (q[6 + strspn(q + 6, "0123456789")])
+ nasm_error(ERR_NONFATAL,
+ "argument to `align' is not numeric");
+ else {
+ unsigned int align = atoi(q + 6);
+ if (!align || ((align - 1) & align))
+ nasm_error(ERR_NONFATAL, "argument to `align' is not a"
+ " power of two");
+ else if (align > 64)
+ nasm_error(ERR_NONFATAL, "Win32 cannot align sections"
+ " to better than 64-byte boundaries");
+ else {
+ align_and = ~0x00F00000L;
+ align_or = coff_sectalign_flags(align);
+ }
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < coff_nsects; i++)
+ if (!strcmp(name, coff_sects[i]->name))
+ break;
+ if (i == coff_nsects) {
+ if (!flags) {
+ if (!strcmp(name, ".data"))
+ flags = DATA_FLAGS;
+ else if (!strcmp(name, ".rdata"))
+ flags = RDATA_FLAGS;
+ else if (!strcmp(name, ".bss"))
+ flags = BSS_FLAGS;
+ else if (win64 && !strcmp(name, ".pdata"))
+ flags = PDATA_FLAGS;
+ else if (win64 && !strcmp(name, ".xdata"))
+ flags = XDATA_FLAGS;
+ else
+ flags = TEXT_FLAGS;
+ }
+ i = coff_make_section(name, flags);
+ if (flags)
+ coff_sects[i]->flags = flags;
+ coff_sects[i]->flags &= align_and;
+ coff_sects[i]->flags |= align_or;
+ } else if (pass == 1) {
+ /* Check if any flags are specified */
+ if (flags) {
+ unsigned int align_flags = flags & IMAGE_SCN_ALIGN_MASK;
+
+ /* Warn if non-alignment flags differ */
+ if ((flags ^ coff_sects[i]->flags) & ~IMAGE_SCN_ALIGN_MASK) {
+ nasm_error(ERR_WARNING, "section attributes ignored on"
+ " redeclaration of section `%s'", name);
+ }
+ /* Check if alignment might be needed */
+ if (align_flags > IMAGE_SCN_ALIGN_1BYTES) {
+ unsigned int sect_align_flags = coff_sects[i]->flags & IMAGE_SCN_ALIGN_MASK;
+
+ /* Compute the actual alignment */
+ unsigned int align = 1u << ((align_flags - IMAGE_SCN_ALIGN_1BYTES) >> 20);
+
+ /* Update section header as needed */
+ if (align_flags > sect_align_flags) {
+ coff_sects[i]->flags = (coff_sects[i]->flags & ~IMAGE_SCN_ALIGN_MASK) | align_flags;
+ }
+ /* Check if not already aligned */
+ if (coff_sects[i]->len % align) {
+ unsigned int padding = (align - coff_sects[i]->len) % align;
+ /* We need to write at most 8095 bytes */
+ char buffer[8095];
+ if (coff_sects[i]->flags & IMAGE_SCN_CNT_CODE) {
+ /* Fill with INT 3 instructions */
+ memset(buffer, 0xCC, padding);
+ } else {
+ memset(buffer, 0x00, padding);
+ }
+ saa_wbytes(coff_sects[i]->data, buffer, padding);
+ coff_sects[i]->len += padding;
+ }
+ }
+ }
+ }
+
+ return coff_sects[i]->index;
+}
+
+static void coff_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ int pos = strslen + 4;
+ struct coff_Symbol *sym;
+
+ if (special)
+ nasm_error(ERR_NONFATAL, "COFF format does not support any"
+ " special symbol types");
+
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ if (strcmp(name,WRT_IMAGEBASE))
+ nasm_error(ERR_NONFATAL, "unrecognized special symbol `%s'", name);
+ return;
+ }
+
+ if (strlen(name) > 8) {
+ size_t nlen = strlen(name)+1;
+ saa_wbytes(coff_strs, name, nlen);
+ strslen += nlen;
+ } else
+ pos = -1;
+
+ sym = saa_wstruct(coff_syms);
+
+ sym->strpos = pos;
+ sym->namlen = strlen(name);
+ if (pos == -1)
+ strcpy(sym->name, name);
+ sym->is_global = !!is_global;
+ sym->type = 0; /* Default to T_NULL (no type) */
+ if (segment == NO_SEG)
+ sym->section = -1; /* absolute symbol */
+ else {
+ int i;
+ sym->section = 0;
+ for (i = 0; i < coff_nsects; i++)
+ if (segment == coff_sects[i]->index) {
+ sym->section = i + 1;
+ break;
+ }
+ if (!sym->section)
+ sym->is_global = true;
+ }
+ if (is_global == 2)
+ sym->value = offset;
+ else
+ sym->value = (sym->section == 0 ? 0 : offset);
+
+ /*
+ * define the references from external-symbol segment numbers
+ * to these symbol records.
+ */
+ if (sym->section == 0)
+ bsym = raa_write(bsym, segment, coff_nsyms);
+
+ if (segment != NO_SEG)
+ symval = raa_write(symval, segment, sym->section ? 0 : sym->value);
+
+ coff_nsyms++;
+}
+
+static int32_t coff_add_reloc(struct coff_Section *sect, int32_t segment,
+ int16_t type)
+{
+ struct coff_Reloc *r;
+
+ r = *sect->tail = nasm_malloc(sizeof(struct coff_Reloc));
+ sect->tail = &r->next;
+ r->next = NULL;
+
+ r->address = sect->len;
+ if (segment == NO_SEG) {
+ r->symbol = 0, r->symbase = ABS_SYMBOL;
+ } else {
+ int i;
+ r->symbase = REAL_SYMBOLS;
+ for (i = 0; i < coff_nsects; i++) {
+ if (segment == coff_sects[i]->index) {
+ r->symbol = i * 2;
+ r->symbase = SECT_SYMBOLS;
+ break;
+ }
+ }
+ if (r->symbase == REAL_SYMBOLS)
+ r->symbol = raa_read(bsym, segment);
+ }
+ r->type = type;
+
+ sect->nrelocs++;
+
+ /*
+ * Return the fixup for standard COFF common variables.
+ */
+ if (r->symbase == REAL_SYMBOLS && !(win32 | win64))
+ return raa_read(symval, segment);
+
+ return 0;
+}
+
+static void coff_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct coff_Section *s;
+ uint8_t mydata[8], *p;
+ int i;
+
+ if (wrt != NO_SEG && !win64) {
+ wrt = NO_SEG; /* continue to do _something_ */
+ nasm_error(ERR_NONFATAL, "WRT not supported by COFF output formats");
+ }
+
+ s = NULL;
+ for (i = 0; i < coff_nsects; i++) {
+ if (segto == coff_sects[i]->index) {
+ s = coff_sects[i];
+ break;
+ }
+ }
+ if (!s) {
+ int tempint; /* ignored */
+ if (segto != coff_section_names(".text", 2, &tempint))
+ nasm_panic("strange segment conditions in COFF driver");
+ else
+ s = coff_sects[coff_nsects - 1];
+ }
+
+ /* magically default to 'wrt ..imagebase' in .pdata and .xdata */
+ if (win64 && wrt == NO_SEG) {
+ if (!strcmp(s->name,".pdata") || !strcmp(s->name,".xdata"))
+ wrt = imagebase_sect;
+ }
+
+ if (!s->data && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in"
+ " BSS section `%s': ignored", s->name);
+ s->len += realsize(type, size);
+ return;
+ }
+
+ memset(mydata, 0, sizeof(mydata));
+
+ if (dfmt && dfmt->debug_output) {
+ struct coff_DebugInfo dinfo;
+ dinfo.segto = segto;
+ dinfo.seg = segment;
+ dinfo.section = s;
+
+ if (type == OUT_ADDRESS)
+ dinfo.size = abs((int)size);
+ else
+ dinfo.size = realsize(type, size);
+
+ dfmt->debug_output(type, &dinfo);
+ }
+
+ if (type == OUT_RESERVE) {
+ if (s->data) {
+ nasm_error(ERR_WARNING, "uninitialised space declared in"
+ " non-BSS section `%s': zeroing", s->name);
+ coff_sect_write(s, NULL, size);
+ } else
+ s->len += size;
+ } else if (type == OUT_RAWDATA) {
+ coff_sect_write(s, data, size);
+ } else if (type == OUT_ADDRESS) {
+ int asize = abs((int)size);
+ if (!win64) {
+ if (asize != 4 && (segment != NO_SEG || wrt != NO_SEG)) {
+ nasm_error(ERR_NONFATAL, "COFF format does not support non-32-bit"
+ " relocations");
+ } else {
+ int32_t fix = 0;
+ if (segment != NO_SEG || wrt != NO_SEG) {
+ if (wrt != NO_SEG) {
+ nasm_error(ERR_NONFATAL, "COFF format does not support"
+ " WRT types");
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "COFF format does not support"
+ " segment base references");
+ } else
+ fix = coff_add_reloc(s, segment, IMAGE_REL_I386_DIR32);
+ }
+ p = mydata;
+ WRITELONG(p, *(int64_t *)data + fix);
+ coff_sect_write(s, mydata, asize);
+ }
+ } else {
+ int32_t fix = 0;
+ p = mydata;
+ if (asize == 8) {
+ if (wrt == imagebase_sect) {
+ nasm_error(ERR_NONFATAL, "operand size mismatch: 'wrt "
+ WRT_IMAGEBASE "' is a 32-bit operand");
+ }
+ fix = coff_add_reloc(s, segment, IMAGE_REL_AMD64_ADDR64);
+ WRITEDLONG(p, *(int64_t *)data + fix);
+ coff_sect_write(s, mydata, asize);
+ } else {
+ fix = coff_add_reloc(s, segment,
+ wrt == imagebase_sect ? IMAGE_REL_AMD64_ADDR32NB:
+ IMAGE_REL_AMD64_ADDR32);
+ WRITELONG(p, *(int64_t *)data + fix);
+ coff_sect_write(s, mydata, asize);
+ }
+ }
+ } else if (type == OUT_REL2ADR) {
+ nasm_error(ERR_NONFATAL, "COFF format does not support 16-bit"
+ " relocations");
+ } else if (type == OUT_REL4ADR) {
+ if (segment == segto && !(win64)) /* Acceptable for RIP-relative */
+ nasm_panic("intra-segment OUT_REL4ADR");
+ else if (segment == NO_SEG && win32)
+ nasm_error(ERR_NONFATAL, "Win32 COFF does not correctly support"
+ " relative references to absolute addresses");
+ else {
+ int32_t fix = 0;
+ if (segment != NO_SEG && segment % 2) {
+ nasm_error(ERR_NONFATAL, "COFF format does not support"
+ " segment base references");
+ } else
+ fix = coff_add_reloc(s, segment,
+ win64 ? IMAGE_REL_AMD64_REL32 : IMAGE_REL_I386_REL32);
+ p = mydata;
+ if (win32 | win64) {
+ WRITELONG(p, *(int64_t *)data + 4 - size + fix);
+ } else {
+ WRITELONG(p, *(int64_t *)data - (size + s->len) + fix);
+ }
+ coff_sect_write(s, mydata, 4L);
+ }
+
+ }
+}
+
+static void coff_sect_write(struct coff_Section *sect,
+ const uint8_t *data, uint32_t len)
+{
+ saa_wbytes(sect->data, data, len);
+ sect->len += len;
+}
+
+typedef struct tagString {
+ struct tagString *next;
+ int len;
+ char *String;
+} STRING;
+
+#define EXPORT_SECTION_NAME ".drectve"
+#define EXPORT_SECTION_FLAGS INFO_FLAGS
+/*
+ * #define EXPORT_SECTION_NAME ".text"
+ * #define EXPORT_SECTION_FLAGS TEXT_FLAGS
+ */
+
+static STRING *Exports = NULL;
+static struct coff_Section *directive_sec;
+static void AddExport(char *name)
+{
+ STRING *rvp = Exports, *newS;
+
+ newS = (STRING *) nasm_malloc(sizeof(STRING));
+ newS->len = strlen(name);
+ newS->next = NULL;
+ newS->String = (char *)nasm_malloc(newS->len + 1);
+ strcpy(newS->String, name);
+ if (rvp == NULL) {
+ int i;
+
+ for (i = 0; i < coff_nsects; i++) {
+ if (!strcmp(EXPORT_SECTION_NAME, coff_sects[i]->name))
+ break;
+ }
+
+ if (i == coff_nsects)
+ i = coff_make_section(EXPORT_SECTION_NAME, EXPORT_SECTION_FLAGS);
+
+ directive_sec = coff_sects[i];
+ Exports = newS;
+ } else {
+ while (rvp->next) {
+ if (!strcmp(rvp->String, name))
+ return;
+ rvp = rvp->next;
+ }
+ rvp->next = newS;
+ }
+}
+
+static void BuildExportTable(STRING **rvp)
+{
+ STRING *p, *t;
+
+ if (!rvp || !*rvp)
+ return;
+
+ list_for_each_safe(p, t, *rvp) {
+ coff_sect_write(directive_sec, (uint8_t *)"-export:", 8);
+ coff_sect_write(directive_sec, (uint8_t *)p->String, p->len);
+ coff_sect_write(directive_sec, (uint8_t *)" ", 1);
+ nasm_free(p->String);
+ nasm_free(p);
+ }
+
+ *rvp = NULL;
+}
+
+static enum directive_result
+coff_directives(enum directive directive, char *value, int pass)
+{
+ switch (directive) {
+ case D_EXPORT:
+ {
+ char *q, *name;
+
+ if (pass == 2)
+ return DIRR_OK; /* ignore in pass two */
+ name = q = value;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+
+ if (!*name) {
+ nasm_error(ERR_NONFATAL, "`export' directive requires export name");
+ return DIRR_ERROR;
+ }
+ if (*q) {
+ nasm_error(ERR_NONFATAL, "unrecognized export qualifier `%s'", q);
+ return DIRR_ERROR;
+ }
+ AddExport(name);
+ return DIRR_OK;
+ }
+ case D_SAFESEH:
+ {
+ static int sxseg=-1;
+ int i;
+
+ if (!win32) /* Only applicable for -f win32 */
+ return 0;
+
+ if (sxseg == -1) {
+ for (i = 0; i < coff_nsects; i++)
+ if (!strcmp(".sxdata",coff_sects[i]->name))
+ break;
+ if (i == coff_nsects)
+ sxseg = coff_make_section(".sxdata", IMAGE_SCN_LNK_INFO);
+ else
+ sxseg = i;
+ }
+ /*
+ * pass0 == 2 is the only time when the full set of symbols are
+ * guaranteed to be present; it is the final output pass.
+ */
+ if (pass0 == 2) {
+ uint32_t n;
+ saa_rewind(coff_syms);
+ for (n = 0; n < coff_nsyms; n++) {
+ struct coff_Symbol *sym = saa_rstruct(coff_syms);
+ bool equals;
+
+ /*
+ * sym->strpos is biased by 4, because symbol
+ * table is prefixed with table length
+ */
+ if (sym->strpos >=4) {
+ char *name = nasm_malloc(sym->namlen+1);
+ saa_fread(coff_strs, sym->strpos-4, name, sym->namlen);
+ name[sym->namlen] = '\0';
+ equals = !strcmp(value,name);
+ nasm_free(name);
+ } else {
+ equals = !strcmp(value,sym->name);
+ }
+
+ if (equals) {
+ /*
+ * this value arithmetics effectively reflects
+ * initsym in coff_write(): 2 for file, 1 for
+ * .absolute and two per each section
+ */
+ unsigned char value[4],*p=value;
+ WRITELONG(p,n + 2 + 1 + coff_nsects*2);
+ coff_sect_write(coff_sects[sxseg],value,4);
+ sym->type = 0x20;
+ break;
+ }
+ }
+ if (n == coff_nsyms) {
+ nasm_error(ERR_NONFATAL,
+ "`safeseh' directive requires valid symbol");
+ return DIRR_ERROR;
+ }
+ }
+ return DIRR_OK;
+ }
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+/* handle relocations storm, valid for win32/64 only */
+static inline void coff_adjust_relocs(struct coff_Section *s)
+{
+ if (s->nrelocs < IMAGE_SCN_MAX_RELOC)
+ return;
+#ifdef OF_COFF
+ else
+ {
+ if (ofmt == &of_coff)
+ nasm_fatal("Too many relocations (%d) for section `%s'",
+ s->nrelocs, s->name);
+ }
+#endif
+
+ s->flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
+ s->nrelocs++;
+}
+
+static void coff_write(void)
+{
+ int32_t pos, sympos, vsize;
+ int i;
+
+ /* fill in the .drectve section with -export's */
+ BuildExportTable(&Exports);
+
+ if (win32) {
+ /* add default value for @feat.00, this allows to 'link /safeseh' */
+ uint32_t n;
+
+ saa_rewind(coff_syms);
+ for (n = 0; n < coff_nsyms; n++) {
+ struct coff_Symbol *sym = saa_rstruct(coff_syms);
+ if (sym->strpos == -1 && !strcmp("@feat.00",sym->name))
+ break;
+ }
+ if (n == coff_nsyms)
+ coff_deflabel("@feat.00", NO_SEG, 1, 0, NULL);
+ }
+
+ /*
+ * Work out how big the file will get.
+ * Calculate the start of the `real' symbols at the same time.
+ * Check for massive relocations.
+ */
+ pos = 0x14 + 0x28 * coff_nsects;
+ initsym = 3; /* two for the file, one absolute */
+ for (i = 0; i < coff_nsects; i++) {
+ if (coff_sects[i]->data) {
+ coff_adjust_relocs(coff_sects[i]);
+ coff_sects[i]->pos = pos;
+ pos += coff_sects[i]->len;
+ coff_sects[i]->relpos = pos;
+ pos += 10 * coff_sects[i]->nrelocs;
+ } else
+ coff_sects[i]->pos = coff_sects[i]->relpos = 0L;
+ initsym += 2; /* two for each section */
+ }
+ sympos = pos;
+
+ /*
+ * Output the COFF header.
+ */
+ if (win64)
+ i = IMAGE_FILE_MACHINE_AMD64;
+ else
+ i = IMAGE_FILE_MACHINE_I386;
+ fwriteint16_t(i, ofile); /* machine type */
+ fwriteint16_t(coff_nsects, ofile); /* number of sections */
+ // Chromium patch: Builds should be deterministic and not embed timestamps.
+ fwriteint32_t(0, ofile); /* time stamp */
+ fwriteint32_t(sympos, ofile);
+ fwriteint32_t(coff_nsyms + initsym, ofile);
+ fwriteint16_t(0, ofile); /* no optional header */
+ /* Flags: 32-bit, no line numbers. Win32 doesn't even bother with them. */
+ fwriteint16_t((win32 | win64) ? 0 : 0x104, ofile);
+
+ /*
+ * Output the section headers.
+ */
+ vsize = 0L;
+ for (i = 0; i < coff_nsects; i++) {
+ coff_section_header(coff_sects[i]->name, coff_sects[i]->namepos, vsize, coff_sects[i]->len,
+ coff_sects[i]->pos, coff_sects[i]->relpos,
+ coff_sects[i]->nrelocs, coff_sects[i]->flags);
+ vsize += coff_sects[i]->len;
+ }
+
+ /*
+ * Output the sections and their relocations.
+ */
+ for (i = 0; i < coff_nsects; i++)
+ if (coff_sects[i]->data) {
+ saa_fpwrite(coff_sects[i]->data, ofile);
+ coff_write_relocs(coff_sects[i]);
+ }
+
+ /*
+ * Output the symbol and string tables.
+ */
+ coff_write_symbols();
+ fwriteint32_t(strslen + 4, ofile); /* length includes length count */
+ saa_fpwrite(coff_strs, ofile);
+}
+
+static void coff_section_header(char *name, int32_t namepos, int32_t vsize,
+ int32_t datalen, int32_t datapos,
+ int32_t relpos, int nrelocs, int32_t flags)
+{
+ char padname[8];
+
+ (void)vsize;
+
+ if (namepos == -1) {
+ strncpy(padname, name, 8);
+ nasm_write(padname, 8, ofile);
+ } else {
+ /*
+ * If name is longer than 8 bytes, write '/' followed
+ * by offset into the strings table represented as
+ * decimal number.
+ */
+ namepos = namepos % 100000000;
+ padname[0] = '/';
+ padname[1] = '0' + (namepos / 1000000);
+ namepos = namepos % 1000000;
+ padname[2] = '0' + (namepos / 100000);
+ namepos = namepos % 100000;
+ padname[3] = '0' + (namepos / 10000);
+ namepos = namepos % 10000;
+ padname[4] = '0' + (namepos / 1000);
+ namepos = namepos % 1000;
+ padname[5] = '0' + (namepos / 100);
+ namepos = namepos % 100;
+ padname[6] = '0' + (namepos / 10);
+ namepos = namepos % 10;
+ padname[7] = '0' + (namepos);
+ nasm_write(padname, 8, ofile);
+ }
+
+ fwriteint32_t(0, ofile); /* Virtual size field - set to 0 or vsize */
+ fwriteint32_t(0L, ofile); /* RVA/offset - we ignore */
+ fwriteint32_t(datalen, ofile);
+ fwriteint32_t(datapos, ofile);
+ fwriteint32_t(relpos, ofile);
+ fwriteint32_t(0L, ofile); /* no line numbers - we don't do 'em */
+
+ /*
+ * a special case -- if there are too many relocs
+ * we have to put IMAGE_SCN_MAX_RELOC here and write
+ * the real relocs number into VirtualAddress of first
+ * relocation
+ */
+ if (flags & IMAGE_SCN_LNK_NRELOC_OVFL)
+ fwriteint16_t(IMAGE_SCN_MAX_RELOC, ofile);
+ else
+ fwriteint16_t(nrelocs, ofile);
+
+ fwriteint16_t(0, ofile); /* again, no line numbers */
+ fwriteint32_t(flags, ofile);
+}
+
+static void coff_write_relocs(struct coff_Section *s)
+{
+ struct coff_Reloc *r;
+
+ /* a real number of relocations if needed */
+ if (s->flags & IMAGE_SCN_LNK_NRELOC_OVFL) {
+ fwriteint32_t(s->nrelocs, ofile);
+ fwriteint32_t(0, ofile);
+ fwriteint16_t(0, ofile);
+ }
+
+ for (r = s->head; r; r = r->next) {
+ fwriteint32_t(r->address, ofile);
+ fwriteint32_t(r->symbol + (r->symbase == REAL_SYMBOLS ? initsym :
+ r->symbase == ABS_SYMBOL ? initsym - 1 :
+ r->symbase == SECT_SYMBOLS ? 2 : 0),
+ ofile);
+ fwriteint16_t(r->type, ofile);
+ }
+}
+
+static void coff_symbol(char *name, int32_t strpos, int32_t value,
+ int section, int type, int storageclass, int aux)
+{
+ char padname[8];
+
+ if (name) {
+ strncpy(padname, name, 8);
+ nasm_write(padname, 8, ofile);
+ } else {
+ fwriteint32_t(0, ofile);
+ fwriteint32_t(strpos, ofile);
+ }
+
+ fwriteint32_t(value, ofile);
+ fwriteint16_t(section, ofile);
+ fwriteint16_t(type, ofile);
+
+ fputc(storageclass, ofile);
+ fputc(aux, ofile);
+}
+
+static void coff_write_symbols(void)
+{
+ char filename[18];
+ uint32_t i;
+
+ /*
+ * The `.file' record, and the file name auxiliary record.
+ */
+ coff_symbol(".file", 0L, 0L, -2, 0, 0x67, 1);
+ strncpy(filename, inname, 18);
+ nasm_write(filename, 18, ofile);
+
+ /*
+ * The section records, with their auxiliaries.
+ */
+ memset(filename, 0, 18); /* useful zeroed buffer */
+
+ for (i = 0; i < (uint32_t) coff_nsects; i++) {
+ coff_symbol(coff_sects[i]->name, 0L, 0L, i + 1, 0, 3, 1);
+ fwriteint32_t(coff_sects[i]->len, ofile);
+ fwriteint16_t(coff_sects[i]->nrelocs,ofile);
+ nasm_write(filename, 12, ofile);
+ }
+
+ /*
+ * The absolute symbol, for relative-to-absolute relocations.
+ */
+ coff_symbol(".absolut", 0L, 0L, -1, 0, 3, 0);
+
+ /*
+ * The real symbols.
+ */
+ saa_rewind(coff_syms);
+ for (i = 0; i < coff_nsyms; i++) {
+ struct coff_Symbol *sym = saa_rstruct(coff_syms);
+ coff_symbol(sym->strpos == -1 ? sym->name : NULL,
+ sym->strpos, sym->value, sym->section,
+ sym->type, sym->is_global ? 2 : 3, 0);
+ }
+}
+
+static void coff_sectalign(int32_t seg, unsigned int value)
+{
+ struct coff_Section *s = NULL;
+ uint32_t align;
+ int i;
+
+ for (i = 0; i < coff_nsects; i++) {
+ if (coff_sects[i]->index == seg) {
+ s = coff_sects[i];
+ break;
+ }
+ }
+
+ if (!s || !is_power2(value))
+ return;
+
+ /* DOS has limitation on 64 bytes */
+ if (!(win32 | win64) && value > 64)
+ return;
+
+ align = (s->flags & IMAGE_SCN_ALIGN_MASK);
+ value = coff_sectalign_flags(value);
+ if (value > align)
+ s->flags = (s->flags & ~IMAGE_SCN_ALIGN_MASK) | value;
+}
+
+extern macros_t coff_stdmac[];
+
+#endif /* defined(OF_COFF) || defined(OF_WIN32) */
+
+#ifdef OF_COFF
+
+const struct ofmt of_coff = {
+ "COFF (i386) object files (e.g. DJGPP for DOS)",
+ "coff",
+ ".o",
+ 0,
+ 32,
+ null_debug_arr,
+ &null_debug_form,
+ coff_stdmac,
+ coff_std_init,
+ null_reset,
+ nasm_do_legacy_output,
+ coff_out,
+ coff_deflabel,
+ coff_section_names,
+ NULL,
+ coff_sectalign,
+ null_segbase,
+ coff_directives,
+ coff_cleanup,
+ NULL /* pragma list */
+};
+
+#endif
+
+extern const struct dfmt df_cv8;
+
+#ifdef OF_WIN32
+
+static const struct dfmt * const win32_debug_arr[2] = { &df_cv8, NULL };
+
+const struct ofmt of_win32 = {
+ "Microsoft Win32 (i386) object files",
+ "win32",
+ ".obj",
+ 0,
+ 32,
+ win32_debug_arr,
+ &df_cv8,
+ coff_stdmac,
+ coff_win32_init,
+ null_reset,
+ nasm_do_legacy_output,
+ coff_out,
+ coff_deflabel,
+ coff_section_names,
+ NULL,
+ coff_sectalign,
+ null_segbase,
+ coff_directives,
+ coff_cleanup,
+ NULL /* pragma list */
+};
+
+#endif
+
+#ifdef OF_WIN64
+
+static const struct dfmt * const win64_debug_arr[2] = { &df_cv8, NULL };
+
+const struct ofmt of_win64 = {
+ "Microsoft Win64 (x86-64) object files",
+ "win64",
+ ".obj",
+ 0,
+ 64,
+ win64_debug_arr,
+ &df_cv8,
+ coff_stdmac,
+ coff_win64_init,
+ null_reset,
+ nasm_do_legacy_output,
+ coff_out,
+ coff_deflabel,
+ coff_section_names,
+ NULL,
+ coff_sectalign,
+ null_segbase,
+ coff_directives,
+ coff_cleanup,
+ NULL /* pragma list */
+};
+
+#endif
diff --git a/output/outcoff.mac b/output/outcoff.mac
new file mode 100644
index 00000000..2b8b12ff
--- /dev/null
+++ b/output/outcoff.mac
@@ -0,0 +1,43 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: coff win32 win64
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
+%imacro export 1+.nolist
+[export %1]
+%endmacro
+%imacro safeseh 1.nolist
+[safeseh %1]
+%endmacro
diff --git a/output/outdbg.c b/output/outdbg.c
new file mode 100644
index 00000000..a318f921
--- /dev/null
+++ b/output/outdbg.c
@@ -0,0 +1,488 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outdbg.c output routines for the Netwide Assembler to produce
+ * a debugging trace
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+#include "outlib.h"
+#include "insns.h"
+
+#ifdef OF_DBG
+
+struct Section {
+ struct Section *next;
+ int32_t number;
+ char *name;
+} *dbgsect;
+
+static unsigned long dbg_max_data_dump = 128;
+static bool section_labels = true;
+static bool subsections_via_symbols = false;
+static int32_t init_seg;
+
+const struct ofmt of_dbg;
+static void dbg_init(void)
+{
+ dbgsect = NULL;
+ fprintf(ofile, "NASM Output format debug dump\n");
+ fprintf(ofile, "input file = %s\n", inname);
+ fprintf(ofile, "output file = %s\n", outname);
+ init_seg = seg_alloc();
+}
+
+static void dbg_reset(void)
+{
+ fprintf(ofile, "*** pass reset: pass0 = %d, passn = %"PRId64"\n",
+ pass0, passn);
+}
+
+static void dbg_cleanup(void)
+{
+ dfmt->cleanup();
+ while (dbgsect) {
+ struct Section *tmp = dbgsect;
+ dbgsect = dbgsect->next;
+ nasm_free(tmp->name);
+ nasm_free(tmp);
+ }
+}
+
+static int32_t dbg_add_section(char *name, int pass, int *bits,
+ const char *whatwecallit)
+{
+ int seg;
+
+ /*
+ * We must have an initial default: let's make it 16.
+ */
+ if (!name)
+ *bits = 16;
+
+ if (!name) {
+ fprintf(ofile, "section_name on init: returning %d\n", init_seg);
+ seg = init_seg;
+ } else {
+ int n = strcspn(name, " \t");
+ char *sname = nasm_strndup(name, n);
+ char *tail = nasm_skip_spaces(name+n);
+ struct Section *s;
+
+ seg = NO_SEG;
+ for (s = dbgsect; s; s = s->next)
+ if (!strcmp(s->name, sname))
+ seg = s->number;
+
+ if (seg == NO_SEG) {
+ s = nasm_malloc(sizeof(*s));
+ s->name = sname;
+ s->number = seg = seg_alloc();
+ s->next = dbgsect;
+ dbgsect = s;
+ fprintf(ofile, "%s %s (%s) pass %d: returning %d\n",
+ whatwecallit, name, tail, pass, seg);
+
+ if (section_labels)
+ backend_label(s->name, s->number + 1, 0);
+ }
+ }
+ return seg;
+}
+
+static int32_t dbg_section_names(char *name, int pass, int *bits)
+{
+ return dbg_add_section(name, pass, bits, "section_names");
+}
+
+static int32_t dbg_herelabel(const char *name, enum label_type type,
+ int32_t oldseg, int32_t *subsection,
+ bool *copyoffset)
+{
+ int32_t newseg = oldseg;
+
+ if (subsections_via_symbols && type != LBL_LOCAL) {
+ newseg = *subsection;
+ if (newseg == NO_SEG) {
+ newseg = *subsection = seg_alloc();
+ *copyoffset = true; /* Minic MachO for now */
+ }
+ }
+ fprintf(ofile, "herelabel %s type %d (seg %08x) -> %08x\n",
+ name, type, oldseg, newseg);
+
+ return newseg;
+}
+
+static void dbg_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ fprintf(ofile, "deflabel %s := %08"PRIx32":%016"PRIx64" %s (%d)%s%s\n",
+ name, segment, offset,
+ is_global == 2 ? "common" : is_global ? "global" : "local",
+ is_global, special ? ": " : "", special);
+}
+
+static const char *out_type(enum out_type type)
+{
+ static const char *out_types[] = {
+ "rawdata",
+ "reserve",
+ "zerodata",
+ "address",
+ "reladdr",
+ "segment"
+ };
+ static char invalid_buf[64];
+
+ if (type >= sizeof(out_types)/sizeof(out_types[0])) {
+ sprintf(invalid_buf, "[invalid type %d]", type);
+ return invalid_buf;
+ }
+
+ return out_types[type];
+}
+
+static const char *out_sign(enum out_sign sign)
+{
+ static const char *out_signs[] = {
+ "wrap",
+ "signed",
+ "unsigned"
+ };
+ static char invalid_buf[64];
+
+ if (sign >= sizeof(out_signs)/sizeof(out_signs[0])) {
+ sprintf(invalid_buf, "[invalid sign %d]", sign);
+ return invalid_buf;
+ }
+
+ return out_signs[sign];
+}
+
+static void dbg_out(const struct out_data *data)
+{
+ fprintf(ofile,
+ "out to %"PRIx32":%"PRIx64" %s %s bits %d insoffs %d/%d "
+ "size %"PRIu64,
+ data->segment, data->offset,
+ out_type(data->type), out_sign(data->sign),
+ data->bits, data->insoffs, data->inslen, data->size);
+ if (data->itemp) {
+ fprintf(ofile, " ins %s(%d)",
+ nasm_insn_names[data->itemp->opcode], data->itemp->operands);
+ } else {
+ fprintf(ofile, " no ins (plain data)");
+ }
+
+ if (data->type == OUT_ADDRESS || data->type == OUT_RELADDR ||
+ data->type == OUT_SEGMENT) {
+ fprintf(ofile, " target %"PRIx32":%"PRIx64,
+ data->tsegment, data->toffset);
+ if (data->twrt != NO_SEG)
+ fprintf(ofile, " wrt %"PRIx32, data->twrt);
+ }
+ if (data->type == OUT_RELADDR)
+ fprintf(ofile, " relbase %"PRIx64, data->relbase);
+
+ putc('\n', ofile);
+
+ if (data->type == OUT_RAWDATA) {
+ if ((size_t)data->size != data->size) {
+ fprintf(ofile, " data: <error: impossible size>\n");
+ } else if (!data->data) {
+ fprintf(ofile, " data: <error: null pointer>\n");
+ } else if (dbg_max_data_dump != -1UL &&
+ data->size > dbg_max_data_dump) {
+ fprintf(ofile, " data: <%"PRIu64" bytes>\n", data->size);
+ } else {
+ size_t i, j;
+ const uint8_t *bytes = data->data;
+ for (i = 0; i < data->size; i += 16) {
+ fprintf(ofile, " data:");
+ for (j = 0; j < 16; j++) {
+ if (i+j >= data->size)
+ fprintf(ofile, " ");
+ else
+ fprintf(ofile, "%c%02x",
+ (j == 8) ? '-' : ' ', bytes[i+j]);
+ }
+ fprintf(ofile," ");
+ for (j = 0; j < 16; j++) {
+ if (i+j >= data->size) {
+ putc(' ', ofile);
+ } else {
+ if (bytes[i+j] >= 32 && bytes[i+j] <= 126)
+ putc(bytes[i+j], ofile);
+ else
+ putc('.', ofile);
+ }
+ }
+ putc('\n', ofile);
+ }
+ }
+ }
+
+ /* This is probably the only place were we'll call this this way... */
+ nasm_do_legacy_output(data);
+}
+
+static void dbg_legacy_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ int32_t ldata;
+
+ if (type == OUT_ADDRESS)
+ fprintf(ofile, " legacy: out to %"PRIx32", len = %d: ",
+ segto, (int)abs((int)size));
+ else
+ fprintf(ofile, " legacy: out to %"PRIx32", len = %"PRId64" (0x%"PRIx64"): ",
+ segto, (int64_t)size, size);
+
+ switch (type) {
+ case OUT_RESERVE:
+ fprintf(ofile, "reserved.\n");
+ break;
+ case OUT_RAWDATA:
+ fprintf(ofile, "rawdata\n"); /* Already have a data dump */
+ break;
+ case OUT_ADDRESS:
+ ldata = *(int64_t *)data;
+ fprintf(ofile, "addr %08"PRIx32" (seg %08"PRIx32", wrt %08"PRIx32")\n",
+ ldata, segment, wrt);
+ break;
+ case OUT_REL1ADR:
+ fprintf(ofile, "rel1adr %02"PRIx8" (seg %08"PRIx32")\n",
+ (uint8_t)*(int64_t *)data, segment);
+ break;
+ case OUT_REL2ADR:
+ fprintf(ofile, "rel2adr %04"PRIx16" (seg %08"PRIx32")\n",
+ (uint16_t)*(int64_t *)data, segment);
+ break;
+ case OUT_REL4ADR:
+ fprintf(ofile, "rel4adr %08"PRIx32" (seg %08"PRIx32")\n",
+ (uint32_t)*(int64_t *)data,
+ segment);
+ break;
+ case OUT_REL8ADR:
+ fprintf(ofile, "rel8adr %016"PRIx64" (seg %08"PRIx32")\n",
+ (uint64_t)*(int64_t *)data, segment);
+ break;
+ default:
+ fprintf(ofile, "unknown\n");
+ break;
+ }
+}
+
+static void dbg_sectalign(int32_t seg, unsigned int value)
+{
+ fprintf(ofile, "set alignment (%d) for segment (%u)\n",
+ seg, value);
+}
+
+static enum directive_result
+dbg_directive(enum directive directive, char *value, int pass)
+{
+ switch (directive) {
+ /*
+ * The .obj GROUP directive is nontrivial to emulate in a macro.
+ * It effectively creates a "pseudo-section" containing the first
+ * space-separated argument; the rest we ignore.
+ */
+ case D_GROUP:
+ {
+ int dummy;
+ dbg_add_section(value, pass, &dummy, "directive:group");
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ fprintf(ofile, "directive [%s] value [%s] (pass %d)\n",
+ directive_dname(directive), value, pass);
+ return DIRR_OK;
+}
+
+static enum directive_result
+dbg_pragma(const struct pragma *pragma);
+
+static const struct pragma_facility dbg_pragma_list[] = {
+ { NULL, dbg_pragma }
+};
+
+static enum directive_result
+dbg_pragma(const struct pragma *pragma)
+{
+ fprintf(ofile, "pragma %s(%s) %s[%s] %s\n",
+ pragma->facility_name,
+ pragma->facility->name ? pragma->facility->name : "<default>",
+ pragma->opname, directive_dname(pragma->opcode),
+ pragma->tail);
+
+ if (pragma->facility == &dbg_pragma_list[0]) {
+ switch (pragma->opcode) {
+ case D_MAXDUMP:
+ if (!nasm_stricmp(pragma->tail, "unlimited")) {
+ dbg_max_data_dump = -1UL;
+ } else {
+ char *ep;
+ unsigned long arg;
+
+ errno = 0;
+ arg = strtoul(pragma->tail, &ep, 0);
+ if (errno || *nasm_skip_spaces(ep)) {
+ nasm_error(ERR_WARNING | ERR_WARN_BAD_PRAGMA | ERR_PASS2,
+ "invalid %%pragma dbg maxdump argument");
+ return DIRR_ERROR;
+ } else {
+ dbg_max_data_dump = arg;
+ }
+ }
+ break;
+ case D_NOSECLABELS:
+ section_labels = false;
+ break;
+ case D_SUBSECTIONS_VIA_SYMBOLS:
+ subsections_via_symbols = true;
+ break;
+ default:
+ break;
+ }
+ }
+ return DIRR_OK;
+}
+
+static const char * const types[] = {
+ "unknown", "label", "byte", "word", "dword", "float", "qword", "tbyte"
+};
+static void dbgdbg_init(void)
+{
+ fprintf(ofile, " With debug info\n");
+}
+static void dbgdbg_cleanup(void)
+{
+}
+
+static void dbgdbg_linnum(const char *lnfname, int32_t lineno, int32_t segto)
+{
+ fprintf(ofile, "dbglinenum %s(%"PRId32") segment %"PRIx32"\n",
+ lnfname, lineno, segto);
+}
+static void dbgdbg_deflabel(char *name, int32_t segment,
+ int64_t offset, int is_global, char *special)
+{
+ fprintf(ofile, "dbglabel %s := %08"PRIx32":%016"PRIx64" %s (%d)%s%s\n",
+ name,
+ segment, offset,
+ is_global == 2 ? "common" : is_global ? "global" : "local",
+ is_global, special ? ": " : "", special);
+}
+static void dbgdbg_define(const char *type, const char *params)
+{
+ fprintf(ofile, "dbgdirective [%s] value [%s]\n", type, params);
+}
+static void dbgdbg_output(int output_type, void *param)
+{
+ (void)output_type;
+ (void)param;
+}
+static void dbgdbg_typevalue(int32_t type)
+{
+ fprintf(ofile, "new type: %s(%"PRIX32")\n",
+ types[TYM_TYPE(type) >> 3], TYM_ELEMENTS(type));
+}
+
+static const struct pragma_facility dbgdbg_pragma_list[] = {
+ { "dbgdbg", dbg_pragma },
+ { NULL, dbg_pragma } /* Won't trigger, "debug" is a reserved ns */
+};
+
+static const struct dfmt debug_debug_form = {
+ "Trace of all info passed to debug stage",
+ "debug",
+ dbgdbg_init,
+ dbgdbg_linnum,
+ dbgdbg_deflabel,
+ dbgdbg_define,
+ dbgdbg_typevalue,
+ dbgdbg_output,
+ dbgdbg_cleanup,
+ dbgdbg_pragma_list
+};
+
+static const struct dfmt * const debug_debug_arr[3] = {
+ &debug_debug_form,
+ &null_debug_form,
+ NULL
+};
+
+extern macros_t dbg_stdmac[];
+
+const struct ofmt of_dbg = {
+ "Trace of all info passed to output stage",
+ "dbg",
+ ".dbg",
+ OFMT_TEXT,
+ 64,
+ debug_debug_arr,
+ &debug_debug_form,
+ dbg_stdmac,
+ dbg_init,
+ dbg_reset,
+ dbg_out,
+ dbg_legacy_out,
+ dbg_deflabel,
+ dbg_section_names,
+ dbg_herelabel,
+ dbg_sectalign,
+ null_segbase,
+ dbg_directive,
+ dbg_cleanup,
+ dbg_pragma_list
+};
+
+#endif /* OF_DBG */
diff --git a/output/outdbg.mac b/output/outdbg.mac
new file mode 100644
index 00000000..4f68d63c
--- /dev/null
+++ b/output/outdbg.mac
@@ -0,0 +1,53 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;
+; Define a few macros which lets the dbg format process files intended
+; for the .obj format.
+;
+OUT: dbg
+%define __SECT__ [section .text]
+%imacro group 1+.nolist
+[group %1]
+%endmacro
+%imacro uppercase 0+.nolist
+ %pragma dbg uppercase %1
+%endmacro
+%imacro export 1+.nolist
+ %pragma dbg export %1
+%endmacro
+%imacro import 1+.nolist
+ %pragma dbg import %1
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outelf.c b/output/outelf.c
new file mode 100644
index 00000000..d8a55416
--- /dev/null
+++ b/output/outelf.c
@@ -0,0 +1,3358 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Common code for outelf32 and outelf64
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "stdscan.h"
+#include "eval.h"
+#include "outform.h"
+#include "outlib.h"
+#include "rbtree.h"
+#include "ver.h"
+
+#include "dwarf.h"
+#include "stabs.h"
+#include "outelf.h"
+#include "elf.h"
+
+#if defined(OF_ELF32) || defined(OF_ELF64) || defined(OF_ELFX32)
+
+#define SECT_DELTA 32
+static struct elf_section **sects;
+static int nsects, sectlen;
+
+#define SHSTR_DELTA 256
+static char *shstrtab;
+static int shstrtablen, shstrtabsize;
+
+static struct SAA *syms;
+static uint32_t nlocals, nglobs, ndebugs; /* Symbol counts */
+
+static int32_t def_seg;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static uint32_t strslen;
+
+static struct elf_symbol *fwds;
+
+static char elf_module[FILENAME_MAX];
+
+extern const struct ofmt of_elf32;
+extern const struct ofmt of_elf64;
+extern const struct ofmt of_elfx32;
+
+static struct ELF_SECTDATA {
+ void *data;
+ int64_t len;
+ bool is_saa;
+} *elf_sects;
+
+static int elf_nsect, nsections;
+static int64_t elf_foffs;
+
+static void elf_write(void);
+static void elf_sect_write(struct elf_section *, const void *, size_t);
+static void elf_sect_writeaddr(struct elf_section *, int64_t, size_t);
+static void elf_section_header(int, int, uint64_t, void *, bool, uint64_t, int, int,
+ int, int);
+static void elf_write_sections(void);
+static struct SAA *elf_build_symtab(int32_t *, int32_t *);
+static struct SAA *elf_build_reltab(uint64_t *, struct elf_reloc *);
+static void add_sectname(const char *, const char *);
+
+struct erel {
+ int offset;
+ int info;
+};
+
+struct symlininfo {
+ int offset;
+ int section; /* index into sects[] */
+ int segto; /* internal section number */
+ char *name; /* shallow-copied pointer of section name */
+};
+
+struct linelist {
+ struct linelist *next;
+ struct linelist *last;
+ struct symlininfo info;
+ char *filename;
+ int line;
+};
+
+struct sectlist {
+ struct SAA *psaa;
+ int section;
+ int line;
+ int offset;
+ int file;
+ struct sectlist *next;
+ struct sectlist *last;
+};
+
+/* common debug variables */
+static int currentline = 1;
+static int debug_immcall = 0;
+
+/* stabs debug variables */
+static struct linelist *stabslines = 0;
+static int numlinestabs = 0;
+static char *stabs_filename = 0;
+static uint8_t *stabbuf = 0, *stabstrbuf = 0, *stabrelbuf = 0;
+static int stablen, stabstrlen, stabrellen;
+
+/* dwarf debug variables */
+static struct linelist *dwarf_flist = 0, *dwarf_clist = 0, *dwarf_elist = 0;
+static struct sectlist *dwarf_fsect = 0, *dwarf_csect = 0, *dwarf_esect = 0;
+static int dwarf_numfiles = 0, dwarf_nsections;
+static uint8_t *arangesbuf = 0, *arangesrelbuf = 0, *pubnamesbuf = 0, *infobuf = 0, *inforelbuf = 0,
+ *abbrevbuf = 0, *linebuf = 0, *linerelbuf = 0, *framebuf = 0, *locbuf = 0;
+static int8_t line_base = -5, line_range = 14, opcode_base = 13;
+static int arangeslen, arangesrellen, pubnameslen, infolen, inforellen,
+ abbrevlen, linelen, linerellen, framelen, loclen;
+static int64_t dwarf_infosym, dwarf_abbrevsym, dwarf_linesym;
+
+static struct elf_symbol *lastsym;
+
+/* common debugging routines */
+static void debug_typevalue(int32_t);
+
+/* stabs debugging routines */
+static void stabs_linenum(const char *filename, int32_t linenumber, int32_t);
+static void stabs_output(int, void *);
+static void stabs_generate(void);
+static void stabs_cleanup(void);
+
+/* dwarf debugging routines */
+static void dwarf_init(void);
+static void dwarf_linenum(const char *filename, int32_t linenumber, int32_t);
+static void dwarf_output(int, void *);
+static void dwarf_generate(void);
+static void dwarf_cleanup(void);
+static void dwarf_findfile(const char *);
+static void dwarf_findsect(const int);
+
+static bool is_elf64(void);
+static bool is_elf32(void);
+static bool is_elfx32(void);
+
+static bool dfmt_is_stabs(void);
+static bool dfmt_is_dwarf(void);
+
+/*
+ * Special NASM section numbers which are used to define ELF special
+ * symbols.
+ */
+static int32_t elf_gotpc_sect, elf_gotoff_sect;
+static int32_t elf_got_sect, elf_plt_sect;
+static int32_t elf_sym_sect, elf_gottpoff_sect, elf_tlsie_sect;
+
+uint8_t elf_osabi = 0; /* Default OSABI = 0 (System V or Linux) */
+uint8_t elf_abiver = 0; /* Current ABI version */
+
+const struct elf_known_section elf_known_sections[] = {
+ { ".text", SHT_PROGBITS, SHF_ALLOC|SHF_EXECINSTR, 16 },
+ { ".rodata", SHT_PROGBITS, SHF_ALLOC, 4 },
+ { ".lrodata", SHT_PROGBITS, SHF_ALLOC, 4 },
+ { ".data", SHT_PROGBITS, SHF_ALLOC|SHF_WRITE, 4 },
+ { ".ldata", SHT_PROGBITS, SHF_ALLOC|SHF_WRITE, 4 },
+ { ".bss", SHT_NOBITS, SHF_ALLOC|SHF_WRITE, 4 },
+ { ".lbss", SHT_NOBITS, SHF_ALLOC|SHF_WRITE, 4 },
+ { ".tdata", SHT_PROGBITS, SHF_ALLOC|SHF_WRITE|SHF_TLS, 4 },
+ { ".tbss", SHT_NOBITS, SHF_ALLOC|SHF_WRITE|SHF_TLS, 4 },
+ { ".comment", SHT_PROGBITS, 0, 1 },
+ { NULL, SHT_PROGBITS, SHF_ALLOC, 1 } /* default */
+};
+
+/* parse section attributes */
+static void elf_section_attrib(char *name, char *attr, int pass,
+ uint32_t *flags_and, uint32_t *flags_or,
+ uint64_t *align, int *type)
+{
+ char *opt, *val, *next;
+
+ opt = nasm_skip_spaces(attr);
+ if (!opt || !*opt)
+ return;
+
+ while ((opt = nasm_opt_val(opt, &val, &next))) {
+ if (!nasm_stricmp(opt, "align")) {
+ if (!val) {
+ nasm_error(ERR_NONFATAL,
+ "section align without value specified");
+ } else {
+ *align = atoi(val);
+ if (*align == 0) {
+ *align = SHA_ANY;
+ } else if (!is_power2(*align)) {
+ nasm_error(ERR_NONFATAL,
+ "section alignment %"PRId64" is not a power of two",
+ *align);
+ *align = SHA_ANY;
+ }
+ }
+ } else if (!nasm_stricmp(opt, "alloc")) {
+ *flags_and |= SHF_ALLOC;
+ *flags_or |= SHF_ALLOC;
+ } else if (!nasm_stricmp(opt, "noalloc")) {
+ *flags_and |= SHF_ALLOC;
+ *flags_or &= ~SHF_ALLOC;
+ } else if (!nasm_stricmp(opt, "exec")) {
+ *flags_and |= SHF_EXECINSTR;
+ *flags_or |= SHF_EXECINSTR;
+ } else if (!nasm_stricmp(opt, "noexec")) {
+ *flags_and |= SHF_EXECINSTR;
+ *flags_or &= ~SHF_EXECINSTR;
+ } else if (!nasm_stricmp(opt, "write")) {
+ *flags_and |= SHF_WRITE;
+ *flags_or |= SHF_WRITE;
+ } else if (!nasm_stricmp(opt, "tls")) {
+ *flags_and |= SHF_TLS;
+ *flags_or |= SHF_TLS;
+ } else if (!nasm_stricmp(opt, "nowrite")) {
+ *flags_and |= SHF_WRITE;
+ *flags_or &= ~SHF_WRITE;
+ } else if (!nasm_stricmp(opt, "progbits")) {
+ *type = SHT_PROGBITS;
+ } else if (!nasm_stricmp(opt, "nobits")) {
+ *type = SHT_NOBITS;
+ } else if (pass == 1) {
+ nasm_error(ERR_WARNING,
+ "Unknown section attribute '%s' ignored on"
+ " declaration of section `%s'", opt, name);
+ }
+ opt = next;
+ }
+}
+
+static enum directive_result
+elf_directive(enum directive directive, char *value, int pass)
+{
+ int64_t n;
+ bool err;
+ char *p;
+
+ switch (directive) {
+ case D_OSABI:
+ if (pass == 2)
+ return DIRR_OK; /* ignore in pass 2 */
+
+ n = readnum(value, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL, "`osabi' directive requires a parameter");
+ return DIRR_ERROR;
+ }
+
+ if (n < 0 || n > 255) {
+ nasm_error(ERR_NONFATAL, "valid osabi numbers are 0 to 255");
+ return DIRR_ERROR;
+ }
+
+ elf_osabi = n;
+ elf_abiver = 0;
+
+ p = strchr(value,',');
+ if (!p)
+ return DIRR_OK;
+
+ n = readnum(p + 1, &err);
+ if (err || n < 0 || n > 255) {
+ nasm_error(ERR_NONFATAL, "invalid ABI version number (valid: 0 to 255)");
+ return DIRR_ERROR;
+ }
+
+ elf_abiver = n;
+ return DIRR_OK;
+
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+static void elf_init(void)
+{
+ strlcpy(elf_module, inname, sizeof(elf_module));
+ sects = NULL;
+ nsects = sectlen = 0;
+ syms = saa_init((int32_t)sizeof(struct elf_symbol));
+ nlocals = nglobs = ndebugs = 0;
+ bsym = raa_init();
+ strs = saa_init(1L);
+ saa_wbytes(strs, "\0", 1L);
+ saa_wbytes(strs, elf_module, strlen(elf_module)+1);
+ strslen = 2 + strlen(elf_module);
+ shstrtab = NULL;
+ shstrtablen = shstrtabsize = 0;;
+ add_sectname("", "");
+
+ fwds = NULL;
+
+ /*
+ * FIXME: tlsie is Elf32 only and
+ * gottpoff is Elfx32|64 only.
+ */
+
+ elf_gotpc_sect = seg_alloc();
+ backend_label("..gotpc", elf_gotpc_sect + 1, 0L);
+ elf_gotoff_sect = seg_alloc();
+ backend_label("..gotoff", elf_gotoff_sect + 1, 0L);
+ elf_got_sect = seg_alloc();
+ backend_label("..got", elf_got_sect + 1, 0L);
+ elf_plt_sect = seg_alloc();
+ backend_label("..plt", elf_plt_sect + 1, 0L);
+ elf_sym_sect = seg_alloc();
+ backend_label("..sym", elf_sym_sect + 1, 0L);
+ elf_gottpoff_sect = seg_alloc();
+ backend_label("..gottpoff", elf_gottpoff_sect + 1, 0L);
+ elf_tlsie_sect = seg_alloc();
+ backend_label("..tlsie", elf_tlsie_sect + 1, 0L);
+
+ def_seg = seg_alloc();
+}
+
+static void elf_cleanup(void)
+{
+ struct elf_reloc *r;
+ int i;
+
+ elf_write();
+ for (i = 0; i < nsects; i++) {
+ if (sects[i]->type != SHT_NOBITS)
+ saa_free(sects[i]->data);
+ if (sects[i]->head)
+ saa_free(sects[i]->rel);
+ while (sects[i]->head) {
+ r = sects[i]->head;
+ sects[i]->head = sects[i]->head->next;
+ nasm_free(r);
+ }
+ }
+ nasm_free(sects);
+ saa_free(syms);
+ raa_free(bsym);
+ saa_free(strs);
+ dfmt->cleanup();
+}
+
+/* add entry to the elf .shstrtab section */
+static void add_sectname(const char *firsthalf, const char *secondhalf)
+{
+ int len = strlen(firsthalf) + strlen(secondhalf);
+ while (shstrtablen + len + 1 > shstrtabsize)
+ shstrtab = nasm_realloc(shstrtab, (shstrtabsize += SHSTR_DELTA));
+ strcpy(shstrtab + shstrtablen, firsthalf);
+ strcat(shstrtab + shstrtablen, secondhalf);
+ shstrtablen += len + 1;
+}
+
+static int elf_make_section(char *name, int type, int flags, int align)
+{
+ struct elf_section *s;
+
+ s = nasm_zalloc(sizeof(*s));
+
+ if (type != SHT_NOBITS)
+ s->data = saa_init(1L);
+ s->tail = &s->head;
+ if (!strcmp(name, ".text"))
+ s->index = def_seg;
+ else
+ s->index = seg_alloc();
+ add_sectname("", name);
+
+ s->name = nasm_strdup(name);
+ s->type = type;
+ s->flags = flags;
+ s->align = align;
+
+ if (nsects >= sectlen)
+ sects = nasm_realloc(sects, (sectlen += SECT_DELTA) * sizeof(*sects));
+ sects[nsects++] = s;
+
+ return nsects - 1;
+}
+
+static int32_t elf_section_names(char *name, int pass, int *bits)
+{
+ char *p;
+ uint32_t flags, flags_and, flags_or;
+ uint64_t align;
+ int type, i;
+
+ if (!name) {
+ *bits = ofmt->maxbits;
+ return def_seg;
+ }
+
+ p = nasm_skip_word(name);
+ if (*p)
+ *p++ = '\0';
+ flags_and = flags_or = type = align = 0;
+
+ elf_section_attrib(name, p, pass, &flags_and,
+ &flags_or, &align, &type);
+
+ if (!strcmp(name, ".shstrtab") ||
+ !strcmp(name, ".symtab") ||
+ !strcmp(name, ".strtab")) {
+ nasm_error(ERR_NONFATAL, "attempt to redefine reserved section"
+ "name `%s'", name);
+ return NO_SEG;
+ }
+
+ for (i = 0; i < nsects; i++)
+ if (!strcmp(name, sects[i]->name))
+ break;
+ if (i == nsects) {
+ const struct elf_known_section *ks = elf_known_sections;
+
+ while (ks->name) {
+ if (!strcmp(name, ks->name))
+ break;
+ ks++;
+ }
+
+ type = type ? type : ks->type;
+ align = align ? align : ks->align;
+ flags = (ks->flags & ~flags_and) | flags_or;
+
+ i = elf_make_section(name, type, flags, align);
+ } else if (pass == 1) {
+ if ((type && sects[i]->type != type)
+ || (align && sects[i]->align != align)
+ || (flags_and && ((sects[i]->flags & flags_and) != flags_or)))
+ nasm_error(ERR_WARNING, "incompatible section attributes ignored on"
+ " redeclaration of section `%s'", name);
+ }
+
+ return sects[i]->index;
+}
+
+static void elf_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ int pos = strslen;
+ struct elf_symbol *sym;
+ bool special_used = false;
+
+#if defined(DEBUG) && DEBUG>2
+ nasm_error(ERR_DEBUG,
+ " elf_deflabel: %s, seg=%"PRIx32", off=%"PRIx64", is_global=%d, %s\n",
+ name, segment, offset, is_global, special);
+#endif
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ /*
+ * This is a NASM special symbol. We never allow it into
+ * the ELF symbol table, even if it's a valid one. If it
+ * _isn't_ a valid one, we should barf immediately.
+ *
+ * FIXME: tlsie is Elf32 only, and gottpoff is Elfx32|64 only.
+ */
+ if (strcmp(name, "..gotpc") && strcmp(name, "..gotoff") &&
+ strcmp(name, "..got") && strcmp(name, "..plt") &&
+ strcmp(name, "..sym") && strcmp(name, "..gottpoff") &&
+ strcmp(name, "..tlsie"))
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ return;
+ }
+
+ if (is_global == 3) {
+ struct elf_symbol **s;
+ /*
+ * Fix up a forward-reference symbol size from the first
+ * pass.
+ */
+ for (s = &fwds; *s; s = &(*s)->nextfwd)
+ if (!strcmp((*s)->name, name)) {
+ struct tokenval tokval;
+ expr *e;
+ char *p = nasm_skip_spaces(nasm_skip_word(special));
+
+ stdscan_reset();
+ stdscan_set(p);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, 1, NULL);
+ if (e) {
+ if (!is_simple(e))
+ nasm_error(ERR_NONFATAL, "cannot use relocatable"
+ " expression as symbol size");
+ else
+ (*s)->size = reloc_value(e);
+ }
+
+ /*
+ * Remove it from the list of unresolved sizes.
+ */
+ nasm_free((*s)->name);
+ *s = (*s)->nextfwd;
+ return;
+ }
+ return; /* it wasn't an important one */
+ }
+
+ saa_wbytes(strs, name, (int32_t)(1 + strlen(name)));
+ strslen += 1 + strlen(name);
+
+ lastsym = sym = saa_wstruct(syms);
+
+ memset(&sym->symv, 0, sizeof(struct rbtree));
+
+ sym->strpos = pos;
+ sym->type = is_global ? SYM_GLOBAL : SYM_LOCAL;
+ sym->other = STV_DEFAULT;
+ sym->size = 0;
+ if (segment == NO_SEG)
+ sym->section = SHN_ABS;
+ else {
+ int i;
+ sym->section = SHN_UNDEF;
+ if (segment == def_seg) {
+ /* we have to be sure at least text section is there */
+ int tempint;
+ if (segment != elf_section_names(".text", 2, &tempint))
+ nasm_panic("strange segment conditions in ELF driver");
+ }
+ for (i = 0; i < nsects; i++) {
+ if (segment == sects[i]->index) {
+ sym->section = i + 1;
+ break;
+ }
+ }
+ }
+
+ if (is_global == 2) {
+ sym->size = offset;
+ sym->symv.key = 0;
+ sym->section = SHN_COMMON;
+ /*
+ * We have a common variable. Check the special text to see
+ * if it's a valid number and power of two; if so, store it
+ * as the alignment for the common variable.
+ */
+ if (special) {
+ bool err;
+ sym->symv.key = readnum(special, &err);
+ if (err)
+ nasm_error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+ " valid number", special);
+ else if ((sym->symv.key | (sym->symv.key - 1)) != 2 * sym->symv.key - 1)
+ nasm_error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+ " power of two", special);
+ }
+ special_used = true;
+ } else
+ sym->symv.key = (sym->section == SHN_UNDEF ? 0 : offset);
+
+ if (sym->type == SYM_GLOBAL) {
+ /*
+ * If sym->section == SHN_ABS, then the first line of the
+ * else section would cause a core dump, because its a reference
+ * beyond the end of the section array.
+ * This behaviour is exhibited by this code:
+ * GLOBAL crash_nasm
+ * crash_nasm equ 0
+ * To avoid such a crash, such requests are silently discarded.
+ * This may not be the best solution.
+ */
+ if (sym->section == SHN_UNDEF || sym->section == SHN_COMMON) {
+ bsym = raa_write(bsym, segment, nglobs);
+ } else if (sym->section != SHN_ABS) {
+ /*
+ * This is a global symbol; so we must add it to the rbtree
+ * of global symbols in its section.
+ *
+ * In addition, we check the special text for symbol
+ * type and size information.
+ */
+ sects[sym->section-1]->gsyms =
+ rb_insert(sects[sym->section-1]->gsyms, &sym->symv);
+
+ if (special) {
+ int n = strcspn(special, " \t");
+
+ if (!nasm_strnicmp(special, "function", n))
+ sym->type |= STT_FUNC;
+ else if (!nasm_strnicmp(special, "data", n) ||
+ !nasm_strnicmp(special, "object", n))
+ sym->type |= STT_OBJECT;
+ else if (!nasm_strnicmp(special, "notype", n))
+ sym->type |= STT_NOTYPE;
+ else
+ nasm_error(ERR_NONFATAL, "unrecognised symbol type `%.*s'",
+ n, special);
+ special += n;
+
+ special = nasm_skip_spaces(special);
+ if (*special) {
+ n = strcspn(special, " \t");
+ if (!nasm_strnicmp(special, "default", n))
+ sym->other = STV_DEFAULT;
+ else if (!nasm_strnicmp(special, "internal", n))
+ sym->other = STV_INTERNAL;
+ else if (!nasm_strnicmp(special, "hidden", n))
+ sym->other = STV_HIDDEN;
+ else if (!nasm_strnicmp(special, "protected", n))
+ sym->other = STV_PROTECTED;
+ else
+ n = 0;
+ special += n;
+ }
+
+ if (*special) {
+ struct tokenval tokval;
+ expr *e;
+ int fwd = 0;
+ char *saveme = stdscan_get();
+
+ while (special[n] && nasm_isspace(special[n]))
+ n++;
+ /*
+ * We have a size expression; attempt to
+ * evaluate it.
+ */
+ stdscan_reset();
+ stdscan_set(special + n);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, &fwd, 0, NULL);
+ if (fwd) {
+ sym->nextfwd = fwds;
+ fwds = sym;
+ sym->name = nasm_strdup(name);
+ } else if (e) {
+ if (!is_simple(e))
+ nasm_error(ERR_NONFATAL, "cannot use relocatable"
+ " expression as symbol size");
+ else
+ sym->size = reloc_value(e);
+ }
+ stdscan_set(saveme);
+ }
+ special_used = true;
+ }
+ /*
+ * If TLS segment, mark symbol accordingly.
+ */
+ if (sects[sym->section - 1]->flags & SHF_TLS) {
+ sym->type &= 0xf0;
+ sym->type |= STT_TLS;
+ }
+ }
+ sym->globnum = nglobs;
+ nglobs++;
+ } else
+ nlocals++;
+
+ if (special && !special_used)
+ nasm_error(ERR_NONFATAL, "no special symbol features supported here");
+}
+
+static void elf_add_reloc(struct elf_section *sect, int32_t segment,
+ int64_t offset, int type)
+{
+ struct elf_reloc *r;
+
+ r = *sect->tail = nasm_zalloc(sizeof(struct elf_reloc));
+ sect->tail = &r->next;
+
+ r->address = sect->len;
+ r->offset = offset;
+
+ if (segment != NO_SEG) {
+ int i;
+ for (i = 0; i < nsects; i++)
+ if (segment == sects[i]->index)
+ r->symbol = i + 2;
+ if (!r->symbol)
+ r->symbol = GLOBAL_TEMP_BASE + raa_read(bsym, segment);
+ }
+ r->type = type;
+
+ sect->nrelocs++;
+}
+
+/*
+ * This routine deals with ..got and ..sym relocations: the more
+ * complicated kinds. In shared-library writing, some relocations
+ * with respect to global symbols must refer to the precise symbol
+ * rather than referring to an offset from the base of the section
+ * _containing_ the symbol. Such relocations call to this routine,
+ * which searches the symbol list for the symbol in question.
+ *
+ * R_386_GOT32 | R_X86_64_GOT32 references require the _exact_ symbol address to be
+ * used; R_386_32 | R_X86_64_32 references can be at an offset from the symbol.
+ * The boolean argument `exact' tells us this.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the symbol rather than the section. Should always be
+ * zero when returning from an exact call.
+ *
+ * Limitation: if you define two symbols at the same place,
+ * confusion will occur.
+ *
+ * Inefficiency: we search, currently, using a linked list which
+ * isn't even necessarily sorted.
+ */
+static int64_t elf_add_gsym_reloc(struct elf_section *sect,
+ int32_t segment, uint64_t offset,
+ int64_t pcrel, int type, bool exact)
+{
+ struct elf_reloc *r;
+ struct elf_section *s;
+ struct elf_symbol *sym;
+ struct rbtree *srb;
+ int i;
+
+ /*
+ * First look up the segment/offset pair and find a global
+ * symbol corresponding to it. If it's not one of our segments,
+ * then it must be an external symbol, in which case we're fine
+ * doing a normal elf_add_reloc after first sanity-checking
+ * that the offset from the symbol is zero.
+ */
+ s = NULL;
+ for (i = 0; i < nsects; i++)
+ if (segment == sects[i]->index) {
+ s = sects[i];
+ break;
+ }
+
+ if (!s) {
+ if (exact && offset)
+ nasm_error(ERR_NONFATAL, "invalid access to an external symbol");
+ else
+ elf_add_reloc(sect, segment, offset - pcrel, type);
+ return 0;
+ }
+
+ srb = rb_search(s->gsyms, offset);
+ if (!srb || (exact && srb->key != offset)) {
+ nasm_error(ERR_NONFATAL, "unable to find a suitable global symbol"
+ " for this reference");
+ return 0;
+ }
+ sym = container_of(srb, struct elf_symbol, symv);
+
+ r = *sect->tail = nasm_malloc(sizeof(struct elf_reloc));
+ sect->tail = &r->next;
+
+ r->next = NULL;
+ r->address = sect->len;
+ r->offset = offset - pcrel - sym->symv.key;
+ r->symbol = GLOBAL_TEMP_BASE + sym->globnum;
+ r->type = type;
+
+ sect->nrelocs++;
+ return r->offset;
+}
+
+static void elf32_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct elf_section *s;
+ int64_t addr;
+ int reltype, bytes;
+ int i;
+ static struct symlininfo sinfo;
+
+ s = NULL;
+ for (i = 0; i < nsects; i++)
+ if (segto == sects[i]->index) {
+ s = sects[i];
+ break;
+ }
+ if (!s) {
+ int tempint; /* ignored */
+ if (segto != elf_section_names(".text", 2, &tempint))
+ nasm_panic("strange segment conditions in ELF driver");
+ else {
+ s = sects[nsects - 1];
+ i = nsects - 1;
+ }
+ }
+
+ /* again some stabs debugging stuff */
+ sinfo.offset = s->len;
+ sinfo.section = i;
+ sinfo.segto = segto;
+ sinfo.name = s->name;
+ dfmt->debug_output(TY_DEBUGSYMLIN, &sinfo);
+ /* end of debugging stuff */
+
+ if (s->type == SHT_NOBITS && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in"
+ " BSS section `%s': ignored", s->name);
+ s->len += realsize(type, size);
+ return;
+ }
+
+ switch (type) {
+ case OUT_RESERVE:
+ if (s->type == SHT_PROGBITS) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " non-BSS section `%s': zeroing", s->name);
+ elf_sect_write(s, NULL, size);
+ } else
+ s->len += size;
+ break;
+
+ case OUT_RAWDATA:
+ elf_sect_write(s, data, size);
+ break;
+
+ case OUT_ADDRESS:
+ {
+ bool gnu16 = false;
+ int asize = abs((int)size);
+
+ addr = *(int64_t *)data;
+ if (segment != NO_SEG) {
+ if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ /*
+ * The if() is a hack to deal with compilers which
+ * don't handle switch() statements with 64-bit
+ * expressions.
+ */
+ switch (asize) {
+ case 1:
+ gnu16 = true;
+ elf_add_reloc(s, segment, 0, R_386_8);
+ break;
+ case 2:
+ gnu16 = true;
+ elf_add_reloc(s, segment, 0, R_386_16);
+ break;
+ case 4:
+ elf_add_reloc(s, segment, 0, R_386_32);
+ break;
+ default: /* Error issued further down */
+ break;
+ }
+ } else if (wrt == elf_gotpc_sect + 1) {
+ /*
+ * The user will supply GOT relative to $$. ELF
+ * will let us have GOT relative to $. So we
+ * need to fix up the data item by $-$$.
+ */
+ addr += s->len;
+ elf_add_reloc(s, segment, 0, R_386_GOTPC);
+ } else if (wrt == elf_gotoff_sect + 1) {
+ elf_add_reloc(s, segment, 0, R_386_GOTOFF);
+ } else if (wrt == elf_tlsie_sect + 1) {
+ addr = elf_add_gsym_reloc(s, segment, addr, 0,
+ R_386_TLS_IE, true);
+ } else if (wrt == elf_got_sect + 1) {
+ addr = elf_add_gsym_reloc(s, segment, addr, 0,
+ R_386_GOT32, true);
+ } else if (wrt == elf_sym_sect + 1) {
+ switch (asize) {
+ case 1:
+ gnu16 = true;
+ addr = elf_add_gsym_reloc(s, segment, addr, 0,
+ R_386_8, false);
+ break;
+ case 2:
+ gnu16 = true;
+ addr = elf_add_gsym_reloc(s, segment, addr, 0,
+ R_386_16, false);
+ break;
+ case 4:
+ addr = elf_add_gsym_reloc(s, segment, addr, 0,
+ R_386_32, false);
+ break;
+ default:
+ break;
+ }
+ } else if (wrt == elf_plt_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF format cannot produce non-PC-"
+ "relative PLT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF format does not support this"
+ " use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ }
+ }
+ }
+
+ if (gnu16) {
+ nasm_error(ERR_WARNING | ERR_WARN_GNUELF,
+ "8- or 16-bit relocations in ELF32 is a GNU extension");
+ } else if (asize != 4 && segment != NO_SEG) {
+ nasm_error(ERR_NONFATAL, "Unsupported non-32-bit ELF relocation");
+ }
+ elf_sect_writeaddr(s, addr, asize);
+ break;
+ }
+
+ case OUT_REL1ADR:
+ reltype = R_386_PC8;
+ bytes = 1;
+ goto rel12adr;
+ case OUT_REL2ADR:
+ reltype = R_386_PC16;
+ bytes = 2;
+ goto rel12adr;
+
+rel12adr:
+ addr = *(int64_t *)data - size;
+ nasm_assert(segment != segto);
+ if (segment != NO_SEG && segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ nasm_error(ERR_WARNING | ERR_WARN_GNUELF,
+ "8- or 16-bit relocations in ELF is a GNU extension");
+ elf_add_reloc(s, segment, 0, reltype);
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "Unsupported non-32-bit ELF relocation");
+ }
+ }
+ elf_sect_writeaddr(s, addr, bytes);
+ break;
+
+ case OUT_REL4ADR:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL4ADR");
+ if (segment != NO_SEG && segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, 0, R_386_PC32);
+ } else if (wrt == elf_plt_sect + 1) {
+ elf_add_reloc(s, segment, 0, R_386_PLT32);
+ } else if (wrt == elf_gotpc_sect + 1 ||
+ wrt == elf_gotoff_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF format cannot produce PC-"
+ "relative GOT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF format does not support this"
+ " use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ }
+ }
+ elf_sect_writeaddr(s, addr, 4);
+ break;
+
+ case OUT_REL8ADR:
+ nasm_error(ERR_NONFATAL, "32-bit ELF format does not support 64-bit relocations");
+ addr = 0;
+ elf_sect_writeaddr(s, addr, 8);
+ break;
+
+ default:
+ panic();
+ }
+}
+static void elf64_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct elf_section *s;
+ int64_t addr;
+ int reltype, bytes;
+ int i;
+ static struct symlininfo sinfo;
+
+ s = NULL;
+ for (i = 0; i < nsects; i++)
+ if (segto == sects[i]->index) {
+ s = sects[i];
+ break;
+ }
+ if (!s) {
+ int tempint; /* ignored */
+ if (segto != elf_section_names(".text", 2, &tempint))
+ nasm_panic("strange segment conditions in ELF driver");
+ else {
+ s = sects[nsects - 1];
+ i = nsects - 1;
+ }
+ }
+
+ /* again some stabs debugging stuff */
+ sinfo.offset = s->len;
+ sinfo.section = i;
+ sinfo.segto = segto;
+ sinfo.name = s->name;
+ dfmt->debug_output(TY_DEBUGSYMLIN, &sinfo);
+ /* end of debugging stuff */
+
+ if (s->type == SHT_NOBITS && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in"
+ " BSS section `%s': ignored", s->name);
+ s->len += realsize(type, size);
+ return;
+ }
+
+ switch (type) {
+ case OUT_RESERVE:
+ if (s->type == SHT_PROGBITS) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " non-BSS section `%s': zeroing", s->name);
+ elf_sect_write(s, NULL, size);
+ } else
+ s->len += size;
+ break;
+
+ case OUT_RAWDATA:
+ if (segment != NO_SEG)
+ nasm_panic("OUT_RAWDATA with other than NO_SEG");
+ elf_sect_write(s, data, size);
+ break;
+
+ case OUT_ADDRESS:
+ {
+ int isize = (int)size;
+ int asize = abs((int)size);
+
+ addr = *(int64_t *)data;
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ switch (isize) {
+ case 1:
+ case -1:
+ elf_add_reloc(s, segment, addr, R_X86_64_8);
+ break;
+ case 2:
+ case -2:
+ elf_add_reloc(s, segment, addr, R_X86_64_16);
+ break;
+ case 4:
+ elf_add_reloc(s, segment, addr, R_X86_64_32);
+ break;
+ case -4:
+ elf_add_reloc(s, segment, addr, R_X86_64_32S);
+ break;
+ case 8:
+ case -8:
+ elf_add_reloc(s, segment, addr, R_X86_64_64);
+ break;
+ default:
+ nasm_panic("internal error elf64-hpa-871");
+ break;
+ }
+ addr = 0;
+ } else if (wrt == elf_gotpc_sect + 1) {
+ /*
+ * The user will supply GOT relative to $$. ELF
+ * will let us have GOT relative to $. So we
+ * need to fix up the data item by $-$$.
+ */
+ addr += s->len;
+ elf_add_reloc(s, segment, addr, R_X86_64_GOTPC32);
+ addr = 0;
+ } else if (wrt == elf_gotoff_sect + 1) {
+ if (asize != 8) {
+ nasm_error(ERR_NONFATAL, "ELF64 requires ..gotoff "
+ "references to be qword");
+ } else {
+ elf_add_reloc(s, segment, addr, R_X86_64_GOTOFF64);
+ addr = 0;
+ }
+ } else if (wrt == elf_got_sect + 1) {
+ switch (asize) {
+ case 4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_GOT32, true);
+ addr = 0;
+ break;
+ case 8:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_GOT64, true);
+ addr = 0;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid ..got reference");
+ break;
+ }
+ } else if (wrt == elf_sym_sect + 1) {
+ switch (isize) {
+ case 1:
+ case -1:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_8, false);
+ addr = 0;
+ break;
+ case 2:
+ case -2:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_16, false);
+ addr = 0;
+ break;
+ case 4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_32, false);
+ addr = 0;
+ break;
+ case -4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_32S, false);
+ addr = 0;
+ break;
+ case 8:
+ case -8:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_64, false);
+ addr = 0;
+ break;
+ default:
+ nasm_panic("internal error elf64-hpa-903");
+ break;
+ }
+ } else if (wrt == elf_plt_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF format cannot produce non-PC-"
+ "relative PLT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF format does not support this"
+ " use of WRT");
+ }
+ }
+ elf_sect_writeaddr(s, addr, asize);
+ break;
+ }
+
+ case OUT_REL1ADR:
+ reltype = R_X86_64_PC8;
+ bytes = 1;
+ goto rel12adr;
+
+ case OUT_REL2ADR:
+ reltype = R_X86_64_PC16;
+ bytes = 2;
+ goto rel12adr;
+
+rel12adr:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL1ADR");
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, addr, reltype);
+ addr = 0;
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "Unsupported non-32-bit ELF relocation");
+ }
+ }
+ elf_sect_writeaddr(s, addr, bytes);
+ break;
+
+ case OUT_REL4ADR:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL4ADR");
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF64 format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, addr, R_X86_64_PC32);
+ addr = 0;
+ } else if (wrt == elf_plt_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_PLT32, true);
+ addr = 0;
+ } else if (wrt == elf_gotpc_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_GOTPCREL, true);
+ addr = 0;
+ } else if (wrt == elf_gotoff_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF64 requires ..gotoff references to be "
+ "qword absolute");
+ } else if (wrt == elf_gottpoff_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_GOTTPOFF, true);
+ addr = 0;
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF64 format does not support this"
+ " use of WRT");
+ }
+ }
+ elf_sect_writeaddr(s, addr, 4);
+ break;
+
+ case OUT_REL8ADR:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL8ADR");
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF64 format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, addr, R_X86_64_PC64);
+ addr = 0;
+ } else if (wrt == elf_gotpc_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_GOTPCREL64, true);
+ addr = 0;
+ } else if (wrt == elf_gotoff_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF64 requires ..gotoff references to be "
+ "absolute");
+ } else if (wrt == elf_gottpoff_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF64 requires ..gottpoff references to be "
+ "dword");
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF64 format does not support this"
+ " use of WRT");
+ }
+ }
+ elf_sect_writeaddr(s, addr, 8);
+ break;
+
+ default:
+ panic();
+ }
+}
+
+static void elfx32_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct elf_section *s;
+ int64_t addr;
+ int reltype, bytes;
+ int i;
+ static struct symlininfo sinfo;
+
+ s = NULL;
+ for (i = 0; i < nsects; i++)
+ if (segto == sects[i]->index) {
+ s = sects[i];
+ break;
+ }
+ if (!s) {
+ int tempint; /* ignored */
+ if (segto != elf_section_names(".text", 2, &tempint))
+ nasm_panic("strange segment conditions in ELF driver");
+ else {
+ s = sects[nsects - 1];
+ i = nsects - 1;
+ }
+ }
+
+ /* again some stabs debugging stuff */
+ sinfo.offset = s->len;
+ sinfo.section = i;
+ sinfo.segto = segto;
+ sinfo.name = s->name;
+ dfmt->debug_output(TY_DEBUGSYMLIN, &sinfo);
+ /* end of debugging stuff */
+
+ if (s->type == SHT_NOBITS && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in"
+ " BSS section `%s': ignored", s->name);
+ s->len += realsize(type, size);
+ return;
+ }
+
+ switch (type) {
+ case OUT_RESERVE:
+ if (s->type == SHT_PROGBITS) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " non-BSS section `%s': zeroing", s->name);
+ elf_sect_write(s, NULL, size);
+ } else
+ s->len += size;
+ break;
+
+ case OUT_RAWDATA:
+ if (segment != NO_SEG)
+ nasm_panic("OUT_RAWDATA with other than NO_SEG");
+ elf_sect_write(s, data, size);
+ break;
+
+ case OUT_ADDRESS:
+ {
+ int isize = (int)size;
+ int asize = abs((int)size);
+
+ addr = *(int64_t *)data;
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ switch (isize) {
+ case 1:
+ case -1:
+ elf_add_reloc(s, segment, addr, R_X86_64_8);
+ break;
+ case 2:
+ case -2:
+ elf_add_reloc(s, segment, addr, R_X86_64_16);
+ break;
+ case 4:
+ elf_add_reloc(s, segment, addr, R_X86_64_32);
+ break;
+ case -4:
+ elf_add_reloc(s, segment, addr, R_X86_64_32S);
+ break;
+ case 8:
+ case -8:
+ elf_add_reloc(s, segment, addr, R_X86_64_64);
+ break;
+ default:
+ nasm_panic("internal error elfx32-hpa-871");
+ break;
+ }
+ addr = 0;
+ } else if (wrt == elf_gotpc_sect + 1) {
+ /*
+ * The user will supply GOT relative to $$. ELF
+ * will let us have GOT relative to $. So we
+ * need to fix up the data item by $-$$.
+ */
+ addr += s->len;
+ elf_add_reloc(s, segment, addr, R_X86_64_GOTPC32);
+ addr = 0;
+ } else if (wrt == elf_gotoff_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELFX32 doesn't support "
+ "R_X86_64_GOTOFF64");
+ } else if (wrt == elf_got_sect + 1) {
+ switch (asize) {
+ case 4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_GOT32, true);
+ addr = 0;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid ..got reference");
+ break;
+ }
+ } else if (wrt == elf_sym_sect + 1) {
+ switch (isize) {
+ case 1:
+ case -1:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_8, false);
+ addr = 0;
+ break;
+ case 2:
+ case -2:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_16, false);
+ addr = 0;
+ break;
+ case 4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_32, false);
+ addr = 0;
+ break;
+ case -4:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_32S, false);
+ addr = 0;
+ break;
+ case 8:
+ case -8:
+ elf_add_gsym_reloc(s, segment, addr, 0,
+ R_X86_64_64, false);
+ addr = 0;
+ break;
+ default:
+ nasm_panic("internal error elfx32-hpa-903");
+ break;
+ }
+ } else if (wrt == elf_plt_sect + 1) {
+ nasm_error(ERR_NONFATAL, "ELF format cannot produce non-PC-"
+ "relative PLT references");
+ } else {
+ nasm_error(ERR_NONFATAL, "ELF format does not support this"
+ " use of WRT");
+ }
+ }
+ elf_sect_writeaddr(s, addr, asize);
+ break;
+ }
+
+ case OUT_REL1ADR:
+ reltype = R_X86_64_PC8;
+ bytes = 1;
+ goto rel12adr;
+
+ case OUT_REL2ADR:
+ reltype = R_X86_64_PC16;
+ bytes = 2;
+ goto rel12adr;
+
+rel12adr:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL1ADR");
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELF format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, addr, reltype);
+ addr = 0;
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "Unsupported non-32-bit ELF relocation");
+ }
+ }
+ elf_sect_writeaddr(s, addr, bytes);
+ break;
+
+ case OUT_REL4ADR:
+ addr = *(int64_t *)data - size;
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL4ADR");
+ if (segment == NO_SEG) {
+ /* Do nothing */
+ } else if (segment % 2) {
+ nasm_error(ERR_NONFATAL, "ELFX32 format does not support"
+ " segment base references");
+ } else {
+ if (wrt == NO_SEG) {
+ elf_add_reloc(s, segment, addr, R_X86_64_PC32);
+ addr = 0;
+ } else if (wrt == elf_plt_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_PLT32, true);
+ addr = 0;
+ } else if (wrt == elf_gotpc_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_GOTPCREL, true);
+ addr = 0;
+ } else if (wrt == elf_gotoff_sect + 1 ||
+ wrt == elf_got_sect + 1) {
+ nasm_error(ERR_NONFATAL, "invalid ..gotoff reference");
+ } else if (wrt == elf_gottpoff_sect + 1) {
+ elf_add_gsym_reloc(s, segment, addr+size, size,
+ R_X86_64_GOTTPOFF, true);
+ addr = 0;
+ } else {
+ nasm_error(ERR_NONFATAL, "ELFX32 format does not support this"
+ " use of WRT");
+ }
+ }
+ elf_sect_writeaddr(s, addr, 4);
+ break;
+
+ case OUT_REL8ADR:
+ nasm_error(ERR_NONFATAL, "32-bit ELF format does not support 64-bit relocations");
+ addr = 0;
+ elf_sect_writeaddr(s, addr, 8);
+ break;
+
+ default:
+ panic();
+ }
+}
+
+static void elf_write(void)
+{
+ int align;
+ char *p;
+ int i;
+
+ struct SAA *symtab;
+ int32_t symtablen, symtablocal;
+
+ /*
+ * Work out how many sections we will have. We have SHN_UNDEF,
+ * then the flexible user sections, then the fixed sections
+ * `.shstrtab', `.symtab' and `.strtab', then optionally
+ * relocation sections for the user sections.
+ */
+ nsections = sec_numspecial + 1;
+ if (dfmt_is_stabs())
+ nsections += 3;
+ else if (dfmt_is_dwarf())
+ nsections += 10;
+
+ add_sectname("", ".shstrtab");
+ add_sectname("", ".symtab");
+ add_sectname("", ".strtab");
+ for (i = 0; i < nsects; i++) {
+ nsections++; /* for the section itself */
+ if (sects[i]->head) {
+ nsections++; /* for its relocations */
+ add_sectname(is_elf32() ? ".rel" : ".rela", sects[i]->name);
+ }
+ }
+
+ if (dfmt_is_stabs()) {
+ /* in case the debug information is wanted, just add these three sections... */
+ add_sectname("", ".stab");
+ add_sectname("", ".stabstr");
+ add_sectname(is_elf32() ? ".rel" : ".rela", ".stab");
+ } else if (dfmt_is_dwarf()) {
+ /* the dwarf debug standard specifies the following ten sections,
+ not all of which are currently implemented,
+ although all of them are defined. */
+#define debug_aranges (int64_t) (nsections-10)
+#define debug_info (int64_t) (nsections-7)
+#define debug_abbrev (int64_t) (nsections-5)
+#define debug_line (int64_t) (nsections-4)
+ add_sectname("", ".debug_aranges");
+ add_sectname(".rela", ".debug_aranges");
+ add_sectname("", ".debug_pubnames");
+ add_sectname("", ".debug_info");
+ add_sectname(".rela", ".debug_info");
+ add_sectname("", ".debug_abbrev");
+ add_sectname("", ".debug_line");
+ add_sectname(".rela", ".debug_line");
+ add_sectname("", ".debug_frame");
+ add_sectname("", ".debug_loc");
+ }
+
+ /*
+ * Output the ELF header.
+ */
+ if (is_elf32() || is_elfx32()) {
+ Elf32_Ehdr ehdr;
+
+ nasm_zero(ehdr.e_ident);
+ memcpy(ehdr.e_ident, ELFMAG, SELFMAG);
+ ehdr.e_ident[EI_CLASS] = ELFCLASS32;
+ ehdr.e_ident[EI_DATA] = ELFDATA2LSB;
+ ehdr.e_ident[EI_VERSION] = EV_CURRENT;
+ ehdr.e_ident[EI_OSABI] = elf_osabi;
+ ehdr.e_ident[EI_ABIVERSION] = elf_abiver;
+
+ ehdr.e_type = cpu_to_le16(ET_REL);
+ ehdr.e_machine = cpu_to_le16(is_elf32() ? EM_386 : EM_X86_64);
+ ehdr.e_version = cpu_to_le16(EV_CURRENT);
+ ehdr.e_entry = 0;
+ ehdr.e_phoff = 0;
+ ehdr.e_shoff = sizeof(Elf64_Ehdr);
+ ehdr.e_flags = 0;
+ ehdr.e_ehsize = cpu_to_le16(sizeof(Elf32_Ehdr));
+ ehdr.e_phentsize = 0;
+ ehdr.e_phnum = 0;
+ ehdr.e_shentsize = cpu_to_le16(sizeof(Elf32_Shdr));
+ ehdr.e_shnum = cpu_to_le16(nsections);
+ ehdr.e_shstrndx = cpu_to_le16(sec_shstrtab);
+
+ nasm_write(&ehdr, sizeof(ehdr), ofile);
+ fwritezero(sizeof(Elf64_Ehdr) - sizeof(Elf32_Ehdr), ofile);
+ } else {
+ Elf64_Ehdr ehdr;
+
+ nasm_assert(is_elf64());
+
+ nasm_zero(ehdr.e_ident);
+ memcpy(ehdr.e_ident, ELFMAG, SELFMAG);
+ ehdr.e_ident[EI_CLASS] = ELFCLASS64;
+ ehdr.e_ident[EI_DATA] = ELFDATA2LSB;
+ ehdr.e_ident[EI_VERSION] = EV_CURRENT;
+ ehdr.e_ident[EI_OSABI] = elf_osabi;
+ ehdr.e_ident[EI_ABIVERSION] = elf_abiver;
+
+ ehdr.e_type = cpu_to_le16(ET_REL);
+ ehdr.e_machine = cpu_to_le16(EM_X86_64);
+ ehdr.e_version = cpu_to_le16(EV_CURRENT);
+ ehdr.e_entry = 0;
+ ehdr.e_phoff = 0;
+ ehdr.e_shoff = sizeof(Elf64_Ehdr);
+ ehdr.e_flags = 0;
+ ehdr.e_ehsize = cpu_to_le16(sizeof(Elf64_Ehdr));
+ ehdr.e_phentsize = 0;
+ ehdr.e_phnum = 0;
+ ehdr.e_shentsize = cpu_to_le16(sizeof(Elf64_Shdr));
+ ehdr.e_shnum = cpu_to_le16(nsections);
+ ehdr.e_shstrndx = cpu_to_le16(sec_shstrtab);
+
+ nasm_write(&ehdr, sizeof(ehdr), ofile);
+ }
+
+ /*
+ * Build the symbol table and relocation tables.
+ */
+ symtab = elf_build_symtab(&symtablen, &symtablocal);
+ for (i = 0; i < nsects; i++)
+ if (sects[i]->head)
+ sects[i]->rel = elf_build_reltab(&sects[i]->rellen,
+ sects[i]->head);
+
+ /*
+ * Now output the section header table.
+ */
+
+ elf_foffs = sizeof(Elf64_Ehdr) + (is_elf64() ? sizeof(Elf64_Shdr): sizeof(Elf32_Shdr)) * nsections;
+ align = ALIGN(elf_foffs, SEC_FILEALIGN) - elf_foffs;
+ elf_foffs += align;
+ elf_nsect = 0;
+ elf_sects = nasm_malloc(sizeof(*elf_sects) * nsections);
+
+ /* SHN_UNDEF */
+ elf_section_header(0, SHT_NULL, 0, NULL, false, 0, SHN_UNDEF, 0, 0, 0);
+ p = shstrtab + 1;
+
+ /* The normal sections */
+ for (i = 0; i < nsects; i++) {
+ elf_section_header(p - shstrtab, sects[i]->type, sects[i]->flags,
+ (sects[i]->type == SHT_PROGBITS ?
+ sects[i]->data : NULL), true,
+ sects[i]->len, 0, 0, sects[i]->align, 0);
+ p += strlen(p) + 1;
+ }
+
+ /* .shstrtab */
+ elf_section_header(p - shstrtab, SHT_STRTAB, 0, shstrtab, false,
+ shstrtablen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ /* .symtab */
+ if (is_elf64())
+ elf_section_header(p - shstrtab, SHT_SYMTAB, 0, symtab, true,
+ symtablen, sec_strtab, symtablocal, 8, 24);
+ else
+ elf_section_header(p - shstrtab, SHT_SYMTAB, 0, symtab, true,
+ symtablen, sec_strtab, symtablocal, 4, 16);
+ p += strlen(p) + 1;
+
+ /* .strtab */
+ elf_section_header(p - shstrtab, SHT_STRTAB, 0, strs, true,
+ strslen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ /* The relocation sections */
+ if (is_elf32()) {
+ for (i = 0; i < nsects; i++) {
+ if (sects[i]->head) {
+ elf_section_header(p - shstrtab, SHT_REL, 0, sects[i]->rel, true,
+ sects[i]->rellen, sec_symtab, i + 1, 4, 8);
+ p += strlen(p) + 1;
+ }
+ }
+ } else if (is_elfx32()) {
+ for (i = 0; i < nsects; i++) {
+ if (sects[i]->head) {
+ elf_section_header(p - shstrtab, SHT_RELA, 0, sects[i]->rel, true,
+ sects[i]->rellen, sec_symtab, i + 1, 4, 12);
+ p += strlen(p) + 1;
+ }
+ }
+ } else {
+ nasm_assert(is_elf64());
+ for (i = 0; i < nsects; i++) {
+ if (sects[i]->head) {
+ elf_section_header(p - shstrtab, SHT_RELA, 0, sects[i]->rel, true,
+ sects[i]->rellen, sec_symtab, i + 1, 8, 24);
+ p += strlen(p) + 1;
+ }
+ }
+ }
+
+ if (dfmt_is_stabs()) {
+ /* for debugging information, create the last three sections
+ which are the .stab , .stabstr and .rel.stab sections respectively */
+
+ /* this function call creates the stab sections in memory */
+ stabs_generate();
+
+ if (stabbuf && stabstrbuf && stabrelbuf) {
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, stabbuf, false,
+ stablen, sec_stabstr, 0, 4, 12);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_STRTAB, 0, stabstrbuf, false,
+ stabstrlen, 0, 0, 4, 0);
+ p += strlen(p) + 1;
+
+ /* link -> symtable info -> section to refer to */
+ if (is_elf32()) {
+ elf_section_header(p - shstrtab, SHT_REL, 0, stabrelbuf, false,
+ stabrellen, sec_symtab, sec_stab, 4, 8);
+ } else {
+ elf_section_header(p - shstrtab, SHT_RELA, 0, stabrelbuf, false,
+ stabrellen, sec_symtab, sec_stab, 4, is_elf64() ? 24 : 12);
+ }
+ p += strlen(p) + 1;
+ }
+ } else if (dfmt_is_dwarf()) {
+ /* for dwarf debugging information, create the ten dwarf sections */
+
+ /* this function call creates the dwarf sections in memory */
+ if (dwarf_fsect)
+ dwarf_generate();
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, arangesbuf, false,
+ arangeslen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_RELA, 0, arangesrelbuf, false,
+ arangesrellen, sec_symtab,
+ is_elf64() ? debug_aranges : sec_debug_aranges,
+ 1, is_elf64() ? 24 : 12);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, pubnamesbuf,
+ false, pubnameslen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, infobuf, false,
+ infolen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_RELA, 0, inforelbuf, false,
+ inforellen, sec_symtab,
+ is_elf64() ? debug_info : sec_debug_info,
+ 1, is_elf64() ? 24 : 12);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, abbrevbuf, false,
+ abbrevlen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, linebuf, false,
+ linelen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_RELA, 0, linerelbuf, false,
+ linerellen, sec_symtab,
+ is_elf64() ? debug_line : sec_debug_line,
+ 1, is_elf64() ? 24 : 12);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, framebuf, false,
+ framelen, 0, 0, 8, 0);
+ p += strlen(p) + 1;
+
+ elf_section_header(p - shstrtab, SHT_PROGBITS, 0, locbuf, false,
+ loclen, 0, 0, 1, 0);
+ p += strlen(p) + 1;
+ }
+ fwritezero(align, ofile);
+
+ /*
+ * Now output the sections.
+ */
+ elf_write_sections();
+
+ nasm_free(elf_sects);
+ saa_free(symtab);
+}
+
+static struct SAA *elf_build_symtab(int32_t *len, int32_t *local)
+{
+ struct SAA *s = saa_init(1L);
+ struct elf_symbol *sym;
+ int i;
+
+ size_t usize = is_elf64() ? sizeof(Elf64_Sym) : sizeof(Elf32_Sym);
+ union {
+ Elf32_Sym sym32;
+ Elf64_Sym sym64;
+ } u;
+
+ *len = *local = 0;
+
+ /*
+ * Zero symbol first as required by spec.
+ */
+ saa_wbytes(s, NULL, usize);
+ *len += usize;
+ (*local)++;
+
+ /*
+ * Next, an entry for the file name.
+ */
+ if (is_elf64()) {
+ u.sym64.st_name = cpu_to_le32(1);
+ u.sym64.st_info = ELF64_ST_INFO(STB_LOCAL, STT_FILE);
+ u.sym64.st_other = 0;
+ u.sym64.st_shndx = cpu_to_le16(SHN_ABS);
+ u.sym64.st_value = 0;
+ u.sym64.st_size = 0;
+ } else {
+ u.sym32.st_name = cpu_to_le32(1);
+ u.sym32.st_value = 0;
+ u.sym32.st_size = 0;
+ u.sym32.st_info = ELF32_ST_INFO(STB_LOCAL, STT_FILE);
+ u.sym32.st_other = 0;
+ u.sym32.st_shndx = cpu_to_le16(SHN_ABS);
+ }
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+
+
+ /*
+ * Now some standard symbols defining the segments, for relocation
+ * purposes.
+ */
+ if (is_elf64()) {
+ u.sym64.st_name = 0;
+ u.sym64.st_other = 0;
+ u.sym64.st_value = 0;
+ u.sym64.st_size = 0;
+ for (i = 1; i <= nsects; i++) {
+ u.sym64.st_info = ELF64_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym64.st_shndx = cpu_to_le16(i);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ } else {
+ u.sym32.st_name = 0;
+ u.sym32.st_value = 0;
+ u.sym32.st_size = 0;
+ u.sym32.st_other = 0;
+ for (i = 1; i <= nsects; i++) {
+ u.sym32.st_info = ELF32_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym32.st_shndx = cpu_to_le16(i);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ }
+
+ /*
+ * Now the other local symbols.
+ */
+ saa_rewind(syms);
+ if (is_elf64()) {
+ while ((sym = saa_rstruct(syms))) {
+ if (sym->type & SYM_GLOBAL)
+ continue;
+ u.sym64.st_name = cpu_to_le32(sym->strpos);
+ u.sym64.st_info = sym->type;
+ u.sym64.st_other = sym->other;
+ u.sym64.st_shndx = cpu_to_le16(sym->section);
+ u.sym64.st_value = cpu_to_le64(sym->symv.key);
+ u.sym64.st_size = cpu_to_le64(sym->size);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ /*
+ * dwarf needs symbols for debug sections
+ * which are relocation targets.
+ */
+ if (dfmt_is_dwarf()) {
+ dwarf_infosym = *local;
+ u.sym64.st_name = 0;
+ u.sym64.st_info = ELF64_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym64.st_other = 0;
+ u.sym64.st_shndx = cpu_to_le16(debug_info);
+ u.sym64.st_value = 0;
+ u.sym64.st_size = 0;
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ dwarf_abbrevsym = *local;
+ u.sym64.st_name = 0;
+ u.sym64.st_info = ELF64_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym64.st_other = 0;
+ u.sym64.st_shndx = cpu_to_le16(debug_abbrev);
+ u.sym64.st_value = 0;
+ u.sym64.st_size = 0;
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ dwarf_linesym = *local;
+ u.sym64.st_name = 0;
+ u.sym64.st_info = ELF64_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym64.st_other = 0;
+ u.sym64.st_shndx = cpu_to_le16(debug_line);
+ u.sym64.st_value = 0;
+ u.sym64.st_size = 0;
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ } else {
+ while ((sym = saa_rstruct(syms))) {
+ if (sym->type & SYM_GLOBAL)
+ continue;
+ u.sym32.st_name = cpu_to_le32(sym->strpos);
+ u.sym32.st_value = cpu_to_le32(sym->symv.key);
+ u.sym32.st_size = cpu_to_le32(sym->size);
+ u.sym32.st_info = sym->type;
+ u.sym32.st_other = sym->other;
+ u.sym32.st_shndx = cpu_to_le16(sym->section);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ /*
+ * dwarf needs symbols for debug sections
+ * which are relocation targets.
+ */
+ if (dfmt_is_dwarf()) {
+ dwarf_infosym = *local;
+ u.sym32.st_name = 0;
+ u.sym32.st_value = 0;
+ u.sym32.st_size = 0;
+ u.sym32.st_info = ELF32_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym32.st_other = 0;
+ u.sym32.st_shndx = cpu_to_le16(sec_debug_info);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ dwarf_abbrevsym = *local;
+ u.sym32.st_name = 0;
+ u.sym32.st_value = 0;
+ u.sym32.st_size = 0;
+ u.sym32.st_info = ELF32_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym32.st_other = 0;
+ u.sym32.st_shndx = cpu_to_le16(sec_debug_abbrev);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ dwarf_linesym = *local;
+ u.sym32.st_name = 0;
+ u.sym32.st_value = 0;
+ u.sym32.st_size = 0;
+ u.sym32.st_info = ELF32_ST_INFO(STB_LOCAL, STT_SECTION);
+ u.sym32.st_other = 0;
+ u.sym32.st_shndx = cpu_to_le16(sec_debug_line);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ (*local)++;
+ }
+ }
+
+ /*
+ * Now the global symbols.
+ */
+ saa_rewind(syms);
+ if (is_elf64()) {
+ while ((sym = saa_rstruct(syms))) {
+ if (!(sym->type & SYM_GLOBAL))
+ continue;
+ u.sym64.st_name = cpu_to_le32(sym->strpos);
+ u.sym64.st_info = sym->type;
+ u.sym64.st_other = sym->other;
+ u.sym64.st_shndx = cpu_to_le16(sym->section);
+ u.sym64.st_value = cpu_to_le64(sym->symv.key);
+ u.sym64.st_size = cpu_to_le64(sym->size);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ }
+ } else {
+ while ((sym = saa_rstruct(syms))) {
+ if (!(sym->type & SYM_GLOBAL))
+ continue;
+ u.sym32.st_name = cpu_to_le32(sym->strpos);
+ u.sym32.st_value = cpu_to_le32(sym->symv.key);
+ u.sym32.st_size = cpu_to_le32(sym->size);
+ u.sym32.st_info = sym->type;
+ u.sym32.st_other = sym->other;
+ u.sym32.st_shndx = cpu_to_le16(sym->section);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+ }
+ }
+
+ return s;
+}
+
+static struct SAA *elf_build_reltab(uint64_t *len, struct elf_reloc *r)
+{
+ struct SAA *s;
+ int32_t global_offset;
+
+ size_t usize = is_elf64() ? sizeof(Elf64_Rela) :
+ (is_elfx32() ? sizeof(Elf32_Rela) : sizeof(Elf32_Rel));
+ union {
+ Elf32_Rel rel32;
+ Elf32_Rela rela32;
+ Elf64_Rela rela64;
+ } u;
+
+ if (!r)
+ return NULL;
+
+ s = saa_init(1L);
+ *len = 0;
+
+ /*
+ * How to onvert from a global placeholder to a real symbol index;
+ * the +2 refers to the two special entries, the null entry and
+ * the filename entry.
+ */
+ global_offset = -GLOBAL_TEMP_BASE + nsects + nlocals + ndebugs + 2;
+
+ if (is_elf32()) {
+ while (r) {
+ int32_t sym = r->symbol;
+
+ if (sym >= GLOBAL_TEMP_BASE)
+ sym += global_offset;
+
+ u.rel32.r_offset = cpu_to_le32(r->address);
+ u.rel32.r_info = cpu_to_le32(ELF32_R_INFO(sym, r->type));
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+
+ r = r->next;
+ }
+ } else if (is_elfx32()) {
+ while (r) {
+ int32_t sym = r->symbol;
+
+ if (sym >= GLOBAL_TEMP_BASE)
+ sym += global_offset;
+
+ u.rela32.r_offset = cpu_to_le32(r->address);
+ u.rela32.r_info = cpu_to_le32(ELF32_R_INFO(sym, r->type));
+ u.rela32.r_addend = cpu_to_le32(r->offset);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+
+ r = r->next;
+ }
+ } else {
+ nasm_assert(is_elf64());
+ while (r) {
+ int32_t sym = r->symbol;
+
+ if (sym >= GLOBAL_TEMP_BASE)
+ sym += global_offset;
+
+ u.rela64.r_offset = cpu_to_le64(r->address);
+ u.rela64.r_info = cpu_to_le64(ELF64_R_INFO(sym, r->type));
+ u.rela64.r_addend = cpu_to_le64(r->offset);
+ saa_wbytes(s, &u, usize);
+ *len += usize;
+
+ r = r->next;
+ }
+ }
+
+ return s;
+}
+
+static void elf_section_header(int name, int type, uint64_t flags,
+ void *data, bool is_saa, uint64_t datalen,
+ int link, int info, int align, int eltsize)
+{
+ union {
+ Elf32_Shdr shdr32;
+ Elf64_Shdr shdr64;
+ } shdr;
+
+ elf_sects[elf_nsect].data = data;
+ elf_sects[elf_nsect].len = datalen;
+ elf_sects[elf_nsect].is_saa = is_saa;
+ elf_nsect++;
+
+ if (is_elf32() || is_elfx32()) {
+ shdr.shdr32.sh_name = cpu_to_le32(name);
+ shdr.shdr32.sh_type = cpu_to_le32(type);
+ shdr.shdr32.sh_flags = cpu_to_le32(flags);
+ shdr.shdr32.sh_addr = 0;
+ shdr.shdr32.sh_offset = cpu_to_le32(type == SHT_NULL ? 0 : elf_foffs);
+ shdr.shdr32.sh_size = cpu_to_le32(datalen);
+ if (data)
+ elf_foffs += ALIGN(datalen, SEC_FILEALIGN);
+ shdr.shdr32.sh_link = cpu_to_le32(link);
+ shdr.shdr32.sh_info = cpu_to_le32(info);
+ shdr.shdr32.sh_addralign = cpu_to_le32(align);
+ shdr.shdr32.sh_entsize = cpu_to_le32(eltsize);
+ } else {
+ nasm_assert(is_elf64());
+
+ shdr.shdr64.sh_name = cpu_to_le32(name);
+ shdr.shdr64.sh_type = cpu_to_le32(type);
+ shdr.shdr64.sh_flags = cpu_to_le64(flags);
+ shdr.shdr64.sh_addr = 0;
+ shdr.shdr64.sh_offset = cpu_to_le64(type == SHT_NULL ? 0 : elf_foffs);
+ shdr.shdr64.sh_size = cpu_to_le32(datalen);
+ if (data)
+ elf_foffs += ALIGN(datalen, SEC_FILEALIGN);
+ shdr.shdr64.sh_link = cpu_to_le32(link);
+ shdr.shdr64.sh_info = cpu_to_le32(info);
+ shdr.shdr64.sh_addralign = cpu_to_le64(align);
+ shdr.shdr64.sh_entsize = cpu_to_le64(eltsize);
+ }
+
+ nasm_write(&shdr, is_elf64() ? sizeof(shdr.shdr64) : sizeof(shdr.shdr32), ofile);
+}
+
+static void elf_write_sections(void)
+{
+ int i;
+ for (i = 0; i < elf_nsect; i++)
+ if (elf_sects[i].data) {
+ int32_t len = elf_sects[i].len;
+ int32_t reallen = ALIGN(len, SEC_FILEALIGN);
+ int32_t align = reallen - len;
+ if (elf_sects[i].is_saa)
+ saa_fpwrite(elf_sects[i].data, ofile);
+ else
+ nasm_write(elf_sects[i].data, len, ofile);
+ fwritezero(align, ofile);
+ }
+}
+
+static void elf_sect_write(struct elf_section *sect, const void *data, size_t len)
+{
+ saa_wbytes(sect->data, data, len);
+ sect->len += len;
+}
+
+static void elf_sect_writeaddr(struct elf_section *sect, int64_t data, size_t len)
+{
+ saa_writeaddr(sect->data, data, len);
+ sect->len += len;
+}
+
+static void elf_sectalign(int32_t seg, unsigned int value)
+{
+ struct elf_section *s = NULL;
+ int i;
+
+ for (i = 0; i < nsects; i++) {
+ if (sects[i]->index == seg) {
+ s = sects[i];
+ break;
+ }
+ }
+ if (!s || !is_power2(value))
+ return;
+
+ if (value > s->align)
+ s->align = value;
+}
+
+extern macros_t elf_stdmac[];
+
+/* Claim "elf" as a pragma namespace, for the future */
+static const struct pragma_facility elf_pragma_list[] =
+{
+ { "elf", NULL },
+ { NULL, NULL } /* Implements the canonical output name */
+};
+
+
+static const struct dfmt elf32_df_dwarf = {
+ "ELF32 (i386) dwarf debug format for Linux/Unix",
+ "dwarf",
+ dwarf_init,
+ dwarf_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ dwarf_output,
+ dwarf_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt elf32_df_stabs = {
+ "ELF32 (i386) stabs debug format for Linux/Unix",
+ "stabs",
+ null_debug_init,
+ stabs_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ stabs_output,
+ stabs_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt * const elf32_debugs_arr[3] =
+ { &elf32_df_dwarf, &elf32_df_stabs, NULL };
+
+const struct ofmt of_elf32 = {
+ "ELF32 (i386) object files (e.g. Linux)",
+ "elf32",
+ ".o",
+ 0,
+ 32,
+ elf32_debugs_arr,
+ &elf32_df_stabs,
+ elf_stdmac,
+ elf_init,
+ null_reset,
+ nasm_do_legacy_output,
+ elf32_out,
+ elf_deflabel,
+ elf_section_names,
+ NULL,
+ elf_sectalign,
+ null_segbase,
+ elf_directive,
+ elf_cleanup,
+ elf_pragma_list,
+};
+
+static const struct dfmt elf64_df_dwarf = {
+ "ELF64 (x86-64) dwarf debug format for Linux/Unix",
+ "dwarf",
+ dwarf_init,
+ dwarf_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ dwarf_output,
+ dwarf_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt elf64_df_stabs = {
+ "ELF64 (x86-64) stabs debug format for Linux/Unix",
+ "stabs",
+ null_debug_init,
+ stabs_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ stabs_output,
+ stabs_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt * const elf64_debugs_arr[3] =
+ { &elf64_df_dwarf, &elf64_df_stabs, NULL };
+
+const struct ofmt of_elf64 = {
+ "ELF64 (x86_64) object files (e.g. Linux)",
+ "elf64",
+ ".o",
+ 0,
+ 64,
+ elf64_debugs_arr,
+ &elf64_df_stabs,
+ elf_stdmac,
+ elf_init,
+ null_reset,
+ nasm_do_legacy_output,
+ elf64_out,
+ elf_deflabel,
+ elf_section_names,
+ NULL,
+ elf_sectalign,
+ null_segbase,
+ elf_directive,
+ elf_cleanup,
+ elf_pragma_list,
+};
+
+static const struct dfmt elfx32_df_dwarf = {
+ "ELFX32 (x86-64) dwarf debug format for Linux/Unix",
+ "dwarf",
+ dwarf_init,
+ dwarf_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ dwarf_output,
+ dwarf_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt elfx32_df_stabs = {
+ "ELFX32 (x86-64) stabs debug format for Linux/Unix",
+ "stabs",
+ null_debug_init,
+ stabs_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ debug_typevalue,
+ stabs_output,
+ stabs_cleanup,
+ elf_pragma_list,
+};
+
+static const struct dfmt * const elfx32_debugs_arr[3] =
+ { &elfx32_df_dwarf, &elfx32_df_stabs, NULL };
+
+const struct ofmt of_elfx32 = {
+ "ELFX32 (x86_64) object files (e.g. Linux)",
+ "elfx32",
+ ".o",
+ 0,
+ 64,
+ elfx32_debugs_arr,
+ &elfx32_df_stabs,
+ elf_stdmac,
+ elf_init,
+ null_reset,
+ nasm_do_legacy_output,
+ elfx32_out,
+ elf_deflabel,
+ elf_section_names,
+ NULL,
+ elf_sectalign,
+ null_segbase,
+ elf_directive,
+ elf_cleanup,
+ NULL /* pragma list */
+};
+
+static bool is_elf64(void)
+{
+ return ofmt == &of_elf64;
+}
+
+static bool is_elf32(void)
+{
+ return ofmt == &of_elf32;
+}
+
+static bool is_elfx32(void)
+{
+ return ofmt == &of_elfx32;
+}
+
+static bool dfmt_is_stabs(void)
+{
+ return dfmt == &elf32_df_stabs ||
+ dfmt == &elfx32_df_stabs ||
+ dfmt == &elf64_df_stabs;
+}
+
+static bool dfmt_is_dwarf(void)
+{
+ return dfmt == &elf32_df_dwarf ||
+ dfmt == &elfx32_df_dwarf ||
+ dfmt == &elf64_df_dwarf;
+}
+
+/* common debugging routines */
+static void debug_typevalue(int32_t type)
+{
+ int32_t stype, ssize;
+ switch (TYM_TYPE(type)) {
+ case TY_LABEL:
+ ssize = 0;
+ stype = STT_NOTYPE;
+ break;
+ case TY_BYTE:
+ ssize = 1;
+ stype = STT_OBJECT;
+ break;
+ case TY_WORD:
+ ssize = 2;
+ stype = STT_OBJECT;
+ break;
+ case TY_DWORD:
+ ssize = 4;
+ stype = STT_OBJECT;
+ break;
+ case TY_FLOAT:
+ ssize = 4;
+ stype = STT_OBJECT;
+ break;
+ case TY_QWORD:
+ ssize = 8;
+ stype = STT_OBJECT;
+ break;
+ case TY_TBYTE:
+ ssize = 10;
+ stype = STT_OBJECT;
+ break;
+ case TY_OWORD:
+ ssize = 16;
+ stype = STT_OBJECT;
+ break;
+ case TY_YWORD:
+ ssize = 32;
+ stype = STT_OBJECT;
+ break;
+ case TY_ZWORD:
+ ssize = 64;
+ stype = STT_OBJECT;
+ break;
+ case TY_COMMON:
+ ssize = 0;
+ stype = STT_COMMON;
+ break;
+ case TY_SEG:
+ ssize = 0;
+ stype = STT_SECTION;
+ break;
+ case TY_EXTERN:
+ ssize = 0;
+ stype = STT_NOTYPE;
+ break;
+ case TY_EQU:
+ ssize = 0;
+ stype = STT_NOTYPE;
+ break;
+ default:
+ ssize = 0;
+ stype = STT_NOTYPE;
+ break;
+ }
+ if (stype == STT_OBJECT && lastsym && !lastsym->type) {
+ lastsym->size = ssize;
+ lastsym->type = stype;
+ }
+}
+
+/* stabs debugging routines */
+
+static void stabs_linenum(const char *filename, int32_t linenumber, int32_t segto)
+{
+ (void)segto;
+ if (!stabs_filename) {
+ stabs_filename = nasm_malloc(strlen(filename) + 1);
+ strcpy(stabs_filename, filename);
+ } else {
+ if (strcmp(stabs_filename, filename)) {
+ /* yep, a memory leak...this program is one-shot anyway, so who cares...
+ in fact, this leak comes in quite handy to maintain a list of files
+ encountered so far in the symbol lines... */
+
+ /* why not nasm_free(stabs_filename); we're done with the old one */
+
+ stabs_filename = nasm_malloc(strlen(filename) + 1);
+ strcpy(stabs_filename, filename);
+ }
+ }
+ debug_immcall = 1;
+ currentline = linenumber;
+}
+
+static void stabs_output(int type, void *param)
+{
+ struct symlininfo *s;
+ struct linelist *el;
+ if (type == TY_DEBUGSYMLIN) {
+ if (debug_immcall) {
+ s = (struct symlininfo *)param;
+ if (!(sects[s->section]->flags & SHF_EXECINSTR))
+ return; /* line info is only collected for executable sections */
+ numlinestabs++;
+ el = nasm_malloc(sizeof(struct linelist));
+ el->info.offset = s->offset;
+ el->info.section = s->section;
+ el->info.name = s->name;
+ el->line = currentline;
+ el->filename = stabs_filename;
+ el->next = 0;
+ if (stabslines) {
+ stabslines->last->next = el;
+ stabslines->last = el;
+ } else {
+ stabslines = el;
+ stabslines->last = el;
+ }
+ }
+ }
+ debug_immcall = 0;
+}
+
+/* for creating the .stab , .stabstr and .rel.stab sections in memory */
+
+static void stabs_generate(void)
+{
+ int i, numfiles, strsize, numstabs = 0, currfile, mainfileindex;
+ uint8_t *sbuf, *ssbuf, *rbuf, *sptr, *rptr;
+ char **allfiles;
+ int *fileidx;
+
+ struct linelist *ptr;
+
+ ptr = stabslines;
+
+ allfiles = nasm_zalloc(numlinestabs * sizeof(char *));
+ numfiles = 0;
+ while (ptr) {
+ if (numfiles == 0) {
+ allfiles[0] = ptr->filename;
+ numfiles++;
+ } else {
+ for (i = 0; i < numfiles; i++) {
+ if (!strcmp(allfiles[i], ptr->filename))
+ break;
+ }
+ if (i >= numfiles) {
+ allfiles[i] = ptr->filename;
+ numfiles++;
+ }
+ }
+ ptr = ptr->next;
+ }
+ strsize = 1;
+ fileidx = nasm_malloc(numfiles * sizeof(int));
+ for (i = 0; i < numfiles; i++) {
+ fileidx[i] = strsize;
+ strsize += strlen(allfiles[i]) + 1;
+ }
+ currfile = mainfileindex = 0;
+ for (i = 0; i < numfiles; i++) {
+ if (!strcmp(allfiles[i], elf_module)) {
+ currfile = mainfileindex = i;
+ break;
+ }
+ }
+
+ /*
+ * worst case size of the stab buffer would be:
+ * the sourcefiles changes each line, which would mean 1 SOL, 1 SYMLIN per line
+ * plus one "ending" entry
+ */
+ sbuf = nasm_malloc((numlinestabs * 2 + 4) *
+ sizeof(struct stabentry));
+ ssbuf = nasm_malloc(strsize);
+ rbuf = nasm_malloc(numlinestabs * (is_elf64() ? 16 : 8) * (2 + 3));
+ rptr = rbuf;
+
+ for (i = 0; i < numfiles; i++)
+ strcpy((char *)ssbuf + fileidx[i], allfiles[i]);
+ ssbuf[0] = 0;
+
+ stabstrlen = strsize; /* set global variable for length of stab strings */
+
+ sptr = sbuf;
+ ptr = stabslines;
+ numstabs = 0;
+
+ if (ptr) {
+ /*
+ * this is the first stab, its strx points to the filename of the
+ * the source-file, the n_desc field should be set to the number
+ * of remaining stabs
+ */
+ WRITE_STAB(sptr, fileidx[0], 0, 0, 0, stabstrlen);
+
+ /* this is the stab for the main source file */
+ WRITE_STAB(sptr, fileidx[mainfileindex], N_SO, 0, 0, 0);
+
+ /* relocation table entry */
+
+ /*
+ * Since the symbol table has two entries before
+ * the section symbols, the index in the info.section
+ * member must be adjusted by adding 2
+ */
+
+ if (is_elf32()) {
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_386_32);
+ } else if (is_elfx32()) {
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
+ WRITELONG(rptr, 0);
+ } else {
+ nasm_assert(is_elf64());
+ WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
+ WRITELONG(rptr, R_X86_64_32);
+ WRITELONG(rptr, ptr->info.section + 2);
+ WRITEDLONG(rptr, 0);
+ }
+ numstabs++;
+ }
+
+ if (is_elf32()) {
+ while (ptr) {
+ if (strcmp(allfiles[currfile], ptr->filename)) {
+ /* oops file has changed... */
+ for (i = 0; i < numfiles; i++)
+ if (!strcmp(allfiles[i], ptr->filename))
+ break;
+ currfile = i;
+ WRITE_STAB(sptr, fileidx[currfile], N_SOL, 0, 0,
+ ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_386_32);
+ }
+
+ WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_386_32);
+
+ ptr = ptr->next;
+ }
+ } else if (is_elfx32()) {
+ while (ptr) {
+ if (strcmp(allfiles[currfile], ptr->filename)) {
+ /* oops file has changed... */
+ for (i = 0; i < numfiles; i++)
+ if (!strcmp(allfiles[i], ptr->filename))
+ break;
+ currfile = i;
+ WRITE_STAB(sptr, fileidx[currfile], N_SOL, 0, 0,
+ ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
+ WRITELONG(rptr, ptr->info.offset);
+ }
+
+ WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITELONG(rptr, (sptr - sbuf) - 4);
+ WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
+ WRITELONG(rptr, ptr->info.offset);
+
+ ptr = ptr->next;
+ }
+ } else {
+ nasm_assert(is_elf64());
+ while (ptr) {
+ if (strcmp(allfiles[currfile], ptr->filename)) {
+ /* oops file has changed... */
+ for (i = 0; i < numfiles; i++)
+ if (!strcmp(allfiles[i], ptr->filename))
+ break;
+ currfile = i;
+ WRITE_STAB(sptr, fileidx[currfile], N_SOL, 0, 0,
+ ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
+ WRITELONG(rptr, R_X86_64_32);
+ WRITELONG(rptr, ptr->info.section + 2);
+ WRITEDLONG(rptr, ptr->info.offset);
+ }
+
+ WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset);
+ numstabs++;
+
+ /* relocation table entry */
+ WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
+ WRITELONG(rptr, R_X86_64_32);
+ WRITELONG(rptr, ptr->info.section + 2);
+ WRITEDLONG(rptr, ptr->info.offset);
+
+ ptr = ptr->next;
+ }
+ }
+
+ /* this is an "ending" token */
+ WRITE_STAB(sptr, 0, N_SO, 0, 0, 0);
+ numstabs++;
+
+ ((struct stabentry *)sbuf)->n_desc = numstabs;
+
+ nasm_free(allfiles);
+ nasm_free(fileidx);
+
+ stablen = (sptr - sbuf);
+ stabrellen = (rptr - rbuf);
+ stabrelbuf = rbuf;
+ stabbuf = sbuf;
+ stabstrbuf = ssbuf;
+}
+
+static void stabs_cleanup(void)
+{
+ struct linelist *ptr, *del;
+ if (!stabslines)
+ return;
+
+ ptr = stabslines;
+ while (ptr) {
+ del = ptr;
+ ptr = ptr->next;
+ nasm_free(del);
+ }
+
+ nasm_free(stabbuf);
+ nasm_free(stabrelbuf);
+ nasm_free(stabstrbuf);
+}
+
+/* dwarf routines */
+
+static void dwarf_init(void)
+{
+ ndebugs = 3; /* 3 debug symbols */
+}
+
+static void dwarf_linenum(const char *filename, int32_t linenumber,
+ int32_t segto)
+{
+ (void)segto;
+ dwarf_findfile(filename);
+ debug_immcall = 1;
+ currentline = linenumber;
+}
+
+/* called from elf_out with type == TY_DEBUGSYMLIN */
+static void dwarf_output(int type, void *param)
+{
+ int ln, aa, inx, maxln, soc;
+ struct symlininfo *s;
+ struct SAA *plinep;
+
+ (void)type;
+
+ s = (struct symlininfo *)param;
+
+ /* line number info is only gathered for executable sections */
+ if (!(sects[s->section]->flags & SHF_EXECINSTR))
+ return;
+
+ /* Check if section index has changed */
+ if (!(dwarf_csect && (dwarf_csect->section) == (s->section)))
+ dwarf_findsect(s->section);
+
+ /* do nothing unless line or file has changed */
+ if (!debug_immcall)
+ return;
+
+ ln = currentline - dwarf_csect->line;
+ aa = s->offset - dwarf_csect->offset;
+ inx = dwarf_clist->line;
+ plinep = dwarf_csect->psaa;
+ /* check for file change */
+ if (!(inx == dwarf_csect->file)) {
+ saa_write8(plinep,DW_LNS_set_file);
+ saa_write8(plinep,inx);
+ dwarf_csect->file = inx;
+ }
+ /* check for line change */
+ if (ln) {
+ /* test if in range of special op code */
+ maxln = line_base + line_range;
+ soc = (ln - line_base) + (line_range * aa) + opcode_base;
+ if (ln >= line_base && ln < maxln && soc < 256) {
+ saa_write8(plinep,soc);
+ } else {
+ saa_write8(plinep,DW_LNS_advance_line);
+ saa_wleb128s(plinep,ln);
+ if (aa) {
+ saa_write8(plinep,DW_LNS_advance_pc);
+ saa_wleb128u(plinep,aa);
+ }
+ saa_write8(plinep,DW_LNS_copy);
+ }
+ dwarf_csect->line = currentline;
+ dwarf_csect->offset = s->offset;
+ }
+
+ /* show change handled */
+ debug_immcall = 0;
+}
+
+
+static void dwarf_generate(void)
+{
+ uint8_t *pbuf;
+ int indx;
+ struct linelist *ftentry;
+ struct SAA *paranges, *ppubnames, *pinfo, *pabbrev, *plines, *plinep;
+ struct SAA *parangesrel, *plinesrel, *pinforel;
+ struct sectlist *psect;
+ size_t saalen, linepoff, totlen, highaddr;
+
+ if (is_elf32()) {
+ /* write epilogues for each line program range */
+ /* and build aranges section */
+ paranges = saa_init(1L);
+ parangesrel = saa_init(1L);
+ saa_write16(paranges,2); /* dwarf version */
+ saa_write32(parangesrel, paranges->datalen+4);
+ saa_write32(parangesrel, (dwarf_infosym << 8) + R_386_32); /* reloc to info */
+ saa_write32(parangesrel, 0);
+ saa_write32(paranges,0); /* offset into info */
+ saa_write8(paranges,4); /* pointer size */
+ saa_write8(paranges,0); /* not segmented */
+ saa_write32(paranges,0); /* padding */
+ /* iterate though sectlist entries */
+ psect = dwarf_fsect;
+ totlen = 0;
+ highaddr = 0;
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ plinep = psect->psaa;
+ /* Line Number Program Epilogue */
+ saa_write8(plinep,2); /* std op 2 */
+ saa_write8(plinep,(sects[psect->section]->len)-psect->offset);
+ saa_write8(plinep,DW_LNS_extended_op);
+ saa_write8(plinep,1); /* operand length */
+ saa_write8(plinep,DW_LNE_end_sequence);
+ totlen += plinep->datalen;
+ /* range table relocation entry */
+ saa_write32(parangesrel, paranges->datalen + 4);
+ saa_write32(parangesrel, ((uint32_t) (psect->section + 2) << 8) + R_386_32);
+ saa_write32(parangesrel, (uint32_t) 0);
+ /* range table entry */
+ saa_write32(paranges,0x0000); /* range start */
+ saa_write32(paranges,sects[psect->section]->len); /* range length */
+ highaddr += sects[psect->section]->len;
+ /* done with this entry */
+ psect = psect->next;
+ }
+ saa_write32(paranges,0); /* null address */
+ saa_write32(paranges,0); /* null length */
+ saalen = paranges->datalen;
+ arangeslen = saalen + 4;
+ arangesbuf = pbuf = nasm_malloc(arangeslen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(paranges, pbuf, saalen);
+ saa_free(paranges);
+ } else if (is_elfx32()) {
+ /* write epilogues for each line program range */
+ /* and build aranges section */
+ paranges = saa_init(1L);
+ parangesrel = saa_init(1L);
+ saa_write16(paranges,3); /* dwarf version */
+ saa_write32(parangesrel, paranges->datalen+4);
+ saa_write32(parangesrel, (dwarf_infosym << 8) + R_X86_64_32); /* reloc to info */
+ saa_write32(parangesrel, 0);
+ saa_write32(paranges,0); /* offset into info */
+ saa_write8(paranges,4); /* pointer size */
+ saa_write8(paranges,0); /* not segmented */
+ saa_write32(paranges,0); /* padding */
+ /* iterate though sectlist entries */
+ psect = dwarf_fsect;
+ totlen = 0;
+ highaddr = 0;
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ plinep = psect->psaa;
+ /* Line Number Program Epilogue */
+ saa_write8(plinep,2); /* std op 2 */
+ saa_write8(plinep,(sects[psect->section]->len)-psect->offset);
+ saa_write8(plinep,DW_LNS_extended_op);
+ saa_write8(plinep,1); /* operand length */
+ saa_write8(plinep,DW_LNE_end_sequence);
+ totlen += plinep->datalen;
+ /* range table relocation entry */
+ saa_write32(parangesrel, paranges->datalen + 4);
+ saa_write32(parangesrel, ((uint32_t) (psect->section + 2) << 8) + R_X86_64_32);
+ saa_write32(parangesrel, (uint32_t) 0);
+ /* range table entry */
+ saa_write32(paranges,0x0000); /* range start */
+ saa_write32(paranges,sects[psect->section]->len); /* range length */
+ highaddr += sects[psect->section]->len;
+ /* done with this entry */
+ psect = psect->next;
+ }
+ saa_write32(paranges,0); /* null address */
+ saa_write32(paranges,0); /* null length */
+ saalen = paranges->datalen;
+ arangeslen = saalen + 4;
+ arangesbuf = pbuf = nasm_malloc(arangeslen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(paranges, pbuf, saalen);
+ saa_free(paranges);
+ } else {
+ nasm_assert(is_elf64());
+ /* write epilogues for each line program range */
+ /* and build aranges section */
+ paranges = saa_init(1L);
+ parangesrel = saa_init(1L);
+ saa_write16(paranges,3); /* dwarf version */
+ saa_write64(parangesrel, paranges->datalen+4);
+ saa_write64(parangesrel, (dwarf_infosym << 32) + R_X86_64_32); /* reloc to info */
+ saa_write64(parangesrel, 0);
+ saa_write32(paranges,0); /* offset into info */
+ saa_write8(paranges,8); /* pointer size */
+ saa_write8(paranges,0); /* not segmented */
+ saa_write32(paranges,0); /* padding */
+ /* iterate though sectlist entries */
+ psect = dwarf_fsect;
+ totlen = 0;
+ highaddr = 0;
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ plinep = psect->psaa;
+ /* Line Number Program Epilogue */
+ saa_write8(plinep,2); /* std op 2 */
+ saa_write8(plinep,(sects[psect->section]->len)-psect->offset);
+ saa_write8(plinep,DW_LNS_extended_op);
+ saa_write8(plinep,1); /* operand length */
+ saa_write8(plinep,DW_LNE_end_sequence);
+ totlen += plinep->datalen;
+ /* range table relocation entry */
+ saa_write64(parangesrel, paranges->datalen + 4);
+ saa_write64(parangesrel, ((uint64_t) (psect->section + 2) << 32) + R_X86_64_64);
+ saa_write64(parangesrel, (uint64_t) 0);
+ /* range table entry */
+ saa_write64(paranges,0x0000); /* range start */
+ saa_write64(paranges,sects[psect->section]->len); /* range length */
+ highaddr += sects[psect->section]->len;
+ /* done with this entry */
+ psect = psect->next;
+ }
+ saa_write64(paranges,0); /* null address */
+ saa_write64(paranges,0); /* null length */
+ saalen = paranges->datalen;
+ arangeslen = saalen + 4;
+ arangesbuf = pbuf = nasm_malloc(arangeslen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(paranges, pbuf, saalen);
+ saa_free(paranges);
+ }
+
+ /* build rela.aranges section */
+ arangesrellen = saalen = parangesrel->datalen;
+ arangesrelbuf = pbuf = nasm_malloc(arangesrellen);
+ saa_rnbytes(parangesrel, pbuf, saalen);
+ saa_free(parangesrel);
+
+ /* build pubnames section */
+ ppubnames = saa_init(1L);
+ saa_write16(ppubnames,3); /* dwarf version */
+ saa_write32(ppubnames,0); /* offset into info */
+ saa_write32(ppubnames,0); /* space used in info */
+ saa_write32(ppubnames,0); /* end of list */
+ saalen = ppubnames->datalen;
+ pubnameslen = saalen + 4;
+ pubnamesbuf = pbuf = nasm_malloc(pubnameslen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(ppubnames, pbuf, saalen);
+ saa_free(ppubnames);
+
+ if (is_elf32()) {
+ /* build info section */
+ pinfo = saa_init(1L);
+ pinforel = saa_init(1L);
+ saa_write16(pinfo,2); /* dwarf version */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, (dwarf_abbrevsym << 8) + R_386_32); /* reloc to abbrev */
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* offset into abbrev */
+ saa_write8(pinfo,4); /* pointer size */
+ saa_write8(pinfo,1); /* abbrviation number LEB128u */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_386_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_low_pc */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_386_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,highaddr); /* DW_AT_high_pc */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, (dwarf_linesym << 8) + R_386_32); /* reloc to line */
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_stmt_list */
+ saa_wbytes(pinfo, elf_module, strlen(elf_module)+1);
+ saa_wbytes(pinfo, nasm_signature, strlen(nasm_signature)+1);
+ saa_write16(pinfo,DW_LANG_Mips_Assembler);
+ saa_write8(pinfo,2); /* abbrviation number LEB128u */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_386_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_low_pc */
+ saa_write32(pinfo,0); /* DW_AT_frame_base */
+ saa_write8(pinfo,0); /* end of entries */
+ saalen = pinfo->datalen;
+ infolen = saalen + 4;
+ infobuf = pbuf = nasm_malloc(infolen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(pinfo, pbuf, saalen);
+ saa_free(pinfo);
+ } else if (is_elfx32()) {
+ /* build info section */
+ pinfo = saa_init(1L);
+ pinforel = saa_init(1L);
+ saa_write16(pinfo,3); /* dwarf version */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, (dwarf_abbrevsym << 8) + R_X86_64_32); /* reloc to abbrev */
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* offset into abbrev */
+ saa_write8(pinfo,4); /* pointer size */
+ saa_write8(pinfo,1); /* abbrviation number LEB128u */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_X86_64_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_low_pc */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_X86_64_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,highaddr); /* DW_AT_high_pc */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, (dwarf_linesym << 8) + R_X86_64_32); /* reloc to line */
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_stmt_list */
+ saa_wbytes(pinfo, elf_module, strlen(elf_module)+1);
+ saa_wbytes(pinfo, nasm_signature, strlen(nasm_signature)+1);
+ saa_write16(pinfo,DW_LANG_Mips_Assembler);
+ saa_write8(pinfo,2); /* abbrviation number LEB128u */
+ saa_write32(pinforel, pinfo->datalen + 4);
+ saa_write32(pinforel, ((dwarf_fsect->section + 2) << 8) + R_X86_64_32);
+ saa_write32(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_low_pc */
+ saa_write32(pinfo,0); /* DW_AT_frame_base */
+ saa_write8(pinfo,0); /* end of entries */
+ saalen = pinfo->datalen;
+ infolen = saalen + 4;
+ infobuf = pbuf = nasm_malloc(infolen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(pinfo, pbuf, saalen);
+ saa_free(pinfo);
+ } else {
+ nasm_assert(is_elf64());
+ /* build info section */
+ pinfo = saa_init(1L);
+ pinforel = saa_init(1L);
+ saa_write16(pinfo,3); /* dwarf version */
+ saa_write64(pinforel, pinfo->datalen + 4);
+ saa_write64(pinforel, (dwarf_abbrevsym << 32) + R_X86_64_32); /* reloc to abbrev */
+ saa_write64(pinforel, 0);
+ saa_write32(pinfo,0); /* offset into abbrev */
+ saa_write8(pinfo,8); /* pointer size */
+ saa_write8(pinfo,1); /* abbrviation number LEB128u */
+ saa_write64(pinforel, pinfo->datalen + 4);
+ saa_write64(pinforel, ((uint64_t)(dwarf_fsect->section + 2) << 32) + R_X86_64_64);
+ saa_write64(pinforel, 0);
+ saa_write64(pinfo,0); /* DW_AT_low_pc */
+ saa_write64(pinforel, pinfo->datalen + 4);
+ saa_write64(pinforel, ((uint64_t)(dwarf_fsect->section + 2) << 32) + R_X86_64_64);
+ saa_write64(pinforel, 0);
+ saa_write64(pinfo,highaddr); /* DW_AT_high_pc */
+ saa_write64(pinforel, pinfo->datalen + 4);
+ saa_write64(pinforel, (dwarf_linesym << 32) + R_X86_64_32); /* reloc to line */
+ saa_write64(pinforel, 0);
+ saa_write32(pinfo,0); /* DW_AT_stmt_list */
+ saa_wbytes(pinfo, elf_module, strlen(elf_module)+1);
+ saa_wbytes(pinfo, nasm_signature, strlen(nasm_signature)+1);
+ saa_write16(pinfo,DW_LANG_Mips_Assembler);
+ saa_write8(pinfo,2); /* abbrviation number LEB128u */
+ saa_write64(pinforel, pinfo->datalen + 4);
+ saa_write64(pinforel, ((uint64_t)(dwarf_fsect->section + 2) << 32) + R_X86_64_64);
+ saa_write64(pinforel, 0);
+ saa_write64(pinfo,0); /* DW_AT_low_pc */
+ saa_write64(pinfo,0); /* DW_AT_frame_base */
+ saa_write8(pinfo,0); /* end of entries */
+ saalen = pinfo->datalen;
+ infolen = saalen + 4;
+ infobuf = pbuf = nasm_malloc(infolen);
+ WRITELONG(pbuf,saalen); /* initial length */
+ saa_rnbytes(pinfo, pbuf, saalen);
+ saa_free(pinfo);
+ }
+
+ /* build rela.info section */
+ inforellen = saalen = pinforel->datalen;
+ inforelbuf = pbuf = nasm_malloc(inforellen);
+ saa_rnbytes(pinforel, pbuf, saalen);
+ saa_free(pinforel);
+
+ /* build abbrev section */
+ pabbrev = saa_init(1L);
+ saa_write8(pabbrev,1); /* entry number LEB128u */
+ saa_write8(pabbrev,DW_TAG_compile_unit); /* tag LEB128u */
+ saa_write8(pabbrev,1); /* has children */
+ /* the following attributes and forms are all LEB128u values */
+ saa_write8(pabbrev,DW_AT_low_pc);
+ saa_write8(pabbrev,DW_FORM_addr);
+ saa_write8(pabbrev,DW_AT_high_pc);
+ saa_write8(pabbrev,DW_FORM_addr);
+ saa_write8(pabbrev,DW_AT_stmt_list);
+ saa_write8(pabbrev,DW_FORM_data4);
+ saa_write8(pabbrev,DW_AT_name);
+ saa_write8(pabbrev,DW_FORM_string);
+ saa_write8(pabbrev,DW_AT_producer);
+ saa_write8(pabbrev,DW_FORM_string);
+ saa_write8(pabbrev,DW_AT_language);
+ saa_write8(pabbrev,DW_FORM_data2);
+ saa_write16(pabbrev,0); /* end of entry */
+ /* LEB128u usage same as above */
+ saa_write8(pabbrev,2); /* entry number */
+ saa_write8(pabbrev,DW_TAG_subprogram);
+ saa_write8(pabbrev,0); /* no children */
+ saa_write8(pabbrev,DW_AT_low_pc);
+ saa_write8(pabbrev,DW_FORM_addr);
+ saa_write8(pabbrev,DW_AT_frame_base);
+ saa_write8(pabbrev,DW_FORM_data4);
+ saa_write16(pabbrev,0); /* end of entry */
+ /* Terminal zero entry */
+ saa_write8(pabbrev,0);
+ abbrevlen = saalen = pabbrev->datalen;
+ abbrevbuf = pbuf = nasm_malloc(saalen);
+ saa_rnbytes(pabbrev, pbuf, saalen);
+ saa_free(pabbrev);
+
+ /* build line section */
+ /* prolog */
+ plines = saa_init(1L);
+ saa_write8(plines,1); /* Minimum Instruction Length */
+ saa_write8(plines,1); /* Initial value of 'is_stmt' */
+ saa_write8(plines,line_base); /* Line Base */
+ saa_write8(plines,line_range); /* Line Range */
+ saa_write8(plines,opcode_base); /* Opcode Base */
+ /* standard opcode lengths (# of LEB128u operands) */
+ saa_write8(plines,0); /* Std opcode 1 length */
+ saa_write8(plines,1); /* Std opcode 2 length */
+ saa_write8(plines,1); /* Std opcode 3 length */
+ saa_write8(plines,1); /* Std opcode 4 length */
+ saa_write8(plines,1); /* Std opcode 5 length */
+ saa_write8(plines,0); /* Std opcode 6 length */
+ saa_write8(plines,0); /* Std opcode 7 length */
+ saa_write8(plines,0); /* Std opcode 8 length */
+ saa_write8(plines,1); /* Std opcode 9 length */
+ saa_write8(plines,0); /* Std opcode 10 length */
+ saa_write8(plines,0); /* Std opcode 11 length */
+ saa_write8(plines,1); /* Std opcode 12 length */
+ /* Directory Table */
+ saa_write8(plines,0); /* End of table */
+ /* File Name Table */
+ ftentry = dwarf_flist;
+ for (indx = 0; indx < dwarf_numfiles; indx++) {
+ saa_wbytes(plines, ftentry->filename, (int32_t)(strlen(ftentry->filename) + 1));
+ saa_write8(plines,0); /* directory LEB128u */
+ saa_write8(plines,0); /* time LEB128u */
+ saa_write8(plines,0); /* size LEB128u */
+ ftentry = ftentry->next;
+ }
+ saa_write8(plines,0); /* End of table */
+ linepoff = plines->datalen;
+ linelen = linepoff + totlen + 10;
+ linebuf = pbuf = nasm_malloc(linelen);
+ WRITELONG(pbuf,linelen-4); /* initial length */
+ WRITESHORT(pbuf,3); /* dwarf version */
+ WRITELONG(pbuf,linepoff); /* offset to line number program */
+ /* write line header */
+ saalen = linepoff;
+ saa_rnbytes(plines, pbuf, saalen); /* read a given no. of bytes */
+ pbuf += linepoff;
+ saa_free(plines);
+ /* concatonate line program ranges */
+ linepoff += 13;
+ plinesrel = saa_init(1L);
+ psect = dwarf_fsect;
+ if (is_elf32()) {
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ saa_write32(plinesrel, linepoff);
+ saa_write32(plinesrel, ((uint32_t) (psect->section + 2) << 8) + R_386_32);
+ saa_write32(plinesrel, (uint32_t) 0);
+ plinep = psect->psaa;
+ saalen = plinep->datalen;
+ saa_rnbytes(plinep, pbuf, saalen);
+ pbuf += saalen;
+ linepoff += saalen;
+ saa_free(plinep);
+ /* done with this entry */
+ psect = psect->next;
+ }
+ } else if (is_elfx32()) {
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ saa_write32(plinesrel, linepoff);
+ saa_write32(plinesrel, ((psect->section + 2) << 8) + R_X86_64_32);
+ saa_write32(plinesrel, 0);
+ plinep = psect->psaa;
+ saalen = plinep->datalen;
+ saa_rnbytes(plinep, pbuf, saalen);
+ pbuf += saalen;
+ linepoff += saalen;
+ saa_free(plinep);
+ /* done with this entry */
+ psect = psect->next;
+ }
+ } else {
+ nasm_assert(is_elf64());
+ for (indx = 0; indx < dwarf_nsections; indx++) {
+ saa_write64(plinesrel, linepoff);
+ saa_write64(plinesrel, ((uint64_t) (psect->section + 2) << 32) + R_X86_64_64);
+ saa_write64(plinesrel, (uint64_t) 0);
+ plinep = psect->psaa;
+ saalen = plinep->datalen;
+ saa_rnbytes(plinep, pbuf, saalen);
+ pbuf += saalen;
+ linepoff += saalen;
+ saa_free(plinep);
+ /* done with this entry */
+ psect = psect->next;
+ }
+ }
+
+ /* build rela.lines section */
+ linerellen =saalen = plinesrel->datalen;
+ linerelbuf = pbuf = nasm_malloc(linerellen);
+ saa_rnbytes(plinesrel, pbuf, saalen);
+ saa_free(plinesrel);
+
+ /* build frame section */
+ framelen = 4;
+ framebuf = pbuf = nasm_malloc(framelen);
+ WRITELONG(pbuf,framelen-4); /* initial length */
+
+ /* build loc section */
+ loclen = 16;
+ locbuf = pbuf = nasm_malloc(loclen);
+ if (is_elf32()) {
+ WRITELONG(pbuf,0); /* null beginning offset */
+ WRITELONG(pbuf,0); /* null ending offset */
+ } else if (is_elfx32()) {
+ WRITELONG(pbuf,0); /* null beginning offset */
+ WRITELONG(pbuf,0); /* null ending offset */
+ } else {
+ nasm_assert(is_elf64());
+ WRITEDLONG(pbuf,0); /* null beginning offset */
+ WRITEDLONG(pbuf,0); /* null ending offset */
+ }
+}
+
+static void dwarf_cleanup(void)
+{
+ nasm_free(arangesbuf);
+ nasm_free(arangesrelbuf);
+ nasm_free(pubnamesbuf);
+ nasm_free(infobuf);
+ nasm_free(inforelbuf);
+ nasm_free(abbrevbuf);
+ nasm_free(linebuf);
+ nasm_free(linerelbuf);
+ nasm_free(framebuf);
+ nasm_free(locbuf);
+}
+
+static void dwarf_findfile(const char * fname)
+{
+ int finx;
+ struct linelist *match;
+
+ /* return if fname is current file name */
+ if (dwarf_clist && !(strcmp(fname, dwarf_clist->filename)))
+ return;
+
+ /* search for match */
+ match = 0;
+ if (dwarf_flist) {
+ match = dwarf_flist;
+ for (finx = 0; finx < dwarf_numfiles; finx++) {
+ if (!(strcmp(fname, match->filename))) {
+ dwarf_clist = match;
+ return;
+ }
+ match = match->next;
+ }
+ }
+
+ /* add file name to end of list */
+ dwarf_clist = nasm_malloc(sizeof(struct linelist));
+ dwarf_numfiles++;
+ dwarf_clist->line = dwarf_numfiles;
+ dwarf_clist->filename = nasm_malloc(strlen(fname) + 1);
+ strcpy(dwarf_clist->filename,fname);
+ dwarf_clist->next = 0;
+ if (!dwarf_flist) { /* if first entry */
+ dwarf_flist = dwarf_elist = dwarf_clist;
+ dwarf_clist->last = 0;
+ } else { /* chain to previous entry */
+ dwarf_elist->next = dwarf_clist;
+ dwarf_elist = dwarf_clist;
+ }
+}
+
+static void dwarf_findsect(const int index)
+{
+ int sinx;
+ struct sectlist *match;
+ struct SAA *plinep;
+
+ /* return if index is current section index */
+ if (dwarf_csect && (dwarf_csect->section == index))
+ return;
+
+ /* search for match */
+ match = 0;
+ if (dwarf_fsect) {
+ match = dwarf_fsect;
+ for (sinx = 0; sinx < dwarf_nsections; sinx++) {
+ if (match->section == index) {
+ dwarf_csect = match;
+ return;
+ }
+ match = match->next;
+ }
+ }
+
+ /* add entry to end of list */
+ dwarf_csect = nasm_malloc(sizeof(struct sectlist));
+ dwarf_nsections++;
+ dwarf_csect->psaa = plinep = saa_init(1L);
+ dwarf_csect->line = 1;
+ dwarf_csect->offset = 0;
+ dwarf_csect->file = 1;
+ dwarf_csect->section = index;
+ dwarf_csect->next = 0;
+ /* set relocatable address at start of line program */
+ saa_write8(plinep,DW_LNS_extended_op);
+ saa_write8(plinep,is_elf64() ? 9 : 5); /* operand length */
+ saa_write8(plinep,DW_LNE_set_address);
+ if (is_elf64())
+ saa_write64(plinep,0); /* Start Address */
+ else
+ saa_write32(plinep,0); /* Start Address */
+
+ if (!dwarf_fsect) { /* if first entry */
+ dwarf_fsect = dwarf_esect = dwarf_csect;
+ dwarf_csect->last = 0;
+ } else { /* chain to previous entry */
+ dwarf_esect->next = dwarf_csect;
+ dwarf_esect = dwarf_csect;
+ }
+}
+
+#endif /* defined(OF_ELF32) || defined(OF_ELF64) || defined(OF_ELFX32) */
diff --git a/output/outelf.h b/output/outelf.h
new file mode 100644
index 00000000..8eef73ae
--- /dev/null
+++ b/output/outelf.h
@@ -0,0 +1,152 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Internal definitions common to outelf32 and outelf64
+ */
+#ifndef OUTPUT_OUTELF_H
+#define OUTPUT_OUTELF_H
+
+#include "elf.h"
+#include "rbtree.h"
+#include "saa.h"
+
+/* symbol binding */
+#define SYM_GLOBAL ELF32_ST_MKBIND(STB_GLOBAL)
+#define SYM_LOCAL ELF32_ST_MKBIND(STB_LOCAL)
+
+#define GLOBAL_TEMP_BASE 0x40000000 /* bigger than any sane symbol index */
+
+/* alignment of sections in file */
+#define SEC_FILEALIGN 16
+
+/* this stuff is needed for the dwarf/stabs debugging format */
+#define TY_DEBUGSYMLIN 0x40 /* internal call to debug_out */
+
+/* Known sections with nonstandard defaults */
+struct elf_known_section {
+ const char *name; /* Name of section */
+ int type; /* Section type (SHT_) */
+ uint32_t flags; /* Section flags (SHF_) */
+ uint32_t align; /* Section alignment */
+};
+extern const struct elf_known_section elf_known_sections[];
+
+/*
+ * Special ELF sections (after the real sections but before debugging ones)
+ */
+#define sec_shstrtab (nsects + 1)
+#define sec_symtab (nsects + 2)
+#define sec_strtab (nsects + 3)
+#define sec_numspecial 3
+
+/*
+ * Debugging ELF sections (last in the file)
+ */
+
+/* stabs */
+#define sec_stab (nsections-3)
+#define sec_stabstr (nsections-2)
+#define sec_rel_stab (nsections-1)
+
+/* stabs symbol table format */
+struct stabentry {
+ uint32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_other;
+ uint16_t n_desc;
+ uint32_t n_value;
+};
+
+/* dwarf */
+#define sec_debug_aranges (nsections-10)
+#define sec_rela_debug_aranges (nsections-9)
+#define sec_debug_pubnames (nsections-8)
+#define sec_debug_info (nsections-7)
+#define sec_rela_debug_info (nsections-6)
+#define sec_debug_abbrev (nsections-5)
+#define sec_debug_line (nsections-4)
+#define sec_rela_debug_line (nsections-3)
+#define sec_debug_frame (nsections-2)
+#define sec_debug_loc (nsections-1)
+
+extern uint8_t elf_osabi;
+extern uint8_t elf_abiver;
+
+#define WRITE_STAB(p,n_strx,n_type,n_other,n_desc,n_value) \
+ do { \
+ WRITELONG(p, n_strx); \
+ WRITECHAR(p, n_type); \
+ WRITECHAR(p, n_other); \
+ WRITESHORT(p, n_desc); \
+ WRITELONG(p, n_value); \
+ } while (0)
+
+struct elf_reloc {
+ struct elf_reloc *next;
+ int64_t address; /* relative to _start_ of section */
+ int64_t symbol; /* symbol index */
+ int64_t offset; /* symbol addend */
+ int type; /* type of relocation */
+};
+
+struct elf_symbol {
+ struct rbtree symv; /* symbol value and symbol rbtree */
+ int32_t strpos; /* string table position of name */
+ int32_t section; /* section ID of the symbol */
+ int type; /* symbol type */
+ int other; /* symbol visibility */
+ int32_t size; /* size of symbol */
+ int32_t globnum; /* symbol table offset if global */
+ struct elf_symbol *nextfwd; /* list of unresolved-size symbols */
+ char *name; /* used temporarily if in above list */
+};
+
+struct elf_section {
+ struct SAA *data;
+ uint64_t len;
+ uint64_t size;
+ uint64_t nrelocs;
+ int32_t index;
+ int type; /* SHT_PROGBITS or SHT_NOBITS */
+ uint64_t align; /* alignment: power of two */
+ uint64_t flags; /* section flags */
+ char *name;
+ struct SAA *rel;
+ uint64_t rellen;
+ struct elf_reloc *head;
+ struct elf_reloc **tail;
+ struct rbtree *gsyms; /* global symbols in section */
+};
+
+#endif /* OUTPUT_OUTELF_H */
diff --git a/output/outelf.mac b/output/outelf.mac
new file mode 100644
index 00000000..6994d077
--- /dev/null
+++ b/output/outelf.mac
@@ -0,0 +1,41 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: elf elf32 elf64
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%define $_%1 $%1
+%endmacro
+%imacro osabi 1+.nolist
+[%? %1]
+%endmacro
diff --git a/output/outform.c b/output/outform.c
new file mode 100644
index 00000000..f227be43
--- /dev/null
+++ b/output/outform.c
@@ -0,0 +1,120 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2011 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outform.c manages a list of output formats, and associates
+ * them with their relevant drivers. Also has a
+ * routine to find the correct driver given a name
+ * for it
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#define BUILD_DRIVERS_ARRAY
+#include "outform.h"
+
+const struct ofmt *ofmt_find(const char *name,
+ const struct ofmt_alias **ofmt_alias)
+{
+ const struct ofmt * const *ofp;
+ const struct ofmt *of;
+ unsigned int i;
+
+ *ofmt_alias = NULL;
+
+ /* primary targets first */
+ for (ofp = drivers; (of = *ofp); ofp++) {
+ if (!nasm_stricmp(name, of->shortname))
+ return of;
+ }
+
+ /* lets walk thru aliases then */
+ for (i = 0; i < ARRAY_SIZE(ofmt_aliases); i++) {
+ if (ofmt_aliases[i].shortname &&
+ !nasm_stricmp(name, ofmt_aliases[i].shortname)) {
+ *ofmt_alias = &ofmt_aliases[i];
+ return ofmt_aliases[i].ofmt;
+ }
+ }
+
+ return NULL;
+}
+
+const struct dfmt *dfmt_find(const struct ofmt *ofmt, const char *name)
+{
+ const struct dfmt * const *dfp;
+ const struct dfmt *df;
+
+ for (dfp = ofmt->debug_formats; (df = *dfp); dfp++) {
+ if (!nasm_stricmp(name, df->shortname))
+ return df;
+ }
+ return NULL;
+}
+
+void ofmt_list(const struct ofmt *deffmt, FILE * fp)
+{
+ const struct ofmt * const *ofp, *of;
+ unsigned int i;
+
+ /* primary targets first */
+ for (ofp = drivers; (of = *ofp); ofp++) {
+ fprintf(fp, " %c %-10s%s\n",
+ of == deffmt ? '*' : ' ',
+ of->shortname, of->fullname);
+ }
+
+ /* lets walk through aliases then */
+ for (i = 0; i < ARRAY_SIZE(ofmt_aliases); i++) {
+ if (!ofmt_aliases[i].shortname)
+ continue;
+ fprintf(fp, " %-10s%s\n",
+ ofmt_aliases[i].shortname,
+ ofmt_aliases[i].fullname);
+ }
+}
+
+void dfmt_list(const struct ofmt *ofmt, FILE *fp)
+{
+ const struct dfmt * const *dfp;
+ const struct dfmt *df;
+
+ for (dfp = ofmt->debug_formats; (df = *dfp); dfp++) {
+ fprintf(fp, " %c %-10s%s\n",
+ df == dfmt ? '*' : ' ',
+ df->shortname, df->fullname);
+ }
+}
diff --git a/output/outform.h b/output/outform.h
new file mode 100644
index 00000000..5d30d645
--- /dev/null
+++ b/output/outform.h
@@ -0,0 +1,379 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2011 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outform.h header file for binding output format drivers to the
+ * remainder of the code in the Netwide Assembler
+ */
+
+/*
+ * This header file allows configuration of which output formats
+ * get compiled into the NASM binary. You can configure by defining
+ * various preprocessor symbols beginning with "OF_", either on the
+ * compiler command line or at the top of this file.
+ *
+ * OF_ONLY -- only include specified object formats
+ * OF_name -- ensure that output format 'name' is included
+ * OF_NO_name -- remove output format 'name'
+ * OF_DOS -- ensure that 'obj', 'bin', 'win32' & 'win64' are included.
+ * OF_UNIX -- ensure that 'aout', 'aoutb', 'coff', 'elf32' & 'elf64' are in.
+ * OF_OTHERS -- ensure that 'bin', 'as86', 'rdf' 'macho32' & 'macho64' are in.
+ * OF_ALL -- ensure that all formats are included.
+ * note that this doesn't include 'dbg', which is
+ * only really useful if you're doing development
+ * work on NASM. Define OF_DBG if you want this.
+ *
+ * OF_DEFAULT=of_name -- ensure that 'name' is the default format.
+ *
+ * eg: -DOF_UNIX -DOF_ELF32 -DOF_DEFAULT=of_elf32 would be a suitable config
+ * for an average linux system.
+ *
+ * Default config = -DOF_ALL -DOF_DEFAULT=of_bin
+ *
+ * You probably only want to set these options while compiling 'nasm.c'. */
+
+#ifndef NASM_OUTFORM_H
+#define NASM_OUTFORM_H
+
+#include "nasm.h"
+
+/* -------------- USER MODIFIABLE PART ---------------- */
+
+/*
+ * Insert #defines here in accordance with the configuration
+ * instructions above.
+ *
+ * E.g.
+ *
+ * #define OF_ONLY
+ * #define OF_OBJ
+ * #define OF_BIN
+ *
+ * for a 16-bit DOS assembler with no extraneous formats.
+ */
+
+/* ------------ END USER MODIFIABLE PART -------------- */
+
+/* ====configurable info begins here==== */
+/* formats configurable:
+ * bin,obj,elf32,elf64,aout,aoutb,coff,win32,as86,rdf2,macho32,macho64 */
+
+/* process options... */
+
+#ifndef OF_ONLY
+#ifndef OF_ALL
+#define OF_ALL /* default is to have all formats */
+#endif
+#endif
+
+#ifdef OF_ALL /* set all formats on... */
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_OBJ
+#define OF_OBJ
+#endif
+#ifndef OF_ELF32
+#define OF_ELF32
+#endif
+#ifndef OF_ELFX32
+#define OF_ELFX32
+#endif
+#ifndef OF_ELF64
+#define OF_ELF64
+#endif
+#ifndef OF_COFF
+#define OF_COFF
+#endif
+#ifndef OF_AOUT
+#define OF_AOUT
+#endif
+#ifndef OF_AOUTB
+#define OF_AOUTB
+#endif
+#ifndef OF_WIN32
+#define OF_WIN32
+#endif
+#ifndef OF_WIN64
+#define OF_WIN64
+#endif
+#ifndef OF_AS86
+#define OF_AS86
+#endif
+#ifndef OF_RDF2
+#define OF_RDF2
+#endif
+#ifndef OF_IEEE
+#define OF_IEEE
+#endif
+#ifndef OF_MACHO32
+#define OF_MACHO32
+#endif
+#ifndef OF_MACHO64
+#define OF_MACHO64
+#endif
+#ifndef OF_DBG
+#define OF_DBG
+#endif
+#endif /* OF_ALL */
+
+/* turn on groups of formats specified.... */
+#ifdef OF_DOS
+#ifndef OF_OBJ
+#define OF_OBJ
+#endif
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_COFF
+#define OF_COFF /* COFF is used by DJGPP */
+#endif
+#ifndef OF_WIN32
+#define OF_WIN32
+#endif
+#ifndef OF_WIN64
+#define OF_WIN64
+#endif
+#endif
+
+#ifdef OF_UNIX
+#ifndef OF_AOUT
+#define OF_AOUT
+#endif
+#ifndef OF_AOUTB
+#define OF_AOUTB
+#endif
+#ifndef OF_COFF
+#define OF_COFF
+#endif
+#ifndef OF_ELF32
+#define OF_ELF32
+#endif
+#ifndef OF_ELF64
+#define OF_ELF64
+#endif
+#ifndef OF_ELFX32
+#define OF_ELFX32
+#endif
+#endif
+
+#ifdef OF_OTHERS
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_AS86
+#define OF_AS86
+#endif
+#ifndef OF_RDF2
+#define OF_RDF2
+#endif
+#ifndef OF_IEEE
+#define OF_IEEE
+#endif
+#ifndef OF_MACHO32
+#define OF_MACHO32
+#endif
+#ifndef OF_MACHO64
+#define OF_MACHO64
+#endif
+#endif
+
+/* finally... override any format specifically specified to be off */
+#ifdef OF_NO_BIN
+#undef OF_BIN
+#endif
+#ifdef OF_NO_OBJ
+#undef OF_OBJ
+#endif
+#ifdef OF_NO_ELF32
+#undef OF_ELF32
+#endif
+#ifdef OF_NO_ELF64
+#undef OF_ELF64
+#endif
+#ifdef OF_NO_ELFX32
+#undef OF_ELFX32
+#endif
+#ifdef OF_NO_AOUT
+#undef OF_AOUT
+#endif
+#ifdef OF_NO_AOUTB
+#undef OF_AOUTB
+#endif
+#ifdef OF_NO_COFF
+#undef OF_COFF
+#endif
+#ifdef OF_NO_WIN32
+#undef OF_WIN32
+#endif
+#ifdef OF_NO_WIN64
+#undef OF_WIN64
+#endif
+#ifdef OF_NO_AS86
+#undef OF_AS86
+#endif
+#ifdef OF_NO_RDF2
+#undef OF_RDF2
+#endif
+#ifdef OF_NO_IEEE
+#undef OF_IEEE
+#endif
+#ifdef OF_NO_MACHO32
+#undef OF_MACHO32
+#endif
+#ifdef OF_NO_MACHO64
+#undef OF_MACHO64
+#endif
+#ifdef OF_NO_DBG
+#undef OF_DBG
+#endif
+
+#ifndef OF_DEFAULT
+#define OF_DEFAULT of_bin
+#endif
+
+extern const struct ofmt of_bin;
+extern const struct ofmt of_ith;
+extern const struct ofmt of_srec;
+extern const struct ofmt of_aout;
+extern const struct ofmt of_aoutb;
+extern const struct ofmt of_coff;
+extern const struct ofmt of_elf32;
+extern const struct ofmt of_elfx32;
+extern const struct ofmt of_elf64;
+extern const struct ofmt of_as86;
+extern const struct ofmt of_obj;
+extern const struct ofmt of_win32;
+extern const struct ofmt of_win64;
+extern const struct ofmt of_rdf2;
+extern const struct ofmt of_ieee;
+extern const struct ofmt of_macho32;
+extern const struct ofmt of_macho64;
+extern const struct ofmt of_dbg;
+
+#ifdef BUILD_DRIVERS_ARRAY /* only if included from outform.c */
+
+/*
+ * pull in the externs for the different formats, then make the
+ * drivers array based on the above defines
+ */
+
+static const struct ofmt * const drivers[] = {
+#ifdef OF_BIN
+ &of_bin,
+ &of_ith,
+ &of_srec,
+#endif
+#ifdef OF_AOUT
+ &of_aout,
+#endif
+#ifdef OF_AOUTB
+ &of_aoutb,
+#endif
+#ifdef OF_COFF
+ &of_coff,
+#endif
+#ifdef OF_ELF32
+ &of_elf32,
+#endif
+#ifdef OF_ELF64
+ &of_elf64,
+#endif
+#ifdef OF_ELFX32
+ &of_elfx32,
+#endif
+#ifdef OF_AS86
+ &of_as86,
+#endif
+#ifdef OF_OBJ
+ &of_obj,
+#endif
+#ifdef OF_WIN32
+ &of_win32,
+#endif
+#ifdef OF_WIN64
+ &of_win64,
+#endif
+#ifdef OF_RDF2
+ &of_rdf2,
+#endif
+#ifdef OF_IEEE
+ &of_ieee,
+#endif
+#ifdef OF_MACHO32
+ &of_macho32,
+#endif
+#ifdef OF_MACHO64
+ &of_macho64,
+#endif
+#ifdef OF_DBG
+ &of_dbg,
+#endif
+
+ NULL
+};
+
+static const struct ofmt_alias ofmt_aliases[] = {
+#ifdef OF_ELF32
+ {
+ "elf",
+ "ELF (short name for ELF32)",
+ &of_elf32,
+ },
+#endif
+#ifdef OF_MACHO32
+ {
+ "macho",
+ "MACHO (short name for MACHO32)",
+ &of_macho32,
+ },
+#endif
+#ifdef OF_WIN32
+ {
+ "win",
+ "WIN (short name for WIN32)",
+ &of_win32,
+ },
+#endif
+ { NULL, NULL, NULL }
+};
+
+#endif /* BUILD_DRIVERS_ARRAY */
+
+const struct ofmt *ofmt_find(const char *name, const struct ofmt_alias **ofmt_alias);
+const struct dfmt *dfmt_find(const struct ofmt *, const char *);
+void ofmt_list(const struct ofmt *, FILE *);
+void dfmt_list(const struct ofmt *ofmt, FILE * fp);
+extern const struct dfmt null_debug_form;
+
+#endif /* NASM_OUTFORM_H */
diff --git a/output/outieee.c b/output/outieee.c
new file mode 100644
index 00000000..211cdaba
--- /dev/null
+++ b/output/outieee.c
@@ -0,0 +1,1507 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outieee.c output routines for the Netwide Assembler to produce
+ * IEEE-std object files
+ */
+
+/* notes: I have tried to make this correspond to the IEEE version
+ * of the standard, specifically the primary ASCII version. It should
+ * be trivial to create the binary version given this source (which is
+ * one of MANY things that have to be done to make this correspond to
+ * the hp-microtek version of the standard).
+ *
+ * 16-bit support is assumed to use 24-bit addresses
+ * The linker can sort out segmentation-specific stuff
+ * if it keeps track of externals
+ * in terms of being relative to section bases
+ *
+ * A non-standard variable type, the 'Yn' variable, has been introduced.
+ * Basically it is a reference to extern 'n'- denoting the low limit
+ * (L-variable) of the section that extern 'n' is defined in. Like the
+ * x variable, there may be no explicit assignment to it, it is derived
+ * from the public definition corresponding to the extern name. This
+ * is required because the one thing the mufom guys forgot to do well was
+ * take into account segmented architectures.
+ *
+ * I use comment classes for various things and these are undefined by
+ * the standard.
+ *
+ * Debug info should be considered totally non-standard (local labels are
+ * standard but linenum records are not covered by the standard.
+ * Type defs have the standard format but absolute meanings for ordinal
+ * types are not covered by the standard.)
+ *
+ * David Lindauer, LADsoft
+ */
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <stdarg.h> /* Note: we need the ANSI version of stdarg.h */
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "ver.h"
+
+#include "outform.h"
+#include "outlib.h"
+
+#ifdef OF_IEEE
+
+#define ARRAY_BOT 0x1
+
+static char ieee_infile[FILENAME_MAX];
+static int ieee_uppercase;
+
+static bool any_segs;
+static int arrindex;
+
+#define HUNKSIZE 1024 /* Size of the data hunk */
+#define EXT_BLKSIZ 512
+#define LDPERLINE 32 /* bytes per line in output */
+
+struct ieeeSection;
+
+struct LineNumber {
+ struct LineNumber *next;
+ struct ieeeSection *segment;
+ int32_t offset;
+ int32_t lineno;
+};
+
+static struct FileName {
+ struct FileName *next;
+ char *name;
+ int32_t index;
+} *fnhead, **fntail;
+
+static struct Array {
+ struct Array *next;
+ unsigned size;
+ int basetype;
+} *arrhead, **arrtail;
+
+static struct ieeePublic {
+ struct ieeePublic *next;
+ char *name;
+ int32_t offset;
+ int32_t segment; /* only if it's far-absolute */
+ int32_t index;
+ int type; /* for debug purposes */
+} *fpubhead, **fpubtail, *last_defined;
+
+static struct ieeeExternal {
+ struct ieeeExternal *next;
+ char *name;
+ int32_t commonsize;
+} *exthead, **exttail;
+
+static int externals;
+
+static struct ExtBack {
+ struct ExtBack *next;
+ int index[EXT_BLKSIZ];
+} *ebhead, **ebtail;
+
+/* NOTE: the first segment MUST be the lineno segment */
+static struct ieeeSection {
+ struct ieeeSection *next;
+ char *name;
+ struct ieeeObjData *data, *datacurr;
+ struct ieeeFixupp *fptr, *flptr;
+ int32_t index; /* the NASM segment id */
+ int32_t ieee_index; /* the OBJ-file segment index */
+ int32_t currentpos;
+ int32_t align; /* can be SEG_ABS + absolute addr */
+ int32_t startpos;
+ int32_t use32; /* is this segment 32-bit? */
+ struct ieeePublic *pubhead, **pubtail, *lochead, **loctail;
+ enum {
+ CMB_PRIVATE = 0,
+ CMB_PUBLIC = 2,
+ CMB_COMMON = 6
+ } combine;
+} *seghead, **segtail, *ieee_seg_needs_update;
+
+struct ieeeObjData {
+ struct ieeeObjData *next;
+ uint8_t data[HUNKSIZE];
+};
+
+struct ieeeFixupp {
+ struct ieeeFixupp *next;
+ enum {
+ FT_SEG = 0,
+ FT_REL = 1,
+ FT_OFS = 2,
+ FT_EXT = 3,
+ FT_WRT = 4,
+ FT_EXTREL = 5,
+ FT_EXTWRT = 6,
+ FT_EXTSEG = 7
+ } ftype;
+ int16_t size;
+ int32_t id1;
+ int32_t id2;
+ int32_t offset;
+ int32_t addend;
+};
+
+static int32_t ieee_entry_seg, ieee_entry_ofs;
+static int checksum;
+
+extern const struct ofmt of_ieee;
+static const struct dfmt ladsoft_debug_form;
+
+static void ieee_data_new(struct ieeeSection *);
+static void ieee_write_fixup(int32_t, int32_t, struct ieeeSection *,
+ int, uint64_t, int32_t);
+static void ieee_install_fixup(struct ieeeSection *, struct ieeeFixupp *);
+static int32_t ieee_segment(char *, int, int *);
+static void ieee_write_file(void);
+static void ieee_write_byte(struct ieeeSection *, int);
+static void ieee_write_word(struct ieeeSection *, int);
+static void ieee_write_dword(struct ieeeSection *, int32_t);
+static void ieee_putascii(char *, ...);
+static void ieee_putcs(int);
+static int32_t ieee_putld(int32_t, int32_t, uint8_t *);
+static int32_t ieee_putlr(struct ieeeFixupp *);
+static void ieee_unqualified_name(char *, char *);
+
+/*
+ * pup init
+ */
+static void ieee_init(void)
+{
+ strlcpy(ieee_infile, inname, sizeof(ieee_infile));
+ any_segs = false;
+ fpubhead = NULL;
+ fpubtail = &fpubhead;
+ exthead = NULL;
+ exttail = &exthead;
+ externals = 1;
+ ebhead = NULL;
+ ebtail = &ebhead;
+ seghead = ieee_seg_needs_update = NULL;
+ segtail = &seghead;
+ ieee_entry_seg = NO_SEG;
+ ieee_uppercase = false;
+ checksum = 0;
+}
+
+/*
+ * Rundown
+ */
+static void ieee_cleanup(void)
+{
+ ieee_write_file();
+ dfmt->cleanup();
+ while (seghead) {
+ struct ieeeSection *segtmp = seghead;
+ seghead = seghead->next;
+ while (segtmp->pubhead) {
+ struct ieeePublic *pubtmp = segtmp->pubhead;
+ segtmp->pubhead = pubtmp->next;
+ nasm_free(pubtmp);
+ }
+ while (segtmp->fptr) {
+ struct ieeeFixupp *fixtmp = segtmp->fptr;
+ segtmp->fptr = fixtmp->next;
+ nasm_free(fixtmp);
+ }
+ while (segtmp->data) {
+ struct ieeeObjData *dattmp = segtmp->data;
+ segtmp->data = dattmp->next;
+ nasm_free(dattmp);
+ }
+ nasm_free(segtmp);
+ }
+ while (fpubhead) {
+ struct ieeePublic *pubtmp = fpubhead;
+ fpubhead = fpubhead->next;
+ nasm_free(pubtmp);
+ }
+ while (exthead) {
+ struct ieeeExternal *exttmp = exthead;
+ exthead = exthead->next;
+ nasm_free(exttmp);
+ }
+ while (ebhead) {
+ struct ExtBack *ebtmp = ebhead;
+ ebhead = ebhead->next;
+ nasm_free(ebtmp);
+ }
+}
+
+/*
+ * callback for labels
+ */
+static void ieee_deflabel(char *name, int32_t segment,
+ int64_t offset, int is_global, char *special)
+{
+ /*
+ * We have three cases:
+ *
+ * (i) `segment' is a segment-base. If so, set the name field
+ * for the segment structure it refers to, and then
+ * return.
+ *
+ * (ii) `segment' is one of our segments, or a SEG_ABS segment.
+ * Save the label position for later output of a PUBDEF record.
+ *
+ *
+ * (iii) `segment' is not one of our segments. Save the label
+ * position for later output of an EXTDEF.
+ */
+ struct ieeeExternal *ext;
+ struct ExtBack *eb;
+ struct ieeeSection *seg;
+ int i;
+
+ if (special) {
+ nasm_error(ERR_NONFATAL, "unrecognised symbol type `%s'", special);
+ }
+ /*
+ * First check for the double-period, signifying something
+ * unusual.
+ */
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ if (!strcmp(name, "..start")) {
+ ieee_entry_seg = segment;
+ ieee_entry_ofs = offset;
+ }
+ return;
+ }
+
+ /*
+ * Case (i):
+ */
+ if (ieee_seg_needs_update) {
+ ieee_seg_needs_update->name = name;
+ return;
+ }
+ if (segment < SEG_ABS && segment != NO_SEG && segment % 2)
+ return;
+
+ /*
+ * case (ii)
+ */
+ if (segment >= SEG_ABS) {
+ /*
+ * SEG_ABS subcase of (ii).
+ */
+ if (is_global) {
+ struct ieeePublic *pub;
+
+ pub = *fpubtail = nasm_malloc(sizeof(*pub));
+ fpubtail = &pub->next;
+ pub->next = NULL;
+ pub->name = name;
+ pub->offset = offset;
+ pub->segment = segment & ~SEG_ABS;
+ }
+ return;
+ }
+
+ for (seg = seghead; seg && is_global; seg = seg->next)
+ if (seg->index == segment) {
+ struct ieeePublic *pub;
+
+ last_defined = pub = *seg->pubtail = nasm_malloc(sizeof(*pub));
+ seg->pubtail = &pub->next;
+ pub->next = NULL;
+ pub->name = name;
+ pub->offset = offset;
+ pub->index = seg->ieee_index;
+ pub->segment = -1;
+ return;
+ }
+
+ /*
+ * Case (iii).
+ */
+ if (is_global) {
+ ext = *exttail = nasm_malloc(sizeof(*ext));
+ ext->next = NULL;
+ exttail = &ext->next;
+ ext->name = name;
+ if (is_global == 2)
+ ext->commonsize = offset;
+ else
+ ext->commonsize = 0;
+ i = segment / 2;
+ eb = ebhead;
+ if (!eb) {
+ eb = *ebtail = nasm_zalloc(sizeof(*eb));
+ eb->next = NULL;
+ ebtail = &eb->next;
+ }
+ while (i > EXT_BLKSIZ) {
+ if (eb && eb->next)
+ eb = eb->next;
+ else {
+ eb = *ebtail = nasm_zalloc(sizeof(*eb));
+ eb->next = NULL;
+ ebtail = &eb->next;
+ }
+ i -= EXT_BLKSIZ;
+ }
+ eb->index[i] = externals++;
+ }
+
+}
+
+/*
+ * Put data out
+ */
+static void ieee_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ const uint8_t *ucdata;
+ int32_t ldata;
+ struct ieeeSection *seg;
+
+ /*
+ * If `any_segs' is still false, we must define a default
+ * segment.
+ */
+ if (!any_segs) {
+ int tempint; /* ignored */
+ if (segto != ieee_segment("__NASMDEFSEG", 2, &tempint))
+ nasm_panic("strange segment conditions in IEEE driver");
+ }
+
+ /*
+ * Find the segment we are targetting.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segto)
+ break;
+ if (!seg)
+ nasm_panic("code directed to nonexistent segment?");
+
+ if (type == OUT_RAWDATA) {
+ ucdata = data;
+ while (size--)
+ ieee_write_byte(seg, *ucdata++);
+ } else if (type == OUT_ADDRESS || type == OUT_REL2ADR ||
+ type == OUT_REL4ADR) {
+ if (type == OUT_ADDRESS)
+ size = abs((int)size);
+ else if (segment == NO_SEG)
+ nasm_error(ERR_NONFATAL, "relative call to absolute address not"
+ " supported by IEEE format");
+ ldata = *(int64_t *)data;
+ if (type == OUT_REL2ADR)
+ ldata += (size - 2);
+ if (type == OUT_REL4ADR)
+ ldata += (size - 4);
+ ieee_write_fixup(segment, wrt, seg, size, type, ldata);
+ if (size == 2)
+ ieee_write_word(seg, ldata);
+ else
+ ieee_write_dword(seg, ldata);
+ } else if (type == OUT_RESERVE) {
+ while (size--)
+ ieee_write_byte(seg, 0);
+ }
+}
+
+static void ieee_data_new(struct ieeeSection *segto)
+{
+
+ if (!segto->data)
+ segto->data = segto->datacurr =
+ nasm_malloc(sizeof(*(segto->datacurr)));
+ else
+ segto->datacurr = segto->datacurr->next =
+ nasm_malloc(sizeof(*(segto->datacurr)));
+ segto->datacurr->next = NULL;
+}
+
+/*
+ * this routine is unalduterated bloatware. I usually don't do this
+ * but I might as well see what it is like on a harmless program.
+ * If anyone wants to optimize this is a good canditate!
+ */
+static void ieee_write_fixup(int32_t segment, int32_t wrt,
+ struct ieeeSection *segto, int size,
+ uint64_t realtype, int32_t offset)
+{
+ struct ieeeSection *target;
+ struct ieeeFixupp s;
+
+ /* Don't put a fixup for things NASM can calculate */
+ if (wrt == NO_SEG && segment == NO_SEG)
+ return;
+
+ s.ftype = -1;
+ /* if it is a WRT offset */
+ if (wrt != NO_SEG) {
+ s.ftype = FT_WRT;
+ s.addend = offset;
+ if (wrt >= SEG_ABS)
+ s.id1 = -(wrt - SEG_ABS);
+ else {
+ if (wrt % 2 && realtype != OUT_REL2ADR
+ && realtype != OUT_REL4ADR) {
+ wrt--;
+
+ for (target = seghead; target; target = target->next)
+ if (target->index == wrt)
+ break;
+ if (target) {
+ s.id1 = target->ieee_index;
+ for (target = seghead; target; target = target->next)
+ if (target->index == segment)
+ break;
+
+ if (target)
+ s.id2 = target->ieee_index;
+ else {
+ /*
+ * Now we assume the segment field is being used
+ * to hold an extern index
+ */
+ int32_t i = segment / 2;
+ struct ExtBack *eb = ebhead;
+ while (i > EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ /* if we have an extern decide the type and make a record
+ */
+ if (eb) {
+ s.ftype = FT_EXTWRT;
+ s.addend = 0;
+ s.id2 = eb->index[i];
+ } else
+ nasm_error(ERR_NONFATAL,
+ "Source of WRT must be an offset");
+ }
+
+ } else
+ nasm_panic("unrecognised WRT value in ieee_write_fixup");
+ } else
+ nasm_error(ERR_NONFATAL, "target of WRT must be a section ");
+ }
+ s.size = size;
+ ieee_install_fixup(segto, &s);
+ return;
+ }
+ /* Pure segment fixup ? */
+ if (segment != NO_SEG) {
+ s.ftype = FT_SEG;
+ s.id1 = 0;
+ if (segment >= SEG_ABS) {
+ /* absolute far segment fixup */
+ s.id1 = -(segment - ~SEG_ABS);
+ } else if (segment % 2) {
+ /* fixup to named segment */
+ /* look it up */
+ for (target = seghead; target; target = target->next)
+ if (target->index == segment - 1)
+ break;
+ if (target)
+ s.id1 = target->ieee_index;
+ else {
+ /*
+ * Now we assume the segment field is being used
+ * to hold an extern index
+ */
+ int32_t i = segment / 2;
+ struct ExtBack *eb = ebhead;
+ while (i > EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ /* if we have an extern decide the type and make a record
+ */
+ if (eb) {
+ if (realtype == OUT_REL2ADR || realtype == OUT_REL4ADR) {
+ nasm_panic("Segment of a rel not supported in ieee_write_fixup");
+ } else {
+ /* If we want the segment */
+ s.ftype = FT_EXTSEG;
+ s.addend = 0;
+ s.id1 = eb->index[i];
+ }
+
+ } else
+ /* If we get here the seg value doesn't make sense */
+ nasm_panic("unrecognised segment value in ieee_write_fixup");
+ }
+
+ } else {
+ /* Assume we are offsetting directly from a section
+ * So look up the target segment
+ */
+ for (target = seghead; target; target = target->next)
+ if (target->index == segment)
+ break;
+ if (target) {
+ if (realtype == OUT_REL2ADR || realtype == OUT_REL4ADR) {
+ /* PC rel to a known offset */
+ s.id1 = target->ieee_index;
+ s.ftype = FT_REL;
+ s.size = size;
+ s.addend = offset;
+ } else {
+ /* We were offsetting from a seg */
+ s.id1 = target->ieee_index;
+ s.ftype = FT_OFS;
+ s.size = size;
+ s.addend = offset;
+ }
+ } else {
+ /*
+ * Now we assume the segment field is being used
+ * to hold an extern index
+ */
+ int32_t i = segment / 2;
+ struct ExtBack *eb = ebhead;
+ while (i > EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ /* if we have an extern decide the type and make a record
+ */
+ if (eb) {
+ if (realtype == OUT_REL2ADR || realtype == OUT_REL4ADR) {
+ s.ftype = FT_EXTREL;
+ s.addend = 0;
+ s.id1 = eb->index[i];
+ } else {
+ /* else we want the external offset */
+ s.ftype = FT_EXT;
+ s.addend = 0;
+ s.id1 = eb->index[i];
+ }
+
+ } else
+ /* If we get here the seg value doesn't make sense */
+ nasm_panic("unrecognised segment value in ieee_write_fixup");
+ }
+ }
+ if (size != 2 && s.ftype == FT_SEG)
+ nasm_error(ERR_NONFATAL, "IEEE format can only handle 2-byte"
+ " segment base references");
+ s.size = size;
+ ieee_install_fixup(segto, &s);
+ return;
+ }
+ /* should never get here */
+}
+static void ieee_install_fixup(struct ieeeSection *seg,
+ struct ieeeFixupp *fix)
+{
+ struct ieeeFixupp *f;
+ f = nasm_malloc(sizeof(struct ieeeFixupp));
+ memcpy(f, fix, sizeof(struct ieeeFixupp));
+ f->offset = seg->currentpos;
+ seg->currentpos += fix->size;
+ f->next = NULL;
+ if (seg->fptr)
+ seg->flptr = seg->flptr->next = f;
+ else
+ seg->fptr = seg->flptr = f;
+
+}
+
+/*
+ * segment registry
+ */
+static int32_t ieee_segment(char *name, int pass, int *bits)
+{
+ /*
+ * We call the label manager here to define a name for the new
+ * segment, and when our _own_ label-definition stub gets
+ * called in return, it should register the new segment name
+ * using the pointer it gets passed. That way we save memory,
+ * by sponging off the label manager.
+ */
+ if (!name) {
+ *bits = 16;
+ if (!any_segs)
+ return 0;
+ return seghead->index;
+ } else {
+ struct ieeeSection *seg;
+ int ieee_idx, attrs;
+ bool rn_error;
+ char *p;
+
+ /*
+ * Look for segment attributes.
+ */
+ attrs = 0;
+ while (*name == '.')
+ name++; /* hack, but a documented one */
+ p = name;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p) {
+ *p++ = '\0';
+ while (*p && nasm_isspace(*p))
+ *p++ = '\0';
+ }
+ while (*p) {
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p) {
+ *p++ = '\0';
+ while (*p && nasm_isspace(*p))
+ *p++ = '\0';
+ }
+
+ attrs++;
+ }
+
+ ieee_idx = 1;
+ for (seg = seghead; seg; seg = seg->next) {
+ ieee_idx++;
+ if (!strcmp(seg->name, name)) {
+ if (attrs > 0 && pass == 1)
+ nasm_error(ERR_WARNING, "segment attributes specified on"
+ " redeclaration of segment: ignoring");
+ if (seg->use32)
+ *bits = 32;
+ else
+ *bits = 16;
+ return seg->index;
+ }
+ }
+
+ *segtail = seg = nasm_malloc(sizeof(*seg));
+ seg->next = NULL;
+ segtail = &seg->next;
+ seg->index = seg_alloc();
+ seg->ieee_index = ieee_idx;
+ any_segs = true;
+ seg->name = NULL;
+ seg->currentpos = 0;
+ seg->align = 1; /* default */
+ seg->use32 = *bits == 32; /* default to user spec */
+ seg->combine = CMB_PUBLIC; /* default */
+ seg->pubhead = NULL;
+ seg->pubtail = &seg->pubhead;
+ seg->data = NULL;
+ seg->fptr = NULL;
+ seg->lochead = NULL;
+ seg->loctail = &seg->lochead;
+
+ /*
+ * Process the segment attributes.
+ */
+ p = name;
+ while (attrs--) {
+ p += strlen(p);
+ while (!*p)
+ p++;
+
+ /*
+ * `p' contains a segment attribute.
+ */
+ if (!nasm_stricmp(p, "private"))
+ seg->combine = CMB_PRIVATE;
+ else if (!nasm_stricmp(p, "public"))
+ seg->combine = CMB_PUBLIC;
+ else if (!nasm_stricmp(p, "common"))
+ seg->combine = CMB_COMMON;
+ else if (!nasm_stricmp(p, "use16"))
+ seg->use32 = false;
+ else if (!nasm_stricmp(p, "use32"))
+ seg->use32 = true;
+ else if (!nasm_strnicmp(p, "align=", 6)) {
+ seg->align = readnum(p + 6, &rn_error);
+ if (seg->align == 0)
+ seg->align = 1;
+ if (rn_error) {
+ seg->align = 1;
+ nasm_error(ERR_NONFATAL, "segment alignment should be"
+ " numeric");
+ }
+ switch (seg->align) {
+ case 1: /* BYTE */
+ case 2: /* WORD */
+ case 4: /* DWORD */
+ case 16: /* PARA */
+ case 256: /* PAGE */
+ case 8:
+ case 32:
+ case 64:
+ case 128:
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid alignment value %d",
+ seg->align);
+ seg->align = 1;
+ break;
+ }
+ } else if (!nasm_strnicmp(p, "absolute=", 9)) {
+ seg->align = SEG_ABS + readnum(p + 9, &rn_error);
+ if (rn_error)
+ nasm_error(ERR_NONFATAL, "argument to `absolute' segment"
+ " attribute should be numeric");
+ }
+ }
+
+ ieee_seg_needs_update = seg;
+ if (seg->align >= SEG_ABS)
+ define_label(name, NO_SEG, seg->align - SEG_ABS, false);
+ else
+ define_label(name, seg->index + 1, 0L, false);
+ ieee_seg_needs_update = NULL;
+
+ if (seg->use32)
+ *bits = 32;
+ else
+ *bits = 16;
+ return seg->index;
+ }
+}
+
+/*
+ * directives supported
+ */
+static enum directive_result
+ieee_directive(enum directive directive, char *value, int pass)
+{
+
+ (void)value;
+ (void)pass;
+
+ switch (directive) {
+ case D_UPPERCASE:
+ ieee_uppercase = true;
+ return DIRR_OK;
+
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+static void ieee_sectalign(int32_t seg, unsigned int value)
+{
+ struct ieeeSection *s;
+
+ list_for_each(s, seghead) {
+ if (s->index == seg)
+ break;
+ }
+
+ /*
+ * 256 is maximum there, note it may happen
+ * that align is issued on "absolute" segment
+ * it's fine since SEG_ABS > 256 and we never
+ * get escape this test
+ */
+ if (!s || !is_power2(value) || value > 256)
+ return;
+
+ if ((unsigned int)s->align < value)
+ s->align = value;
+}
+
+/*
+ * Return segment data
+ */
+static int32_t ieee_segbase(int32_t segment)
+{
+ struct ieeeSection *seg;
+
+ /*
+ * Find the segment in our list.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segment - 1)
+ break;
+
+ if (!seg)
+ return segment; /* not one of ours - leave it alone */
+
+ if (seg->align >= SEG_ABS)
+ return seg->align; /* absolute segment */
+
+ return segment; /* no special treatment */
+}
+
+static void ieee_write_file(void)
+{
+ const struct tm * const thetime = &official_compile_time.local;
+ struct FileName *fn;
+ struct ieeeSection *seg;
+ struct ieeePublic *pub, *loc;
+ struct ieeeExternal *ext;
+ struct ieeeObjData *data;
+ struct ieeeFixupp *fix;
+ struct Array *arr;
+ int i;
+ const bool debuginfo = (dfmt == &ladsoft_debug_form);
+
+ /*
+ * Write the module header
+ */
+ ieee_putascii("MBFNASM,%02X%s.\n", strlen(ieee_infile), ieee_infile);
+
+ /*
+ * Write the NASM boast comment.
+ */
+ ieee_putascii("CO0,%02X%s.\n", strlen(nasm_comment), nasm_comment);
+
+ /*
+ * write processor-specific information
+ */
+ ieee_putascii("AD8,4,L.\n");
+
+ /*
+ * date and time
+ */
+ ieee_putascii("DT%04d%02d%02d%02d%02d%02d.\n",
+ 1900 + thetime->tm_year, thetime->tm_mon + 1,
+ thetime->tm_mday, thetime->tm_hour, thetime->tm_min,
+ thetime->tm_sec);
+ /*
+ * if debugging, dump file names
+ */
+ for (fn = fnhead; fn && debuginfo; fn = fn->next) {
+ ieee_putascii("C0105,%02X%s.\n", strlen(fn->name), fn->name);
+ }
+
+ ieee_putascii("CO101,07ENDHEAD.\n");
+ /*
+ * the standard doesn't specify when to put checksums,
+ * we'll just do it periodically.
+ */
+ ieee_putcs(false);
+
+ /*
+ * Write the section headers
+ */
+ seg = seghead;
+ if (!debuginfo && !strcmp(seg->name, "??LINE"))
+ seg = seg->next;
+ while (seg) {
+ char buf[256];
+ char attrib;
+ switch (seg->combine) {
+ case CMB_PUBLIC:
+ default:
+ attrib = 'C';
+ break;
+ case CMB_PRIVATE:
+ attrib = 'S';
+ break;
+ case CMB_COMMON:
+ attrib = 'M';
+ break;
+ }
+ ieee_unqualified_name(buf, seg->name);
+ if (seg->align >= SEG_ABS) {
+ ieee_putascii("ST%X,A,%02X%s.\n", seg->ieee_index,
+ strlen(buf), buf);
+ ieee_putascii("ASL%X,%lX.\n", seg->ieee_index,
+ (seg->align - SEG_ABS) * 16);
+ } else {
+ ieee_putascii("ST%X,%c,%02X%s.\n", seg->ieee_index, attrib,
+ strlen(buf), buf);
+ ieee_putascii("SA%X,%lX.\n", seg->ieee_index, seg->align);
+ ieee_putascii("ASS%X,%X.\n", seg->ieee_index,
+ seg->currentpos);
+ }
+ seg = seg->next;
+ }
+ /*
+ * write the start address if there is one
+ */
+ if (ieee_entry_seg) {
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == ieee_entry_seg)
+ break;
+ if (!seg)
+ nasm_panic("Start address records are incorrect");
+ else
+ ieee_putascii("ASG,R%X,%lX,+.\n", seg->ieee_index,
+ ieee_entry_ofs);
+ }
+
+ ieee_putcs(false);
+ /*
+ * Write the publics
+ */
+ i = 1;
+ for (seg = seghead; seg; seg = seg->next) {
+ for (pub = seg->pubhead; pub; pub = pub->next) {
+ char buf[256];
+ ieee_unqualified_name(buf, pub->name);
+ ieee_putascii("NI%X,%02X%s.\n", i, strlen(buf), buf);
+ if (pub->segment == -1)
+ ieee_putascii("ASI%X,R%X,%lX,+.\n", i, pub->index,
+ pub->offset);
+ else
+ ieee_putascii("ASI%X,%lX,%lX,+.\n", i, pub->segment * 16,
+ pub->offset);
+ if (debuginfo) {
+ if (pub->type >= 0x100)
+ ieee_putascii("ATI%X,T%X.\n", i, pub->type - 0x100);
+ else
+ ieee_putascii("ATI%X,%X.\n", i, pub->type);
+ }
+ i++;
+ }
+ }
+ pub = fpubhead;
+ i = 1;
+ while (pub) {
+ char buf[256];
+ ieee_unqualified_name(buf, pub->name);
+ ieee_putascii("NI%X,%02X%s.\n", i, strlen(buf), buf);
+ if (pub->segment == -1)
+ ieee_putascii("ASI%X,R%X,%lX,+.\n", i, pub->index,
+ pub->offset);
+ else
+ ieee_putascii("ASI%X,%lX,%lX,+.\n", i, pub->segment * 16,
+ pub->offset);
+ if (debuginfo) {
+ if (pub->type >= 0x100)
+ ieee_putascii("ATI%X,T%X.\n", i, pub->type - 0x100);
+ else
+ ieee_putascii("ATI%X,%X.\n", i, pub->type);
+ }
+ i++;
+ pub = pub->next;
+ }
+ /*
+ * Write the externals
+ */
+ ext = exthead;
+ i = 1;
+ while (ext) {
+ char buf[256];
+ ieee_unqualified_name(buf, ext->name);
+ ieee_putascii("NX%X,%02X%s.\n", i++, strlen(buf), buf);
+ ext = ext->next;
+ }
+ ieee_putcs(false);
+
+ /*
+ * IEEE doesn't have a standard pass break record
+ * so use the ladsoft variant
+ */
+ ieee_putascii("CO100,06ENDSYM.\n");
+
+ /*
+ * now put types
+ */
+ i = ARRAY_BOT;
+ for (arr = arrhead; arr && debuginfo; arr = arr->next) {
+ ieee_putascii("TY%X,20,%X,%lX.\n", i++, arr->basetype,
+ arr->size);
+ }
+ /*
+ * now put locals
+ */
+ i = 1;
+ for (seg = seghead; seg && debuginfo; seg = seg->next) {
+ for (loc = seg->lochead; loc; loc = loc->next) {
+ char buf[256];
+ ieee_unqualified_name(buf, loc->name);
+ ieee_putascii("NN%X,%02X%s.\n", i, strlen(buf), buf);
+ if (loc->segment == -1)
+ ieee_putascii("ASN%X,R%X,%lX,+.\n", i, loc->index,
+ loc->offset);
+ else
+ ieee_putascii("ASN%X,%lX,%lX,+.\n", i, loc->segment * 16,
+ loc->offset);
+ if (debuginfo) {
+ if (loc->type >= 0x100)
+ ieee_putascii("ATN%X,T%X.\n", i, loc->type - 0x100);
+ else
+ ieee_putascii("ATN%X,%X.\n", i, loc->type);
+ }
+ i++;
+ }
+ }
+
+ /*
+ * put out section data;
+ */
+ seg = seghead;
+ if (!debuginfo && !strcmp(seg->name, "??LINE"))
+ seg = seg->next;
+ while (seg) {
+ if (seg->currentpos) {
+ int32_t size, org = 0;
+ data = seg->data;
+ ieee_putascii("SB%X.\n", seg->ieee_index);
+ fix = seg->fptr;
+ while (fix) {
+ size = HUNKSIZE - (org % HUNKSIZE);
+ size =
+ size + org >
+ seg->currentpos ? seg->currentpos - org : size;
+ size = fix->offset - org > size ? size : fix->offset - org;
+ org = ieee_putld(org, org + size, data->data);
+ if (org % HUNKSIZE == 0)
+ data = data->next;
+ if (org == fix->offset) {
+ org += ieee_putlr(fix);
+ fix = fix->next;
+ }
+ }
+ while (org < seg->currentpos && data) {
+ size =
+ seg->currentpos - org >
+ HUNKSIZE ? HUNKSIZE : seg->currentpos - org;
+ org = ieee_putld(org, org + size, data->data);
+ data = data->next;
+ }
+ ieee_putcs(false);
+
+ }
+ seg = seg->next;
+ }
+ /*
+ * module end record
+ */
+ ieee_putascii("ME.\n");
+}
+
+static void ieee_write_byte(struct ieeeSection *seg, int data)
+{
+ int temp;
+ if (!(temp = seg->currentpos++ % HUNKSIZE))
+ ieee_data_new(seg);
+ seg->datacurr->data[temp] = data;
+}
+
+static void ieee_write_word(struct ieeeSection *seg, int data)
+{
+ ieee_write_byte(seg, data & 0xFF);
+ ieee_write_byte(seg, (data >> 8) & 0xFF);
+}
+
+static void ieee_write_dword(struct ieeeSection *seg, int32_t data)
+{
+ ieee_write_byte(seg, data & 0xFF);
+ ieee_write_byte(seg, (data >> 8) & 0xFF);
+ ieee_write_byte(seg, (data >> 16) & 0xFF);
+ ieee_write_byte(seg, (data >> 24) & 0xFF);
+}
+static void ieee_putascii(char *format, ...)
+{
+ char buffer[256];
+ int i, l;
+ va_list ap;
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+ l = strlen(buffer);
+ for (i = 0; i < l; i++)
+ if ((uint8_t)buffer[i] > 31)
+ checksum += buffer[i];
+ va_end(ap);
+ fputs(buffer, ofile);
+}
+
+/*
+ * put out a checksum record */
+static void ieee_putcs(int toclear)
+{
+ if (toclear) {
+ ieee_putascii("CS.\n");
+ } else {
+ checksum += 'C';
+ checksum += 'S';
+ ieee_putascii("CS%02X.\n", checksum & 127);
+ }
+ checksum = 0;
+}
+
+static int32_t ieee_putld(int32_t start, int32_t end, uint8_t *buf)
+{
+ int32_t val;
+ if (start == end)
+ return (start);
+ val = start % HUNKSIZE;
+ /* fill up multiple lines */
+ while (end - start >= LDPERLINE) {
+ int i;
+ ieee_putascii("LD");
+ for (i = 0; i < LDPERLINE; i++) {
+ ieee_putascii("%02X", buf[val++]);
+ start++;
+ }
+ ieee_putascii(".\n");
+ }
+ /* if no partial lines */
+ if (start == end)
+ return (start);
+ /* make a partial line */
+ ieee_putascii("LD");
+ while (start < end) {
+ ieee_putascii("%02X", buf[val++]);
+ start++;
+ }
+ ieee_putascii(".\n");
+ return (start);
+}
+static int32_t ieee_putlr(struct ieeeFixupp *p)
+{
+/*
+ * To deal with the vagaries of segmentation the LADsoft linker
+ * defines two types of segments: absolute and virtual. Note that
+ * 'absolute' in this context is a different thing from the IEEE
+ * definition of an absolute segment type, which is also supported. If a
+ * sement is linked in virtual mode the low limit (L-var) is
+ * subtracted from each R,X, and P variable which appears in an
+ * expression, so that we can have relative offsets. Meanwhile
+ * in the ABSOLUTE mode this subtraction is not done and
+ * so we can use absolute offsets from 0. In the LADsoft linker
+ * this configuration is not done in the assemblker source but in
+ * a source the linker reads. Generally this type of thing only
+ * becomes an issue if real mode code is used. A pure 32-bit linker could
+ * get away without defining the virtual mode...
+ */
+ char buf[40];
+ int32_t size = p->size;
+ switch (p->ftype) {
+ case FT_SEG:
+ if (p->id1 < 0)
+ sprintf(buf, "%"PRIX32"", -p->id1);
+ else
+ sprintf(buf, "L%"PRIX32",10,/", p->id1);
+ break;
+ case FT_OFS:
+ sprintf(buf, "R%"PRIX32",%"PRIX32",+", p->id1, p->addend);
+ break;
+ case FT_REL:
+ sprintf(buf, "R%"PRIX32",%"PRIX32",+,P,-,%X,-", p->id1, p->addend, p->size);
+ break;
+
+ case FT_WRT:
+ if (p->id2 < 0)
+ sprintf(buf, "R%"PRIX32",%"PRIX32",+,L%"PRIX32",+,%"PRIX32",-", p->id2, p->addend,
+ p->id2, -p->id1 * 16);
+ else
+ sprintf(buf, "R%"PRIX32",%"PRIX32",+,L%"PRIX32",+,L%"PRIX32",-", p->id2, p->addend,
+ p->id2, p->id1);
+ break;
+ case FT_EXT:
+ sprintf(buf, "X%"PRIX32"", p->id1);
+ break;
+ case FT_EXTREL:
+ sprintf(buf, "X%"PRIX32",P,-,%"PRIX32",-", p->id1, size);
+ break;
+ case FT_EXTSEG:
+ /* We needed a non-ieee hack here.
+ * We introduce the Y variable, which is the low
+ * limit of the native segment the extern resides in
+ */
+ sprintf(buf, "Y%"PRIX32",10,/", p->id1);
+ break;
+ case FT_EXTWRT:
+ if (p->id2 < 0)
+ sprintf(buf, "X%"PRIX32",Y%"PRIX32",+,%"PRIX32",-", p->id2, p->id2,
+ -p->id1 * 16);
+ else
+ sprintf(buf, "X%"PRIX32",Y%"PRIX32",+,L%"PRIX32",-", p->id2, p->id2, p->id1);
+ break;
+ }
+ ieee_putascii("LR(%s,%"PRIX32").\n", buf, size);
+
+ return (size);
+}
+
+/* Dump all segment data (text and fixups )*/
+
+static void ieee_unqualified_name(char *dest, char *source)
+{
+ if (ieee_uppercase) {
+ while (*source)
+ *dest++ = toupper(*source++);
+ *dest = 0;
+ } else
+ strcpy(dest, source);
+}
+static void dbgls_init(void)
+{
+ int tempint;
+
+ fnhead = NULL;
+ fntail = &fnhead;
+ arrindex = ARRAY_BOT;
+ arrhead = NULL;
+ arrtail = &arrhead;
+ ieee_segment("??LINE", 2, &tempint);
+ any_segs = false;
+}
+static void dbgls_cleanup(void)
+{
+ struct ieeeSection *segtmp;
+ while (fnhead) {
+ struct FileName *fntemp = fnhead;
+ fnhead = fnhead->next;
+ nasm_free(fntemp->name);
+ nasm_free(fntemp);
+ }
+ for (segtmp = seghead; segtmp; segtmp = segtmp->next) {
+ while (segtmp->lochead) {
+ struct ieeePublic *loctmp = segtmp->lochead;
+ segtmp->lochead = loctmp->next;
+ nasm_free(loctmp->name);
+ nasm_free(loctmp);
+ }
+ }
+ while (arrhead) {
+ struct Array *arrtmp = arrhead;
+ arrhead = arrhead->next;
+ nasm_free(arrtmp);
+ }
+}
+
+/*
+ * because this routine is not bracketed in
+ * the main program, this routine will be called even if there
+ * is no request for debug info
+ * so, we have to make sure the ??LINE segment is avaialbe
+ * as the first segment when this debug format is selected
+ */
+static void dbgls_linnum(const char *lnfname, int32_t lineno, int32_t segto)
+{
+ struct FileName *fn;
+ struct ieeeSection *seg;
+ int i = 0;
+ if (segto == NO_SEG)
+ return;
+
+ /*
+ * If `any_segs' is still false, we must define a default
+ * segment.
+ */
+ if (!any_segs) {
+ int tempint; /* ignored */
+ if (segto != ieee_segment("__NASMDEFSEG", 2, &tempint))
+ nasm_panic("strange segment conditions in OBJ driver");
+ }
+
+ /*
+ * Find the segment we are targetting.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segto)
+ break;
+ if (!seg)
+ nasm_panic("lineno directed to nonexistent segment?");
+
+ for (fn = fnhead; fn; fn = fn->next) {
+ if (!nasm_stricmp(lnfname, fn->name))
+ break;
+ i++;
+ }
+ if (!fn) {
+ fn = nasm_malloc(sizeof(*fn));
+ fn->name = nasm_malloc(strlen(lnfname) + 1);
+ fn->index = i;
+ strcpy(fn->name, lnfname);
+ fn->next = NULL;
+ *fntail = fn;
+ fntail = &fn->next;
+ }
+ ieee_write_byte(seghead, fn->index);
+ ieee_write_word(seghead, lineno);
+ ieee_write_fixup(segto, NO_SEG, seghead, 4, OUT_ADDRESS,
+ seg->currentpos);
+
+}
+static void dbgls_deflabel(char *name, int32_t segment,
+ int64_t offset, int is_global, char *special)
+{
+ struct ieeeSection *seg;
+
+ /* Keep compiler from warning about special */
+ (void)special;
+
+ /*
+ * Note: ..[^@] special symbols are filtered in labels.c
+ */
+
+ /*
+ * If it's a special-retry from pass two, discard it.
+ */
+ if (is_global == 3)
+ return;
+
+ /*
+ * Case (i):
+ */
+ if (ieee_seg_needs_update)
+ return;
+ if (segment < SEG_ABS && segment != NO_SEG && segment % 2)
+ return;
+
+ if (segment >= SEG_ABS || segment == NO_SEG) {
+ return;
+ }
+
+ /*
+ * If `any_segs' is still false, we might need to define a
+ * default segment, if they're trying to declare a label in
+ * `first_seg'. But the label should exist due to a prior
+ * call to ieee_deflabel so we can skip that.
+ */
+
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segment) {
+ struct ieeePublic *loc;
+ /*
+ * Case (ii). Maybe MODPUB someday?
+ */
+ if (!is_global) {
+ last_defined = loc = nasm_malloc(sizeof(*loc));
+ *seg->loctail = loc;
+ seg->loctail = &loc->next;
+ loc->next = NULL;
+ loc->name = nasm_strdup(name);
+ loc->offset = offset;
+ loc->segment = -1;
+ loc->index = seg->ieee_index;
+ }
+ }
+}
+static void dbgls_typevalue(int32_t type)
+{
+ int elem = TYM_ELEMENTS(type);
+ type = TYM_TYPE(type);
+
+ if (!last_defined)
+ return;
+
+ switch (type) {
+ case TY_BYTE:
+ last_defined->type = 1; /* uint8_t */
+ break;
+ case TY_WORD:
+ last_defined->type = 3; /* unsigned word */
+ break;
+ case TY_DWORD:
+ last_defined->type = 5; /* unsigned dword */
+ break;
+ case TY_FLOAT:
+ last_defined->type = 9; /* float */
+ break;
+ case TY_QWORD:
+ last_defined->type = 10; /* qword */
+ break;
+ case TY_TBYTE:
+ last_defined->type = 11; /* TBYTE */
+ break;
+ default:
+ last_defined->type = 0x10; /* near label */
+ break;
+ }
+
+ if (elem > 1) {
+ struct Array *arrtmp = nasm_malloc(sizeof(*arrtmp));
+ int vtype = last_defined->type;
+ arrtmp->size = elem;
+ arrtmp->basetype = vtype;
+ arrtmp->next = NULL;
+ last_defined->type = arrindex++ + 0x100;
+ *arrtail = arrtmp;
+ arrtail = &(arrtmp->next);
+ }
+ last_defined = NULL;
+}
+static void dbgls_output(int output_type, void *param)
+{
+ (void)output_type;
+ (void)param;
+}
+static const struct dfmt ladsoft_debug_form = {
+ "LADsoft Debug Records",
+ "ladsoft",
+ dbgls_init,
+ dbgls_linnum,
+ dbgls_deflabel,
+ null_debug_directive,
+ dbgls_typevalue,
+ dbgls_output,
+ dbgls_cleanup,
+ NULL /* pragma list */
+};
+static const struct dfmt * const ladsoft_debug_arr[3] = {
+ &ladsoft_debug_form,
+ &null_debug_form,
+ NULL
+};
+const struct ofmt of_ieee = {
+ "IEEE-695 (LADsoft variant) object file format",
+ "ieee",
+ ".o",
+ OFMT_TEXT,
+ 32,
+ ladsoft_debug_arr,
+ &ladsoft_debug_form,
+ NULL,
+ ieee_init,
+ null_reset,
+ nasm_do_legacy_output,
+ ieee_out,
+ ieee_deflabel,
+ ieee_segment,
+ NULL,
+ ieee_sectalign,
+ ieee_segbase,
+ ieee_directive,
+ ieee_cleanup,
+ NULL /* pragma list */
+};
+
+#endif /* OF_IEEE */
diff --git a/output/outlib.c b/output/outlib.c
new file mode 100644
index 00000000..c60de055
--- /dev/null
+++ b/output/outlib.c
@@ -0,0 +1,58 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * libout.c
+ *
+ * Common routines for the output backends.
+ */
+
+#include "compiler.h"
+#include "nasm.h"
+#include "outlib.h"
+
+uint64_t realsize(enum out_type type, uint64_t size)
+{
+ switch (type) {
+ case OUT_REL1ADR:
+ return 1;
+ case OUT_REL2ADR:
+ return 2;
+ case OUT_REL4ADR:
+ return 4;
+ case OUT_REL8ADR:
+ return 8;
+ default:
+ return size;
+ }
+}
diff --git a/output/outlib.h b/output/outlib.h
new file mode 100644
index 00000000..6dc7bdad
--- /dev/null
+++ b/output/outlib.h
@@ -0,0 +1,65 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_OUTLIB_H
+#define NASM_OUTLIB_H
+
+#include "nasm.h"
+#include "error.h"
+
+uint64_t realsize(enum out_type type, uint64_t size);
+
+/* Do-nothing versions of some output routines */
+enum directive_result
+null_directive(enum directive directive, char *value, int pass);
+void null_sectalign(int32_t seg, unsigned int value);
+void null_reset(void);
+int32_t null_segbase(int32_t seg);
+
+/* Do-nothing versions of all the debug routines */
+void null_debug_init(void);
+void null_debug_linenum(const char *filename, int32_t linenumber,
+ int32_t segto);
+void null_debug_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special);
+void null_debug_directive(const char *directive, const char *params);
+void null_debug_typevalue(int32_t type);
+void null_debug_output(int type, void *param);
+void null_debug_cleanup(void);
+extern const struct dfmt * const null_debug_arr[2];
+
+/* Wrapper for unported backends */
+void nasm_do_legacy_output(const struct out_data *data);
+
+#endif /* NASM_OUTLIB_H */
+
diff --git a/output/outmacho.c b/output/outmacho.c
new file mode 100644
index 00000000..769aac02
--- /dev/null
+++ b/output/outmacho.c
@@ -0,0 +1,2409 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outmacho.c output routines for the Netwide Assembler to produce
+ * NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "ilog2.h"
+#include "labels.h"
+#include "error.h"
+#include "saa.h"
+#include "raa.h"
+#include "rbtree.h"
+#include "hashtbl.h"
+#include "outform.h"
+#include "outlib.h"
+#include "ver.h"
+#include "dwarf.h"
+#include "macho.h"
+
+#if defined(OF_MACHO) || defined(OF_MACHO64)
+
+/* Mach-O in-file header structure sizes */
+#define MACHO_HEADER_SIZE 28
+#define MACHO_SEGCMD_SIZE 56
+#define MACHO_SECTCMD_SIZE 68
+#define MACHO_SYMCMD_SIZE 24
+#define MACHO_NLIST_SIZE 12
+#define MACHO_RELINFO_SIZE 8
+
+#define MACHO_HEADER64_SIZE 32
+#define MACHO_SEGCMD64_SIZE 72
+#define MACHO_SECTCMD64_SIZE 80
+#define MACHO_NLIST64_SIZE 16
+
+/* Mach-O relocations numbers */
+
+#define VM_PROT_DEFAULT (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)
+#define VM_PROT_ALL (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)
+
+/* Our internal relocation types */
+enum reltype {
+ RL_ABS, /* Absolute relocation */
+ RL_REL, /* Relative relocation */
+ RL_TLV, /* Thread local */
+ RL_BRANCH, /* Relative direct branch */
+ RL_SUB, /* X86_64_RELOC_SUBTRACT */
+ RL_GOT, /* X86_64_RELOC_GOT */
+ RL_GOTLOAD /* X86_64_RELOC_GOT_LOAD */
+};
+#define RL_MAX_32 RL_TLV
+#define RL_MAX_64 RL_GOTLOAD
+
+struct macho_fmt {
+ uint32_t ptrsize; /* Pointer size in bytes */
+ uint32_t mh_magic; /* Which magic number to use */
+ uint32_t cpu_type; /* Which CPU type */
+ uint32_t lc_segment; /* Which segment load command */
+ uint32_t header_size; /* Header size */
+ uint32_t segcmd_size; /* Segment command size */
+ uint32_t sectcmd_size; /* Section command size */
+ uint32_t nlist_size; /* Nlist (symbol) size */
+ enum reltype maxreltype; /* Maximum entry in enum reltype permitted */
+ uint32_t reloc_abs; /* Absolute relocation type */
+ uint32_t reloc_rel; /* Relative relocation type */
+ uint32_t reloc_tlv; /* Thread local relocation type */
+ bool forcesym; /* Always use "external" (symbol-relative) relocations */
+};
+
+static struct macho_fmt fmt;
+
+static void fwriteptr(uint64_t data, FILE * fp)
+{
+ fwriteaddr(data, fmt.ptrsize, fp);
+}
+
+struct section {
+ /* nasm internal data */
+ struct section *next;
+ struct SAA *data;
+ int32_t index; /* Main section index */
+ int32_t subsection; /* Current subsection index */
+ int32_t fileindex;
+ struct reloc *relocs;
+ struct rbtree *syms[2]; /* All/global symbols symbols in section */
+ int align;
+ bool by_name; /* This section was specified by full MachO name */
+ char namestr[34]; /* segment,section as a C string */
+
+ /* data that goes into the file */
+ char sectname[16]; /* what this section is called */
+ char segname[16]; /* segment this section will be in */
+ uint64_t addr; /* in-memory address (subject to alignment) */
+ uint64_t size; /* in-memory and -file size */
+ uint64_t offset; /* in-file offset */
+ uint32_t pad; /* padding bytes before section */
+ uint32_t nreloc; /* relocation entry count */
+ uint32_t flags; /* type and attributes (masked) */
+ uint32_t extreloc; /* external relocations */
+};
+
+#define S_NASM_TYPE_MASK 0x800004ff /* we consider these bits "section type" */
+
+/* fake section for absolute symbols, *not* part of the section linked list */
+static struct section absolute_sect;
+
+struct reloc {
+ /* nasm internal data */
+ struct reloc *next;
+
+ /* data that goes into the file */
+ int32_t addr; /* op's offset in section */
+ uint32_t snum:24, /* contains symbol index if
+ ** ext otherwise in-file
+ ** section number */
+ pcrel:1, /* relative relocation */
+ length:2, /* 0=byte, 1=word, 2=int32_t, 3=int64_t */
+ ext:1, /* external symbol referenced */
+ type:4; /* reloc type */
+};
+
+struct symbol {
+ /* nasm internal data */
+ struct rbtree symv[2]; /* All/global symbol rbtrees; "key" contains the
+ symbol offset. */
+ struct symbol *next; /* next symbol in the list */
+ char *name; /* name of this symbol */
+ int32_t initial_snum; /* symbol number used above in reloc */
+ int32_t snum; /* true snum for reloc */
+
+ /* data that goes into the file */
+ uint32_t strx; /* string table index */
+ uint8_t type; /* symbol type */
+ uint8_t sect; /* NO_SECT or section number */
+ uint16_t desc; /* for stab debugging, 0 for us */
+};
+
+#define DEFAULT_SECTION_ALIGNMENT 0 /* byte (i.e. no) alignment */
+
+static struct section *sects, **sectstail, **sectstab;
+static struct symbol *syms, **symstail;
+static uint32_t nsyms;
+
+/* These variables are set by macho_layout_symbols() to organize
+ the symbol table and string table in order the dynamic linker
+ expects. They are then used in macho_write() to put out the
+ symbols and strings in that order.
+
+ The order of the symbol table is:
+ local symbols
+ defined external symbols (sorted by name)
+ undefined external symbols (sorted by name)
+
+ The order of the string table is:
+ strings for external symbols
+ strings for local symbols
+ */
+static uint32_t ilocalsym = 0;
+static uint32_t iextdefsym = 0;
+static uint32_t iundefsym = 0;
+static uint32_t nlocalsym;
+static uint32_t nextdefsym;
+static uint32_t nundefsym;
+static struct symbol **extdefsyms = NULL;
+static struct symbol **undefsyms = NULL;
+
+static struct RAA *extsyms;
+static struct SAA *strs;
+static uint32_t strslen;
+
+/* Global file information. This should be cleaned up into either
+ a structure or as function arguments. */
+static uint32_t head_ncmds = 0;
+static uint32_t head_sizeofcmds = 0;
+static uint32_t head_flags = 0;
+static uint64_t seg_filesize = 0;
+static uint64_t seg_vmsize = 0;
+static uint32_t seg_nsects = 0;
+static uint64_t rel_padcnt = 0;
+
+/*
+ * Functions for handling fixed-length zero-padded string
+ * fields, that may or may not be null-terminated.
+ */
+
+/* Copy a string into a zero-padded fixed-length field */
+#define xstrncpy(xdst, xsrc) strncpy(xdst, xsrc, sizeof(xdst))
+
+/* Compare a fixed-length field with a string */
+#define xstrncmp(xdst, xsrc) strncmp(xdst, xsrc, sizeof(xdst))
+
+#define alignint32_t(x) \
+ ALIGN(x, sizeof(int32_t)) /* align x to int32_t boundary */
+
+#define alignint64_t(x) \
+ ALIGN(x, sizeof(int64_t)) /* align x to int64_t boundary */
+
+#define alignptr(x) \
+ ALIGN(x, fmt.ptrsize) /* align x to output format width */
+
+static struct hash_table section_by_name;
+static struct RAA *section_by_index;
+
+static struct section * never_null
+find_or_add_section(const char *segname, const char *sectname)
+{
+ struct hash_insert hi;
+ void **sp;
+ struct section *s;
+ char sect[34];
+
+ snprintf(sect, sizeof sect, "%-16s,%-16s", segname, sectname);
+
+ sp = hash_find(&section_by_name, sect, &hi);
+ if (sp)
+ return (struct section *)(*sp);
+
+ s = nasm_zalloc(sizeof *s);
+ xstrncpy(s->segname, segname);
+ xstrncpy(s->sectname, sectname);
+ xstrncpy(s->namestr, sect);
+ hash_add(&hi, s->namestr, s);
+
+ s->index = s->subsection = seg_alloc();
+ section_by_index = raa_write_ptr(section_by_index, s->index >> 1, s);
+
+ return s;
+}
+
+static inline bool is_new_section(const struct section *s)
+{
+ return !s->data;
+}
+
+static struct section *get_section_by_name(const char *segname,
+ const char *sectname)
+{
+ char sect[34];
+ void **sp;
+
+ snprintf(sect, sizeof sect, "%-16s,%-16s", segname, sectname);
+
+ sp = hash_find(&section_by_name, sect, NULL);
+ return sp ? (struct section *)(*sp) : NULL;
+}
+
+static struct section *get_section_by_index(int32_t index)
+{
+ if (index < 0 || index >= SEG_ABS || (index & 1))
+ return NULL;
+
+ return raa_read_ptr(section_by_index, index >> 1);
+}
+
+struct dir_list {
+ struct dir_list *next;
+ struct dir_list *last;
+ const char *dir_name;
+ uint32_t dir;
+};
+
+struct file_list {
+ struct file_list *next;
+ struct file_list *last;
+ const char *file_name;
+ uint32_t file;
+ struct dir_list *dir;
+};
+
+struct dw_sect_list {
+ struct SAA *psaa;
+ int32_t section;
+ uint32_t line;
+ uint64_t offset;
+ uint32_t file;
+ struct dw_sect_list *next;
+ struct dw_sect_list *last;
+};
+
+struct section_info {
+ uint64_t size;
+ int32_t secto;
+};
+
+#define DW_LN_BASE (-5)
+#define DW_LN_RANGE 14
+#define DW_OPCODE_BASE 13
+#define DW_MAX_LN (DW_LN_BASE + DW_LN_RANGE)
+#define DW_MAX_SP_OPCODE 256
+
+static struct file_list *dw_head_file = 0, *dw_cur_file = 0, **dw_last_file_next = NULL;
+static struct dir_list *dw_head_dir = 0, **dw_last_dir_next = NULL;
+static struct dw_sect_list *dw_head_sect = 0, *dw_cur_sect = 0, *dw_last_sect = 0;
+static uint32_t cur_line = 0, dw_num_files = 0, dw_num_dirs = 0, dw_num_sects = 0;
+static bool dbg_immcall = false;
+static const char *module_name = NULL;
+
+/*
+ * Special section numbers which are used to define Mach-O special
+ * symbols, which can be used with WRT to provide PIC relocation
+ * types.
+ */
+static int32_t macho_tlvp_sect;
+static int32_t macho_gotpcrel_sect;
+
+static void macho_init(void)
+{
+ module_name = inname;
+ sects = NULL;
+ sectstail = &sects;
+
+ /* Fake section for absolute symbols */
+ absolute_sect.index = NO_SEG;
+
+ syms = NULL;
+ symstail = &syms;
+ nsyms = 0;
+ nlocalsym = 0;
+ nextdefsym = 0;
+ nundefsym = 0;
+
+ extsyms = raa_init();
+ strs = saa_init(1L);
+
+ section_by_index = raa_init();
+ hash_init(&section_by_name, HASH_MEDIUM);
+
+ /* string table starts with a zero byte so index 0 is an empty string */
+ saa_wbytes(strs, zero_buffer, 1);
+ strslen = 1;
+
+ /* add special symbol for TLVP */
+ macho_tlvp_sect = seg_alloc() + 1;
+ backend_label("..tlvp", macho_tlvp_sect, 0L);
+}
+
+static void sect_write(struct section *sect,
+ const uint8_t *data, uint32_t len)
+{
+ saa_wbytes(sect->data, data, len);
+ sect->size += len;
+}
+
+/*
+ * Find a suitable global symbol for a ..gotpcrel or ..tlvp reference
+ */
+static struct symbol *macho_find_sym(struct section *s, uint64_t offset,
+ bool global, bool exact)
+{
+ struct rbtree *srb;
+
+ srb = rb_search(s->syms[global], offset);
+
+ if (!srb || (exact && srb->key != offset)) {
+ nasm_error(ERR_NONFATAL, "unable to find a suitable%s%s symbol"
+ " for this reference",
+ global ? " global" : "",
+ s == &absolute_sect ? " absolute " : "");
+ return NULL;
+ }
+
+ return container_of(srb - global, struct symbol, symv);
+}
+
+static int64_t add_reloc(struct section *sect, int32_t section,
+ int64_t offset,
+ enum reltype reltype, int bytes)
+{
+ struct reloc *r;
+ struct section *s;
+ int32_t fi;
+ int64_t adjust;
+
+ /* Double check this is a valid relocation type for this platform */
+ nasm_assert(reltype <= fmt.maxreltype);
+
+ /* the current end of the section will be the symbol's address for
+ ** now, might have to be fixed by macho_fixup_relocs() later on. make
+ ** sure we don't make the symbol scattered by setting the highest
+ ** bit by accident */
+ r = nasm_malloc(sizeof(struct reloc));
+ r->addr = sect->size & ~R_SCATTERED;
+ r->ext = 1;
+ adjust = 0;
+
+ /* match byte count 1, 2, 4, 8 to length codes 0, 1, 2, 3 respectively */
+ r->length = ilog2_32(bytes);
+
+ /* set default relocation values */
+ r->type = fmt.reloc_abs;
+ r->pcrel = 0;
+ r->snum = R_ABS;
+
+ s = get_section_by_index(section);
+ fi = s ? s->fileindex : NO_SECT;
+
+ /* absolute relocation */
+ switch (reltype) {
+ case RL_ABS:
+ if (section == NO_SEG) {
+ /* absolute (can this even happen?) */
+ r->ext = 0;
+ } else if (fi == NO_SECT) {
+ /* external */
+ r->snum = raa_read(extsyms, section);
+ } else {
+ /* local */
+ r->ext = 0;
+ r->snum = fi;
+ }
+ break;
+
+ case RL_REL:
+ case RL_BRANCH:
+ r->type = fmt.reloc_rel;
+ r->pcrel = 1;
+ if (section == NO_SEG) {
+ /* may optionally be converted below by fmt.forcesym */
+ r->ext = 0;
+ } else if (fi == NO_SECT) {
+ /* external */
+ sect->extreloc = 1;
+ r->snum = raa_read(extsyms, section);
+ if (reltype == RL_BRANCH)
+ r->type = X86_64_RELOC_BRANCH;
+ } else {
+ /* local */
+ r->ext = 0;
+ r->snum = fi;
+ if (reltype == RL_BRANCH)
+ r->type = X86_64_RELOC_BRANCH;
+ }
+ break;
+
+ case RL_SUB: /* obsolete */
+ nasm_error(ERR_WARNING, "relcation with subtraction"
+ "becomes to be obsolete");
+ r->ext = 0;
+ r->type = X86_64_RELOC_SUBTRACTOR;
+ break;
+
+ case RL_GOT:
+ r->type = X86_64_RELOC_GOT;
+ goto needsym;
+
+ case RL_GOTLOAD:
+ r->type = X86_64_RELOC_GOT_LOAD;
+ goto needsym;
+
+ case RL_TLV:
+ r->type = fmt.reloc_tlv;
+ goto needsym;
+
+ needsym:
+ r->pcrel = (fmt.ptrsize == 8 ? 1 : 0);
+ if (section == NO_SEG) {
+ nasm_error(ERR_NONFATAL, "Unsupported use of use of WRT");
+ goto bail;
+ } else if (fi == NO_SECT) {
+ /* external */
+ r->snum = raa_read(extsyms, section);
+ } else {
+ /* internal - GOTPCREL doesn't need to be in global */
+ struct symbol *sym = macho_find_sym(s, offset,
+ false, /* reltype != RL_TLV */
+ true);
+ if (!sym) {
+ nasm_error(ERR_NONFATAL, "Symbol for WRT not found");
+ goto bail;
+ }
+
+ adjust -= sym->symv[0].key;
+ r->snum = sym->initial_snum;
+ }
+ break;
+ }
+
+ /*
+ * For 64-bit Mach-O, force a symbol reference if at all possible
+ * Allow for r->snum == R_ABS by searching absolute_sect
+ */
+ if (!r->ext && fmt.forcesym) {
+ struct symbol *sym = macho_find_sym(s ? s : &absolute_sect,
+ offset, false, false);
+ if (sym) {
+ adjust -= sym->symv[0].key;
+ r->snum = sym->initial_snum;
+ r->ext = 1;
+ }
+ }
+
+ if (r->pcrel)
+ adjust += ((r->ext && fmt.ptrsize == 8) ? bytes : -(int64_t)sect->size);
+
+ /* NeXT as puts relocs in reversed order (address-wise) into the
+ ** files, so we do the same, doesn't seem to make much of a
+ ** difference either way */
+ r->next = sect->relocs;
+ sect->relocs = r;
+ if (r->ext)
+ sect->extreloc = 1;
+ ++sect->nreloc;
+
+ return adjust;
+
+ bail:
+ nasm_free(r);
+ return 0;
+}
+
+static void macho_output(int32_t secto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t section, int32_t wrt)
+{
+ struct section *s;
+ int64_t addr, offset;
+ uint8_t mydata[16], *p;
+ bool is_bss;
+ enum reltype reltype;
+
+ s = get_section_by_index(secto);
+ if (!s) {
+ nasm_error(ERR_WARNING, "attempt to assemble code in"
+ " section %d: defaulting to `.text'", secto);
+ s = get_section_by_name("__TEXT", "__text");
+
+ /* should never happen */
+ if (!s)
+ nasm_panic("text section not found");
+ }
+
+ /* debug code generation only for sections tagged with
+ * instruction attribute */
+ if (s->flags & S_ATTR_SOME_INSTRUCTIONS)
+ {
+ struct section_info sinfo;
+ sinfo.size = s->size;
+ sinfo.secto = secto;
+ dfmt->debug_output(0, &sinfo);
+ }
+
+ is_bss = (s->flags & SECTION_TYPE) == S_ZEROFILL;
+
+ if (is_bss && type != OUT_RESERVE) {
+ nasm_error(ERR_WARNING, "attempt to initialize memory in "
+ "BSS section: ignored");
+ /* FIXME */
+ nasm_error(ERR_WARNING, "section size may be negative"
+ "with address symbols");
+ s->size += realsize(type, size);
+ return;
+ }
+
+ memset(mydata, 0, sizeof(mydata));
+
+ switch (type) {
+ case OUT_RESERVE:
+ if (!is_bss) {
+ nasm_error(ERR_WARNING, "uninitialized space declared in"
+ " %s,%s section: zeroing", s->segname, s->sectname);
+
+ sect_write(s, NULL, size);
+ } else
+ s->size += size;
+
+ break;
+
+ case OUT_RAWDATA:
+ sect_write(s, data, size);
+ break;
+
+ case OUT_ADDRESS:
+ {
+ int asize = abs((int)size);
+
+ addr = *(int64_t *)data;
+ if (section != NO_SEG) {
+ if (section % 2) {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " section base references");
+ } else if (wrt == NO_SEG) {
+ if (fmt.ptrsize == 8 && asize != 8) {
+ nasm_error(ERR_NONFATAL,
+ "Mach-O 64-bit format does not support"
+ " 32-bit absolute addresses");
+ } else {
+ addr += add_reloc(s, section, addr, RL_ABS, asize);
+ }
+ } else if (wrt == macho_tlvp_sect && fmt.ptrsize != 8 &&
+ asize == (int) fmt.ptrsize) {
+ addr += add_reloc(s, section, addr, RL_TLV, asize);
+ } else {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " this use of WRT");
+ }
+ }
+
+ p = mydata;
+ WRITEADDR(p, addr, asize);
+ sect_write(s, mydata, asize);
+ break;
+ }
+
+ case OUT_REL1ADR:
+ case OUT_REL2ADR:
+
+ p = mydata;
+ offset = *(int64_t *)data;
+ addr = offset - size;
+
+ if (section != NO_SEG && section % 2) {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " section base references");
+ } else if (fmt.ptrsize == 8) {
+ nasm_error(ERR_NONFATAL, "Unsupported non-32-bit"
+ " Macho-O relocation [2]");
+ } else if (wrt != NO_SEG) {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " this use of WRT");
+ wrt = NO_SEG; /* we can at least _try_ to continue */
+ } else {
+ addr += add_reloc(s, section, addr+size, RL_REL,
+ type == OUT_REL1ADR ? 1 : 2);
+ }
+
+ WRITESHORT(p, addr);
+ sect_write(s, mydata, type == OUT_REL1ADR ? 1 : 2);
+ break;
+
+ case OUT_REL4ADR:
+ case OUT_REL8ADR:
+
+ p = mydata;
+ offset = *(int64_t *)data;
+ addr = offset - size;
+ reltype = RL_REL;
+
+ if (section != NO_SEG && section % 2) {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " section base references");
+ } else if (wrt == NO_SEG) {
+ if (fmt.ptrsize == 8 &&
+ (s->flags & S_ATTR_SOME_INSTRUCTIONS)) {
+ uint8_t opcode[2];
+
+ opcode[0] = opcode[1] = 0;
+
+ /* HACK: Retrieve instruction opcode */
+ if (likely(s->data->datalen >= 2)) {
+ saa_fread(s->data, s->data->datalen-2, opcode, 2);
+ } else if (s->data->datalen == 1) {
+ saa_fread(s->data, 0, opcode+1, 1);
+ }
+
+ if ((opcode[0] != 0x0f && (opcode[1] & 0xfe) == 0xe8) ||
+ (opcode[0] == 0x0f && (opcode[1] & 0xf0) == 0x80)) {
+ /* Direct call, jmp, or jcc */
+ reltype = RL_BRANCH;
+ }
+ }
+ } else if (wrt == macho_gotpcrel_sect) {
+ reltype = RL_GOT;
+
+ if ((s->flags & S_ATTR_SOME_INSTRUCTIONS) &&
+ s->data->datalen >= 3) {
+ uint8_t gotload[3];
+
+ /* HACK: Retrieve instruction opcode */
+ saa_fread(s->data, s->data->datalen-3, gotload, 3);
+ if ((gotload[0] & 0xf8) == 0x48 &&
+ gotload[1] == 0x8b &&
+ (gotload[2] & 0307) == 0005) {
+ /* movq <reg>,[rel sym wrt ..gotpcrel] */
+ reltype = RL_GOTLOAD;
+ }
+ }
+ } else if (wrt == macho_tlvp_sect && fmt.ptrsize == 8) {
+ reltype = RL_TLV;
+ } else {
+ nasm_error(ERR_NONFATAL, "Mach-O format does not support"
+ " this use of WRT");
+ /* continue with RL_REL */
+ }
+
+ addr += add_reloc(s, section, offset, reltype,
+ type == OUT_REL4ADR ? 4 : 8);
+ WRITELONG(p, addr);
+ sect_write(s, mydata, type == OUT_REL4ADR ? 4 : 8);
+ break;
+
+ default:
+ nasm_error(ERR_NONFATAL, "Unrepresentable relocation in Mach-O");
+ break;
+ }
+}
+
+#define S_CODE (S_REGULAR | S_ATTR_SOME_INSTRUCTIONS | S_ATTR_PURE_INSTRUCTIONS)
+#define NO_TYPE S_NASM_TYPE_MASK
+
+/* Translation table from traditional Unix section names to Mach-O */
+static const struct macho_known_section {
+ const char *nasmsect;
+ const char *segname;
+ const char *sectname;
+ const uint32_t flags;
+} known_sections[] = {
+ { ".text", "__TEXT", "__text", S_CODE },
+ { ".data", "__DATA", "__data", S_REGULAR },
+ { ".rodata", "__DATA", "__const", S_REGULAR },
+ { ".bss", "__DATA", "__bss", S_ZEROFILL },
+ { ".debug_abbrev", "__DWARF", "__debug_abbrev", S_ATTR_DEBUG },
+ { ".debug_info", "__DWARF", "__debug_info", S_ATTR_DEBUG },
+ { ".debug_line", "__DWARF", "__debug_line", S_ATTR_DEBUG },
+ { ".debug_str", "__DWARF", "__debug_str", S_ATTR_DEBUG },
+};
+
+/* Section type or attribute directives */
+static const struct macho_known_section_attr {
+ const char *name;
+ uint32_t flags;
+} sect_attribs[] = {
+ { "data", S_REGULAR },
+ { "code", S_CODE },
+ { "mixed", S_REGULAR | S_ATTR_SOME_INSTRUCTIONS },
+ { "bss", S_ZEROFILL },
+ { "zerofill", S_ZEROFILL },
+ { "no_dead_strip", NO_TYPE | S_ATTR_NO_DEAD_STRIP },
+ { "live_support", NO_TYPE | S_ATTR_LIVE_SUPPORT },
+ { "strip_static_syms", NO_TYPE | S_ATTR_STRIP_STATIC_SYMS },
+ { "debug", NO_TYPE | S_ATTR_DEBUG },
+ { NULL, 0 }
+};
+
+static const struct macho_known_section *
+lookup_known_section(const char *name, bool by_sectname)
+{
+ size_t i;
+
+ if (name && name[0]) {
+ for (i = 0; i < ARRAY_SIZE(known_sections); i++) {
+ const char *p = by_sectname ?
+ known_sections[i].sectname :
+ known_sections[i].nasmsect;
+ if (!strcmp(name, p))
+ return &known_sections[i];
+ }
+ }
+
+ return NULL;
+}
+
+static int32_t macho_section(char *name, int pass, int *bits)
+{
+ const struct macho_known_section *known_section;
+ const struct macho_known_section_attr *sa;
+ char *sectionAttributes;
+ struct section *s;
+ const char *section, *segment;
+ uint32_t flags;
+ char *currentAttribute;
+ char *comma;
+
+ bool new_seg;
+
+ (void)pass;
+
+ /* Default to the appropriate number of bits. */
+ if (!name) {
+ *bits = fmt.ptrsize << 3;
+ name = ".text";
+ sectionAttributes = NULL;
+ } else {
+ sectionAttributes = name;
+ name = nasm_strsep(&sectionAttributes, " \t");
+ }
+
+ section = segment = NULL;
+ flags = 0;
+
+ comma = strchr(name, ',');
+ if (comma) {
+ int len;
+
+ *comma = '\0';
+ segment = name;
+ section = comma+1;
+
+ len = strlen(segment);
+ if (len == 0) {
+ nasm_error(ERR_NONFATAL, "empty segment name\n");
+ } else if (len > 16) {
+ nasm_error(ERR_NONFATAL, "segment name %s too long\n", segment);
+ }
+
+ len = strlen(section);
+ if (len == 0) {
+ nasm_error(ERR_NONFATAL, "empty section name\n");
+ } else if (len > 16) {
+ nasm_error(ERR_NONFATAL, "section name %s too long\n", section);
+ }
+
+ known_section = lookup_known_section(section, true);
+ if (known_section)
+ flags = known_section->flags;
+ else
+ flags = S_REGULAR;
+ } else {
+ known_section = lookup_known_section(name, false);
+ if (!known_section) {
+ nasm_error(ERR_NONFATAL, "unknown section name %s\n", name);
+ return NO_SEG;
+ }
+
+ segment = known_section->segname;
+ section = known_section->sectname;
+ flags = known_section->flags;
+ }
+
+ /* try to find section with that name, or create it */
+ s = find_or_add_section(segment, section);
+ new_seg = is_new_section(s);
+
+ /* initialize it if it is a brand new section */
+ if (new_seg) {
+ *sectstail = s;
+ sectstail = &s->next;
+
+ s->data = saa_init(1L);
+ s->fileindex = ++seg_nsects;
+ s->align = -1;
+ s->pad = -1;
+ s->offset = -1;
+ s->by_name = false;
+
+ s->size = 0;
+ s->nreloc = 0;
+ s->flags = flags;
+ }
+
+ if (comma)
+ *comma = ','; /* Restore comma */
+
+ s->by_name = s->by_name || comma; /* Was specified by name */
+
+ flags = NO_TYPE;
+
+ while (sectionAttributes &&
+ (currentAttribute = nasm_strsep(&sectionAttributes, " \t"))) {
+ if (!*currentAttribute)
+ continue;
+
+ if (!nasm_strnicmp("align=", currentAttribute, 6)) {
+ char *end;
+ int newAlignment, value;
+
+ value = strtoul(currentAttribute + 6, (char**)&end, 0);
+ newAlignment = alignlog2_32(value);
+
+ if (0 != *end) {
+ nasm_error(ERR_NONFATAL,
+ "unknown or missing alignment value \"%s\" "
+ "specified for section \"%s\"",
+ currentAttribute + 6,
+ name);
+ } else if (0 > newAlignment) {
+ nasm_error(ERR_NONFATAL,
+ "alignment of %d (for section \"%s\") is not "
+ "a power of two",
+ value,
+ name);
+ }
+
+ if (s->align < newAlignment)
+ s->align = newAlignment;
+ } else {
+ for (sa = sect_attribs; sa->name; sa++) {
+ if (!nasm_stricmp(sa->name, currentAttribute)) {
+ if ((sa->flags & S_NASM_TYPE_MASK) != NO_TYPE) {
+ flags = (flags & ~S_NASM_TYPE_MASK)
+ | (sa->flags & S_NASM_TYPE_MASK);
+ }
+ flags |= sa->flags & ~S_NASM_TYPE_MASK;
+ break;
+ }
+ }
+
+ if (!sa->name) {
+ nasm_error(ERR_NONFATAL,
+ "unknown section attribute %s for section %s",
+ currentAttribute, name);
+ }
+ }
+ }
+
+ if ((flags & S_NASM_TYPE_MASK) != NO_TYPE) {
+ if (!new_seg && ((s->flags ^ flags) & S_NASM_TYPE_MASK)) {
+ nasm_error(ERR_NONFATAL,
+ "inconsistent section attributes for section %s\n",
+ name);
+ } else {
+ s->flags = (s->flags & ~S_NASM_TYPE_MASK) | flags;
+ }
+ } else {
+ s->flags |= flags & ~S_NASM_TYPE_MASK;
+ }
+
+ return s->subsection;
+}
+
+static int32_t macho_herelabel(const char *name, enum label_type type,
+ int32_t section, int32_t *subsection,
+ bool *copyoffset)
+{
+ struct section *s;
+ int32_t subsec;
+ (void)name;
+
+ if (!(head_flags & MH_SUBSECTIONS_VIA_SYMBOLS))
+ return section;
+
+ /* No subsection only for local labels */
+ if (type == LBL_LOCAL)
+ return section;
+
+ s = get_section_by_index(section);
+ if (!s)
+ return section;
+
+ subsec = *subsection;
+ if (subsec == NO_SEG) {
+ /* Allocate a new subsection index */
+ subsec = *subsection = seg_alloc();
+ section_by_index = raa_write_ptr(section_by_index, subsec >> 1, s);
+ }
+
+ s->subsection = subsec;
+ *copyoffset = true; /* Maintain previous offset */
+ return subsec;
+}
+
+static void macho_symdef(char *name, int32_t section, int64_t offset,
+ int is_global, char *special)
+{
+ struct symbol *sym;
+ struct section *s;
+ bool special_used = false;
+
+#if defined(DEBUG) && DEBUG>2
+ nasm_error(ERR_DEBUG,
+ " macho_symdef: %s, pass0=%d, passn=%"PRId64", sec=%"PRIx32", off=%"PRIx64", is_global=%d, %s\n",
+ name, pass0, passn, section, offset, is_global, special);
+#endif
+
+ if (is_global == 3) {
+ if (special) {
+ int n = strcspn(special, " \t");
+
+ if (!nasm_strnicmp(special, "private_extern", n)) {
+ for (sym = syms; sym != NULL; sym = sym->next) {
+ if (!strcmp(name, sym->name)) {
+ if (sym->type & N_PEXT)
+ return; /* nothing to be done */
+ else
+ break;
+ }
+ }
+ }
+ }
+ nasm_error(ERR_NONFATAL, "The Mach-O format does not "
+ "(yet) support forward reference fixups.");
+ return;
+ }
+
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ /*
+ * This is a NASM special symbol. We never allow it into
+ * the Macho-O symbol table, even if it's a valid one. If it
+ * _isn't_ a valid one, we should barf immediately.
+ */
+ if (strcmp(name, "..gotpcrel") && strcmp(name, "..tlvp"))
+ nasm_error(ERR_NONFATAL, "unrecognized special symbol `%s'", name);
+ return;
+ }
+
+ sym = *symstail = nasm_zalloc(sizeof(struct symbol));
+ sym->next = NULL;
+ symstail = &sym->next;
+
+ sym->name = name;
+ sym->strx = strslen;
+ sym->type = 0;
+ sym->desc = 0;
+ sym->symv[0].key = offset;
+ sym->symv[1].key = offset;
+ sym->initial_snum = -1;
+
+ /* external and common symbols get N_EXT */
+ if (is_global != 0) {
+ sym->type |= N_EXT;
+ }
+ if (is_global == 1) {
+ /* check special to see if the global symbol shall be marked as private external: N_PEXT */
+ if (special) {
+ int n = strcspn(special, " \t");
+
+ if (!nasm_strnicmp(special, "private_extern", n))
+ sym->type |= N_PEXT;
+ else
+ nasm_error(ERR_NONFATAL, "unrecognised symbol type `%.*s'", n, special);
+ }
+ special_used = true;
+ }
+
+ /* track the initially allocated symbol number for use in future fix-ups */
+ sym->initial_snum = nsyms;
+
+ if (section == NO_SEG) {
+ /* symbols in no section get absolute */
+ sym->type |= N_ABS;
+ sym->sect = NO_SECT;
+
+ s = &absolute_sect;
+ } else {
+ s = get_section_by_index(section);
+
+ sym->type |= N_SECT;
+
+ /* get the in-file index of the section the symbol was defined in */
+ sym->sect = s ? s->fileindex : NO_SECT;
+
+ if (!s) {
+ /* remember symbol number of references to external
+ ** symbols, this works because every external symbol gets
+ ** its own section number allocated internally by nasm and
+ ** can so be used as a key */
+ extsyms = raa_write(extsyms, section, nsyms);
+
+ switch (is_global) {
+ case 1:
+ case 2:
+ /* there isn't actually a difference between global
+ ** and common symbols, both even have their size in
+ ** sym->symv[0].key */
+ sym->type = N_EXT;
+ break;
+
+ default:
+ /* give an error on unfound section if it's not an
+ ** external or common symbol (assemble_file() does a
+ ** seg_alloc() on every call for them) */
+ nasm_panic("in-file index for section %d not found, is_global = %d", section, is_global);
+ break;
+ }
+ }
+ }
+
+ if (s) {
+ s->syms[0] = rb_insert(s->syms[0], &sym->symv[0]);
+ if (is_global)
+ s->syms[1] = rb_insert(s->syms[1], &sym->symv[1]);
+ }
+
+ ++nsyms;
+
+ if (special && !special_used)
+ nasm_error(ERR_NONFATAL, "no special symbol features supported here");
+}
+
+static void macho_sectalign(int32_t seg, unsigned int value)
+{
+ struct section *s;
+ int align;
+
+ nasm_assert(!(seg & 1));
+
+ s = get_section_by_index(seg);
+
+ if (!s || !is_power2(value))
+ return;
+
+ align = alignlog2_32(value);
+ if (s->align < align)
+ s->align = align;
+}
+
+extern macros_t macho_stdmac[];
+
+/* Comparison function for qsort symbol layout. */
+static int layout_compare (const struct symbol **s1,
+ const struct symbol **s2)
+{
+ return (strcmp ((*s1)->name, (*s2)->name));
+}
+
+/* The native assembler does a few things in a similar function
+
+ * Remove temporary labels
+ * Sort symbols according to local, external, undefined (by name)
+ * Order the string table
+
+ We do not remove temporary labels right now.
+
+ numsyms is the total number of symbols we have. strtabsize is the
+ number entries in the string table. */
+
+static void macho_layout_symbols (uint32_t *numsyms,
+ uint32_t *strtabsize)
+{
+ struct symbol *sym, **symp;
+ uint32_t i,j;
+
+ *numsyms = 0;
+ *strtabsize = sizeof (char);
+
+ symp = &syms;
+
+ while ((sym = *symp)) {
+ /* Undefined symbols are now external. */
+ if (sym->type == N_UNDF)
+ sym->type |= N_EXT;
+
+ if ((sym->type & N_EXT) == 0) {
+ sym->snum = *numsyms;
+ *numsyms = *numsyms + 1;
+ nlocalsym++;
+ }
+ else {
+ if ((sym->type & N_TYPE) != N_UNDF) {
+ nextdefsym++;
+ } else {
+ nundefsym++;
+ }
+
+ /* If we handle debug info we'll want
+ to check for it here instead of just
+ adding the symbol to the string table. */
+ sym->strx = *strtabsize;
+ saa_wbytes (strs, sym->name, (int32_t)(strlen(sym->name) + 1));
+ *strtabsize += strlen(sym->name) + 1;
+ }
+ symp = &(sym->next);
+ }
+
+ /* Next, sort the symbols. Most of this code is a direct translation from
+ the Apple cctools symbol layout. We need to keep compatibility with that. */
+ /* Set the indexes for symbol groups into the symbol table */
+ ilocalsym = 0;
+ iextdefsym = nlocalsym;
+ iundefsym = nlocalsym + nextdefsym;
+
+ /* allocate arrays for sorting externals by name */
+ extdefsyms = nasm_malloc(nextdefsym * sizeof(struct symbol *));
+ undefsyms = nasm_malloc(nundefsym * sizeof(struct symbol *));
+
+ i = 0;
+ j = 0;
+
+ symp = &syms;
+
+ while ((sym = *symp)) {
+
+ if((sym->type & N_EXT) == 0) {
+ sym->strx = *strtabsize;
+ saa_wbytes (strs, sym->name, (int32_t)(strlen (sym->name) + 1));
+ *strtabsize += strlen(sym->name) + 1;
+ }
+ else {
+ if ((sym->type & N_TYPE) != N_UNDF) {
+ extdefsyms[i++] = sym;
+ } else {
+ undefsyms[j++] = sym;
+ }
+ }
+ symp = &(sym->next);
+ }
+
+ qsort(extdefsyms, nextdefsym, sizeof(struct symbol *),
+ (int (*)(const void *, const void *))layout_compare);
+ qsort(undefsyms, nundefsym, sizeof(struct symbol *),
+ (int (*)(const void *, const void *))layout_compare);
+
+ for(i = 0; i < nextdefsym; i++) {
+ extdefsyms[i]->snum = *numsyms;
+ *numsyms += 1;
+ }
+ for(j = 0; j < nundefsym; j++) {
+ undefsyms[j]->snum = *numsyms;
+ *numsyms += 1;
+ }
+}
+
+/* Calculate some values we'll need for writing later. */
+
+static void macho_calculate_sizes (void)
+{
+ struct section *s;
+ int fi;
+
+ /* count sections and calculate in-memory and in-file offsets */
+ for (s = sects; s != NULL; s = s->next) {
+ uint64_t newaddr;
+
+ /* recalculate segment address based on alignment and vm size */
+ s->addr = seg_vmsize;
+
+ /* we need section alignment to calculate final section address */
+ if (s->align == -1)
+ s->align = DEFAULT_SECTION_ALIGNMENT;
+
+ newaddr = ALIGN(s->addr, UINT64_C(1) << s->align);
+ s->addr = newaddr;
+
+ seg_vmsize = newaddr + s->size;
+
+ /* zerofill sections aren't actually written to the file */
+ if ((s->flags & SECTION_TYPE) != S_ZEROFILL) {
+ /*
+ * LLVM/Xcode as always aligns the section data to 4
+ * bytes; there is a comment in the LLVM source code that
+ * perhaps aligning to pointer size would be better.
+ */
+ s->pad = ALIGN(seg_filesize, 4) - seg_filesize;
+ s->offset = seg_filesize + s->pad;
+ seg_filesize += s->size + s->pad;
+
+ /* filesize and vmsize needs to be aligned */
+ seg_vmsize += s->pad;
+ }
+ }
+
+ /* calculate size of all headers, load commands and sections to
+ ** get a pointer to the start of all the raw data */
+ if (seg_nsects > 0) {
+ ++head_ncmds;
+ head_sizeofcmds += fmt.segcmd_size + seg_nsects * fmt.sectcmd_size;
+ }
+
+ if (nsyms > 0) {
+ ++head_ncmds;
+ head_sizeofcmds += MACHO_SYMCMD_SIZE;
+ }
+
+ if (seg_nsects > MAX_SECT) {
+ nasm_fatal("MachO output is limited to %d sections\n",
+ MAX_SECT);
+ }
+
+ /* Create a table of sections by file index to avoid linear search */
+ sectstab = nasm_malloc((seg_nsects + 1) * sizeof(*sectstab));
+ sectstab[NO_SECT] = &absolute_sect;
+ for (s = sects, fi = 1; s != NULL; s = s->next, fi++)
+ sectstab[fi] = s;
+}
+
+/* Write out the header information for the file. */
+
+static void macho_write_header (void)
+{
+ fwriteint32_t(fmt.mh_magic, ofile); /* magic */
+ fwriteint32_t(fmt.cpu_type, ofile); /* CPU type */
+ fwriteint32_t(CPU_SUBTYPE_I386_ALL, ofile); /* CPU subtype */
+ fwriteint32_t(MH_OBJECT, ofile); /* Mach-O file type */
+ fwriteint32_t(head_ncmds, ofile); /* number of load commands */
+ fwriteint32_t(head_sizeofcmds, ofile); /* size of load commands */
+ fwriteint32_t(head_flags, ofile); /* flags, if any */
+ fwritezero(fmt.header_size - 7*4, ofile); /* reserved fields */
+}
+
+/* Write out the segment load command at offset. */
+
+static uint32_t macho_write_segment (uint64_t offset)
+{
+ uint64_t rel_base = alignptr(offset + seg_filesize);
+ uint32_t s_reloff = 0;
+ struct section *s;
+
+ fwriteint32_t(fmt.lc_segment, ofile); /* cmd == LC_SEGMENT_64 */
+
+ /* size of load command including section load commands */
+ fwriteint32_t(fmt.segcmd_size + seg_nsects * fmt.sectcmd_size,
+ ofile);
+
+ /* in an MH_OBJECT file all sections are in one unnamed (name
+ ** all zeros) segment */
+ fwritezero(16, ofile);
+ fwriteptr(0, ofile); /* in-memory offset */
+ fwriteptr(seg_vmsize, ofile); /* in-memory size */
+ fwriteptr(offset, ofile); /* in-file offset to data */
+ fwriteptr(seg_filesize, ofile); /* in-file size */
+ fwriteint32_t(VM_PROT_DEFAULT, ofile); /* maximum vm protection */
+ fwriteint32_t(VM_PROT_DEFAULT, ofile); /* initial vm protection */
+ fwriteint32_t(seg_nsects, ofile); /* number of sections */
+ fwriteint32_t(0, ofile); /* no flags */
+
+ /* emit section headers */
+ for (s = sects; s != NULL; s = s->next) {
+ if (s->nreloc) {
+ nasm_assert((s->flags & SECTION_TYPE) != S_ZEROFILL);
+ s->flags |= S_ATTR_LOC_RELOC;
+ if (s->extreloc)
+ s->flags |= S_ATTR_EXT_RELOC;
+ } else if (!xstrncmp(s->segname, "__DATA") &&
+ !xstrncmp(s->sectname, "__const") &&
+ !s->by_name &&
+ !get_section_by_name("__TEXT", "__const")) {
+ /*
+ * The MachO equivalent to .rodata can be either
+ * __DATA,__const or __TEXT,__const; the latter only if
+ * there are no relocations. However, when mixed it is
+ * better to specify the segments explicitly.
+ */
+ xstrncpy(s->segname, "__TEXT");
+ }
+
+ nasm_write(s->sectname, sizeof(s->sectname), ofile);
+ nasm_write(s->segname, sizeof(s->segname), ofile);
+ fwriteptr(s->addr, ofile);
+ fwriteptr(s->size, ofile);
+
+ /* dummy data for zerofill sections or proper values */
+ if ((s->flags & SECTION_TYPE) != S_ZEROFILL) {
+ nasm_assert(s->pad != (uint32_t)-1);
+ offset += s->pad;
+ fwriteint32_t(offset, ofile);
+ offset += s->size;
+ /* Write out section alignment, as a power of two.
+ e.g. 32-bit word alignment would be 2 (2^2 = 4). */
+ fwriteint32_t(s->align, ofile);
+ /* To be compatible with cctools as we emit
+ a zero reloff if we have no relocations. */
+ fwriteint32_t(s->nreloc ? rel_base + s_reloff : 0, ofile);
+ fwriteint32_t(s->nreloc, ofile);
+
+ s_reloff += s->nreloc * MACHO_RELINFO_SIZE;
+ } else {
+ fwriteint32_t(0, ofile);
+ fwriteint32_t(s->align, ofile);
+ fwriteint32_t(0, ofile);
+ fwriteint32_t(0, ofile);
+ }
+
+ fwriteint32_t(s->flags, ofile); /* flags */
+ fwriteint32_t(0, ofile); /* reserved */
+ fwriteptr(0, ofile); /* reserved */
+ }
+
+ rel_padcnt = rel_base - offset;
+ offset = rel_base + s_reloff;
+
+ return offset;
+}
+
+/* For a given chain of relocs r, write out the entire relocation
+ chain to the object file. */
+
+static void macho_write_relocs (struct reloc *r)
+{
+ while (r) {
+ uint32_t word2;
+
+ fwriteint32_t(r->addr, ofile); /* reloc offset */
+
+ word2 = r->snum;
+ word2 |= r->pcrel << 24;
+ word2 |= r->length << 25;
+ word2 |= r->ext << 27;
+ word2 |= r->type << 28;
+ fwriteint32_t(word2, ofile); /* reloc data */
+ r = r->next;
+ }
+}
+
+/* Write out the section data. */
+static void macho_write_section (void)
+{
+ struct section *s;
+ struct reloc *r;
+ uint8_t *p;
+ int32_t len;
+ int64_t l;
+ union offset {
+ uint64_t val;
+ uint8_t buf[8];
+ } blk;
+
+ for (s = sects; s != NULL; s = s->next) {
+ if ((s->flags & SECTION_TYPE) == S_ZEROFILL)
+ continue;
+
+ /* Like a.out Mach-O references things in the data or bss
+ * sections by addresses which are actually relative to the
+ * start of the _text_ section, in the _file_. See outaout.c
+ * for more information. */
+ saa_rewind(s->data);
+ for (r = s->relocs; r != NULL; r = r->next) {
+ len = (uint32_t)1 << r->length;
+ if (len > 4) /* Can this ever be an issue?! */
+ len = 8;
+ blk.val = 0;
+ saa_fread(s->data, r->addr, blk.buf, len);
+
+ /* get offset based on relocation type */
+#ifdef WORDS_LITTLEENDIAN
+ l = blk.val;
+#else
+ l = blk.buf[0];
+ l += ((int64_t)blk.buf[1]) << 8;
+ l += ((int64_t)blk.buf[2]) << 16;
+ l += ((int64_t)blk.buf[3]) << 24;
+ l += ((int64_t)blk.buf[4]) << 32;
+ l += ((int64_t)blk.buf[5]) << 40;
+ l += ((int64_t)blk.buf[6]) << 48;
+ l += ((int64_t)blk.buf[7]) << 56;
+#endif
+
+ /* If the relocation is internal add to the current section
+ offset. Otherwise the only value we need is the symbol
+ offset which we already have. The linker takes care
+ of the rest of the address. */
+ if (!r->ext) {
+ /* generate final address by section address and offset */
+ nasm_assert(r->snum <= seg_nsects);
+ l += sectstab[r->snum]->addr;
+ if (r->pcrel)
+ l -= s->addr;
+ } else if (r->pcrel && r->type == GENERIC_RELOC_VANILLA) {
+ l -= s->addr;
+ }
+
+ /* write new offset back */
+ p = blk.buf;
+ WRITEDLONG(p, l);
+ saa_fwrite(s->data, r->addr, blk.buf, len);
+ }
+
+ /* dump the section data to file */
+ fwritezero(s->pad, ofile);
+ saa_fpwrite(s->data, ofile);
+ }
+
+ /* pad last section up to reloc entries on pointer boundary */
+ fwritezero(rel_padcnt, ofile);
+
+ /* emit relocation entries */
+ for (s = sects; s != NULL; s = s->next)
+ macho_write_relocs (s->relocs);
+}
+
+/* Write out the symbol table. We should already have sorted this
+ before now. */
+static void macho_write_symtab (void)
+{
+ struct symbol *sym;
+ uint64_t i;
+
+ /* we don't need to pad here since MACHO_RELINFO_SIZE == 8 */
+
+ for (sym = syms; sym != NULL; sym = sym->next) {
+ if ((sym->type & N_EXT) == 0) {
+ fwriteint32_t(sym->strx, ofile); /* string table entry number */
+ nasm_write(&sym->type, 1, ofile); /* symbol type */
+ nasm_write(&sym->sect, 1, ofile); /* section */
+ fwriteint16_t(sym->desc, ofile); /* description */
+
+ /* Fix up the symbol value now that we know the final section
+ sizes. */
+ if (((sym->type & N_TYPE) == N_SECT) && (sym->sect != NO_SECT)) {
+ nasm_assert(sym->sect <= seg_nsects);
+ sym->symv[0].key += sectstab[sym->sect]->addr;
+ }
+
+ fwriteptr(sym->symv[0].key, ofile); /* value (i.e. offset) */
+ }
+ }
+
+ for (i = 0; i < nextdefsym; i++) {
+ sym = extdefsyms[i];
+ fwriteint32_t(sym->strx, ofile);
+ nasm_write(&sym->type, 1, ofile); /* symbol type */
+ nasm_write(&sym->sect, 1, ofile); /* section */
+ fwriteint16_t(sym->desc, ofile); /* description */
+
+ /* Fix up the symbol value now that we know the final section
+ sizes. */
+ if (((sym->type & N_TYPE) == N_SECT) && (sym->sect != NO_SECT)) {
+ nasm_assert(sym->sect <= seg_nsects);
+ sym->symv[0].key += sectstab[sym->sect]->addr;
+ }
+
+ fwriteptr(sym->symv[0].key, ofile); /* value (i.e. offset) */
+ }
+
+ for (i = 0; i < nundefsym; i++) {
+ sym = undefsyms[i];
+ fwriteint32_t(sym->strx, ofile);
+ nasm_write(&sym->type, 1, ofile); /* symbol type */
+ nasm_write(&sym->sect, 1, ofile); /* section */
+ fwriteint16_t(sym->desc, ofile); /* description */
+
+ /* Fix up the symbol value now that we know the final section
+ sizes. */
+ if (((sym->type & N_TYPE) == N_SECT) && (sym->sect != NO_SECT)) {
+ nasm_assert(sym->sect <= seg_nsects);
+ sym->symv[0].key += sectstab[sym->sect]->addr;
+ }
+
+ fwriteptr(sym->symv[0].key, ofile); /* value (i.e. offset) */
+ }
+
+}
+
+/* Fixup the snum in the relocation entries, we should be
+ doing this only for externally referenced symbols. */
+static void macho_fixup_relocs (struct reloc *r)
+{
+ struct symbol *sym;
+
+ while (r != NULL) {
+ if (r->ext) {
+ for (sym = syms; sym != NULL; sym = sym->next) {
+ if (sym->initial_snum == r->snum) {
+ r->snum = sym->snum;
+ break;
+ }
+ }
+ }
+ r = r->next;
+ }
+}
+
+/* Write out the object file. */
+
+static void macho_write (void)
+{
+ uint64_t offset = 0;
+
+ /* mach-o object file structure:
+ **
+ ** mach header
+ ** uint32_t magic
+ ** int cpu type
+ ** int cpu subtype
+ ** uint32_t mach file type
+ ** uint32_t number of load commands
+ ** uint32_t size of all load commands
+ ** (includes section struct size of segment command)
+ ** uint32_t flags
+ **
+ ** segment command
+ ** uint32_t command type == LC_SEGMENT[_64]
+ ** uint32_t size of load command
+ ** (including section load commands)
+ ** char[16] segment name
+ ** pointer in-memory offset
+ ** pointer in-memory size
+ ** pointer in-file offset to data area
+ ** pointer in-file size
+ ** (in-memory size excluding zerofill sections)
+ ** int maximum vm protection
+ ** int initial vm protection
+ ** uint32_t number of sections
+ ** uint32_t flags
+ **
+ ** section commands
+ ** char[16] section name
+ ** char[16] segment name
+ ** pointer in-memory offset
+ ** pointer in-memory size
+ ** uint32_t in-file offset
+ ** uint32_t alignment
+ ** (irrelevant in MH_OBJECT)
+ ** uint32_t in-file offset of relocation entires
+ ** uint32_t number of relocations
+ ** uint32_t flags
+ ** uint32_t reserved
+ ** uint32_t reserved
+ **
+ ** symbol table command
+ ** uint32_t command type == LC_SYMTAB
+ ** uint32_t size of load command
+ ** uint32_t symbol table offset
+ ** uint32_t number of symbol table entries
+ ** uint32_t string table offset
+ ** uint32_t string table size
+ **
+ ** raw section data
+ **
+ ** padding to pointer boundary
+ **
+ ** relocation data (struct reloc)
+ ** int32_t offset
+ ** uint data (symbolnum, pcrel, length, extern, type)
+ **
+ ** symbol table data (struct nlist)
+ ** int32_t string table entry number
+ ** uint8_t type
+ ** (extern, absolute, defined in section)
+ ** uint8_t section
+ ** (0 for global symbols, section number of definition (>= 1, <=
+ ** 254) for local symbols, size of variable for common symbols
+ ** [type == extern])
+ ** int16_t description
+ ** (for stab debugging format)
+ ** pointer value (i.e. file offset) of symbol or stab offset
+ **
+ ** string table data
+ ** list of null-terminated strings
+ */
+
+ /* Emit the Mach-O header. */
+ macho_write_header();
+
+ offset = fmt.header_size + head_sizeofcmds;
+
+ /* emit the segment load command */
+ if (seg_nsects > 0)
+ offset = macho_write_segment (offset);
+ else
+ nasm_error(ERR_WARNING, "no sections?");
+
+ if (nsyms > 0) {
+ /* write out symbol command */
+ fwriteint32_t(LC_SYMTAB, ofile); /* cmd == LC_SYMTAB */
+ fwriteint32_t(MACHO_SYMCMD_SIZE, ofile); /* size of load command */
+ fwriteint32_t(offset, ofile); /* symbol table offset */
+ fwriteint32_t(nsyms, ofile); /* number of symbol
+ ** table entries */
+ offset += nsyms * fmt.nlist_size;
+ fwriteint32_t(offset, ofile); /* string table offset */
+ fwriteint32_t(strslen, ofile); /* string table size */
+ }
+
+ /* emit section data */
+ if (seg_nsects > 0)
+ macho_write_section ();
+
+ /* emit symbol table if we have symbols */
+ if (nsyms > 0)
+ macho_write_symtab ();
+
+ /* we don't need to pad here, we are already aligned */
+
+ /* emit string table */
+ saa_fpwrite(strs, ofile);
+}
+/* We do quite a bit here, starting with finalizing all of the data
+ for the object file, writing, and then freeing all of the data from
+ the file. */
+
+static void macho_cleanup(void)
+{
+ struct section *s;
+ struct reloc *r;
+ struct symbol *sym;
+
+ dfmt->cleanup();
+
+ /* Sort all symbols. */
+ macho_layout_symbols (&nsyms, &strslen);
+
+ /* Fixup relocation entries */
+ for (s = sects; s != NULL; s = s->next) {
+ macho_fixup_relocs (s->relocs);
+ }
+
+ /* First calculate and finalize needed values. */
+ macho_calculate_sizes();
+ macho_write();
+
+ /* free up everything */
+ while (sects->next) {
+ s = sects;
+ sects = sects->next;
+
+ saa_free(s->data);
+ while (s->relocs != NULL) {
+ r = s->relocs;
+ s->relocs = s->relocs->next;
+ nasm_free(r);
+ }
+
+ nasm_free(s);
+ }
+
+ saa_free(strs);
+
+ raa_free(extsyms);
+
+ while (syms) {
+ sym = syms;
+ syms = syms->next;
+ nasm_free (sym);
+ }
+
+ nasm_free(extdefsyms);
+ nasm_free(undefsyms);
+ nasm_free(sectstab);
+ raa_free(section_by_index);
+ hash_free(&section_by_name);
+}
+
+static bool macho_set_section_attribute_by_symbol(const char *label, uint32_t flags)
+{
+ struct section *s;
+ int32_t nasm_seg;
+ int64_t offset;
+
+ if (!lookup_label(label, &nasm_seg, &offset)) {
+ nasm_error(ERR_NONFATAL, "unknown symbol `%s' in no_dead_strip", label);
+ return false;
+ }
+
+ s = get_section_by_index(nasm_seg);
+ if (!s) {
+ nasm_error(ERR_NONFATAL, "symbol `%s' is external or absolute", label);
+ return false;
+ }
+
+ s->flags |= flags;
+ return true;
+}
+
+/*
+ * Mark a symbol for no dead stripping
+ */
+static enum directive_result macho_no_dead_strip(const char *labels)
+{
+ char *s, *p, *ep;
+ char ec;
+ enum directive_result rv = DIRR_ERROR;
+ bool real = passn > 1;
+
+ p = s = nasm_strdup(labels);
+ while (*p) {
+ ep = nasm_skip_identifier(p);
+ if (!ep) {
+ nasm_error(ERR_NONFATAL, "invalid symbol in NO_DEAD_STRIP");
+ goto err;
+ }
+ ec = *ep;
+ if (ec && ec != ',' && !nasm_isspace(ec)) {
+ nasm_error(ERR_NONFATAL, "cannot parse contents after symbol");
+ goto err;
+ }
+ *ep = '\0';
+ if (real) {
+ if (!macho_set_section_attribute_by_symbol(p, S_ATTR_NO_DEAD_STRIP))
+ rv = DIRR_ERROR;
+ }
+ *ep = ec;
+ p = nasm_skip_spaces(ep);
+ if (*p == ',')
+ p = nasm_skip_spaces(++p);
+ }
+
+ rv = DIRR_OK;
+
+err:
+ nasm_free(s);
+ return rv;
+}
+
+/*
+ * Mach-O pragmas
+ */
+static enum directive_result
+macho_pragma(const struct pragma *pragma)
+{
+ bool real = passn > 1;
+
+ switch (pragma->opcode) {
+ case D_SUBSECTIONS_VIA_SYMBOLS:
+ if (*pragma->tail)
+ return DIRR_BADPARAM;
+
+ if (real)
+ head_flags |= MH_SUBSECTIONS_VIA_SYMBOLS;
+
+ /* Jmp-match optimization conflicts */
+ optimizing.flag |= OPTIM_DISABLE_JMP_MATCH;
+
+ return DIRR_OK;
+
+ case D_NO_DEAD_STRIP:
+ return macho_no_dead_strip(pragma->tail);
+
+ default:
+ return DIRR_UNKNOWN; /* Not a Mach-O directive */
+ }
+}
+
+static const struct pragma_facility macho_pragma_list[] = {
+ { "macho", macho_pragma },
+ { NULL, macho_pragma } /* Implements macho32/macho64 namespaces */
+};
+
+static void macho_dbg_generate(void)
+{
+ uint8_t *p_buf = NULL, *p_buf_base = NULL;
+ size_t saa_len = 0, high_addr = 0, total_len = 0;
+ struct section *p_section = NULL;
+ /* calculated at debug_str and referenced at debug_info */
+ uint32_t producer_str_offset = 0, module_str_offset = 0, dir_str_offset = 0;
+
+ /* debug section defines */
+ {
+ int bits = 0;
+ macho_section(".debug_abbrev", 0, &bits);
+ macho_section(".debug_info", 0, &bits);
+ macho_section(".debug_line", 0, &bits);
+ macho_section(".debug_str", 0, &bits);
+ }
+
+ /* dw section walk to find high_addr and total_len */
+ {
+ struct dw_sect_list *p_sect;
+
+ list_for_each(p_sect, dw_head_sect) {
+ uint64_t offset = get_section_by_index(p_sect->section)->size;
+ struct SAA *p_linep = p_sect->psaa;
+
+ saa_write8(p_linep, 2); /* std op 2 */
+ saa_write8(p_linep, offset - p_sect->offset);
+ saa_write8(p_linep, DW_LNS_extended_op);
+ saa_write8(p_linep, 1); /* operand length */
+ saa_write8(p_linep, DW_LNE_end_sequence);
+
+ total_len += p_linep->datalen;
+ high_addr += offset;
+ }
+ }
+
+ /* debug line */
+ {
+ struct dw_sect_list *p_sect;
+ size_t linep_off, buf_size;
+ struct SAA *p_lines = saa_init(1L);
+ struct dir_list *p_dir;
+ struct file_list *p_file;
+
+ p_section = get_section_by_name("__DWARF", "__debug_line");
+ nasm_assert(p_section != NULL);
+
+ saa_write8(p_lines, 1); /* minimum instruction length */
+ saa_write8(p_lines, 1); /* initial value of "is_stmt" */
+ saa_write8(p_lines, DW_LN_BASE); /* line base */
+ saa_write8(p_lines, DW_LN_RANGE); /* line range */
+ saa_write8(p_lines, DW_OPCODE_BASE); /* opcode base */
+ saa_write8(p_lines, 0); /* std opcode 1 length */
+ saa_write8(p_lines, 1); /* std opcode 2 length */
+ saa_write8(p_lines, 1); /* std opcode 3 length */
+ saa_write8(p_lines, 1); /* std opcode 4 length */
+ saa_write8(p_lines, 1); /* std opcode 5 length */
+ saa_write8(p_lines, 0); /* std opcode 6 length */
+ saa_write8(p_lines, 0); /* std opcode 7 length */
+ saa_write8(p_lines, 0); /* std opcode 8 length */
+ saa_write8(p_lines, 1); /* std opcode 9 length */
+ saa_write8(p_lines, 0); /* std opcode 10 length */
+ saa_write8(p_lines, 0); /* std opcode 11 length */
+ saa_write8(p_lines, 1); /* std opcode 12 length */
+ list_for_each(p_dir, dw_head_dir) {
+ saa_wcstring(p_lines, p_dir->dir_name);
+ }
+ saa_write8(p_lines, 0); /* end of table */
+
+ list_for_each(p_file, dw_head_file) {
+ saa_wcstring(p_lines, p_file->file_name);
+ saa_write8(p_lines, p_file->dir->dir); /* directory id */
+ saa_write8(p_lines, 0); /* time */
+ saa_write8(p_lines, 0); /* size */
+ }
+ saa_write8(p_lines, 0); /* end of table */
+
+ linep_off = p_lines->datalen;
+ /* 10 bytes for initial & prolong length, and dwarf version info */
+ buf_size = saa_len = linep_off + total_len + 10;
+ p_buf_base = p_buf = nasm_malloc(buf_size);
+
+ WRITELONG(p_buf, saa_len - 4); /* initial length; size excluding itself */
+ WRITESHORT(p_buf, 2); /* dwarf version */
+ WRITELONG(p_buf, linep_off); /* prolong length */
+
+ saa_rnbytes(p_lines, p_buf, linep_off);
+ p_buf += linep_off;
+ saa_free(p_lines);
+
+ list_for_each(p_sect, dw_head_sect) {
+ struct SAA *p_linep = p_sect->psaa;
+
+ saa_len = p_linep->datalen;
+ saa_rnbytes(p_linep, p_buf, saa_len);
+ p_buf += saa_len;
+
+ saa_free(p_linep);
+ }
+
+ macho_output(p_section->index, p_buf_base, OUT_RAWDATA, buf_size, NO_SEG, 0);
+
+ nasm_free(p_buf_base);
+ }
+
+ /* string section */
+ {
+ struct SAA *p_str = saa_init(1L);
+ char *cur_path = nasm_realpath(module_name);
+ char *cur_file = nasm_basename(cur_path);
+ char *cur_dir = nasm_dirname(cur_path);
+
+ p_section = get_section_by_name("__DWARF", "__debug_str");
+ nasm_assert(p_section != NULL);
+
+ producer_str_offset = 0;
+ module_str_offset = dir_str_offset = saa_wcstring(p_str, nasm_signature);
+ dir_str_offset += saa_wcstring(p_str, cur_file);
+ saa_wcstring(p_str, cur_dir);
+
+ saa_len = p_str->datalen;
+ p_buf = nasm_malloc(saa_len);
+ saa_rnbytes(p_str, p_buf, saa_len);
+ macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
+
+ nasm_free(cur_path);
+ nasm_free(cur_file);
+ nasm_free(cur_dir);
+ saa_free(p_str);
+ nasm_free(p_buf);
+ }
+
+ /* debug info */
+ {
+ struct SAA *p_info = saa_init(1L);
+
+ p_section = get_section_by_name("__DWARF", "__debug_info");
+ nasm_assert(p_section != NULL);
+
+ /* size will be overwritten once determined, so skip in p_info layout */
+ saa_write16(p_info, 2); /* dwarf version */
+ saa_write32(p_info, 0); /* offset info abbrev */
+ saa_write8(p_info, (ofmt == &of_macho64) ? 8 : 4); /* pointer size */
+
+ saa_write8(p_info, 1); /* abbrev entry number */
+
+ saa_write32(p_info, producer_str_offset); /* offset from string table for DW_AT_producer */
+ saa_write16(p_info, DW_LANG_Mips_Assembler); /* DW_AT_language */
+ saa_write32(p_info, module_str_offset); /* offset from string table for DW_AT_name */
+ saa_write32(p_info, dir_str_offset); /* offset from string table for DW_AT_comp_dir */
+ saa_write32(p_info, 0); /* DW_AT_stmt_list */
+
+ if (ofmt == &of_macho64) {
+ saa_write64(p_info, 0); /* DW_AT_low_pc */
+ saa_write64(p_info, high_addr); /* DW_AT_high_pc */
+ } else {
+ saa_write32(p_info, 0); /* DW_AT_low_pc */
+ saa_write32(p_info, high_addr); /* DW_AT_high_pc */
+ }
+
+ saa_write8(p_info, 2); /* abbrev entry number */
+
+ if (ofmt == &of_macho64) {
+ saa_write64(p_info, 0); /* DW_AT_low_pc */
+ saa_write64(p_info, 0); /* DW_AT_frame_base */
+ } else {
+ saa_write32(p_info, 0); /* DW_AT_low_pc */
+ saa_write32(p_info, 0); /* DW_AT_frame_base */
+ }
+ saa_write8(p_info, DW_END_default);
+
+ saa_len = p_info->datalen;
+ p_buf_base = p_buf = nasm_malloc(saa_len + 4); /* 4B for size info */
+
+ WRITELONG(p_buf, saa_len);
+ saa_rnbytes(p_info, p_buf, saa_len);
+ macho_output(p_section->index, p_buf_base, OUT_RAWDATA, saa_len + 4, NO_SEG, 0);
+
+ saa_free(p_info);
+ nasm_free(p_buf_base);
+ }
+
+ /* abbrev section */
+ {
+ struct SAA *p_abbrev = saa_init(1L);
+
+ p_section = get_section_by_name("__DWARF", "__debug_abbrev");
+ nasm_assert(p_section != NULL);
+
+ saa_write8(p_abbrev, 1); /* entry number */
+
+ saa_write8(p_abbrev, DW_TAG_compile_unit);
+ saa_write8(p_abbrev, DW_CHILDREN_yes);
+
+ saa_write8(p_abbrev, DW_AT_producer);
+ saa_write8(p_abbrev, DW_FORM_strp);
+
+ saa_write8(p_abbrev, DW_AT_language);
+ saa_write8(p_abbrev, DW_FORM_data2);
+
+ saa_write8(p_abbrev, DW_AT_name);
+ saa_write8(p_abbrev, DW_FORM_strp);
+
+ saa_write8(p_abbrev, DW_AT_comp_dir);
+ saa_write8(p_abbrev, DW_FORM_strp);
+
+ saa_write8(p_abbrev, DW_AT_stmt_list);
+ saa_write8(p_abbrev, DW_FORM_data4);
+
+ saa_write8(p_abbrev, DW_AT_low_pc);
+ saa_write8(p_abbrev, DW_FORM_addr);
+
+ saa_write8(p_abbrev, DW_AT_high_pc);
+ saa_write8(p_abbrev, DW_FORM_addr);
+
+ saa_write16(p_abbrev, DW_END_default);
+
+ saa_write8(p_abbrev, 2); /* entry number */
+
+ saa_write8(p_abbrev, DW_TAG_subprogram);
+ saa_write8(p_abbrev, DW_CHILDREN_no);
+
+ saa_write8(p_abbrev, DW_AT_low_pc);
+ saa_write8(p_abbrev, DW_FORM_addr);
+
+ saa_write8(p_abbrev, DW_AT_frame_base);
+ saa_write8(p_abbrev, DW_FORM_addr);
+
+ saa_write16(p_abbrev, DW_END_default);
+
+ saa_write8(p_abbrev, 0); /* Terminal zero entry */
+
+ saa_len = p_abbrev->datalen;
+
+ p_buf = nasm_malloc(saa_len);
+
+ saa_rnbytes(p_abbrev, p_buf, saa_len);
+ macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
+
+ saa_free(p_abbrev);
+ nasm_free(p_buf);
+ }
+}
+
+static void new_file_list (const char *file_name, const char *dir_name)
+{
+ struct dir_list *dir_list;
+ bool need_new_dir_list = true;
+
+ nasm_new(dw_cur_file);
+ dw_cur_file->file = ++dw_num_files;
+ dw_cur_file->file_name = file_name;
+ if(!dw_head_file) {
+ dw_head_file = dw_cur_file;
+ } else {
+ *dw_last_file_next = dw_cur_file;
+ }
+ dw_last_file_next = &(dw_cur_file->next);
+
+ if(dw_head_dir) {
+ list_for_each(dir_list, dw_head_dir) {
+ if(!(strcmp(dir_name, dir_list->dir_name))) {
+ dw_cur_file->dir = dir_list;
+ need_new_dir_list = false;
+ break;
+ }
+ }
+ }
+
+ if(need_new_dir_list)
+ {
+ nasm_new(dir_list);
+ dir_list->dir = dw_num_dirs++;
+ dir_list->dir_name = dir_name;
+ if(!dw_head_dir) {
+ dw_head_dir = dir_list;
+ } else {
+ *dw_last_dir_next = dir_list;
+ }
+ dw_last_dir_next = &(dir_list->next);
+ dw_cur_file->dir = dir_list;
+ }
+}
+
+static void macho_dbg_init(void)
+{
+}
+
+static void macho_dbg_linenum(const char *file_name, int32_t line_num, int32_t segto)
+{
+ bool need_new_list = true;
+ const char *cur_file = nasm_basename(file_name);
+ const char *cur_dir = nasm_dirname(file_name);
+ (void)segto;
+
+ if(!dw_cur_file || strcmp(cur_file, dw_cur_file->file_name) ||
+ strcmp(cur_dir, dw_cur_file->dir->dir_name)) {
+ if(dw_head_file) {
+ struct file_list *match;
+
+ list_for_each(match, dw_head_file) {
+ if(!(strcmp(cur_file, match->file_name)) &&
+ !(strcmp(cur_dir, match->dir->dir_name))) {
+ dw_cur_file = match;
+ dw_cur_file->dir = match->dir;
+ need_new_list = false;
+ break;
+ }
+ }
+ }
+
+ if(need_new_list) {
+ new_file_list(cur_file, cur_dir);
+ }
+ }
+
+ dbg_immcall = true;
+ cur_line = line_num;
+}
+
+static void macho_dbg_output(int type, void *param)
+{
+ struct section_info *sinfo_param = (struct section_info *)param;
+ int32_t secto = sinfo_param->secto;
+ bool need_new_sect = false;
+ struct SAA *p_linep = NULL;
+ (void)type;
+
+ if(!(dw_cur_sect && (dw_cur_sect->section == secto))) {
+ need_new_sect = true;
+ if(dw_head_sect) {
+ struct dw_sect_list *match = dw_head_sect;
+ uint32_t idx = 0;
+
+ for(; idx < dw_num_sects; idx++) {
+ if(match->section == secto) {
+ dw_cur_sect = match;
+ need_new_sect = false;
+ break;
+ }
+ match = match->next;
+ }
+ }
+ }
+
+ if(need_new_sect) {
+ nasm_new(dw_cur_sect);
+ dw_num_sects ++;
+ p_linep = dw_cur_sect->psaa = saa_init(1L);
+ dw_cur_sect->line = dw_cur_sect->file = 1;
+ dw_cur_sect->offset = 0;
+ dw_cur_sect->next = NULL;
+ dw_cur_sect->section = secto;
+
+ saa_write8(p_linep, DW_LNS_extended_op);
+ saa_write8(p_linep, (ofmt == &of_macho64) ? 9 : 5);
+ saa_write8(p_linep, DW_LNE_set_address);
+ if (ofmt == &of_macho64) {
+ saa_write64(p_linep, 0);
+ } else {
+ saa_write32(p_linep, 0);
+ }
+
+ if(!dw_head_sect) {
+ dw_head_sect = dw_last_sect = dw_cur_sect;
+ } else {
+ dw_last_sect->next = dw_cur_sect;
+ dw_last_sect = dw_cur_sect;
+ }
+ }
+
+ if(dbg_immcall == true) {
+ int32_t line_delta = cur_line - dw_cur_sect->line;
+ int32_t offset_delta = sinfo_param->size - dw_cur_sect->offset;
+ uint32_t cur_file = dw_cur_file->file;
+ p_linep = dw_cur_sect->psaa;
+
+ if(cur_file != dw_cur_sect->file) {
+ saa_write8(p_linep, DW_LNS_set_file);
+ saa_write8(p_linep, cur_file);
+ dw_cur_sect->file = cur_file;
+ }
+
+ if(line_delta) {
+ int special_opcode = (line_delta - DW_LN_BASE) + (DW_LN_RANGE * offset_delta) +
+ DW_OPCODE_BASE;
+
+ if((line_delta >= DW_LN_BASE) && (line_delta < DW_MAX_LN) &&
+ (special_opcode < DW_MAX_SP_OPCODE)) {
+ saa_write8(p_linep, special_opcode);
+ } else {
+ saa_write8(p_linep, DW_LNS_advance_line);
+ saa_wleb128s(p_linep, line_delta);
+ if(offset_delta) {
+ saa_write8(p_linep, DW_LNS_advance_pc);
+ saa_wleb128u(p_linep, offset_delta);
+ }
+ saa_write8(p_linep, DW_LNS_copy);
+ }
+
+ dw_cur_sect->line = cur_line;
+ dw_cur_sect->offset = sinfo_param->size;
+ }
+
+ dbg_immcall = false;
+ }
+}
+
+static void macho_dbg_cleanup(void)
+{
+ /* dwarf sectors generation */
+ macho_dbg_generate();
+
+ {
+ struct dw_sect_list *p_sect = dw_head_sect;
+ struct file_list *p_file = dw_head_file;
+ uint32_t idx = 0;
+
+ for(; idx < dw_num_sects; idx++) {
+ struct dw_sect_list *next = p_sect->next;
+ nasm_free(p_sect);
+ p_sect = next;
+ }
+
+ for(idx = 0; idx < dw_num_files; idx++) {
+ struct file_list *next = p_file->next;
+ nasm_free(p_file);
+ p_file = next;
+ }
+ }
+}
+
+#ifdef OF_MACHO32
+static const struct macho_fmt macho32_fmt = {
+ 4,
+ MH_MAGIC,
+ CPU_TYPE_I386,
+ LC_SEGMENT,
+ MACHO_HEADER_SIZE,
+ MACHO_SEGCMD_SIZE,
+ MACHO_SECTCMD_SIZE,
+ MACHO_NLIST_SIZE,
+ RL_MAX_32,
+ GENERIC_RELOC_VANILLA,
+ GENERIC_RELOC_VANILLA,
+ GENERIC_RELOC_TLV,
+ false /* Allow segment-relative relocations */
+};
+
+static void macho32_init(void)
+{
+ fmt = macho32_fmt;
+ macho_init();
+
+ macho_gotpcrel_sect = NO_SEG;
+}
+
+static const struct dfmt macho32_df_dwarf = {
+ "MachO32 (i386) dwarf debug format for Darwin/MacOS",
+ "dwarf",
+ macho_dbg_init,
+ macho_dbg_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ null_debug_typevalue,
+ macho_dbg_output,
+ macho_dbg_cleanup,
+ NULL /*pragma list*/
+};
+
+static const struct dfmt * const macho32_df_arr[2] =
+ { &macho32_df_dwarf, NULL };
+
+const struct ofmt of_macho32 = {
+ "NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files",
+ "macho32",
+ ".o",
+ 0,
+ 32,
+ macho32_df_arr,
+ &macho32_df_dwarf,
+ macho_stdmac,
+ macho32_init,
+ null_reset,
+ nasm_do_legacy_output,
+ macho_output,
+ macho_symdef,
+ macho_section,
+ macho_herelabel,
+ macho_sectalign,
+ null_segbase,
+ null_directive,
+ macho_cleanup,
+ macho_pragma_list
+};
+#endif
+
+#ifdef OF_MACHO64
+static const struct macho_fmt macho64_fmt = {
+ 8,
+ MH_MAGIC_64,
+ CPU_TYPE_X86_64,
+ LC_SEGMENT_64,
+ MACHO_HEADER64_SIZE,
+ MACHO_SEGCMD64_SIZE,
+ MACHO_SECTCMD64_SIZE,
+ MACHO_NLIST64_SIZE,
+ RL_MAX_64,
+ X86_64_RELOC_UNSIGNED,
+ X86_64_RELOC_SIGNED,
+ X86_64_RELOC_TLV,
+ true /* Force symbol-relative relocations */
+};
+
+static void macho64_init(void)
+{
+ fmt = macho64_fmt;
+ macho_init();
+
+ /* add special symbol for ..gotpcrel */
+ macho_gotpcrel_sect = seg_alloc() + 1;
+ backend_label("..gotpcrel", macho_gotpcrel_sect, 0L);
+}
+
+static const struct dfmt macho64_df_dwarf = {
+ "MachO64 (x86-64) dwarf debug format for Darwin/MacOS",
+ "dwarf",
+ macho_dbg_init,
+ macho_dbg_linenum,
+ null_debug_deflabel,
+ null_debug_directive,
+ null_debug_typevalue,
+ macho_dbg_output,
+ macho_dbg_cleanup,
+ NULL /*pragma list*/
+};
+
+static const struct dfmt * const macho64_df_arr[2] =
+ { &macho64_df_dwarf, NULL };
+
+const struct ofmt of_macho64 = {
+ "NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files",
+ "macho64",
+ ".o",
+ 0,
+ 64,
+ macho64_df_arr,
+ &macho64_df_dwarf,
+ macho_stdmac,
+ macho64_init,
+ null_reset,
+ nasm_do_legacy_output,
+ macho_output,
+ macho_symdef,
+ macho_section,
+ macho_herelabel,
+ macho_sectalign,
+ null_segbase,
+ null_directive,
+ macho_cleanup,
+ macho_pragma_list,
+};
+#endif
+
+#endif
+
+/*
+ * Local Variables:
+ * mode:c
+ * c-basic-offset:4
+ * End:
+ *
+ * end of file */
diff --git a/output/outmacho.mac b/output/outmacho.mac
new file mode 100644
index 00000000..52ce3d27
--- /dev/null
+++ b/output/outmacho.mac
@@ -0,0 +1,49 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2017 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: macho macho32 macho64
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
+
+; This directive sets the MH_SUBSECTIONS_VIA_SYMBOLS header flag
+%imacro subsections_via_symbols 0.nolist
+ %pragma __OUTPUT_FORMAT__ %?
+%endmacro
+
+%imacro no_dead_strip 1-*.nolist
+ %rep %0
+ %pragma __OUTPUT_FORMAT__ %? %1
+ %rotate 1
+ %endrep
+%endmacro
diff --git a/output/outobj.c b/output/outobj.c
new file mode 100644
index 00000000..35938823
--- /dev/null
+++ b/output/outobj.c
@@ -0,0 +1,2709 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outobj.c output routines for the Netwide Assembler to produce
+ * .OBJ object files
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "stdscan.h"
+#include "eval.h"
+#include "ver.h"
+
+#include "outform.h"
+#include "outlib.h"
+
+#ifdef OF_OBJ
+
+/*
+ * outobj.c is divided into two sections. The first section is low level
+ * routines for creating obj records; It has nearly zero NASM specific
+ * code. The second section is high level routines for processing calls and
+ * data structures from the rest of NASM into obj format.
+ *
+ * It should be easy (though not zero work) to lift the first section out for
+ * use as an obj file writer for some other assembler or compiler.
+ */
+
+/*
+ * These routines are built around the ObjRecord data struture. An ObjRecord
+ * holds an object file record that may be under construction or complete.
+ *
+ * A major function of these routines is to support continuation of an obj
+ * record into the next record when the maximum record size is exceeded. The
+ * high level code does not need to worry about where the record breaks occur.
+ * It does need to do some minor extra steps to make the automatic continuation
+ * work. Those steps may be skipped for records where the high level knows no
+ * continuation could be required.
+ *
+ * 1) An ObjRecord is allocated and cleared by obj_new, or an existing ObjRecord
+ * is cleared by obj_clear.
+ *
+ * 2) The caller should fill in .type.
+ *
+ * 3) If the record is continuable and there is processing that must be done at
+ * the start of each record then the caller should fill in .ori with the
+ * address of the record initializer routine.
+ *
+ * 4) If the record is continuable and it should be saved (rather than emitted
+ * immediately) as each record is done, the caller should set .up to be a
+ * pointer to a location in which the caller keeps the master pointer to the
+ * ObjRecord. When the record is continued, the obj_bump routine will then
+ * allocate a new ObjRecord structure and update the master pointer.
+ *
+ * 5) If the .ori field was used then the caller should fill in the .parm with
+ * any data required by the initializer.
+ *
+ * 6) The caller uses the routines: obj_byte, obj_word, obj_rword, obj_dword,
+ * obj_x, obj_index, obj_value and obj_name to fill in the various kinds of
+ * data required for this record.
+ *
+ * 7) If the record is continuable, the caller should call obj_commit at each
+ * point where breaking the record is permitted.
+ *
+ * 8) To write out the record, the caller should call obj_emit2. If the
+ * caller has called obj_commit for all data written then he can get slightly
+ * faster code by calling obj_emit instead of obj_emit2.
+ *
+ * Most of these routines return an ObjRecord pointer. This will be the input
+ * pointer most of the time and will be the new location if the ObjRecord
+ * moved as a result of the call. The caller may ignore the return value in
+ * three cases: It is a "Never Reallocates" routine; or The caller knows
+ * continuation is not possible; or The caller uses the master pointer for the
+ * next operation.
+ */
+
+#define RECORD_MAX (1024-3) /* maximal size of any record except type+reclen */
+#define OBJ_PARMS 3 /* maximum .parm used by any .ori routine */
+
+#define FIX_08_LOW 0x8000 /* location type for various fixup subrecords */
+#define FIX_16_OFFSET 0x8400
+#define FIX_16_SELECTOR 0x8800
+#define FIX_32_POINTER 0x8C00
+#define FIX_08_HIGH 0x9000
+#define FIX_32_OFFSET 0xA400
+#define FIX_48_POINTER 0xAC00
+
+enum RecordID { /* record ID codes */
+
+ THEADR = 0x80, /* module header */
+ COMENT = 0x88, /* comment record */
+
+ LINNUM = 0x94, /* line number record */
+ LNAMES = 0x96, /* list of names */
+
+ SEGDEF = 0x98, /* segment definition */
+ GRPDEF = 0x9A, /* group definition */
+ EXTDEF = 0x8C, /* external definition */
+ PUBDEF = 0x90, /* public definition */
+ COMDEF = 0xB0, /* common definition */
+
+ LEDATA = 0xA0, /* logical enumerated data */
+ FIXUPP = 0x9C, /* fixups (relocations) */
+ FIXU32 = 0x9D, /* 32-bit fixups (relocations) */
+
+ MODEND = 0x8A, /* module end */
+ MODE32 = 0x8B /* module end for 32-bit objects */
+};
+
+enum ComentID { /* ID codes for comment records */
+ dTRANSL = 0x0000, /* translator comment */
+ dOMFEXT = 0xC0A0, /* "OMF extension" */
+ dEXTENDED = 0xC0A1, /* translator-specific extensions */
+ dLINKPASS = 0x40A2, /* link pass 2 marker */
+ dTYPEDEF = 0xC0E3, /* define a type */
+ dSYM = 0xC0E6, /* symbol debug record */
+ dFILNAME = 0xC0E8, /* file name record */
+ dDEPFILE = 0xC0E9, /* dependency file */
+ dCOMPDEF = 0xC0EA /* compiler type info */
+};
+
+typedef struct ObjRecord ObjRecord;
+typedef void ORI(ObjRecord * orp);
+
+struct ObjRecord {
+ ORI *ori; /* Initialization routine */
+ int used; /* Current data size */
+ int committed; /* Data size at last boundary */
+ int x_size; /* (see obj_x) */
+ unsigned int type; /* Record type */
+ ObjRecord *child; /* Associated record below this one */
+ ObjRecord **up; /* Master pointer to this ObjRecord */
+ ObjRecord *back; /* Previous part of this record */
+ uint32_t parm[OBJ_PARMS]; /* Parameters for ori routine */
+ uint8_t buf[RECORD_MAX + 3];
+};
+
+static void obj_fwrite(ObjRecord * orp);
+static void ori_ledata(ObjRecord * orp);
+static void ori_pubdef(ObjRecord * orp);
+static void ori_null(ObjRecord * orp);
+static ObjRecord *obj_commit(ObjRecord * orp);
+
+static bool obj_uppercase; /* Flag: all names in uppercase */
+static bool obj_use32; /* Flag: at least one segment is 32-bit */
+static bool obj_nodepend; /* Flag: don't emit file dependencies */
+
+/*
+ * Clear an ObjRecord structure. (Never reallocates).
+ * To simplify reuse of ObjRecord's, .type, .ori and .parm are not cleared.
+ */
+static ObjRecord *obj_clear(ObjRecord * orp)
+{
+ orp->used = 0;
+ orp->committed = 0;
+ orp->x_size = 0;
+ orp->child = NULL;
+ orp->up = NULL;
+ orp->back = NULL;
+ return (orp);
+}
+
+/*
+ * Emit an ObjRecord structure. (Never reallocates).
+ * The record is written out preceeded (recursively) by its previous part (if
+ * any) and followed (recursively) by its child (if any).
+ * The previous part and the child are freed. The main ObjRecord is cleared,
+ * not freed.
+ */
+static ObjRecord *obj_emit(ObjRecord * orp)
+{
+ if (orp->back) {
+ obj_emit(orp->back);
+ nasm_free(orp->back);
+ }
+
+ if (orp->committed)
+ obj_fwrite(orp);
+
+ if (orp->child) {
+ obj_emit(orp->child);
+ nasm_free(orp->child);
+ }
+
+ return (obj_clear(orp));
+}
+
+/*
+ * Commit and Emit a record. (Never reallocates).
+ */
+static ObjRecord *obj_emit2(ObjRecord * orp)
+{
+ obj_commit(orp);
+ return (obj_emit(orp));
+}
+
+/*
+ * Allocate and clear a new ObjRecord; Also sets .ori to ori_null
+ */
+static ObjRecord *obj_new(void)
+{
+ ObjRecord *orp;
+
+ orp = obj_clear(nasm_malloc(sizeof(ObjRecord)));
+ orp->ori = ori_null;
+ return (orp);
+}
+
+/*
+ * Advance to the next record because the existing one is full or its x_size
+ * is incompatible.
+ * Any uncommited data is moved into the next record.
+ */
+static ObjRecord *obj_bump(ObjRecord * orp)
+{
+ ObjRecord *nxt;
+ int used = orp->used;
+ int committed = orp->committed;
+
+ if (orp->up) {
+ *orp->up = nxt = obj_new();
+ nxt->ori = orp->ori;
+ nxt->type = orp->type;
+ nxt->up = orp->up;
+ nxt->back = orp;
+ memcpy(nxt->parm, orp->parm, sizeof(orp->parm));
+ } else
+ nxt = obj_emit(orp);
+
+ used -= committed;
+ if (used) {
+ nxt->committed = 1;
+ nxt->ori(nxt);
+ nxt->committed = nxt->used;
+ memcpy(nxt->buf + nxt->committed, orp->buf + committed, used);
+ nxt->used = nxt->committed + used;
+ }
+
+ return (nxt);
+}
+
+/*
+ * Advance to the next record if necessary to allow the next field to fit.
+ */
+static ObjRecord *obj_check(ObjRecord * orp, int size)
+{
+ if (orp->used + size > RECORD_MAX)
+ orp = obj_bump(orp);
+
+ if (!orp->committed) {
+ orp->committed = 1;
+ orp->ori(orp);
+ orp->committed = orp->used;
+ }
+
+ return (orp);
+}
+
+/*
+ * All data written so far is commited to the current record (won't be moved to
+ * the next record in case of continuation).
+ */
+static ObjRecord *obj_commit(ObjRecord * orp)
+{
+ orp->committed = orp->used;
+ return (orp);
+}
+
+/*
+ * Write a byte
+ */
+static ObjRecord *obj_byte(ObjRecord * orp, uint8_t val)
+{
+ orp = obj_check(orp, 1);
+ orp->buf[orp->used] = val;
+ orp->used++;
+ return (orp);
+}
+
+/*
+ * Write a word
+ */
+static ObjRecord *obj_word(ObjRecord * orp, unsigned int val)
+{
+ orp = obj_check(orp, 2);
+ orp->buf[orp->used] = val;
+ orp->buf[orp->used + 1] = val >> 8;
+ orp->used += 2;
+ return (orp);
+}
+
+/*
+ * Write a reversed word
+ */
+static ObjRecord *obj_rword(ObjRecord * orp, unsigned int val)
+{
+ orp = obj_check(orp, 2);
+ orp->buf[orp->used] = val >> 8;
+ orp->buf[orp->used + 1] = val;
+ orp->used += 2;
+ return (orp);
+}
+
+/*
+ * Write a dword
+ */
+static ObjRecord *obj_dword(ObjRecord * orp, uint32_t val)
+{
+ orp = obj_check(orp, 4);
+ orp->buf[orp->used] = val;
+ orp->buf[orp->used + 1] = val >> 8;
+ orp->buf[orp->used + 2] = val >> 16;
+ orp->buf[orp->used + 3] = val >> 24;
+ orp->used += 4;
+ return (orp);
+}
+
+/*
+ * All fields of "size x" in one obj record must be the same size (either 16
+ * bits or 32 bits). There is a one bit flag in each record which specifies
+ * which.
+ * This routine is used to force the current record to have the desired
+ * x_size. x_size is normally automatic (using obj_x), so that this
+ * routine should be used outside obj_x, only to provide compatibility with
+ * linkers that have bugs in their processing of the size bit.
+ */
+
+static ObjRecord *obj_force(ObjRecord * orp, int x)
+{
+ if (orp->x_size == (x ^ 48))
+ orp = obj_bump(orp);
+ orp->x_size = x;
+ return (orp);
+}
+
+/*
+ * This routine writes a field of size x. The caller does not need to worry at
+ * all about whether 16-bits or 32-bits are required.
+ */
+static ObjRecord *obj_x(ObjRecord * orp, uint32_t val)
+{
+ if (orp->type & 1)
+ orp->x_size = 32;
+ if (val > 0xFFFF)
+ orp = obj_force(orp, 32);
+ if (orp->x_size == 32) {
+ ObjRecord *nxt = obj_dword(orp, val);
+ nxt->x_size = 32; /* x_size is cleared when a record overflows */
+ return nxt;
+ }
+ orp->x_size = 16;
+ return (obj_word(orp, val));
+}
+
+/*
+ * Writes an index
+ */
+static ObjRecord *obj_index(ObjRecord * orp, unsigned int val)
+{
+ if (val < 128)
+ return (obj_byte(orp, val));
+ return (obj_word(orp, (val >> 8) | (val << 8) | 0x80));
+}
+
+/*
+ * Writes a variable length value
+ */
+static ObjRecord *obj_value(ObjRecord * orp, uint32_t val)
+{
+ if (val <= 128)
+ return (obj_byte(orp, val));
+ if (val <= 0xFFFF) {
+ orp = obj_byte(orp, 129);
+ return (obj_word(orp, val));
+ }
+ if (val <= 0xFFFFFF)
+ return (obj_dword(orp, (val << 8) + 132));
+ orp = obj_byte(orp, 136);
+ return (obj_dword(orp, val));
+}
+
+/*
+ * Writes a counted string
+ */
+static ObjRecord *obj_name(ObjRecord * orp, const char *name)
+{
+ int len = strlen(name);
+ uint8_t *ptr;
+
+ orp = obj_check(orp, len + 1);
+ ptr = orp->buf + orp->used;
+ *ptr++ = len;
+ orp->used += len + 1;
+ if (obj_uppercase)
+ while (--len >= 0) {
+ *ptr++ = toupper(*name);
+ name++;
+ } else
+ memcpy(ptr, name, len);
+ return (orp);
+}
+
+/*
+ * Initializer for an LEDATA record.
+ * parm[0] = offset
+ * parm[1] = segment index
+ * During the use of a LEDATA ObjRecord, parm[0] is constantly updated to
+ * represent the offset that would be required if the record were split at the
+ * last commit point.
+ * parm[2] is a copy of parm[0] as it was when the current record was initted.
+ */
+static void ori_ledata(ObjRecord * orp)
+{
+ obj_index(orp, orp->parm[1]);
+ orp->parm[2] = orp->parm[0];
+ obj_x(orp, orp->parm[0]);
+}
+
+/*
+ * Initializer for a PUBDEF record.
+ * parm[0] = group index
+ * parm[1] = segment index
+ * parm[2] = frame (only used when both indexes are zero)
+ */
+static void ori_pubdef(ObjRecord * orp)
+{
+ obj_index(orp, orp->parm[0]);
+ obj_index(orp, orp->parm[1]);
+ if (!(orp->parm[0] | orp->parm[1]))
+ obj_word(orp, orp->parm[2]);
+}
+
+/*
+ * Initializer for a LINNUM record.
+ * parm[0] = group index
+ * parm[1] = segment index
+ */
+static void ori_linnum(ObjRecord * orp)
+{
+ obj_index(orp, orp->parm[0]);
+ obj_index(orp, orp->parm[1]);
+}
+
+/*
+ * Initializer for a local vars record.
+ */
+static void ori_local(ObjRecord * orp)
+{
+ obj_rword(orp, dSYM);
+}
+
+/*
+ * Null initializer for records that continue without any header info
+ */
+static void ori_null(ObjRecord * orp)
+{
+ (void)orp; /* Do nothing */
+}
+
+/*
+ * This concludes the low level section of outobj.c
+ */
+
+static char obj_infile[FILENAME_MAX];
+
+static int32_t first_seg;
+static bool any_segs;
+static int passtwo;
+static int arrindex;
+
+#define GROUP_MAX 256 /* we won't _realistically_ have more
+ * than this many segs in a group */
+#define EXT_BLKSIZ 256 /* block size for externals list */
+
+struct Segment; /* need to know these structs exist */
+struct Group;
+
+struct LineNumber {
+ struct LineNumber *next;
+ struct Segment *segment;
+ int32_t offset;
+ int32_t lineno;
+};
+
+static struct FileName {
+ struct FileName *next;
+ char *name;
+ struct LineNumber *lnhead, **lntail;
+ int index;
+} *fnhead, **fntail;
+
+static struct Array {
+ struct Array *next;
+ unsigned size;
+ int basetype;
+} *arrhead, **arrtail;
+
+#define ARRAYBOT 31 /* magic number for first array index */
+
+static struct Public {
+ struct Public *next;
+ char *name;
+ int32_t offset;
+ int32_t segment; /* only if it's far-absolute */
+ int type; /* only for local debug syms */
+} *fpubhead, **fpubtail, *last_defined;
+
+static struct External {
+ struct External *next;
+ char *name;
+ int32_t commonsize;
+ int32_t commonelem; /* element size if FAR, else zero */
+ int index; /* OBJ-file external index */
+ enum {
+ DEFWRT_NONE, /* no unusual default-WRT */
+ DEFWRT_STRING, /* a string we don't yet understand */
+ DEFWRT_SEGMENT, /* a segment */
+ DEFWRT_GROUP /* a group */
+ } defwrt_type;
+ union {
+ char *string;
+ struct Segment *seg;
+ struct Group *grp;
+ } defwrt_ptr;
+ struct External *next_dws; /* next with DEFWRT_STRING */
+} *exthead, **exttail, *dws;
+
+static int externals;
+
+static struct ExtBack {
+ struct ExtBack *next;
+ struct External *exts[EXT_BLKSIZ];
+} *ebhead, **ebtail;
+
+static struct Segment {
+ struct Segment *next;
+ char *name;
+ int32_t index; /* the NASM segment id */
+ int32_t obj_index; /* the OBJ-file segment index */
+ struct Group *grp; /* the group it beint32_ts to */
+ uint32_t currentpos;
+ int32_t align; /* can be SEG_ABS + absolute addr */
+ struct Public *pubhead, **pubtail, *lochead, **loctail;
+ char *segclass, *overlay; /* `class' is a C++ keyword :-) */
+ ObjRecord *orp;
+ enum {
+ CMB_PRIVATE = 0,
+ CMB_PUBLIC = 2,
+ CMB_STACK = 5,
+ CMB_COMMON = 6
+ } combine;
+ bool use32; /* is this segment 32-bit? */
+} *seghead, **segtail, *obj_seg_needs_update;
+
+static struct Group {
+ struct Group *next;
+ char *name;
+ int32_t index; /* NASM segment id */
+ int32_t obj_index; /* OBJ-file group index */
+ int32_t nentries; /* number of elements... */
+ int32_t nindices; /* ...and number of index elts... */
+ union {
+ int32_t index;
+ char *name;
+ } segs[GROUP_MAX]; /* ...in this */
+} *grphead, **grptail, *obj_grp_needs_update;
+
+static struct ImpDef {
+ struct ImpDef *next;
+ char *extname;
+ char *libname;
+ unsigned int impindex;
+ char *impname;
+} *imphead, **imptail;
+
+static struct ExpDef {
+ struct ExpDef *next;
+ char *intname;
+ char *extname;
+ unsigned int ordinal;
+ int flags;
+} *exphead, **exptail;
+
+#define EXPDEF_FLAG_ORDINAL 0x80
+#define EXPDEF_FLAG_RESIDENT 0x40
+#define EXPDEF_FLAG_NODATA 0x20
+#define EXPDEF_MASK_PARMCNT 0x1F
+
+static int32_t obj_entry_seg, obj_entry_ofs;
+
+const struct ofmt of_obj;
+static const struct dfmt borland_debug_form;
+
+/* The current segment */
+static struct Segment *current_seg;
+
+static int32_t obj_segment(char *, int, int *);
+static void obj_write_file(void);
+static enum directive_result obj_directive(enum directive, char *, int);
+
+static void obj_init(void)
+{
+ strlcpy(obj_infile, inname, sizeof(obj_infile));
+ first_seg = seg_alloc();
+ any_segs = false;
+ fpubhead = NULL;
+ fpubtail = &fpubhead;
+ exthead = NULL;
+ exttail = &exthead;
+ imphead = NULL;
+ imptail = &imphead;
+ exphead = NULL;
+ exptail = &exphead;
+ dws = NULL;
+ externals = 0;
+ ebhead = NULL;
+ ebtail = &ebhead;
+ seghead = obj_seg_needs_update = NULL;
+ segtail = &seghead;
+ grphead = obj_grp_needs_update = NULL;
+ grptail = &grphead;
+ obj_entry_seg = NO_SEG;
+ obj_uppercase = false;
+ obj_use32 = false;
+ passtwo = 0;
+ current_seg = NULL;
+}
+
+static void obj_cleanup(void)
+{
+ obj_write_file();
+ dfmt->cleanup();
+ while (seghead) {
+ struct Segment *segtmp = seghead;
+ seghead = seghead->next;
+ while (segtmp->pubhead) {
+ struct Public *pubtmp = segtmp->pubhead;
+ segtmp->pubhead = pubtmp->next;
+ nasm_free(pubtmp->name);
+ nasm_free(pubtmp);
+ }
+ nasm_free(segtmp->segclass);
+ nasm_free(segtmp->overlay);
+ nasm_free(segtmp);
+ }
+ while (fpubhead) {
+ struct Public *pubtmp = fpubhead;
+ fpubhead = fpubhead->next;
+ nasm_free(pubtmp->name);
+ nasm_free(pubtmp);
+ }
+ while (exthead) {
+ struct External *exttmp = exthead;
+ exthead = exthead->next;
+ nasm_free(exttmp);
+ }
+ while (imphead) {
+ struct ImpDef *imptmp = imphead;
+ imphead = imphead->next;
+ nasm_free(imptmp->extname);
+ nasm_free(imptmp->libname);
+ nasm_free(imptmp->impname); /* nasm_free won't mind if it's NULL */
+ nasm_free(imptmp);
+ }
+ while (exphead) {
+ struct ExpDef *exptmp = exphead;
+ exphead = exphead->next;
+ nasm_free(exptmp->extname);
+ nasm_free(exptmp->intname);
+ nasm_free(exptmp);
+ }
+ while (ebhead) {
+ struct ExtBack *ebtmp = ebhead;
+ ebhead = ebhead->next;
+ nasm_free(ebtmp);
+ }
+ while (grphead) {
+ struct Group *grptmp = grphead;
+ grphead = grphead->next;
+ nasm_free(grptmp);
+ }
+}
+
+static void obj_ext_set_defwrt(struct External *ext, char *id)
+{
+ struct Segment *seg;
+ struct Group *grp;
+
+ for (seg = seghead; seg; seg = seg->next)
+ if (!strcmp(seg->name, id)) {
+ ext->defwrt_type = DEFWRT_SEGMENT;
+ ext->defwrt_ptr.seg = seg;
+ nasm_free(id);
+ return;
+ }
+
+ for (grp = grphead; grp; grp = grp->next)
+ if (!strcmp(grp->name, id)) {
+ ext->defwrt_type = DEFWRT_GROUP;
+ ext->defwrt_ptr.grp = grp;
+ nasm_free(id);
+ return;
+ }
+
+ ext->defwrt_type = DEFWRT_STRING;
+ ext->defwrt_ptr.string = id;
+ ext->next_dws = dws;
+ dws = ext;
+}
+
+static void obj_deflabel(char *name, int32_t segment,
+ int64_t offset, int is_global, char *special)
+{
+ /*
+ * We have three cases:
+ *
+ * (i) `segment' is a segment-base. If so, set the name field
+ * for the segment or group structure it refers to, and then
+ * return.
+ *
+ * (ii) `segment' is one of our segments, or a SEG_ABS segment.
+ * Save the label position for later output of a PUBDEF record.
+ * (Or a MODPUB, if we work out how.)
+ *
+ * (iii) `segment' is not one of our segments. Save the label
+ * position for later output of an EXTDEF, and also store a
+ * back-reference so that we can map later references to this
+ * segment number to the external index.
+ */
+ struct External *ext;
+ struct ExtBack *eb;
+ struct Segment *seg;
+ int i;
+ bool used_special = false; /* have we used the special text? */
+
+#if defined(DEBUG) && DEBUG>2
+ nasm_error(ERR_DEBUG,
+ " obj_deflabel: %s, seg=%"PRIx32", off=%"PRIx64", is_global=%d, %s\n",
+ name, segment, offset, is_global, special);
+#endif
+
+ /*
+ * If it's a special-retry from pass two, discard it.
+ */
+ if (is_global == 3)
+ return;
+
+ /*
+ * First check for the double-period, signifying something
+ * unusual.
+ */
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ if (!strcmp(name, "..start")) {
+ obj_entry_seg = segment;
+ obj_entry_ofs = offset;
+ return;
+ }
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ }
+
+ /*
+ * Case (i):
+ */
+ if (obj_seg_needs_update) {
+ obj_seg_needs_update->name = name;
+ return;
+ } else if (obj_grp_needs_update) {
+ obj_grp_needs_update->name = name;
+ return;
+ }
+ if (segment < SEG_ABS && segment != NO_SEG && segment % 2)
+ return;
+
+ if (segment >= SEG_ABS || segment == NO_SEG) {
+ /*
+ * SEG_ABS subcase of (ii).
+ */
+ if (is_global) {
+ struct Public *pub;
+
+ pub = *fpubtail = nasm_malloc(sizeof(*pub));
+ fpubtail = &pub->next;
+ pub->next = NULL;
+ pub->name = nasm_strdup(name);
+ pub->offset = offset;
+ pub->segment = (segment == NO_SEG ? 0 : segment & ~SEG_ABS);
+ }
+ if (special)
+ nasm_error(ERR_NONFATAL, "OBJ supports no special symbol features"
+ " for this symbol type");
+ return;
+ }
+
+ /*
+ * If `any_segs' is still false, we might need to define a
+ * default segment, if they're trying to declare a label in
+ * `first_seg'.
+ */
+ if (!any_segs && segment == first_seg) {
+ int tempint; /* ignored */
+ if (segment != obj_segment("__NASMDEFSEG", 2, &tempint))
+ nasm_panic("strange segment conditions in OBJ driver");
+ }
+
+ for (seg = seghead; seg && is_global; seg = seg->next)
+ if (seg->index == segment) {
+ struct Public *loc = nasm_malloc(sizeof(*loc));
+ /*
+ * Case (ii). Maybe MODPUB someday?
+ */
+ *seg->pubtail = loc;
+ seg->pubtail = &loc->next;
+ loc->next = NULL;
+ loc->name = nasm_strdup(name);
+ loc->offset = offset;
+
+ if (special)
+ nasm_error(ERR_NONFATAL,
+ "OBJ supports no special symbol features"
+ " for this symbol type");
+ return;
+ }
+
+ /*
+ * Case (iii).
+ */
+ if (is_global) {
+ ext = *exttail = nasm_malloc(sizeof(*ext));
+ ext->next = NULL;
+ exttail = &ext->next;
+ ext->name = name;
+ /* Place by default all externs into the current segment */
+ ext->defwrt_type = DEFWRT_NONE;
+
+/* 28-Apr-2002 - John Coffman
+ The following code was introduced on 12-Aug-2000, and breaks fixups
+ on code passed thru the MSC 5.1 linker (3.66) and MSC 6.00A linker
+ (5.10). It was introduced after FIXUP32 was added, and may be needed
+ for 32-bit segments. The following will get 16-bit segments working
+ again, and maybe someone can correct the 'if' condition which is
+ actually needed.
+*/
+#if 0
+ if (current_seg) {
+#else
+ if (current_seg && current_seg->use32) {
+ if (current_seg->grp) {
+ ext->defwrt_type = DEFWRT_GROUP;
+ ext->defwrt_ptr.grp = current_seg->grp;
+ } else {
+ ext->defwrt_type = DEFWRT_SEGMENT;
+ ext->defwrt_ptr.seg = current_seg;
+ }
+ }
+#endif
+
+ if (is_global == 2) {
+ ext->commonsize = offset;
+ ext->commonelem = 1; /* default FAR */
+ } else
+ ext->commonsize = 0;
+ } else
+ return;
+
+ /*
+ * Now process the special text, if any, to find default-WRT
+ * specifications and common-variable element-size and near/far
+ * specifications.
+ */
+ while (special && *special) {
+ used_special = true;
+
+ /*
+ * We might have a default-WRT specification.
+ */
+ if (!nasm_strnicmp(special, "wrt", 3)) {
+ char *p;
+ int len;
+ special += 3;
+ special += strspn(special, " \t");
+ p = nasm_strndup(special, len = strcspn(special, ":"));
+ obj_ext_set_defwrt(ext, p);
+ special += len;
+ if (*special && *special != ':')
+ nasm_error(ERR_NONFATAL, "`:' expected in special symbol"
+ " text for `%s'", ext->name);
+ else if (*special == ':')
+ special++;
+ }
+
+ /*
+ * The NEAR or FAR keywords specify nearness or
+ * farness. FAR gives default element size 1.
+ */
+ if (!nasm_strnicmp(special, "far", 3)) {
+ if (ext->commonsize)
+ ext->commonelem = 1;
+ else
+ nasm_error(ERR_NONFATAL,
+ "`%s': `far' keyword may only be applied"
+ " to common variables\n", ext->name);
+ special += 3;
+ special += strspn(special, " \t");
+ } else if (!nasm_strnicmp(special, "near", 4)) {
+ if (ext->commonsize)
+ ext->commonelem = 0;
+ else
+ nasm_error(ERR_NONFATAL,
+ "`%s': `far' keyword may only be applied"
+ " to common variables\n", ext->name);
+ special += 4;
+ special += strspn(special, " \t");
+ }
+
+ /*
+ * If it's a common, and anything else remains on the line
+ * before a further colon, evaluate it as an expression and
+ * use that as the element size. Forward references aren't
+ * allowed.
+ */
+ if (*special == ':')
+ special++;
+ else if (*special) {
+ if (ext->commonsize) {
+ expr *e;
+ struct tokenval tokval;
+
+ stdscan_reset();
+ stdscan_set(special);
+ tokval.t_type = TOKEN_INVALID;
+ e = evaluate(stdscan, NULL, &tokval, NULL, 1, NULL);
+ if (e) {
+ if (!is_simple(e))
+ nasm_error(ERR_NONFATAL, "cannot use relocatable"
+ " expression as common-variable element size");
+ else
+ ext->commonelem = reloc_value(e);
+ }
+ special = stdscan_get();
+ } else {
+ nasm_error(ERR_NONFATAL,
+ "`%s': element-size specifications only"
+ " apply to common variables", ext->name);
+ while (*special && *special != ':')
+ special++;
+ if (*special == ':')
+ special++;
+ }
+ }
+ }
+
+ i = segment / 2;
+ eb = ebhead;
+ if (!eb) {
+ eb = *ebtail = nasm_zalloc(sizeof(*eb));
+ eb->next = NULL;
+ ebtail = &eb->next;
+ }
+ while (i >= EXT_BLKSIZ) {
+ if (eb && eb->next)
+ eb = eb->next;
+ else {
+ eb = *ebtail = nasm_zalloc(sizeof(*eb));
+ eb->next = NULL;
+ ebtail = &eb->next;
+ }
+ i -= EXT_BLKSIZ;
+ }
+ eb->exts[i] = ext;
+ ext->index = ++externals;
+
+ if (special && !used_special)
+ nasm_error(ERR_NONFATAL, "OBJ supports no special symbol features"
+ " for this symbol type");
+}
+
+/* forward declaration */
+static void obj_write_fixup(ObjRecord * orp, int bytes,
+ int segrel, int32_t seg, int32_t wrt,
+ struct Segment *segto);
+
+static void obj_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ const uint8_t *ucdata;
+ int32_t ldata;
+ struct Segment *seg;
+ ObjRecord *orp;
+
+ /*
+ * If `any_segs' is still false, we must define a default
+ * segment.
+ */
+ if (!any_segs) {
+ int tempint; /* ignored */
+ if (segto != obj_segment("__NASMDEFSEG", 2, &tempint))
+ nasm_panic("strange segment conditions in OBJ driver");
+ }
+
+ /*
+ * Find the segment we are targetting.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segto)
+ break;
+ if (!seg)
+ nasm_panic("code directed to nonexistent segment?");
+
+ orp = seg->orp;
+ orp->parm[0] = seg->currentpos;
+
+ switch (type) {
+ case OUT_RAWDATA:
+ ucdata = data;
+ while (size > 0) {
+ unsigned int len;
+ orp = obj_check(seg->orp, 1);
+ len = RECORD_MAX - orp->used;
+ if (len > size)
+ len = size;
+ memcpy(orp->buf + orp->used, ucdata, len);
+ orp->committed = orp->used += len;
+ orp->parm[0] = seg->currentpos += len;
+ ucdata += len;
+ size -= len;
+ }
+ break;
+
+ case OUT_ADDRESS:
+ case OUT_REL1ADR:
+ case OUT_REL2ADR:
+ case OUT_REL4ADR:
+ case OUT_REL8ADR:
+ {
+ int rsize;
+
+ if (type == OUT_ADDRESS)
+ size = abs((int)size);
+
+ if (segment == NO_SEG && type != OUT_ADDRESS)
+ nasm_error(ERR_NONFATAL, "relative call to absolute address not"
+ " supported by OBJ format");
+ if (segment >= SEG_ABS)
+ nasm_error(ERR_NONFATAL, "far-absolute relocations not supported"
+ " by OBJ format");
+
+ ldata = *(int64_t *)data;
+ if (type != OUT_ADDRESS) {
+ /*
+ * For 16-bit and 32-bit x86 code, the size and realsize() always
+ * matches as only jumps, calls and loops uses PC relative
+ * addressing and the address isn't followed by any other opcode
+ * bytes. In 64-bit mode there is RIP relative addressing which
+ * means the fixup location can be followed by an immediate value,
+ * meaning that size > realsize().
+ *
+ * When the CPU is calculating the effective address, it takes the
+ * RIP at the end of the instruction and adds the fixed up relative
+ * address value to it.
+ *
+ * The linker's point of reference is the end of the fixup location
+ * (which is the end of the instruction for Jcc, CALL, LOOP[cc]).
+ * It is calculating distance between the target symbol and the end
+ * of the fixup location, and add this to the displacement value we
+ * are calculating here and storing at the fixup location.
+ *
+ * To get the right effect, we need to _reduce_ the displacement
+ * value by the number of bytes following the fixup.
+ *
+ * Example:
+ * data at address 0x100; REL4ADR at 0x050, 4 byte immediate,
+ * end of fixup at 0x054, end of instruction at 0x058.
+ * => size = 8.
+ * => realsize() -> 4
+ * => CPU needs a value of: 0x100 - 0x058 = 0x0a8
+ * => linker/loader will add: 0x100 - 0x054 = 0x0ac
+ * => We must add an addend of -4.
+ * => realsize() - size = -4.
+ *
+ * The code used to do size - realsize() at least since v0.90,
+ * probably because it wasn't needed...
+ */
+ ldata -= size;
+ size = realsize(type, size);
+ ldata += size;
+ }
+
+ switch (size) {
+ default:
+ nasm_error(ERR_NONFATAL, "OBJ format can only handle 16- or "
+ "32-byte relocations");
+ segment = NO_SEG; /* Don't actually generate a relocation */
+ break;
+ case 2:
+ orp = obj_word(orp, ldata);
+ break;
+ case 4:
+ orp = obj_dword(orp, ldata);
+ break;
+ }
+
+ rsize = size;
+ if (segment < SEG_ABS && (segment != NO_SEG && segment % 2) &&
+ size == 4) {
+ /*
+ * This is a 4-byte segment-base relocation such as
+ * `MOV EAX,SEG foo'. OBJ format can't actually handle
+ * these, but if the constant term has the 16 low bits
+ * zero, we can just apply a 2-byte segment-base
+ * relocation to the low word instead.
+ */
+ rsize = 2;
+ if (ldata & 0xFFFF)
+ nasm_error(ERR_NONFATAL, "OBJ format cannot handle complex"
+ " dword-size segment base references");
+ }
+ if (segment != NO_SEG)
+ obj_write_fixup(orp, rsize,
+ (type == OUT_ADDRESS ? 0x4000 : 0),
+ segment, wrt, seg);
+ seg->currentpos += size;
+ break;
+ }
+
+ default:
+ nasm_error(ERR_NONFATAL,
+ "Relocation type not supported by output format");
+ /* fall through */
+
+ case OUT_RESERVE:
+ if (orp->committed)
+ orp = obj_bump(orp);
+ seg->currentpos += size;
+ break;
+ }
+ obj_commit(orp);
+}
+
+static void obj_write_fixup(ObjRecord * orp, int bytes,
+ int segrel, int32_t seg, int32_t wrt,
+ struct Segment *segto)
+{
+ unsigned locat;
+ int method;
+ int base;
+ int32_t tidx, fidx;
+ struct Segment *s = NULL;
+ struct Group *g = NULL;
+ struct External *e = NULL;
+ ObjRecord *forp;
+
+ if (bytes != 2 && bytes != 4) {
+ nasm_error(ERR_NONFATAL, "`obj' output driver does not support"
+ " %d-bit relocations", bytes << 3);
+ return;
+ }
+
+ forp = orp->child;
+ if (forp == NULL) {
+ orp->child = forp = obj_new();
+ forp->up = &(orp->child);
+ /* We should choose between FIXUPP and FIXU32 record type */
+ /* If we're targeting a 32-bit segment, use a FIXU32 record */
+ if (segto->use32)
+ forp->type = FIXU32;
+ else
+ forp->type = FIXUPP;
+ }
+
+ if (seg % 2) {
+ base = true;
+ locat = FIX_16_SELECTOR;
+ seg--;
+ if (bytes != 2)
+ nasm_panic("OBJ: 4-byte segment base fixup got"
+ " through sanity check");
+ } else {
+ base = false;
+ locat = (bytes == 2) ? FIX_16_OFFSET : FIX_32_OFFSET;
+ if (!segrel)
+ /*
+ * There is a bug in tlink that makes it process self relative
+ * fixups incorrectly if the x_size doesn't match the location
+ * size.
+ */
+ forp = obj_force(forp, bytes << 3);
+ }
+
+ forp = obj_rword(forp, locat | segrel | (orp->parm[0] - orp->parm[2]));
+
+ tidx = fidx = -1, method = 0; /* placate optimisers */
+
+ /*
+ * See if we can find the segment ID in our segment list. If
+ * so, we have a T4 (LSEG) target.
+ */
+ for (s = seghead; s; s = s->next)
+ if (s->index == seg)
+ break;
+ if (s)
+ method = 4, tidx = s->obj_index;
+ else {
+ for (g = grphead; g; g = g->next)
+ if (g->index == seg)
+ break;
+ if (g)
+ method = 5, tidx = g->obj_index;
+ else {
+ int32_t i = seg / 2;
+ struct ExtBack *eb = ebhead;
+ while (i >= EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ if (eb)
+ method = 6, e = eb->exts[i], tidx = e->index;
+ else
+ nasm_panic("unrecognised segment value in obj_write_fixup");
+ }
+ }
+
+ /*
+ * If no WRT given, assume the natural default, which is method
+ * F5 unless:
+ *
+ * - we are doing an OFFSET fixup for a grouped segment, in
+ * which case we require F1 (group).
+ *
+ * - we are doing an OFFSET fixup for an external with a
+ * default WRT, in which case we must honour the default WRT.
+ */
+ if (wrt == NO_SEG) {
+ if (!base && s && s->grp)
+ method |= 0x10, fidx = s->grp->obj_index;
+ else if (!base && e && e->defwrt_type != DEFWRT_NONE) {
+ if (e->defwrt_type == DEFWRT_SEGMENT)
+ method |= 0x00, fidx = e->defwrt_ptr.seg->obj_index;
+ else if (e->defwrt_type == DEFWRT_GROUP)
+ method |= 0x10, fidx = e->defwrt_ptr.grp->obj_index;
+ else {
+ nasm_error(ERR_NONFATAL, "default WRT specification for"
+ " external `%s' unresolved", e->name);
+ method |= 0x50, fidx = -1; /* got to do _something_ */
+ }
+ } else
+ method |= 0x50, fidx = -1;
+ } else {
+ /*
+ * See if we can find the WRT-segment ID in our segment
+ * list. If so, we have a F0 (LSEG) frame.
+ */
+ for (s = seghead; s; s = s->next)
+ if (s->index == wrt - 1)
+ break;
+ if (s)
+ method |= 0x00, fidx = s->obj_index;
+ else {
+ for (g = grphead; g; g = g->next)
+ if (g->index == wrt - 1)
+ break;
+ if (g)
+ method |= 0x10, fidx = g->obj_index;
+ else {
+ int32_t i = wrt / 2;
+ struct ExtBack *eb = ebhead;
+ while (i >= EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ if (eb)
+ method |= 0x20, fidx = eb->exts[i]->index;
+ else
+ nasm_panic("unrecognised WRT value in obj_write_fixup");
+ }
+ }
+ }
+
+ forp = obj_byte(forp, method);
+ if (fidx != -1)
+ forp = obj_index(forp, fidx);
+ forp = obj_index(forp, tidx);
+ obj_commit(forp);
+}
+
+static int32_t obj_segment(char *name, int pass, int *bits)
+{
+ /*
+ * We call the label manager here to define a name for the new
+ * segment, and when our _own_ label-definition stub gets
+ * called in return, it should register the new segment name
+ * using the pointer it gets passed. That way we save memory,
+ * by sponging off the label manager.
+ */
+#if defined(DEBUG) && DEBUG>=3
+ nasm_error(ERR_DEBUG, " obj_segment: < %s >, pass=%d, *bits=%d\n",
+ name, pass, *bits);
+#endif
+ if (!name) {
+ *bits = 16;
+ current_seg = NULL;
+ return first_seg;
+ } else {
+ struct Segment *seg;
+ struct Group *grp;
+ struct External **extp;
+ int obj_idx, i, attrs;
+ bool rn_error;
+ char *p;
+
+ /*
+ * Look for segment attributes.
+ */
+ attrs = 0;
+ while (*name == '.')
+ name++; /* hack, but a documented one */
+ p = name;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p) {
+ *p++ = '\0';
+ while (*p && nasm_isspace(*p))
+ *p++ = '\0';
+ }
+ while (*p) {
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p) {
+ *p++ = '\0';
+ while (*p && nasm_isspace(*p))
+ *p++ = '\0';
+ }
+
+ attrs++;
+ }
+
+ for (seg = seghead, obj_idx = 1; ; seg = seg->next, obj_idx++) {
+ if (!seg)
+ break;
+
+ if (!strcmp(seg->name, name)) {
+ if (attrs > 0 && pass == 1)
+ nasm_error(ERR_WARNING, "segment attributes specified on"
+ " redeclaration of segment: ignoring");
+ if (seg->use32)
+ *bits = 32;
+ else
+ *bits = 16;
+ current_seg = seg;
+ return seg->index;
+ }
+ }
+
+ *segtail = seg = nasm_malloc(sizeof(*seg));
+ seg->next = NULL;
+ segtail = &seg->next;
+ seg->index = (any_segs ? seg_alloc() : first_seg);
+ seg->obj_index = obj_idx;
+ seg->grp = NULL;
+ any_segs = true;
+ seg->name = nasm_strdup(name);
+ seg->currentpos = 0;
+ seg->align = 1; /* default */
+ seg->use32 = false; /* default */
+ seg->combine = CMB_PUBLIC; /* default */
+ seg->segclass = seg->overlay = NULL;
+ seg->pubhead = NULL;
+ seg->pubtail = &seg->pubhead;
+ seg->lochead = NULL;
+ seg->loctail = &seg->lochead;
+ seg->orp = obj_new();
+ seg->orp->up = &(seg->orp);
+ seg->orp->ori = ori_ledata;
+ seg->orp->type = LEDATA;
+ seg->orp->parm[1] = obj_idx;
+
+ /*
+ * Process the segment attributes.
+ */
+ p = name;
+ while (attrs--) {
+ p += strlen(p);
+ while (!*p)
+ p++;
+
+ /*
+ * `p' contains a segment attribute.
+ */
+ if (!nasm_stricmp(p, "private"))
+ seg->combine = CMB_PRIVATE;
+ else if (!nasm_stricmp(p, "public"))
+ seg->combine = CMB_PUBLIC;
+ else if (!nasm_stricmp(p, "common"))
+ seg->combine = CMB_COMMON;
+ else if (!nasm_stricmp(p, "stack"))
+ seg->combine = CMB_STACK;
+ else if (!nasm_stricmp(p, "use16"))
+ seg->use32 = false;
+ else if (!nasm_stricmp(p, "use32"))
+ seg->use32 = true;
+ else if (!nasm_stricmp(p, "flat")) {
+ /*
+ * This segment is an OS/2 FLAT segment. That means
+ * that its default group is group FLAT, even if
+ * the group FLAT does not explicitly _contain_ the
+ * segment.
+ *
+ * When we see this, we must create the group
+ * `FLAT', containing no segments, if it does not
+ * already exist; then we must set the default
+ * group of this segment to be the FLAT group.
+ */
+ struct Group *grp;
+ for (grp = grphead; grp; grp = grp->next)
+ if (!strcmp(grp->name, "FLAT"))
+ break;
+ if (!grp) {
+ obj_directive(D_GROUP, "FLAT", 1);
+ for (grp = grphead; grp; grp = grp->next)
+ if (!strcmp(grp->name, "FLAT"))
+ break;
+ if (!grp)
+ nasm_panic("failure to define FLAT?!");
+ }
+ seg->grp = grp;
+ } else if (!nasm_strnicmp(p, "class=", 6))
+ seg->segclass = nasm_strdup(p + 6);
+ else if (!nasm_strnicmp(p, "overlay=", 8))
+ seg->overlay = nasm_strdup(p + 8);
+ else if (!nasm_strnicmp(p, "align=", 6)) {
+ seg->align = readnum(p + 6, &rn_error);
+ if (rn_error) {
+ seg->align = 1;
+ nasm_error(ERR_NONFATAL, "segment alignment should be"
+ " numeric");
+ }
+ switch (seg->align) {
+ case 1: /* BYTE */
+ case 2: /* WORD */
+ case 4: /* DWORD */
+ case 16: /* PARA */
+ case 256: /* PAGE */
+ case 4096: /* PharLap extension */
+ break;
+ case 8:
+ nasm_error(ERR_WARNING,
+ "OBJ format does not support alignment"
+ " of 8: rounding up to 16");
+ seg->align = 16;
+ break;
+ case 32:
+ case 64:
+ case 128:
+ nasm_error(ERR_WARNING,
+ "OBJ format does not support alignment"
+ " of %d: rounding up to 256", seg->align);
+ seg->align = 256;
+ break;
+ case 512:
+ case 1024:
+ case 2048:
+ nasm_error(ERR_WARNING,
+ "OBJ format does not support alignment"
+ " of %d: rounding up to 4096", seg->align);
+ seg->align = 4096;
+ break;
+ default:
+ nasm_error(ERR_NONFATAL, "invalid alignment value %d",
+ seg->align);
+ seg->align = 1;
+ break;
+ }
+ } else if (!nasm_strnicmp(p, "absolute=", 9)) {
+ seg->align = SEG_ABS + readnum(p + 9, &rn_error);
+ if (rn_error)
+ nasm_error(ERR_NONFATAL, "argument to `absolute' segment"
+ " attribute should be numeric");
+ }
+ }
+
+ /* We need to know whenever we have at least one 32-bit segment */
+ obj_use32 |= seg->use32;
+
+ obj_seg_needs_update = seg;
+ if (seg->align >= SEG_ABS)
+ define_label(name, NO_SEG, seg->align - SEG_ABS, false);
+ else
+ define_label(name, seg->index + 1, 0L, false);
+ obj_seg_needs_update = NULL;
+
+ /*
+ * See if this segment is defined in any groups.
+ */
+ for (grp = grphead; grp; grp = grp->next) {
+ for (i = grp->nindices; i < grp->nentries; i++) {
+ if (!strcmp(grp->segs[i].name, seg->name)) {
+ nasm_free(grp->segs[i].name);
+ grp->segs[i] = grp->segs[grp->nindices];
+ grp->segs[grp->nindices++].index = seg->obj_index;
+ if (seg->grp)
+ nasm_error(ERR_WARNING,
+ "segment `%s' is already part of"
+ " a group: first one takes precedence",
+ seg->name);
+ else
+ seg->grp = grp;
+ }
+ }
+ }
+
+ /*
+ * Walk through the list of externals with unresolved
+ * default-WRT clauses, and resolve any that point at this
+ * segment.
+ */
+ extp = &dws;
+ while (*extp) {
+ if ((*extp)->defwrt_type == DEFWRT_STRING &&
+ !strcmp((*extp)->defwrt_ptr.string, seg->name)) {
+ nasm_free((*extp)->defwrt_ptr.string);
+ (*extp)->defwrt_type = DEFWRT_SEGMENT;
+ (*extp)->defwrt_ptr.seg = seg;
+ *extp = (*extp)->next_dws;
+ } else
+ extp = &(*extp)->next_dws;
+ }
+
+ if (seg->use32)
+ *bits = 32;
+ else
+ *bits = 16;
+ current_seg = seg;
+ return seg->index;
+ }
+}
+
+static enum directive_result
+obj_directive(enum directive directive, char *value, int pass)
+{
+ switch (directive) {
+ case D_GROUP:
+ {
+ char *p, *q, *v;
+ if (pass == 1) {
+ struct Group *grp;
+ struct Segment *seg;
+ struct External **extp;
+ int obj_idx;
+
+ q = value;
+ while (*q == '.')
+ q++; /* hack, but a documented one */
+ v = q;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+ /*
+ * Here we used to sanity-check the group directive to
+ * ensure nobody tried to declare a group containing no
+ * segments. However, OS/2 does this as standard
+ * practice, so the sanity check has been removed.
+ *
+ * if (!*q) {
+ * nasm_error(ERR_NONFATAL,"GROUP directive contains no segments");
+ * return DIRR_ERROR;
+ * }
+ */
+
+ obj_idx = 1;
+ for (grp = grphead; grp; grp = grp->next) {
+ obj_idx++;
+ if (!strcmp(grp->name, v)) {
+ nasm_error(ERR_NONFATAL, "group `%s' defined twice", v);
+ return DIRR_ERROR;
+ }
+ }
+
+ *grptail = grp = nasm_malloc(sizeof(*grp));
+ grp->next = NULL;
+ grptail = &grp->next;
+ grp->index = seg_alloc();
+ grp->obj_index = obj_idx;
+ grp->nindices = grp->nentries = 0;
+ grp->name = NULL;
+
+ obj_grp_needs_update = grp;
+ backend_label(v, grp->index + 1, 0L);
+ obj_grp_needs_update = NULL;
+
+ while (*q) {
+ p = q;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+ /*
+ * Now p contains a segment name. Find it.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (!strcmp(seg->name, p))
+ break;
+ if (seg) {
+ /*
+ * We have a segment index. Shift a name entry
+ * to the end of the array to make room.
+ */
+ grp->segs[grp->nentries++] = grp->segs[grp->nindices];
+ grp->segs[grp->nindices++].index = seg->obj_index;
+ if (seg->grp)
+ nasm_error(ERR_WARNING,
+ "segment `%s' is already part of"
+ " a group: first one takes precedence",
+ seg->name);
+ else
+ seg->grp = grp;
+ } else {
+ /*
+ * We have an as-yet undefined segment.
+ * Remember its name, for later.
+ */
+ grp->segs[grp->nentries++].name = nasm_strdup(p);
+ }
+ }
+
+ /*
+ * Walk through the list of externals with unresolved
+ * default-WRT clauses, and resolve any that point at
+ * this group.
+ */
+ extp = &dws;
+ while (*extp) {
+ if ((*extp)->defwrt_type == DEFWRT_STRING &&
+ !strcmp((*extp)->defwrt_ptr.string, grp->name)) {
+ nasm_free((*extp)->defwrt_ptr.string);
+ (*extp)->defwrt_type = DEFWRT_GROUP;
+ (*extp)->defwrt_ptr.grp = grp;
+ *extp = (*extp)->next_dws;
+ } else
+ extp = &(*extp)->next_dws;
+ }
+ }
+ return DIRR_OK;
+ }
+ case D_UPPERCASE:
+ obj_uppercase = true;
+ return DIRR_OK;
+
+ case D_IMPORT:
+ {
+ char *q, *extname, *libname, *impname;
+
+ if (pass == 2)
+ return 1; /* ignore in pass two */
+ extname = q = value;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+
+ libname = q;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+
+ impname = q;
+
+ if (!*extname || !*libname)
+ nasm_error(ERR_NONFATAL, "`import' directive requires symbol name"
+ " and library name");
+ else {
+ struct ImpDef *imp;
+ bool err = false;
+
+ imp = *imptail = nasm_malloc(sizeof(struct ImpDef));
+ imptail = &imp->next;
+ imp->next = NULL;
+ imp->extname = nasm_strdup(extname);
+ imp->libname = nasm_strdup(libname);
+ imp->impindex = readnum(impname, &err);
+ if (!*impname || err)
+ imp->impname = nasm_strdup(impname);
+ else
+ imp->impname = NULL;
+ }
+
+ return DIRR_OK;
+ }
+ case D_EXPORT:
+ {
+ char *q, *extname, *intname, *v;
+ struct ExpDef *export;
+ int flags = 0;
+ unsigned int ordinal = 0;
+
+ if (pass == 2)
+ return DIRR_OK; /* ignore in pass two */
+ intname = q = value;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+
+ extname = q;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+
+ if (!*intname) {
+ nasm_error(ERR_NONFATAL, "`export' directive requires export name");
+ return DIRR_OK;
+ }
+ if (!*extname) {
+ extname = intname;
+ intname = "";
+ }
+ while (*q) {
+ v = q;
+ while (*q && !nasm_isspace(*q))
+ q++;
+ if (nasm_isspace(*q)) {
+ *q++ = '\0';
+ while (*q && nasm_isspace(*q))
+ q++;
+ }
+ if (!nasm_stricmp(v, "resident"))
+ flags |= EXPDEF_FLAG_RESIDENT;
+ else if (!nasm_stricmp(v, "nodata"))
+ flags |= EXPDEF_FLAG_NODATA;
+ else if (!nasm_strnicmp(v, "parm=", 5)) {
+ bool err = false;
+ flags |= EXPDEF_MASK_PARMCNT & readnum(v + 5, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL,
+ "value `%s' for `parm' is non-numeric", v + 5);
+ return DIRR_ERROR;
+ }
+ } else {
+ bool err = false;
+ ordinal = readnum(v, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL,
+ "unrecognised export qualifier `%s'", v);
+ return DIRR_ERROR;
+ }
+ flags |= EXPDEF_FLAG_ORDINAL;
+ }
+ }
+
+ export = *exptail = nasm_malloc(sizeof(struct ExpDef));
+ exptail = &export->next;
+ export->next = NULL;
+ export->extname = nasm_strdup(extname);
+ export->intname = nasm_strdup(intname);
+ export->ordinal = ordinal;
+ export->flags = flags;
+
+ return DIRR_OK;
+ }
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+static void obj_sectalign(int32_t seg, unsigned int value)
+{
+ struct Segment *s;
+
+ list_for_each(s, seghead) {
+ if (s->index == seg)
+ break;
+ }
+
+ /*
+ * it should not be too big value
+ * and applied on non-absolute sections
+ */
+ if (!s || !is_power2(value) ||
+ value > 4096 || s->align >= SEG_ABS)
+ return;
+
+ /*
+ * FIXME: No code duplication please
+ * consider making helper for this
+ * mapping since section handler has
+ * to do the same
+ */
+ switch (value) {
+ case 8:
+ value = 16;
+ break;
+ case 32:
+ case 64:
+ case 128:
+ value = 256;
+ break;
+ case 512:
+ case 1024:
+ case 2048:
+ value = 4096;
+ break;
+ }
+
+ if (s->align < (int)value)
+ s->align = value;
+}
+
+static int32_t obj_segbase(int32_t segment)
+{
+ struct Segment *seg;
+
+ /*
+ * Find the segment in our list.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segment - 1)
+ break;
+
+ if (!seg) {
+ /*
+ * Might be an external with a default WRT.
+ */
+ int32_t i = segment / 2;
+ struct ExtBack *eb = ebhead;
+ struct External *e;
+
+ while (i >= EXT_BLKSIZ) {
+ if (eb)
+ eb = eb->next;
+ else
+ break;
+ i -= EXT_BLKSIZ;
+ }
+ if (eb) {
+ e = eb->exts[i];
+ if (!e) {
+ nasm_assert(pass0 == 0);
+ /* Not available - can happen during optimization */
+ return NO_SEG;
+ }
+
+ switch (e->defwrt_type) {
+ case DEFWRT_NONE:
+ return segment; /* fine */
+ case DEFWRT_SEGMENT:
+ return e->defwrt_ptr.seg->index + 1;
+ case DEFWRT_GROUP:
+ return e->defwrt_ptr.grp->index + 1;
+ default:
+ return NO_SEG; /* can't tell what it is */
+ }
+ }
+
+ return segment; /* not one of ours - leave it alone */
+ }
+
+ if (seg->align >= SEG_ABS)
+ return seg->align; /* absolute segment */
+ if (seg->grp)
+ return seg->grp->index + 1; /* grouped segment */
+
+ return segment; /* no special treatment */
+}
+
+/* Get a file timestamp in MS-DOS format */
+static uint32_t obj_file_timestamp(const char *pathname)
+{
+ time_t t;
+ const struct tm *lt;
+
+ if (!nasm_file_time(&t, pathname))
+ return 0;
+
+ lt = localtime(&t);
+ if (!lt)
+ return 0;
+
+ if (lt->tm_year < 80 || lt->tm_year > 207)
+ return 0; /* Only years 1980-2107 representable */
+
+ return
+ ((uint32_t)lt->tm_sec >> 1) +
+ ((uint32_t)lt->tm_min << 5) +
+ ((uint32_t)lt->tm_hour << 11) +
+ ((uint32_t)lt->tm_mday << 16) +
+ (((uint32_t)lt->tm_mon + 1) << 21) +
+ (((uint32_t)lt->tm_year - 80) << 25);
+}
+
+static void obj_write_file(void)
+{
+ struct Segment *seg, *entry_seg_ptr = 0;
+ struct FileName *fn;
+ struct LineNumber *ln;
+ struct Group *grp;
+ struct Public *pub, *loc;
+ struct External *ext;
+ struct ImpDef *imp;
+ struct ExpDef *export;
+ int lname_idx;
+ ObjRecord *orp;
+ const struct strlist_entry *depfile;
+ const bool debuginfo = (dfmt == &borland_debug_form);
+
+ /*
+ * Write the THEADR module header.
+ */
+ orp = obj_new();
+ orp->type = THEADR;
+ obj_name(orp, obj_infile);
+ obj_emit2(orp);
+
+ /*
+ * Write the NASM boast comment.
+ */
+ orp->type = COMENT;
+ obj_rword(orp, dTRANSL);
+ obj_name(orp, nasm_comment);
+ obj_emit2(orp);
+
+ /*
+ * Output file dependency information
+ */
+ if (!obj_nodepend) {
+ list_for_each(depfile, depend_list->head) {
+ uint32_t ts;
+
+ ts = obj_file_timestamp(depfile->str);
+ if (ts) {
+ orp->type = COMENT;
+ obj_rword(orp, dDEPFILE);
+ obj_dword(orp, ts);
+ obj_name(orp, depfile->str);
+ obj_emit2(orp);
+ }
+ }
+ }
+
+ orp->type = COMENT;
+ /*
+ * Write the IMPDEF records, if any.
+ */
+ for (imp = imphead; imp; imp = imp->next) {
+ obj_rword(orp, dOMFEXT);
+ obj_byte(orp, 1); /* subfunction 1: IMPDEF */
+ if (imp->impname)
+ obj_byte(orp, 0); /* import by name */
+ else
+ obj_byte(orp, 1); /* import by ordinal */
+ obj_name(orp, imp->extname);
+ obj_name(orp, imp->libname);
+ if (imp->impname)
+ obj_name(orp, imp->impname);
+ else
+ obj_word(orp, imp->impindex);
+ obj_emit2(orp);
+ }
+
+ /*
+ * Write the EXPDEF records, if any.
+ */
+ for (export = exphead; export; export = export->next) {
+ obj_rword(orp, dOMFEXT);
+ obj_byte(orp, 2); /* subfunction 2: EXPDEF */
+ obj_byte(orp, export->flags);
+ obj_name(orp, export->extname);
+ obj_name(orp, export->intname);
+ if (export->flags & EXPDEF_FLAG_ORDINAL)
+ obj_word(orp, export->ordinal);
+ obj_emit2(orp);
+ }
+
+ /* we're using extended OMF if we put in debug info */
+ if (debuginfo) {
+ orp->type = COMENT;
+ obj_rword(orp, dEXTENDED);
+ obj_emit2(orp);
+ }
+
+ /*
+ * Write the first LNAMES record, containing LNAME one, which
+ * is null. Also initialize the LNAME counter.
+ */
+ orp->type = LNAMES;
+ obj_byte(orp, 0);
+ lname_idx = 1;
+ /*
+ * Write some LNAMES for the segment names
+ */
+ for (seg = seghead; seg; seg = seg->next) {
+ orp = obj_name(orp, seg->name);
+ if (seg->segclass)
+ orp = obj_name(orp, seg->segclass);
+ if (seg->overlay)
+ orp = obj_name(orp, seg->overlay);
+ obj_commit(orp);
+ }
+ /*
+ * Write some LNAMES for the group names
+ */
+ for (grp = grphead; grp; grp = grp->next) {
+ orp = obj_name(orp, grp->name);
+ obj_commit(orp);
+ }
+ obj_emit(orp);
+
+ /*
+ * Write the SEGDEF records.
+ */
+ orp->type = SEGDEF;
+ for (seg = seghead; seg; seg = seg->next) {
+ int acbp;
+ uint32_t seglen = seg->currentpos;
+
+ acbp = (seg->combine << 2); /* C field */
+
+ if (seg->use32)
+ acbp |= 0x01; /* P bit is Use32 flag */
+ else if (seglen == 0x10000L) {
+ seglen = 0; /* This special case may be needed for old linkers */
+ acbp |= 0x02; /* B bit */
+ }
+
+ /* A field */
+ if (seg->align >= SEG_ABS)
+ /* acbp |= 0x00 */ ;
+ else if (seg->align >= 4096) {
+ if (seg->align > 4096)
+ nasm_error(ERR_NONFATAL, "segment `%s' requires more alignment"
+ " than OBJ format supports", seg->name);
+ acbp |= 0xC0; /* PharLap extension */
+ } else if (seg->align >= 256) {
+ acbp |= 0x80;
+ } else if (seg->align >= 16) {
+ acbp |= 0x60;
+ } else if (seg->align >= 4) {
+ acbp |= 0xA0;
+ } else if (seg->align >= 2) {
+ acbp |= 0x40;
+ } else
+ acbp |= 0x20;
+
+ obj_byte(orp, acbp);
+ if (seg->align & SEG_ABS) {
+ obj_x(orp, seg->align - SEG_ABS); /* Frame */
+ obj_byte(orp, 0); /* Offset */
+ }
+ obj_x(orp, seglen);
+ obj_index(orp, ++lname_idx);
+ obj_index(orp, seg->segclass ? ++lname_idx : 1);
+ obj_index(orp, seg->overlay ? ++lname_idx : 1);
+ obj_emit2(orp);
+ }
+
+ /*
+ * Write the GRPDEF records.
+ */
+ orp->type = GRPDEF;
+ for (grp = grphead; grp; grp = grp->next) {
+ int i;
+
+ if (grp->nindices != grp->nentries) {
+ for (i = grp->nindices; i < grp->nentries; i++) {
+ nasm_error(ERR_NONFATAL, "group `%s' contains undefined segment"
+ " `%s'", grp->name, grp->segs[i].name);
+ nasm_free(grp->segs[i].name);
+ grp->segs[i].name = NULL;
+ }
+ }
+ obj_index(orp, ++lname_idx);
+ for (i = 0; i < grp->nindices; i++) {
+ obj_byte(orp, 0xFF);
+ obj_index(orp, grp->segs[i].index);
+ }
+ obj_emit2(orp);
+ }
+
+ /*
+ * Write the PUBDEF records: first the ones in the segments,
+ * then the far-absolutes.
+ */
+ orp->type = PUBDEF;
+ orp->ori = ori_pubdef;
+ for (seg = seghead; seg; seg = seg->next) {
+ orp->parm[0] = seg->grp ? seg->grp->obj_index : 0;
+ orp->parm[1] = seg->obj_index;
+ for (pub = seg->pubhead; pub; pub = pub->next) {
+ orp = obj_name(orp, pub->name);
+ orp = obj_x(orp, pub->offset);
+ orp = obj_byte(orp, 0); /* type index */
+ obj_commit(orp);
+ }
+ obj_emit(orp);
+ }
+ orp->parm[0] = 0;
+ orp->parm[1] = 0;
+ for (pub = fpubhead; pub; pub = pub->next) { /* pub-crawl :-) */
+ if (orp->parm[2] != (uint32_t)pub->segment) {
+ obj_emit(orp);
+ orp->parm[2] = pub->segment;
+ }
+ orp = obj_name(orp, pub->name);
+ orp = obj_x(orp, pub->offset);
+ orp = obj_byte(orp, 0); /* type index */
+ obj_commit(orp);
+ }
+ obj_emit(orp);
+
+ /*
+ * Write the EXTDEF and COMDEF records, in order.
+ */
+ orp->ori = ori_null;
+ for (ext = exthead; ext; ext = ext->next) {
+ if (ext->commonsize == 0) {
+ if (orp->type != EXTDEF) {
+ obj_emit(orp);
+ orp->type = EXTDEF;
+ }
+ orp = obj_name(orp, ext->name);
+ orp = obj_index(orp, 0);
+ } else {
+ if (orp->type != COMDEF) {
+ obj_emit(orp);
+ orp->type = COMDEF;
+ }
+ orp = obj_name(orp, ext->name);
+ orp = obj_index(orp, 0);
+ if (ext->commonelem) {
+ orp = obj_byte(orp, 0x61); /* far communal */
+ orp = obj_value(orp, (ext->commonsize / ext->commonelem));
+ orp = obj_value(orp, ext->commonelem);
+ } else {
+ orp = obj_byte(orp, 0x62); /* near communal */
+ orp = obj_value(orp, ext->commonsize);
+ }
+ }
+ obj_commit(orp);
+ }
+ obj_emit(orp);
+
+ /*
+ * Write a COMENT record stating that the linker's first pass
+ * may stop processing at this point. Exception is if our
+ * MODEND record specifies a start point, in which case,
+ * according to some variants of the documentation, this COMENT
+ * should be omitted. So we'll omit it just in case.
+ * But, TASM puts it in all the time so if we are using
+ * TASM debug stuff we are putting it in
+ */
+ if (debuginfo || obj_entry_seg == NO_SEG) {
+ orp->type = COMENT;
+ obj_rword(orp, dLINKPASS);
+ obj_byte(orp, 1);
+ obj_emit2(orp);
+ }
+
+ /*
+ * 1) put out the compiler type
+ * 2) Put out the type info. The only type we are using is near label #19
+ */
+ if (debuginfo) {
+ int i;
+ struct Array *arrtmp = arrhead;
+ orp->type = COMENT;
+ obj_rword(orp, dCOMPDEF);
+ obj_byte(orp, 4);
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x18); /* type # for linking */
+ obj_word(orp, 6); /* size of type */
+ obj_byte(orp, 0x2a); /* absolute type for debugging */
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x19); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x24); /* absolute type for debugging */
+ obj_byte(orp, 0); /* near/far specifier */
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x1A); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x24); /* absolute type for debugging */
+ obj_byte(orp, 1); /* near/far specifier */
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x1b); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x23); /* absolute type for debugging */
+ obj_byte(orp, 0);
+ obj_byte(orp, 0);
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x1c); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x23); /* absolute type for debugging */
+ obj_byte(orp, 0);
+ obj_byte(orp, 4);
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x1d); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x23); /* absolute type for debugging */
+ obj_byte(orp, 0);
+ obj_byte(orp, 1);
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, 0x1e); /* type # for linking */
+ obj_word(orp, 0); /* size of type */
+ obj_byte(orp, 0x23); /* absolute type for debugging */
+ obj_byte(orp, 0);
+ obj_byte(orp, 5);
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+
+ /* put out the array types */
+ for (i = ARRAYBOT; i < arrindex; i++) {
+ obj_rword(orp, dTYPEDEF);
+ obj_word(orp, i); /* type # for linking */
+ obj_word(orp, arrtmp->size); /* size of type */
+ obj_byte(orp, 0x1A); /* absolute type for debugging (array) */
+ obj_byte(orp, arrtmp->basetype); /* base type */
+ obj_emit2(orp);
+ arrtmp = arrtmp->next;
+ }
+ }
+ /*
+ * write out line number info with a LINNUM record
+ * switch records when we switch segments, and output the
+ * file in a pseudo-TASM fashion. The record switch is naive; that
+ * is that one file may have many records for the same segment
+ * if there are lots of segment switches
+ */
+ if (fnhead && debuginfo) {
+ seg = fnhead->lnhead->segment;
+
+ for (fn = fnhead; fn; fn = fn->next) {
+ /* write out current file name */
+ orp->type = COMENT;
+ orp->ori = ori_null;
+ obj_rword(orp, dFILNAME);
+ obj_byte(orp, 0);
+ obj_name(orp, fn->name);
+ obj_dword(orp, 0);
+ obj_emit2(orp);
+
+ /* write out line numbers this file */
+
+ orp->type = LINNUM;
+ orp->ori = ori_linnum;
+ for (ln = fn->lnhead; ln; ln = ln->next) {
+ if (seg != ln->segment) {
+ /* if we get here have to flush the buffer and start
+ * a new record for a new segment
+ */
+ seg = ln->segment;
+ obj_emit(orp);
+ }
+ orp->parm[0] = seg->grp ? seg->grp->obj_index : 0;
+ orp->parm[1] = seg->obj_index;
+ orp = obj_word(orp, ln->lineno);
+ orp = obj_x(orp, ln->offset);
+ obj_commit(orp);
+ }
+ obj_emit(orp);
+ }
+ }
+ /*
+ * we are going to locate the entry point segment now
+ * rather than wait until the MODEND record, because,
+ * then we can output a special symbol to tell where the
+ * entry point is.
+ *
+ */
+ if (obj_entry_seg != NO_SEG) {
+ for (seg = seghead; seg; seg = seg->next) {
+ if (seg->index == obj_entry_seg) {
+ entry_seg_ptr = seg;
+ break;
+ }
+ }
+ if (!seg)
+ nasm_error(ERR_NONFATAL, "entry point is not in this module");
+ }
+
+ /*
+ * get ready to put out symbol records
+ */
+ orp->type = COMENT;
+ orp->ori = ori_local;
+
+ /*
+ * put out a symbol for the entry point
+ * no dots in this symbol, because, borland does
+ * not (officially) support dots in label names
+ * and I don't know what various versions of TLINK will do
+ */
+ if (debuginfo && obj_entry_seg != NO_SEG) {
+ orp = obj_name(orp, "start_of_program");
+ orp = obj_word(orp, 0x19); /* type: near label */
+ orp = obj_index(orp, seg->grp ? seg->grp->obj_index : 0);
+ orp = obj_index(orp, seg->obj_index);
+ orp = obj_x(orp, obj_entry_ofs);
+ obj_commit(orp);
+ }
+
+ /*
+ * put out the local labels
+ */
+ for (seg = seghead; seg && debuginfo; seg = seg->next) {
+ /* labels this seg */
+ for (loc = seg->lochead; loc; loc = loc->next) {
+ orp = obj_name(orp, loc->name);
+ orp = obj_word(orp, loc->type);
+ orp = obj_index(orp, seg->grp ? seg->grp->obj_index : 0);
+ orp = obj_index(orp, seg->obj_index);
+ orp = obj_x(orp, loc->offset);
+ obj_commit(orp);
+ }
+ }
+ if (orp->used)
+ obj_emit(orp);
+
+ /*
+ * Write the LEDATA/FIXUPP pairs.
+ */
+ for (seg = seghead; seg; seg = seg->next) {
+ obj_emit(seg->orp);
+ nasm_free(seg->orp);
+ }
+
+ /*
+ * Write the MODEND module end marker.
+ */
+ orp->type = obj_use32 ? MODE32 : MODEND;
+ orp->ori = ori_null;
+ if (entry_seg_ptr) {
+ orp->type = entry_seg_ptr->use32 ? MODE32 : MODEND;
+ obj_byte(orp, 0xC1);
+ seg = entry_seg_ptr;
+ if (seg->grp) {
+ obj_byte(orp, 0x10);
+ obj_index(orp, seg->grp->obj_index);
+ } else {
+ /*
+ * the below changed to prevent TLINK crashing.
+ * Previous more efficient version read:
+ *
+ * obj_byte (orp, 0x50);
+ */
+ obj_byte(orp, 0x00);
+ obj_index(orp, seg->obj_index);
+ }
+ obj_index(orp, seg->obj_index);
+ obj_x(orp, obj_entry_ofs);
+ } else
+ obj_byte(orp, 0);
+ obj_emit2(orp);
+ nasm_free(orp);
+}
+
+static void obj_fwrite(ObjRecord * orp)
+{
+ unsigned int cksum, len;
+ uint8_t *ptr;
+
+ cksum = orp->type;
+ if (orp->x_size == 32)
+ cksum |= 1;
+ fputc(cksum, ofile);
+ len = orp->committed + 1;
+ cksum += (len & 0xFF) + ((len >> 8) & 0xFF);
+ fwriteint16_t(len, ofile);
+ nasm_write(orp->buf, len-1, ofile);
+ for (ptr = orp->buf; --len; ptr++)
+ cksum += *ptr;
+ fputc((-cksum) & 0xFF, ofile);
+}
+
+static enum directive_result
+obj_pragma(const struct pragma *pragma)
+{
+ switch (pragma->opcode) {
+ case D_NODEPEND:
+ obj_nodepend = true;
+ break;
+
+ default:
+ break;
+ }
+
+ return DIRR_OK;
+}
+
+extern macros_t obj_stdmac[];
+
+static void dbgbi_init(void)
+{
+ fnhead = NULL;
+ fntail = &fnhead;
+ arrindex = ARRAYBOT;
+ arrhead = NULL;
+ arrtail = &arrhead;
+}
+static void dbgbi_cleanup(void)
+{
+ struct Segment *segtmp;
+ while (fnhead) {
+ struct FileName *fntemp = fnhead;
+ while (fnhead->lnhead) {
+ struct LineNumber *lntemp = fnhead->lnhead;
+ fnhead->lnhead = lntemp->next;
+ nasm_free(lntemp);
+ }
+ fnhead = fnhead->next;
+ nasm_free(fntemp->name);
+ nasm_free(fntemp);
+ }
+ for (segtmp = seghead; segtmp; segtmp = segtmp->next) {
+ while (segtmp->lochead) {
+ struct Public *loctmp = segtmp->lochead;
+ segtmp->lochead = loctmp->next;
+ nasm_free(loctmp->name);
+ nasm_free(loctmp);
+ }
+ }
+ while (arrhead) {
+ struct Array *arrtmp = arrhead;
+ arrhead = arrhead->next;
+ nasm_free(arrtmp);
+ }
+}
+
+static void dbgbi_linnum(const char *lnfname, int32_t lineno, int32_t segto)
+{
+ struct FileName *fn;
+ struct LineNumber *ln;
+ struct Segment *seg;
+
+ if (segto == NO_SEG)
+ return;
+
+ /*
+ * If `any_segs' is still false, we must define a default
+ * segment.
+ */
+ if (!any_segs) {
+ int tempint; /* ignored */
+ if (segto != obj_segment("__NASMDEFSEG", 2, &tempint))
+ nasm_panic("strange segment conditions in OBJ driver");
+ }
+
+ /*
+ * Find the segment we are targetting.
+ */
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segto)
+ break;
+ if (!seg)
+ nasm_panic("lineno directed to nonexistent segment?");
+
+/* for (fn = fnhead; fn; fn = fnhead->next) */
+ for (fn = fnhead; fn; fn = fn->next) /* fbk - Austin Lunnen - John Fine */
+ if (!nasm_stricmp(lnfname, fn->name))
+ break;
+ if (!fn) {
+ fn = nasm_malloc(sizeof(*fn));
+ fn->name = nasm_malloc(strlen(lnfname) + 1);
+ strcpy(fn->name, lnfname);
+ fn->lnhead = NULL;
+ fn->lntail = &fn->lnhead;
+ fn->next = NULL;
+ *fntail = fn;
+ fntail = &fn->next;
+ }
+ ln = nasm_malloc(sizeof(*ln));
+ ln->segment = seg;
+ ln->offset = seg->currentpos;
+ ln->lineno = lineno;
+ ln->next = NULL;
+ *fn->lntail = ln;
+ fn->lntail = &ln->next;
+
+}
+static void dbgbi_deflabel(char *name, int32_t segment,
+ int64_t offset, int is_global, char *special)
+{
+ struct Segment *seg;
+
+ (void)special;
+
+ /*
+ * Note: ..[^@] special symbols are filtered in labels.c
+ */
+
+ /*
+ * If it's a special-retry from pass two, discard it.
+ */
+ if (is_global == 3)
+ return;
+
+ /*
+ * Case (i):
+ */
+ if (obj_seg_needs_update) {
+ return;
+ } else if (obj_grp_needs_update) {
+ return;
+ }
+ if (segment < SEG_ABS && segment != NO_SEG && segment % 2)
+ return;
+
+ if (segment >= SEG_ABS || segment == NO_SEG) {
+ return;
+ }
+
+ /*
+ * If `any_segs' is still false, we might need to define a
+ * default segment, if they're trying to declare a label in
+ * `first_seg'. But the label should exist due to a prior
+ * call to obj_deflabel so we can skip that.
+ */
+
+ for (seg = seghead; seg; seg = seg->next)
+ if (seg->index == segment) {
+ struct Public *loc = nasm_malloc(sizeof(*loc));
+ /*
+ * Case (ii). Maybe MODPUB someday?
+ */
+ last_defined = *seg->loctail = loc;
+ seg->loctail = &loc->next;
+ loc->next = NULL;
+ loc->name = nasm_strdup(name);
+ loc->offset = offset;
+ }
+}
+static void dbgbi_typevalue(int32_t type)
+{
+ int vsize;
+ int elem = TYM_ELEMENTS(type);
+ type = TYM_TYPE(type);
+
+ if (!last_defined)
+ return;
+
+ switch (type) {
+ case TY_BYTE:
+ last_defined->type = 8; /* uint8_t */
+ vsize = 1;
+ break;
+ case TY_WORD:
+ last_defined->type = 10; /* unsigned word */
+ vsize = 2;
+ break;
+ case TY_DWORD:
+ last_defined->type = 12; /* unsigned dword */
+ vsize = 4;
+ break;
+ case TY_FLOAT:
+ last_defined->type = 14; /* float */
+ vsize = 4;
+ break;
+ case TY_QWORD:
+ last_defined->type = 15; /* qword */
+ vsize = 8;
+ break;
+ case TY_TBYTE:
+ last_defined->type = 16; /* TBYTE */
+ vsize = 10;
+ break;
+ default:
+ last_defined->type = 0x19; /* label */
+ vsize = 0;
+ break;
+ }
+
+ if (elem > 1) {
+ struct Array *arrtmp = nasm_malloc(sizeof(*arrtmp));
+ int vtype = last_defined->type;
+ arrtmp->size = vsize * elem;
+ arrtmp->basetype = vtype;
+ arrtmp->next = NULL;
+ last_defined->type = arrindex++;
+ *arrtail = arrtmp;
+ arrtail = &(arrtmp->next);
+ }
+ last_defined = NULL;
+}
+static void dbgbi_output(int output_type, void *param)
+{
+ (void)output_type;
+ (void)param;
+}
+static const struct dfmt borland_debug_form = {
+ "Borland Debug Records",
+ "borland",
+ dbgbi_init,
+ dbgbi_linnum,
+ dbgbi_deflabel,
+ null_debug_directive,
+ dbgbi_typevalue,
+ dbgbi_output,
+ dbgbi_cleanup,
+ NULL /* pragma list */
+};
+
+static const struct dfmt * const borland_debug_arr[3] = {
+ &borland_debug_form,
+ &null_debug_form,
+ NULL
+};
+
+static const struct pragma_facility obj_pragma_list[] = {
+ { NULL, obj_pragma }
+};
+
+const struct ofmt of_obj = {
+ "MS-DOS 16-bit/32-bit OMF object files",
+ "obj",
+ ".obj",
+ 0,
+ 32,
+ borland_debug_arr,
+ &borland_debug_form,
+ obj_stdmac,
+ obj_init,
+ null_reset,
+ nasm_do_legacy_output,
+ obj_out,
+ obj_deflabel,
+ obj_segment,
+ NULL,
+ obj_sectalign,
+ obj_segbase,
+ obj_directive,
+ obj_cleanup,
+ obj_pragma_list
+};
+#endif /* OF_OBJ */
diff --git a/output/outobj.mac b/output/outobj.mac
new file mode 100644
index 00000000..a5da833e
--- /dev/null
+++ b/output/outobj.mac
@@ -0,0 +1,49 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: obj
+%define __SECT__ [section .text]
+%imacro group 1+.nolist
+[group %1]
+%endmacro
+%imacro uppercase 0+.nolist
+[uppercase %1]
+%endmacro
+%imacro export 1+.nolist
+[export %1]
+%endmacro
+%imacro import 1+.nolist
+[import %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outrdf.mac b/output/outrdf.mac
new file mode 100644
index 00000000..64a7ac14
--- /dev/null
+++ b/output/outrdf.mac
@@ -0,0 +1,40 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: rdf
+%define __SECT__ [section .text]
+%imacro library 1+.nolist
+[library %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outrdf2.c b/output/outrdf2.c
new file mode 100644
index 00000000..456d1bdf
--- /dev/null
+++ b/output/outrdf2.c
@@ -0,0 +1,772 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * outrdf2.c output routines for the Netwide Assembler to produce
+ * RDOFF version 2 format object files, which Julian originally
+ * planned to use it in his MOSCOW operating system.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "saa.h"
+#include "outform.h"
+#include "outlib.h"
+
+/* VERBOSE_WARNINGS: define this to add some extra warnings... */
+#define VERBOSE_WARNINGS
+
+#ifdef OF_RDF2
+
+#include "rdoff.h"
+
+/* This signature is written to start of RDOFF files */
+static const char *RDOFF2Id = RDOFF2_SIGNATURE;
+
+/* Note that whenever a segment is referred to in the RDOFF file, its number
+ * is always half of the segment number that NASM uses to refer to it; this
+ * is because NASM only allocates even numbered segments, so as to not
+ * waste any of the 16 bits of segment number written to the file - this
+ * allows up to 65533 external labels to be defined; otherwise it would be
+ * 32764. */
+
+#define COUNT_SEGTYPES 9
+
+static char *segmenttypes[COUNT_SEGTYPES] = {
+ "null", "text", "code", "data",
+ "comment", "lcomment", "pcomment",
+ "symdebug", "linedebug"
+};
+
+static int segmenttypenumbers[COUNT_SEGTYPES] = {
+ 0, 1, 1, 2, 3, 4, 5, 6, 7
+};
+
+/* code for managing buffers needed to separate code and data into individual
+ * sections until they are ready to be written to the file.
+ * We'd better hope that it all fits in memory else we're buggered... */
+
+#define BUF_BLOCK_LEN 4088 /* selected to match page size (4096)
+ * on 80x86 machines for efficiency */
+
+/***********************************************************************
+ * Actual code to deal with RDOFF2 ouput format begins here...
+ */
+
+/* global variables set during the initialisation phase */
+
+static struct SAA *seg[RDF_MAXSEGS]; /* seg 0 = code, seg 1 = data */
+static struct SAA *header; /* relocation/import/export records */
+
+static struct seginfo {
+ char *segname;
+ int segnumber;
+ uint16_t segtype;
+ uint16_t segreserved;
+ int32_t seglength;
+} segments[RDF_MAXSEGS];
+
+static int nsegments;
+
+static int32_t bsslength;
+static int32_t headerlength;
+
+static void rdf2_init(void)
+{
+ int segtext, segdata, segbss;
+
+ /* set up the initial segments */
+ segments[0].segname = ".text";
+ segments[0].segnumber = 0;
+ segments[0].segtype = 1;
+ segments[0].segreserved = 0;
+ segments[0].seglength = 0;
+
+ segments[1].segname = ".data";
+ segments[1].segnumber = 1;
+ segments[1].segtype = 2;
+ segments[1].segreserved = 0;
+ segments[1].seglength = 0;
+
+ segments[2].segname = ".bss";
+ segments[2].segnumber = 2;
+ segments[2].segtype = 0xFFFF; /* reserved - should never be produced */
+ segments[2].segreserved = 0;
+ segments[2].seglength = 0;
+
+ nsegments = 3;
+
+ seg[0] = saa_init(1L);
+ seg[1] = saa_init(1L);
+ seg[2] = NULL; /* special case! */
+
+ header = saa_init(1L);
+
+ segtext = seg_alloc();
+ segdata = seg_alloc();
+ segbss = seg_alloc();
+ if (segtext != 0 || segdata != 2 || segbss != 4)
+ nasm_panic("rdf segment numbers not allocated as expected (%d,%d,%d)",
+ segtext, segdata, segbss);
+ bsslength = 0;
+ headerlength = 0;
+}
+
+static int32_t rdf2_section_names(char *name, int pass, int *bits)
+{
+ int i;
+ bool err;
+ char *p, *q;
+ int code = -1;
+ int reserved = 0;
+
+ (void)pass;
+
+ /*
+ * Default is 32 bits, in the text segment.
+ */
+ if (!name) {
+ *bits = 32;
+ return 0;
+ }
+
+ /* look for segment type code following segment name */
+ p = name;
+ while (*p && !nasm_isspace(*p))
+ p++;
+ if (*p) { /* we're now in whitespace */
+ *p++ = '\0';
+ while (*p && nasm_isspace(80))
+ *p++ = '\0';
+ }
+ if (*p) { /* we're now in an attribute value */
+ /*
+ * see if we have an optional ',number' following the type code
+ */
+ if ((q = strchr(p, ','))) {
+ *q++ = '\0';
+
+ reserved = readnum(q, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL,
+ "value following comma must be numeric");
+ reserved = 0;
+ }
+ }
+ /*
+ * check it against the text strings in segmenttypes
+ */
+
+ for (i = 0; i < COUNT_SEGTYPES; i++)
+ if (!nasm_stricmp(p, segmenttypes[i])) {
+ code = segmenttypenumbers[i];
+ break;
+ }
+ if (code == -1) { /* didn't find anything */
+ code = readnum(p, &err);
+ if (err) {
+ nasm_error(ERR_NONFATAL, "unrecognised RDF segment type (%s)",
+ p);
+ code = 3;
+ }
+ }
+ }
+ for (i = 0; i < nsegments; i++) {
+ if (!strcmp(name, segments[i].segname)) {
+ if (code != -1 || reserved != 0)
+ nasm_error(ERR_NONFATAL, "segment attributes specified on"
+ " redeclaration of segment");
+ return segments[i].segnumber * 2;
+ }
+ }
+
+ /* declaring a new segment! */
+
+ if (code == -1) {
+ nasm_error(ERR_NONFATAL, "new segment declared without type code");
+ code = 3;
+ }
+ if (nsegments == RDF_MAXSEGS) {
+ nasm_fatal("reached compiled-in maximum segment limit (%d)",
+ RDF_MAXSEGS);
+ return NO_SEG;
+ }
+
+ segments[nsegments].segname = nasm_strdup(name);
+ i = seg_alloc();
+ if (i % 2 != 0)
+ nasm_panic("seg_alloc() returned odd number");
+ segments[nsegments].segnumber = i >> 1;
+ segments[nsegments].segtype = code;
+ segments[nsegments].segreserved = reserved;
+ segments[nsegments].seglength = 0;
+
+ seg[nsegments] = saa_init(1L);
+
+ return i;
+}
+
+/*
+ * Write relocation record
+ */
+static void write_reloc_rec(struct RelocRec *r)
+{
+ char buf[4], *b;
+
+ if (r->refseg != (uint16_t) NO_SEG && (r->refseg & 1)) /* segment base ref */
+ r->type = RDFREC_SEGRELOC;
+
+ r->refseg >>= 1; /* adjust segment nos to RDF rather than NASM */
+
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ saa_wbytes(header, &r->segment, 1);
+ b = buf;
+ WRITELONG(b, r->offset);
+ saa_wbytes(header, buf, 4);
+ saa_wbytes(header, &r->length, 1);
+ b = buf;
+ WRITESHORT(b, r->refseg);
+ saa_wbytes(header, buf, 2);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Write export record
+ */
+static void write_export_rec(struct ExportRec *r)
+{
+ char buf[4], *b;
+
+ r->segment >>= 1;
+
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ saa_wbytes(header, &r->flags, 1);
+ saa_wbytes(header, &r->segment, 1);
+ b = buf;
+ WRITELONG(b, r->offset);
+ saa_wbytes(header, buf, 4);
+ saa_wbytes(header, r->label, strlen(r->label) + 1);
+ headerlength += r->reclen + 2;
+}
+
+static void write_import_rec(struct ImportRec *r)
+{
+ char buf[4], *b;
+
+ r->segment >>= 1;
+
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ saa_wbytes(header, &r->flags, 1);
+ b = buf;
+ WRITESHORT(b, r->segment);
+ saa_wbytes(header, buf, 2);
+ saa_wbytes(header, r->label, strlen(r->label) + 1);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Write BSS record
+ */
+static void write_bss_rec(struct BSSRec *r)
+{
+ char buf[4], *b;
+
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ b = buf;
+ WRITELONG(b, r->amount);
+ saa_wbytes(header, buf, 4);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Write common variable record
+ */
+static void write_common_rec(struct CommonRec *r)
+{
+ char buf[4], *b;
+
+ r->segment >>= 1;
+
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ b = buf;
+ WRITESHORT(b, r->segment);
+ saa_wbytes(header, buf, 2);
+ b = buf;
+ WRITELONG(b, r->size);
+ saa_wbytes(header, buf, 4);
+ b = buf;
+ WRITESHORT(b, r->align);
+ saa_wbytes(header, buf, 2);
+ saa_wbytes(header, r->label, strlen(r->label) + 1);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Write library record
+ */
+static void write_dll_rec(struct DLLRec *r)
+{
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ saa_wbytes(header, r->libname, strlen(r->libname) + 1);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Write module name record
+ */
+static void write_modname_rec(struct ModRec *r)
+{
+ saa_wbytes(header, &r->type, 1);
+ saa_wbytes(header, &r->reclen, 1);
+ saa_wbytes(header, r->modname, strlen(r->modname) + 1);
+ headerlength += r->reclen + 2;
+}
+
+/*
+ * Handle export, import and common records.
+ */
+static void rdf2_deflabel(char *name, int32_t segment, int64_t offset,
+ int is_global, char *special)
+{
+ struct ExportRec r;
+ struct ImportRec ri;
+ struct CommonRec ci;
+ static int farsym = 0;
+ static int i;
+ char symflags = 0;
+ int len;
+
+ /* Check if the label length is OK */
+ if ((len = strlen(name)) >= EXIM_LABEL_MAX) {
+ nasm_error(ERR_NONFATAL, "label size exceeds %d bytes", EXIM_LABEL_MAX);
+ return;
+ }
+ if (!len) {
+ nasm_error(ERR_NONFATAL, "zero-length label");
+ return;
+ }
+
+ if (is_global == 2) {
+ /* Common variable */
+ ci.type = RDFREC_COMMON;
+ ci.size = offset;
+ ci.segment = segment;
+ strcpy(ci.label, name);
+ ci.reclen = 9 + len;
+ ci.align = 0;
+
+ /*
+ * Check the special text to see if it's a valid number and power
+ * of two; if so, store it as the alignment for the common variable.
+ */
+ if (special) {
+ bool err;
+ ci.align = readnum(special, &err);
+ if (err)
+ nasm_error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+ " valid number", special);
+ else if ((ci.align | (ci.align - 1)) != 2 * ci.align - 1)
+ nasm_error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+ " power of two", special);
+ }
+ write_common_rec(&ci);
+ }
+
+ /* We don't care about local labels or fix-up hints */
+ if (is_global != 1)
+ return;
+
+ if (special) {
+ while (*special == ' ' || *special == '\t')
+ special++;
+
+ if (!nasm_strnicmp(special, "export", 6)) {
+ special += 6;
+ symflags |= SYM_GLOBAL;
+ } else if (!nasm_strnicmp(special, "import", 6)) {
+ special += 6;
+ symflags |= SYM_IMPORT;
+ }
+
+ if (*special) {
+ while (nasm_isspace(*special))
+ special++;
+ if (!nasm_stricmp(special, "far")) {
+ farsym = 1;
+ } else if (!nasm_stricmp(special, "near")) {
+ farsym = 0;
+ } else if (!nasm_stricmp(special, "proc") ||
+ !nasm_stricmp(special, "function")) {
+ symflags |= SYM_FUNCTION;
+ } else if (!nasm_stricmp(special, "data") ||
+ !nasm_stricmp(special, "object")) {
+ symflags |= SYM_DATA;
+ } else
+ nasm_error(ERR_NONFATAL, "unrecognised symbol type `%s'",
+ special);
+ }
+ }
+
+ if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+ nasm_error(ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+ return;
+ }
+
+ for (i = 0; i < nsegments; i++) {
+ if (segments[i].segnumber == segment >> 1)
+ break;
+ }
+
+ if (i >= nsegments) { /* EXTERN declaration */
+ ri.type = farsym ? RDFREC_FARIMPORT : RDFREC_IMPORT;
+ if (symflags & SYM_GLOBAL)
+ nasm_error(ERR_NONFATAL,
+ "symbol type conflict - EXTERN cannot be EXPORT");
+ ri.flags = symflags;
+ ri.segment = segment;
+ strcpy(ri.label, name);
+ ri.reclen = 4 + len;
+ write_import_rec(&ri);
+ } else if (is_global) {
+ r.type = RDFREC_GLOBAL; /* GLOBAL declaration */
+ if (symflags & SYM_IMPORT)
+ nasm_error(ERR_NONFATAL,
+ "symbol type conflict - GLOBAL cannot be IMPORT");
+ r.flags = symflags;
+ r.segment = segment;
+ r.offset = offset;
+ strcpy(r.label, name);
+ r.reclen = 7 + len;
+ write_export_rec(&r);
+ }
+}
+
+static void membufwrite(int segment, const void *data, int bytes)
+{
+ int i;
+ char buf[4], *b;
+
+ for (i = 0; i < nsegments; i++) {
+ if (segments[i].segnumber == segment)
+ break;
+ }
+ if (i == nsegments)
+ nasm_panic("can't find segment %d", segment);
+
+ if (bytes < 0) {
+ b = buf;
+ if (bytes == -2)
+ WRITESHORT(b, *(int16_t *)data);
+ else
+ WRITELONG(b, *(int32_t *)data);
+ data = buf;
+ bytes = -bytes;
+ }
+ segments[i].seglength += bytes;
+ saa_wbytes(seg[i], data, bytes);
+}
+
+static int getsegmentlength(int segment)
+{
+ int i;
+ for (i = 0; i < nsegments; i++) {
+ if (segments[i].segnumber == segment)
+ break;
+ }
+ if (i == nsegments)
+ nasm_panic("can't find segment %d", segment);
+
+ return segments[i].seglength;
+}
+
+static void rdf2_out(int32_t segto, const void *data,
+ enum out_type type, uint64_t size,
+ int32_t segment, int32_t wrt)
+{
+ struct RelocRec rr;
+ uint8_t databuf[8], *pd;
+ int seg;
+
+ segto >>= 1; /* convert NASM segment no to RDF number */
+
+ for (seg = 0; seg < nsegments; seg++) {
+ if (segments[seg].segnumber == segto)
+ break;
+ }
+ if (seg >= nsegments) {
+ nasm_error(ERR_NONFATAL,
+ "specified segment not supported by rdf output format");
+ return;
+ }
+
+ if (wrt != NO_SEG) {
+ wrt = NO_SEG; /* continue to do _something_ */
+ nasm_error(ERR_NONFATAL, "WRT not supported by rdf output format");
+ }
+
+ if (segto == 2 && type != OUT_RESERVE) {
+ nasm_error(ERR_NONFATAL, "BSS segments may not be initialized");
+
+ /* just reserve the space for now... */
+
+ if (type == OUT_REL2ADR)
+ size = 2;
+ else
+ size = 4;
+ type = OUT_RESERVE;
+ }
+
+ if (type == OUT_RESERVE) {
+ if (segto == 2) /* BSS segment space reserverd */
+ bsslength += size;
+ else
+ while (size--)
+ membufwrite(segto, databuf, 1);
+ } else if (type == OUT_RAWDATA) {
+ membufwrite(segto, data, size);
+ } else if (type == OUT_ADDRESS) {
+ int asize = abs((int)size);
+
+ /* if segment == NO_SEG then we are writing an address of an
+ object within the same segment - do not produce reloc rec. */
+
+ /* FIXME - is this behaviour sane? at first glance it doesn't
+ appear to be. Must test this thoroughly...! */
+
+ if (segment != NO_SEG) {
+ /* it's an address, so we must write a relocation record */
+
+ rr.type = RDFREC_RELOC; /* type signature */
+ rr.reclen = 8;
+ rr.segment = segto; /* segment we're currently in */
+ rr.offset = getsegmentlength(segto); /* current offset */
+ rr.length = asize; /* length of reference */
+ rr.refseg = segment; /* segment referred to */
+ write_reloc_rec(&rr);
+ }
+
+ pd = databuf; /* convert address to little-endian */
+ WRITEADDR(pd, *(int64_t *)data, asize);
+ membufwrite(segto, databuf, asize);
+ } else if (type == OUT_REL2ADR) {
+ if (segment == segto)
+ nasm_panic("intra-segment OUT_REL2ADR");
+
+ rr.reclen = 8;
+ rr.offset = getsegmentlength(segto); /* current offset */
+ rr.length = 2; /* length of reference */
+ rr.refseg = segment; /* segment referred to (will be >>1'd) */
+
+ if (segment != NO_SEG && segment % 2) {
+ rr.type = RDFREC_SEGRELOC;
+ rr.segment = segto; /* memory base refs *aren't ever* relative! */
+ write_reloc_rec(&rr);
+
+ /* what do we put in the code? Simply the data. This should almost
+ * always be zero, unless someone's doing segment arithmetic...
+ */
+ rr.offset = *(int64_t *)data;
+ } else {
+ rr.type = RDFREC_RELOC; /* type signature */
+ rr.segment = segto + 64; /* segment we're currently in + rel flag */
+ write_reloc_rec(&rr);
+
+ /* work out what to put in the code: offset of the end of this operand,
+ * subtracted from any data specified, so that loader can just add
+ * address of imported symbol onto it to get address relative to end of
+ * instruction: import_address + data(offset) - end_of_instrn */
+
+ rr.offset = *(int32_t *)data - (rr.offset + size);
+ }
+
+ membufwrite(segto, &rr.offset, -2);
+ } else if (type == OUT_REL4ADR) {
+ if ((segment == segto) && (globalbits != 64))
+ nasm_panic("intra-segment OUT_REL4ADR");
+ if (segment != NO_SEG && segment % 2) {
+ nasm_panic("erm... 4 byte segment base ref?");
+ }
+
+ rr.type = RDFREC_RELOC; /* type signature */
+ rr.segment = segto + 64; /* segment we're currently in + rel tag */
+ rr.offset = getsegmentlength(segto); /* current offset */
+ rr.length = 4; /* length of reference */
+ rr.refseg = segment; /* segment referred to */
+ rr.reclen = 8;
+ write_reloc_rec(&rr);
+
+ rr.offset = *(int64_t *)data - (rr.offset + size);
+
+ membufwrite(segto, &rr.offset, -4);
+ }
+}
+
+static void rdf2_cleanup(void)
+{
+ int32_t l;
+ struct BSSRec bs;
+ int i;
+
+ /* should write imported & exported symbol declarations to header here */
+
+ /* generate the output file... */
+ nasm_write(RDOFF2Id, 6, ofile); /* file type magic number */
+
+ if (bsslength != 0) { /* reserve BSS */
+ bs.type = RDFREC_BSS;
+ bs.amount = bsslength;
+ bs.reclen = 4;
+ write_bss_rec(&bs);
+ }
+
+ /*
+ * calculate overall length of the output object
+ */
+ l = headerlength + 4;
+
+ for (i = 0; i < nsegments; i++) {
+ if (i == 2)
+ continue; /* skip BSS segment */
+ l += 10 + segments[i].seglength;
+ }
+ l += 10; /* null segment */
+
+ fwriteint32_t(l, ofile);
+
+ fwriteint32_t(headerlength, ofile);
+ saa_fpwrite(header, ofile); /* dump header */
+ saa_free(header);
+
+ for (i = 0; i < nsegments; i++) {
+ if (i == 2)
+ continue;
+
+ fwriteint16_t(segments[i].segtype, ofile);
+ fwriteint16_t(segments[i].segnumber, ofile);
+ fwriteint16_t(segments[i].segreserved, ofile);
+ fwriteint32_t(segments[i].seglength, ofile);
+
+ saa_fpwrite(seg[i], ofile);
+ saa_free(seg[i]);
+ }
+
+ /* null segment - write 10 bytes of zero */
+ fwriteint32_t(0, ofile);
+ fwriteint32_t(0, ofile);
+ fwriteint16_t(0, ofile);
+}
+
+/*
+ * Handle RDOFF2 specific directives
+ */
+static enum directive_result
+rdf2_directive(enum directive directive, char *value, int pass)
+{
+ size_t n;
+
+ switch (directive) {
+ case D_LIBRARY:
+ n = strlen(value);
+ if (n >= MODLIB_NAME_MAX) {
+ nasm_error(ERR_NONFATAL, "name size exceeds %d bytes", MODLIB_NAME_MAX);
+ return DIRR_ERROR;
+ }
+ if (pass == 1) {
+ struct DLLRec r;
+ r.type = RDFREC_DLL;
+ r.reclen = n + 1;
+ strcpy(r.libname, value);
+ write_dll_rec(&r);
+ }
+ return DIRR_OK;
+
+ case D_MODULE:
+ if ((n = strlen(value)) >= MODLIB_NAME_MAX) {
+ nasm_error(ERR_NONFATAL, "name size exceeds %d bytes", MODLIB_NAME_MAX);
+ return DIRR_ERROR;
+ }
+ if (pass == 1) {
+ struct ModRec r;
+ r.type = RDFREC_MODNAME;
+ r.reclen = n + 1;
+ strcpy(r.modname, value);
+ write_modname_rec(&r);
+ }
+ return DIRR_OK;
+
+ default:
+ return DIRR_UNKNOWN;
+ }
+}
+
+extern macros_t rdf2_stdmac[];
+
+const struct ofmt of_rdf2 = {
+ "Relocatable Dynamic Object File Format v2.0",
+ "rdf",
+ ".rdf",
+ 0,
+ 64,
+ null_debug_arr,
+ &null_debug_form,
+ rdf2_stdmac,
+ rdf2_init,
+ null_reset,
+ nasm_do_legacy_output,
+ rdf2_out,
+ rdf2_deflabel,
+ rdf2_section_names,
+ NULL,
+ null_sectalign,
+ null_segbase,
+ rdf2_directive,
+ rdf2_cleanup,
+ NULL /* pragma list */
+};
+
+#endif /* OF_RDF2 */
diff --git a/output/outrdf2.mac b/output/outrdf2.mac
new file mode 100644
index 00000000..4875c50c
--- /dev/null
+++ b/output/outrdf2.mac
@@ -0,0 +1,43 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2009 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+OUT: rdf2
+%define __SECT__ [section .text]
+%imacro library 1+.nolist
+[library %1]
+%endmacro
+%imacro module 1+.nolist
+[module %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/pecoff.h b/output/pecoff.h
new file mode 100644
index 00000000..8b57d6b2
--- /dev/null
+++ b/output/pecoff.h
@@ -0,0 +1,532 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2010 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef PECOFF_H
+#define PECOFF_H
+
+/*
+ * Microsoft Portable Executable and Common Object
+ * File Format Specification
+ *
+ * Revision 8.1 – February 15, 2008
+ */
+
+/*
+ * Machine types
+ */
+#define IMAGE_FILE_MACHINE_UNKNOWN 0x0000
+#define IMAGE_FILE_MACHINE_AM33 0x01d3
+#define IMAGE_FILE_MACHINE_AMD64 0x8664
+#define IMAGE_FILE_MACHINE_EBC 0x0ebc
+#define IMAGE_FILE_MACHINE_M32R 0x9041
+#define IMAGE_FILE_MACHINE_ALPHA 0x0184
+#define IMAGE_FILE_MACHINE_ARM 0x01c0
+#define IMAGE_FILE_MACHINE_ALPHA64 0x0284
+#define IMAGE_FILE_MACHINE_I386 0x014c
+#define IMAGE_FILE_MACHINE_IA64 0x0200
+#define IMAGE_FILE_MACHINE_M68K 0x0268
+#define IMAGE_FILE_MACHINE_MIPS16 0x0266
+#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366
+#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466
+#define IMAGE_FILE_MACHINE_POWERPC 0x01f0
+#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
+#define IMAGE_FILE_MACHINE_R3000 0x0162
+#define IMAGE_FILE_MACHINE_R4000 0x0166
+#define IMAGE_FILE_MACHINE_R10000 0x0168
+#define IMAGE_FILE_MACHINE_SH3 0x01a2
+#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
+#define IMAGE_FILE_MACHINE_SH4 0x01a6
+#define IMAGE_FILE_MACHINE_SH5 0x01a8
+#define IMAGE_FILE_MACHINE_THUMB 0x01c2
+#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169
+#define IMAGE_FILE_MACHINE_MASK 0xffff
+
+/*
+ * Characteristics
+ */
+#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
+#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
+#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
+#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
+#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
+#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
+#define IMAGE_FILE_32BIT_MACHINE 0x0100
+#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
+#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
+#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
+#define IMAGE_FILE_SYSTEM 0x1000
+#define IMAGE_FILE_DLL 0x2000
+#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
+#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
+
+/*
+ * Windows subsystem
+ */
+#define IMAGE_SUBSYSTEM_UNKNOWN 0
+#define IMAGE_SUBSYSTEM_NATIVE 1
+#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
+#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
+#define IMAGE_SUBSYSTEM_POSIX_CUI 7
+#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
+#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
+#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
+#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
+#define IMAGE_SUBSYSTEM_EFI_ROM 13
+#define IMAGE_SUBSYSTEM_XBOX 14
+
+/*
+ * DLL characteristics
+ */
+#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040
+#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080
+#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100
+#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
+#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
+#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
+#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
+#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
+
+/*
+ * Section flags
+ */
+#define IMAGE_SCN_TYPE_REG 0x00000000
+#define IMAGE_SCN_TYPE_DSECT 0x00000001
+#define IMAGE_SCN_TYPE_NOLOAD 0x00000002
+#define IMAGE_SCN_TYPE_GROUP 0x00000004
+#define IMAGE_SCN_TYPE_NO_PAD 0x00000008
+#define IMAGE_SCN_TYPE_COPY 0x00000010
+
+#define IMAGE_SCN_CNT_CODE 0x00000020
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
+
+#define IMAGE_SCN_LNK_OTHER 0x00000100
+#define IMAGE_SCN_LNK_INFO 0x00000200
+#define IMAGE_SCN_TYPE_OVER 0x00000400
+#define IMAGE_SCN_LNK_REMOVE 0x00000800
+#define IMAGE_SCN_LNK_COMDAT 0x00001000
+
+#define IMAGE_SCN_MAX_RELOC 0xffff
+
+#define IMAGE_SCN_MEM_FARDATA 0x00008000
+#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
+#define IMAGE_SCN_MEM_16BIT 0x00020000
+#define IMAGE_SCN_MEM_LOCKED 0x00040000
+#define IMAGE_SCN_MEM_PRELOAD 0x00080000
+
+#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
+#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
+#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
+#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
+#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
+#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
+#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
+#define IMAGE_SCN_ALIGN_128BYTES 0x00800000
+#define IMAGE_SCN_ALIGN_256BYTES 0x00900000
+#define IMAGE_SCN_ALIGN_512BYTES 0x00a00000
+#define IMAGE_SCN_ALIGN_1024BYTES 0x00b00000
+#define IMAGE_SCN_ALIGN_2048BYTES 0x00c00000
+#define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
+#define IMAGE_SCN_ALIGN_8192BYTES 0x00e00000
+#define IMAGE_SCN_ALIGN_MASK 0x00f00000
+
+#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
+#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
+#define IMAGE_SCN_MEM_SHARED 0x10000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+#define IMAGE_SCN_MEM_WRITE 0x80000000
+
+/*
+ * Relocation type x86-64
+ */
+#define IMAGE_REL_AMD64_ABSOLUTE 0x0000
+#define IMAGE_REL_AMD64_ADDR64 0x0001
+#define IMAGE_REL_AMD64_ADDR32 0x0002
+#define IMAGE_REL_AMD64_ADDR32NB 0x0003
+#define IMAGE_REL_AMD64_REL32 0x0004
+#define IMAGE_REL_AMD64_REL32_1 0x0005
+#define IMAGE_REL_AMD64_REL32_2 0x0006
+#define IMAGE_REL_AMD64_REL32_3 0x0007
+#define IMAGE_REL_AMD64_REL32_4 0x0008
+#define IMAGE_REL_AMD64_REL32_5 0x0009
+#define IMAGE_REL_AMD64_SECTION 0x000a
+#define IMAGE_REL_AMD64_SECREL 0x000b
+#define IMAGE_REL_AMD64_SECREL7 0x000c
+#define IMAGE_REL_AMD64_TOKEN 0x000d
+#define IMAGE_REL_AMD64_SREL32 0x000e
+#define IMAGE_REL_AMD64_PAIR 0x000f
+#define IMAGE_REL_AMD64_SSPAN32 0x0010
+
+/*
+ * Relocation types i386
+ */
+#define IMAGE_REL_I386_ABSOLUTE 0x0000
+#define IMAGE_REL_I386_DIR16 0x0001
+#define IMAGE_REL_I386_REL16 0x0002
+#define IMAGE_REL_I386_DIR32 0x0006
+#define IMAGE_REL_I386_DIR32NB 0x0007
+#define IMAGE_REL_I386_SEG12 0x0009
+#define IMAGE_REL_I386_SECTION 0x000a
+#define IMAGE_REL_I386_SECREL 0x000b
+#define IMAGE_REL_I386_TOKEN 0x000c
+#define IMAGE_REL_I386_SECREL7 0x000d
+#define IMAGE_REL_I386_REL32 0x0014
+
+/*
+ * Relocation types ARM
+ */
+#define IMAGE_REL_ARM_ABSOLUTE 0x0000
+#define IMAGE_REL_ARM_ADDR32 0x0001
+#define IMAGE_REL_ARM_ADDR32NB 0x0002
+#define IMAGE_REL_ARM_BRANCH24 0x0003
+#define IMAGE_REL_ARM_BRANCH11 0x0004
+#define IMAGE_REL_ARM_SECTION 0x000e
+#define IMAGE_REL_ARM_SECREL 0x000f
+
+/*
+ * Relocation types Hitachi SuperH
+ */
+#define IMAGE_REL_SH3_ABSOLUTE 0x0000
+#define IMAGE_REL_SH3_DIRECT16 0x0001
+#define IMAGE_REL_SH3_DIRECT32 0x0002
+#define IMAGE_REL_SH3_DIRECT8 0x0003
+#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004
+#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005
+#define IMAGE_REL_SH3_DIRECT4 0x0006
+#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007
+#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008
+#define IMAGE_REL_SH3_PCREL8_WORD 0x0009
+#define IMAGE_REL_SH3_PCREL8_LONG 0x000a
+#define IMAGE_REL_SH3_PCREL12_WORD 0x000b
+#define IMAGE_REL_SH3_STARTOF_SECTION 0x000c
+#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000d
+#define IMAGE_REL_SH3_SECTION 0x000e
+#define IMAGE_REL_SH3_SECREL 0x000f
+#define IMAGE_REL_SH3_DIRECT32_NB 0x0010
+#define IMAGE_REL_SH3_GPREL4_LONG 0x0011
+#define IMAGE_REL_SH3_TOKEN 0x0012
+#define IMAGE_REL_SHM_PCRELPT 0x0013
+#define IMAGE_REL_SHM_REFLO 0x0014
+#define IMAGE_REL_SHM_REFHALF 0x0015
+#define IMAGE_REL_SHM_RELLO 0x0016
+#define IMAGE_REL_SHM_RELHALF 0x0017
+#define IMAGE_REL_SHM_PAIR 0x0018
+#define IMAGE_REL_SHM_NOMODE 0x8000
+
+/*
+ * Relocation types IBM PowerPC processors
+ */
+#define IMAGE_REL_PPC_ABSOLUTE 0x0000
+#define IMAGE_REL_PPC_ADDR64 0x0001
+#define IMAGE_REL_PPC_ADDR32 0x0002
+#define IMAGE_REL_PPC_ADDR24 0x0003
+#define IMAGE_REL_PPC_ADDR16 0x0004
+#define IMAGE_REL_PPC_ADDR14 0x0005
+#define IMAGE_REL_PPC_REL24 0x0006
+#define IMAGE_REL_PPC_REL14 0x0007
+#define IMAGE_REL_PPC_ADDR32NB 0x000a
+#define IMAGE_REL_PPC_SECREL 0x000b
+#define IMAGE_REL_PPC_SECTION 0x000c
+#define IMAGE_REL_PPC_SECREL16 0x000f
+#define IMAGE_REL_PPC_REFHI 0x0010
+#define IMAGE_REL_PPC_REFLO 0x0011
+#define IMAGE_REL_PPC_PAIR 0x0012
+#define IMAGE_REL_PPC_SECRELLO 0x0013
+#define IMAGE_REL_PPC_GPREL 0x0015
+#define IMAGE_REL_PPC_TOKEN 0x0016
+
+/*
+ * Relocation types Intel Itanium processor family (IPF)
+ */
+#define IMAGE_REL_IA64_ABSOLUTE 0x0000
+#define IMAGE_REL_IA64_IMM14 0x0001
+#define IMAGE_REL_IA64_IMM22 0x0002
+#define IMAGE_REL_IA64_IMM64 0x0003
+#define IMAGE_REL_IA64_DIR32 0x0004
+#define IMAGE_REL_IA64_DIR64 0x0005
+#define IMAGE_REL_IA64_PCREL21B 0x0006
+#define IMAGE_REL_IA64_PCREL21M 0x0007
+#define IMAGE_REL_IA64_PCREL21F 0x0008
+#define IMAGE_REL_IA64_GPREL22 0x0009
+#define IMAGE_REL_IA64_LTOFF22 0x000a
+#define IMAGE_REL_IA64_SECTION 0x000b
+#define IMAGE_REL_IA64_SECREL22 0x000c
+#define IMAGE_REL_IA64_SECREL64I 0x000d
+#define IMAGE_REL_IA64_SECREL32 0x000e
+#define IMAGE_REL_IA64_DIR32NB 0x0010
+#define IMAGE_REL_IA64_SREL14 0x0011
+#define IMAGE_REL_IA64_SREL22 0x0012
+#define IMAGE_REL_IA64_SREL32 0x0013
+#define IMAGE_REL_IA64_UREL32 0x0014
+#define IMAGE_REL_IA64_PCREL60X 0x0015
+#define IMAGE_REL_IA64_PCREL 60B 0x0016
+#define IMAGE_REL_IA64_PCREL60F 0x0017
+#define IMAGE_REL_IA64_PCREL60I 0x0018
+#define IMAGE_REL_IA64_PCREL60M 0x0019
+#define IMAGE_REL_IA64_IMMGPREL64 0x001a
+#define IMAGE_REL_IA64_TOKEN 0x001b
+#define IMAGE_REL_IA64_GPREL32 0x001c
+#define IMAGE_REL_IA64_ADDEND 0x001f
+
+/*
+ * Relocation types MIPS Processors
+ */
+#define IMAGE_REL_MIPS_ABSOLUTE 0x0000
+#define IMAGE_REL_MIPS_REFHALF 0x0001
+#define IMAGE_REL_MIPS_REFWORD 0x0002
+#define IMAGE_REL_MIPS_JMPADDR 0x0003
+#define IMAGE_REL_MIPS_REFHI 0x0004
+#define IMAGE_REL_MIPS_REFLO 0x0005
+#define IMAGE_REL_MIPS_GPREL 0x0006
+#define IMAGE_REL_MIPS_LITERAL 0x0007
+#define IMAGE_REL_MIPS_SECTION 0x000a
+#define IMAGE_REL_MIPS_SECREL 0x000b
+#define IMAGE_REL_MIPS_SECRELLO 0x000c
+#define IMAGE_REL_MIPS_SECRELHI 0x000d
+#define IMAGE_REL_MIPS_JMPADDR16 0x0010
+#define IMAGE_REL_MIPS_REFWORDNB 0x0022
+#define IMAGE_REL_MIPS_PAIR 0x0025
+
+/*
+ * Relocation types Mitsubishi M32R
+ */
+#define IMAGE_REL_M32R_ABSOLUTE 0x0000
+#define IMAGE_REL_M32R_ADDR32 0x0001
+#define IMAGE_REL_M32R_ADDR32NB 0x0002
+#define IMAGE_REL_M32R_ADDR24 0x0003
+#define IMAGE_REL_M32R_GPREL16 0x0004
+#define IMAGE_REL_M32R_PCREL24 0x0005
+#define IMAGE_REL_M32R_PCREL16 0x0006
+#define IMAGE_REL_M32R_PCREL8 0x0007
+#define IMAGE_REL_M32R_REFHALF 0x0008
+#define IMAGE_REL_M32R_REFHI 0x0009
+#define IMAGE_REL_M32R_REFLO 0x000a
+#define IMAGE_REL_M32R_PAIR 0x000b
+#define IMAGE_REL_M32R_SECTION 0x000c
+#define IMAGE_REL_M32R_SECREL 0x000d
+#define IMAGE_REL_M32R_TOKEN 0x000e
+
+/*
+ * Section number values
+ */
+#define IMAGE_SYM_UNDEFINED 0
+#define IMAGE_SYM_ABSOLUTE -1
+#define IMAGE_SYM_DEBUG -2
+
+/*
+ * Type representation
+ */
+#define IMAGE_SYM_TYPE_NULL 0
+#define IMAGE_SYM_TYPE_VOID 1
+#define IMAGE_SYM_TYPE_CHAR 2
+#define IMAGE_SYM_TYPE_SHORT 3
+#define IMAGE_SYM_TYPE_INT 4
+#define IMAGE_SYM_TYPE_LONG 5
+#define IMAGE_SYM_TYPE_FLOAT 6
+#define IMAGE_SYM_TYPE_DOUBLE 7
+#define IMAGE_SYM_TYPE_STRUCT 8
+#define IMAGE_SYM_TYPE_UNION 9
+#define IMAGE_SYM_TYPE_ENUM 10
+#define IMAGE_SYM_TYPE_MOE 11
+#define IMAGE_SYM_TYPE_BYTE 12
+#define IMAGE_SYM_TYPE_WORD 13
+#define IMAGE_SYM_TYPE_UINT 14
+#define IMAGE_SYM_TYPE_DWORD 15
+
+#define IMAGE_SYM_DTYPE_NULL 0
+#define IMAGE_SYM_DTYPE_POINTER 1
+#define IMAGE_SYM_DTYPE_FUNCTION 2
+#define IMAGE_SYM_DTYPE_ARRAY 3
+
+/*
+ * Storage class
+ */
+#define IMAGE_SYM_CLASS_END_OF_FUNCTION -1
+#define IMAGE_SYM_CLASS_NULL 0
+#define IMAGE_SYM_CLASS_AUTOMATIC 1
+#define IMAGE_SYM_CLASS_EXTERNAL 2
+#define IMAGE_SYM_CLASS_STATIC 3
+#define IMAGE_SYM_CLAS S_REGISTER 4
+#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
+#define IMAGE_SYM_CLASS_LABEL 6
+#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
+#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
+#define IMAGE_SYM_CLASS_ARGUMENT 9
+#define IMAGE_SYM_CLASS_STRUCT_TAG 10
+#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
+#define IMAGE_SYM_CLASS_UNION_TAG 12
+#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
+#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
+#define IMAGE_SYM_CLASS_ENUM_TAG 15
+#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
+#define IMAGE_SYM_CLASS_REGISTER_PARAM 17
+#define IMAGE_SYM_CLASS_BIT_FIELD 18
+#define IMAGE_SYM_CLASS_BLOCK 100
+#define IMAGE_SYM_CLASS_FUNCTION 101
+#define IMAGE_SYM_CLASS_END_OF_STRUCT 102
+#define IMAGE_SYM_CLASS_FILE 103
+#define IMAGE_SYM_CLASS_SECTION 104
+#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
+#define IMAGE_SYM_CLASS_CLR_TOKEN 107
+
+/*
+ * COMDAT sections
+ */
+#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
+#define IMAGE_COMDAT_SELECT_ANY 2
+#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
+#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
+#define IMAGE_COMDAT_SELECT_LARGEST 6
+
+/*
+ * Attribute certificate table
+ */
+#define WIN_CERT_REVISION_1_0 0x0100
+#define WIN_CERT_REVISION_2_0 0x0200
+#define WIN_CERT_TYPE_X509 0x0001
+#define WIN_CERT_TYPE_PKCS_SIGNED_DATA 0x0002
+#define WIN_CERT_TYPE_RESERVED_1 0x0003
+#define WIN_CERT_TYPE_TS_STACK_SIGNED 0x0004
+
+/*
+ * Debug type
+ */
+#define IMAGE_DEBUG_TYPE_UNKNOWN 0
+#define IMAGE_DEBUG_TYPE_COFF 1
+#define IMAGE_DEBUG_TYPE_CODEVIEW 2
+#define IMAGE_DEBUG_TYPE_FPO 3
+#define IMAGE_DEBUG_TYPE_MISC 4
+#define IMAGE_DEBUG_TYPE_EXCEPTION 5
+#define IMAGE_DEBUG_TYPE_FIXUP 6
+#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
+#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
+#define IMAGE_DEBUG_TYP E_BORLAND 9
+#define IMAGE_DEBUG_TYPE_RESERVED10 10
+#define IMAGE_DEBUG_TYPE_CLSID 11
+
+/*
+ * Base relocation types
+ */
+#define IMAGE_REL_BASED_ABSOLUTE 0
+#define IMAGE_REL_BASED_HIGH 1
+#define IMAGE_REL_BASED_LOW 2
+#define IMAGE_REL_BASED_HIGHLOW 3
+#define IMAGE_REL_BASED_HIGHADJ 4
+#define IMAGE_REL_BASED_MIPS_JMPADDR 5
+#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
+#define IMAGE_REL_BASED_DIR64 10
+
+/*
+ * TLS callback functions
+ */
+#define DLL_PROCESS_ATTACH 1
+#define DLL_THREAD_ATTACH 2
+#define DLL_THREAD_DETACH 3
+#define DLL_PROCESS_DETACH 0
+
+/*
+ * Import Type
+ */
+#define IMPORT_CODE 0
+#define IMPORT_DATA 1
+#define IMPORT_CONST 2
+
+/*
+ * Import name type
+ */
+#define IMPORT_ORDINAL 0
+#define IMPORT_NAME 1
+#define IMPORT_NAME_NOPREFIX 2
+#define IMPORT_NAME_UNDECORATE 3
+
+struct coff_Section {
+ struct SAA *data;
+ uint32_t len;
+ int nrelocs;
+ int32_t index;
+ struct coff_Reloc *head, **tail;
+ uint32_t flags; /* section flags */
+ char *name;
+ int32_t namepos; /* Offset of name into the strings table */
+ int32_t pos, relpos;
+};
+
+struct coff_Reloc {
+ struct coff_Reloc *next;
+ int32_t address; /* relative to _start_ of section */
+ int32_t symbol; /* symbol number */
+ enum {
+ SECT_SYMBOLS,
+ ABS_SYMBOL,
+ REAL_SYMBOLS
+ } symbase; /* relocation for symbol number :) */
+ int16_t type;
+};
+
+struct coff_Symbol {
+ char name[9];
+ int32_t strpos; /* string table position of name */
+ int32_t value; /* address, or COMMON variable size */
+ int section; /* section number where it's defined
+ * - in COFF codes, not NASM codes */
+ bool is_global; /* is it a global symbol or not? */
+ int16_t type; /* 0 - notype, 0x20 - function */
+ int32_t namlen; /* full name length */
+};
+
+struct coff_DebugInfo {
+ int32_t segto;
+ int32_t seg;
+ uint64_t size;
+ struct coff_Section *section;
+};
+
+extern struct coff_Section **coff_sects;
+extern int coff_nsects;
+extern struct SAA *coff_syms;
+extern uint32_t coff_nsyms;
+extern struct SAA *coff_strs;
+extern bool win32, win64;
+
+extern char coff_infile[FILENAME_MAX];
+extern char coff_outfile[FILENAME_MAX];
+
+extern int coff_make_section(char *name, uint32_t flags);
+
+
+#endif /* PECOFF_H */
diff --git a/output/stabs.h b/output/stabs.h
new file mode 100644
index 00000000..d40a5724
--- /dev/null
+++ b/output/stabs.h
@@ -0,0 +1,150 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2018 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef STABS_H_
+#define STABS_H_
+
+#include <ctype.h>
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "nasm.h"
+
+/* offsets */
+enum stab_offsets {
+ STAB_strdxoff = 0,
+ STAB_typeoff = 4,
+ STAB_otheroff = 5,
+ STAB_descoff = 6,
+ STAB_valoff = 8,
+ STAB_stabsize = 12
+};
+
+/* stab/non-stab types */
+enum stab_types {
+ N_UNDF = 0x00, /* Undefined symbol */
+ N_EXT = 0x01, /* External symbol */
+ N_ABS = 0x02, /* Absolute symbol */
+ N_ABS_EXT = 0x03, /* Absolute external symbol */
+ N_TEXT = 0x04, /* Symbol in text segment */
+ N_TEXT_EXT = 0x05, /* Symbol in external text segment */
+ N_DATA = 0x06,
+ N_DATA_EXT = 0x07,
+ N_BSS = 0x08,
+ N_BSS_EXT = 0x09,
+ N_INDR = 0x0a,
+ N_FN_SEQ = 0x0c, /* N_FN from Sequent compilers */
+ N_WEAKU = 0x0d, /* Weak undefined symbol */
+ N_WEAKA = 0x0e, /* Weak absolute symbl */
+ N_WEAKT = 0x0f, /* Weak text symbol */
+ N_WEAKD = 0x10, /* Weak data symbol */
+ N_WEAKB = 0x11, /* Weak bss symbol */
+ N_COMM = 0x12, /* Common symbol */
+ N_SETA = 0x14, /* Absolute set element symbol */
+ N_SETA_EXT = 0x15,
+ N_SETT = 0x16, /* Text set element symbol */
+ N_SETT_EXT = 0x17,
+ N_SETD = 0x18, /* Data set element symbol */
+ N_SETD_EXT = 0x19,
+ N_SETB = 0x1a, /* BSS set element symbol */
+ N_SETB_EXT = 0x1b,
+ N_SETV = 0x1c, /* Pointer to set vector in data area */
+ N_SETV_EXT = 0x1d,
+ N_WARNING = 0x1e, /* Warning symbol */
+ N_FN = 0x1f, /* Filename of .o file */
+ N_GSYM = 0x20, /* Global variable */
+ N_FNAME = 0x22, /* Function name for BSD Fortran */
+ N_FUN = 0x24, /* Function name or text segment variable for C */
+ N_STSYM = 0x26, /* Data-segment variable with internal linkage */
+ N_LCSYM = 0x28, /* BSS-segment variable with internal linkage */
+ N_MAIN = 0x2a, /* Name of main routine */
+ N_ROSYM = 0x2c, /* Read-only data symbols */
+ N_BNSYM = 0x2e, /* The beginning of a relocatable function block */
+ N_PC = 0x30, /* Global symbol in Pascal */
+ N_NSYMS = 0x32, /* Number of symbols */
+ N_NOMAP = 0x34, /* No DST map for sym */
+ N_OBJ = 0x38, /* Like N_SO, but for the object file */
+ N_OPT = 0x3c, /* Options for the debugger */
+ N_RSYM = 0x40, /* Register variable */
+ N_M2C = 0x42, /* Modula-2 compilation unit */
+ N_SLINE = 0x44, /* Line number in text segment */
+ N_DSLINE = 0x46, /* Line number in data segment */
+ N_BSLINE = 0x48, /* Line number in bss segment */
+ N_BROWS = 0x48, /* Sun's source-code browser stabs */
+ N_DEFD = 0x4a, /* GNU Modula-2 definition module dependency */
+ N_FLINE = 0x4c, /* Function start/body/end line numbers */
+ N_ENSYM = 0x4e, /* This tells the end of a relocatable function */
+ N_EHDECL = 0x50, /* GNU C++ exception variable */
+ N_MOD2 = 0x50, /* Modula2 info "for imc" */
+ N_CATCH = 0x54, /* GNU C++ `catch' clause */
+ N_SSYM = 0x60, /* Structure or union element */
+ N_ENDM = 0x62, /* Last stab emitted for module */
+ N_SO = 0x64, /* ID for main source file */
+ N_OSO = 0x66, /* Apple: This is the stab that associated the .o file */
+ N_ALIAS = 0x6c, /* SunPro F77: Name of alias */
+ N_LSYM = 0x80, /* Automatic variable in the stack */
+ N_BINCL = 0x82, /* Beginning of an include file */
+ N_SOL = 0x84, /* ID for sub-source file */
+ N_PSYM = 0xa0, /* Parameter variable */
+ N_EINCL = 0xa2, /* End of an include file */
+ N_ENTRY = 0xa4, /* Alternate entry point */
+ N_LBRAC = 0xc0, /* Beginning of lexical block */
+ N_EXCL = 0xc2, /* Place holder for deleted include file */
+ N_SCOPE = 0xc4, /* Modula-2 scope information */
+ N_PATCH = 0xd0, /* Solaris2: Patch Run Time Checker */
+ N_RBRAC = 0xe0, /* End of a lexical block */
+ N_BCOMM = 0xe2, /* Begin named common block */
+ N_ECOMM = 0xe4, /* End named common block */
+ N_ECOML = 0xe8, /* Member of a common block */
+ N_WITH = 0xea, /* Solaris2: Pascal "with" statement */
+ N_NBTEXT = 0xf0,
+ N_NBDATA = 0xf2,
+ N_NBBSS = 0xf4,
+ N_NBSTS = 0xf6,
+ N_NBLCS = 0xf8,
+ N_LENG = 0xfe /* Second symbol entry whih a length-value for the preceding entry */
+};
+
+enum stab_source_file {
+ N_SO_AS = 0x01,
+ N_SO_C = 0x02,
+ N_SO_ANSI_C = 0x03,
+ N_SO_CC = 0x04,
+ N_SO_FORTRAN = 0x05,
+ N_SO_PASCAL = 0x06,
+ N_SO_FORTRAN90 = 0x07,
+ N_SO_OBJC = 0x32,
+ N_SO_OBJCPLUS = 0x33
+};
+
+#endif /* STABS_H_ */
diff --git a/output/strtbl.c b/output/strtbl.c
new file mode 100644
index 00000000..23b0d118
--- /dev/null
+++ b/output/strtbl.c
@@ -0,0 +1,117 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * Common string table handling
+ *
+ * A number of output formats use a "string table"; a container for
+ * a number of strings which may be reused at will. This implements
+ * a string table which eliminates duplicates and returns the index
+ * into the string table when queried.
+ */
+
+#include "compiler.h"
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "strtbl.h"
+
+struct strtbl_entry {
+ size_t index;
+ size_t bytes;
+ char str[1];
+};
+
+void strtbl_init(struct nasm_strtbl *tbl)
+{
+ tbl->size = 0;
+ hash_init(&tbl->hash, HASH_LARGE);
+ strtbl_add(tbl, ""); /* Index 0 is always an empty string */
+}
+
+void strtbl_free(struct nasm_strtbl *tbl)
+{
+ hash_free_all(&tbl->hash, false);
+}
+
+size_t strtbl_add(struct nasm_strtbl *tbl, const char *str)
+{
+ void **sep;
+ struct strtbl_entry *se;
+ struct hash_insert hi;
+
+ sep = hash_find(&tbl->hash, str, &hi);
+ if (sep) {
+ se = *sep;
+ } else {
+ size_t bytes = strlen(str) + 1;
+
+ se = nasm_malloc(sizeof(struct strtbl_entry)-1+bytes);
+ se->index = tbl->size;
+ tbl->size += bytes;
+ se->bytes = bytes;
+ memcpy(se->str, str, bytes);
+
+ hash_add(&hi, se->str, se);
+ }
+
+ return se->index;
+}
+
+size_t strtbl_find(struct nasm_strtbl *tbl, const char *str)
+{
+ void **sep;
+ struct strtbl_entry *se;
+
+ sep = hash_find(&tbl->hash, str, NULL);
+ if (sep) {
+ se = *sep;
+ return se->index;
+ } else {
+ return STRTBL_NONE;
+ }
+}
+
+/* This create a linearized buffer containing the actual string table */
+void *strtbl_generate(const struct nasm_strtbl *tbl)
+{
+ char *buf = nasm_malloc(strtbl_size(tbl));
+ struct hash_tbl_node *iter = NULL;
+ struct strtbl_entry *se;
+
+ while ((se = hash_iterate(&tbl->hash, &iter, NULL)))
+ memcpy(buf + se->index, se->str, se->bytes);
+
+ return buf;
+}
diff --git a/output/strtbl.h b/output/strtbl.h
new file mode 100644
index 00000000..12771e4e
--- /dev/null
+++ b/output/strtbl.h
@@ -0,0 +1,57 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NASM_STRTBL_H
+#define NASM_STRTBL_H
+
+#include "compiler.h"
+#include "hashtbl.h"
+
+struct nasm_strtbl {
+ size_t size;
+ struct hash_table hash;
+};
+
+#define STRTBL_NONE ((size_t)-1)
+
+void strtbl_init(struct nasm_strtbl *tbl);
+void strtbl_free(struct nasm_strtbl *tbl);
+size_t strtbl_find(struct nasm_strtbl *tbl, const char *str);
+size_t strtbl_add(struct nasm_strtbl *tbl, const char *str);
+static inline size_t strtbl_size(const struct nasm_strtbl *tbl)
+{
+ return tbl->size;
+}
+void * safe_alloc strtbl_generate(const struct nasm_strtbl *tbl);
+
+#endif /* NASM_STRTBL_H */
diff --git a/perllib/crc64.ph b/perllib/crc64.ph
new file mode 100644
index 00000000..30a47753
--- /dev/null
+++ b/perllib/crc64.ph
@@ -0,0 +1,158 @@
+# -*- perl -*-
+#
+# Pure Perl implementation of the same CRC64 implementation used
+# elsewhere in NASM.
+#
+# Note: Perl may have 32- or 64-bit integers; we need to handle both
+# without overflowing into floating point (yuck), so handle them as
+# pairs of 32-bit numbers. Ordering is BIGENDIAN.
+#
+
+@crc64_tab = (
+ [0x00000000, 0x00000000], [0x7ad870c8, 0x30358979],
+ [0xf5b0e190, 0x606b12f2], [0x8f689158, 0x505e9b8b],
+ [0xc038e573, 0x9841b68f], [0xbae095bb, 0xa8743ff6],
+ [0x358804e3, 0xf82aa47d], [0x4f50742b, 0xc81f2d04],
+ [0xab28ecb4, 0x6814fe75], [0xd1f09c7c, 0x5821770c],
+ [0x5e980d24, 0x087fec87], [0x24407dec, 0x384a65fe],
+ [0x6b1009c7, 0xf05548fa], [0x11c8790f, 0xc060c183],
+ [0x9ea0e857, 0x903e5a08], [0xe478989f, 0xa00bd371],
+ [0x7d08ff3b, 0x88be6f81], [0x07d08ff3, 0xb88be6f8],
+ [0x88b81eab, 0xe8d57d73], [0xf2606e63, 0xd8e0f40a],
+ [0xbd301a48, 0x10ffd90e], [0xc7e86a80, 0x20ca5077],
+ [0x4880fbd8, 0x7094cbfc], [0x32588b10, 0x40a14285],
+ [0xd620138f, 0xe0aa91f4], [0xacf86347, 0xd09f188d],
+ [0x2390f21f, 0x80c18306], [0x594882d7, 0xb0f40a7f],
+ [0x1618f6fc, 0x78eb277b], [0x6cc08634, 0x48deae02],
+ [0xe3a8176c, 0x18803589], [0x997067a4, 0x28b5bcf0],
+ [0xfa11fe77, 0x117cdf02], [0x80c98ebf, 0x2149567b],
+ [0x0fa11fe7, 0x7117cdf0], [0x75796f2f, 0x41224489],
+ [0x3a291b04, 0x893d698d], [0x40f16bcc, 0xb908e0f4],
+ [0xcf99fa94, 0xe9567b7f], [0xb5418a5c, 0xd963f206],
+ [0x513912c3, 0x79682177], [0x2be1620b, 0x495da80e],
+ [0xa489f353, 0x19033385], [0xde51839b, 0x2936bafc],
+ [0x9101f7b0, 0xe12997f8], [0xebd98778, 0xd11c1e81],
+ [0x64b11620, 0x8142850a], [0x1e6966e8, 0xb1770c73],
+ [0x8719014c, 0x99c2b083], [0xfdc17184, 0xa9f739fa],
+ [0x72a9e0dc, 0xf9a9a271], [0x08719014, 0xc99c2b08],
+ [0x4721e43f, 0x0183060c], [0x3df994f7, 0x31b68f75],
+ [0xb29105af, 0x61e814fe], [0xc8497567, 0x51dd9d87],
+ [0x2c31edf8, 0xf1d64ef6], [0x56e99d30, 0xc1e3c78f],
+ [0xd9810c68, 0x91bd5c04], [0xa3597ca0, 0xa188d57d],
+ [0xec09088b, 0x6997f879], [0x96d17843, 0x59a27100],
+ [0x19b9e91b, 0x09fcea8b], [0x636199d3, 0x39c963f2],
+ [0xdf7adabd, 0x7a6e2d6f], [0xa5a2aa75, 0x4a5ba416],
+ [0x2aca3b2d, 0x1a053f9d], [0x50124be5, 0x2a30b6e4],
+ [0x1f423fce, 0xe22f9be0], [0x659a4f06, 0xd21a1299],
+ [0xeaf2de5e, 0x82448912], [0x902aae96, 0xb271006b],
+ [0x74523609, 0x127ad31a], [0x0e8a46c1, 0x224f5a63],
+ [0x81e2d799, 0x7211c1e8], [0xfb3aa751, 0x42244891],
+ [0xb46ad37a, 0x8a3b6595], [0xceb2a3b2, 0xba0eecec],
+ [0x41da32ea, 0xea507767], [0x3b024222, 0xda65fe1e],
+ [0xa2722586, 0xf2d042ee], [0xd8aa554e, 0xc2e5cb97],
+ [0x57c2c416, 0x92bb501c], [0x2d1ab4de, 0xa28ed965],
+ [0x624ac0f5, 0x6a91f461], [0x1892b03d, 0x5aa47d18],
+ [0x97fa2165, 0x0afae693], [0xed2251ad, 0x3acf6fea],
+ [0x095ac932, 0x9ac4bc9b], [0x7382b9fa, 0xaaf135e2],
+ [0xfcea28a2, 0xfaafae69], [0x8632586a, 0xca9a2710],
+ [0xc9622c41, 0x02850a14], [0xb3ba5c89, 0x32b0836d],
+ [0x3cd2cdd1, 0x62ee18e6], [0x460abd19, 0x52db919f],
+ [0x256b24ca, 0x6b12f26d], [0x5fb35402, 0x5b277b14],
+ [0xd0dbc55a, 0x0b79e09f], [0xaa03b592, 0x3b4c69e6],
+ [0xe553c1b9, 0xf35344e2], [0x9f8bb171, 0xc366cd9b],
+ [0x10e32029, 0x93385610], [0x6a3b50e1, 0xa30ddf69],
+ [0x8e43c87e, 0x03060c18], [0xf49bb8b6, 0x33338561],
+ [0x7bf329ee, 0x636d1eea], [0x012b5926, 0x53589793],
+ [0x4e7b2d0d, 0x9b47ba97], [0x34a35dc5, 0xab7233ee],
+ [0xbbcbcc9d, 0xfb2ca865], [0xc113bc55, 0xcb19211c],
+ [0x5863dbf1, 0xe3ac9dec], [0x22bbab39, 0xd3991495],
+ [0xadd33a61, 0x83c78f1e], [0xd70b4aa9, 0xb3f20667],
+ [0x985b3e82, 0x7bed2b63], [0xe2834e4a, 0x4bd8a21a],
+ [0x6debdf12, 0x1b863991], [0x1733afda, 0x2bb3b0e8],
+ [0xf34b3745, 0x8bb86399], [0x8993478d, 0xbb8deae0],
+ [0x06fbd6d5, 0xebd3716b], [0x7c23a61d, 0xdbe6f812],
+ [0x3373d236, 0x13f9d516], [0x49aba2fe, 0x23cc5c6f],
+ [0xc6c333a6, 0x7392c7e4], [0xbc1b436e, 0x43a74e9d],
+ [0x95ac9329, 0xac4bc9b5], [0xef74e3e1, 0x9c7e40cc],
+ [0x601c72b9, 0xcc20db47], [0x1ac40271, 0xfc15523e],
+ [0x5594765a, 0x340a7f3a], [0x2f4c0692, 0x043ff643],
+ [0xa02497ca, 0x54616dc8], [0xdafce702, 0x6454e4b1],
+ [0x3e847f9d, 0xc45f37c0], [0x445c0f55, 0xf46abeb9],
+ [0xcb349e0d, 0xa4342532], [0xb1eceec5, 0x9401ac4b],
+ [0xfebc9aee, 0x5c1e814f], [0x8464ea26, 0x6c2b0836],
+ [0x0b0c7b7e, 0x3c7593bd], [0x71d40bb6, 0x0c401ac4],
+ [0xe8a46c12, 0x24f5a634], [0x927c1cda, 0x14c02f4d],
+ [0x1d148d82, 0x449eb4c6], [0x67ccfd4a, 0x74ab3dbf],
+ [0x289c8961, 0xbcb410bb], [0x5244f9a9, 0x8c8199c2],
+ [0xdd2c68f1, 0xdcdf0249], [0xa7f41839, 0xecea8b30],
+ [0x438c80a6, 0x4ce15841], [0x3954f06e, 0x7cd4d138],
+ [0xb63c6136, 0x2c8a4ab3], [0xcce411fe, 0x1cbfc3ca],
+ [0x83b465d5, 0xd4a0eece], [0xf96c151d, 0xe49567b7],
+ [0x76048445, 0xb4cbfc3c], [0x0cdcf48d, 0x84fe7545],
+ [0x6fbd6d5e, 0xbd3716b7], [0x15651d96, 0x8d029fce],
+ [0x9a0d8cce, 0xdd5c0445], [0xe0d5fc06, 0xed698d3c],
+ [0xaf85882d, 0x2576a038], [0xd55df8e5, 0x15432941],
+ [0x5a3569bd, 0x451db2ca], [0x20ed1975, 0x75283bb3],
+ [0xc49581ea, 0xd523e8c2], [0xbe4df122, 0xe51661bb],
+ [0x3125607a, 0xb548fa30], [0x4bfd10b2, 0x857d7349],
+ [0x04ad6499, 0x4d625e4d], [0x7e751451, 0x7d57d734],
+ [0xf11d8509, 0x2d094cbf], [0x8bc5f5c1, 0x1d3cc5c6],
+ [0x12b59265, 0x35897936], [0x686de2ad, 0x05bcf04f],
+ [0xe70573f5, 0x55e26bc4], [0x9ddd033d, 0x65d7e2bd],
+ [0xd28d7716, 0xadc8cfb9], [0xa85507de, 0x9dfd46c0],
+ [0x273d9686, 0xcda3dd4b], [0x5de5e64e, 0xfd965432],
+ [0xb99d7ed1, 0x5d9d8743], [0xc3450e19, 0x6da80e3a],
+ [0x4c2d9f41, 0x3df695b1], [0x36f5ef89, 0x0dc31cc8],
+ [0x79a59ba2, 0xc5dc31cc], [0x037deb6a, 0xf5e9b8b5],
+ [0x8c157a32, 0xa5b7233e], [0xf6cd0afa, 0x9582aa47],
+ [0x4ad64994, 0xd625e4da], [0x300e395c, 0xe6106da3],
+ [0xbf66a804, 0xb64ef628], [0xc5bed8cc, 0x867b7f51],
+ [0x8aeeace7, 0x4e645255], [0xf036dc2f, 0x7e51db2c],
+ [0x7f5e4d77, 0x2e0f40a7], [0x05863dbf, 0x1e3ac9de],
+ [0xe1fea520, 0xbe311aaf], [0x9b26d5e8, 0x8e0493d6],
+ [0x144e44b0, 0xde5a085d], [0x6e963478, 0xee6f8124],
+ [0x21c64053, 0x2670ac20], [0x5b1e309b, 0x16452559],
+ [0xd476a1c3, 0x461bbed2], [0xaeaed10b, 0x762e37ab],
+ [0x37deb6af, 0x5e9b8b5b], [0x4d06c667, 0x6eae0222],
+ [0xc26e573f, 0x3ef099a9], [0xb8b627f7, 0x0ec510d0],
+ [0xf7e653dc, 0xc6da3dd4], [0x8d3e2314, 0xf6efb4ad],
+ [0x0256b24c, 0xa6b12f26], [0x788ec284, 0x9684a65f],
+ [0x9cf65a1b, 0x368f752e], [0xe62e2ad3, 0x06bafc57],
+ [0x6946bb8b, 0x56e467dc], [0x139ecb43, 0x66d1eea5],
+ [0x5ccebf68, 0xaecec3a1], [0x2616cfa0, 0x9efb4ad8],
+ [0xa97e5ef8, 0xcea5d153], [0xd3a62e30, 0xfe90582a],
+ [0xb0c7b7e3, 0xc7593bd8], [0xca1fc72b, 0xf76cb2a1],
+ [0x45775673, 0xa732292a], [0x3faf26bb, 0x9707a053],
+ [0x70ff5290, 0x5f188d57], [0x0a272258, 0x6f2d042e],
+ [0x854fb300, 0x3f739fa5], [0xff97c3c8, 0x0f4616dc],
+ [0x1bef5b57, 0xaf4dc5ad], [0x61372b9f, 0x9f784cd4],
+ [0xee5fbac7, 0xcf26d75f], [0x9487ca0f, 0xff135e26],
+ [0xdbd7be24, 0x370c7322], [0xa10fceec, 0x0739fa5b],
+ [0x2e675fb4, 0x576761d0], [0x54bf2f7c, 0x6752e8a9],
+ [0xcdcf48d8, 0x4fe75459], [0xb7173810, 0x7fd2dd20],
+ [0x387fa948, 0x2f8c46ab], [0x42a7d980, 0x1fb9cfd2],
+ [0x0df7adab, 0xd7a6e2d6], [0x772fdd63, 0xe7936baf],
+ [0xf8474c3b, 0xb7cdf024], [0x829f3cf3, 0x87f8795d],
+ [0x66e7a46c, 0x27f3aa2c], [0x1c3fd4a4, 0x17c62355],
+ [0x935745fc, 0x4798b8de], [0xe98f3534, 0x77ad31a7],
+ [0xa6df411f, 0xbfb21ca3], [0xdc0731d7, 0x8f8795da],
+ [0x536fa08f, 0xdfd90e51], [0x29b7d047, 0xefec8728]
+ );
+
+sub crc64($$) {
+ my ($cv, $str) = @_;
+ my $c;
+ my @cc = @$cv;
+ $cc[0] %= 4294967296;
+ $cc[1] %= 4294967296;
+
+ foreach $c (unpack("C*", $str)) {
+ my @ct = @{$crc64_tab[($cc[1] & 0xff) ^ $c]};
+
+ $cc[1] = $ct[1] ^
+ ((($cc[1] & 0xffffff00) >> 8) | (($cc[0] & 0xff) << 24));
+ $cc[0] = $ct[0] ^ (($cc[0] & 0xffffff00) >> 8);
+ }
+
+ return @cc;
+}
diff --git a/perllib/gensv.pl b/perllib/gensv.pl
new file mode 100755
index 00000000..b80ccbe6
--- /dev/null
+++ b/perllib/gensv.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/perl
+#
+# Generate a list of rotation vectors so we always use the same set.
+# This needs to be run on a platform with /dev/urandom.
+#
+
+($n) = @ARGV;
+
+sysopen(UR, '/dev/urandom', O_RDONLY) or die;
+
+$maxlen = 78;
+
+print "\@random_sv_vectors = (\n";
+$outl = ' ';
+
+for ($i = 0; $i < $n; $i++) {
+
+ die if (sysread(UR, $x8, 8) != 8);
+ @n = unpack("V*", $x8);
+
+ $xl = sprintf(" [0x%08x, 0x%08x]%s",
+ $n[0], $n[1],
+ ($i == $n-1) ? '' : ',');
+ if (length($outl.$xl) > $maxlen) {
+ print $outl, "\n";
+ $outl = ' ';
+ }
+ $outl .= $xl;
+}
+close(UR);
+
+print $outl, "\n";
+print ");\n";
+print "1;\n";
diff --git a/perllib/phash.ph b/perllib/phash.ph
new file mode 100644
index 00000000..8142c4ef
--- /dev/null
+++ b/perllib/phash.ph
@@ -0,0 +1,200 @@
+# -*- perl -*-
+#
+# Perfect Minimal Hash Generator written in Perl, which produces
+# C output.
+#
+
+require 'random_sv_vectors.ph';
+require 'crc64.ph';
+
+#
+# Compute the prehash for a key
+#
+# prehash(key, sv, N)
+#
+sub prehash($$$) {
+ my($key, $n, $sv) = @_;
+ my @c = crc64($sv, $key);
+
+ # Create a bipartite graph...
+ $k1 = (($c[1] & ($n-1)) << 1) + 0; # low word
+ $k2 = (($c[0] & ($n-1)) << 1) + 1; # high word
+
+ return ($k1, $k2);
+}
+
+#
+# Walk the assignment graph, return true on success
+#
+sub walk_graph($$$$) {
+ my($nodeval,$nodeneigh,$n,$v) = @_;
+ my $nx;
+
+ # print STDERR "Vertex $n value $v\n";
+ $$nodeval[$n] = $v;
+
+ foreach $nx (@{$$nodeneigh[$n]}) {
+ # $nx -> [neigh, hash]
+ my ($o, $e) = @$nx;
+
+ # print STDERR "Edge $n,$o value $e: ";
+ my $ov;
+ if (defined($ov = $$nodeval[$o])) {
+ if ($v+$ov != $e) {
+ # Cyclic graph with collision
+ # print STDERR "error, should be ", $v+$ov, "\n";
+ return 0;
+ } else {
+ # print STDERR "ok\n";
+ }
+ } else {
+ return 0 unless (walk_graph($nodeval, $nodeneigh, $o, $e-$v));
+ }
+ }
+ return 1;
+}
+
+#
+# Generate the function assuming a given N.
+#
+# gen_hash_n(N, sv, \%data, run)
+#
+sub gen_hash_n($$$$) {
+ my($n, $sv, $href, $run) = @_;
+ my @keys = keys(%{$href});
+ my $i, $sv;
+ my $gr;
+ my $k, $v;
+ my $gsize = 2*$n;
+ my @nodeval;
+ my @nodeneigh;
+ my %edges;
+
+ for ($i = 0; $i < $gsize; $i++) {
+ $nodeneigh[$i] = [];
+ }
+
+ %edges = ();
+ foreach $k (@keys) {
+ my ($pf1, $pf2) = prehash($k, $n, $sv);
+ ($pf1,$pf2) = ($pf2,$pf1) if ($pf1 > $pf2); # Canonicalize order
+
+ my $pf = "$pf1,$pf2";
+ my $e = ${$href}{$k};
+ my $xkey;
+
+ if (defined($xkey = $edges{$pf})) {
+ next if ($e == ${$href}{$xkey}); # Duplicate hash, safe to ignore
+ if (defined($run)) {
+ print STDERR "$run: Collision: $pf: $k with $xkey\n";
+ }
+ return;
+ }
+
+ # print STDERR "Edge $pf value $e from $k\n";
+
+ $edges{$pf} = $k;
+ push(@{$nodeneigh[$pf1]}, [$pf2, $e]);
+ push(@{$nodeneigh[$pf2]}, [$pf1, $e]);
+ }
+
+ # Now we need to assign values to each vertex, so that for each
+ # edge, the sum of the values for the two vertices give the value
+ # for the edge (which is our hash index.) If we find an impossible
+ # sitation, the graph was cyclic.
+ @nodeval = (undef) x $gsize;
+
+ for ($i = 0; $i < $gsize; $i++) {
+ if (scalar(@{$nodeneigh[$i]})) {
+ # This vertex has neighbors (is used)
+ if (!defined($nodeval[$i])) {
+ # First vertex in a cluster
+ unless (walk_graph(\@nodeval, \@nodeneigh, $i, 0)) {
+ if (defined($run)) {
+ print STDERR "$run: Graph is cyclic\n";
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ # for ($i = 0; $i < $n; $i++) {
+ # print STDERR "Vertex ", $i, ": ", $g[$i], "\n";
+ # }
+
+ if (defined($run)) {
+ printf STDERR "$run: Done: n = $n, sv = [0x%08x, 0x%08x]\n",
+ $$sv[0], $$sv[1];
+ }
+
+ return ($n, $sv, \@nodeval);
+}
+
+#
+# Driver for generating the function
+#
+# gen_perfect_hash(\%data)
+#
+sub gen_perfect_hash($) {
+ my($href) = @_;
+ my @keys = keys(%{$href});
+ my @hashinfo;
+ my $n, $i, $j, $sv, $maxj;
+ my $run = 1;
+
+ # Minimal power of 2 value for N with enough wiggle room.
+ # The scaling constant must be larger than 0.5 in order for the
+ # algorithm to ever terminate.
+ my $room = int(scalar(@keys)*0.8);
+ $n = 1;
+ while ($n < $room) {
+ $n <<= 1;
+ }
+
+ # Number of times to try...
+ $maxj = scalar @random_sv_vectors;
+
+ for ($i = 0; $i < 4; $i++) {
+ printf STDERR "%d vectors, trying n = %d...\n",
+ scalar @keys, $n;
+ for ($j = 0; $j < $maxj; $j++) {
+ $sv = $random_sv_vectors[$j];
+ @hashinfo = gen_hash_n($n, $sv, $href, $run++);
+ return @hashinfo if (@hashinfo);
+ }
+ $n <<= 1;
+ }
+
+ return;
+}
+
+#
+# Verify that the hash table is actually correct...
+#
+sub verify_hash_table($$)
+{
+ my ($href, $hashinfo) = @_;
+ my ($n, $sv, $g) = @{$hashinfo};
+ my $k;
+ my $err = 0;
+
+ foreach $k (keys(%$href)) {
+ my ($pf1, $pf2) = prehash($k, $n, $sv);
+ my $g1 = ${$g}[$pf1];
+ my $g2 = ${$g}[$pf2];
+
+ if ($g1+$g2 != ${$href}{$k}) {
+ printf STDERR "%s(%d,%d): %d+%d = %d != %d\n",
+ $k, $pf1, $pf2, $g1, $g2, $g1+$g2, ${$href}{$k};
+ $err = 1;
+ } else {
+ # printf STDERR "%s: %d+%d = %d ok\n",
+ # $k, $g1, $g2, $g1+$g2;
+ }
+ }
+
+ die "$0: hash validation error\n" if ($err);
+}
+
+1;
diff --git a/perllib/random_sv_vectors.ph b/perllib/random_sv_vectors.ph
new file mode 100644
index 00000000..db2dc6e6
--- /dev/null
+++ b/perllib/random_sv_vectors.ph
@@ -0,0 +1,67 @@
+@random_sv_vectors = (
+ [0x076259c3, 0xe291c26c], [0xaee7ac5c, 0xcabdec91],
+ [0x5d3862fb, 0x2e8a3060], [0x6fb3635c, 0x4783593a],
+ [0x13f0eafb, 0x407e486a], [0x7436afdd, 0xd04c4829],
+ [0xace2d0e4, 0x80575791], [0x2dd9a392, 0xdc1e869e],
+ [0x199c3e38, 0x026a9d67], [0x9f911c85, 0x3a489c87],
+ [0x9ac31028, 0x0b6e14b2], [0x2ccfbcf9, 0x3f9f2308],
+ [0x2e0210fb, 0x392f380f], [0x14ab403a, 0x81a11065],
+ [0xd496f63c, 0x53196b13], [0x48a34d7f, 0x2ffc6036],
+ [0x34ea8e9d, 0xcd1ed098], [0x2da1a3f2, 0x3d6c23f2],
+ [0xca7374da, 0x06054f89], [0xc909a0bb, 0x31d6c0d2],
+ [0x87454496, 0x15b360d7], [0x9eebbd12, 0x89532131],
+ [0x1119c65b, 0xd9e49705], [0x60c3be0b, 0xd6cc7c8a],
+ [0x117723cd, 0x40af090f], [0xfc284f51, 0x3dcf4c06],
+ [0xb41fcda4, 0xec03644c], [0xd99e1ea7, 0x84eaf76d],
+ [0x534b956a, 0x06d3fb8d], [0x2da4bb09, 0x078092eb],
+ [0x6a5be463, 0xbfa51a88], [0xc4e8be95, 0xe7eec27c],
+ [0x15a1fbb9, 0xfadc08cd], [0x0bcfab08, 0xbccade0f],
+ [0x629f1f6c, 0x90ccede7], [0x5c2b26aa, 0x1f0b1fce],
+ [0xdfe0e3fd, 0xbd7c3cfb], [0xa1628ca9, 0x90a05686],
+ [0xbf0267f2, 0xd2964139], [0x8009a9b9, 0xd2195918],
+ [0xfcc7b5f8, 0xc108c643], [0xf447d4b0, 0x71953863],
+ [0x95d091ed, 0xdbe01948], [0x81dec325, 0x2bfecda2],
+ [0x2ed2acaa, 0x7eeaa0d0], [0xb7b0a20e, 0x8bf5c01b],
+ [0x75eb3917, 0xfd2f758f], [0xb33a5b49, 0x8a8cedf6],
+ [0x3aaf2757, 0x69b319a9], [0x32cfa41b, 0xeba36f19],
+ [0xf54209dd, 0x941f3a08], [0x232703bb, 0x786a6f84],
+ [0x4937b242, 0xc9f07398], [0x74dc5d39, 0x550a58e8],
+ [0x6c9aebdc, 0x8fda5069], [0x5ae6d62a, 0x05cd24a3],
+ [0x8111e50a, 0xc1c6d19b], [0xb980a92b, 0x448b4d1f],
+ [0x568cf58a, 0x8bcb93ca], [0xfe96002f, 0x410cd2f1],
+ [0xaf511e45, 0x99e4872f], [0x822c20bc, 0x3db49ddd],
+ [0x184fec4e, 0xbb82ec52], [0x30ca5326, 0xf3180297],
+ [0x97962aa4, 0x7d4bc6d4], [0x9199a315, 0x8e9f18c6],
+ [0xead69a7e, 0x3262a683], [0xe261ec00, 0x81edc47a],
+ [0x06080c0e, 0x6d18fa9f], [0x1771ec43, 0x6747ed66],
+ [0xe71fe587, 0xe81ad0f3], [0xf083e80c, 0x0898bcd8],
+ [0x30328c5a, 0x2efb4ee7], [0xd04fa5d7, 0xec9c9f18],
+ [0x87820480, 0x48932224], [0xb1f18815, 0x1b27e3e3],
+ [0x79aa440c, 0xdf17a8fc], [0x8a83d404, 0x10fdec8c],
+ [0x7d4dfe60, 0x573561ee], [0x60315c7d, 0xa0692af6],
+ [0xb3ca4d52, 0x89ca832f], [0x9ebc5c79, 0xa84a28fc],
+ [0xdfa76008, 0x7772cf7c], [0xb0e3a15f, 0xbdc35aee],
+ [0x6e252b03, 0x32b2107d], [0x20dcc2a3, 0x21987229],
+ [0x848e3ad8, 0xe692a0c6], [0xdd07fa50, 0x0b64e1ae],
+ [0xc4072bc2, 0x2f120bba], [0xdb3af26e, 0xacab0c48],
+ [0xd7d4b59a, 0xcf72a7a7], [0x4628de45, 0x4dfb2750],
+ [0x7519211f, 0x4798b536], [0x19984af3, 0xffd2aa19],
+ [0x1372d9c0, 0x7512153a], [0x295d19da, 0x497416e5],
+ [0x70932c73, 0x8a9bf591], [0xa0960860, 0xfaa7dc61],
+ [0xd425f548, 0x43aeda4d], [0xaa2573c7, 0x01a2553d],
+ [0x988e71d7, 0xd3c004a4], [0x3da87545, 0x2197af10],
+ [0x2f89e592, 0xa686e2fc], [0x7b88018a, 0xae66d575],
+ [0x93215591, 0xed69e6ea], [0x4fcacc4a, 0x4d2aba97],
+ [0xbedb923b, 0x500b2f1a], [0x0b6d8aa0, 0x232511b0],
+ [0x282fb3ee, 0x23695de0], [0x0c455dfe, 0x820cca3f],
+ [0xe893868c, 0x87f698f6], [0xb6428730, 0x56e576ce],
+ [0xf3843ee7, 0xba79bc28], [0xa1c9ca45, 0x30c479c1],
+ [0xbfc244c2, 0xa9af65f0], [0x6eeb88eb, 0x62b4479c],
+ [0xcc328fe5, 0x60f5c9bf], [0x31aa2c21, 0xc55575fb],
+ [0x9429492d, 0x8e80612a], [0xb12fe59e, 0xf0e1e97b],
+ [0xc2501dad, 0x4a9f4bbf], [0x65ae8366, 0x3e8b0983],
+ [0xd5fc062a, 0xba74f808], [0x7398cc0a, 0x39a6a269],
+ [0x5581dd60, 0xff79d28c], [0xea5e52b3, 0x9be66c71],
+ [0x8f6e02a4, 0xe27318b5], [0xe8bceb99, 0xa48a7f2c],
+);
+1;
diff --git a/rdoff/README b/rdoff/README
new file mode 100644
index 00000000..c0b1c2cd
--- /dev/null
+++ b/rdoff/README
@@ -0,0 +1,185 @@
+*******
+This file is getting obsolete. RDOFF documentation is written in Texinfo now.
+Directory doc/ contains Texinfo source (rdoff.texi) and makefile for creating
+different output formats (info, HTML, PostScript and PDF).
+*******
+
+RDOFF Utilities, version 0.3.2
+==============================
+
+The files contained in this directory are the C source code of a set
+of tools (and general purpose library files) for the manipulation of
+RDOFF version 2 object files. Note that these programs (with the
+exception of 'rdfdump') will NOT work with version 1 object files.
+Version 1 of RDOFF is no longer supported.
+
+There is also a 'doc' directory with 'v1-v2' file, which documents the
+differences between RDOFF 1 and 2, and an 'rdoff2.texi' (texinfo source),
+with complete documentation for the new format.
+
+Here is a brief summary of the programs' usage:
+
+
+rdfdump
+=======
+
+This tool prints a list of the header records in an RDOFF object in
+human-readable form, and optionally prints a hex dump of the contents
+of the segments.
+
+Usage:
+ rdfdump [-v] filename
+
+The -v flag specifies that the hex dump (see above) should be printed.
+
+Changes from previous versions:
+
+* rdfdump supports both version 1 and 2 of RDOFF.
+* rdfdump now gives warnings if the RDOFF2 format is violated (it
+ looks for incorrect lengths for header records, and checks the
+ overall length count at the start of the file)
+
+
+ldrdf
+=====
+
+This tool is a version of unix 'ld' (or DOS 'link') for use with RDOFF
+files. It is capable of linking RDOFF objects, and libraries produced
+with the 'rdlib' utility discussed below.
+
+In normal usage, its command line takes the form:
+
+ ldrdf [-o output-file] object files [-llibrary ...]
+
+Modules in libraries are not linked to the program unless they are
+referred to.
+
+Most of its options are not implemented, but those that are are listed here:
+
+ -2 redirect all output from stderr to stdout. It is useful for some
+ systems which don't have such a redirection in shell (e.g. DOS).
+
+ -v increase verbosity level. Currently 4 verbosity levels are
+ available: default (which only prints error information), normal
+ (which prints information about the produced object, -v), medium
+ (which prints information about what the program is doing, -v -v)
+ and high (which prints all available information, -v -v -v).
+
+ -a change alignment value to which multiple segments combigned into
+ a single segment should be aligned (must be either 1, 2, 4, 8,
+ 16, 32 or 256. Default is 16).
+
+ -s strip exported symbols from output file. Symbols marked as
+ SYM_GLOBAL are never stripped.
+
+ -x warn about unresolved symbols.
+
+ -xe issue an error when at least one symbol is unresolved.
+
+ -o name write output to file <name>. The default output filename
+ is 'aout.rdx'.
+
+ -j path specify search path for object files. Default path is a
+ current directory.
+
+ -L path specify search path for libraries. Default path is a
+ current directory.
+
+ -g file embed 'file' as a first header record with type 'generic'.
+
+
+rdx
+===
+
+This program simply loads and executes an RDOFF object, by calling
+'_main', which it expects to be a C-style function, which will accept
+two parameters, argc and argv in normal C style.
+
+
+rdflib
+======
+
+This program creates a library file for use with ldrdf.
+
+It is supplied with a shell script 'makelib' which should probably be used
+to create libraries.
+
+Usage:
+ rdflib command library [optional arguments]
+
+Valid commands are:
+
+ c Create (or truncate) the library
+ a Add a module (requires a filename and a name to give the
+ module, ie 'rdflib a libc.rdl strcpy.rdf strcpy' puts the
+ file 'strcpy.rdf' into 'libc.rdl', and calls it 'strcpy'.
+ x Extract (arguments are the opposite to the 'a' command,
+ ie you'd do 'rdflib x libc.rdl strcpy strcpy.rdf to get
+ a copy of strcpy.rdf back out again...)
+ t List modules in the library
+ d Delete modules from library
+ r Replace a module in library with a new file
+
+
+Library functions
+=================
+
+The files 'rdoff.c', 'rdoff.h', 'rdfload.c' and 'rdfload.h' contain
+code which you may find useful. They retain the same interface as
+the previous version, so any code that used them previously should
+still work OK (maybe). 'rdoff.c' contains at the top a line:
+
+#define STRICT_ERRORS
+
+Comment this line out if you wish to use record types other than the
+7 predefined types; it will then not report such records as an error,
+but accept them gracefully, and read them byte for byte into
+a 'generic record' (see the definition of GenericRec in 'rdoff.h').
+
+If you are using these functions to write RDF modules (rather than
+just reading them), then please note the existance of a new function
+'rdfaddsegment(rdf_headerbuf,long)'. This must be called once for
+each segment in your object, to tell the header writing functions
+how long the segment is.
+
+
+BUGS
+====
+
+This product has recently undergone a major revision, and as such there
+are probably several bugs left over from the testing phase (although the
+previous version had quite a few that have now been fixed!). Could you
+please report any bugs to maintainers at the addresses below, including the
+following information:
+
+ - A description of the bug
+ - What you think the program should be doing
+ - Which programs you are using
+ - Which operating system you are using, and which C compiler was used to
+ compile the programs (or state that the pre-compiled versions were used).
+ - If appropriate, any of the following:
+ * source code (preferably cut down to a minimum that will still assemble
+ and show the bug)
+ * the output of rdfdump on produced modules (or send the module if the
+ problem is in code generated)
+ * exact descriptions of error messages/symptoms/etc
+
+
+TODO
+====
+
+There are still various things unimplemented that we would like to add.
+If you want to find out what these are, search near the top of each *.c
+file for a comment containing the word 'TODO'. A brief list is given here:
+
+- Improve the performace of ldrdf (there are several enhancements I can think
+ of that wouldn't be too hard to add)
+- Stop assuming that we're on a little endian machine
+- Check for more bugs
+
+
+MAINTAINERS
+===========
+
+Yuri Zaporozhets <r_tty@yahoo.co.uk> - primary maintainer
+Julian Hall <jules@dsf.org.uk> - original designer and author
diff --git a/rdoff/collectn.c b/rdoff/collectn.c
new file mode 100644
index 00000000..d77f54b5
--- /dev/null
+++ b/rdoff/collectn.c
@@ -0,0 +1,44 @@
+/*
+ * collectn.c - implements variable length pointer arrays [collections].
+ *
+ * This file is public domain.
+ */
+
+#include "rdfutils.h"
+#include "collectn.h"
+
+void collection_init(Collection * c)
+{
+ int i;
+
+ for (i = 0; i < 32; i++)
+ c->p[i] = NULL;
+ c->next = NULL;
+}
+
+void **colln(Collection * c, int index)
+{
+ while (index >= 32) {
+ index -= 32;
+ if (c->next == NULL) {
+ c->next = nasm_malloc(sizeof(Collection));
+ collection_init(c->next);
+ }
+ c = c->next;
+ }
+ return &(c->p[index]);
+}
+
+void collection_reset(Collection * c)
+{
+ int i;
+
+ if (c->next) {
+ collection_reset(c->next);
+ nasm_free(c->next);
+ }
+
+ c->next = NULL;
+ for (i = 0; i < 32; i++)
+ c->p[i] = NULL;
+}
diff --git a/rdoff/collectn.h b/rdoff/collectn.h
new file mode 100644
index 00000000..bcd75b8a
--- /dev/null
+++ b/rdoff/collectn.h
@@ -0,0 +1,22 @@
+/*
+ * collectn.h - header file for 'collection' abstract data type.
+ *
+ * This file is public domain, and does not come under the NASM license.
+ * It, aint32_t with 'collectn.c' implements what is basically a variable
+ * length array (of pointers).
+ */
+
+#ifndef RDOFF_COLLECTN_H
+#define RDOFF_COLLECTN_H 1
+
+typedef struct tagCollection {
+ void *p[32]; /* array of pointers to objects */
+
+ struct tagCollection *next;
+} Collection;
+
+void collection_init(Collection * c);
+void **colln(Collection * c, int index);
+void collection_reset(Collection * c);
+
+#endif
diff --git a/rdoff/doc/Makefile b/rdoff/doc/Makefile
new file mode 100644
index 00000000..e4f24f5d
--- /dev/null
+++ b/rdoff/doc/Makefile
@@ -0,0 +1,37 @@
+#
+# Make info documentation
+#
+
+AUXFILES = *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.dvi
+
+SRCS = rdoff.texi
+OUTS = rdoff.info rdoff.html rdoff.ps rdoff.pdf
+
+
+## Implicit rules
+%.html : %.texi
+ makeinfo --html $<
+
+%.dvi : %.texi
+ texi2dvi $<
+
+%.ps: %.dvi
+ dvips $<
+
+%.pdf: %.dvi
+ dvipdf $<
+
+
+## Explicit rules
+all: info
+
+info: rdoff.info
+
+html: rdoff.html
+
+ps: rdoff.ps
+
+pdf: rdoff.pdf
+
+clean:
+ rm -f $(OUTS) $(AUXFILES)
diff --git a/rdoff/doc/rdoff.texi b/rdoff/doc/rdoff.texi
new file mode 100644
index 00000000..8ba2c684
--- /dev/null
+++ b/rdoff/doc/rdoff.texi
@@ -0,0 +1,137 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename rdoff.info
+@settitle Relocatable Dynamic Object File Format (RDOFF)
+@afourpaper
+@c %**end of header
+
+@titlepage
+@title Relocatable Dynamic Object File Format (RDOFF)
+@author Yuri Zaporozhets @email{r_tty@@yahoo.co.uk}
+@author Julian Hall @email{jules@@dsf.org.uk}
+@end titlepage
+
+@ifinfo
+Copyright @copyright{} 2002-2015 Netwide Assembler Project.
+Written by Yuri Zaporozhets @email{r_tty@@yahoo.co.uk}
+Based on various sources and notes written by Julian Hall @email{jules@@dsf.org.uk}
+Distributed under GNU documentation license.
+@end ifinfo
+
+@ifnottex
+@node Top, Overview, (dir), (dir)
+@top RDOFF
+
+RDOFF is a Relocatable Dynamic Object File Format.
+
+@end ifnottex
+
+@menu
+* Overview:: Introduction.
+* Structure:: Structure of RDOFF file.
+* Utilities:: Description of RDOFF utilities.
+@end menu
+
+@node Overview
+@chapter Introduction
+
+RDOFF was designed initially to test the object-file production
+interface to NASM. It soon became apparent that it could be enhanced
+for use in serious applications due to its simplicity; code to load
+and execute an RDOFF object module is very simple. It also contains
+enhancements to allow it to be linked with a dynamic link library at
+either run- or load- time, depending on how complex you wish to make
+your loader.
+
+@node Structure
+@chapter Structure of RDOFF file
+
+RDOFF module consists of three parts:
+
+@itemize
+@item Master header
+@item Header (may be omited)
+@item Sections
+@end itemize
+
+@dfn{Master header} contains signature, version and size information.
+
+@dfn{Header} consists of zero or more @ref{Records, records}.
+
+@dfn{Sections} represent actual contents of the file. Each section is prepended
+by a section header.
+
+@node Records, , ,Structure
+@section Records that may appear in RDOFF header
+
+@menu
+* Relocation:: Relocation records.
+* Import:: Declaring external symbols.
+* Export:: Declaring public and exported symbols.
+* DLL:: Specifying a run-time library name.
+* BSS:: Reserving space in BSS section.
+* Segment relocation:: Complexity of relocation in segmented systems.
+* Far import:: External 'far' symbols.
+* Module name:: Specifying module name.
+* Common variable:: Declaring common variables.
+* Generic record:: Embedding general-purpose data into the header.
+@end menu
+
+@node Relocation
+@subsection Relocation records
+
+@node Import
+@subsection Declaring external and imported symbols
+
+@node Export
+@subsection Declaring public and exported symbols
+
+@node DLL
+@subsection Specifying a run-time library name
+
+@node BSS
+@subsection Reserving space in BSS section
+
+@node Segment relocation
+@subsection Complexity of relocation in segmented systems
+
+@node Far import
+@subsection External 'far' symbols.
+
+@node Module name
+@subsection Specifying module name.
+
+@node Common variable
+@subsection Declaring common variables.
+
+@node Generic record
+@subsection Embedding general-purpose data into the header.
+
+
+@node Utilities
+@chapter RDOFF utilities
+
+@menu
+* rdfdump:: Dump the contents of RDOFF file.
+* ldrdf:: RDOFF linker.
+* rdflib:: RDOFF librarian.
+* rdlar:: New RDOFF librarian/archiver.
+* rdx:: Load and execute RDOFF module.
+@end menu
+
+@node rdfdump
+@section @command{rdfdump} - dump the contents of RDOFF file
+
+@node ldrdf
+@section @command{ldrdf} - RDOFF linker
+
+@node rdflib
+@section @command{rdflib} - RDOFF librarian
+
+@node rdlar
+@section @command{rdlar} - new RDOFF librarian/archiver
+
+@node rdx
+@section @command{rdx} - load and execute RDOFF module
+
+@bye
diff --git a/rdoff/doc/v1-v2.txt b/rdoff/doc/v1-v2.txt
new file mode 100644
index 00000000..800896bd
--- /dev/null
+++ b/rdoff/doc/v1-v2.txt
@@ -0,0 +1,62 @@
+Differences between RDOFF versions 1 & 2
+========================================
+
+This document is designed primarily for people maintaining code which
+uses RDOFF version 1, and would like to upgrade that code to work
+with version 2.
+
+The main changes are summarised here:
+
+Overall format
+==============
+
+The overall format has changed somewhat since version 1, in order
+to make RDOFF more flexible. After the file type identifier (which
+has been changed to 'RDOFF2', obviously), there is now a 4 byte
+integer describing the length of the object module. This allows
+multiple objects to be concatenated, while the loader can easily
+build an index of the locations of each object. This isn't as
+pointless as it sounds; I'm using RDOFF in a microkernel operating
+system, and this is the ideal way of loading multiple driver modules
+at boot time.
+
+There are also no longer a fixed number of segments; instead there
+is a list of segments, immediately following the header.
+Each segment is preceded by a 10 byte header giving information about
+that segment. This header has the following format:
+
+Length Description
+2 Type
+2 Number
+2 Reserved
+4 Length
+
+'Type' is a number describing what sort of segment it is (eg text, data,
+comment, debug info). See 'rdoff2.txt' for a list of the segment types.
+'Number' is the number used to refer to the segment in the header records.
+Not all segments will be loaded; it is only intended that one code
+and one data segment will be loaded into memory. It is possible, however,
+for a loaded segment to contain a reference to an unloaded segment.
+This is an error, and should be flagged at load time. Or maybe you should
+load the segment... its up to you, really.
+
+The segment's data immediately follows the end of the segment header.
+
+HEADER RECORDS
+==============
+
+All of the header records have changed in this version, but not
+substantially. Each record type has had a content-length code added,
+a single byte immediately following the type byte. This contains the
+length of the rest of the record (excluding the type and length bytes,
+but including the terminating nulls on any strings in the record).
+
+There are two new record types, Segment Relocation (6), and FAR import (7).
+The record formats are identical to Relocation (1) and import (2). They are
+only of real use on systems using segmented architectures. Systems using
+a flat model should treat FAR import (7) exactly the same as an import (2),
+and should either flag segment relocation as an error, or attempt to figure
+out whether it is a reference to a code or data symbol, and set the value
+referenced to the according selector value. I am opting for the former
+approach, and would recommend that others working on 32 bit flat systems
+do the same.
diff --git a/rdoff/hash.c b/rdoff/hash.c
new file mode 100644
index 00000000..f2afad0f
--- /dev/null
+++ b/rdoff/hash.c
@@ -0,0 +1,122 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * hash.h Routines to calculate a CRC32 hash value
+ *
+ * These routines donated to the NASM effort by Graeme Defty.
+ */
+
+#include "compiler.h"
+
+#include "hash.h"
+
+const uint32_t consttab[] = {
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
+ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
+ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
+ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
+ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
+ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
+ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
+ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
+ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
+ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
+ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
+ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
+ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
+ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
+ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
+ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
+ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
+ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
+ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
+ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
+ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
+ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
+ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
+ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
+ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
+ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
+ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
+ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
+ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
+ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
+ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
+ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
+ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
+ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
+ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
+ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
+ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
+ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
+ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
+ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
+ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
+ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
+ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+};
+
+uint32_t hash(const char *name)
+{
+ register const char *n;
+ register uint32_t hashval = 0xffffffff;
+
+ for (n = name; *n; n++)
+ hashval = (hashval >> 8) ^ consttab[(hashval ^ *n) & 0xff];
+
+ hashval ^= 0xffffffff;
+
+ return hashval;
+}
diff --git a/rdoff/hash.h b/rdoff/hash.h
new file mode 100644
index 00000000..0379305f
--- /dev/null
+++ b/rdoff/hash.h
@@ -0,0 +1,17 @@
+/* hash.h Routines to calculate a CRC32 hash value
+ *
+ * These routines donated to the NASM effort by Graeme Defty.
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the license given in the file "LICENSE"
+ * distributed in the NASM archive.
+ */
+
+#ifndef RDOFF_HASH_H
+#define RDOFF_HASH_H 1
+
+
+uint32_t hash(const char *name);
+
+#endif
diff --git a/rdoff/ldrdf.1 b/rdoff/ldrdf.1
new file mode 100644
index 00000000..d0a2c219
--- /dev/null
+++ b/rdoff/ldrdf.1
@@ -0,0 +1,41 @@
+.TH LDRDF 1 "September 6, 1999" "Debian Project" "Debian Manual"
+.SH NAME
+ldrdf \- link RDOFF objects and libraries produced by rdflib(1)
+.SH SYNOPSIS
+.B ldrdf
+.RI "[-o " output-file ]
+.I object-file\c
+.RI "... [-l" library "...]"
+.SH DESCRIPTION
+.B ldrdf
+is a version of unix
+.BR ld (1)
+(or DOS LINK) for use with RDOFF files. It is capable of linking RDOFF
+objects, and libraries produced with the
+.BR rdflib (1)
+utility.
+.PP
+Libraries must be specified with their path as no search is performed.
+Modules in libraries are not linked to the program unless they are
+referred to.
+.SH OPTIONS
+.TP
+.RI "-o " output-file
+Specify an output file. The default output filename is
+.RI ' aout.rdx '.
+.TP
+-v
+Increase verbosity level. Currently 4 verbosity levels are available:
+default (which only prints error information), normal (which prints
+information about the produced object, -v), medium (which prints information
+about what the program is doing, -v -v) and high (which prints all available
+information, -v -v -v).
+.TP
+-p
+Change alignment value to which multiple segments combigned into a single
+segment should be aligned (must be either 1, 2, 4, 8, 16, 32 or 256; default
+is 16).
+.SH AUTHORS
+Julian Hall <jules@earthcorp.com>.
+.PP
+This manual page was written by Matej Vela <vela@debian.org>.
diff --git a/rdoff/ldrdf.c b/rdoff/ldrdf.c
new file mode 100644
index 00000000..dd80d70e
--- /dev/null
+++ b/rdoff/ldrdf.c
@@ -0,0 +1,1395 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * ldrdf.c - RDOFF Object File linker/loader main program.
+ */
+
+/*
+ * TODO:
+ * - enhance search of required export symbols in libraries (now depends
+ * on modules order in library)
+ * - keep a cache of symbol names in each library module so
+ * we don't have to constantly recheck the file
+ * - general performance improvements
+ *
+ * BUGS & LIMITATIONS: this program doesn't support multiple code, data
+ * or bss segments, therefore for 16 bit programs whose code, data or BSS
+ * segment exceeds 64K in size, it will not work. This program probably
+ * won't work if compiled by a 16 bit compiler. Try DJGPP if you're running
+ * under DOS. '#define STINGY_MEMORY' may help a little.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rdfutils.h"
+#include "symtab.h"
+#include "collectn.h"
+#include "rdlib.h"
+#include "segtab.h"
+#include "nasmlib.h"
+
+#define LDRDF_VERSION "1.08"
+
+/* #define STINGY_MEMORY */
+
+/* =======================================================================
+ * Types & macros that are private to this program
+ */
+
+struct segment_infonode {
+ int dest_seg; /* output segment to be placed into, -1 to
+ skip linking this segment */
+ int32_t reloc; /* segment's relocation factor */
+};
+
+struct modulenode {
+ rdffile f; /* the RDOFF file structure */
+ struct segment_infonode seginfo[RDF_MAXSEGS]; /* what are we doing
+ with each segment? */
+ void *header;
+ char *name;
+ struct modulenode *next;
+ int32_t bss_reloc;
+};
+
+#include "ldsegs.h"
+
+/* ==========================================================================
+ * Function prototypes of private utility functions
+ */
+
+void processmodule(const char *filename, struct modulenode *mod);
+int allocnewseg(uint16_t type, uint16_t reserved);
+int findsegment(uint16_t type, uint16_t reserved);
+void symtab_add(const char *symbol, int segment, int32_t offset);
+int symtab_get(const char *symbol, int *segment, int32_t *offset);
+
+/* =========================================================================
+ * Global data structures.
+ */
+
+/* a linked list of modules that will be included in the output */
+struct modulenode *modules = NULL;
+struct modulenode *lastmodule = NULL;
+
+/* a linked list of libraries to be searched for unresolved imported symbols */
+struct librarynode *libraries = NULL;
+struct librarynode *lastlib = NULL;
+
+/* the symbol table */
+void *symtab = NULL;
+
+/* objects search path */
+char *objpath = NULL;
+
+/* libraries search path */
+char *libpath = NULL;
+
+/* file to embed as a generic record */
+char *generic_rec_file = NULL;
+
+/* module name to be added at the beginning of output file */
+char *modname_specified = NULL;
+
+/* error file */
+static FILE *error_file;
+
+/* the header of the output file, built up stage by stage */
+rdf_headerbuf *newheader = NULL;
+
+/* The current state of segment allocation, including information about
+ * which output segment numbers have been allocated, and their types and
+ * amount of data which has already been allocated inside them.
+ */
+struct SegmentHeaderRec outputseg[RDF_MAXSEGS];
+int nsegs = 0;
+int32_t bss_length;
+
+/* global options which affect how the program behaves */
+struct ldrdfoptions {
+ int verbose;
+ int align;
+ int dynalink;
+ int strip;
+ int respfile;
+ int stderr_redir;
+ int objpath;
+ int libpath;
+} options;
+
+int errorcount = 0; /* determines main program exit status */
+
+/* =========================================================================
+ * Utility functions
+ */
+
+/*
+ * initsegments()
+ *
+ * sets up segments 0, 1, and 2, the initial code data and bss segments
+ */
+static void initsegments(void)
+{
+ nsegs = 3;
+ outputseg[0].type = 1;
+ outputseg[0].number = 0;
+ outputseg[0].reserved = 0;
+ outputseg[0].length = 0;
+ outputseg[1].type = 2;
+ outputseg[1].number = 1;
+ outputseg[1].reserved = 0;
+ outputseg[1].length = 0;
+ outputseg[2].type = 0xFFFF; /* reserved segment type */
+ outputseg[2].number = 2;
+ outputseg[2].reserved = 0;
+ outputseg[2].length = 0;
+ bss_length = 0;
+}
+
+/*
+ * loadmodule()
+ *
+ * Determine the characteristics of a module, and decide what to do with
+ * each segment it contains (including determining destination segments and
+ * relocation factors for segments that are kept).
+ */
+static void loadmodule(const char *filename)
+{
+ if (options.verbose)
+ printf("loading `%s'\n", filename);
+
+ /* allocate a new module entry on the end of the modules list */
+ if (!modules) {
+ modules = nasm_malloc(sizeof(*modules));
+ lastmodule = modules;
+ } else {
+ lastmodule->next = nasm_malloc(sizeof(*modules));
+ lastmodule = lastmodule->next;
+ }
+
+ if (!lastmodule) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+
+ /* open the file using 'rdfopen', which returns nonzero on error */
+ if (rdfopen(&lastmodule->f, filename) != 0) {
+ rdfperror("ldrdf", filename);
+ exit(1);
+ }
+
+ /*
+ * store information about the module, and determine what segments
+ * it contains, and what we should do with them (determine relocation
+ * factor if we decide to keep them)
+ */
+ lastmodule->header = NULL;
+ lastmodule->name = nasm_strdup(filename);
+ lastmodule->next = NULL;
+
+ processmodule(filename, lastmodule);
+}
+
+/*
+ * processmodule()
+ *
+ * step through each segment, determine what exactly we're doing with
+ * it, and if we intend to keep it, determine (a) which segment to
+ * put it in and (b) whereabouts in that segment it will end up.
+ * (b) is fairly easy, because we're now keeping track of how big each
+ * segment in our output file is...
+ */
+void processmodule(const char *filename, struct modulenode *mod)
+{
+ struct segconfig sconf;
+ int seg, outseg;
+ void *header;
+ rdfheaderrec *hr;
+ int32_t bssamount = 0;
+ int bss_was_referenced = 0;
+
+ memset(&sconf, 0, sizeof sconf);
+
+ for (seg = 0; seg < mod->f.nsegs; seg++) {
+ /*
+ * get the segment configuration for this type from the segment
+ * table. getsegconfig() is a macro, defined in ldsegs.h.
+ */
+ getsegconfig(sconf, mod->f.seg[seg].type);
+
+ if (options.verbose > 1) {
+ printf("%s %04x [%04x:%10s] ", filename,
+ mod->f.seg[seg].number, mod->f.seg[seg].type,
+ sconf.typedesc);
+ }
+ /*
+ * sconf->dowhat tells us what to do with a segment of this type.
+ */
+ switch (sconf.dowhat) {
+ case SEG_IGNORE:
+ /*
+ * Set destination segment to -1, to indicate that this segment
+ * should be ignored for the purpose of output, ie it is left
+ * out of the linked executable.
+ */
+ mod->seginfo[seg].dest_seg = -1;
+ if (options.verbose > 1)
+ printf("IGNORED\n");
+ break;
+
+ case SEG_NEWSEG:
+ /*
+ * The configuration tells us to create a new segment for
+ * each occurrence of this segment type.
+ */
+ outseg = allocnewseg(sconf.mergetype,
+ mod->f.seg[seg].reserved);
+ mod->seginfo[seg].dest_seg = outseg;
+ mod->seginfo[seg].reloc = 0;
+ outputseg[outseg].length = mod->f.seg[seg].length;
+ if (options.verbose > 1)
+ printf("=> %04x:%08"PRIx32" (+%04"PRIx32")\n", outseg,
+ mod->seginfo[seg].reloc, mod->f.seg[seg].length);
+ break;
+
+ case SEG_MERGE:
+ /*
+ * The configuration tells us to merge the segment with
+ * a previously existing segment of type 'sconf.mergetype',
+ * if one exists. Otherwise a new segment is created.
+ * This is handled transparently by 'findsegment()'.
+ */
+ outseg = findsegment(sconf.mergetype,
+ mod->f.seg[seg].reserved);
+ mod->seginfo[seg].dest_seg = outseg;
+
+ /*
+ * We need to add alignment to these segments.
+ */
+ if (outputseg[outseg].length % options.align != 0)
+ outputseg[outseg].length +=
+ options.align -
+ (outputseg[outseg].length % options.align);
+
+ mod->seginfo[seg].reloc = outputseg[outseg].length;
+ outputseg[outseg].length += mod->f.seg[seg].length;
+
+ if (options.verbose > 1)
+ printf("=> %04x:%08"PRIx32" (+%04"PRIx32")\n", outseg,
+ mod->seginfo[seg].reloc, mod->f.seg[seg].length);
+ }
+
+ }
+
+ /*
+ * extract symbols from the header, and dump them into the
+ * symbol table
+ */
+ header = nasm_malloc(mod->f.header_len);
+ if (!header) {
+ fprintf(stderr, "ldrdf: not enough memory\n");
+ exit(1);
+ }
+ if (rdfloadseg(&mod->f, RDOFF_HEADER, header)) {
+ rdfperror("ldrdf", filename);
+ exit(1);
+ }
+
+ while ((hr = rdfgetheaderrec(&mod->f))) {
+ switch (hr->type) {
+ case RDFREC_IMPORT: /* imported symbol */
+ case RDFREC_FARIMPORT:
+ /* Define with seg = -1 */
+ symtab_add(hr->i.label, -1, 0);
+ break;
+
+ case RDFREC_GLOBAL:{ /* exported symbol */
+ int destseg;
+ int32_t destreloc;
+
+ if (hr->e.segment == 2) {
+ bss_was_referenced = 1;
+ destreloc = bss_length;
+ if (destreloc % options.align != 0)
+ destreloc +=
+ options.align - (destreloc % options.align);
+ destseg = 2;
+ } else {
+ if ((destseg =
+ mod->seginfo[(int)hr->e.segment].dest_seg) == -1)
+ continue;
+ destreloc = mod->seginfo[(int)hr->e.segment].reloc;
+ }
+ symtab_add(hr->e.label, destseg, destreloc + hr->e.offset);
+ break;
+ }
+
+ case RDFREC_BSS: /* BSS reservation */
+ /*
+ * first, amalgamate all BSS reservations in this module
+ * into one, because we allow this in the output format.
+ */
+ bssamount += hr->b.amount;
+ break;
+
+ case RDFREC_COMMON:{ /* Common variable */
+ symtabEnt *ste = symtabFind(symtab, hr->c.label);
+
+ /* Is the symbol already in the table? */
+ if (ste)
+ break;
+
+ /* Align the variable */
+ if (bss_length % hr->c.align != 0)
+ bss_length += hr->c.align - (bss_length % hr->c.align);
+ if (options.verbose > 1) {
+ printf("%s %04x common '%s' => 0002:%08"PRIx32" (+%04"PRIx32")\n",
+ filename, hr->c.segment, hr->c.label,
+ bss_length, hr->c.size);
+ }
+
+ symtab_add(hr->c.label, 2, bss_length);
+ mod->bss_reloc = bss_length;
+ bss_length += hr->c.size;
+ break;
+ }
+ }
+ }
+
+ if (bssamount != 0 || bss_was_referenced) {
+ /*
+ * handle the BSS segment - first pad the existing bss length
+ * to the correct alignment, then store the length in bss_reloc
+ * for this module. Then add this module's BSS length onto
+ * bss_length.
+ */
+ if (bss_length % options.align != 0)
+ bss_length += options.align - (bss_length % options.align);
+
+ mod->bss_reloc = bss_length;
+ if (options.verbose > 1) {
+ printf("%s 0002 [ BSS] => 0002:%08"PRIx32" (+%04"PRIx32")\n",
+ filename, bss_length, bssamount);
+ }
+ bss_length += bssamount;
+ }
+#ifdef STINGY_MEMORY
+ /*
+ * we free the header buffer here, to save memory later.
+ * this isn't efficient, but probably halves the memory usage
+ * of this program...
+ */
+ mod->f.header_loc = NULL;
+ nasm_free(header);
+
+#endif
+
+}
+
+/*
+ * Return 1 if a given module is in the list, 0 otherwise.
+ */
+static int lookformodule(const char *name)
+{
+ struct modulenode *curr = modules;
+
+ while (curr) {
+ if (!strcmp(name, curr->name))
+ return 1;
+ curr = curr->next;
+ }
+ return 0;
+}
+
+/*
+ * allocnewseg()
+ * findsegment()
+ *
+ * These functions manipulate the array of output segments, and are used
+ * by processmodule(). allocnewseg() allocates a segment in the array,
+ * initialising it to be empty. findsegment() first scans the array for
+ * a segment of the type requested, and if one isn't found allocates a
+ * new one.
+ */
+int allocnewseg(uint16_t type, uint16_t reserved)
+{
+ outputseg[nsegs].type = type;
+ outputseg[nsegs].number = nsegs;
+ outputseg[nsegs].reserved = reserved;
+ outputseg[nsegs].length = 0;
+ outputseg[nsegs].offset = 0;
+ outputseg[nsegs].data = NULL;
+
+ return nsegs++;
+}
+
+int findsegment(uint16_t type, uint16_t reserved)
+{
+ int i;
+
+ for (i = 0; i < nsegs; i++)
+ if (outputseg[i].type == type)
+ return i;
+
+ return allocnewseg(type, reserved);
+}
+
+/*
+ * symtab_add()
+ *
+ * inserts a symbol into the global symbol table, which associates symbol
+ * names either with addresses, or a marker that the symbol hasn't been
+ * resolved yet, or possibly that the symbol has been defined as
+ * contained in a dynamic [load time/run time] linked library.
+ *
+ * segment = -1 => not yet defined
+ * segment = -2 => defined as dll symbol
+ *
+ * If the symbol is already defined, and the new segment >= 0, then
+ * if the original segment was < 0 the symbol is redefined, otherwise
+ * a duplicate symbol warning is issued. If new segment == -1, this
+ * routine won't change a previously existing symbol. It will change
+ * to segment = -2 only if the segment was previously < 0.
+ */
+void symtab_add(const char *symbol, int segment, int32_t offset)
+{
+ symtabEnt *ste;
+
+ ste = symtabFind(symtab, symbol);
+ if (ste) {
+ if (ste->segment >= 0) {
+ /*
+ * symbol previously defined
+ */
+ if (segment < 0)
+ return;
+ fprintf(error_file, "warning: `%s' redefined\n", symbol);
+ return;
+ }
+
+ /*
+ * somebody wanted the symbol, and put an undefined symbol
+ * marker into the table
+ */
+ if (segment == -1)
+ return;
+ /*
+ * we have more information now - update the symbol's entry
+ */
+ ste->segment = segment;
+ ste->offset = offset;
+ ste->flags = 0;
+ return;
+ }
+ /*
+ * this is the first declaration of this symbol
+ */
+ ste = nasm_malloc(sizeof(symtabEnt));
+ if (!ste) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+ ste->name = nasm_strdup(symbol);
+ ste->segment = segment;
+ ste->offset = offset;
+ ste->flags = 0;
+ symtabInsert(symtab, ste);
+}
+
+/*
+ * symtab_get()
+ *
+ * Retrieves the values associated with a symbol. Undefined symbols
+ * are assumed to have -1:0 associated. Returns 1 if the symbol was
+ * successfully located.
+ */
+int symtab_get(const char *symbol, int *segment, int32_t *offset)
+{
+ symtabEnt *ste = symtabFind(symtab, symbol);
+ if (!ste) {
+ *segment = -1;
+ *offset = 0;
+ return 0;
+ } else {
+ *segment = ste->segment;
+ *offset = ste->offset;
+ return 1;
+ }
+}
+
+/*
+ * add_library()
+ *
+ * checks that a library can be opened and is in the correct format,
+ * then adds it to the linked list of libraries.
+ */
+static void add_library(const char *name)
+{
+ if (rdl_verify(name)) {
+ rdl_perror("ldrdf", name);
+ errorcount++;
+ return;
+ }
+ if (!libraries) {
+ lastlib = libraries = nasm_malloc(sizeof(*libraries));
+ if (!libraries) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+ } else {
+ lastlib->next = nasm_malloc(sizeof(*libraries));
+ if (!lastlib->next) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+ lastlib = lastlib->next;
+ }
+ lastlib->next = NULL;
+ if (rdl_open(lastlib, name)) {
+ rdl_perror("ldrdf", name);
+ errorcount++;
+ return;
+ }
+}
+
+/*
+ * search_libraries()
+ *
+ * scans through the list of libraries, attempting to match symbols
+ * defined in library modules against symbols that are referenced but
+ * not defined (segment = -1 in the symbol table)
+ *
+ * returns 1 if any extra library modules are included, indicating that
+ * another pass through the library list should be made (possibly).
+ */
+static int search_libraries(void)
+{
+ struct librarynode *cur;
+ rdffile f;
+ int i;
+ void *header;
+ int segment;
+ int32_t offset;
+ int doneanything = 0, pass = 1, keepfile;
+ rdfheaderrec *hr;
+
+ cur = libraries;
+
+ while (cur) {
+ if (options.verbose > 2)
+ printf("scanning library `%s', pass %d...\n", cur->name, pass);
+
+ for (i = 0; rdl_openmodule(cur, i, &f) == 0; i++) {
+ if (pass == 2 && lookformodule(f.name))
+ continue;
+
+ if (options.verbose > 3)
+ printf(" looking in module `%s'\n", f.name);
+
+ header = nasm_malloc(f.header_len);
+ if (!header) {
+ fprintf(stderr, "ldrdf: not enough memory\n");
+ exit(1);
+ }
+ if (rdfloadseg(&f, RDOFF_HEADER, header)) {
+ rdfperror("ldrdf", f.name);
+ errorcount++;
+ return 0;
+ }
+
+ keepfile = 0;
+
+ while ((hr = rdfgetheaderrec(&f))) {
+ /* We're only interested in exports, so skip others */
+ if (hr->type != RDFREC_GLOBAL)
+ continue;
+
+ /*
+ * If the symbol is marked as SYM_GLOBAL, somebody will be
+ * definitely interested in it..
+ */
+ if ((hr->e.flags & SYM_GLOBAL) == 0) {
+ /*
+ * otherwise the symbol is just public. Find it in
+ * the symbol table. If the symbol isn't defined, we
+ * aren't interested, so go on to the next.
+ * If it is defined as anything but -1, we're also not
+ * interested. But if it is defined as -1, insert this
+ * module into the list of modules to use, and go
+ * immediately on to the next module...
+ */
+ if (!symtab_get(hr->e.label, &segment, &offset)
+ || segment != -1)
+ continue;
+ }
+
+ doneanything = 1;
+ keepfile = 1;
+
+ /*
+ * as there are undefined symbols, we can assume that
+ * there are modules on the module list by the time
+ * we get here.
+ */
+ lastmodule->next = nasm_malloc(sizeof(*lastmodule->next));
+ if (!lastmodule->next) {
+ fprintf(stderr, "ldrdf: not enough memory\n");
+ exit(1);
+ }
+ lastmodule = lastmodule->next;
+ memcpy(&lastmodule->f, &f, sizeof(f));
+ lastmodule->name = nasm_strdup(f.name);
+ lastmodule->next = NULL;
+ processmodule(f.name, lastmodule);
+ break;
+ }
+ if (!keepfile) {
+ nasm_free(f.name);
+ f.name = NULL;
+ f.fp = NULL;
+ }
+ }
+ if (rdl_error != 0 && rdl_error != RDL_ENOTFOUND)
+ rdl_perror("ldrdf", cur->name);
+
+ cur = cur->next;
+ if (cur == NULL && pass == 1) {
+ cur = libraries;
+ pass++;
+ }
+ }
+
+ return doneanything;
+}
+
+/*
+ * write_output()
+ *
+ * this takes the linked list of modules, and walks through it, merging
+ * all the modules into a single output module, and then writes this to a
+ * file.
+ */
+static void write_output(const char *filename)
+{
+ FILE *f;
+ rdf_headerbuf *rdfheader;
+ struct modulenode *cur;
+ int i, n, availableseg, seg, localseg, isrelative;
+ void *header;
+ rdfheaderrec *hr, newrec;
+ symtabEnt *se;
+ segtab segs;
+ int32_t offset;
+ uint8_t *data;
+
+ if ((f = fopen(filename, "wb")) == NULL) {
+ fprintf(stderr, "ldrdf: couldn't open %s for output\n", filename);
+ exit(1);
+ }
+ if ((rdfheader = rdfnewheader()) == NULL) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+
+ /*
+ * If '-g' option was given, first record in output file will be a
+ * `generic' record, filled with a given file content.
+ * This can be useful, for example, when constructing multiboot
+ * compliant kernels.
+ */
+ if (generic_rec_file) {
+ FILE *ff;
+
+ if (options.verbose)
+ printf("\nadding generic record from binary file %s\n",
+ generic_rec_file);
+
+ hr = (rdfheaderrec *) nasm_malloc(sizeof(struct GenericRec));
+ if ((ff = fopen(generic_rec_file, "r")) == NULL) {
+ fprintf(stderr, "ldrdf: couldn't open %s for input\n",
+ generic_rec_file);
+ exit(1);
+ }
+ n = fread(hr->g.data, 1, sizeof(hr->g.data), ff);
+ fseek(ff, 0, SEEK_END);
+ if (ftell(ff) > (long)sizeof(hr->g.data)) {
+ fprintf(error_file,
+ "warning: maximum generic record size is %u, "
+ "rest of file ignored\n",
+ (unsigned int)sizeof(hr->g.data));
+ }
+ fclose(ff);
+
+ hr->g.type = RDFREC_GENERIC;
+ hr->g.reclen = n;
+ rdfaddheader(rdfheader, hr);
+ nasm_free(hr);
+ }
+
+ /*
+ * Add module name record if `-mn' option was given
+ */
+ if (modname_specified) {
+ n = strlen(modname_specified);
+
+ if ((n < 1) || (n >= MODLIB_NAME_MAX)) {
+ fprintf(stderr, "ldrdf: invalid length of module name `%s'\n",
+ modname_specified);
+ exit(1);
+ }
+
+ if (options.verbose)
+ printf("\nadding module name record %s\n", modname_specified);
+
+ hr = (rdfheaderrec *) nasm_malloc(sizeof(struct ModRec));
+ hr->m.type = RDFREC_MODNAME;
+ hr->m.reclen = n + 1;
+ strcpy(hr->m.modname, modname_specified);
+ rdfaddheader(rdfheader, hr);
+ nasm_free(hr);
+ }
+
+
+ if (options.verbose)
+ printf("\nbuilding output module (%d segments)\n", nsegs);
+
+ /*
+ * Allocate the memory for the segments. We may be better off
+ * building the output module one segment at a time when running
+ * under 16 bit DOS, but that would be a slower way of doing this.
+ * And you could always use DJGPP...
+ */
+ for (i = 0; i < nsegs; i++) {
+ outputseg[i].data = NULL;
+ if (!outputseg[i].length)
+ continue;
+ outputseg[i].data = nasm_malloc(outputseg[i].length);
+ if (!outputseg[i].data) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+ }
+
+ /*
+ * initialise availableseg, used to allocate segment numbers for
+ * imported and exported labels...
+ */
+ availableseg = nsegs;
+
+ /*
+ * Step through the modules, performing required actions on each one
+ */
+ for (cur = modules; cur; cur = cur->next) {
+ /*
+ * Read the actual segment contents into the correct places in
+ * the newly allocated segments
+ */
+
+ for (i = 0; i < cur->f.nsegs; i++) {
+ int dest = cur->seginfo[i].dest_seg;
+
+ if (dest == -1)
+ continue;
+ if (rdfloadseg(&cur->f, i,
+ outputseg[dest].data + cur->seginfo[i].reloc)) {
+ rdfperror("ldrdf", cur->name);
+ exit(1);
+ }
+ }
+
+ /*
+ * Perform fixups, and add new header records where required
+ */
+
+ header = nasm_malloc(cur->f.header_len);
+ if (!header) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+
+ if (cur->f.header_loc)
+ rdfheaderrewind(&cur->f);
+ else if (rdfloadseg(&cur->f, RDOFF_HEADER, header)) {
+ rdfperror("ldrdf", cur->name);
+ exit(1);
+ }
+
+ /*
+ * we need to create a local segment number -> location
+ * table for the segments in this module.
+ */
+ init_seglocations(&segs);
+ for (i = 0; i < cur->f.nsegs; i++) {
+ add_seglocation(&segs, cur->f.seg[i].number,
+ cur->seginfo[i].dest_seg,
+ cur->seginfo[i].reloc);
+ }
+ /*
+ * and the BSS segment (doh!)
+ */
+ add_seglocation(&segs, 2, 2, cur->bss_reloc);
+
+ while ((hr = rdfgetheaderrec(&cur->f))) {
+ switch (hr->type) {
+ case RDFREC_RELOC: /* relocation record - need to do a fixup */
+ /*
+ * First correct the offset stored in the segment from
+ * the start of the segment (which may well have changed).
+ *
+ * To do this we add to the number stored the relocation
+ * factor associated with the segment that contains the
+ * target segment.
+ *
+ * The relocation could be a relative relocation, in which
+ * case we have to first subtract the amount we've relocated
+ * the containing segment by.
+ */
+ if (!get_seglocation(&segs, hr->r.refseg, &seg, &offset)) {
+ fprintf(stderr,
+ "%s: reloc to undefined segment %04x\n",
+ cur->name, (int)hr->r.refseg);
+ errorcount++;
+ break;
+ }
+
+ isrelative =
+ (hr->r.segment & RDOFF_RELATIVEMASK) ==
+ RDOFF_RELATIVEMASK;
+ hr->r.segment &= (RDOFF_RELATIVEMASK - 1);
+
+ if (hr->r.segment == 2 ||
+ (localseg =
+ rdffindsegment(&cur->f, hr->r.segment)) == -1) {
+ fprintf(stderr, "%s: reloc from %s segment (%d)\n",
+ cur->name,
+ hr->r.segment == 2 ? "BSS" : "unknown",
+ hr->r.segment);
+ errorcount++;
+ break;
+ }
+
+ if (hr->r.length != 1 && hr->r.length != 2 &&
+ hr->r.length != 4) {
+ fprintf(stderr, "%s: nonstandard length reloc "
+ "(%d bytes)\n", cur->name, hr->r.length);
+ errorcount++;
+ break;
+ }
+
+ /*
+ * okay, now the relocation is in the segment pointed to by
+ * cur->seginfo[localseg], and we know everything else is
+ * okay to go ahead and do the relocation
+ */
+ data = outputseg[cur->seginfo[localseg].dest_seg].data;
+ data += cur->seginfo[localseg].reloc + hr->r.offset;
+
+ /*
+ * data now points to the reference that needs
+ * relocation. Calculate the relocation factor.
+ * Factor is:
+ * offset of referred object in segment [in offset]
+ * (- relocation of localseg, if ref is relative)
+ * For simplicity, the result is stored in 'offset'.
+ * Then add 'offset' onto the value at data.
+ */
+
+ if (isrelative)
+ offset -= cur->seginfo[localseg].reloc;
+ switch (hr->r.length) {
+ case 1:
+ offset += *data;
+ if (offset < -127 || offset > 128)
+ fprintf(error_file,
+ "warning: relocation out of range "
+ "at %s(%02x:%08"PRIx32")\n", cur->name,
+ (int)hr->r.segment, hr->r.offset);
+ *data = (char)offset;
+ break;
+ case 2:
+ offset += *(int16_t *)data;
+ if (offset < -32767 || offset > 32768)
+ fprintf(error_file,
+ "warning: relocation out of range "
+ "at %s(%02x:%08"PRIx32")\n", cur->name,
+ (int)hr->r.segment, hr->r.offset);
+ *(int16_t *)data = (int16_t)offset;
+ break;
+ case 4:
+ *(int32_t *)data += offset;
+ /* we can't easily detect overflow on this one */
+ break;
+ }
+
+ /*
+ * If the relocation was relative between two symbols in
+ * the same segment, then we're done.
+ *
+ * Otherwise, we need to output a new relocation record
+ * with the references updated segment and offset...
+ */
+ if (!isrelative || cur->seginfo[localseg].dest_seg != seg) {
+ hr->r.segment = cur->seginfo[localseg].dest_seg;
+ hr->r.offset += cur->seginfo[localseg].reloc;
+ hr->r.refseg = seg;
+ if (isrelative)
+ hr->r.segment += RDOFF_RELATIVEMASK;
+ rdfaddheader(rdfheader, hr);
+ }
+ break;
+
+ case RDFREC_IMPORT: /* import symbol */
+ case RDFREC_FARIMPORT:
+ /*
+ * scan the global symbol table for the symbol
+ * and associate its location with the segment number
+ * for this module
+ */
+ se = symtabFind(symtab, hr->i.label);
+ if (!se || se->segment == -1) {
+ if (!options.dynalink && !(hr->i.flags & SYM_IMPORT)) {
+ fprintf(error_file,
+ "error: unresolved reference to `%s'"
+ " in module `%s'\n", hr->i.label,
+ cur->name);
+ errorcount++;
+ }
+ /*
+ * we need to allocate a segment number for this
+ * symbol, and store it in the symbol table for
+ * future reference
+ */
+ if (!se) {
+ se = nasm_malloc(sizeof(*se));
+ if (!se) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+ se->name = nasm_strdup(hr->i.label);
+ se->flags = 0;
+ se->segment = availableseg++;
+ se->offset = 0;
+ symtabInsert(symtab, se);
+ } else {
+ se->segment = availableseg++;
+ se->offset = 0;
+ }
+ /*
+ * output a header record that imports it to the
+ * recently allocated segment number...
+ */
+ newrec = *hr;
+ newrec.i.segment = se->segment;
+ rdfaddheader(rdfheader, &newrec);
+ }
+
+ add_seglocation(&segs, hr->i.segment, se->segment,
+ se->offset);
+ break;
+
+ case RDFREC_GLOBAL: /* export symbol */
+ /*
+ * need to insert an export for this symbol into the new
+ * header, unless we're stripping symbols. Even if we're
+ * stripping, put the symbol if it's marked as SYM_GLOBAL.
+ */
+ if (options.strip && !(hr->e.flags & SYM_GLOBAL))
+ break;
+
+ if (hr->e.segment == 2) {
+ seg = 2;
+ offset = cur->bss_reloc;
+ } else {
+ localseg = rdffindsegment(&cur->f, hr->e.segment);
+ if (localseg == -1) {
+ fprintf(stderr, "%s: exported symbol `%s' from "
+ "unrecognised segment\n", cur->name,
+ hr->e.label);
+ errorcount++;
+ break;
+ }
+ offset = cur->seginfo[localseg].reloc;
+ seg = cur->seginfo[localseg].dest_seg;
+ }
+
+ hr->e.segment = seg;
+ hr->e.offset += offset;
+ rdfaddheader(rdfheader, hr);
+ break;
+
+ case RDFREC_MODNAME: /* module name */
+ /*
+ * Insert module name record if export symbols
+ * are not stripped.
+ * If module name begins with '$' - insert it anyway.
+ */
+ if (options.strip && hr->m.modname[0] != '$')
+ break;
+ rdfaddheader(rdfheader, hr);
+ break;
+
+ case RDFREC_DLL: /* DLL name */
+ /*
+ * Insert DLL name if it begins with '$'
+ */
+ if (hr->d.libname[0] != '$')
+ break;
+ rdfaddheader(rdfheader, hr);
+ break;
+
+ case RDFREC_SEGRELOC: /* segment fixup */
+ /*
+ * modify the segment numbers if necessary, and
+ * pass straight through to the output module header
+ *
+ * *** FIXME ***
+ */
+ if (hr->r.segment == 2) {
+ fprintf(stderr, "%s: segment fixup in BSS section\n",
+ cur->name);
+ errorcount++;
+ break;
+ }
+ localseg = rdffindsegment(&cur->f, hr->r.segment);
+ if (localseg == -1) {
+ fprintf(stderr, "%s: segment fixup in unrecognised"
+ " segment (%d)\n", cur->name, hr->r.segment);
+ errorcount++;
+ break;
+ }
+ hr->r.segment = cur->seginfo[localseg].dest_seg;
+ hr->r.offset += cur->seginfo[localseg].reloc;
+
+ if (!get_seglocation(&segs, hr->r.refseg, &seg, &offset)) {
+ fprintf(stderr, "%s: segment fixup to undefined "
+ "segment %04x\n", cur->name,
+ (int)hr->r.refseg);
+ errorcount++;
+ break;
+ }
+ hr->r.refseg = seg;
+ rdfaddheader(rdfheader, hr);
+ break;
+
+ case RDFREC_COMMON: /* Common variable */
+ /* Is this symbol already in the table? */
+ se = symtabFind(symtab, hr->c.label);
+ if (!se) {
+ printf("%s is not in symtab yet\n", hr->c.label);
+ break;
+ }
+ /* Add segment location */
+ add_seglocation(&segs, hr->c.segment, se->segment,
+ se->offset);
+ break;
+ }
+ }
+
+ nasm_free(header);
+ done_seglocations(&segs);
+
+ }
+
+ /*
+ * combined BSS reservation for the entire results
+ */
+ newrec.type = RDFREC_BSS;
+ newrec.b.reclen = 4;
+ newrec.b.amount = bss_length;
+ rdfaddheader(rdfheader, &newrec);
+
+ /*
+ * Write the header
+ */
+ for (i = 0; i < nsegs; i++) {
+ if (i == 2)
+ continue;
+ rdfaddsegment(rdfheader, outputseg[i].length);
+ }
+
+ rdfwriteheader(f, rdfheader);
+ rdfdoneheader(rdfheader);
+
+ /*
+ * Step through the segments, one at a time, writing out into
+ * the output file
+ */
+ for (i = 0; i < nsegs; i++) {
+ if (i == 2)
+ continue;
+
+ fwriteint16_t(outputseg[i].type, f);
+ fwriteint16_t(outputseg[i].number, f);
+ fwriteint16_t(outputseg[i].reserved, f);
+ fwriteint32_t(outputseg[i].length, f);
+ nasm_write(outputseg[i].data, outputseg[i].length, f);
+ }
+
+ fwritezero(10, f);
+}
+
+/* =========================================================================
+ * Main program
+ */
+
+static void usage(void)
+{
+ printf("usage:\n"
+ " ldrdf [options] object modules ... [-llibrary ...]\n"
+ " ldrdf -r\n"
+ "options:\n"
+ " -v[=n] increase verbosity by 1, or set it to n\n"
+ " -a nn set segment alignment value (default 16)\n"
+ " -s strip public symbols\n"
+ " -dy Unix-style dynamic linking\n"
+ " -o name write output in file 'name'\n"
+ " -j path specify objects search path\n"
+ " -L path specify libraries search path\n"
+ " -g file embed 'file' as a first header record with type 'generic'\n"
+ " -mn name add module name record at the beginning of output file\n");
+ exit(0);
+}
+
+int main(int argc, char **argv)
+{
+ char *outname = "aout.rdf";
+ int moduleloaded = 0;
+ char *respstrings[128] = { 0, };
+
+ rdoff_init();
+
+ options.verbose = 0;
+ options.align = 16;
+ options.dynalink = 0;
+ options.strip = 0;
+
+ error_file = stderr;
+
+ argc--, argv++;
+ if (argc == 0)
+ usage();
+ while (argc && *argv && **argv == '-' && argv[0][1] != 'l') {
+ switch (argv[0][1]) {
+ case 'r':
+ printf("ldrdf (linker for RDF files) version " LDRDF_VERSION
+ "\n");
+ printf("RDOFF2 revision %s\n", RDOFF2_REVISION);
+ exit(0);
+ case 'v':
+ if (argv[0][2] == '=') {
+ options.verbose = argv[0][3] - '0';
+ if (options.verbose < 0 || options.verbose > 9) {
+ fprintf(stderr,
+ "ldrdf: verbosity level must be a number"
+ " between 0 and 9\n");
+ exit(1);
+ }
+ } else
+ options.verbose++;
+ break;
+ case 'a':
+ options.align = atoi(argv[1]);
+ if (options.align <= 0) {
+ fprintf(stderr,
+ "ldrdf: -a expects a positive number argument\n");
+ exit(1);
+ }
+ argv++, argc--;
+ break;
+ case 's':
+ options.strip = 1;
+ break;
+ case 'd':
+ if (argv[0][2] == 'y')
+ options.dynalink = 1;
+ break;
+ case 'm':
+ if (argv[0][2] == 'n') {
+ modname_specified = argv[1];
+ argv++, argc--;
+ if (!argc) {
+ fprintf(stderr, "ldrdf: -mn expects a module name\n");
+ exit(1);
+ }
+ }
+ break;
+ case 'o':
+ outname = argv[1];
+ argv++, argc--;
+ break;
+ case 'j':
+ if (!objpath) {
+ options.objpath = 1;
+ objpath = argv[1];
+ argv++, argc--;
+ break;
+ } else {
+ fprintf(stderr,
+ "ldrdf: more than one objects search path specified\n");
+ exit(1);
+ }
+ case 'L':
+ if (!libpath) {
+ options.libpath = 1;
+ libpath = argv[1];
+ argv++, argc--;
+ break;
+ } else {
+ fprintf(stderr,
+ "ldrdf: more than one libraries search path specified\n");
+ exit(1);
+ }
+ case '@':{
+ int i = 0;
+ char buf[256];
+ FILE *f;
+
+ options.respfile = 1;
+ if (argv[1] != NULL)
+ f = fopen(argv[1], "r");
+ else {
+ fprintf(stderr,
+ "ldrdf: no response file name specified\n");
+ exit(1);
+ }
+
+ if (f == NULL) {
+ fprintf(stderr,
+ "ldrdf: unable to open response file\n");
+ exit(1);
+ }
+
+ argv++, argc--;
+ while (fgets(buf, sizeof(buf), f) != NULL) {
+ char *p;
+ if (buf[0] == '\n')
+ continue;
+ if ((p = strchr(buf, '\n')) != NULL)
+ *p = '\0';
+ if (i >= 128) {
+ fclose(f);
+ fprintf(stderr, "ldrdf: too many input files\n");
+ exit(1);
+ }
+ *(respstrings + i) = nasm_strdup(buf);
+ argc++, i++;
+ }
+ fclose(f);
+ break;
+ }
+ case '2':
+ options.stderr_redir = 1;
+ error_file = stdout;
+ break;
+ case 'g':
+ generic_rec_file = argv[1];
+ argv++, argc--;
+ if (!argc) {
+ fprintf(stderr, "ldrdf: -g expects a file name\n");
+ exit(1);
+ }
+ break;
+ default:
+ usage();
+ }
+ argv++, argc--;
+ }
+
+ if (options.verbose > 4) {
+ printf("ldrdf invoked with options:\n");
+ printf(" section alignment: %d bytes\n", options.align);
+ printf(" output name: `%s'\n", outname);
+ if (options.strip)
+ printf(" strip symbols\n");
+ if (options.dynalink)
+ printf(" Unix-style dynamic linking\n");
+ if (options.objpath)
+ printf(" objects search path: %s\n", objpath);
+ if (options.libpath)
+ printf(" libraries search path: %s\n", libpath);
+ printf("\n");
+ }
+
+ symtab = symtabNew();
+ initsegments();
+
+ if (!symtab) {
+ fprintf(stderr, "ldrdf: out of memory\n");
+ exit(1);
+ }
+
+ while (argc) {
+ if (!*argv)
+ argv = respstrings;
+ if (!*argv)
+ break;
+ if (!strncmp(*argv, "-l", 2)) {
+ if (libpath && (argv[0][2] != '/'))
+ add_library(nasm_strcat(libpath, *argv + 2));
+ else
+ add_library(*argv + 2);
+ } else {
+ if (objpath && (argv[0][0] != '/'))
+ loadmodule(nasm_strcat(objpath, *argv));
+ else
+ loadmodule(*argv);
+ moduleloaded = 1;
+ }
+ argv++, argc--;
+ }
+
+ if (!moduleloaded) {
+ printf("ldrdf: nothing to do. ldrdf -h for usage\n");
+ return 0;
+ }
+
+ search_libraries();
+
+ if (options.verbose > 2) {
+ printf("symbol table:\n");
+ symtabDump(symtab, stdout);
+ }
+
+ write_output(outname);
+
+ if (errorcount > 0) {
+ remove(outname);
+ exit(1);
+ }
+ return 0;
+}
diff --git a/rdoff/ldsegs.h b/rdoff/ldsegs.h
new file mode 100644
index 00000000..7dccaace
--- /dev/null
+++ b/rdoff/ldsegs.h
@@ -0,0 +1,59 @@
+/*
+ * ldsegs.h Data for 'ldrdf' to determine what to do with different
+ * types of segment. This may be useful in other contexts also.
+ */
+
+#ifndef RDOFF_LDSEGS_H
+#define RDOFF_LDSEGS_H 1
+
+
+struct segconfig {
+ uint16_t typelow, typehi; /* range of seg nos for which this is valid */
+ char *typedesc; /* a description of the segment type */
+ uint16_t dowhat; /* one of the SEG_xxxx values below */
+ uint16_t mergetype; /* if SEG_MERGE what type segment do we merge
+ with?
+ 0 -> same type of segment. This type is also
+ used with SEG_NEWSEG. */
+};
+
+#define SEG_IGNORE 0
+#define SEG_NEWSEG 1
+#define SEG_MERGE 2
+
+#define SEGCONFIGMAX 11
+
+struct segconfig sconft[SEGCONFIGMAX] = {
+ {0x0000, 0x0000, "NULL segment", 0, 0},
+ {0x0001, 0x0001, "text", 2, 0},
+ {0x0002, 0x0002, "data", 2, 0},
+ {0x0003, 0x0003, "comment(ignored)", 0, 0},
+ {0x0004, 0x0005, "comment(kept)", 2, 0},
+ {0x0006, 0x0007, "debug information", 2, 0},
+ {0x0008, 0x001F, "reserved(general extensions)", 1, 0},
+ {0x0020, 0x0FFF, "reserved(MOSCOW)", 1, 0},
+ {0x1000, 0x7FFF, "reserved(system dependant)", 1, 0},
+ {0x8000, 0xFFFE, "reserved(other)", 1, 0},
+ {0xFFFF, 0xFFFF, "invalid segment", 0, 0}
+};
+
+#define getsegconfig(target,number) \
+ { \
+ int _i; \
+ int _t = number; \
+ for (_i = 0; _i < SEGCONFIGMAX; _i++) \
+ if (_t >= sconft[_i].typelow && _t <= sconft[_i].typehi) \
+ { \
+ target = sconft[_i]; \
+ if (target.mergetype == 0) target.mergetype = _t; \
+ break; \
+ } \
+ if (_i == SEGCONFIGMAX) \
+ { \
+ fprintf(stderr, "PANIC: can't find segment %04X in segconfig\n",\
+ _t); \
+ exit(1); \
+ } \
+ }
+
+#endif
diff --git a/rdoff/rdf2bin.1 b/rdoff/rdf2bin.1
new file mode 100644
index 00000000..d274d580
--- /dev/null
+++ b/rdoff/rdf2bin.1
@@ -0,0 +1,65 @@
+.TH RDF2BIN 1 "September 6, 1999" "Debian Project" "Debian Manual"
+.SH NAME
+rdf2bin, rdf2com \- convert an RDOFF object file to flat binary
+.SH SYNOPSIS
+.B rdf2bin
+.RI "[\-o " relocation-origin ]
+.RI "[\-p " segment-alignment ]
+.RI "[\-f " format ]
+.I input-file
+.I output-file
+.br
+.B rdf2com
+.RI "[\-p " segment-alignment ]
+.I input-file
+.I output-file
+.br
+.B rdf2ith
+.RI "[\-o " relocation-origin ]
+.RI "[\-p " segment-alignment ]
+.I input-file
+.I output-file
+.br
+.B rdf2srec
+.RI "[\-o " relocation-origin ]
+.RI "[\-p " segment-alignment ]
+.I input-file
+.I output-file
+.SH OPTIONS
+.TP
+.RI "\-o " relocation-origin
+Relocate at origin
+.IR relocation-origin .
+If invoked as
+.BR rdf2com ,
+the default relocation origin will be 0x100. Else, the default origin is 0.
+.TP
+.RI "\-p " segment-alignment
+Pad segments until their size is a multiple of
+.IR segment-alignment .
+By default, 16 is used.
+.TP
+.RI "\-f " format
+Specify the output format. The currently supported formats are binary
+.RI ( bin ),
+DOS COM (binary with origin 0x100)
+.RI ( com )
+Intel hex
+.RI ( ith
+or
+.IR ihx ),
+and
+Motorola S-Records
+.RI ( srec ).
+If not specified, the format is set by the command name.
+.SH AUTHORS
+Julian Hall <jules@earthcorp.com>, H. Peter Anvin <hpa@zytor.com>.
+.PP
+This manual page was written by Matej Vela <vela@debian.org>.
+.SH BUGS
+This utility currently only supports the classic segments
+.IR .text ,
+.I .data
+and
+.IR .bss .
+
diff --git a/rdoff/rdf2bin.c b/rdoff/rdf2bin.c
new file mode 100644
index 00000000..1beb8245
--- /dev/null
+++ b/rdoff/rdf2bin.c
@@ -0,0 +1,431 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdf2bin.c - convert an RDOFF object file to flat binary
+ */
+
+#include "compiler.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "rdfload.h"
+#include "nasmlib.h"
+
+const char *progname;
+
+static uint32_t origin = 0;
+static bool origin_def = false;
+static uint32_t align = 16;
+static bool align_def = false;
+
+struct output_format {
+ const char *name;
+ const char *mode;
+ int (*init)(FILE *f);
+ int (*output)(FILE *f, void *data, uint32_t bytes, uint32_t where);
+ int (*fini)(FILE *f);
+};
+
+static int null_init_fini(FILE *f)
+{
+ (void)f;
+ return 0;
+}
+
+static int com_init(FILE *f)
+{
+ (void)f;
+ if (!origin_def)
+ origin = 0x100;
+ return 0;
+}
+
+static int output_bin(FILE *f, void *data, uint32_t bytes, uint32_t where)
+{
+ static uint32_t offset = 0; /* Current file offset, if applicable */
+ size_t pad;
+
+ if (where-origin < offset) {
+ fprintf(stderr, "%s: internal error: backwards movement\n", progname);
+ exit(1);
+ }
+
+ pad = (where-origin) - offset;
+ fwritezero(pad, f);
+ offset += pad;
+
+ if (fwrite(data, 1, bytes, f) != bytes)
+ return -1;
+ offset += bytes;
+
+ return 0;
+}
+
+static int write_ith_record(FILE *f, unsigned int len, uint16_t addr,
+ uint8_t type, void *data)
+{
+ char buf[1+2+4+2+255*2+2+2];
+ char *p = buf;
+ uint8_t csum, *dptr = data;
+ unsigned int i;
+
+ if (len > 255) {
+ fprintf(stderr, "%s: internal error: invalid ith record size\n",
+ progname);
+ exit(1);
+ }
+
+ csum = len + addr + (addr >> 8) + type;
+ for (i = 0; i < len; i++)
+ csum += dptr[i];
+ csum = -csum;
+
+ p += sprintf(p, ":%02X%04X%02X", len, addr, type);
+ for (i = 0; i < len; i++)
+ p += sprintf(p, "%02X", dptr[i]);
+ p += sprintf(p, "%02X\n", csum);
+
+ if (fwrite(buf, 1, p-buf, f) != (size_t)(p-buf))
+ return -1;
+
+ return 0;
+}
+
+static int output_ith(FILE *f, void *data, uint32_t bytes, uint32_t where)
+{
+ static uint32_t last = 0; /* Last address written */
+ uint8_t abuf[2];
+ uint8_t *dbuf = data;
+ uint32_t chunk;
+
+ while (bytes) {
+ if ((where ^ last) & ~0xffff) {
+ abuf[0] = where >> 24;
+ abuf[1] = where >> 16;
+ if (write_ith_record(f, 2, 0, 4, abuf))
+ return -1;
+ }
+
+ /* Output up to 32 bytes, but always end on an aligned boundary */
+ chunk = 32 - (where & 31);
+ if (bytes < chunk)
+ chunk = bytes;
+
+ if (write_ith_record(f, chunk, (uint16_t)where, 0, dbuf))
+ return -1;
+
+ dbuf += chunk;
+ last = where + chunk - 1;
+ where += chunk;
+ bytes -= chunk;
+ }
+ return 0;
+}
+
+static int fini_ith(FILE *f)
+{
+ /* XXX: entry point? */
+ return write_ith_record(f, 0, 0, 1, NULL);
+}
+
+static int write_srecord(FILE *f, unsigned int len, unsigned int alen,
+ uint32_t addr, uint8_t type, void *data)
+{
+ char buf[2+2+8+255*2+2+2];
+ char *p = buf;
+ uint8_t csum, *dptr = data;
+ unsigned int i;
+
+ if (len > 255) {
+ fprintf(stderr, "%s: internal error: invalid srec record size\n",
+ progname);
+ exit(1);
+ }
+
+ switch (alen) {
+ case 2:
+ addr &= 0xffff;
+ break;
+ case 3:
+ addr &= 0xffffff;
+ break;
+ case 4:
+ break;
+ default:
+ fprintf(stderr, "%s: internal error: invalid srec address length\n",
+ progname);
+ exit(1);
+ }
+
+ csum = (len+alen+1) + addr + (addr >> 8) + (addr >> 16) + (addr >> 24);
+ for (i = 0; i < len; i++)
+ csum += dptr[i];
+ csum = 0xff-csum;
+
+ p += sprintf(p, "S%c%02X%0*X", type, len+alen+1, alen*2, addr);
+ for (i = 0; i < len; i++)
+ p += sprintf(p, "%02X", dptr[i]);
+ p += sprintf(p, "%02X\n", csum);
+
+ if (fwrite(buf, 1, p-buf, f) != (size_t)(p-buf))
+ return -1;
+
+ return 0;
+}
+
+static int init_srec(FILE *f)
+{
+ return write_srecord(f, 0, 2, 0, '0', NULL);
+}
+
+static int fini_srec(FILE *f)
+{
+ /* XXX: entry point? */
+ return write_srecord(f, 0, 4, 0, '7', NULL);
+}
+
+static int output_srec(FILE *f, void *data, uint32_t bytes, uint32_t where)
+{
+ uint8_t *dbuf = data;
+ unsigned int chunk;
+
+ while (bytes) {
+ /* Output up to 32 bytes, but always end on an aligned boundary */
+ chunk = 32 - (where & 31);
+ if (bytes < chunk)
+ chunk = bytes;
+
+ if (write_srecord(f, chunk, 4, where, '3', dbuf))
+ return -1;
+
+ dbuf += chunk;
+ where += chunk;
+ bytes -= chunk;
+ }
+ return 0;
+}
+
+static struct output_format output_formats[] = {
+ { "bin", "wb", null_init_fini, output_bin, null_init_fini },
+ { "com", "wb", com_init, output_bin, null_init_fini },
+ { "ith", "wt", null_init_fini, output_ith, fini_ith },
+ { "ihx", "wt", null_init_fini, output_ith, fini_ith },
+ { "srec", "wt", init_srec, output_srec, fini_srec },
+ { NULL, NULL, NULL, NULL, NULL }
+};
+
+static const char *getformat(const char *pathname)
+{
+ const char *p;
+ static char fmt_buf[16];
+
+ /*
+ * Search backwards for the string "rdf2" followed by a string
+ * of alphanumeric characters. This should handle path prefixes,
+ * as well as extensions (e.g. C:\FOO\RDF2SREC.EXE).
+ */
+ for (p = strchr(pathname, '\0')-1 ; p >= pathname ; p--) {
+ if (!nasm_stricmp(p, "rdf2")) {
+ const char *q = p+4;
+ char *r = fmt_buf;
+ while (isalnum(*q) && r < fmt_buf+sizeof fmt_buf-1)
+ *r++ = *q++;
+ *r = '\0';
+ if (fmt_buf[0])
+ return fmt_buf;
+ }
+ }
+ return NULL;
+}
+
+static void usage(void)
+{
+ fprintf(stderr,
+ "Usage: %s [options] input-file output-file\n"
+ "Options:\n"
+ " -o origin Specify the relocation origin\n"
+ " -p alignment Specify minimum segment alignment\n"
+ " -f format Select format (bin, com, ith, srec)\n"
+ " -q Run quiet\n"
+ " -v Run verbose\n",
+ progname);
+}
+
+int main(int argc, char **argv)
+{
+ rdfmodule *m;
+ bool err;
+ FILE *of;
+ int codepad, datapad;
+ const char *format = NULL;
+ const struct output_format *fmt;
+ bool quiet = false;
+
+ progname = argv[0];
+
+ if (argc < 2) {
+ usage();
+ return 1;
+ }
+
+ rdoff_init();
+
+ argv++, argc--;
+
+ while (argc > 2) {
+ if (argv[0][0] == '-' && argv[0][1] && !argv[0][2]) {
+ switch (argv[0][1]) {
+ case 'o':
+ argv++, argc--;
+ origin = readnum(*argv, &err);
+ if (err) {
+ fprintf(stderr, "%s: invalid parameter: %s\n",
+ progname, *argv);
+ return 1;
+ }
+ origin_def = true;
+ break;
+ case 'p':
+ argv++, argc--;
+ align = readnum(*argv, &err);
+ if (err) {
+ fprintf(stderr, "%s: invalid parameter: %s\n",
+ progname, *argv);
+ return 1;
+ }
+ align_def = true;
+ break;
+ case 'f':
+ argv++, argc--;
+ format = *argv;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 'v':
+ quiet = false;
+ break;
+ case 'h':
+ usage();
+ return 0;
+ default:
+ fprintf(stderr, "%s: unknown option: %s\n",
+ progname, *argv);
+ return 1;
+ }
+ }
+ argv++, argc--;
+ }
+
+ if (argc < 2) {
+ usage();
+ return 1;
+ }
+
+ if (!format)
+ format = getformat(progname);
+
+ if (!format) {
+ fprintf(stderr, "%s: unable to determine desired output format\n",
+ progname);
+ return 1;
+ }
+
+ for (fmt = output_formats; fmt->name; fmt++) {
+ if (!nasm_stricmp(format, fmt->name))
+ break;
+ }
+
+ if (!fmt->name) {
+ fprintf(stderr, "%s: unknown output format: %s\n", progname, format);
+ return 1;
+ }
+
+ m = rdfload(*argv);
+
+ if (!m) {
+ rdfperror(progname, *argv);
+ return 1;
+ }
+
+ if (!quiet)
+ printf("relocating %s: origin=%"PRIx32", align=%d\n",
+ *argv, origin, align);
+
+ m->textrel = origin;
+ m->datarel = origin + m->f.seg[0].length;
+ if (m->datarel % align != 0) {
+ codepad = align - (m->datarel % align);
+ m->datarel += codepad;
+ } else
+ codepad = 0;
+
+ m->bssrel = m->datarel + m->f.seg[1].length;
+ if (m->bssrel % align != 0) {
+ datapad = align - (m->bssrel % align);
+ m->bssrel += datapad;
+ } else
+ datapad = 0;
+
+ if (!quiet)
+ printf("code: %08"PRIx32"\ndata: %08"PRIx32"\nbss: %08"PRIx32"\n",
+ m->textrel, m->datarel, m->bssrel);
+
+ rdf_relocate(m);
+
+ argv++;
+
+ of = fopen(*argv, fmt->mode);
+ if (!of) {
+ fprintf(stderr, "%s: could not open output file %s: %s\n",
+ progname, *argv, strerror(errno));
+ return 1;
+ }
+
+ if (fmt->init(of) ||
+ fmt->output(of, m->t, m->f.seg[0].length, m->textrel) ||
+ fmt->output(of, m->d, m->f.seg[1].length, m->datarel) ||
+ fmt->fini(of)) {
+ fprintf(stderr, "%s: error writing to %s: %s\n",
+ progname, *argv, strerror(errno));
+ return 1;
+ }
+
+ fclose(of);
+ return 0;
+}
diff --git a/rdoff/rdf2com.1 b/rdoff/rdf2com.1
new file mode 100644
index 00000000..43b33071
--- /dev/null
+++ b/rdoff/rdf2com.1
@@ -0,0 +1 @@
+.so man1/rdf2bin.1
diff --git a/rdoff/rdf2ihx.1 b/rdoff/rdf2ihx.1
new file mode 100644
index 00000000..43b33071
--- /dev/null
+++ b/rdoff/rdf2ihx.1
@@ -0,0 +1 @@
+.so man1/rdf2bin.1
diff --git a/rdoff/rdf2ith.1 b/rdoff/rdf2ith.1
new file mode 100644
index 00000000..43b33071
--- /dev/null
+++ b/rdoff/rdf2ith.1
@@ -0,0 +1 @@
+.so man1/rdf2bin.1
diff --git a/rdoff/rdf2srec.1 b/rdoff/rdf2srec.1
new file mode 100644
index 00000000..43b33071
--- /dev/null
+++ b/rdoff/rdf2srec.1
@@ -0,0 +1 @@
+.so man1/rdf2bin.1
diff --git a/rdoff/rdfdump.1 b/rdoff/rdfdump.1
new file mode 100644
index 00000000..cf61484d
--- /dev/null
+++ b/rdoff/rdfdump.1
@@ -0,0 +1,24 @@
+.TH RDFDUMP 1 "September 6, 1999" "Debian Project" "Debian Manual"
+.SH NAME
+rdfdump \- dumps an RDOFF object in human-readable form
+.SH SYNOPSIS
+.B rdfdump
+[-v]
+.RI < filename >
+.SH DESCRIPTION
+.B rdfdump
+prints a list of the header records in an RDOFF object in human-readable
+form, and optionally prints a hex dump of the contents of the segments.
+.PP
+.B rdfdump
+supports both version 1 and 2 of RDOFF. It will give warnings if the RDOFF2
+format is violated (it looks for incorrect lengths for header records, and
+checks the overall length count at the start of the file).
+.SH OPTIONS
+.TP
+-v
+Print a hex dump of the contents of the segments.
+.SH AUTHORS
+Julian Hall <jules@earthcorp.com>.
+.PP
+This manual page was written by Matej Vela <vela@debian.org>.
diff --git a/rdoff/rdfdump.c b/rdoff/rdfdump.c
new file mode 100644
index 00000000..b483477b
--- /dev/null
+++ b/rdoff/rdfdump.c
@@ -0,0 +1,347 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdfdump.c - dump RDOFF file header.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rdfutils.h"
+
+#define PROGRAM_VERSION "2.3"
+
+FILE *infile;
+
+static void print_header(int32_t length, int rdf_version)
+{
+ char buf[129], t, l, s, flags;
+ uint8_t reclen;
+ int32_t o, ll;
+ uint16_t rs;
+
+ while (length > 0) {
+ nasm_read(&t, 1, infile);
+ if (rdf_version >= 2) {
+ nasm_read(&reclen, 1, infile);
+ }
+ switch (t) {
+ case RDFREC_GENERIC: /* generic record */
+ printf(" generic record (length=%d)\n", (int)reclen);
+ fseek(infile, reclen, SEEK_CUR);
+ break;
+
+ case RDFREC_RELOC: /* relocation record */
+ case RDFREC_SEGRELOC: /* segment relocation */
+ nasm_read(&s, 1, infile);
+ nasm_read(&o, 4, infile);
+ nasm_read(&l, 1, infile);
+ nasm_read(&rs, 2, infile);
+ printf(" %s: location (%04x:%08"PRIx32"), length %d, "
+ "referred seg %04x\n",
+ t == 1 ? "relocation" : "seg relocation", (int)s,
+ translateint32_t(o), (int)l, translateint16_t(rs));
+ if (rdf_version >= 2 && reclen != 8)
+ printf(" warning: reclen != 8\n");
+ if (rdf_version == 1)
+ length -= 9;
+ if (rdf_version == 1 && t == 6)
+ printf
+ (" warning: seg relocation not supported in RDOFF1\n");
+ break;
+
+ case RDFREC_IMPORT: /* import record */
+ case RDFREC_FARIMPORT: /* import far symbol */
+ nasm_read(&flags, 1, infile);
+ nasm_read(&rs, 2, infile);
+ ll = 0;
+
+ if (rdf_version == 1) {
+ do {
+ nasm_read(&buf[ll], 1, infile);
+ } while (buf[ll++]);
+ } else {
+ for (; ll < reclen - 3; ll++)
+ nasm_read(&buf[ll], 1, infile);
+ }
+
+ if (t == 7)
+ printf("far ");
+ printf((flags & SYM_IMPORT) ? " import" : " extern");
+ if (flags & SYM_FUNCTION)
+ printf(" proc");
+ if (flags & SYM_DATA)
+ printf(" data");
+ printf(": segment %04x = %s\n", translateint16_t(rs), buf);
+ if (rdf_version == 1)
+ length -= ll + 3;
+ if (rdf_version == 1 && t == 7)
+ printf
+ (" warning: far import not supported in RDOFF1\n");
+ break;
+
+ case RDFREC_GLOBAL: /* export record */
+ nasm_read(&flags, 1, infile);
+ nasm_read(&s, 1, infile);
+ nasm_read(&o, 4, infile);
+ ll = 0;
+
+ if (rdf_version == 1) {
+ do {
+ nasm_read(&buf[ll], 1, infile);
+ } while (buf[ll++]);
+ } else {
+ for (; ll < reclen - 6; ll++)
+ nasm_read(&buf[ll], 1, infile);
+ }
+ printf((flags & SYM_GLOBAL) ? " export" : " public");
+ if (flags & SYM_FUNCTION)
+ printf(" proc");
+ if (flags & SYM_DATA)
+ printf(" data");
+ printf(": (%04x:%08"PRIx32") = %s\n", (int)s, translateint32_t(o), buf);
+ if (rdf_version == 1)
+ length -= ll + 6;
+ break;
+
+ case RDFREC_DLL: /* DLL and Module records */
+ case RDFREC_MODNAME:
+ ll = 0;
+ if (rdf_version == 1) {
+ do {
+ nasm_read(&buf[ll], 1, infile);
+ } while (buf[ll++]);
+ } else {
+ for (; ll < reclen; ll++)
+ nasm_read(&buf[ll], 1, infile);
+ }
+ if (t == 4)
+ printf(" dll: %s\n", buf);
+ else
+ printf(" module: %s\n", buf);
+ if (rdf_version == 1)
+ length -= ll + 1;
+ break;
+
+ case RDFREC_BSS: /* BSS reservation */
+ nasm_read(&ll, 4, infile);
+ printf(" bss reservation: %08"PRIx32" bytes\n", translateint32_t(ll));
+ if (rdf_version == 1)
+ length -= 5;
+ if (rdf_version > 1 && reclen != 4)
+ printf(" warning: reclen != 4\n");
+ break;
+
+ case RDFREC_COMMON:{
+ uint16_t seg, align;
+ uint32_t size;
+
+ nasm_read(&seg, 2, infile);
+ nasm_read(&size, 4, infile);
+ nasm_read(&align, 2, infile);
+ for (ll = 0; ll < reclen - 8; ll++)
+ nasm_read(buf + ll, 1, infile);
+ printf(" common: segment %04x = %s, %"PRId32":%d\n",
+ translateint16_t(seg), buf, translateint32_t(size),
+ translateint16_t(align));
+ break;
+ }
+
+ default:
+ printf(" unrecognized record (type %d", (int)t);
+ if (rdf_version > 1) {
+ printf(", length %d", (int)reclen);
+ fseek(infile, reclen, SEEK_CUR);
+ } else
+ length--;
+ printf(")\n");
+ }
+ if (rdf_version != 1)
+ length -= 2 + reclen;
+ }
+}
+
+int main(int argc, char **argv)
+{
+ char id[7];
+ int32_t l;
+ uint16_t s;
+ int verbose = 0;
+ int32_t offset;
+ int foundnullsegment = 0;
+ int version;
+ int32_t segmentcontentlength = 0;
+ int nsegments = 0;
+ int32_t headerlength = 0;
+ int32_t objectlength = 0;
+
+ printf("RDOFF dump utility, version %s\n", PROGRAM_VERSION);
+ printf("RDOFF2 revision %s\n", RDOFF2_REVISION);
+ puts("Copyright (c) 1996,99 Julian R Hall\n"
+ "Improvements and fixes (c) 2002-2004 RET & COM Research.");
+
+ if (argc < 2) {
+ fputs("Usage: rdfdump [-v] <filename>\n", stderr);
+ exit(1);
+ }
+
+ rdoff_init();
+
+ if (!strcmp(argv[1], "-v")) {
+ verbose = 1;
+ if (argc < 3) {
+ fputs("required parameter missing\n", stderr);
+ exit(1);
+ }
+ argv++;
+ }
+
+ infile = fopen(argv[1], "rb");
+ if (!infile) {
+ fprintf(stderr, "rdfdump: Could not open %s\n", argv[1]);
+ exit(1);
+ }
+
+ nasm_read(id, 6, infile);
+ if (strncmp(id, "RDOFF", 5)) {
+ fputs("rdfdump: File does not contain valid RDOFF header\n",
+ stderr);
+ exit(1);
+ }
+
+ printf("File %s: RDOFF version %c\n\n", argv[1], id[5]);
+ if (id[5] < '1' || id[5] > '2') {
+ fprintf(stderr, "rdfdump: unknown RDOFF version '%c'\n", id[5]);
+ exit(1);
+ }
+ version = id[5] - '0';
+
+ if (version > 1) {
+ nasm_read(&l, 4, infile);
+ objectlength = translateint32_t(l);
+ printf("Object content size: %"PRId32" bytes\n", objectlength);
+ }
+
+ nasm_read(&l, 4, infile);
+ headerlength = translateint32_t(l);
+ printf("Header (%"PRId32" bytes):\n", headerlength);
+ print_header(headerlength, version);
+
+ if (version == 1) {
+ nasm_read(&l, 4, infile);
+ l = translateint32_t(l);
+ printf("\nText segment length = %"PRId32" bytes\n", l);
+ offset = 0;
+ while (l--) {
+ nasm_read(id, 1, infile);
+ if (verbose) {
+ if (offset % 16 == 0)
+ printf("\n%08"PRIx32" ", offset);
+ printf(" %02x", (int)(uint8_t)id[0]);
+ offset++;
+ }
+ }
+ if (verbose)
+ printf("\n\n");
+
+ nasm_read(&l, 4, infile);
+ l = translateint32_t(l);
+ printf("Data segment length = %"PRId32" bytes\n", l);
+
+ if (verbose) {
+ offset = 0;
+ while (l--) {
+ nasm_read(id, 1, infile);
+ if (offset % 16 == 0)
+ printf("\n%08"PRIx32" ", offset);
+ printf(" %02x", (int)(uint8_t)id[0]);
+ offset++;
+ }
+ printf("\n");
+ }
+ } else {
+ do {
+ nasm_read(&s, 2, infile);
+ s = translateint16_t(s);
+ if (!s) {
+ printf("\nNULL segment\n");
+ foundnullsegment = 1;
+ break;
+ }
+ printf("\nSegment:\n Type = %04X (%s)\n", (int)s,
+ translatesegmenttype(s));
+ nsegments++;
+
+ nasm_read(&s, 2, infile);
+ printf(" Number = %04X\n", (int)translateint16_t(s));
+ nasm_read(&s, 2, infile);
+ printf(" Resrvd = %04X\n", (int)translateint16_t(s));
+ nasm_read(&l, 4, infile);
+ l = translateint32_t(l);
+ printf(" Length = %"PRId32" bytes\n", l);
+ segmentcontentlength += l;
+
+ offset = 0;
+ while (l--) {
+ nasm_read(id, 1, infile);
+ if (verbose) {
+ if (offset % 16 == 0)
+ printf("\n%08"PRIx32" ", offset);
+ printf(" %02x", (int)(uint8_t)id[0]);
+ offset++;
+ }
+ }
+ if (verbose)
+ printf("\n");
+ } while (!feof(infile));
+ if (!foundnullsegment)
+ printf("\nWarning: unexpected end of file - "
+ "NULL segment not found\n");
+
+ printf("\nTotal number of segments: %d\n", nsegments);
+ printf("Total segment content length: %"PRId32" bytes\n",
+ segmentcontentlength);
+
+ /* calculate what the total object content length should have been */
+ l = segmentcontentlength + 10 * (nsegments + 1) + headerlength + 4;
+ if (l != objectlength)
+ printf("Warning: actual object length (%"PRId32") != "
+ "stored object length (%"PRId32")\n", l, objectlength);
+ }
+ fclose(infile);
+ return 0;
+}
diff --git a/rdoff/rdflib.1 b/rdoff/rdflib.1
new file mode 100644
index 00000000..bba1032a
--- /dev/null
+++ b/rdoff/rdflib.1
@@ -0,0 +1,39 @@
+.TH RDFLIB 1 "September 6, 1999" "Debian Project" "Debian Manual"
+.SH NAME
+rdflib \- manage a library file for use with ldrdf(1)
+.SH SYNOPSIS
+.B rdflib
+.I command
+.I arguments
+.SH DESCRIPTION
+.B rdflib
+manages a library file which can be used by
+.BR ldrdf (1).
+It is supplied with a shell script
+.B makelib
+which should probably be used to create libraries.
+.SH COMMANDS
+.TP
+.BI c " library-file"
+Create (or truncate) a library.
+.TP
+.BI a " library-file object-file module"
+Add the
+.I object-file
+to the library under the name
+.IR module .
+.TP
+.BI x " library-file module object-file"
+Extract a
+.I module
+from the library to the file
+.IR object-file .
+.TP
+.B t " library-file"
+Display a list of modules in the library.
+.SH NOTES
+A remove command will be added soon.
+.SH AUTHORS
+Julian Hall <jules@earthcorp.com>.
+.PP
+This manual page was written by Matej Vela <vela@debian.org>.
diff --git a/rdoff/rdflib.c b/rdoff/rdflib.c
new file mode 100644
index 00000000..8dbff4af
--- /dev/null
+++ b/rdoff/rdflib.c
@@ -0,0 +1,437 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/* rdflib - manipulate RDOFF library files (.rdl) */
+
+/*
+ * an rdoff library is simply a sequence of RDOFF object files, each
+ * preceded by the name of the module, an ASCII string of up to 255
+ * characters, terminated by a zero.
+ *
+ * When a library is being created, special signature block is placed
+ * in the beginning of the file. It is a string 'RDLIB' followed by a
+ * version number, then int32_t content size and a int32_t time stamp.
+ * The module name of the signature block is '.sig'.
+ *
+ *
+ * There may be an optional directory placed on the end of the file.
+ * The format of the directory will be 'RDLDD' followed by a version
+ * number, followed by the length of the directory, and then the
+ * directory, the format of which has not yet been designed.
+ * The module name of the directory must be '.dir'.
+ *
+ * All module names beginning with '.' are reserved for possible future
+ * extensions. The linker ignores all such modules, assuming they have
+ * the format of a six uint8_t type & version identifier followed by int32_t
+ * content size, followed by data.
+ */
+
+#include "compiler.h"
+#include "rdfutils.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+
+/* functions supported:
+ * create a library (no extra operands required)
+ * add a module from a library (requires filename and name to give mod.)
+ * replace a module in a library (requires given name and filename)
+ * delete a module from a library (requires given name)
+ * extract a module from the library (requires given name and filename)
+ * list modules
+ */
+
+const char *usage =
+ "usage:\n"
+ " rdflib x libname [extra operands]\n\n"
+ " where x is one of:\n"
+ " c - create library\n"
+ " a - add module (operands = filename module-name)\n"
+ " x - extract (module-name filename)\n"
+ " r - replace (module-name filename)\n"
+ " d - delete (module-name)\n" " t - list\n";
+
+/* Library signature */
+const char *rdl_signature = "RDLIB2", *sig_modname = ".sig";
+
+char **_argv;
+
+#define _ENDIANNESS 0 /* 0 for little, 1 for big */
+
+static void int32_ttolocal(int32_t *l)
+{
+#if _ENDIANNESS
+ uint8_t t;
+ uint8_t *p = (uint8_t *)l;
+
+ t = p[0];
+ p[0] = p[3];
+ p[3] = t;
+ t = p[1];
+ p[1] = p[2];
+ p[2] = p[1];
+#else
+ (void)l; /* placate optimizers */
+#endif
+}
+
+static char copybytes(FILE * fp, FILE * fp2, int n)
+{
+ int i, t = 0;
+
+ for (i = 0; i < n; i++) {
+ t = fgetc(fp);
+ if (t == EOF) {
+ fprintf(stderr, "rdflib: premature end of file in '%s'\n",
+ _argv[2]);
+ exit(1);
+ }
+ if (fp2)
+ if (fputc(t, fp2) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ }
+ return (char)t; /* return last char read */
+}
+
+static int32_t copyint32_t(FILE * fp, FILE * fp2)
+{
+ int32_t l;
+ int i, t;
+ uint8_t *p = (uint8_t *)&l;
+
+ for (i = 0; i < 4; i++) { /* skip magic no */
+ t = fgetc(fp);
+ if (t == EOF) {
+ fprintf(stderr, "rdflib: premature end of file in '%s'\n",
+ _argv[2]);
+ exit(1);
+ }
+ if (fp2)
+ if (fputc(t, fp2) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ *p++ = t;
+ }
+ int32_ttolocal(&l);
+ return l;
+}
+
+int main(int argc, char **argv)
+{
+ FILE *fp, *fp2 = NULL, *fptmp;
+ char *p, buf[256], c;
+ int i;
+ int32_t l;
+ time_t t;
+ char rdbuf[10];
+
+ _argv = argv;
+
+ if (argc < 3 || !strncmp(argv[1], "-h", 2)
+ || !strncmp(argv[1], "--h", 3)) {
+ fputs(usage, stdout);
+ exit(1);
+ }
+
+ rdoff_init();
+
+ switch (argv[1][0]) {
+ case 'c': /* create library */
+ fp = fopen(argv[2], "wb");
+ if (!fp) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[2]);
+ perror("rdflib");
+ exit(1);
+ }
+ nasm_write(sig_modname, strlen(sig_modname) + 1, fp);
+ nasm_write(rdl_signature, strlen(rdl_signature), fp);
+ t = time(NULL);
+ fwriteint32_t(t, fp);
+ fclose(fp);
+ break;
+
+ case 'a': /* add module */
+ if (argc < 5) {
+ fprintf(stderr, "rdflib: required parameter missing\n");
+ exit(1);
+ }
+ fp = fopen(argv[2], "ab");
+ if (!fp) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[2]);
+ perror("rdflib");
+ exit(1);
+ }
+
+ fp2 = fopen(argv[3], "rb");
+ if (!fp2) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[3]);
+ perror("rdflib");
+ exit(1);
+ }
+
+ p = argv[4];
+ do {
+ if (fputc(*p, fp) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ } while (*p++);
+
+ while (!feof(fp2)) {
+ i = fgetc(fp2);
+ if (i == EOF) {
+ break;
+ }
+
+ if (fputc(i, fp) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ }
+ fclose(fp2);
+ fclose(fp);
+ break;
+
+ case 'x':
+ if (argc < 5) {
+ fprintf(stderr, "rdflib: required parameter missing\n");
+ exit(1);
+ }
+ break;
+ case 't':
+ fp = fopen(argv[2], "rb");
+ if (!fp) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[2]);
+ perror("rdflib");
+ exit(1);
+ }
+
+ fp2 = NULL;
+ while (!feof(fp)) {
+ /* read name */
+ p = buf;
+ while ((*(p++) = (char)fgetc(fp)))
+ if (feof(fp))
+ break;
+
+ if (feof(fp))
+ break;
+
+ fp2 = NULL;
+ if (argv[1][0] == 'x') {
+ /* check against desired name */
+ if (!strcmp(buf, argv[3])) {
+ fp2 = fopen(argv[4], "wb");
+ if (!fp2) {
+ fprintf(stderr, "rdflib: could not open '%s'\n",
+ argv[4]);
+ perror("rdflib");
+ exit(1);
+ }
+ }
+ } else
+ printf("%-40s ", buf);
+
+ /* step over the RDOFF file, extracting type information for
+ * the listing, and copying it if fp2 != NULL */
+
+ if (buf[0] == '.') {
+
+ if (argv[1][0] == 't')
+ for (i = 0; i < 6; i++)
+ printf("%c", copybytes(fp, fp2, 1));
+ else
+ copybytes(fp, fp2, 6);
+
+ l = copyint32_t(fp, fp2);
+
+ if (argv[1][0] == 't')
+ printf(" %"PRId32" bytes content\n", l);
+
+ copybytes(fp, fp2, l);
+ } else if ((c = copybytes(fp, fp2, 6)) >= '2') { /* version 2 or above */
+ l = copyint32_t(fp, fp2);
+
+ if (argv[1][0] == 't')
+ printf("RDOFF%c %"PRId32" bytes content\n", c, l);
+ copybytes(fp, fp2, l); /* entire object */
+ } else {
+ if (argv[1][0] == 't')
+ printf("RDOFF1\n");
+ /*
+ * version 1 object, so we don't have an object content
+ * length field.
+ */
+ copybytes(fp, fp2, copyint32_t(fp, fp2)); /* header */
+ copybytes(fp, fp2, copyint32_t(fp, fp2)); /* text */
+ copybytes(fp, fp2, copyint32_t(fp, fp2)); /* data */
+ }
+
+ if (fp2)
+ break;
+ }
+ fclose(fp);
+ if (fp2)
+ fclose(fp2);
+ else if (argv[1][0] == 'x') {
+ fprintf(stderr, "rdflib: module '%s' not found in '%s'\n",
+ argv[3], argv[2]);
+ exit(1);
+ }
+ break;
+
+ case 'r': /* replace module */
+ argc--;
+ /* fall through */
+
+ case 'd': /* delete module */
+ if (argc < 4) {
+ fprintf(stderr, "rdflib: required parameter missing\n");
+ exit(1);
+ }
+
+ fp = fopen(argv[2], "rb");
+ if (!fp) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[2]);
+ perror("rdflib");
+ exit(1);
+ }
+
+ if (argv[1][0] == 'r') {
+ fp2 = fopen(argv[4], "rb");
+ if (!fp2) {
+ fprintf(stderr, "rdflib: could not open '%s'\n", argv[4]);
+ perror("rdflib");
+ exit(1);
+ }
+ }
+
+ fptmp = tmpfile();
+ if (!fptmp) {
+ fprintf(stderr, "rdflib: could not open temporary file\n");
+ perror("rdflib");
+ exit(1);
+ }
+
+ /* copy library into temporary file */
+ fseek(fp, 0, SEEK_END); /* get file length */
+ l = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+ copybytes(fp, fptmp, l);
+ rewind(fptmp);
+ if (freopen(argv[2], "wb", fp) == NULL) {
+ fprintf(stderr, "rdflib: could not reopen '%s'\n", argv[2]);
+ perror("rdflib");
+ exit(1);
+ }
+
+ while (!feof(fptmp)) {
+ /* read name */
+ p = buf;
+ while ((*(p++) = (char)fgetc(fptmp)))
+ if (feof(fptmp))
+ break;
+
+ if (feof(fptmp))
+ break;
+
+ /* check against desired name */
+ if (!strcmp(buf, argv[3])) {
+ if (fread(p = rdbuf, 1, sizeof(rdbuf), fptmp) < 10) {
+ nasm_fatal("short read on input");
+ }
+ l = *(int32_t *)(p + 6);
+ fseek(fptmp, l, SEEK_CUR);
+ break;
+ } else {
+ nasm_write(buf, strlen(buf) + 1, fp); /* module name */
+ if ((c = copybytes(fptmp, fp, 6)) >= '2') {
+ l = copyint32_t(fptmp, fp); /* version 2 or above */
+ copybytes(fptmp, fp, l); /* entire object */
+ }
+ }
+ }
+
+ if (argv[1][0] == 'r') {
+ /* copy new module into library */
+ p = argv[3];
+ do {
+ if (fputc(*p, fp) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ } while (*p++);
+
+ while (!feof(fp2)) {
+ i = fgetc(fp2);
+ if (i == EOF) {
+ break;
+ }
+ if (fputc(i, fp) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ }
+ fclose(fp2);
+ }
+
+ /* copy rest of library if any */
+ while (!feof(fptmp)) {
+ i = fgetc(fptmp);
+ if (i == EOF) {
+ break;
+ }
+
+ if (fputc(i, fp) == EOF) {
+ fprintf(stderr, "rdflib: write error\n");
+ exit(1);
+ }
+ }
+
+ fclose(fp);
+ fclose(fptmp);
+ break;
+
+ default:
+ fprintf(stderr, "rdflib: command '%c' not recognized\n",
+ argv[1][0]);
+ exit(1);
+ }
+ return 0;
+}
diff --git a/rdoff/rdfload.c b/rdoff/rdfload.c
new file mode 100644
index 00000000..6977a707
--- /dev/null
+++ b/rdoff/rdfload.c
@@ -0,0 +1,213 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdfload.c RDOFF Object File loader library
+ */
+
+/*
+ * TODO: this has been modified from previous version only in very
+ * simplistic ways. Needs to be improved drastically, especially:
+ * - support for more than the 2 standard segments
+ * - support for segment relocations (hard to do in ANSI C)
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rdfload.h"
+#include "symtab.h"
+#include "collectn.h"
+
+extern int rdf_errno;
+
+rdfmodule *rdfload(const char *filename)
+{
+ rdfmodule *f;
+ int32_t bsslength = 0;
+ char *hdr;
+ rdfheaderrec *r;
+
+ f = nasm_malloc(sizeof(rdfmodule));
+ if (f == NULL) {
+ rdf_errno = RDF_ERR_NOMEM;
+ return NULL;
+ }
+
+ f->symtab = symtabNew();
+ if (!f->symtab) {
+ nasm_free(f);
+ rdf_errno = RDF_ERR_NOMEM;
+ return NULL;
+ }
+
+ /* open the file */
+ if (rdfopen(&(f->f), filename)) {
+ nasm_free(f);
+ return NULL;
+ }
+
+ /* read in text and data segments, and header */
+
+ f->t = nasm_malloc(f->f.seg[0].length);
+ f->d = nasm_malloc(f->f.seg[1].length); /* BSS seg allocated later */
+ hdr = nasm_malloc(f->f.header_len);
+
+ if (!f->t || !f->d || !hdr) {
+ rdf_errno = RDF_ERR_NOMEM;
+ rdfclose(&f->f);
+ if (f->t)
+ nasm_free(f->t);
+ if (f->d)
+ nasm_free(f->d);
+ nasm_free(f);
+ nasm_free(hdr);
+ return NULL;
+ }
+
+ if (rdfloadseg(&f->f, RDOFF_HEADER, hdr) ||
+ rdfloadseg(&f->f, RDOFF_CODE, f->t) ||
+ rdfloadseg(&f->f, RDOFF_DATA, f->d)) {
+ rdfclose(&f->f);
+ nasm_free(f->t);
+ nasm_free(f->d);
+ nasm_free(f);
+ nasm_free(hdr);
+ return NULL;
+ }
+
+ rdfclose(&f->f);
+
+ /* Allocate BSS segment; step through header and count BSS records */
+
+ while ((r = rdfgetheaderrec(&f->f))) {
+ if (r->type == 5)
+ bsslength += r->b.amount;
+ }
+
+ f->b = nasm_malloc(bsslength);
+ if (bsslength && (!f->b)) {
+ nasm_free(f->t);
+ nasm_free(f->d);
+ nasm_free(f);
+ nasm_free(hdr);
+ rdf_errno = RDF_ERR_NOMEM;
+ return NULL;
+ }
+
+ rdfheaderrewind(&f->f);
+
+ f->textrel = (int32_t)(size_t)f->t;
+ f->datarel = (int32_t)(size_t)f->d;
+ f->bssrel = (int32_t)(size_t)f->b;
+
+ return f;
+}
+
+int rdf_relocate(rdfmodule * m)
+{
+ rdfheaderrec *r;
+ Collection imports;
+ symtabEnt e;
+ int32_t rel;
+ uint8_t *seg;
+
+ rdfheaderrewind(&m->f);
+ collection_init(&imports);
+
+ while ((r = rdfgetheaderrec(&m->f))) {
+ switch (r->type) {
+ case 1: /* Relocation record */
+
+ /* calculate relocation factor */
+
+ if (r->r.refseg == 0)
+ rel = m->textrel;
+ else if (r->r.refseg == 1)
+ rel = m->datarel;
+ else if (r->r.refseg == 2)
+ rel = m->bssrel;
+ else
+ /* We currently do not support load-time linkage.
+ This should be added some time soon... */
+
+ return 1; /* return error code */
+
+ if ((r->r.segment & 63) == 0)
+ seg = m->t;
+ else if ((r->r.segment & 63) == 1)
+ seg = m->d;
+ else
+ continue; /* relocation not in a loaded segment */
+
+ /* it doesn't matter in this case that the code is non-portable,
+ as the entire concept of executing a module like this is
+ non-portable */
+ switch (r->r.length) {
+ case 1:
+ seg[r->r.offset] += (char)rel;
+ break;
+ case 2:
+ *(uint16_t *) (seg + r->r.offset) += (uint16_t) rel;
+ break;
+ case 4:
+ *(int32_t *)(seg + r->r.offset) += rel;
+ break;
+ }
+ break;
+
+ case 3: /* export record - add to symtab */
+ e.segment = r->e.segment;
+ e.offset = r->e.offset + (e.segment == 0 ? m->textrel : /* 0 -> code */
+ e.segment == 1 ? m->datarel : /* 1 -> data */
+ m->bssrel); /* 2 -> bss */
+ e.flags = 0;
+ e.name = nasm_malloc(strlen(r->e.label) + 1);
+ if (!e.name)
+ return 1;
+
+ strcpy(e.name, r->e.label);
+ symtabInsert(m->symtab, &e);
+ break;
+
+ case 6: /* segment relocation */
+ fprintf(stderr, "%s: segment relocation not supported by this "
+ "loader\n", m->f.name);
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/rdoff/rdfload.h b/rdoff/rdfload.h
new file mode 100644
index 00000000..1ca5e92d
--- /dev/null
+++ b/rdoff/rdfload.h
@@ -0,0 +1,29 @@
+/* rdfload.h RDOFF Object File loader library header file
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the license given in the file "LICENSE"
+ * distributed in the NASM archive.
+ *
+ * See the file 'rdfload.c' for special license information for this
+ * file.
+ */
+
+#ifndef RDOFF_RDFLOAD_H
+#define RDOFF_RDFLOAD_H 1
+
+#include "rdfutils.h"
+
+typedef struct RDFModuleStruct {
+ rdffile f; /* file structure */
+ uint8_t *t, *d, *b; /* text, data, and bss segments */
+ uint32_t textrel;
+ uint32_t datarel;
+ uint32_t bssrel;
+ void *symtab;
+} rdfmodule;
+
+rdfmodule *rdfload(const char *filename);
+int rdf_relocate(rdfmodule * m);
+
+#endif
diff --git a/rdoff/rdfutils.h b/rdoff/rdfutils.h
new file mode 100644
index 00000000..27f21443
--- /dev/null
+++ b/rdoff/rdfutils.h
@@ -0,0 +1,165 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdfutils.h
+ *
+ * Internal header file for RDOFF utilities
+ */
+
+#ifndef RDOFF_RDFUTILS_H
+#define RDOFF_RDFUTILS_H 1
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "error.h"
+#include "rdoff.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef union RDFHeaderRec {
+ char type; /* invariant throughout all below */
+ struct GenericRec g; /* type 0 */
+ struct RelocRec r; /* type == 1 / 6 */
+ struct ImportRec i; /* type == 2 / 7 */
+ struct ExportRec e; /* type == 3 */
+ struct DLLRec d; /* type == 4 */
+ struct BSSRec b; /* type == 5 */
+ struct ModRec m; /* type == 8 */
+ struct CommonRec c; /* type == 10 */
+} rdfheaderrec;
+
+struct SegmentHeaderRec {
+ /* information from file */
+ uint16_t type;
+ uint16_t number;
+ uint16_t reserved;
+ int32_t length;
+
+ /* information built up here */
+ int32_t offset;
+ uint8_t *data; /* pointer to segment data if it exists in memory */
+};
+
+typedef struct RDFFileInfo {
+ FILE *fp; /* file descriptor; must be open to use this struct */
+ int rdoff_ver; /* should be 1; any higher => not guaranteed to work */
+ int32_t header_len;
+ int32_t header_ofs;
+
+ uint8_t *header_loc; /* keep location of header */
+ int32_t header_fp; /* current location within header for reading */
+
+ struct SegmentHeaderRec seg[RDF_MAXSEGS];
+ int nsegs;
+
+ int32_t eof_offset; /* offset of the first uint8_t beyond the end of this
+ module */
+
+ char *name; /* name of module in libraries */
+ int *refcount; /* pointer to reference count on file, or NULL */
+} rdffile;
+
+#define BUF_BLOCK_LEN 4088 /* selected to match page size (4096)
+ * on 80x86 machines for efficiency */
+typedef struct memorybuffer {
+ int length;
+ uint8_t buffer[BUF_BLOCK_LEN];
+ struct memorybuffer *next;
+} memorybuffer;
+
+typedef struct {
+ memorybuffer *buf; /* buffer containing header records */
+ int nsegments; /* number of segments to be written */
+ int32_t seglength; /* total length of all the segments */
+} rdf_headerbuf;
+
+/* segments used by RDOFF, understood by rdoffloadseg */
+#define RDOFF_CODE 0
+#define RDOFF_DATA 1
+#define RDOFF_HEADER -1
+/* mask for 'segment' in relocation records to find if relative relocation */
+#define RDOFF_RELATIVEMASK 64
+/* mask to find actual segment value in relocation records */
+#define RDOFF_SEGMENTMASK 63
+
+extern int rdf_errno;
+
+/* rdf_errno can hold these error codes */
+enum {
+ /* 0 */ RDF_OK,
+ /* 1 */ RDF_ERR_OPEN,
+ /* 2 */ RDF_ERR_FORMAT,
+ /* 3 */ RDF_ERR_READ,
+ /* 4 */ RDF_ERR_UNKNOWN,
+ /* 5 */ RDF_ERR_HEADER,
+ /* 6 */ RDF_ERR_NOMEM,
+ /* 7 */ RDF_ERR_VER,
+ /* 8 */ RDF_ERR_RECTYPE,
+ /* 9 */ RDF_ERR_RECLEN,
+ /* 10 */ RDF_ERR_SEGMENT
+};
+
+/* library init */
+void rdoff_init(void);
+
+/* utility functions */
+int32_t translateint32_t(int32_t in);
+uint16_t translateint16_t(uint16_t in);
+char *translatesegmenttype(uint16_t type);
+
+/* RDOFF file manipulation functions */
+int rdfopen(rdffile * f, const char *name);
+int rdfopenhere(rdffile * f, FILE * fp, int *refcount, const char *name);
+int rdfclose(rdffile * f);
+int rdffindsegment(rdffile * f, int segno);
+int rdfloadseg(rdffile * f, int segment, void *buffer);
+rdfheaderrec *rdfgetheaderrec(rdffile * f); /* returns static storage */
+void rdfheaderrewind(rdffile * f); /* back to start of header */
+void rdfperror(const char *app, const char *name);
+
+/* functions to write a new RDOFF header to a file -
+ use rdfnewheader to allocate a header, rdfaddheader to add records to it,
+ rdfaddsegment to notify the header routines that a segment exists, and
+ to tell it how int32_t the segment will be.
+ rdfwriteheader to write the file id, object length, and header
+ to a file, and then rdfdoneheader to dispose of the header */
+
+rdf_headerbuf *rdfnewheader(void);
+int rdfaddheader(rdf_headerbuf * h, rdfheaderrec * r);
+int rdfaddsegment(rdf_headerbuf * h, int32_t seglength);
+int rdfwriteheader(FILE * fp, rdf_headerbuf * h);
+void rdfdoneheader(rdf_headerbuf * h);
+
+#endif /* RDOFF_RDFUTILS_H */
diff --git a/rdoff/rdlar.c b/rdoff/rdlar.c
new file mode 100644
index 00000000..419d2d0d
--- /dev/null
+++ b/rdoff/rdlar.c
@@ -0,0 +1,492 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdlar.c - new librarian/archiver for RDOFF2.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "rdlar.h"
+
+#define PROGRAM_VERSION "0.1"
+
+/** Constants **/
+const char commands[] = "adnrtx";
+const char modifiers[] = "cflouvV";
+
+/** Global variables **/
+char *progname = "rdlar";
+char **_argv = NULL;
+struct {
+ bool createok;
+ bool usefname;
+ bool align;
+ bool odate;
+ bool fresh;
+ int verbose;
+} options = {
+0, 0, 0, 0, 0, 0};
+
+#define _ENDIANNESS 0 /* 0 for little, 1 for big */
+
+/*
+ * Convert int32_t to little endian (if we were compiled on big-endian machine)
+ */
+static void int32_ttolocal(int32_t *l)
+{
+#if _ENDIANNESS
+ uint8_t t;
+ uint8_t *p = (uint8_t *)l;
+
+ t = p[0];
+ p[0] = p[3];
+ p[3] = t;
+ t = p[1];
+ p[1] = p[2];
+ p[2] = p[1];
+#endif
+}
+
+/*
+ * Print version information
+ */
+void show_version(void)
+{
+ puts("New RDOFF2 librarian/archiver, version " PROGRAM_VERSION);
+}
+
+/*
+ * Print usage instructions
+ */
+void usage(void)
+{
+ printf("Usage: %s [-]{%s}[%s] libfile [module-name] [files]\n",
+ progname, commands, modifiers);
+ puts(" commands:\n"
+ " a - add module(s) to the library\n"
+ " d - delete module(s) from the library\n"
+ " n - create the library\n"
+ " r - replace module(s)\n"
+ " t - display contents of library\n"
+ " x - extract module(s)\n"
+ " command specific modifiers:\n"
+ " o - preserve original dates\n"
+ " u - only replace modules that are newer than library contents\n"
+ " generic modifiers:\n"
+ " c - do not warn if the library had to be created\n"
+ " f - use file name as a module name\n"
+ " v - be verbose\n"
+ " V - display version information");
+}
+
+/*
+ * Print an error message and exit
+ */
+void error_exit(int errcode, bool useperror, const char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, "%s: ", progname);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ putc('\n', stderr);
+ if (useperror)
+ perror(progname);
+ exit(errcode);
+}
+
+/*
+ * Fill in and write a header
+ */
+void put_header(struct rdlm_hdr *hdr, FILE * libfp, char *modname)
+{
+ int n = 0;
+
+ hdr->hdrsize = sizeof(*hdr);
+ if (modname)
+ hdr->hdrsize += (n = strlen(modname) + 1);
+ if (libfp == NULL)
+ return;
+ if (fwrite(hdr, 1, sizeof(*hdr), libfp) != sizeof(*hdr) ||
+ (modname && (fwrite(modname, 1, n, libfp) != n)))
+ error_exit(3, true, "could not write header");
+}
+
+/*
+ * Copy n bytes from one file to another and return last character read.
+ */
+char copybytes(FILE * fp, FILE * fp2, int n)
+{
+ int i, t = 0;
+
+ for (i = 0; i < n; i++) {
+ t = fgetc(fp);
+ if (t == EOF)
+ error_exit(1, false, "premature end of file in '%s'",
+ _argv[2]);
+ if (fp2)
+ if (fputc(t, fp2) == EOF)
+ error_exit(1, false, "write error");
+ }
+ return (char)t;
+}
+
+/*
+ * Copy uint32_t from one file to another.
+ * Return local presentation of int32_t.
+ */
+int32_t copyint32_t(FILE * fp, FILE * fp2)
+{
+ int32_t l;
+ int i, t;
+ uint8_t *p = (uint8_t *)&l;
+
+ for (i = 0; i < 4; i++) {
+ t = fgetc(fp);
+ if (t == EOF)
+ error_exit(1, false, "premature end of file in '%s'",
+ _argv[2]);
+ if (fp2)
+ if (fputc(t, fp2) == EOF)
+ error_exit(1, false, "write error");
+ *p++ = t;
+ }
+ int32_ttolocal(&l);
+ return l;
+}
+
+/*
+ * Create a new library
+ */
+int create_library(char *libname)
+{
+ FILE *libfp;
+ struct rdlm_hdr hdr;
+
+ hdr.magic = RDLAMAG;
+ hdr.hdrsize = 0;
+ hdr.date = time(NULL);
+ hdr.owner = getuid();
+ hdr.group = getgid();
+ hdr.mode = umask(022);
+ hdr.size = 0;
+
+ libfp = fopen(libname, "wb");
+ if (!libfp)
+ error_exit(1, true, "could not open '%s'\n", libname);
+
+ /* Write library header */
+ put_header(&hdr, libfp, NULL);
+
+ fclose(libfp);
+ return true;
+}
+
+/*
+ * Add a module to the library
+ */
+int add_module(FILE * libfp, const char *fname, char *modname)
+{
+ FILE *modfp;
+ struct rdlm_hdr hdr = { RDLMMAG, 0, 0, 0, 0, 0, 0 };
+ struct stat finfo;
+ int i;
+
+ if (options.verbose)
+ fprintf(stderr, "adding module %s\n", modname);
+
+ /* Initialize some fields in the module header */
+ if (stat(fname, &finfo) < 0)
+ error_exit(1, true, "could not stat '%s'", fname);
+ hdr.date = finfo.st_mtime;
+ hdr.owner = finfo.st_uid;
+ hdr.group = finfo.st_gid;
+ hdr.size = finfo.st_size;
+
+ modfp = fopen(fname, "rb");
+ if (!modfp)
+ error_exit(1, true, "could not open '%s'", fname);
+
+ /* Write module header */
+ put_header(&hdr, libfp, modname);
+
+ /* Put the module itself */
+ while (!feof(modfp)) {
+ i = fgetc(modfp);
+ if (i == EOF)
+ break;
+ if (fputc(i, libfp) == EOF)
+ error_exit(1, false, "write error");
+ }
+
+ fclose(modfp);
+ return true;
+}
+
+/*
+ * Main
+ */
+int main(int argc, char **argv)
+{
+ FILE *libfp, *tmpfp, *modfp = NULL;
+ struct stat finfo;
+ struct rdlm_hdr hdr;
+ char buf[MAXMODNAMELEN], *p = NULL;
+ char c;
+ int i;
+
+ progname = argv[0];
+ _argv = argv;
+
+ if (argc < 2) {
+ usage();
+ exit(1);
+ }
+
+ rdoff_init();
+
+ /* Check whether some modifiers were specified */
+ for (i = 1; i < strlen(argv[1]); i++) {
+ switch (c = argv[1][i]) {
+ case 'c':
+ options.createok = true;
+ break;
+ case 'f':
+ options.usefname = true;
+ break;
+ case 'l':
+ options.align = true;
+ break;
+ case 'o':
+ options.odate = true;
+ break;
+ case 'u':
+ options.fresh = true;
+ break;
+ case 'v':
+ options.verbose++;
+ break;
+ case 'V':
+ show_version();
+ exit(0);
+ default:
+ if (strchr(commands, c) == NULL)
+ error_exit(2, false, "invalid command or modifier '%c'",
+ c);
+ }
+ }
+
+ if (argc < 3)
+ error_exit(2, false, "missing library name");
+
+ /* Process the command */
+ if (argv[1][0] == '-')
+ argv[1]++;
+ switch (c = argv[1][0]) {
+ case 'a': /* add a module */
+ if (argc < 4 || (!options.usefname && argc != 5))
+ error_exit(2, false, "invalid number of arguments");
+
+ /* Check if a library already exists. If not - create it */
+ if (access(argv[2], F_OK) < 0) {
+ if (!options.createok)
+ fprintf(stderr, "creating library %s\n", argv[2]);
+ create_library(argv[2]);
+ }
+
+ libfp = fopen(argv[2], "ab");
+ if (!libfp)
+ error_exit(1, true, "could not open '%s'", argv[2]);
+
+ if (!options.usefname)
+ add_module(libfp, argv[4], argv[3]);
+ else
+ for (i = 3; i < argc; i++)
+ add_module(libfp, argv[i], argv[i]);
+
+ fclose(libfp);
+ break;
+
+ case 'n': /* create library */
+ create_library(argv[2]);
+ break;
+
+ case 'x': /* extract module(s) */
+ if (!options.usefname)
+ argc--;
+ if (argc < 4)
+ error_exit(2, false, "required parameter missing");
+ p = options.usefname ? argv[3] : argv[4];
+ case 't': /* list library contents */
+ libfp = fopen(argv[2], "rb");
+ if (!libfp)
+ error_exit(1, true, "could not open '%s'\n", argv[2]);
+
+ /* Read library header */
+ if (fread(&hdr, 1, sizeof(hdr), libfp) != sizeof(hdr) ||
+ hdr.magic != RDLAMAG)
+ error_exit(1, false, "invalid library format");
+
+ /* Walk through the library looking for requested module */
+ while (!feof(libfp)) {
+ /* Read module header */
+ i = fread(&hdr, 1, sizeof(hdr), libfp);
+ if (feof(libfp))
+ break;
+ if (i != sizeof(hdr) || hdr.magic != RDLMMAG)
+ error_exit(1, false, "invalid module header");
+ /* Read module name */
+ i = hdr.hdrsize - sizeof(hdr);
+ if (i > sizeof(buf) || fread(buf, 1, i, libfp) != i)
+ error_exit(1, false, "invalid module name");
+ if (c == 'x') {
+ /* Check against desired name */
+ if (!strcmp(buf, argv[3])) {
+ if (options.verbose)
+ fprintf(stderr,
+ "extracting module %s to file %s\n", buf,
+ p);
+ modfp = fopen(p, "wb");
+ if (!modfp)
+ error_exit(1, true, "could not open '%s'", p);
+ }
+ } else {
+ printf("%-40s ", buf);
+ if (options.verbose) {
+ printf("%ld bytes", hdr.size);
+ }
+ putchar('\n');
+ }
+
+ copybytes(libfp, modfp, hdr.size);
+ if (modfp)
+ break;
+ }
+
+ fclose(libfp);
+ if (modfp)
+ fclose(modfp);
+ else if (c == 'x')
+ error_exit(1, false, "module '%s' not found in '%s'",
+ argv[3], argv[2]);
+ break;
+
+ case 'r': /* replace module(s) */
+ argc--;
+ if (stat(argv[4], &finfo) < 0)
+ error_exit(1, true, "could not stat '%s'", argv[4]);
+ case 'd': /* delete module(s) */
+ if (argc < 4)
+ error_exit(2, false, "required parameter missing");
+
+ libfp = fopen(argv[2], "rb");
+ if (!libfp)
+ error_exit(1, true, "could not open '%s'", argv[2]);
+
+ /* Copy the library into a temporary file */
+ tmpfp = tmpfile();
+ if (!tmpfp)
+ error_exit(1, true, "could not open temporary file");
+
+ stat(argv[2], &finfo);
+ copybytes(libfp, tmpfp, finfo.st_size);
+ rewind(tmpfp);
+ freopen(argv[2], "wb", libfp);
+
+ /* Read library header and write it to a new file */
+ if (fread(&hdr, 1, sizeof(hdr), tmpfp) != sizeof(hdr) ||
+ hdr.magic != RDLAMAG)
+ error_exit(1, false, "invalid library format");
+ put_header(&hdr, libfp, NULL);
+
+ /* Walk through the library looking for requested module */
+ while (!feof(tmpfp)) {
+ /* Read module header */
+ if (fread(&hdr, 1, sizeof(hdr), tmpfp) != sizeof(hdr) ||
+ hdr.magic != RDLMMAG)
+ error_exit(1, false, "invalid module header");
+ /* Read module name */
+ i = hdr.hdrsize - sizeof(hdr);
+ if (i > sizeof(buf) || fread(buf, 1, i, tmpfp) != i)
+ error_exit(1, false, "invalid module name");
+ /* Check against desired name */
+ if (!strcmp(buf, argv[3]) &&
+ (c == 'd' || !options.odate
+ || finfo.st_mtime <= hdr.date)) {
+ if (options.verbose)
+ fprintf(stderr, "deleting module %s\n", buf);
+ fseek(tmpfp, hdr.size, SEEK_CUR);
+ break;
+ } else {
+ put_header(&hdr, libfp, buf);
+ copybytes(tmpfp, libfp, hdr.size);
+ }
+ }
+
+ if (c == 'r') {
+ /* Copy new module into library */
+ p = options.usefname ? argv[4] : argv[3];
+ add_module(libfp, argv[4], p);
+ }
+
+ /* Copy rest of library if any */
+ while (!feof(tmpfp)) {
+ if ((i = fgetc(tmpfp)) == EOF)
+ break;
+
+ if (fputc(i, libfp) == EOF)
+ error_exit(1, false, "write error");
+ }
+
+ fclose(libfp);
+ fclose(tmpfp);
+ break;
+
+ default:
+ error_exit(2, false, "invalid command '%c'\n", c);
+ }
+
+ return 0;
+}
diff --git a/rdoff/rdlar.h b/rdoff/rdlar.h
new file mode 100644
index 00000000..7e9269cd
--- /dev/null
+++ b/rdoff/rdlar.h
@@ -0,0 +1,34 @@
+/*
+ * rdlar.h - definitions of new RDOFF library/archive format.
+ */
+
+#ifndef RDOFF_RDLAR_H
+#define RDOFF_RDLAR_H 1
+
+#include "compiler.h"
+
+/* For non-POSIX operating systems */
+#ifndef HAVE_GETUID
+# define getuid() 0
+#endif
+#ifndef HAVE_GETGID
+# define getgid() 0
+#endif
+
+#define RDLAMAG 0x414C4452 /* Archive magic */
+#define RDLMMAG 0x4D4C4452 /* Member magic */
+
+#define MAXMODNAMELEN 256 /* Maximum length of module name */
+
+struct rdlm_hdr {
+ uint32_t magic; /* Must be RDLAMAG */
+ uint32_t hdrsize; /* Header size + sizeof(module_name) */
+ uint32_t date; /* Creation date */
+ uint32_t owner; /* UID */
+ uint32_t group; /* GID */
+ uint32_t mode; /* File mode */
+ uint32_t size; /* File size */
+ /* NULL-terminated module name immediately follows */
+};
+
+#endif
diff --git a/rdoff/rdlib.c b/rdoff/rdlib.c
new file mode 100644
index 00000000..d8f2fc7a
--- /dev/null
+++ b/rdoff/rdlib.c
@@ -0,0 +1,290 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdlib.c - routines for manipulating RDOFF libraries (.rdl)
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rdfutils.h"
+#include "rdlib.h"
+#include "rdlar.h"
+
+/* See Texinfo documentation about new RDOFF libraries format */
+
+int rdl_error = 0;
+
+char *rdl_errors[5] = {
+ "no error", "could not open file", "invalid file structure",
+ "file contains modules of an unsupported RDOFF version",
+ "module not found"
+};
+
+int rdl_verify(const char *filename)
+{
+ FILE *fp;
+ char buf[257];
+ int i;
+ int32_t length;
+ static char lastverified[256];
+ static int lastresult = -1;
+
+ if (lastresult != -1 && !strcmp(filename, lastverified))
+ return lastresult;
+
+ fp = fopen(filename, "rb");
+ strcpy(lastverified, filename);
+
+ if (!fp)
+ return (rdl_error = lastresult = 1);
+
+ while (!feof(fp)) {
+ i = 0;
+
+ while (fread(buf + i, 1, 1, fp) == 1 && i < 257 && buf[i])
+ i++;
+ if (feof(fp))
+ break;
+
+ if (buf[0] == '.') {
+ /*
+ * A special module, eg a signature block or a directory.
+ * Format of such a module is defined to be:
+ * six char type identifier
+ * int32_t count bytes content
+ * content
+ * so we can handle it uniformaly with RDOFF2 modules.
+ */
+ nasm_read(buf, 6, fp);
+ buf[6] = 0;
+ /* Currently, nothing useful to do with signature block.. */
+ } else {
+ nasm_read(buf, 6, fp);
+ buf[6] = 0;
+ if (strncmp(buf, "RDOFF", 5)) {
+ fclose(fp);
+ return rdl_error = lastresult = 2;
+ } else if (buf[5] != '2') {
+ fclose(fp);
+ return rdl_error = lastresult = 3;
+ }
+ }
+ nasm_read(&length, 4, fp);
+ fseek(fp, length, SEEK_CUR); /* skip over the module */
+ }
+ fclose(fp);
+ return lastresult = 0; /* library in correct format */
+}
+
+int rdl_open(struct librarynode *lib, const char *name)
+{
+ int i = rdl_verify(name);
+ if (i)
+ return i;
+
+ lib->fp = NULL;
+ lib->name = nasm_strdup(name);
+ lib->referenced = 0;
+ lib->next = NULL;
+ return 0;
+}
+
+int rdl_searchlib(struct librarynode *lib, const char *label, rdffile * f)
+{
+ char buf[512];
+ int i, t;
+ void *hdr;
+ rdfheaderrec *r;
+ int32_t l;
+
+ rdl_error = 0;
+ lib->referenced++;
+
+ if (!lib->fp) {
+ lib->fp = fopen(lib->name, "rb");
+
+ if (!lib->fp) {
+ rdl_error = 1;
+ return 0;
+ }
+ } else
+ rewind(lib->fp);
+
+ while (!feof(lib->fp)) {
+ /*
+ * read the module name from the file, and prepend
+ * the library name and '.' to it.
+ */
+ strcpy(buf, lib->name);
+
+ i = strlen(lib->name);
+ buf[i++] = '.';
+ t = i;
+ while (fread(buf + i, 1, 1, lib->fp) == 1 && i < 512 && buf[i])
+ i++;
+
+ buf[i] = 0;
+
+ if (feof(lib->fp))
+ break;
+ if (!strcmp(buf + t, ".dir")) { /* skip over directory */
+ nasm_read(&l, 4, lib->fp);
+ fseek(lib->fp, l, SEEK_CUR);
+ continue;
+ }
+ /*
+ * open the RDOFF module
+ */
+ if (rdfopenhere(f, lib->fp, &lib->referenced, buf)) {
+ rdl_error = 16 * rdf_errno;
+ return 0;
+ }
+ /*
+ * read in the header, and scan for exported symbols
+ */
+ hdr = nasm_malloc(f->header_len);
+ rdfloadseg(f, RDOFF_HEADER, hdr);
+
+ while ((r = rdfgetheaderrec(f))) {
+ if (r->type != 3) /* not an export */
+ continue;
+
+ if (!strcmp(r->e.label, label)) { /* match! */
+ nasm_free(hdr); /* reset to 'just open' */
+ f->header_loc = NULL; /* state... */
+ f->header_fp = 0;
+ return 1;
+ }
+ }
+
+ /* find start of next module... */
+ i = f->eof_offset;
+ rdfclose(f);
+ fseek(lib->fp, i, SEEK_SET);
+ }
+
+ /*
+ * close the file if nobody else is using it
+ */
+ lib->referenced--;
+ if (!lib->referenced) {
+ fclose(lib->fp);
+ lib->fp = NULL;
+ }
+ return 0;
+}
+
+int rdl_openmodule(struct librarynode *lib, int moduleno, rdffile * f)
+{
+ char buf[512];
+ int i, cmod, t;
+ int32_t length;
+
+ lib->referenced++;
+
+ if (!lib->fp) {
+ lib->fp = fopen(lib->name, "rb");
+ if (!lib->fp) {
+ lib->referenced--;
+ return (rdl_error = 1);
+ }
+ } else
+ rewind(lib->fp);
+
+ cmod = -1;
+ while (!feof(lib->fp)) {
+ strcpy(buf, lib->name);
+ i = strlen(buf);
+ buf[i++] = '.';
+ t = i;
+ while (fread(buf + i, 1, 1, lib->fp) == 1 && i < 512 && buf[i])
+ i++;
+ buf[i] = 0;
+ if (feof(lib->fp))
+ break;
+
+ if (buf[t] != '.') /* special module - not counted in the numbering */
+ cmod++; /* of RDOFF modules - must be referred to by name */
+
+ if (cmod == moduleno) {
+ rdl_error = 16 *
+ rdfopenhere(f, lib->fp, &lib->referenced, buf);
+ lib->referenced--;
+ if (!lib->referenced) {
+ fclose(lib->fp);
+ lib->fp = NULL;
+ }
+ return rdl_error;
+ }
+
+ nasm_read(buf, 6, lib->fp);
+ buf[6] = 0;
+ if (buf[t] == '.') {
+ /* do nothing */
+ } else if (strncmp(buf, "RDOFF", 5)) {
+ if (!--lib->referenced) {
+ fclose(lib->fp);
+ lib->fp = NULL;
+ }
+ return rdl_error = 2;
+ } else if (buf[5] != '2') {
+ if (!--lib->referenced) {
+ fclose(lib->fp);
+ lib->fp = NULL;
+ }
+ return rdl_error = 3;
+ }
+
+ nasm_read(&length, 4, lib->fp);
+ fseek(lib->fp, length, SEEK_CUR); /* skip over the module */
+ }
+ if (!--lib->referenced) {
+ fclose(lib->fp);
+ lib->fp = NULL;
+ }
+ return rdl_error = 4; /* module not found */
+}
+
+void rdl_perror(const char *apname, const char *filename)
+{
+ if (rdl_error >= 16)
+ rdfperror(apname, filename);
+ else
+ fprintf(stderr, "%s:%s:%s\n", apname, filename,
+ rdl_errors[rdl_error]);
+}
diff --git a/rdoff/rdlib.h b/rdoff/rdlib.h
new file mode 100644
index 00000000..e1b3c5a1
--- /dev/null
+++ b/rdoff/rdlib.h
@@ -0,0 +1,62 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdlib.h Functions for manipulating libraries of RDOFF object files.
+ */
+
+#ifndef RDOFF_RDLIB_H
+#define RDOFF_RDLIB_H 1
+
+struct librarynode {
+ char *name;
+ FILE *fp; /* initialised to NULL - always check */
+ int referenced; /* & open if required. Close afterwards */
+ struct librarynode *next; /* if ! referenced. */
+};
+
+extern int rdl_error;
+
+#define RDL_EOPEN 1
+#define RDL_EINVALID 2
+#define RDL_EVERSION 3
+#define RDL_ENOTFOUND 4
+
+int rdl_verify(const char *filename);
+int rdl_open(struct librarynode *lib, const char *filename);
+int rdl_searchlib(struct librarynode *lib, const char *label, rdffile * f);
+int rdl_openmodule(struct librarynode *lib, int module, rdffile * f);
+
+void rdl_perror(const char *apname, const char *filename);
+
+#endif
diff --git a/rdoff/rdoff.c b/rdoff/rdoff.c
new file mode 100644
index 00000000..77fec399
--- /dev/null
+++ b/rdoff/rdoff.c
@@ -0,0 +1,621 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdoff.c library of routines for manipulating rdoff files
+ */
+
+/* TODO: The functions in this module assume they are running
+ * on a little-endian machine. This should be fixed to
+ * make it portable.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "rdfutils.h"
+
+/*
+ * Comment this out to allow the module to read & write header record types
+ * that it isn't aware of. With this defined, unrecognised header records
+ * will generate error number 8, reported as 'unknown extended header record'.
+ */
+
+#define STRICT_ERRORS
+
+/* ========================================================================
+ * Code for memory buffers (for delayed writing of header until we know
+ * how int32_t it is).
+ * ======================================================================== */
+
+static memorybuffer *newmembuf(void)
+{
+ memorybuffer *t;
+
+ t = nasm_malloc(sizeof(memorybuffer));
+ if (!t)
+ return NULL;
+
+ t->length = 0;
+ t->next = NULL;
+ return t;
+}
+
+static void membufwrite(memorybuffer * const b, void *data, int bytes)
+{
+ uint16_t w;
+ int32_t l;
+ char *c;
+
+ if (b->next) { /* memory buffer full - use next buffer */
+ membufwrite(b->next, data, bytes);
+ return;
+ }
+
+ if ((bytes < 0 && b->length - bytes > BUF_BLOCK_LEN)
+ || (bytes > 0 && b->length + bytes > BUF_BLOCK_LEN)) {
+
+ /* buffer full and no next allocated... allocate and initialise next
+ * buffer */
+ b->next = newmembuf();
+ membufwrite(b->next, data, bytes);
+ return;
+ }
+
+ switch (bytes) {
+ case -4: /* convert to little-endian */
+ l = *(int32_t *)data;
+ b->buffer[b->length++] = l & 0xFF;
+ l >>= 8;
+ b->buffer[b->length++] = l & 0xFF;
+ l >>= 8;
+ b->buffer[b->length++] = l & 0xFF;
+ l >>= 8;
+ b->buffer[b->length++] = l & 0xFF;
+ break;
+
+ case -2:
+ w = *(uint16_t *) data;
+ b->buffer[b->length++] = w & 0xFF;
+ w >>= 8;
+ b->buffer[b->length++] = w & 0xFF;
+ break;
+
+ default:
+ c = data;
+ while (bytes--)
+ b->buffer[b->length++] = *c++;
+ break;
+ }
+}
+
+static void membufdump(memorybuffer * b, FILE * fp)
+{
+ if (!b)
+ return;
+
+ nasm_write(b->buffer, b->length, fp);
+ membufdump(b->next, fp);
+}
+
+static int membuflength(memorybuffer * b)
+{
+ if (!b)
+ return 0;
+ return b->length + membuflength(b->next);
+}
+
+static void freemembuf(memorybuffer * b)
+{
+ if (!b)
+ return;
+ freemembuf(b->next);
+ nasm_free(b);
+}
+
+/* =========================================================================
+ General purpose routines and variables used by the library functions
+ ========================================================================= */
+
+/*
+ * translateint32_t() and translateint16_t()
+ *
+ * translate from little endian to local representation
+ */
+int32_t translateint32_t(int32_t in)
+{
+ int32_t r;
+ uint8_t *i;
+
+ i = (uint8_t *)&in;
+ r = i[3];
+ r = (r << 8) + i[2];
+ r = (r << 8) + i[1];
+ r = (r << 8) + *i;
+
+ return r;
+}
+
+uint16_t translateint16_t(uint16_t in)
+{
+ uint16_t r;
+ uint8_t *i;
+
+ i = (uint8_t *)&in;
+ r = (i[1] << 8) + i[0];
+
+ return r;
+}
+
+/* Segment types */
+static char *knownsegtypes[8] = {
+ "NULL", "text", "data", "object comment",
+ "linked comment", "loader comment",
+ "symbolic debug", "line number debug"
+};
+
+/* Get a textual string describing the segment type */
+char *translatesegmenttype(uint16_t type)
+{
+ if (type < 8)
+ return knownsegtypes[type];
+ if (type < 0x0020)
+ return "reserved";
+ if (type < 0x1000)
+ return "reserved - Moscow";
+ if (type < 0x8000)
+ return "reserved - system dependant";
+ if (type < 0xFFFF)
+ return "reserved - other";
+ if (type == 0xFFFF)
+ return "invalid type code";
+ return "type code out of range";
+}
+
+/* This signature is written to the start of RDOFF files */
+const char *RDOFFId = RDOFF2_SIGNATURE;
+
+/* Error messages. Must correspond to the codes defined in rdoff.h */
+const char *rdf_errors[11] = {
+ /* 0 */ "no error occurred",
+ /* 1 */ "could not open file",
+ /* 2 */ "invalid file format",
+ /* 3 */ "error reading file",
+ /* 4 */ "unknown error",
+ /* 5 */ "header not read",
+ /* 6 */ "out of memory",
+ /* 7 */ "RDOFF v1 not supported",
+ /* 8 */ "unknown extended header record",
+ /* 9 */ "header record of known type but unknown length",
+ /* 10 */ "no such segment"
+};
+
+int rdf_errno = 0;
+
+/* ========================================================================
+ * Hook for nasm_error() to work
+ * ======================================================================== */
+static void rdoff_verror(int severity, const char *fmt, va_list val)
+{
+ vfprintf(stderr, fmt, val);
+
+ if ((severity & ERR_MASK) >= ERR_FATAL)
+ exit(1);
+}
+
+void rdoff_init(void)
+{
+ nasm_set_verror(rdoff_verror);
+}
+
+/* ========================================================================
+ The library functions
+ ======================================================================== */
+
+int rdfopen(rdffile * f, const char *name)
+{
+ FILE *fp;
+
+ fp = fopen(name, "rb");
+ if (!fp)
+ return rdf_errno = RDF_ERR_OPEN;
+
+ return rdfopenhere(f, fp, NULL, name);
+}
+
+int rdfopenhere(rdffile * f, FILE * fp, int *refcount, const char *name)
+{
+ char buf[8];
+ int32_t initpos;
+ int32_t l;
+ uint16_t s;
+
+ if (translateint32_t(0x01020304) != 0x01020304) {
+ /* fix this to be portable! */
+ fputs("*** this program requires a little endian machine\n",
+ stderr);
+ fprintf(stderr, "01020304h = %08"PRIx32"h\n", translateint32_t(0x01020304));
+ exit(3);
+ }
+
+ f->fp = fp;
+ initpos = ftell(fp);
+
+ /* read header */
+ if (fread(buf, 1, 6, f->fp) != 6) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_READ;
+ }
+ buf[6] = 0;
+
+ if (strcmp(buf, RDOFFId)) {
+ fclose(f->fp);
+ if (!strcmp(buf, "RDOFF1"))
+ return rdf_errno = RDF_ERR_VER;
+ return rdf_errno = RDF_ERR_FORMAT;
+ }
+
+ if (fread(&l, 1, 4, f->fp) != 4
+ || fread(&f->header_len, 1, 4, f->fp) != 4) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_READ;
+ }
+
+ f->header_ofs = ftell(f->fp);
+ f->eof_offset = f->header_ofs + translateint32_t(l) - 4;
+
+ if (fseek(f->fp, f->header_len, SEEK_CUR)) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_FORMAT; /* seek past end of file...? */
+ }
+
+ if (fread(&s, 1, 2, f->fp) != 2) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_READ;
+ }
+
+ f->nsegs = 0;
+
+ while (s != 0) {
+ f->seg[f->nsegs].type = s;
+ if (fread(&f->seg[f->nsegs].number, 1, 2, f->fp) != 2 ||
+ fread(&f->seg[f->nsegs].reserved, 1, 2, f->fp) != 2 ||
+ fread(&f->seg[f->nsegs].length, 1, 4, f->fp) != 4) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_READ;
+ }
+
+ f->seg[f->nsegs].offset = ftell(f->fp);
+ if (fseek(f->fp, f->seg[f->nsegs].length, SEEK_CUR)) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_FORMAT;
+ }
+ f->nsegs++;
+
+ if (fread(&s, 1, 2, f->fp) != 2) {
+ fclose(f->fp);
+ return rdf_errno = RDF_ERR_READ;
+ }
+ }
+
+ if (f->eof_offset != ftell(f->fp) + 8) { /* +8 = skip null segment header */
+ fprintf(stderr, "warning: eof_offset [%"PRId32"] and actual eof offset "
+ "[%ld] don't match\n", f->eof_offset, ftell(f->fp) + 8);
+ }
+ fseek(f->fp, initpos, SEEK_SET);
+ f->header_loc = NULL;
+
+ f->name = nasm_strdup(name);
+ f->refcount = refcount;
+ if (refcount)
+ (*refcount)++;
+ return RDF_OK;
+}
+
+int rdfclose(rdffile * f)
+{
+ if (!f->refcount || !--(*f->refcount)) {
+ fclose(f->fp);
+ f->fp = NULL;
+ }
+ nasm_free(f->name);
+
+ return 0;
+}
+
+/*
+ * Print the message for last error (from rdf_errno)
+ */
+void rdfperror(const char *app, const char *name)
+{
+ fprintf(stderr, "%s:%s: %s\n", app, name, rdf_errors[rdf_errno]);
+ if (rdf_errno == RDF_ERR_OPEN || rdf_errno == RDF_ERR_READ) {
+ perror(app);
+ }
+}
+
+/*
+ * Find the segment by its number.
+ * Returns segment array index, or -1 if segment with such number was not found.
+ */
+int rdffindsegment(rdffile * f, int segno)
+{
+ int i;
+ for (i = 0; i < f->nsegs; i++)
+ if (f->seg[i].number == segno)
+ return i;
+ return -1;
+}
+
+/*
+ * Load the segment. Returns status.
+ */
+int rdfloadseg(rdffile * f, int segment, void *buffer)
+{
+ int32_t fpos;
+ size_t slen;
+
+ switch (segment) {
+ case RDOFF_HEADER:
+ fpos = f->header_ofs;
+ slen = f->header_len;
+ f->header_loc = (uint8_t *) buffer;
+ f->header_fp = 0;
+ break;
+ default:
+ if (segment < f->nsegs) {
+ fpos = f->seg[segment].offset;
+ slen = f->seg[segment].length;
+ f->seg[segment].data = (uint8_t *) buffer;
+ } else {
+ return rdf_errno = RDF_ERR_SEGMENT;
+ }
+ }
+
+ if (fseek(f->fp, fpos, SEEK_SET))
+ return rdf_errno = RDF_ERR_UNKNOWN;
+
+ if (fread(buffer, 1, slen, f->fp) != slen)
+ return rdf_errno = RDF_ERR_READ;
+
+ return RDF_OK;
+}
+
+/* Macros for reading integers from header in memory */
+
+#define RI8(v) v = f->header_loc[f->header_fp++]
+#define RI16(v) { v = (f->header_loc[f->header_fp] + \
+ (f->header_loc[f->header_fp+1] << 8)); \
+ f->header_fp += 2; }
+
+#define RI32(v) { v = (f->header_loc[f->header_fp] + \
+ (f->header_loc[f->header_fp+1] << 8) + \
+ (f->header_loc[f->header_fp+2] << 16) + \
+ (f->header_loc[f->header_fp+3] << 24)); \
+ f->header_fp += 4; }
+
+#define RS(str,max) { for(i=0;i<max;i++){\
+ RI8(str[i]); if (!str[i]) break;} str[i]=0; }
+
+/*
+ * Read a header record.
+ * Returns the address of record, or NULL in case of error.
+ */
+rdfheaderrec *rdfgetheaderrec(rdffile * f)
+{
+ static rdfheaderrec r;
+ int i;
+
+ if (!f->header_loc) {
+ rdf_errno = RDF_ERR_HEADER;
+ return NULL;
+ }
+
+ if (f->header_fp >= f->header_len)
+ return 0;
+
+ RI8(r.type);
+ RI8(r.g.reclen);
+
+ switch (r.type) {
+ case RDFREC_RELOC: /* Relocation record */
+ case RDFREC_SEGRELOC:
+ if (r.r.reclen != 8) {
+ rdf_errno = RDF_ERR_RECLEN;
+ return NULL;
+ }
+ RI8(r.r.segment);
+ RI32(r.r.offset);
+ RI8(r.r.length);
+ RI16(r.r.refseg);
+ break;
+
+ case RDFREC_IMPORT: /* Imported symbol record */
+ case RDFREC_FARIMPORT:
+ RI8(r.i.flags);
+ RI16(r.i.segment);
+ RS(r.i.label, EXIM_LABEL_MAX);
+ break;
+
+ case RDFREC_GLOBAL: /* Exported symbol record */
+ RI8(r.e.flags);
+ RI8(r.e.segment);
+ RI32(r.e.offset);
+ RS(r.e.label, EXIM_LABEL_MAX);
+ break;
+
+ case RDFREC_DLL: /* DLL record */
+ RS(r.d.libname, MODLIB_NAME_MAX);
+ break;
+
+ case RDFREC_BSS: /* BSS reservation record */
+ if (r.r.reclen != 4) {
+ rdf_errno = RDF_ERR_RECLEN;
+ return NULL;
+ }
+ RI32(r.b.amount);
+ break;
+
+ case RDFREC_MODNAME: /* Module name record */
+ RS(r.m.modname, MODLIB_NAME_MAX);
+ break;
+
+ case RDFREC_COMMON: /* Common variable */
+ RI16(r.c.segment);
+ RI32(r.c.size);
+ RI16(r.c.align);
+ RS(r.c.label, EXIM_LABEL_MAX);
+ break;
+
+ default:
+#ifdef STRICT_ERRORS
+ rdf_errno = RDF_ERR_RECTYPE; /* unknown header record */
+ return NULL;
+#else
+ for (i = 0; i < r.g.reclen; i++)
+ RI8(r.g.data[i]);
+#endif
+ }
+ return &r;
+}
+
+/*
+ * Rewind to the beginning of the file
+ */
+void rdfheaderrewind(rdffile * f)
+{
+ f->header_fp = 0;
+}
+
+rdf_headerbuf *rdfnewheader(void)
+{
+ rdf_headerbuf *hb = nasm_malloc(sizeof(rdf_headerbuf));
+ if (hb == NULL)
+ return NULL;
+
+ hb->buf = newmembuf();
+ hb->nsegments = 0;
+ hb->seglength = 0;
+
+ return hb;
+}
+
+int rdfaddheader(rdf_headerbuf * h, rdfheaderrec * r)
+{
+#ifndef STRICT_ERRORS
+ int i;
+#endif
+ membufwrite(h->buf, &r->type, 1);
+ membufwrite(h->buf, &r->g.reclen, 1);
+
+ switch (r->type) {
+ case RDFREC_GENERIC: /* generic */
+ membufwrite(h->buf, &r->g.data, r->g.reclen);
+ break;
+ case RDFREC_RELOC:
+ case RDFREC_SEGRELOC:
+ membufwrite(h->buf, &r->r.segment, 1);
+ membufwrite(h->buf, &r->r.offset, -4);
+ membufwrite(h->buf, &r->r.length, 1);
+ membufwrite(h->buf, &r->r.refseg, -2); /* 9 bytes written */
+ break;
+
+ case RDFREC_IMPORT: /* import */
+ case RDFREC_FARIMPORT:
+ membufwrite(h->buf, &r->i.flags, 1);
+ membufwrite(h->buf, &r->i.segment, -2);
+ membufwrite(h->buf, &r->i.label, strlen(r->i.label) + 1);
+ break;
+
+ case RDFREC_GLOBAL: /* export */
+ membufwrite(h->buf, &r->e.flags, 1);
+ membufwrite(h->buf, &r->e.segment, 1);
+ membufwrite(h->buf, &r->e.offset, -4);
+ membufwrite(h->buf, &r->e.label, strlen(r->e.label) + 1);
+ break;
+
+ case RDFREC_DLL: /* DLL */
+ membufwrite(h->buf, &r->d.libname, strlen(r->d.libname) + 1);
+ break;
+
+ case RDFREC_BSS: /* BSS */
+ membufwrite(h->buf, &r->b.amount, -4);
+ break;
+
+ case RDFREC_MODNAME: /* Module name */
+ membufwrite(h->buf, &r->m.modname, strlen(r->m.modname) + 1);
+ break;
+
+ default:
+#ifdef STRICT_ERRORS
+ return rdf_errno = RDF_ERR_RECTYPE;
+#else
+ for (i = 0; i < r->g.reclen; i++)
+ membufwrite(h->buf, r->g.data[i], 1);
+#endif
+ }
+ return 0;
+}
+
+int rdfaddsegment(rdf_headerbuf * h, int32_t seglength)
+{
+ h->nsegments++;
+ h->seglength += seglength;
+ return 0;
+}
+
+int rdfwriteheader(FILE * fp, rdf_headerbuf * h)
+{
+ int32_t l, l2;
+
+ nasm_write(RDOFFId, strlen(RDOFFId), fp);
+
+ l = membuflength(h->buf);
+ l2 = l + 14 + 10 * h->nsegments + h->seglength;
+ fwriteint32_t(l, fp);
+ fwriteint32_t(l2, fp);
+
+ membufdump(h->buf, fp);
+
+ return 0; /* no error handling in here... CHANGE THIS! */
+}
+
+void rdfdoneheader(rdf_headerbuf * h)
+{
+ freemembuf(h->buf);
+ nasm_free(h);
+}
diff --git a/rdoff/rdx.1 b/rdoff/rdx.1
new file mode 100644
index 00000000..a8640561
--- /dev/null
+++ b/rdoff/rdx.1
@@ -0,0 +1,21 @@
+.TH RDX 1 "September 6, 1999" "Debian Project" "Debian Manual"
+.SH NAME
+rdx \- load and execute an RDOFF object
+.SH SYNOPSIS
+.B rdx
+.I object
+.SH DESCRIPTION
+.B rdx
+loads an RDOFF
+.IR object ,
+and then calls
+.RB ` _main ',
+which it expects to be a C-style function, accepting two parameters,
+.I argc
+and
+.I argv
+in normal C style.
+.SH AUTHORS
+Julian Hall <jules@earthcorp.com>.
+.PP
+This manual page was written by Matej Vela <vela@debian.org>.
diff --git a/rdoff/rdx.c b/rdoff/rdx.c
new file mode 100644
index 00000000..f52e6879
--- /dev/null
+++ b/rdoff/rdx.c
@@ -0,0 +1,90 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * rdx.c RDOFF Object File loader program
+ */
+
+/* note: most of the actual work of this program is done by the modules
+ "rdfload.c", which loads and relocates the object file, and by "rdoff.c",
+ which contains general purpose routines to manipulate RDOFF object
+ files. You can use these files in your own program to load RDOFF objects
+ and execute the code in them in a similar way to what is shown here. */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "rdfload.h"
+#include "symtab.h"
+
+typedef int (*main_fn) (int, char **); /* Main function prototype */
+
+int main(int argc, char **argv)
+{
+ rdfmodule *m;
+ main_fn code;
+ symtabEnt *s;
+
+ if (argc < 2) {
+ puts("usage: rdx <rdoff-executable> [params]\n");
+ exit(255);
+ }
+
+ rdoff_init();
+
+ m = rdfload(argv[1]);
+
+ if (!m) {
+ rdfperror("rdx", argv[1]);
+ exit(255);
+ }
+
+ rdf_relocate(m); /* in this instance, the default relocation
+ values will work fine, but they may need changing
+ in other cases... */
+
+ s = symtabFind(m->symtab, "_main");
+ if (!s) {
+ fprintf(stderr, "rdx: could not find symbol '_main' in '%s'\n",
+ argv[1]);
+ exit(255);
+ }
+
+ code = (main_fn)(size_t) s->offset;
+
+ argv++, argc--; /* remove 'rdx' from command line */
+
+ return code(argc, argv); /* execute */
+}
diff --git a/rdoff/segtab.c b/rdoff/segtab.c
new file mode 100644
index 00000000..3c076b6e
--- /dev/null
+++ b/rdoff/segtab.c
@@ -0,0 +1,172 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2014 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "rdfutils.h"
+#include "segtab.h"
+
+struct segtabnode {
+ int localseg;
+ int destseg;
+ int32_t offset;
+
+ struct segtabnode *left;
+ struct segtabnode *right;
+ /*
+ * counts of how many are left or right, for use in reorganising
+ * the tree
+ */
+ int leftcount;
+ int rightcount;
+};
+
+/*
+ * init_seglocations()
+ * add_seglocation()
+ * get_seglocation()
+ * done_seglocation()
+ *
+ * functions used by write_output() to manipulate associations
+ * between segment numbers and locations (which are built up on a per
+ * module basis, but we only need one module at a time...)
+ *
+ * implementation: we build a binary tree.
+ */
+
+void init_seglocations(segtab * root)
+{
+ *root = NULL;
+}
+
+static void descend_tree_add(struct segtabnode **node,
+ int localseg, int destseg, int32_t offset)
+{
+ struct segtabnode *n;
+
+ if (*node == NULL) {
+ *node = nasm_malloc(sizeof(**node));
+ if (!*node) {
+ fprintf(stderr, "segment table: out of memory\n");
+ exit(1);
+ }
+ (*node)->localseg = localseg;
+ (*node)->offset = offset;
+ (*node)->left = NULL;
+ (*node)->leftcount = 0;
+ (*node)->right = NULL;
+ (*node)->rightcount = 0;
+ (*node)->destseg = destseg;
+ return;
+ }
+
+ if (localseg < (*node)->localseg) {
+ (*node)->leftcount++;
+ descend_tree_add(&(*node)->left, localseg, destseg, offset);
+
+ if ((*node)->leftcount > (*node)->rightcount + 2) {
+ n = *node;
+ *node = n->left;
+ n->left = (*node)->right;
+ n->leftcount = (*node)->rightcount;
+ (*node)->right = n;
+ (*node)->rightcount = n->leftcount + n->rightcount + 1;
+ }
+ } else {
+ (*node)->rightcount++;
+ descend_tree_add(&(*node)->right, localseg, destseg, offset);
+
+ if ((*node)->rightcount > (*node)->leftcount + 2) {
+ n = *node;
+ *node = n->right;
+ n->right = (*node)->left;
+ n->rightcount = (*node)->leftcount;
+ (*node)->left = n;
+ (*node)->leftcount = n->leftcount + n->rightcount + 1;
+ }
+ }
+}
+
+void add_seglocation(segtab * root, int localseg, int destseg, int32_t offset)
+{
+ descend_tree_add((struct segtabnode **)root, localseg, destseg,
+ offset);
+}
+
+int get_seglocation(segtab * root, int localseg, int *destseg,
+ int32_t *offset)
+{
+ struct segtabnode *n = (struct segtabnode *)*root;
+
+ while (n && n->localseg != localseg) {
+ if (localseg < n->localseg)
+ n = n->left;
+ else
+ n = n->right;
+ }
+ if (n) {
+ *destseg = n->destseg;
+ *offset = n->offset;
+ return 1;
+ } else
+ return 0;
+}
+
+static void freenode(struct segtabnode *n)
+{
+ if (!n)
+ return;
+ freenode(n->left);
+ freenode(n->right);
+ nasm_free(n);
+}
+
+void done_seglocations(segtab * root)
+{
+ freenode(*root);
+ *root = NULL;
+}
+
+#if 0
+void printnode(int i, struct segtabnode *n)
+{
+ if (!n)
+ return;
+ printnode(i + 1, n->left);
+ printf("%*s%d %d %ld\n", i, "", n->localseg, n->destseg, n->offset);
+ printnode(i + 1, n->right);
+}
+
+void printtable()
+{
+ printnode(0, root);
+}
+#endif
diff --git a/rdoff/segtab.h b/rdoff/segtab.h
new file mode 100644
index 00000000..e5e87931
--- /dev/null
+++ b/rdoff/segtab.h
@@ -0,0 +1,45 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef RDOFF_SEGTAB_H
+#define RDOFF_SEGTAB_H 1
+
+
+typedef void *segtab;
+
+void init_seglocations(segtab * r);
+void add_seglocation(segtab * r, int localseg, int destseg, int32_t offset);
+int get_seglocation(segtab * r, int localseg, int *destseg, int32_t *offset);
+void done_seglocations(segtab * r);
+
+#endif
diff --git a/rdoff/symtab.c b/rdoff/symtab.c
new file mode 100644
index 00000000..270fb89c
--- /dev/null
+++ b/rdoff/symtab.c
@@ -0,0 +1,159 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * symtab.c Routines to maintain and manipulate a symbol table
+ *
+ * These routines donated to the NASM effort by Graeme Defty.
+ */
+
+#include "rdfutils.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "symtab.h"
+#include "hash.h"
+
+#define SYMTABSIZE 64
+#define slotnum(x) (hash((x)) % SYMTABSIZE)
+
+/* ------------------------------------- */
+/* Private data types */
+
+typedef struct tagSymtabNode {
+ struct tagSymtabNode *next;
+ symtabEnt ent;
+} symtabNode;
+
+typedef symtabNode *(symtabTab[SYMTABSIZE]);
+
+typedef symtabTab *symtab;
+
+/* ------------------------------------- */
+void *symtabNew(void)
+{
+ symtab mytab;
+
+ mytab = (symtabTab *) nasm_calloc(SYMTABSIZE, sizeof(symtabNode *));
+ if (mytab == NULL) {
+ fprintf(stderr, "symtab: out of memory\n");
+ exit(3);
+ }
+
+ return mytab;
+}
+
+/* ------------------------------------- */
+void symtabDone(void *stab)
+{
+ symtab mytab = (symtab) stab;
+ int i;
+ symtabNode *this, *next;
+
+ for (i = 0; i < SYMTABSIZE; ++i) {
+
+ for (this = (*mytab)[i]; this; this = next) {
+ next = this->next;
+ nasm_free(this);
+ }
+
+ }
+ nasm_free(*mytab);
+}
+
+/* ------------------------------------- */
+void symtabInsert(void *stab, symtabEnt * ent)
+{
+ symtab mytab = (symtab) stab;
+ symtabNode *node;
+ int slot;
+
+ node = nasm_malloc(sizeof(symtabNode));
+ if (node == NULL) {
+ fprintf(stderr, "symtab: out of memory\n");
+ exit(3);
+ }
+
+ slot = slotnum(ent->name);
+
+ node->ent = *ent;
+ node->next = (*mytab)[slot];
+ (*mytab)[slot] = node;
+}
+
+/* ------------------------------------- */
+symtabEnt *symtabFind(void *stab, const char *name)
+{
+ symtab mytab = (symtab) stab;
+ int slot = slotnum(name);
+ symtabNode *node = (*mytab)[slot];
+
+ while (node) {
+ if (!strcmp(node->ent.name, name)) {
+ return &(node->ent);
+ }
+ node = node->next;
+ }
+
+ return NULL;
+}
+
+/* ------------------------------------- */
+void symtabDump(void *stab, FILE * of)
+{
+ symtab mytab = (symtab) stab;
+ int i;
+ char *SegNames[3] = { "code", "data", "bss" };
+
+ fprintf(of, "Symbol table is ...\n");
+ for (i = 0; i < SYMTABSIZE; ++i) {
+ symtabNode *l = (symtabNode *) (*mytab)[i];
+
+ if (l) {
+ fprintf(of, " ... slot %d ...\n", i);
+ }
+ while (l) {
+ if ((l->ent.segment) == -1) {
+ fprintf(of, "%-32s Unresolved reference\n", l->ent.name);
+ } else {
+ fprintf(of, "%-32s %s:%08"PRIx32" (%"PRId32")\n", l->ent.name,
+ SegNames[l->ent.segment],
+ l->ent.offset, l->ent.flags);
+ }
+ l = l->next;
+ }
+ }
+ fprintf(of, "........... end of Symbol table.\n");
+}
diff --git a/rdoff/symtab.h b/rdoff/symtab.h
new file mode 100644
index 00000000..efd1b68e
--- /dev/null
+++ b/rdoff/symtab.h
@@ -0,0 +1,55 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * symtab.h Header file for symbol table manipulation routines
+ */
+
+#ifndef RDOFF_SYMTAB_H
+#define RDOFF_SYMTAB_H 1
+
+
+typedef struct {
+ char *name;
+ int segment;
+ int32_t offset;
+ int32_t flags;
+} symtabEnt;
+
+void *symtabNew(void);
+void symtabDone(void *symtab);
+void symtabInsert(void *symtab, symtabEnt * ent);
+symtabEnt *symtabFind(void *symtab, const char *name);
+void symtabDump(void *symtab, FILE * of);
+
+#endif
diff --git a/rdoff/test/Makefile b/rdoff/test/Makefile
new file mode 100644
index 00000000..658a6d4e
--- /dev/null
+++ b/rdoff/test/Makefile
@@ -0,0 +1,10 @@
+RDT = $(patsubst %.asm,%.rdf,$(wildcard *.asm))
+NASM = ../../nasm
+
+all: $(RDT)
+
+%.rdf: %.asm
+ $(NASM) -f rdf -o $@ -l $*.lst $<
+
+clean:
+ rm -f *.rdf *.rdx *.lst
diff --git a/rdoff/test/makelib.sh b/rdoff/test/makelib.sh
new file mode 100644
index 00000000..520bb193
--- /dev/null
+++ b/rdoff/test/makelib.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+[ $1 ] || {
+ echo "Usage: $0 <library name> <module> [...]"
+ exit 1
+}
+
+libname=$1; shift
+
+rdflib c $libname
+
+for f in $*; do
+ rdflib a $libname $f $f
+done
diff --git a/rdoff/test/rdfseg.asm b/rdoff/test/rdfseg.asm
new file mode 100644
index 00000000..4c6f587b
--- /dev/null
+++ b/rdoff/test/rdfseg.asm
@@ -0,0 +1,20 @@
+ ;; program to test inter-segment production and linkage of RDF objects
+
+ ;; [1] should produce segment base ref
+ ;; [2] should produce standard relocation
+
+[GLOBAL _main]
+[EXTERN _puts: far]
+[BITS 16]
+
+_main:
+ mov ax, seg _message ; 0000 [1]
+ mov ds, ax ; 0003
+ mov dx, _message ; 0005 [2]
+ call far _puts ; 0008 [2][1]
+ xor ax,ax ; 000D
+ int 21h ; 000F
+
+[SECTION .data]
+_message: db 'Hello, World', 10, 13, 0
+ \ No newline at end of file
diff --git a/rdoff/test/rdfseg2.asm b/rdoff/test/rdfseg2.asm
new file mode 100644
index 00000000..2b9e4fd0
--- /dev/null
+++ b/rdoff/test/rdfseg2.asm
@@ -0,0 +1,12 @@
+ ;; library function for rdfseg - this file is linked as a far segment
+
+[BITS 16]
+[GLOBAL _puts]
+_puts:
+ ;; can't remember how to print a string in DOS, but if anyone wants
+ ;; to actually test this program, it should be fairly easy to put
+ ;; in here!
+
+ retf
+
+ \ No newline at end of file
diff --git a/rdoff/test/rdftest1.asm b/rdoff/test/rdftest1.asm
new file mode 100644
index 00000000..76f1e43e
--- /dev/null
+++ b/rdoff/test/rdftest1.asm
@@ -0,0 +1,54 @@
+ ;; program to test RDOFF production and linkage
+
+ ;; items to test include:
+ ;; [1] relocation within the same segment in each module
+ ;; [2] relocation to different segments in same module
+ ;; [3] relocation to same segment in different module
+ ;; [4] relocation to different segment in different module
+ ;; [5] relative relocation to same module
+ ;; [6] relative relocation to different module
+ ;; [7] correct generation of BSS addresses
+
+[SECTION .text]
+[BITS 32]
+
+_main:
+ mov ax,localdata ; [2] (16 bit) => 66 b8 0000
+ mov eax,localdata2 ; [2] (32 bit) => b8 0000000a
+
+[EXTERN _fardata]
+
+ mov eax,[_fardata] ; [4] => a1 00000000 (+20)
+ mov cx,next ; [1] => 66 b9 0012
+next:
+ call localproc ; [5] => e8 00000019
+
+[EXTERN _farproc]
+ mov eax,_farproc ; [3] => b8 00000000 (+40+0)
+ call _farproc ; [6] => e8 -$ (-0+40+0) (=1f)
+
+ mov eax,localbss ; [7] => b8 00000000
+
+[GLOBAL _term]
+_term: xor ax,ax ; => 66 31 c0
+ int 21h ; => cd 21
+ jmp _term ; => e9 -0a (=fffffff6)
+
+localproc:
+ ret ; => c3
+
+[GLOBAL _test1proc]
+_test1proc:
+ call localproc ; [5] => e8 -$ (-0+0+?) (=-6=fffffffa)
+ ret ; => c3
+
+[SECTION .data]
+[GLOBAL localdata2]
+localdata: db 'localdata',0
+localdata2: db 'localdata2',0
+farref: dd _fardata ; [3] => 0 (+20)
+localref: dd _main ; [2] => 0 (+0)
+
+[SECTION .bss]
+localbss: resw 4 ; reserve 8 bytes BSS
+ \ No newline at end of file
diff --git a/rdoff/test/rdftest2.asm b/rdoff/test/rdftest2.asm
new file mode 100644
index 00000000..25b8c189
--- /dev/null
+++ b/rdoff/test/rdftest2.asm
@@ -0,0 +1,33 @@
+ ;; rdftest2.asm - test linkage and generation of RDOFF files
+
+[SECTION .text]
+[BITS 32]
+
+[GLOBAL _farproc]
+[EXTERN _test1proc]
+[EXTERN localdata2]
+[EXTERN _term]
+_farproc:
+
+ mov bx,localdata2 ; [4] 0 => 66 bb 000a(+0)
+ mov eax,_term ; [3] 5 => b8 00000000(+26+0)
+ call _test1proc ; [6] A => e8 fffffff2(-40+0+31)(=ffffffe3)
+
+ mov eax,_farproc ; [1] => b8 00000000(+40)
+ add eax,[_fardata] ; [2] => 03 05 00000000(+20)
+
+ mov ebx,mybssdata ; [7] => bb 00000000(+08)
+ call myproc ; [5] => e8 00000001
+ ret
+
+myproc:
+ add eax,ebx
+ ret
+
+[SECTION .data]
+[GLOBAL _fardata]
+_fardata: dw _term ; [4]
+_localref: dd _farproc ; [2]
+
+[SECTION .bss]
+mybssdata: resw 1
diff --git a/rdoff/test/rdtlib.asm b/rdoff/test/rdtlib.asm
new file mode 100644
index 00000000..6c2b8ec9
--- /dev/null
+++ b/rdoff/test/rdtlib.asm
@@ -0,0 +1,48 @@
+ ;; library functions for rdtmain - test of rdx linking and execution
+
+ ;; library function = _strcmp, defined as in C
+
+[SECTION .text]
+[BITS 32]
+
+[GLOBAL _strcmp]
+_strcmp:
+ push ebp
+ mov ebp,esp
+
+ ;; ebp+8 = first paramater, ebp+12 = second
+
+ mov esi,[ebp+8]
+ mov edi,[ebp+12]
+
+.loop:
+ mov cl,byte [esi]
+ mov dl,byte [edi]
+ cmp cl,dl
+ jb .below
+ ja .above
+ or cl,cl
+ jz .match
+ inc esi
+ inc edi
+ jmp .loop
+
+.below:
+ mov eax,-1
+ pop ebp
+ ret
+
+.above:
+ mov eax,1
+ pop ebp
+ ret
+
+.match:
+ xor eax,eax
+ pop ebp
+ ret
+
+[SECTION .data]
+[GLOBAL _message]
+
+_message: db 'hello',0 \ No newline at end of file
diff --git a/rdoff/test/rdtmain.asm b/rdoff/test/rdtmain.asm
new file mode 100644
index 00000000..626a2e29
--- /dev/null
+++ b/rdoff/test/rdtmain.asm
@@ -0,0 +1,47 @@
+ ;; rdtmain - main part of test program for RDX execution.
+ ;; returns true (0) if its parameter equals the phrase "hello"
+ ;; "hello" is stored in the library part, to complicate the
+ ;; linkage.
+
+ ;; assemble and link with the following commands:
+ ;; nasm -f rdf rdtmain.asm
+ ;; nasm -f rdf rdtlib.asm
+ ;; ldrdf rdtmain.rdf rdtlib.rdf -o rdxtest.rdx
+
+ ;; run with 'rdx rdxtest.rdx [parameters]' on a Linux (or possibly
+ ;; other 32 bit OS) systems (x86 architectures only!)
+ ;; try using '&& echo Yes' afterwards to find out when it returns 0.
+
+[EXTERN _strcmp] ; strcmp is an imported function
+[EXTERN _message] ; imported data
+[SECTION .text]
+[BITS 32]
+
+ ;; main(int argc,char **argv)
+[GLOBAL _main]
+_main:
+ push ebp
+ mov ebp,esp
+
+ ;; ebp+8 = argc, ebp+12 = argv
+
+ cmp dword [ebp+8],2
+ jb error ; cause error if < 1 parameters
+
+ mov eax, [ebp+12] ; eax = argv
+
+ mov ebx, [eax+4] ; ebx = argv[1]
+ mov ecx, _message ; ecx = "hello"
+
+ push ecx
+ push ebx
+ call _strcmp ; compare strings
+ add esp,8 ; caller clears stack
+
+ pop ebp
+ ret ; return return value of _strcmp
+
+error:
+ mov eax,2 ; return 2 on error
+ pop ebp
+ ret
diff --git a/rdoff/test/testlib.asm b/rdoff/test/testlib.asm
new file mode 100644
index 00000000..6ee3d89a
--- /dev/null
+++ b/rdoff/test/testlib.asm
@@ -0,0 +1,18 @@
+; program to test retrieval of and linkage to modules in libraries by
+; ldrdf
+
+[SECTION .text]
+[GLOBAL _main]
+[EXTERN _strcmp]
+
+_main:
+ push dword string1
+ push dword string2
+ call _strcmp
+ add esp,8 ; doh! clear up stack ;-)
+ ret
+
+[SECTION .data]
+
+string1: db 'abc',0 ; try changing these strings and see
+string2: db 'abd',0 ; what happens!
diff --git a/stdlib/snprintf.c b/stdlib/snprintf.c
new file mode 100644
index 00000000..95bfc314
--- /dev/null
+++ b/stdlib/snprintf.c
@@ -0,0 +1,29 @@
+/*
+ * snprintf()
+ *
+ * Implement snprintf() in terms of vsnprintf()
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "nasmlib.h"
+
+#if !defined(HAVE_SNPRINTF) && !defined(HAVE__SNPRINTF)
+
+int snprintf(char *str, size_t size, const char *format, ...)
+{
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vsnprintf(str, size, format, ap);
+ va_end(ap);
+
+ return rv;
+}
+
+#endif
diff --git a/stdlib/strlcpy.c b/stdlib/strlcpy.c
new file mode 100644
index 00000000..22d9ccfb
--- /dev/null
+++ b/stdlib/strlcpy.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "compiler.h"
+
+/*
+ * Copy src to string dst of size siz. At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+#ifndef HAVE_STRLCPY
+
+size_t strlcpy(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0) {
+ while (--n != 0) {
+ if ((*d++ = *s++) == '\0')
+ break;
+ }
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
+
+#endif
diff --git a/stdlib/strnlen.c b/stdlib/strnlen.c
new file mode 100644
index 00000000..40eacf54
--- /dev/null
+++ b/stdlib/strnlen.c
@@ -0,0 +1,46 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2016 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "compiler.h"
+#include <string.h>
+
+#ifndef HAVE_STRNLEN
+
+size_t strnlen(const char *s, size_t maxlen)
+{
+ const char *end = memchr(s, 0, maxlen);
+
+ return end ? (size_t)(end - s) : maxlen;
+}
+
+#endif
diff --git a/stdlib/strrchrnul.c b/stdlib/strrchrnul.c
new file mode 100644
index 00000000..d25148eb
--- /dev/null
+++ b/stdlib/strrchrnul.c
@@ -0,0 +1,50 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+#include "compiler.h"
+#include <string.h>
+
+#ifndef HAVE_STRRCHRNUL
+
+char *strrchrnul(const char *s, int c)
+{
+ char *p;
+
+ p = strrchr(s, c);
+ if (!p)
+ p = strchr(s, '\0');
+
+ return p;
+}
+
+#endif
diff --git a/stdlib/vsnprintf.c b/stdlib/vsnprintf.c
new file mode 100644
index 00000000..ea83921c
--- /dev/null
+++ b/stdlib/vsnprintf.c
@@ -0,0 +1,50 @@
+/*
+ * vsnprintf()
+ *
+ * Poor substitute for a real vsnprintf() function for systems
+ * that don't have them...
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "nasmlib.h"
+#include "error.h"
+
+#if !defined(HAVE_VSNPRINTF) && !defined(HAVE__VSNPRINTF)
+
+#define BUFFER_SIZE 65536 /* Bigger than any string we might print... */
+
+static char snprintf_buffer[BUFFER_SIZE];
+
+int vsnprintf(char *str, size_t size, const char *format, va_list ap)
+{
+ int rv, bytes;
+
+ if (size > BUFFER_SIZE) {
+ nasm_panic("vsnprintf: size (%d) > BUFFER_SIZE (%d)",
+ size, BUFFER_SIZE);
+ size = BUFFER_SIZE;
+ }
+
+ rv = vsprintf(snprintf_buffer, format, ap);
+ if (rv >= BUFFER_SIZE)
+ nasm_panic("vsnprintf buffer overflow");
+
+ if (size > 0) {
+ if ((size_t)rv < size-1)
+ bytes = rv;
+ else
+ bytes = size-1;
+ memcpy(str, snprintf_buffer, bytes);
+ str[bytes] = '\0';
+ }
+
+ return rv;
+}
+
+#endif
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 00000000..7cba37ec
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,106 @@
+.SUFFIXES: .bin .o .o64 .obj .obj64 .exe .asm .lst .pl
+
+NASMDEP = ../nasm
+NASM = ../nasm
+NASMOPT = -Ox -I../misc $(OPT)
+PERL = perl
+TESTS = $(wildcard *.asm)
+RM_F = rm -f
+RM_RF = rm -rf
+
+$(NASM):
+ $(MAKE) -C ..
+
+%.bin: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f bin -o $@ -MD $@.dep -l $@.lst $<
+
+%.ith: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f ith -o $@ -MD $@.dep -l $@.lst $<
+
+%.srec: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f srec -o $@ -MD $@.dep -l $@.lst $<
+
+%.o: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f elf32 -o $@ -MD $@.dep -l $@.lst $<
+
+%.o64: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f elf64 -o $@ -MD $@.dep -l $@.lst $<
+
+%.obj: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f obj -o $@ -MD $@.dep -l $@.lst $<
+
+%.rdf: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f rdf -o $@ -MD $@.dep -l $@.lst $<
+
+%.od: %.obj ../misc/omfdump
+ ../misc/omfdump $< > $@
+
+%.coff: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f coff -o $@ -MD $@.dep -l $@.lst $<
+
+%.win32: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f win32 -o $@ -MD $@.dep -l $@.lst $<
+
+%.win64: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f win64 -o $@ -MD $@.dep -l $@.lst $<
+
+%.mo32: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f macho32 -o $@ -MD $@.dep -l $@.lst $<
+
+%.mo64: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f macho64 -o $@ -MD $@.dep -l $@.lst $<
+
+%.dbg: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f dbg -o $@ -MD $@.dep -l $@.lst $<
+
+%.asm: %.pl
+ $(PERL) $< > $@
+
+%.i: %.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -E -o $@ -MD $@.dep $<
+
+all:
+
+golden: performtest.pl $(TESTS)
+ $(PERL) performtest.pl --golden --nasm='$(NASM)' $(TESTS)
+
+test: performtest.pl $(NASMDEP) $(TESTS)
+ $(PERL) performtest.pl --nasm='$(NASM)' $(TESTS)
+
+diff: performtest.pl $(NASMDEP) $(TESTS)
+ $(PERL) performtest.pl --diff --nasm='$(NASM)' $(TESTS)
+
+clean:
+ $(RM_F) *.com *.o *.o64 *.obj *.win32 *.win64 *.exe *.lst *.bin
+ $(RM_F) *.dbg *.coff *.ith *.srec *.mo32 *.mo64 *.i *.dep *.rdf
+ $(RM_RF) testresults
+ $(RM_F) elftest elftest64
+
+spotless: clean
+ $(RM_RF) golden
+
+#
+# Test for ELF32 shared libraries; assumes an x86 Linux system
+#
+elfso.o: elfso.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f elf32 -F stabs -o $@ -MD $@.dep -l $@.lst $<
+
+elfso.so: elfso.o
+ $(LD) -m elf_i386 -shared -o $@ -MD $@.dep $<
+
+elftest: elftest.c elfso.so
+ $(CC) -g -m32 -o $@ -MD $@.dep $^
+ -env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./elftest
+
+#
+# Test for ELF64 shared libraries; assumes an x86-64 Linux system
+#
+elf64so.o: elf64so.asm $(NASMDEP)
+ $(NASM) $(NASMOPT) -f elf64 -F dwarf -o $@ -MD $@.dep -l $@.lst $<
+
+elf64so.so: elf64so.o
+ $(LD) -shared -o $@ -MD $@.dep $<
+
+elftest64: elftest64.c elf64so.so
+ $(CC) -g -o $@ -MD $@.dep $^
+ -env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./elftest64
diff --git a/test/_file_.asm b/test/_file_.asm
new file mode 100644
index 00000000..f633febd
--- /dev/null
+++ b/test/_file_.asm
@@ -0,0 +1,5 @@
+;Testname=bin; Arguments=-fbin -o_file_.bin; Files=stdout stderr _file_.bin
+ db __FILE__, `\r\n`
+ db __FILE__, `\r\n`
+ dw __LINE__
+ dw __LINE__
diff --git a/test/_version.asm b/test/_version.asm
new file mode 100644
index 00000000..d20a74d1
--- /dev/null
+++ b/test/_version.asm
@@ -0,0 +1,2 @@
+;Testname=version; Arguments=-v; Files=stdout
+;Dummy test to record version numbers
diff --git a/test/a32offs.asm b/test/a32offs.asm
new file mode 100644
index 00000000..4d17e0e4
--- /dev/null
+++ b/test/a32offs.asm
@@ -0,0 +1,9 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -oa32offs.bin; Files=a32offs.bin stdout stderr
+;Testname=optimized; Arguments=-Ox -fbin -oa32offs.bin; Files=a32offs.bin stdout stderr
+ bits 16
+foo: a32 loop foo
+bar: loop bar, ecx
+
+ bits 32
+baz: a16 loop baz
+qux: loop qux, cx
diff --git a/test/absolute.asm b/test/absolute.asm
new file mode 100644
index 00000000..969a85e9
--- /dev/null
+++ b/test/absolute.asm
@@ -0,0 +1,41 @@
+;Testname=bin; Arguments=-fbin -oabsolute.bin; Files=stdout stderr absolute.bin
+%ifmacro org
+ org 7c00h
+%endif
+init_foo:
+ jmp init_bar
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+
+init_bar:
+ mov [b1],dl
+ mov [b2],edx
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ ret
+
+ absolute init_bar+7
+b1: resb 1
+b2: resd 6
diff --git a/test/addr64x.asm b/test/addr64x.asm
new file mode 100644
index 00000000..c7a64f5d
--- /dev/null
+++ b/test/addr64x.asm
@@ -0,0 +1,18 @@
+;Testname=O0; Arguments=-O0 -fbin -oaddr64.bin; Files=stdout stderr addr64.bin
+;Testname=O1; Arguments=-O1 -fbin -oaddr64.bin; Files=stdout stderr addr64.bin
+;Testname=Ox; Arguments=-Ox -fbin -oaddr64.bin; Files=stdout stderr addr64.bin
+ bits 64
+ mov rdx,[rax]
+ mov eax,[byte rsp+0x01]
+ mov eax,[byte rsp-0x01]
+ mov eax,[byte rsp+0xFF]
+ mov eax,[byte rsp-0xFF]
+ mov eax,[rsp+0x08]
+ mov eax,[rsp-0x01]
+ mov eax,[rsp+0xFF]
+ mov eax,[rsp-0xFF]
+ mov rax,[rsp+56]
+ mov [rsi],dl
+ mov byte [rsi],'-'
+ mov [rsi],al
+ mov byte [rsi],' '
diff --git a/test/align13.asm b/test/align13.asm
new file mode 100644
index 00000000..4a41a779
--- /dev/null
+++ b/test/align13.asm
@@ -0,0 +1,19 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -oalign13.bin; Files=stdout stderr align13.bin
+;Testname=optimized; Arguments=-Ox -fbin -oalign13.bin; Files=stdout stderr align13.bin
+
+; Test of non-power-of-2 alignment
+
+ bits 32
+
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ align 13 ;should do nothing
+ inc eax
+ inc eax
diff --git a/test/align13s.asm b/test/align13s.asm
new file mode 100644
index 00000000..7f783175
--- /dev/null
+++ b/test/align13s.asm
@@ -0,0 +1,20 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -oalign13s.bin; Files=stdout stderr align13s.bin
+;Testname=optimized; Arguments=-Ox -fbin -oalign13s.bin; Files=stdout stderr align13s.bin
+
+; Test of non-power-of-2 alignment
+
+%use smartalign
+
+ bits 32
+
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
diff --git a/test/alonesym-obj.asm b/test/alonesym-obj.asm
new file mode 100644
index 00000000..8db3a2c4
--- /dev/null
+++ b/test/alonesym-obj.asm
@@ -0,0 +1,166 @@
+;Testname=unoptimized; Arguments=-O0 -fobj -oalonesym-obj.obj; Files=stdout stderr alonesym-obj.obj
+;Testname=optimized; Arguments=-Ox -fobj -oalonesym-obj.obj; Files=stdout stderr alonesym-obj.obj
+
+section DOS32DATA align=16 public use32 FLAT class=DOS32DATA
+
+ global sym0000
+ global sym0001
+ global sym0002
+ global sym0003
+ global sym0004
+ global sym0005
+ global sym0006
+ global sym0007
+ global sym0008
+ global sym0009
+ global sym0010
+ global sym0011
+ global sym0012
+ global sym0013
+ global sym0014
+ global sym0015
+ global sym0016
+ global sym0017
+ global sym0018
+ global sym0019
+ global sym0020
+ global sym0021
+ global sym0022
+ global sym0023
+ global sym0024
+ global sym0025
+ global sym0026
+ global sym0027
+ global sym0028
+ global sym0029
+ global sym0030
+ global sym0031
+ global sym0032
+ global sym0033
+ global sym0034
+ global sym0035
+ global sym0036
+ global sym0037
+ global sym0038
+ global sym0039
+ global sym0040
+ global sym0041
+ global sym0042
+ global sym0043
+ global sym0044
+ global sym0045
+ global sym0046
+ global sym0047
+ global sym0048
+ global sym0049
+ global sym0050
+ global sym0051
+ global sym0052
+ global sym0053
+ global sym0054
+ global sym0055
+ global sym0056
+ global sym0057
+ global sym0058
+ global sym0059
+ global sym0060
+ global sym0061
+ global sym0062
+ global sym0063
+ global sym0064
+ global sym0065
+ global sym0066
+ global sym0067
+ global sym0068
+ global sym0069
+ global sym0070
+ global sym0071
+ global sym0072
+ global sym0073
+ global sym0074
+ global sym0075
+ global sym0076
+ global sym0077
+ global s
+
+
+ resb 20000h
+sym0000 resd 1
+sym0001 resd 1
+sym0002 resd 1
+sym0003 resd 1
+sym0004 resd 1
+sym0005 resd 1
+sym0006 resd 1
+sym0007 resd 1
+sym0008 resd 1
+sym0009 resd 1
+sym0010 resd 1
+sym0011 resd 1
+sym0012 resd 1
+sym0013 resd 1
+sym0014 resd 1
+sym0015 resd 1
+sym0016 resd 1
+sym0017 resd 1
+sym0018 resd 1
+sym0019 resd 1
+sym0020 resd 1
+sym0021 resd 1
+sym0022 resd 1
+sym0023 resd 1
+sym0024 resd 1
+sym0025 resd 1
+sym0026 resd 1
+sym0027 resd 1
+sym0028 resd 1
+sym0029 resd 1
+sym0030 resd 1
+sym0031 resd 1
+sym0032 resd 1
+sym0033 resd 1
+sym0034 resd 1
+sym0035 resd 1
+sym0036 resd 1
+sym0037 resd 1
+sym0038 resd 1
+sym0039 resd 1
+sym0040 resd 1
+sym0041 resd 1
+sym0042 resd 1
+sym0043 resd 1
+sym0044 resd 1
+sym0045 resd 1
+sym0046 resd 1
+sym0047 resd 1
+sym0048 resd 1
+sym0049 resd 1
+sym0050 resd 1
+sym0051 resd 1
+sym0052 resd 1
+sym0053 resd 1
+sym0054 resd 1
+sym0055 resd 1
+sym0056 resd 1
+sym0057 resd 1
+sym0058 resd 1
+sym0059 resd 1
+sym0060 resd 1
+sym0061 resd 1
+sym0062 resd 1
+sym0063 resd 1
+sym0064 resd 1
+sym0065 resd 1
+sym0066 resd 1
+sym0067 resd 1
+sym0068 resd 1
+sym0069 resd 1
+sym0070 resd 1
+sym0071 resd 1
+sym0072 resd 1
+sym0073 resd 1
+sym0074 resd 1
+sym0075 resd 1
+sym0076 resd 1
+sym0077 resd 1
+s resd 1
diff --git a/test/andbyte.asm b/test/andbyte.asm
new file mode 100644
index 00000000..3d3b1c1a
--- /dev/null
+++ b/test/andbyte.asm
@@ -0,0 +1,15 @@
+;Testname=test; Arguments=-fbin -oandbyte.bin; Files=stdout stderr andbyte.bin
+;Testname=otest; Arguments=-Ox -fbin -oandbyte.bin; Files=stdout stderr andbyte.bin
+
+ bits 16
+
+ add sp, byte -0x10
+ add sp, -0x10
+ adc sp, byte -0x10
+ adc sp, -0x10
+ and sp, byte -0x10
+ and sp, -0x10
+ sbb sp, byte -0x10
+ sbb sp, -0x10
+ sub sp, byte -0x10
+ sub sp, -0x10
diff --git a/test/aoutso.asm b/test/aoutso.asm
new file mode 100644
index 00000000..aab35a56
--- /dev/null
+++ b/test/aoutso.asm
@@ -0,0 +1,99 @@
+;Testname=unoptimized; Arguments=-O0 -faoutb -oaoutso.o; Files=stdout stderr aoutso.o
+;Testname=optimized; Arguments=-Ox -faoutb -oaoutso.o; Files=stdout stderr aoutso.o
+
+; test source file for assembling to NetBSD/FreeBSD a.out shared library
+; build with:
+; nasm -f aoutb aoutso.asm
+; ld -Bshareable -o aoutso.so aoutso.o
+; test with:
+; cc -o aoutso aouttest.c aoutso.so
+; ./aoutso
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+
+ BITS 32
+ EXTERN __GLOBAL_OFFSET_TABLE_
+ GLOBAL _lrotate:function ; [1]
+ GLOBAL _greet:function ; [1]
+ GLOBAL _asmstr:data _asmstr.end-_asmstr ; [2]
+ GLOBAL _textptr:data 4 ; [2]
+ GLOBAL _selfptr:data 4 ; [2]
+ GLOBAL _integer:data 4 ; [3]
+ EXTERN _printf ; [10]
+ COMMON _commvar 4 ; [7]
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+_lrotate: ; [1]
+ push ebp
+ mov ebp,esp
+ mov eax,[ebp+8]
+ mov ecx,[ebp+12]
+.label rol eax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov esp,ebp
+ pop ebp
+ ret
+
+; prototype: void greet(void);
+_greet push ebx ; we'll use EBX for GOT, so save it
+ call .getgot
+.getgot: pop ebx
+ add ebx,__GLOBAL_OFFSET_TABLE_ + $$ - .getgot wrt ..gotpc
+ mov eax,[ebx+_integer wrt ..got] ; [14]
+ mov eax,[eax]
+ inc eax
+ mov [ebx+localint wrt ..gotoff],eax ; [14]
+ mov eax,[ebx+_commvar wrt ..got]
+ push dword [eax]
+ mov eax,[ebx+localptr wrt ..gotoff] ; [13]
+ push dword [eax]
+ mov eax,[ebx+_integer wrt ..got] ; [1] [14]
+ push dword [eax]
+ lea eax,[ebx+_printfstr wrt ..gotoff]
+ push eax ; [13]
+ call _printf wrt ..plt ; [11]
+ add esp,16
+ pop ebx
+ ret
+
+ SECTION .data
+
+; a string
+_asmstr db 'hello, world', 0 ; [2]
+.end
+
+; a string for Printf
+_printfstr db "integer==%d, localint==%d, commvar=%d"
+ db 10, 0
+
+; some pointers
+localptr dd localint ; [5] [17]
+_textptr dd _greet wrt ..sym ; [15]
+_selfptr dd _selfptr wrt ..sym ; [16]
+
+ SECTION .bss
+
+; an integer
+_integer resd 1 ; [3]
+
+; a local integer
+localint resd 1 ; [6]
diff --git a/test/aouttest.asm b/test/aouttest.asm
new file mode 100644
index 00000000..10d0e10a
--- /dev/null
+++ b/test/aouttest.asm
@@ -0,0 +1,86 @@
+;Testname=unoptimized; Arguments=-O0 -faout -oaouttest.o; Files=stdout stderr aouttest.o
+;Testname=optimized; Arguments=-Ox -faout -oaouttest.o; Files=stdout stderr aouttest.o
+
+; test source file for assembling to a.out
+; build with:
+; nasm -f aout aouttest.asm
+; gcc -o aouttest aouttest.c aouttest.o
+; (assuming your gcc is a.out)
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+
+ BITS 32
+ GLOBAL _lrotate ; [1]
+ GLOBAL _greet ; [1]
+ GLOBAL _asmstr ; [2]
+ GLOBAL _textptr ; [2]
+ GLOBAL _selfptr ; [2]
+ GLOBAL _integer ; [3]
+ EXTERN _printf ; [10]
+ COMMON _commvar 4 ; [7]
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+_lrotate: ; [1]
+ push ebp
+ mov ebp,esp
+ mov eax,[ebp+8]
+ mov ecx,[ebp+12]
+.label rol eax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov esp,ebp
+ pop ebp
+ ret
+
+; prototype: void greet(void);
+_greet mov eax,[_integer] ; [14]
+ inc eax
+ mov [localint],eax ; [14]
+ push dword [_commvar]
+ mov eax,[localptr] ; [13]
+ push dword [eax]
+ push dword [_integer] ; [1] [14]
+ push dword _printfstr ; [13]
+ call _printf ; [11]
+ add esp,16
+ ret
+
+ SECTION .data
+
+; a string
+_asmstr db 'hello, world', 0 ; [2]
+
+; a string for Printf
+_printfstr db "integer==%d, localint==%d, commvar=%d"
+ db 10, 0
+
+; some pointers
+localptr dd localint ; [5] [17]
+_textptr dd _greet ; [15]
+_selfptr dd _selfptr ; [16]
+
+ SECTION .bss
+
+; an integer
+_integer resd 1 ; [3]
+
+; a local integer
+localint resd 1 ; [6]
diff --git a/test/aouttest.c b/test/aouttest.c
new file mode 100644
index 00000000..2514ce1a
--- /dev/null
+++ b/test/aouttest.c
@@ -0,0 +1,36 @@
+/*
+ * test source file for assembling to a.out
+ * build with:
+ * nasm -f aout aouttest.asm
+ * gcc -o aouttest aouttest.c aouttest.o
+ * (assuming your gcc is a.out)
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+
+extern int lrotate(int32_t, int);
+extern void greet(void);
+extern int8_t asmstr[];
+extern void *selfptr;
+extern void *textptr;
+extern int integer, commvar;
+
+int main(void)
+{
+
+ printf("Testing lrotate: should get 0x00400000, 0x00000001\n");
+ printf("lrotate(0x00040000, 4) = 0x%08lx\n", lrotate(0x40000, 4));
+ printf("lrotate(0x00040000, 14) = 0x%08lx\n", lrotate(0x40000, 14));
+
+ printf("This string should read `hello, world': `%s'\n", asmstr);
+
+ printf("The integers here should be 1234, 1235 and 4321:\n");
+ integer = 1234;
+ commvar = 4321;
+ greet();
+
+ printf("These pointers should be equal: %p and %p\n", &greet, textptr);
+
+ printf("So should these: %p and %p\n", selfptr, &selfptr);
+}
diff --git a/test/avx.asm b/test/avx.asm
new file mode 100644
index 00000000..e114639d
--- /dev/null
+++ b/test/avx.asm
@@ -0,0 +1,46 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -oavx.bin; Files=stdout stderr avx.bin
+;Testname=optimized; Arguments=-Ox -fbin -oavx.bin; Files=stdout stderr avx.bin
+
+ bits 64
+ blendvpd xmm2,xmm1,xmm0
+
+ vblendvpd xmm2,xmm1,xmm0,xmm0
+ vblendvpd xmm2,xmm1,xmm0
+ vblendvpd ymm2,ymm1,ymm0,ymm0
+ vblendvpd ymm2,ymm1,ymm0
+
+ vcvtsi2sd xmm9,xmm10,ecx
+ vcvtsi2sd xmm9,xmm10,rcx
+ vcvtsi2sd xmm9,xmm10,dword [rdi]
+ vcvtsi2sd xmm9,xmm10,qword [rdi]
+
+ vpextrb [rax],xmm1,0x33
+ vpextrw [rax],xmm1,0x33
+ vpextrd [rax],xmm1,0x33
+ vpextrq [rax],xmm1,0x33
+ vpextrb rax,xmm1,0x33
+ vpextrw rax,xmm1,0x33
+ vpextrd rax,xmm1,0x33
+ vpextrq rax,xmm1,0x33
+ vpextrb eax,xmm1,0x33
+ vpextrw eax,xmm1,0x33
+ vpextrd eax,xmm1,0x33
+; vpextrq eax,xmm1,0x33
+
+ vcvtpd2ps xmm0,xmm1
+ vcvtpd2ps xmm0,oword [rsi]
+ vcvtpd2ps xmm0,ymm1
+ vcvtpd2ps xmm0,yword [rsi]
+; vcvtpd2ps xmm0,[rsi]
+
+ vcvtpd2dq xmm0,xmm1
+ vcvtpd2dq xmm0,oword [rsi]
+ vcvtpd2dq xmm0,ymm1
+ vcvtpd2dq xmm0,yword [rsi]
+; vcvtpd2dq xmm0,[rsi]
+
+ vcvttpd2dq xmm0,xmm1
+ vcvttpd2dq xmm0,oword [rsi]
+ vcvttpd2dq xmm0,ymm1
+ vcvttpd2dq xmm0,yword [rsi]
+; vcvttpd2dq xmm0,[rsi]
diff --git a/test/avx005.asm b/test/avx005.asm
new file mode 100644
index 00000000..08765140
--- /dev/null
+++ b/test/avx005.asm
@@ -0,0 +1,529 @@
+;Testname=avx005; Arguments=-fbin -oavx005.bin -Ox; Files=stdout stderr avx005.bin
+
+%define regxmm xmm0
+%define regymm ymm0
+%define mem [0]
+%define imm 3
+
+%macro x 1+.nolist
+ %1 ; comment this line if RELAXed variants are not supported
+%endmacro
+
+ VFMADDSUB132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADDSUB132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD132SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMADD132SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD312SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMADD312SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMADD132SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMADD132SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD312SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMADD312SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB132SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMSUB132SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB312SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMSUB312SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB132SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMSUB132SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB312SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMSUB312SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD132SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMADD132SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD312SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMADD312SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD132SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMADD132SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD312SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMADD312SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB132PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB132PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB132PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB132PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB312PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB312PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB312PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB312PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB132PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB132PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB132PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB132PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB312PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB312PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB312PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB312PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB132SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMSUB132SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB312SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMSUB312SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB132SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMSUB132SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB312SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMSUB312SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMADDSUB213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADDSUB213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD213SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMADD213SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD123SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMADD123SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMADD213SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMADD213SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD123SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMADD123SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB213SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMSUB213SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB123SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMSUB123SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB213SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMSUB213SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB123SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMSUB123SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD213SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMADD213SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD123SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMADD123SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD213SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMADD213SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD123SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMADD123SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB213PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB213PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB213PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB213PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB123PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB123PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB123PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB123PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB213PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB213PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB213PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB213PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB123PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB123PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB123PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB123PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB213SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMSUB213SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB123SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMSUB123SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB213SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMSUB213SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB123SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMSUB123SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMADDSUB231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADDSUB231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADDSUB231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADDSUB231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADDSUB231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADDSUB321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADDSUB321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADDSUB321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADDSUB321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUBADD231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUBADD231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUBADD231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUBADD231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUBADD321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUBADD321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUBADD321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUBADD321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMADD231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMADD231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMADD231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMADD321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMADD321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMADD321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMADD321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMADD231SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMADD231SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD321SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMADD321SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMADD231SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMADD231SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMADD321SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMADD321SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFMSUB231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFMSUB231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFMSUB231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFMSUB321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFMSUB321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFMSUB321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFMSUB321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFMSUB231SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFMSUB231SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB321SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFMSUB321SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFMSUB231SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFMSUB231SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFMSUB321SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFMSUB321SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMADD231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMADD231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMADD231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMADD321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMADD321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMADD321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMADD321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMADD231SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMADD231SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD321SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMADD321SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMADD231SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMADD231SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMADD321SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMADD321SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB231PS regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB231PS regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB231PS regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB231PS regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB321PS regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB321PS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB321PS regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB321PS regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB231PD regxmm,regxmm,mem ; VEX_FMA,SO
+ VFNMSUB231PD regxmm,regxmm,regxmm ; VEX_FMA
+ VFNMSUB231PD regymm,regymm,mem ; VEX_FMA,SY
+ VFNMSUB231PD regymm,regymm,regymm ; VEX_FMA
+
+x VFNMSUB321PD regxmm,regxmm,mem ; VEX_FMA,RELAX,SO
+x VFNMSUB321PD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+x VFNMSUB321PD regymm,regymm,mem ; VEX_FMA,RELAX,SY
+x VFNMSUB321PD regymm,regymm,regymm ; VEX_FMA,RELAX
+
+ VFNMSUB231SS regxmm,regxmm,mem ; VEX_FMA,SD
+ VFNMSUB231SS regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB321SS regxmm,regxmm,mem ; VEX_FMA,RELAX,SD
+x VFNMSUB321SS regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VFNMSUB231SD regxmm,regxmm,mem ; VEX_FMA,SQ
+ VFNMSUB231SD regxmm,regxmm,regxmm ; VEX_FMA
+
+x VFNMSUB321SD regxmm,regxmm,mem ; VEX_FMA,RELAX,SQ
+x VFNMSUB321SD regxmm,regxmm,regxmm ; VEX_FMA,RELAX
+
+ VPCLMULLQLQDQ regxmm,regxmm,mem ; PCLMUL,VEX_AVX,SO
+ VPCLMULLQLQDQ regxmm,regxmm,regxmm ; PCLMUL,VEX_AVX
+ VPCLMULHQLQDQ regxmm,regxmm,mem ; PCLMUL,VEX_AVX,SO
+ VPCLMULHQLQDQ regxmm,regxmm,regxmm ; PCLMUL,VEX_AVX
+ VPCLMULLQHQDQ regxmm,regxmm,mem ; PCLMUL,VEX_AVX,SO
+ VPCLMULLQHQDQ regxmm,regxmm,regxmm ; PCLMUL,VEX_AVX
+ VPCLMULHQHQDQ regxmm,regxmm,mem ; PCLMUL,VEX_AVX,SO
+ VPCLMULHQHQDQ regxmm,regxmm,regxmm ; PCLMUL,VEX_AVX
+ VPCLMULQDQ regxmm,regxmm,mem,imm ; PCLMUL,VEX_AVX,SB3,SO
+ VPCLMULQDQ regxmm,regxmm,regxmm,imm ; PCLMUL,VEX_AVX,SB3
+
+; EOF
+
+
diff --git a/test/avx2.asm b/test/avx2.asm
new file mode 100644
index 00000000..b6228513
--- /dev/null
+++ b/test/avx2.asm
@@ -0,0 +1,1608 @@
+; AVX testcases from gas
+;------------------------
+
+;
+; This file is taken from there
+; http://sourceware.org/ml/binutils/2011-06/msg00150.html
+; So the original author is "H.J. Lu" <hongjiu dot lu at intel dot com>
+;
+; nasm64developer adopted it for the nasm testing suite
+
+%macro testcase 2
+ %ifdef BIN
+ db %1
+ %endif
+ %ifdef SRC
+ %2
+ %endif
+%endmacro
+
+bits 32
+
+; b/gas/testsuite/gas/i386/avx-gather-intel.d
+testcase { 0xc4, 0xe2, 0xe9, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdpd xmm1,QWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xe9, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqpd xmm1,QWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdpd ymm1,QWORD [ebp+xmm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqpd ymm1,QWORD [ebp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm4*1-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm4*8-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0x69, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdps xmm1,DWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x69, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqps xmm1,DWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdps ymm1,DWORD [ebp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqps xmm1,DWORD [ebp+ymm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm4*1-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm4*8-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x69, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdd xmm1,DWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x69, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqd xmm1,DWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdd ymm1,DWORD [ebp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqd xmm1,DWORD [ebp+ymm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm4*1-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm4*8-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0xe9, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdq xmm1,QWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xe9, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqq xmm1,QWORD [ebp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdq ymm1,QWORD [ebp+xmm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqq ymm1,QWORD [ebp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm4*1-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm4*8-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x298],ymm5 }
+
+; b/gas/testsuite/gas/i386/avx2-intel.d
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0xd6, 0x07 }, { vpermpd ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0xd6, 0x07 }, { vpermq ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0xd4 }, { vpermd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0xd4 }, { vpermps ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0xd4 }, { vpsllvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0xd4 }, { vpsllvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0xd4 }, { vpsravd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0xd4 }, { vpsrlvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0xd4 }, { vpsrlvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x19, 0xf4 }, { vbroadcastsd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x18, 0xf4 }, { vbroadcastss ymm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0xd4, 0x07 }, { vpblendd ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0xd4, 0x07 }, { vperm2i128 ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0xf4, 0x07 }, { vinserti128 ymm6,ymm4,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0xd4 }, { vpsllvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0xd4 }, { vpsllvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0xd4 }, { vpsravd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0xd4 }, { vpsrlvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0xd4 }, { vpsrlvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0xe6, 0x07 }, { vextracti128 xmm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [ecx],ymm4,0x7 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0xd4, 0x07 }, { vpblendd xmm2,xmm6,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0xf4 }, { vpbroadcastq xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0xf4 }, { vpbroadcastq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0xe4 }, { vpbroadcastd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0xf4 }, { vpbroadcastd xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0xf4 }, { vpbroadcastw xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0xf4 }, { vpbroadcastw ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0xf4 }, { vpbroadcastb xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0xf4 }, { vpbroadcastb ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x18, 0xf4 }, { vbroadcastss xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [ecx],ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0xd6, 0x07 }, { vpermpd ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0xd6, 0x07 }, { vpermq ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0xd4 }, { vpermd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0xd4 }, { vpermps ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0xd4 }, { vpsllvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0xd4 }, { vpsllvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0xd4 }, { vpsravd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0xd4 }, { vpsrlvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0xd4 }, { vpsrlvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x19, 0xf4 }, { vbroadcastsd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x18, 0xf4 }, { vbroadcastss ymm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0xd4, 0x07 }, { vpblendd ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0xd4, 0x07 }, { vperm2i128 ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0xf4, 0x07 }, { vinserti128 ymm6,ymm4,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0xd4 }, { vpsllvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0xd4 }, { vpsllvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0xd4 }, { vpsravd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0xd4 }, { vpsrlvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0xd4 }, { vpsrlvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [ecx] }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0xe6, 0x07 }, { vextracti128 xmm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [ecx],ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [ecx],ymm4,0x7 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [ecx],xmm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0xd4, 0x07 }, { vpblendd xmm2,xmm6,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [ecx],0x7 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0xf4 }, { vpbroadcastq xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0xf4 }, { vpbroadcastq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0xe4 }, { vpbroadcastd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0xf4 }, { vpbroadcastd xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0xf4 }, { vpbroadcastw xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0xf4 }, { vpbroadcastw ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0xf4 }, { vpbroadcastb xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0xf4 }, { vpbroadcastb ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [ecx] }
+testcase { 0xc4, 0xe2, 0x79, 0x18, 0xf4 }, { vbroadcastss xmm6,xmm4 }
+
+; b/gas/testsuite/gas/i386/avx256int-intel.d
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xed, 0x72, 0xf6, 0x07 }, { vpslld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xfe, 0x07 }, { vpslldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xf6, 0x07 }, { vpsllq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xf6, 0x07 }, { vpsllw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xe6, 0x07 }, { vpsrad ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xe6, 0x07 }, { vpsraw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xd6, 0x07 }, { vpsrld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xde, 0x07 }, { vpsrldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xd6, 0x07 }, { vpsrlq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xd6, 0x07 }, { vpsrlw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0xd6, 0x07 }, { vpshufd ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0xd6, 0x07 }, { vpshufhw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0xd6, 0x07 }, { vpshuflw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xcd, 0x6b, 0xd4 }, { vpackssdw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x63, 0xd4 }, { vpacksswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0xd4 }, { vpackusdw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x67, 0xd4 }, { vpackuswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfc, 0xd4 }, { vpaddb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfd, 0xd4 }, { vpaddw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfe, 0xd4 }, { vpaddd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd4, 0xd4 }, { vpaddq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xec, 0xd4 }, { vpaddsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xed, 0xd4 }, { vpaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdc, 0xd4 }, { vpaddusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdd, 0xd4 }, { vpaddusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdb, 0xd4 }, { vpand ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdf, 0xd4 }, { vpandn ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe0, 0xd4 }, { vpavgb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe3, 0xd4 }, { vpavgw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x74, 0xd4 }, { vpcmpeqb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x75, 0xd4 }, { vpcmpeqw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x76, 0xd4 }, { vpcmpeqd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0xd4 }, { vpcmpeqq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x64, 0xd4 }, { vpcmpgtb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x65, 0xd4 }, { vpcmpgtw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x66, 0xd4 }, { vpcmpgtd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0xd4 }, { vpcmpgtq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0xd4 }, { vphaddw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0xd4 }, { vphaddd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0xd4 }, { vphaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0xd4 }, { vphsubw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0xd4 }, { vphsubd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0xd4 }, { vphsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf5, 0xd4 }, { vpmaddwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0xd4 }, { vpmaddubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0xd4 }, { vpmaxsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xee, 0xd4 }, { vpmaxsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0xd4 }, { vpmaxsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xde, 0xd4 }, { vpmaxub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0xd4 }, { vpmaxuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0xd4 }, { vpmaxud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0xd4 }, { vpminsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xea, 0xd4 }, { vpminsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0xd4 }, { vpminsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xda, 0xd4 }, { vpminub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0xd4 }, { vpminuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0xd4 }, { vpminud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe4, 0xd4 }, { vpmulhuw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0xd4 }, { vpmulhrsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe5, 0xd4 }, { vpmulhw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd5, 0xd4 }, { vpmullw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0xd4 }, { vpmulld ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf4, 0xd4 }, { vpmuludq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0xd4 }, { vpmuldq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xeb, 0xd4 }, { vpor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf6, 0xd4 }, { vpsadbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0xd4 }, { vpshufb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0xd4 }, { vpsignb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0xd4 }, { vpsignw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0xd4 }, { vpsignd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf8, 0xd4 }, { vpsubb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf9, 0xd4 }, { vpsubw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfa, 0xd4 }, { vpsubd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfb, 0xd4 }, { vpsubq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe8, 0xd4 }, { vpsubsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe9, 0xd4 }, { vpsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd8, 0xd4 }, { vpsubusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd9, 0xd4 }, { vpsubusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x68, 0xd4 }, { vpunpckhbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x69, 0xd4 }, { vpunpckhwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6a, 0xd4 }, { vpunpckhdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6d, 0xd4 }, { vpunpckhqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x60, 0xd4 }, { vpunpcklbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x61, 0xd4 }, { vpunpcklwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x62, 0xd4 }, { vpunpckldq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6c, 0xd4 }, { vpunpcklqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xef, 0xd4 }, { vpxor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0xf4 }, { vpabsb ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0xf4 }, { vpabsw ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0xf4 }, { vpabsd ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0xd4, 0x07 }, { vmpsadbw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0xd4, 0x07 }, { vpalignr ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0xd4, 0x07 }, { vpblendw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0xfe, 0x40 }, { vpblendvb ymm7,ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [ecx],ymm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0xd4 }, { vpsllw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf2, 0xd4 }, { vpslld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf3, 0xd4 }, { vpsllq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe1, 0xd4 }, { vpsraw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe2, 0xd4 }, { vpsrad ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd1, 0xd4 }, { vpsrlw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd2, 0xd4 }, { vpsrld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd3, 0xd4 }, { vpsrlq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0xe4 }, { vpmovsxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0xe4 }, { vpmovsxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0xe4 }, { vpmovsxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0xe4 }, { vpmovzxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0xe4 }, { vpmovzxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0xe4 }, { vpmovzxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0xf4 }, { vpmovsxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0xf4 }, { vpmovsxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0xf4 }, { vpmovzxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0xf4 }, { vpmovzxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0xe4 }, { vpmovsxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0xe4 }, { vpmovzxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [ecx] }
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xed, 0x72, 0xf6, 0x07 }, { vpslld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xfe, 0x07 }, { vpslldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xf6, 0x07 }, { vpsllq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xf6, 0x07 }, { vpsllw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xe6, 0x07 }, { vpsrad ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xe6, 0x07 }, { vpsraw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xd6, 0x07 }, { vpsrld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xde, 0x07 }, { vpsrldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xd6, 0x07 }, { vpsrlq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xd6, 0x07 }, { vpsrlw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0xd6, 0x07 }, { vpshufd ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0xd6, 0x07 }, { vpshufhw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0xd6, 0x07 }, { vpshuflw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [ecx],0x7 }
+testcase { 0xc5, 0xcd, 0x6b, 0xd4 }, { vpackssdw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x63, 0xd4 }, { vpacksswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0xd4 }, { vpackusdw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x67, 0xd4 }, { vpackuswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfc, 0xd4 }, { vpaddb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfd, 0xd4 }, { vpaddw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfe, 0xd4 }, { vpaddd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd4, 0xd4 }, { vpaddq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xec, 0xd4 }, { vpaddsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xed, 0xd4 }, { vpaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdc, 0xd4 }, { vpaddusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdd, 0xd4 }, { vpaddusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdb, 0xd4 }, { vpand ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdf, 0xd4 }, { vpandn ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe0, 0xd4 }, { vpavgb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe3, 0xd4 }, { vpavgw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x74, 0xd4 }, { vpcmpeqb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x75, 0xd4 }, { vpcmpeqw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x76, 0xd4 }, { vpcmpeqd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0xd4 }, { vpcmpeqq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x64, 0xd4 }, { vpcmpgtb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x65, 0xd4 }, { vpcmpgtw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x66, 0xd4 }, { vpcmpgtd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0xd4 }, { vpcmpgtq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0xd4 }, { vphaddw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0xd4 }, { vphaddd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0xd4 }, { vphaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0xd4 }, { vphsubw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0xd4 }, { vphsubd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0xd4 }, { vphsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf5, 0xd4 }, { vpmaddwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0xd4 }, { vpmaddubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0xd4 }, { vpmaxsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xee, 0xd4 }, { vpmaxsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0xd4 }, { vpmaxsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xde, 0xd4 }, { vpmaxub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0xd4 }, { vpmaxuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0xd4 }, { vpmaxud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0xd4 }, { vpminsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xea, 0xd4 }, { vpminsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0xd4 }, { vpminsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xda, 0xd4 }, { vpminub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0xd4 }, { vpminuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0xd4 }, { vpminud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe4, 0xd4 }, { vpmulhuw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0xd4 }, { vpmulhrsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe5, 0xd4 }, { vpmulhw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd5, 0xd4 }, { vpmullw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0xd4 }, { vpmulld ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf4, 0xd4 }, { vpmuludq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0xd4 }, { vpmuldq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xeb, 0xd4 }, { vpor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf6, 0xd4 }, { vpsadbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0xd4 }, { vpshufb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0xd4 }, { vpsignb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0xd4 }, { vpsignw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0xd4 }, { vpsignd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf8, 0xd4 }, { vpsubb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf9, 0xd4 }, { vpsubw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfa, 0xd4 }, { vpsubd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfb, 0xd4 }, { vpsubq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe8, 0xd4 }, { vpsubsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe9, 0xd4 }, { vpsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd8, 0xd4 }, { vpsubusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd9, 0xd4 }, { vpsubusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x68, 0xd4 }, { vpunpckhbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x69, 0xd4 }, { vpunpckhwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6a, 0xd4 }, { vpunpckhdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6d, 0xd4 }, { vpunpckhqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x60, 0xd4 }, { vpunpcklbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x61, 0xd4 }, { vpunpcklwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x62, 0xd4 }, { vpunpckldq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6c, 0xd4 }, { vpunpcklqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xef, 0xd4 }, { vpxor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0xf4 }, { vpabsb ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0xf4 }, { vpabsw ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0xf4 }, { vpabsd ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [ecx] }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0xd4, 0x07 }, { vmpsadbw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0xd4, 0x07 }, { vpalignr ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0xd4, 0x07 }, { vpblendw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [ecx],0x7 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0xfe, 0x40 }, { vpblendvb ymm7,ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [ecx],ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [ecx],ymm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0xd4 }, { vpsllw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf2, 0xd4 }, { vpslld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf3, 0xd4 }, { vpsllq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe1, 0xd4 }, { vpsraw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe2, 0xd4 }, { vpsrad ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd1, 0xd4 }, { vpsrlw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd2, 0xd4 }, { vpsrld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd3, 0xd4 }, { vpsrlq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0xe4 }, { vpmovsxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0xe4 }, { vpmovsxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0xe4 }, { vpmovsxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0xe4 }, { vpmovzxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0xe4 }, { vpmovzxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0xe4 }, { vpmovzxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0xf4 }, { vpmovsxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0xf4 }, { vpmovsxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0xf4 }, { vpmovzxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0xf4 }, { vpmovzxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0xe4 }, { vpmovsxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0xe4 }, { vpmovzxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [ecx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [ecx] }
+
+bits 64
+
+; b/gas/testsuite/gas/i386/x86-64-avx-gather-intel.d
+testcase { 0xc4, 0xe2, 0xe9, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdpd xmm1,QWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xe9, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqpd xmm1,QWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdpd ymm1,QWORD [rbp+xmm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqpd ymm1,QWORD [rbp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0x02, 0x99, 0x92, 0x5c, 0x75, 0x00 }, { vgatherdpd xmm11,QWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x99, 0x93, 0x5c, 0x75, 0x00 }, { vgatherqpd xmm11,QWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x9d, 0x92, 0x5c, 0x75, 0x00 }, { vgatherdpd ymm11,QWORD [r13+xmm14*2+0x0],ymm12 }
+testcase { 0xc4, 0x02, 0x9d, 0x93, 0x5c, 0x75, 0x00 }, { vgatherqpd ymm11,QWORD [r13+ymm14*2+0x0],ymm12 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm4*1-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*1+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm4*8-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x92, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm4*8+0x298],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0x35, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*1+0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0x35, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm14*1-0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*1+0x0],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0x35, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*1+0x298],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0xf5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*8+0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0xf5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdpd ymm6,QWORD [xmm14*8-0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0xf5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*8+0x0],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x92, 0x34, 0xf5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdpd ymm6,QWORD [xmm14*8+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0x69, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdps xmm1,DWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x69, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqps xmm1,DWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x92, 0x4c, 0x7d, 0x00 }, { vgatherdps ymm1,DWORD [rbp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x93, 0x4c, 0x7d, 0x00 }, { vgatherqps xmm1,DWORD [rbp+ymm7*2+0x0],xmm2 }
+testcase { 0xc4, 0x02, 0x19, 0x92, 0x5c, 0x75, 0x00 }, { vgatherdps xmm11,DWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x19, 0x93, 0x5c, 0x75, 0x00 }, { vgatherqps xmm11,DWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x1d, 0x92, 0x5c, 0x75, 0x00 }, { vgatherdps ymm11,DWORD [r13+ymm14*2+0x0],ymm12 }
+testcase { 0xc4, 0x02, 0x1d, 0x93, 0x5c, 0x75, 0x00 }, { vgatherqps xmm11,DWORD [r13+ymm14*2+0x0],xmm12 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm4*1-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*1+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm4*8-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x92, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm4*8+0x298],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0x35, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*1+0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0x35, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm14*1-0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*1+0x0],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0x35, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*1+0x298],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0xf5, 0x08, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*8+0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0xf5, 0xf8, 0xff, 0xff, 0xff }, { vgatherdps xmm6,DWORD [xmm14*8-0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0xf5, 0x00, 0x00, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*8+0x0],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x92, 0x34, 0xf5, 0x98, 0x02, 0x00, 0x00 }, { vgatherdps xmm6,DWORD [xmm14*8+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x69, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdd xmm1,DWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x69, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqd xmm1,DWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdd ymm1,DWORD [rbp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0x6d, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqd xmm1,DWORD [rbp+ymm7*2+0x0],xmm2 }
+testcase { 0xc4, 0x02, 0x19, 0x90, 0x5c, 0x75, 0x00 }, { vpgatherdd xmm11,DWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x19, 0x91, 0x5c, 0x75, 0x00 }, { vpgatherqd xmm11,DWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x1d, 0x90, 0x5c, 0x75, 0x00 }, { vpgatherdd ymm11,DWORD [r13+ymm14*2+0x0],ymm12 }
+testcase { 0xc4, 0x02, 0x1d, 0x91, 0x5c, 0x75, 0x00 }, { vpgatherqd xmm11,DWORD [r13+ymm14*2+0x0],xmm12 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm4*1-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*1+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm4*8-0x8],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x0],xmm5 }
+testcase { 0xc4, 0xe2, 0x51, 0x90, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm4*8+0x298],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0x35, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*1+0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0x35, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm14*1-0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*1+0x0],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0x35, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*1+0x298],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0xf5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*8+0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0xf5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdd xmm6,DWORD [xmm14*8-0x8],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0xf5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*8+0x0],xmm5 }
+testcase { 0xc4, 0xa2, 0x51, 0x90, 0x34, 0xf5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdd xmm6,DWORD [xmm14*8+0x298],xmm5 }
+testcase { 0xc4, 0xe2, 0xe9, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdq xmm1,QWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xe9, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqq xmm1,QWORD [rbp+xmm7*2+0x0],xmm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x90, 0x4c, 0x7d, 0x00 }, { vpgatherdq ymm1,QWORD [rbp+xmm7*2+0x0],ymm2 }
+testcase { 0xc4, 0xe2, 0xed, 0x91, 0x4c, 0x7d, 0x00 }, { vpgatherqq ymm1,QWORD [rbp+ymm7*2+0x0],ymm2 }
+testcase { 0xc4, 0x02, 0x99, 0x90, 0x5c, 0x75, 0x00 }, { vpgatherdq xmm11,QWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x99, 0x91, 0x5c, 0x75, 0x00 }, { vpgatherqq xmm11,QWORD [r13+xmm14*2+0x0],xmm12 }
+testcase { 0xc4, 0x02, 0x9d, 0x90, 0x5c, 0x75, 0x00 }, { vpgatherdq ymm11,QWORD [r13+xmm14*2+0x0],ymm12 }
+testcase { 0xc4, 0x02, 0x9d, 0x91, 0x5c, 0x75, 0x00 }, { vpgatherqq ymm11,QWORD [r13+ymm14*2+0x0],ymm12 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm4*1-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0x25, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*1+0x298],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm4*8-0x8],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x0],ymm5 }
+testcase { 0xc4, 0xe2, 0xd5, 0x90, 0x34, 0xe5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm4*8+0x298],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0x35, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*1+0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0x35, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm14*1-0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*1+0x0],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0x35, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*1+0x298],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0xf5, 0x08, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*8+0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0xf5, 0xf8, 0xff, 0xff, 0xff }, { vpgatherdq ymm6,QWORD [xmm14*8-0x8],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0xf5, 0x00, 0x00, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*8+0x0],ymm5 }
+testcase { 0xc4, 0xa2, 0xd5, 0x90, 0x34, 0xf5, 0x98, 0x02, 0x00, 0x00 }, { vpgatherdq ymm6,QWORD [xmm14*8+0x298],ymm5 }
+
+; b/gas/testsuite/gas/i386/x86-64-avx2-intel.d
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0xd6, 0x07 }, { vpermpd ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0xd6, 0x07 }, { vpermq ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0xd4 }, { vpermd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0xd4 }, { vpermps ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0xd4 }, { vpsllvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0xd4 }, { vpsllvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0xd4 }, { vpsravd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0xd4 }, { vpsrlvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0xd4 }, { vpsrlvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x19, 0xf4 }, { vbroadcastsd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x18, 0xf4 }, { vbroadcastss ymm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0xd4, 0x07 }, { vpblendd ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0xd4, 0x07 }, { vperm2i128 ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0xf4, 0x07 }, { vinserti128 ymm6,ymm4,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0xd4 }, { vpsllvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0xd4 }, { vpsllvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0xd4 }, { vpsravd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0xd4 }, { vpsrlvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0xd4 }, { vpsrlvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0xe6, 0x07 }, { vextracti128 xmm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [rcx],ymm4,0x7 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0xd4, 0x07 }, { vpblendd xmm2,xmm6,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0xf4 }, { vpbroadcastq xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0xf4 }, { vpbroadcastq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0xe4 }, { vpbroadcastd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0xf4 }, { vpbroadcastd xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0xf4 }, { vpbroadcastw xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0xf4 }, { vpbroadcastw ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0xf4 }, { vpbroadcastb xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0xf4 }, { vpbroadcastb ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x18, 0xf4 }, { vbroadcastss xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x5d, 0x8c, 0x31 }, { vpmaskmovd ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x8e, 0x21 }, { vpmaskmovd YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xdd, 0x8c, 0x31 }, { vpmaskmovq ymm6,ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x8e, 0x21 }, { vpmaskmovq YWORD [rcx],ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0xd6, 0x07 }, { vpermpd ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x01, 0x31, 0x07 }, { vpermpd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0xd6, 0x07 }, { vpermq ymm2,ymm6,0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0xfd, 0x00, 0x31, 0x07 }, { vpermq ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0xd4 }, { vpermd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x36, 0x11 }, { vpermd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0xd4 }, { vpermps ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x16, 0x11 }, { vpermps ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0xd4 }, { vpsllvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x47, 0x11 }, { vpsllvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0xd4 }, { vpsllvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x47, 0x11 }, { vpsllvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0xd4 }, { vpsravd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x46, 0x11 }, { vpsravd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0xd4 }, { vpsrlvd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x45, 0x11 }, { vpsrlvd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0xd4 }, { vpsrlvq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xcd, 0x45, 0x11 }, { vpsrlvq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x2a, 0x21 }, { vmovntdqa ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x19, 0xf4 }, { vbroadcastsd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x18, 0xf4 }, { vbroadcastss ymm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0xd4, 0x07 }, { vpblendd ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x02, 0x11, 0x07 }, { vpblendd ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0xd4, 0x07 }, { vperm2i128 ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x46, 0x11, 0x07 }, { vperm2i128 ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0xf4, 0x07 }, { vinserti128 ymm6,ymm4,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x5d, 0x38, 0x31, 0x07 }, { vinserti128 ymm6,ymm4,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x5a, 0x21 }, { vbroadcasti128 ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0xd4 }, { vpsllvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x47, 0x39 }, { vpsllvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0xd4 }, { vpsllvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x47, 0x39 }, { vpsllvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0xd4 }, { vpsravd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x46, 0x39 }, { vpsravd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0xd4 }, { vpsrlvd xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x49, 0x45, 0x39 }, { vpsrlvd xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0xd4 }, { vpsrlvq xmm2,xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xc9, 0x45, 0x39 }, { vpsrlvq xmm7,xmm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x59, 0x8c, 0x31 }, { vpmaskmovd xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0xd9, 0x8c, 0x31 }, { vpmaskmovq xmm6,xmm4,OWORD [rcx] }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0xe6, 0x07 }, { vextracti128 xmm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [rcx],ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x7d, 0x39, 0x21, 0x07 }, { vextracti128 OWORD [rcx],ymm4,0x7 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x49, 0x8e, 0x21 }, { vpmaskmovd OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0xc9, 0x8e, 0x21 }, { vpmaskmovq OWORD [rcx],xmm6,xmm4 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0xd4, 0x07 }, { vpblendd xmm2,xmm6,xmm4,0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x49, 0x02, 0x11, 0x07 }, { vpblendd xmm2,xmm6,OWORD [rcx],0x7 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0xf4 }, { vpbroadcastq xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x59, 0x21 }, { vpbroadcastq xmm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0xf4 }, { vpbroadcastq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x59, 0x21 }, { vpbroadcastq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0xe4 }, { vpbroadcastd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x58, 0x21 }, { vpbroadcastd ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0xf4 }, { vpbroadcastd xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x58, 0x21 }, { vpbroadcastd xmm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0xf4 }, { vpbroadcastw xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x79, 0x21 }, { vpbroadcastw xmm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0xf4 }, { vpbroadcastw ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x79, 0x21 }, { vpbroadcastw ymm4,WORD [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0xf4 }, { vpbroadcastb xmm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x78, 0x21 }, { vpbroadcastb xmm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0xf4 }, { vpbroadcastb ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x78, 0x21 }, { vpbroadcastb ymm4,BYTE [rcx] }
+testcase { 0xc4, 0xe2, 0x79, 0x18, 0xf4 }, { vbroadcastss xmm6,xmm4 }
+
+; b/gas/testsuite/gas/i386/x86-64-avx256int-intel.d
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xed, 0x72, 0xf6, 0x07 }, { vpslld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xfe, 0x07 }, { vpslldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xf6, 0x07 }, { vpsllq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xf6, 0x07 }, { vpsllw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xe6, 0x07 }, { vpsrad ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xe6, 0x07 }, { vpsraw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xd6, 0x07 }, { vpsrld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xde, 0x07 }, { vpsrldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xd6, 0x07 }, { vpsrlq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xd6, 0x07 }, { vpsrlw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0xd6, 0x07 }, { vpshufd ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0xd6, 0x07 }, { vpshufhw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0xd6, 0x07 }, { vpshuflw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xcd, 0x6b, 0xd4 }, { vpackssdw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x63, 0xd4 }, { vpacksswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0xd4 }, { vpackusdw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x67, 0xd4 }, { vpackuswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfc, 0xd4 }, { vpaddb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfd, 0xd4 }, { vpaddw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfe, 0xd4 }, { vpaddd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd4, 0xd4 }, { vpaddq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xec, 0xd4 }, { vpaddsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xed, 0xd4 }, { vpaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdc, 0xd4 }, { vpaddusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdd, 0xd4 }, { vpaddusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdb, 0xd4 }, { vpand ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdf, 0xd4 }, { vpandn ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe0, 0xd4 }, { vpavgb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe3, 0xd4 }, { vpavgw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x74, 0xd4 }, { vpcmpeqb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x75, 0xd4 }, { vpcmpeqw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x76, 0xd4 }, { vpcmpeqd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0xd4 }, { vpcmpeqq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x64, 0xd4 }, { vpcmpgtb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x65, 0xd4 }, { vpcmpgtw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x66, 0xd4 }, { vpcmpgtd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0xd4 }, { vpcmpgtq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0xd4 }, { vphaddw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0xd4 }, { vphaddd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0xd4 }, { vphaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0xd4 }, { vphsubw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0xd4 }, { vphsubd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0xd4 }, { vphsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf5, 0xd4 }, { vpmaddwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0xd4 }, { vpmaddubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0xd4 }, { vpmaxsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xee, 0xd4 }, { vpmaxsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0xd4 }, { vpmaxsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xde, 0xd4 }, { vpmaxub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0xd4 }, { vpmaxuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0xd4 }, { vpmaxud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0xd4 }, { vpminsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xea, 0xd4 }, { vpminsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0xd4 }, { vpminsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xda, 0xd4 }, { vpminub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0xd4 }, { vpminuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0xd4 }, { vpminud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe4, 0xd4 }, { vpmulhuw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0xd4 }, { vpmulhrsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe5, 0xd4 }, { vpmulhw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd5, 0xd4 }, { vpmullw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0xd4 }, { vpmulld ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf4, 0xd4 }, { vpmuludq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0xd4 }, { vpmuldq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xeb, 0xd4 }, { vpor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf6, 0xd4 }, { vpsadbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0xd4 }, { vpshufb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0xd4 }, { vpsignb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0xd4 }, { vpsignw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0xd4 }, { vpsignd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf8, 0xd4 }, { vpsubb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf9, 0xd4 }, { vpsubw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfa, 0xd4 }, { vpsubd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfb, 0xd4 }, { vpsubq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe8, 0xd4 }, { vpsubsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe9, 0xd4 }, { vpsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd8, 0xd4 }, { vpsubusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd9, 0xd4 }, { vpsubusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x68, 0xd4 }, { vpunpckhbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x69, 0xd4 }, { vpunpckhwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6a, 0xd4 }, { vpunpckhdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6d, 0xd4 }, { vpunpckhqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x60, 0xd4 }, { vpunpcklbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x61, 0xd4 }, { vpunpcklwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x62, 0xd4 }, { vpunpckldq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6c, 0xd4 }, { vpunpcklqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xef, 0xd4 }, { vpxor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0xf4 }, { vpabsb ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0xf4 }, { vpabsw ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0xf4 }, { vpabsd ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0xd4, 0x07 }, { vmpsadbw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0xd4, 0x07 }, { vpalignr ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0xd4, 0x07 }, { vpblendw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0xfe, 0x40 }, { vpblendvb ymm7,ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [rcx],ymm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0xd4 }, { vpsllw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf2, 0xd4 }, { vpslld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf3, 0xd4 }, { vpsllq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe1, 0xd4 }, { vpsraw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe2, 0xd4 }, { vpsrad ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd1, 0xd4 }, { vpsrlw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd2, 0xd4 }, { vpsrld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd3, 0xd4 }, { vpsrlq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0xe4 }, { vpmovsxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0xe4 }, { vpmovsxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0xe4 }, { vpmovsxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0xe4 }, { vpmovzxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0xe4 }, { vpmovzxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0xe4 }, { vpmovzxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0xf4 }, { vpmovsxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0xf4 }, { vpmovsxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0xf4 }, { vpmovzxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0xf4 }, { vpmovzxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0xe4 }, { vpmovsxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0xe4 }, { vpmovzxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [rcx] }
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xfd, 0xd7, 0xcc }, { vpmovmskb ecx,ymm4 }
+testcase { 0xc5, 0xed, 0x72, 0xf6, 0x07 }, { vpslld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xfe, 0x07 }, { vpslldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xf6, 0x07 }, { vpsllq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xf6, 0x07 }, { vpsllw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xe6, 0x07 }, { vpsrad ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xe6, 0x07 }, { vpsraw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x72, 0xd6, 0x07 }, { vpsrld ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xde, 0x07 }, { vpsrldq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x73, 0xd6, 0x07 }, { vpsrlq ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xed, 0x71, 0xd6, 0x07 }, { vpsrlw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0xd6, 0x07 }, { vpshufd ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xfd, 0x70, 0x31, 0x07 }, { vpshufd ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0xd6, 0x07 }, { vpshufhw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xfe, 0x70, 0x31, 0x07 }, { vpshufhw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0xd6, 0x07 }, { vpshuflw ymm2,ymm6,0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xff, 0x70, 0x31, 0x07 }, { vpshuflw ymm6,YWORD [rcx],0x7 }
+testcase { 0xc5, 0xcd, 0x6b, 0xd4 }, { vpackssdw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6b, 0x11 }, { vpackssdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x63, 0xd4 }, { vpacksswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x63, 0x11 }, { vpacksswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0xd4 }, { vpackusdw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x2b, 0x11 }, { vpackusdw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x67, 0xd4 }, { vpackuswb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x67, 0x11 }, { vpackuswb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfc, 0xd4 }, { vpaddb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfc, 0x11 }, { vpaddb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfd, 0xd4 }, { vpaddw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfd, 0x11 }, { vpaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfe, 0xd4 }, { vpaddd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfe, 0x11 }, { vpaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd4, 0xd4 }, { vpaddq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd4, 0x11 }, { vpaddq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xec, 0xd4 }, { vpaddsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xec, 0x11 }, { vpaddsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xed, 0xd4 }, { vpaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xed, 0x11 }, { vpaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdc, 0xd4 }, { vpaddusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdc, 0x11 }, { vpaddusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdd, 0xd4 }, { vpaddusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdd, 0x11 }, { vpaddusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdb, 0xd4 }, { vpand ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdb, 0x11 }, { vpand ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdf, 0xd4 }, { vpandn ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xdf, 0x11 }, { vpandn ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe0, 0xd4 }, { vpavgb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe0, 0x11 }, { vpavgb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe3, 0xd4 }, { vpavgw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe3, 0x11 }, { vpavgw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x74, 0xd4 }, { vpcmpeqb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x74, 0x11 }, { vpcmpeqb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x75, 0xd4 }, { vpcmpeqw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x75, 0x11 }, { vpcmpeqw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x76, 0xd4 }, { vpcmpeqd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x76, 0x11 }, { vpcmpeqd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0xd4 }, { vpcmpeqq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x29, 0x11 }, { vpcmpeqq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x64, 0xd4 }, { vpcmpgtb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x64, 0x11 }, { vpcmpgtb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x65, 0xd4 }, { vpcmpgtw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x65, 0x11 }, { vpcmpgtw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x66, 0xd4 }, { vpcmpgtd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x66, 0x11 }, { vpcmpgtd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0xd4 }, { vpcmpgtq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x37, 0x11 }, { vpcmpgtq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0xd4 }, { vphaddw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x01, 0x11 }, { vphaddw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0xd4 }, { vphaddd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x02, 0x11 }, { vphaddd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0xd4 }, { vphaddsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x03, 0x11 }, { vphaddsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0xd4 }, { vphsubw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x05, 0x11 }, { vphsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0xd4 }, { vphsubd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x06, 0x11 }, { vphsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0xd4 }, { vphsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x07, 0x11 }, { vphsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf5, 0xd4 }, { vpmaddwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf5, 0x11 }, { vpmaddwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0xd4 }, { vpmaddubsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x04, 0x11 }, { vpmaddubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0xd4 }, { vpmaxsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3c, 0x11 }, { vpmaxsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xee, 0xd4 }, { vpmaxsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xee, 0x11 }, { vpmaxsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0xd4 }, { vpmaxsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3d, 0x11 }, { vpmaxsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xde, 0xd4 }, { vpmaxub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xde, 0x11 }, { vpmaxub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0xd4 }, { vpmaxuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3e, 0x11 }, { vpmaxuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0xd4 }, { vpmaxud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3f, 0x11 }, { vpmaxud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0xd4 }, { vpminsb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x38, 0x11 }, { vpminsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xea, 0xd4 }, { vpminsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xea, 0x11 }, { vpminsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0xd4 }, { vpminsd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x39, 0x11 }, { vpminsd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xda, 0xd4 }, { vpminub ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xda, 0x11 }, { vpminub ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0xd4 }, { vpminuw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3a, 0x11 }, { vpminuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0xd4 }, { vpminud ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x3b, 0x11 }, { vpminud ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe4, 0xd4 }, { vpmulhuw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe4, 0x11 }, { vpmulhuw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0xd4 }, { vpmulhrsw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0b, 0x11 }, { vpmulhrsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe5, 0xd4 }, { vpmulhw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe5, 0x11 }, { vpmulhw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd5, 0xd4 }, { vpmullw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd5, 0x11 }, { vpmullw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0xd4 }, { vpmulld ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x40, 0x11 }, { vpmulld ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf4, 0xd4 }, { vpmuludq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf4, 0x11 }, { vpmuludq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0xd4 }, { vpmuldq ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x28, 0x11 }, { vpmuldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xeb, 0xd4 }, { vpor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xeb, 0x11 }, { vpor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf6, 0xd4 }, { vpsadbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf6, 0x11 }, { vpsadbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0xd4 }, { vpshufb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x00, 0x11 }, { vpshufb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0xd4 }, { vpsignb ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x08, 0x11 }, { vpsignb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0xd4 }, { vpsignw ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x09, 0x11 }, { vpsignw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0xd4 }, { vpsignd ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x4d, 0x0a, 0x11 }, { vpsignd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf8, 0xd4 }, { vpsubb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf8, 0x11 }, { vpsubb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf9, 0xd4 }, { vpsubw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf9, 0x11 }, { vpsubw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfa, 0xd4 }, { vpsubd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfa, 0x11 }, { vpsubd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfb, 0xd4 }, { vpsubq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xfb, 0x11 }, { vpsubq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe8, 0xd4 }, { vpsubsb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe8, 0x11 }, { vpsubsb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe9, 0xd4 }, { vpsubsw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe9, 0x11 }, { vpsubsw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd8, 0xd4 }, { vpsubusb ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd8, 0x11 }, { vpsubusb ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd9, 0xd4 }, { vpsubusw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd9, 0x11 }, { vpsubusw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x68, 0xd4 }, { vpunpckhbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x68, 0x11 }, { vpunpckhbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x69, 0xd4 }, { vpunpckhwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x69, 0x11 }, { vpunpckhwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6a, 0xd4 }, { vpunpckhdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6a, 0x11 }, { vpunpckhdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6d, 0xd4 }, { vpunpckhqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6d, 0x11 }, { vpunpckhqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x60, 0xd4 }, { vpunpcklbw ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x60, 0x11 }, { vpunpcklbw ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x61, 0xd4 }, { vpunpcklwd ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x61, 0x11 }, { vpunpcklwd ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x62, 0xd4 }, { vpunpckldq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x62, 0x11 }, { vpunpckldq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6c, 0xd4 }, { vpunpcklqdq ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0x6c, 0x11 }, { vpunpcklqdq ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xef, 0xd4 }, { vpxor ymm2,ymm6,ymm4 }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xef, 0x11 }, { vpxor ymm2,ymm6,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0xf4 }, { vpabsb ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1c, 0x21 }, { vpabsb ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0xf4 }, { vpabsw ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1d, 0x21 }, { vpabsw ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0xf4 }, { vpabsd ymm6,ymm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x1e, 0x21 }, { vpabsd ymm4,YWORD [rcx] }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0xd4, 0x07 }, { vmpsadbw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x42, 0x11, 0x07 }, { vmpsadbw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0xd4, 0x07 }, { vpalignr ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0f, 0x11, 0x07 }, { vpalignr ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0xd4, 0x07 }, { vpblendw ymm2,ymm6,ymm4,0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x4d, 0x0e, 0x11, 0x07 }, { vpblendw ymm2,ymm6,YWORD [rcx],0x7 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0xfe, 0x40 }, { vpblendvb ymm7,ymm2,ymm6,ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [rcx],ymm4 }
+testcase { 0xc4, 0xe3, 0x6d, 0x4c, 0x39, 0x40 }, { vpblendvb ymm7,ymm2,YWORD [rcx],ymm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0xd4 }, { vpsllw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf1, 0x11 }, { vpsllw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf2, 0xd4 }, { vpslld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf2, 0x11 }, { vpslld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf3, 0xd4 }, { vpsllq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xf3, 0x11 }, { vpsllq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe1, 0xd4 }, { vpsraw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe1, 0x11 }, { vpsraw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe2, 0xd4 }, { vpsrad ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xe2, 0x11 }, { vpsrad ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd1, 0xd4 }, { vpsrlw ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd1, 0x11 }, { vpsrlw ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd2, 0xd4 }, { vpsrld ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd2, 0x11 }, { vpsrld ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd3, 0xd4 }, { vpsrlq ymm2,ymm6,xmm4 }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc5, 0xcd, 0xd3, 0x11 }, { vpsrlq ymm2,ymm6,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0xe4 }, { vpmovsxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x20, 0x21 }, { vpmovsxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0xe4 }, { vpmovsxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x23, 0x21 }, { vpmovsxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0xe4 }, { vpmovsxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x25, 0x21 }, { vpmovsxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0xe4 }, { vpmovzxbw ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x30, 0x21 }, { vpmovzxbw ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0xe4 }, { vpmovzxwd ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x33, 0x21 }, { vpmovzxwd ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0xe4 }, { vpmovzxdq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x35, 0x21 }, { vpmovzxdq ymm4,OWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0xf4 }, { vpmovsxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x21, 0x21 }, { vpmovsxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0xf4 }, { vpmovsxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x24, 0x21 }, { vpmovsxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0xf4 }, { vpmovzxbd ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x31, 0x21 }, { vpmovzxbd ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0xf4 }, { vpmovzxwq ymm6,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x34, 0x21 }, { vpmovzxwq ymm4,QWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0xe4 }, { vpmovsxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x22, 0x21 }, { vpmovsxbq ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0xe4 }, { vpmovzxbq ymm4,xmm4 }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [rcx] }
+testcase { 0xc4, 0xe2, 0x7d, 0x32, 0x21 }, { vpmovzxbq ymm4,DWORD [rcx] }
+
+; EOF
diff --git a/test/avx512cd.asm b/test/avx512cd.asm
new file mode 100644
index 00000000..f9222477
--- /dev/null
+++ b/test/avx512cd.asm
@@ -0,0 +1,106 @@
+;Testname=avx512cd; Arguments=-fbin -oavx512cd.bin -O0 -DSRC; Files=stdout stderr avx512cd.bin
+; AVX-512CD testcases from gas
+;------------------------
+;
+; This file is taken from there
+; https://gnu.googlesource.com/binutils/+/master/gas/testsuite/gas/i386/x86-64-avx512cd-intel.d
+; So the original author is "H.J. Lu" <hongjiu dot lu at intel dot com>
+;
+; Jin Kyu Song converted it for the nasm testing suite using gas2nasm.py
+
+%macro testcase 2
+ %ifdef BIN
+ db %1
+ %endif
+ %ifdef SRC
+ %2
+ %endif
+%endmacro
+
+
+bits 64
+
+testcase { 0x62, 0x02, 0x7d, 0x48, 0xc4, 0xf5 }, { vpconflictd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0xc4, 0xf5 }, { vpconflictd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0xc4, 0xf5 }, { vpconflictd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc4, 0x31 }, { vpconflictd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0xc4, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpconflictd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc4, 0x31 }, { vpconflictd zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc4, 0x72, 0x7f }, { vpconflictd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc4, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpconflictd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc4, 0x72, 0x80 }, { vpconflictd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc4, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpconflictd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc4, 0x72, 0x7f }, { vpconflictd zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc4, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpconflictd zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc4, 0x72, 0x80 }, { vpconflictd zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc4, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpconflictd zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0xc4, 0xf5 }, { vpconflictq zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0xc4, 0xf5 }, { vpconflictq zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0xc4, 0xf5 }, { vpconflictq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc4, 0x31 }, { vpconflictq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0xc4, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpconflictq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc4, 0x31 }, { vpconflictq zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc4, 0x72, 0x7f }, { vpconflictq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc4, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpconflictq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc4, 0x72, 0x80 }, { vpconflictq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc4, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpconflictq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc4, 0x72, 0x7f }, { vpconflictq zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc4, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpconflictq zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc4, 0x72, 0x80 }, { vpconflictq zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc4, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpconflictq zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x44, 0xf5 }, { vplzcntd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x44, 0xf5 }, { vplzcntd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x44, 0xf5 }, { vplzcntd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x44, 0x31 }, { vplzcntd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x44, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vplzcntd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x44, 0x31 }, { vplzcntd zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x44, 0x72, 0x7f }, { vplzcntd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x44, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vplzcntd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x44, 0x72, 0x80 }, { vplzcntd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x44, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vplzcntd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x44, 0x72, 0x7f }, { vplzcntd zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x44, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vplzcntd zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x44, 0x72, 0x80 }, { vplzcntd zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x44, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vplzcntd zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x44, 0xf5 }, { vplzcntq zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x44, 0xf5 }, { vplzcntq zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x44, 0xf5 }, { vplzcntq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x44, 0x31 }, { vplzcntq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x44, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vplzcntq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x44, 0x31 }, { vplzcntq zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x44, 0x72, 0x7f }, { vplzcntq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x44, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vplzcntq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x44, 0x72, 0x80 }, { vplzcntq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x44, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vplzcntq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x44, 0x72, 0x7f }, { vplzcntq zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x44, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vplzcntq zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x44, 0x72, 0x80 }, { vplzcntq zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x44, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vplzcntq zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x92, 0x16, 0x40, 0x27, 0xec }, { vptestnmd k5,zmm29,zmm28 }
+testcase { 0x62, 0x92, 0x16, 0x47, 0x27, 0xec }, { vptestnmd k5{k7},zmm29,zmm28 }
+testcase { 0x62, 0xf2, 0x16, 0x40, 0x27, 0x29 }, { vptestnmd k5,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x16, 0x40, 0x27, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vptestnmd k5,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x16, 0x50, 0x27, 0x29 }, { vptestnmd k5,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf2, 0x16, 0x40, 0x27, 0x6a, 0x7f }, { vptestnmd k5,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x16, 0x40, 0x27, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vptestnmd k5,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x16, 0x40, 0x27, 0x6a, 0x80 }, { vptestnmd k5,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x16, 0x40, 0x27, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vptestnmd k5,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x16, 0x50, 0x27, 0x6a, 0x7f }, { vptestnmd k5,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf2, 0x16, 0x50, 0x27, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vptestnmd k5,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf2, 0x16, 0x50, 0x27, 0x6a, 0x80 }, { vptestnmd k5,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf2, 0x16, 0x50, 0x27, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vptestnmd k5,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x92, 0x96, 0x40, 0x27, 0xec }, { vptestnmq k5,zmm29,zmm28 }
+testcase { 0x62, 0x92, 0x96, 0x47, 0x27, 0xec }, { vptestnmq k5{k7},zmm29,zmm28 }
+testcase { 0x62, 0xf2, 0x96, 0x40, 0x27, 0x29 }, { vptestnmq k5,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x96, 0x40, 0x27, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vptestnmq k5,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x96, 0x50, 0x27, 0x29 }, { vptestnmq k5,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf2, 0x96, 0x40, 0x27, 0x6a, 0x7f }, { vptestnmq k5,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x96, 0x40, 0x27, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vptestnmq k5,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x96, 0x40, 0x27, 0x6a, 0x80 }, { vptestnmq k5,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x96, 0x40, 0x27, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vptestnmq k5,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x96, 0x50, 0x27, 0x6a, 0x7f }, { vptestnmq k5,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf2, 0x96, 0x50, 0x27, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vptestnmq k5,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x96, 0x50, 0x27, 0x6a, 0x80 }, { vptestnmq k5,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x96, 0x50, 0x27, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vptestnmq k5,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x3a, 0xf6 }, { vpbroadcastmw2d zmm30,k6 }
+testcase { 0x62, 0x62, 0xfe, 0x48, 0x2a, 0xf6 }, { vpbroadcastmb2q zmm30,k6 }
diff --git a/test/avx512er.asm b/test/avx512er.asm
new file mode 100644
index 00000000..2c6a12b4
--- /dev/null
+++ b/test/avx512er.asm
@@ -0,0 +1,144 @@
+;Testname=avx512er; Arguments=-fbin -oavx512er.bin -O0 -DSRC; Files=stdout stderr avx512er.bin
+; AVX-512ER testcases from gas
+;------------------------
+;
+; This file is taken from there
+; https://gnu.googlesource.com/binutils/+/master/gas/testsuite/gas/i386/x86-64-avx512er-intel.d
+; So the original author is "H.J. Lu" <hongjiu dot lu at intel dot com>
+;
+; Jin Kyu Song converted it for the nasm testing suite using gas2nasm.py
+
+%macro testcase 2
+ %ifdef BIN
+ db %1
+ %endif
+ %ifdef SRC
+ %2
+ %endif
+%endmacro
+
+
+bits 64
+
+testcase { 0x62, 0x02, 0x7d, 0x48, 0xc8, 0xf5 }, { vexp2ps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x18, 0xc8, 0xf5 }, { vexp2ps zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc8, 0x31 }, { vexp2ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0xc8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vexp2ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc8, 0x31 }, { vexp2ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc8, 0x72, 0x7f }, { vexp2ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vexp2ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc8, 0x72, 0x80 }, { vexp2ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xc8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vexp2ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc8, 0x72, 0x7f }, { vexp2ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc8, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vexp2ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc8, 0x72, 0x80 }, { vexp2ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xc8, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vexp2ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0xc8, 0xf5 }, { vexp2pd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x18, 0xc8, 0xf5 }, { vexp2pd zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc8, 0x31 }, { vexp2pd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0xc8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vexp2pd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc8, 0x31 }, { vexp2pd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc8, 0x72, 0x7f }, { vexp2pd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vexp2pd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc8, 0x72, 0x80 }, { vexp2pd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xc8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vexp2pd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc8, 0x72, 0x7f }, { vexp2pd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc8, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vexp2pd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc8, 0x72, 0x80 }, { vexp2pd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xc8, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vexp2pd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0xca, 0xf5 }, { vrcp28ps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0xca, 0xf5 }, { vrcp28ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0xca, 0xf5 }, { vrcp28ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x18, 0xca, 0xf5 }, { vrcp28ps zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xca, 0x31 }, { vrcp28ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0xca, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp28ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xca, 0x31 }, { vrcp28ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xca, 0x72, 0x7f }, { vrcp28ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xca, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrcp28ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xca, 0x72, 0x80 }, { vrcp28ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xca, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrcp28ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xca, 0x72, 0x7f }, { vrcp28ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xca, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrcp28ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xca, 0x72, 0x80 }, { vrcp28ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xca, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrcp28ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0xca, 0xf5 }, { vrcp28pd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0xca, 0xf5 }, { vrcp28pd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0xca, 0xf5 }, { vrcp28pd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x18, 0xca, 0xf5 }, { vrcp28pd zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xca, 0x31 }, { vrcp28pd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0xca, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp28pd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xca, 0x31 }, { vrcp28pd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xca, 0x72, 0x7f }, { vrcp28pd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xca, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrcp28pd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xca, 0x72, 0x80 }, { vrcp28pd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xca, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrcp28pd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xca, 0x72, 0x7f }, { vrcp28pd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xca, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrcp28pd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xca, 0x72, 0x80 }, { vrcp28pd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xca, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrcp28pd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xcb, 0xf4 }, { vrcp28ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xcb, 0xf4 }, { vrcp28ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xcb, 0xf4 }, { vrcp28ss xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcb, 0x31 }, { vrcp28ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xcb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp28ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcb, 0x72, 0x7f }, { vrcp28ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcb, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrcp28ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcb, 0x72, 0x80 }, { vrcp28ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcb, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrcp28ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xcb, 0xf4 }, { vrcp28sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xcb, 0xf4 }, { vrcp28sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xcb, 0xf4 }, { vrcp28sd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcb, 0x31 }, { vrcp28sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xcb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp28sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcb, 0x72, 0x7f }, { vrcp28sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcb, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrcp28sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcb, 0x72, 0x80 }, { vrcp28sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcb, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrcp28sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0xcc, 0xf5 }, { vrsqrt28ps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0xcc, 0xf5 }, { vrsqrt28ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0xcc, 0xf5 }, { vrsqrt28ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x18, 0xcc, 0xf5 }, { vrsqrt28ps zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xcc, 0x31 }, { vrsqrt28ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0xcc, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt28ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xcc, 0x31 }, { vrsqrt28ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xcc, 0x72, 0x7f }, { vrsqrt28ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xcc, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrsqrt28ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xcc, 0x72, 0x80 }, { vrsqrt28ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0xcc, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrsqrt28ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xcc, 0x72, 0x7f }, { vrsqrt28ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xcc, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrsqrt28ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xcc, 0x72, 0x80 }, { vrsqrt28ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0xcc, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrsqrt28ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0xcc, 0xf5 }, { vrsqrt28pd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0xcc, 0xf5 }, { vrsqrt28pd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0xcc, 0xf5 }, { vrsqrt28pd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x18, 0xcc, 0xf5 }, { vrsqrt28pd zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xcc, 0x31 }, { vrsqrt28pd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0xcc, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt28pd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xcc, 0x31 }, { vrsqrt28pd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xcc, 0x72, 0x7f }, { vrsqrt28pd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xcc, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrsqrt28pd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xcc, 0x72, 0x80 }, { vrsqrt28pd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0xcc, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrsqrt28pd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xcc, 0x72, 0x7f }, { vrsqrt28pd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xcc, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrsqrt28pd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xcc, 0x72, 0x80 }, { vrsqrt28pd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0xcc, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrsqrt28pd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xcd, 0xf4 }, { vrsqrt28ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xcd, 0xf4 }, { vrsqrt28ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xcd, 0xf4 }, { vrsqrt28ss xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcd, 0x31 }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xcd, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcd, 0x72, 0x7f }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcd, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcd, 0x72, 0x80 }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xcd, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrsqrt28ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xcd, 0xf4 }, { vrsqrt28sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xcd, 0xf4 }, { vrsqrt28sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xcd, 0xf4 }, { vrsqrt28sd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcd, 0x31 }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xcd, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcd, 0x72, 0x7f }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcd, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcd, 0x72, 0x80 }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xcd, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrsqrt28sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
diff --git a/test/avx512f.asm b/test/avx512f.asm
new file mode 100644
index 00000000..43cbcdd0
--- /dev/null
+++ b/test/avx512f.asm
@@ -0,0 +1,7000 @@
+;Testname=avx512f; Arguments=-fbin -oavx512f.bin -O0 -DSRC; Files=stdout stderr avx512f.bin
+; AVX-512F testcases from gas
+;------------------------
+;
+; This file is taken from there
+; https://gnu.googlesource.com/binutils/+/master/gas/testsuite/gas/i386/x86-64-avx512f-intel.d
+; So the original author is "H.J. Lu" <hongjiu dot lu at intel dot com>
+;
+; Jin Kyu Song converted it for the nasm testing suite using gas2nasm.py
+
+%macro testcase 2
+ %ifdef BIN
+ db %1
+ %endif
+ %ifdef SRC
+ %2
+ %endif
+%endmacro
+
+
+bits 64
+
+testcase { 0x62, 0x01, 0x95, 0x40, 0x58, 0xf4 }, { vaddpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x58, 0xf4 }, { vaddpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x58, 0xf4 }, { vaddpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x58, 0xf4 }, { vaddpd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x95, 0x50, 0x58, 0xf4 }, { vaddpd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x95, 0x30, 0x58, 0xf4 }, { vaddpd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x95, 0x70, 0x58, 0xf4 }, { vaddpd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x58, 0x31 }, { vaddpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x58, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vaddpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x58, 0x31 }, { vaddpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x58, 0x72, 0x7f }, { vaddpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x58, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vaddpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x58, 0x72, 0x80 }, { vaddpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x58, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vaddpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x58, 0x72, 0x7f }, { vaddpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x58, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vaddpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x58, 0x72, 0x80 }, { vaddpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x58, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vaddpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x58, 0xf4 }, { vaddps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x58, 0xf4 }, { vaddps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x58, 0xf4 }, { vaddps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x58, 0xf4 }, { vaddps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x14, 0x50, 0x58, 0xf4 }, { vaddps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x14, 0x30, 0x58, 0xf4 }, { vaddps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x14, 0x70, 0x58, 0xf4 }, { vaddps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x58, 0x31 }, { vaddps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x58, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vaddps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x58, 0x31 }, { vaddps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x58, 0x72, 0x7f }, { vaddps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x58, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vaddps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x58, 0x72, 0x80 }, { vaddps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x58, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vaddps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x58, 0x72, 0x7f }, { vaddps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x58, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vaddps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x58, 0x72, 0x80 }, { vaddps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x58, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vaddps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x58, 0xf4 }, { vaddsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x58, 0xf4 }, { vaddsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x58, 0xf4 }, { vaddsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x58, 0xf4 }, { vaddsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x58, 0xf4 }, { vaddsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x58, 0xf4 }, { vaddsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x58, 0x31 }, { vaddsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x58, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vaddsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x58, 0x72, 0x7f }, { vaddsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x58, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vaddsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x58, 0x72, 0x80 }, { vaddsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x58, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vaddsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x58, 0xf4 }, { vaddss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x58, 0xf4 }, { vaddss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x58, 0xf4 }, { vaddss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x16, 0x57, 0x58, 0xf4 }, { vaddss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x16, 0x37, 0x58, 0xf4 }, { vaddss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x16, 0x77, 0x58, 0xf4 }, { vaddss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x58, 0x31 }, { vaddss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x58, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vaddss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x58, 0x72, 0x7f }, { vaddss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x58, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vaddss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x58, 0x72, 0x80 }, { vaddss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x58, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vaddss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x03, 0xf4, 0xab }, { valignd zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x03, 0xf4, 0xab }, { valignd zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x03, 0xf4, 0xab }, { valignd zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x03, 0xf4, 0x7b }, { valignd zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x03, 0x31, 0x7b }, { valignd zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x40, 0x03, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { valignd zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x03, 0x31, 0x7b }, { valignd zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x03, 0x72, 0x7f, 0x7b }, { valignd zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x03, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { valignd zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x03, 0x72, 0x80, 0x7b }, { valignd zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x03, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { valignd zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x03, 0x72, 0x7f, 0x7b }, { valignd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x03, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { valignd zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x03, 0x72, 0x80, 0x7b }, { valignd zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x03, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { valignd zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x65, 0xf4 }, { vblendmpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x65, 0xf4 }, { vblendmpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x65, 0xf4 }, { vblendmpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x65, 0x31 }, { vblendmpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x65, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vblendmpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x65, 0x31 }, { vblendmpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x65, 0x72, 0x7f }, { vblendmpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x65, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vblendmpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x65, 0x72, 0x80 }, { vblendmpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x65, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vblendmpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x65, 0x72, 0x7f }, { vblendmpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x65, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vblendmpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x65, 0x72, 0x80 }, { vblendmpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x65, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vblendmpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x65, 0xf4 }, { vblendmps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x65, 0xf4 }, { vblendmps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x65, 0xf4 }, { vblendmps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x65, 0x31 }, { vblendmps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x65, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vblendmps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x65, 0x31 }, { vblendmps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x65, 0x72, 0x7f }, { vblendmps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x65, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vblendmps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x65, 0x72, 0x80 }, { vblendmps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x65, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vblendmps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x65, 0x72, 0x7f }, { vblendmps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x65, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vblendmps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x65, 0x72, 0x80 }, { vblendmps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x65, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vblendmps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1a, 0x31 }, { vbroadcastf32x4 zmm30,OWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x1a, 0x31 }, { vbroadcastf32x4 zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x1a, 0x31 }, { vbroadcastf32x4 zmm30{k7}{z},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x1a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcastf32x4 zmm30,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1a, 0x72, 0x7f }, { vbroadcastf32x4 zmm30,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1a, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vbroadcastf32x4 zmm30,OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1a, 0x72, 0x80 }, { vbroadcastf32x4 zmm30,OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1a, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vbroadcastf32x4 zmm30,OWORD [rdx-0x810] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1b, 0x31 }, { vbroadcastf64x4 zmm30,YWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x1b, 0x31 }, { vbroadcastf64x4 zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x1b, 0x31 }, { vbroadcastf64x4 zmm30{k7}{z},YWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x1b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcastf64x4 zmm30,YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1b, 0x72, 0x7f }, { vbroadcastf64x4 zmm30,YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1b, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vbroadcastf64x4 zmm30,YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1b, 0x72, 0x80 }, { vbroadcastf64x4 zmm30,YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1b, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vbroadcastf64x4 zmm30,YWORD [rdx-0x1020] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x5a, 0x31 }, { vbroadcasti32x4 zmm30,OWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x5a, 0x31 }, { vbroadcasti32x4 zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x5a, 0x31 }, { vbroadcasti32x4 zmm30{k7}{z},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x5a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcasti32x4 zmm30,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x5a, 0x72, 0x7f }, { vbroadcasti32x4 zmm30,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x5a, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vbroadcasti32x4 zmm30,OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x5a, 0x72, 0x80 }, { vbroadcasti32x4 zmm30,OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x5a, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vbroadcasti32x4 zmm30,OWORD [rdx-0x810] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x5b, 0x31 }, { vbroadcasti64x4 zmm30,YWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x5b, 0x31 }, { vbroadcasti64x4 zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x5b, 0x31 }, { vbroadcasti64x4 zmm30{k7}{z},YWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x5b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcasti64x4 zmm30,YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x5b, 0x72, 0x7f }, { vbroadcasti64x4 zmm30,YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x5b, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vbroadcasti64x4 zmm30,YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x5b, 0x72, 0x80 }, { vbroadcasti64x4 zmm30,YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x5b, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vbroadcasti64x4 zmm30,YWORD [rdx-0x1020] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x19, 0x31 }, { vbroadcastsd zmm30,QWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x19, 0x31 }, { vbroadcastsd zmm30{k7},QWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x19, 0x31 }, { vbroadcastsd zmm30{k7}{z},QWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x19, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcastsd zmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x19, 0x72, 0x7f }, { vbroadcastsd zmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x19, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vbroadcastsd zmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x19, 0x72, 0x80 }, { vbroadcastsd zmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x19, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vbroadcastsd zmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x19, 0xf5 }, { vbroadcastsd zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x19, 0xf5 }, { vbroadcastsd zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x18, 0x31 }, { vbroadcastss zmm30,DWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x18, 0x31 }, { vbroadcastss zmm30{k7},DWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x18, 0x31 }, { vbroadcastss zmm30{k7}{z},DWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x18, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vbroadcastss zmm30,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x18, 0x72, 0x7f }, { vbroadcastss zmm30,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x18, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vbroadcastss zmm30,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x18, 0x72, 0x80 }, { vbroadcastss zmm30,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x18, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vbroadcastss zmm30,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x18, 0xf5 }, { vbroadcastss zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x18, 0xf5 }, { vbroadcastss zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0xab }, { vcmppd k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0xab }, { vcmppd k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0xab }, { vcmppd k5,zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x7b }, { vcmppd k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x7b }, { vcmppd k5,zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x7b }, { vcmppd k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vcmppd k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x7b }, { vcmppd k5,zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmppd k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vcmppd k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x7b }, { vcmppd k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vcmppd k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmppd k5,zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vcmppd k5,zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x7b }, { vcmppd k5,zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vcmppd k5,zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x00 }, { vcmpeqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vcmpeqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x00 }, { vcmpeqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x01 }, { vcmpltpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x01 }, { vcmpltpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x01 }, { vcmpltpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x01 }, { vcmpltpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x01 }, { vcmpltpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x01 }, { vcmpltpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vcmpltpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vcmpltpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x02 }, { vcmplepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x02 }, { vcmplepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x02 }, { vcmplepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x02 }, { vcmplepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x02 }, { vcmplepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x02 }, { vcmplepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x02 }, { vcmplepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x02 }, { vcmplepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vcmplepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vcmplepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x03 }, { vcmpunordpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x03 }, { vcmpunordpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x03 }, { vcmpunordpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x04 }, { vcmpneqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vcmpneqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vcmpneqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x05 }, { vcmpnltpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vcmpnltpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vcmpnltpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x06 }, { vcmpnlepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vcmpnlepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vcmpnlepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x07 }, { vcmpordpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x07 }, { vcmpordpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x07 }, { vcmpordpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x07 }, { vcmpordpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x07 }, { vcmpordpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x07 }, { vcmpordpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x07 }, { vcmpordpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x07 }, { vcmpordpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x08 }, { vcmpeq_uqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x08 }, { vcmpeq_uqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x08 }, { vcmpeq_uqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x08 }, { vcmpeq_uqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x08 }, { vcmpeq_uqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x08 }, { vcmpeq_uqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x08 }, { vcmpeq_uqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x09 }, { vcmpngepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x09 }, { vcmpngepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x09 }, { vcmpngepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x09 }, { vcmpngepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x09 }, { vcmpngepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x09 }, { vcmpngepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x09 }, { vcmpngepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x09 }, { vcmpngepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0a }, { vcmpngtpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0a }, { vcmpngtpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0a }, { vcmpngtpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0b }, { vcmpfalsepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0b }, { vcmpfalsepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0b }, { vcmpfalsepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0c }, { vcmpneq_oqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0c }, { vcmpneq_oqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0c }, { vcmpneq_oqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0c }, { vcmpneq_oqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0c }, { vcmpneq_oqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0c }, { vcmpneq_oqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0c }, { vcmpneq_oqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0d }, { vcmpgepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0d }, { vcmpgepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0d }, { vcmpgepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0d }, { vcmpgepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0d }, { vcmpgepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0d }, { vcmpgepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0d }, { vcmpgepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0d }, { vcmpgepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0e }, { vcmpgtpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0e }, { vcmpgtpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0e }, { vcmpgtpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0f }, { vcmptruepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0f }, { vcmptruepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0f }, { vcmptruepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x0f }, { vcmptruepd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x0f }, { vcmptruepd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x0f }, { vcmptruepd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0f }, { vcmptruepd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0f }, { vcmptruepd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x10 }, { vcmpeq_ospd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x10 }, { vcmpeq_ospd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x10 }, { vcmpeq_ospd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x10 }, { vcmpeq_ospd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x10 }, { vcmpeq_ospd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_ospd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x10 }, { vcmpeq_ospd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_ospd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x10 }, { vcmpeq_ospd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x11 }, { vcmplt_oqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x11 }, { vcmplt_oqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x11 }, { vcmplt_oqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x11 }, { vcmplt_oqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x11 }, { vcmplt_oqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x11 }, { vcmplt_oqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x11 }, { vcmplt_oqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x12 }, { vcmple_oqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x12 }, { vcmple_oqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x12 }, { vcmple_oqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x12 }, { vcmple_oqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x12 }, { vcmple_oqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x12 }, { vcmple_oqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x12 }, { vcmple_oqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x13 }, { vcmpunord_spd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x13 }, { vcmpunord_spd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x13 }, { vcmpunord_spd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x13 }, { vcmpunord_spd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x13 }, { vcmpunord_spd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_spd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x13 }, { vcmpunord_spd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_spd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x13 }, { vcmpunord_spd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x14 }, { vcmpneq_uspd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x14 }, { vcmpneq_uspd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x14 }, { vcmpneq_uspd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x14 }, { vcmpneq_uspd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x14 }, { vcmpneq_uspd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_uspd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x14 }, { vcmpneq_uspd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_uspd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x14 }, { vcmpneq_uspd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x15 }, { vcmpnlt_uqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x15 }, { vcmpnlt_uqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x15 }, { vcmpnlt_uqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x16 }, { vcmpnle_uqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x16 }, { vcmpnle_uqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x16 }, { vcmpnle_uqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x16 }, { vcmpnle_uqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x16 }, { vcmpnle_uqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x16 }, { vcmpnle_uqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x16 }, { vcmpnle_uqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x17 }, { vcmpord_spd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x17 }, { vcmpord_spd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x17 }, { vcmpord_spd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x17 }, { vcmpord_spd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x17 }, { vcmpord_spd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_spd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x17 }, { vcmpord_spd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_spd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x17 }, { vcmpord_spd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x18 }, { vcmpeq_uspd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x18 }, { vcmpeq_uspd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x18 }, { vcmpeq_uspd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x18 }, { vcmpeq_uspd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x18 }, { vcmpeq_uspd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_uspd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x18 }, { vcmpeq_uspd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_uspd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x18 }, { vcmpeq_uspd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x19 }, { vcmpnge_uqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x19 }, { vcmpnge_uqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x19 }, { vcmpnge_uqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x19 }, { vcmpnge_uqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x19 }, { vcmpnge_uqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x19 }, { vcmpnge_uqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x19 }, { vcmpnge_uqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1a }, { vcmpngt_uqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1a }, { vcmpngt_uqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1a }, { vcmpngt_uqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1a }, { vcmpngt_uqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1a }, { vcmpngt_uqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1a }, { vcmpngt_uqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1a }, { vcmpngt_uqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1b }, { vcmpfalse_ospd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1b }, { vcmpfalse_ospd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1b }, { vcmpfalse_ospd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1b }, { vcmpfalse_ospd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1b }, { vcmpfalse_ospd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_ospd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1b }, { vcmpfalse_ospd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_ospd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1b }, { vcmpfalse_ospd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1c }, { vcmpneq_ospd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1c }, { vcmpneq_ospd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1c }, { vcmpneq_ospd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1c }, { vcmpneq_ospd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1c }, { vcmpneq_ospd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_ospd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1c }, { vcmpneq_ospd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_ospd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1c }, { vcmpneq_ospd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1d }, { vcmpge_oqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1d }, { vcmpge_oqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1d }, { vcmpge_oqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1d }, { vcmpge_oqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1d }, { vcmpge_oqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1d }, { vcmpge_oqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1d }, { vcmpge_oqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1e }, { vcmpgt_oqpd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1e }, { vcmpgt_oqpd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1e }, { vcmpgt_oqpd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1e }, { vcmpgt_oqpd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1e }, { vcmpgt_oqpd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqpd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1e }, { vcmpgt_oqpd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqpd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1e }, { vcmpgt_oqpd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0xc2, 0xed, 0x1f }, { vcmptrue_uspd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0xc2, 0xed, 0x1f }, { vcmptrue_uspd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x8d, 0x10, 0xc2, 0xed, 0x1f }, { vcmptrue_uspd k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x29, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x29, 0x1f }, { vcmptrue_uspd k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1f }, { vcmptrue_uspd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_uspd k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1f }, { vcmptrue_uspd k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_uspd k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1f }, { vcmptrue_uspd k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0xab }, { vcmpps k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0xab }, { vcmpps k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0xab }, { vcmpps k5,zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x7b }, { vcmpps k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x7b }, { vcmpps k5,zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x7b }, { vcmpps k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vcmpps k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x7b }, { vcmpps k5,zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmpps k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vcmpps k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x7b }, { vcmpps k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vcmpps k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmpps k5,zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vcmpps k5,zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x7b }, { vcmpps k5,zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vcmpps k5,zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x00 }, { vcmpeqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x00 }, { vcmpeqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x00 }, { vcmpeqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x00 }, { vcmpeqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x00 }, { vcmpeqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x00 }, { vcmpeqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vcmpeqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x00 }, { vcmpeqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x01 }, { vcmpltps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x01 }, { vcmpltps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x01 }, { vcmpltps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x01 }, { vcmpltps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x01 }, { vcmpltps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x01 }, { vcmpltps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x01 }, { vcmpltps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x01 }, { vcmpltps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vcmpltps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vcmpltps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x02 }, { vcmpleps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x02 }, { vcmpleps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x02 }, { vcmpleps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x02 }, { vcmpleps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x02 }, { vcmpleps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x02 }, { vcmpleps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x02 }, { vcmpleps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x02 }, { vcmpleps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vcmpleps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vcmpleps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x03 }, { vcmpunordps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x03 }, { vcmpunordps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x03 }, { vcmpunordps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x03 }, { vcmpunordps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x03 }, { vcmpunordps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x03 }, { vcmpunordps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x03 }, { vcmpunordps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x03 }, { vcmpunordps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x04 }, { vcmpneqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x04 }, { vcmpneqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x04 }, { vcmpneqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x04 }, { vcmpneqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x04 }, { vcmpneqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x04 }, { vcmpneqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vcmpneqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vcmpneqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x05 }, { vcmpnltps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x05 }, { vcmpnltps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x05 }, { vcmpnltps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x05 }, { vcmpnltps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x05 }, { vcmpnltps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x05 }, { vcmpnltps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vcmpnltps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vcmpnltps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x06 }, { vcmpnleps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x06 }, { vcmpnleps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x06 }, { vcmpnleps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x06 }, { vcmpnleps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x06 }, { vcmpnleps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x06 }, { vcmpnleps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vcmpnleps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vcmpnleps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x07 }, { vcmpordps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x07 }, { vcmpordps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x07 }, { vcmpordps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x07 }, { vcmpordps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x07 }, { vcmpordps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x07 }, { vcmpordps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x07 }, { vcmpordps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x07 }, { vcmpordps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x07 }, { vcmpordps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x07 }, { vcmpordps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x08 }, { vcmpeq_uqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x08 }, { vcmpeq_uqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x08 }, { vcmpeq_uqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x08 }, { vcmpeq_uqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x08 }, { vcmpeq_uqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x08 }, { vcmpeq_uqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x08 }, { vcmpeq_uqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x09 }, { vcmpngeps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x09 }, { vcmpngeps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x09 }, { vcmpngeps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x09 }, { vcmpngeps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x09 }, { vcmpngeps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x09 }, { vcmpngeps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x09 }, { vcmpngeps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x09 }, { vcmpngeps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0a }, { vcmpngtps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0a }, { vcmpngtps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0a }, { vcmpngtps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0a }, { vcmpngtps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0a }, { vcmpngtps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0a }, { vcmpngtps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0a }, { vcmpngtps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0a }, { vcmpngtps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0b }, { vcmpfalseps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0b }, { vcmpfalseps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0b }, { vcmpfalseps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0c }, { vcmpneq_oqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0c }, { vcmpneq_oqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0c }, { vcmpneq_oqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0c }, { vcmpneq_oqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0c }, { vcmpneq_oqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0c }, { vcmpneq_oqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0c }, { vcmpneq_oqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0d }, { vcmpgeps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0d }, { vcmpgeps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0d }, { vcmpgeps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0d }, { vcmpgeps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0d }, { vcmpgeps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0d }, { vcmpgeps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0d }, { vcmpgeps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0d }, { vcmpgeps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0e }, { vcmpgtps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0e }, { vcmpgtps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0e }, { vcmpgtps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0e }, { vcmpgtps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0e }, { vcmpgtps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0e }, { vcmpgtps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0e }, { vcmpgtps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0e }, { vcmpgtps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0f }, { vcmptrueps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0f }, { vcmptrueps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0f }, { vcmptrueps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x0f }, { vcmptrueps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x0f }, { vcmptrueps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x0f }, { vcmptrueps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x0f }, { vcmptrueps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0f }, { vcmptrueps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x10 }, { vcmpeq_osps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x10 }, { vcmpeq_osps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x10 }, { vcmpeq_osps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x10 }, { vcmpeq_osps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x10 }, { vcmpeq_osps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_osps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x10 }, { vcmpeq_osps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_osps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x10 }, { vcmpeq_osps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x11 }, { vcmplt_oqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x11 }, { vcmplt_oqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x11 }, { vcmplt_oqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x11 }, { vcmplt_oqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x11 }, { vcmplt_oqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x11 }, { vcmplt_oqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x11 }, { vcmplt_oqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x12 }, { vcmple_oqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x12 }, { vcmple_oqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x12 }, { vcmple_oqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x12 }, { vcmple_oqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x12 }, { vcmple_oqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x12 }, { vcmple_oqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x12 }, { vcmple_oqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x13 }, { vcmpunord_sps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x13 }, { vcmpunord_sps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x13 }, { vcmpunord_sps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x13 }, { vcmpunord_sps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x13 }, { vcmpunord_sps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_sps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x13 }, { vcmpunord_sps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_sps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x13 }, { vcmpunord_sps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x14 }, { vcmpneq_usps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x14 }, { vcmpneq_usps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x14 }, { vcmpneq_usps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x14 }, { vcmpneq_usps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x14 }, { vcmpneq_usps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_usps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x14 }, { vcmpneq_usps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_usps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x14 }, { vcmpneq_usps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x15 }, { vcmpnlt_uqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x15 }, { vcmpnlt_uqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x15 }, { vcmpnlt_uqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x15 }, { vcmpnlt_uqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x16 }, { vcmpnle_uqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x16 }, { vcmpnle_uqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x16 }, { vcmpnle_uqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x16 }, { vcmpnle_uqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x16 }, { vcmpnle_uqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x16 }, { vcmpnle_uqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x16 }, { vcmpnle_uqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x17 }, { vcmpord_sps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x17 }, { vcmpord_sps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x17 }, { vcmpord_sps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x17 }, { vcmpord_sps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x17 }, { vcmpord_sps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_sps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x17 }, { vcmpord_sps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_sps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x17 }, { vcmpord_sps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x18 }, { vcmpeq_usps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x18 }, { vcmpeq_usps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x18 }, { vcmpeq_usps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x18 }, { vcmpeq_usps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x18 }, { vcmpeq_usps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_usps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x18 }, { vcmpeq_usps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_usps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x18 }, { vcmpeq_usps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x19 }, { vcmpnge_uqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x19 }, { vcmpnge_uqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x19 }, { vcmpnge_uqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x19 }, { vcmpnge_uqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x19 }, { vcmpnge_uqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x19 }, { vcmpnge_uqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x19 }, { vcmpnge_uqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1a }, { vcmpngt_uqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1a }, { vcmpngt_uqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1a }, { vcmpngt_uqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1a }, { vcmpngt_uqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1a }, { vcmpngt_uqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1a }, { vcmpngt_uqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1a }, { vcmpngt_uqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1b }, { vcmpfalse_osps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1b }, { vcmpfalse_osps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1b }, { vcmpfalse_osps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1b }, { vcmpfalse_osps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1b }, { vcmpfalse_osps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_osps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1b }, { vcmpfalse_osps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_osps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1b }, { vcmpfalse_osps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1c }, { vcmpneq_osps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1c }, { vcmpneq_osps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1c }, { vcmpneq_osps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1c }, { vcmpneq_osps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1c }, { vcmpneq_osps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_osps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1c }, { vcmpneq_osps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_osps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1c }, { vcmpneq_osps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1d }, { vcmpge_oqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1d }, { vcmpge_oqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1d }, { vcmpge_oqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1d }, { vcmpge_oqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1d }, { vcmpge_oqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1d }, { vcmpge_oqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1d }, { vcmpge_oqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1e }, { vcmpgt_oqps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1e }, { vcmpgt_oqps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1e }, { vcmpgt_oqps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1e }, { vcmpgt_oqps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1e }, { vcmpgt_oqps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1e }, { vcmpgt_oqps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1e }, { vcmpgt_oqps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0c, 0x40, 0xc2, 0xed, 0x1f }, { vcmptrue_usps k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x47, 0xc2, 0xed, 0x1f }, { vcmptrue_usps k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0c, 0x10, 0xc2, 0xed, 0x1f }, { vcmptrue_usps k5,zmm30,zmm29,{sae} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x29, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0c, 0x40, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x29, 0x1f }, { vcmptrue_usps k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0c, 0x40, 0xc2, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x1f }, { vcmptrue_usps k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_usps k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1f }, { vcmptrue_usps k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_usps k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0c, 0x50, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1f }, { vcmptrue_usps k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0xab }, { vcmpsd k5{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0xab }, { vcmpsd k5{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x7b }, { vcmpsd k5{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x7b }, { vcmpsd k5{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rdx+0x3f8],0x7b }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rdx+0x400],0x7b }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rdx-0x400],0x7b }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vcmpsd k5{k7},xmm29,QWORD [rdx-0x408],0x7b }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x00 }, { vcmpeqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x00 }, { vcmpeqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x00 }, { vcmpeqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x00 }, { vcmpeqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x00 }, { vcmpeqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x01 }, { vcmpltsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x01 }, { vcmpltsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x01 }, { vcmpltsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x01 }, { vcmpltsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vcmpltsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x02 }, { vcmplesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x02 }, { vcmplesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x02 }, { vcmplesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x02 }, { vcmplesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vcmplesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x03 }, { vcmpunordsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x03 }, { vcmpunordsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x03 }, { vcmpunordsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x03 }, { vcmpunordsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x03 }, { vcmpunordsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x04 }, { vcmpneqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x04 }, { vcmpneqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x04 }, { vcmpneqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x04 }, { vcmpneqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vcmpneqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x05 }, { vcmpnltsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x05 }, { vcmpnltsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x05 }, { vcmpnltsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x05 }, { vcmpnltsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vcmpnltsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x06 }, { vcmpnlesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x06 }, { vcmpnlesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x06 }, { vcmpnlesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x06 }, { vcmpnlesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vcmpnlesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x07 }, { vcmpordsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x07 }, { vcmpordsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x07 }, { vcmpordsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x07 }, { vcmpordsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x07 }, { vcmpordsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x08 }, { vcmpeq_uqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x09 }, { vcmpngesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x09 }, { vcmpngesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x09 }, { vcmpngesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x09 }, { vcmpngesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x09 }, { vcmpngesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0a }, { vcmpngtsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0a }, { vcmpngtsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0a }, { vcmpngtsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0a }, { vcmpngtsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0a }, { vcmpngtsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0b }, { vcmpfalsesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0b }, { vcmpfalsesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0b }, { vcmpfalsesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0b }, { vcmpfalsesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0b }, { vcmpfalsesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0c }, { vcmpneq_oqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0d }, { vcmpgesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0d }, { vcmpgesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0d }, { vcmpgesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0d }, { vcmpgesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0d }, { vcmpgesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0e }, { vcmpgtsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0e }, { vcmpgtsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0e }, { vcmpgtsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0e }, { vcmpgtsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0e }, { vcmpgtsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0f }, { vcmptruesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0f }, { vcmptruesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x0f }, { vcmptruesd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x0f }, { vcmptruesd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x0f }, { vcmptruesd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x10 }, { vcmpeq_ossd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x11 }, { vcmplt_oqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x12 }, { vcmple_oqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x12 }, { vcmple_oqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x12 }, { vcmple_oqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x13 }, { vcmpunord_ssd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x14 }, { vcmpneq_ussd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x15 }, { vcmpnlt_uqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x16 }, { vcmpnle_uqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x17 }, { vcmpord_ssd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x17 }, { vcmpord_ssd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x17 }, { vcmpord_ssd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x18 }, { vcmpeq_ussd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x19 }, { vcmpnge_uqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1a }, { vcmpngt_uqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1b }, { vcmpfalse_ossd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1c }, { vcmpneq_ossd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1d }, { vcmpge_oqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1e }, { vcmpgt_oqsd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x97, 0x07, 0xc2, 0xec, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x97, 0x17, 0xc2, 0xec, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x29, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x97, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x97, 0x07, 0xc2, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x1f }, { vcmptrue_ussd k5{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0xab }, { vcmpss k5{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0xab }, { vcmpss k5{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x7b }, { vcmpss k5{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x7b }, { vcmpss k5{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rdx+0x1fc],0x7b }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rdx+0x200],0x7b }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rdx-0x200],0x7b }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vcmpss k5{k7},xmm29,DWORD [rdx-0x204],0x7b }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x00 }, { vcmpeqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x00 }, { vcmpeqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x00 }, { vcmpeqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x00 }, { vcmpeqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x00 }, { vcmpeqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x01 }, { vcmpltss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x01 }, { vcmpltss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x01 }, { vcmpltss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x01 }, { vcmpltss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vcmpltss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x02 }, { vcmpless k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x02 }, { vcmpless k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x02 }, { vcmpless k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x02 }, { vcmpless k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vcmpless k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x03 }, { vcmpunordss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x03 }, { vcmpunordss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x03 }, { vcmpunordss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x03 }, { vcmpunordss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x03 }, { vcmpunordss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x04 }, { vcmpneqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x04 }, { vcmpneqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x04 }, { vcmpneqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x04 }, { vcmpneqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vcmpneqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x05 }, { vcmpnltss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x05 }, { vcmpnltss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x05 }, { vcmpnltss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x05 }, { vcmpnltss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vcmpnltss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x06 }, { vcmpnless k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x06 }, { vcmpnless k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x06 }, { vcmpnless k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x06 }, { vcmpnless k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vcmpnless k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x07 }, { vcmpordss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x07 }, { vcmpordss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x07 }, { vcmpordss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x07 }, { vcmpordss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x07 }, { vcmpordss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x08 }, { vcmpeq_uqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x09 }, { vcmpngess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x09 }, { vcmpngess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x09 }, { vcmpngess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x09 }, { vcmpngess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x09 }, { vcmpngess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0a }, { vcmpngtss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0a }, { vcmpngtss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0a }, { vcmpngtss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0a }, { vcmpngtss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0a }, { vcmpngtss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0b }, { vcmpfalsess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0b }, { vcmpfalsess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0b }, { vcmpfalsess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0b }, { vcmpfalsess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0b }, { vcmpfalsess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0c }, { vcmpneq_oqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0d }, { vcmpgess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0d }, { vcmpgess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0d }, { vcmpgess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0d }, { vcmpgess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0d }, { vcmpgess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0e }, { vcmpgtss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0e }, { vcmpgtss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0e }, { vcmpgtss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0e }, { vcmpgtss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0e }, { vcmpgtss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0f }, { vcmptruess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0f }, { vcmptruess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x0f }, { vcmptruess k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x0f }, { vcmptruess k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x0f }, { vcmptruess k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x10 }, { vcmpeq_osss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x10 }, { vcmpeq_osss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x10 }, { vcmpeq_osss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x11 }, { vcmplt_oqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x11 }, { vcmplt_oqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x11 }, { vcmplt_oqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x12 }, { vcmple_oqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x12 }, { vcmple_oqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x12 }, { vcmple_oqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x13 }, { vcmpunord_sss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x13 }, { vcmpunord_sss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x13 }, { vcmpunord_sss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x14 }, { vcmpneq_usss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x14 }, { vcmpneq_usss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x14 }, { vcmpneq_usss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x15 }, { vcmpnlt_uqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x16 }, { vcmpnle_uqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x17 }, { vcmpord_sss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x17 }, { vcmpord_sss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x17 }, { vcmpord_sss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x18 }, { vcmpeq_usss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x18 }, { vcmpeq_usss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x18 }, { vcmpeq_usss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x19 }, { vcmpnge_uqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1a }, { vcmpngt_uqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1b }, { vcmpfalse_osss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1c }, { vcmpneq_osss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1c }, { vcmpneq_osss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1c }, { vcmpneq_osss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1d }, { vcmpge_oqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1d }, { vcmpge_oqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1d }, { vcmpge_oqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1e }, { vcmpgt_oqss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x16, 0x07, 0xc2, 0xec, 0x1f }, { vcmptrue_usss k5{k7},xmm29,xmm28 }
+testcase { 0x62, 0x91, 0x16, 0x17, 0xc2, 0xec, 0x1f }, { vcmptrue_usss k5{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x29, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x16, 0x07, 0xc2, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x7f, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0x6a, 0x80, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x16, 0x07, 0xc2, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x1f }, { vcmptrue_usss k5{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0xfd, 0x08, 0x2f, 0xf5 }, { vcomisd xmm30,xmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x18, 0x2f, 0xf5 }, { vcomisd xmm30,xmm29,{sae} }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2f, 0x31 }, { vcomisd xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x2f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcomisd xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2f, 0x72, 0x7f }, { vcomisd xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcomisd xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2f, 0x72, 0x80 }, { vcomisd xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcomisd xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x7c, 0x08, 0x2f, 0xf5 }, { vcomiss xmm30,xmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x2f, 0xf5 }, { vcomiss xmm30,xmm29,{sae} }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2f, 0x31 }, { vcomiss xmm30,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x08, 0x2f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcomiss xmm30,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2f, 0x72, 0x7f }, { vcomiss xmm30,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcomiss xmm30,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2f, 0x72, 0x80 }, { vcomiss xmm30,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcomiss xmm30,DWORD [rdx-0x204] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8a, 0x31 }, { vcompresspd ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x8a, 0x31 }, { vcompresspd ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x8a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcompresspd ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8a, 0x72, 0x7f }, { vcompresspd ZWORD [rdx+0x3f8],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcompresspd ZWORD [rdx+0x400],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8a, 0x72, 0x80 }, { vcompresspd ZWORD [rdx-0x400],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcompresspd ZWORD [rdx-0x408],zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x8a, 0xee }, { vcompresspd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x8a, 0xee }, { vcompresspd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x8a, 0xee }, { vcompresspd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8a, 0x31 }, { vcompressps ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x8a, 0x31 }, { vcompressps ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x8a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcompressps ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8a, 0x72, 0x7f }, { vcompressps ZWORD [rdx+0x1fc],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcompressps ZWORD [rdx+0x200],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8a, 0x72, 0x80 }, { vcompressps ZWORD [rdx-0x200],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcompressps ZWORD [rdx-0x204],zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x8a, 0xee }, { vcompressps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x8a, 0xee }, { vcompressps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x8a, 0xee }, { vcompressps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0xe6, 0xf5 }, { vcvtdq2pd zmm30{k7},ymm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0xe6, 0xf5 }, { vcvtdq2pd zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0xe6, 0x31 }, { vcvtdq2pd zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x4f, 0xe6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtdq2pd zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0xe6, 0x31 }, { vcvtdq2pd zmm30{k7},DWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0xe6, 0x72, 0x7f }, { vcvtdq2pd zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0xe6, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vcvtdq2pd zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0xe6, 0x72, 0x80 }, { vcvtdq2pd zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0xe6, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vcvtdq2pd zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0xe6, 0x72, 0x7f }, { vcvtdq2pd zmm30{k7},DWORD [rdx+0x1fc]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0xe6, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtdq2pd zmm30{k7},DWORD [rdx+0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0xe6, 0x72, 0x80 }, { vcvtdq2pd zmm30{k7},DWORD [rdx-0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0xe6, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtdq2pd zmm30{k7},DWORD [rdx-0x204]{1to8} }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x5b, 0xf5 }, { vcvtdq2ps zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x5b, 0xf5 }, { vcvtdq2ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x5b, 0xf5 }, { vcvtdq2ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x5b, 0xf5 }, { vcvtdq2ps zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x58, 0x5b, 0xf5 }, { vcvtdq2ps zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x38, 0x5b, 0xf5 }, { vcvtdq2ps zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x78, 0x5b, 0xf5 }, { vcvtdq2ps zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x5b, 0x31 }, { vcvtdq2ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x5b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtdq2ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x5b, 0x31 }, { vcvtdq2ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x5b, 0x72, 0x7f }, { vcvtdq2ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x5b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtdq2ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x5b, 0x72, 0x80 }, { vcvtdq2ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x5b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtdq2ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x5b, 0x72, 0x7f }, { vcvtdq2ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x5b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtdq2ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x5b, 0x72, 0x80 }, { vcvtdq2ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x5b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtdq2ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0xff, 0x4f, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xff, 0xcf, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xff, 0x1f, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7},zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0xff, 0x5f, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7},zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0xff, 0x3f, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7},zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0xff, 0x7f, 0xe6, 0xf5 }, { vcvtpd2dq ymm30{k7},zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0xff, 0x4f, 0xe6, 0x31 }, { vcvtpd2dq ymm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xff, 0x4f, 0xe6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtpd2dq ymm30{k7},ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xff, 0x5f, 0xe6, 0x31 }, { vcvtpd2dq ymm30{k7},QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xff, 0x4f, 0xe6, 0x72, 0x7f }, { vcvtpd2dq ymm30{k7},ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xff, 0x4f, 0xe6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtpd2dq ymm30{k7},ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xff, 0x4f, 0xe6, 0x72, 0x80 }, { vcvtpd2dq ymm30{k7},ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xff, 0x4f, 0xe6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtpd2dq ymm30{k7},ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xff, 0x5f, 0xe6, 0x72, 0x7f }, { vcvtpd2dq ymm30{k7},QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xff, 0x5f, 0xe6, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtpd2dq ymm30{k7},QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xff, 0x5f, 0xe6, 0x72, 0x80 }, { vcvtpd2dq ymm30{k7},QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xff, 0x5f, 0xe6, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtpd2dq ymm30{k7},QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x1f, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7},zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x5f, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7},zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x3f, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7},zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x7f, 0x5a, 0xf5 }, { vcvtpd2ps ymm30{k7},zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x5a, 0x31 }, { vcvtpd2ps ymm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x4f, 0x5a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtpd2ps ymm30{k7},ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0x5a, 0x31 }, { vcvtpd2ps ymm30{k7},QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x5a, 0x72, 0x7f }, { vcvtpd2ps ymm30{k7},ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x5a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtpd2ps ymm30{k7},ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x5a, 0x72, 0x80 }, { vcvtpd2ps ymm30{k7},ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x5a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtpd2ps ymm30{k7},ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0x5a, 0x72, 0x7f }, { vcvtpd2ps ymm30{k7},QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0x5a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtpd2ps ymm30{k7},QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0x5a, 0x72, 0x80 }, { vcvtpd2ps ymm30{k7},QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0x5a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtpd2ps ymm30{k7},QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0xfc, 0x4f, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfc, 0xcf, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xfc, 0x1f, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7},zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0xfc, 0x5f, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7},zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0xfc, 0x3f, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7},zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0xfc, 0x7f, 0x79, 0xf5 }, { vcvtpd2udq ymm30{k7},zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x79, 0x31 }, { vcvtpd2udq ymm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfc, 0x4f, 0x79, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtpd2udq ymm30{k7},ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x79, 0x31 }, { vcvtpd2udq ymm30{k7},QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x79, 0x72, 0x7f }, { vcvtpd2udq ymm30{k7},ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x79, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtpd2udq ymm30{k7},ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x79, 0x72, 0x80 }, { vcvtpd2udq ymm30{k7},ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x79, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtpd2udq ymm30{k7},ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x79, 0x72, 0x7f }, { vcvtpd2udq ymm30{k7},QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x79, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtpd2udq ymm30{k7},QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x79, 0x72, 0x80 }, { vcvtpd2udq ymm30{k7},QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x79, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtpd2udq ymm30{k7},QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x13, 0xf5 }, { vcvtph2ps zmm30{k7},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x13, 0xf5 }, { vcvtph2ps zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0x1f, 0x13, 0xf5 }, { vcvtph2ps zmm30{k7},ymm29,{sae} }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x13, 0x31 }, { vcvtph2ps zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x13, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtph2ps zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x13, 0x72, 0x7f }, { vcvtph2ps zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x13, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vcvtph2ps zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x13, 0x72, 0x80 }, { vcvtph2ps zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x13, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vcvtph2ps zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x01, 0x7d, 0x48, 0x5b, 0xf5 }, { vcvtps2dq zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7d, 0x4f, 0x5b, 0xf5 }, { vcvtps2dq zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7d, 0xcf, 0x5b, 0xf5 }, { vcvtps2dq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7d, 0x18, 0x5b, 0xf5 }, { vcvtps2dq zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0x7d, 0x58, 0x5b, 0xf5 }, { vcvtps2dq zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0x7d, 0x38, 0x5b, 0xf5 }, { vcvtps2dq zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0x7d, 0x78, 0x5b, 0xf5 }, { vcvtps2dq zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x5b, 0x31 }, { vcvtps2dq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7d, 0x48, 0x5b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtps2dq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x5b, 0x31 }, { vcvtps2dq zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x5b, 0x72, 0x7f }, { vcvtps2dq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x5b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtps2dq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x5b, 0x72, 0x80 }, { vcvtps2dq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x5b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtps2dq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x5b, 0x72, 0x7f }, { vcvtps2dq zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x5b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtps2dq zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x5b, 0x72, 0x80 }, { vcvtps2dq zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x5b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtps2dq zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x5a, 0xf5 }, { vcvtps2pd zmm30{k7},ymm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x5a, 0xf5 }, { vcvtps2pd zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x01, 0x7c, 0x1f, 0x5a, 0xf5 }, { vcvtps2pd zmm30{k7},ymm29,{sae} }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x5a, 0x31 }, { vcvtps2pd zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x4f, 0x5a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtps2pd zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x5f, 0x5a, 0x31 }, { vcvtps2pd zmm30{k7},DWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x5a, 0x72, 0x7f }, { vcvtps2pd zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x5a, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vcvtps2pd zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x5a, 0x72, 0x80 }, { vcvtps2pd zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x5a, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vcvtps2pd zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x61, 0x7c, 0x5f, 0x5a, 0x72, 0x7f }, { vcvtps2pd zmm30{k7},DWORD [rdx+0x1fc]{1to8} }
+testcase { 0x62, 0x61, 0x7c, 0x5f, 0x5a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtps2pd zmm30{k7},DWORD [rdx+0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7c, 0x5f, 0x5a, 0x72, 0x80 }, { vcvtps2pd zmm30{k7},DWORD [rdx-0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7c, 0x5f, 0x5a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtps2pd zmm30{k7},DWORD [rdx-0x204]{1to8} }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x1d, 0xee, 0xab }, { vcvtps2ph ymm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x1d, 0xee, 0xab }, { vcvtps2ph ymm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x1f, 0x1d, 0xee, 0xab }, { vcvtps2ph ymm30{k7},zmm29,{sae},0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x1d, 0xee, 0x7b }, { vcvtps2ph ymm30{k7},zmm29,0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x1f, 0x1d, 0xee, 0x7b }, { vcvtps2ph ymm30{k7},zmm29,{sae},0x7b }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x79, 0xf5 }, { vcvtps2udq zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x79, 0xf5 }, { vcvtps2udq zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x79, 0xf5 }, { vcvtps2udq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x79, 0xf5 }, { vcvtps2udq zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x58, 0x79, 0xf5 }, { vcvtps2udq zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x38, 0x79, 0xf5 }, { vcvtps2udq zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x78, 0x79, 0xf5 }, { vcvtps2udq zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x79, 0x31 }, { vcvtps2udq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x79, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtps2udq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x79, 0x31 }, { vcvtps2udq zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x79, 0x72, 0x7f }, { vcvtps2udq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x79, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtps2udq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x79, 0x72, 0x80 }, { vcvtps2udq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x79, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtps2udq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x79, 0x72, 0x7f }, { vcvtps2udq zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x79, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtps2udq zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x79, 0x72, 0x80 }, { vcvtps2udq zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x79, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtps2udq zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x2d, 0xc6 }, { vcvtsd2si eax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x58, 0x2d, 0xc6 }, { vcvtsd2si eax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x38, 0x2d, 0xc6 }, { vcvtsd2si eax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x78, 0x2d, 0xc6 }, { vcvtsd2si eax,xmm30,{rz-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x2d, 0xee }, { vcvtsd2si ebp,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x58, 0x2d, 0xee }, { vcvtsd2si ebp,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x38, 0x2d, 0xee }, { vcvtsd2si ebp,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x78, 0x2d, 0xee }, { vcvtsd2si ebp,xmm30,{rz-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x18, 0x2d, 0xee }, { vcvtsd2si r13d,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x58, 0x2d, 0xee }, { vcvtsd2si r13d,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x38, 0x2d, 0xee }, { vcvtsd2si r13d,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x78, 0x2d, 0xee }, { vcvtsd2si r13d,xmm30,{rz-sae} }
+testcase { 0x62, 0x91, 0xff, 0x18, 0x2d, 0xc6 }, { vcvtsd2si rax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0xff, 0x58, 0x2d, 0xc6 }, { vcvtsd2si rax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0xff, 0x38, 0x2d, 0xc6 }, { vcvtsd2si rax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0xff, 0x78, 0x2d, 0xc6 }, { vcvtsd2si rax,xmm30,{rz-sae} }
+testcase { 0x62, 0x11, 0xff, 0x18, 0x2d, 0xc6 }, { vcvtsd2si r8,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0xff, 0x58, 0x2d, 0xc6 }, { vcvtsd2si r8,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0xff, 0x38, 0x2d, 0xc6 }, { vcvtsd2si r8,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0xff, 0x78, 0x2d, 0xc6 }, { vcvtsd2si r8,xmm30,{rz-sae} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x5a, 0xf4 }, { vcvtsd2ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5a, 0x31 }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x5a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5a, 0x72, 0x7f }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5a, 0x72, 0x80 }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2ss xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,eax }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0xf5 }, { vcvtsi2sd xmm30,xmm29,ebp }
+testcase { 0x62, 0x41, 0x17, 0x00, 0x2a, 0xf5 }, { vcvtsi2sd xmm30,xmm29,r13d }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0x31 }, { vcvtsi2sd xmm30,xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x17, 0x00, 0x2a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsi2sd xmm30,xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0x72, 0x7f }, { vcvtsi2sd xmm30,xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtsi2sd xmm30,xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0x72, 0x80 }, { vcvtsi2sd xmm30,xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x2a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtsi2sd xmm30,xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,rax }
+testcase { 0x62, 0x61, 0x97, 0x10, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rn-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x50, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{ru-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x30, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rd-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x70, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rz-sae},rax }
+testcase { 0x62, 0x41, 0x97, 0x00, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,r8 }
+testcase { 0x62, 0x41, 0x97, 0x10, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rn-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x50, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{ru-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x30, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rd-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x70, 0x2a, 0xf0 }, { vcvtsi2sd xmm30,xmm29,{rz-sae},r8 }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0x31 }, { vcvtsi2sd xmm30,xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x00, 0x2a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsi2sd xmm30,xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0x72, 0x7f }, { vcvtsi2sd xmm30,xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtsi2sd xmm30,xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0x72, 0x80 }, { vcvtsi2sd xmm30,xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x2a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsi2sd xmm30,xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,eax }
+testcase { 0x62, 0x61, 0x16, 0x10, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rn-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x50, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{ru-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x30, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rd-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x70, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rz-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,ebp }
+testcase { 0x62, 0x61, 0x16, 0x10, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rn-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x50, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{ru-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x30, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rd-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x70, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rz-sae},ebp }
+testcase { 0x62, 0x41, 0x16, 0x00, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,r13d }
+testcase { 0x62, 0x41, 0x16, 0x10, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rn-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x50, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{ru-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x30, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rd-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x70, 0x2a, 0xf5 }, { vcvtsi2ss xmm30,xmm29,{rz-sae},r13d }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0x31 }, { vcvtsi2ss xmm30,xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x00, 0x2a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsi2ss xmm30,xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0x72, 0x7f }, { vcvtsi2ss xmm30,xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtsi2ss xmm30,xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0x72, 0x80 }, { vcvtsi2ss xmm30,xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x2a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtsi2ss xmm30,xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,rax }
+testcase { 0x62, 0x61, 0x96, 0x10, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rn-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x50, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{ru-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x30, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rd-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x70, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rz-sae},rax }
+testcase { 0x62, 0x41, 0x96, 0x00, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,r8 }
+testcase { 0x62, 0x41, 0x96, 0x10, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rn-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x50, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{ru-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x30, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rd-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x70, 0x2a, 0xf0 }, { vcvtsi2ss xmm30,xmm29,{rz-sae},r8 }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0x31 }, { vcvtsi2ss xmm30,xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x96, 0x00, 0x2a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsi2ss xmm30,xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0x72, 0x7f }, { vcvtsi2ss xmm30,xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtsi2ss xmm30,xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0x72, 0x80 }, { vcvtsi2ss xmm30,xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x2a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsi2ss xmm30,xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x5a, 0xf4 }, { vcvtss2sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x5a, 0xf4 }, { vcvtss2sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x5a, 0xf4 }, { vcvtss2sd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5a, 0x31 }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x5a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5a, 0x72, 0x7f }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5a, 0x72, 0x80 }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2sd xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x2d, 0xc6 }, { vcvtss2si eax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x58, 0x2d, 0xc6 }, { vcvtss2si eax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x38, 0x2d, 0xc6 }, { vcvtss2si eax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x78, 0x2d, 0xc6 }, { vcvtss2si eax,xmm30,{rz-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x2d, 0xee }, { vcvtss2si ebp,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x58, 0x2d, 0xee }, { vcvtss2si ebp,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x38, 0x2d, 0xee }, { vcvtss2si ebp,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x78, 0x2d, 0xee }, { vcvtss2si ebp,xmm30,{rz-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x18, 0x2d, 0xee }, { vcvtss2si r13d,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x58, 0x2d, 0xee }, { vcvtss2si r13d,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x38, 0x2d, 0xee }, { vcvtss2si r13d,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x78, 0x2d, 0xee }, { vcvtss2si r13d,xmm30,{rz-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x18, 0x2d, 0xc6 }, { vcvtss2si rax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x58, 0x2d, 0xc6 }, { vcvtss2si rax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x38, 0x2d, 0xc6 }, { vcvtss2si rax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x78, 0x2d, 0xc6 }, { vcvtss2si rax,xmm30,{rz-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x18, 0x2d, 0xc6 }, { vcvtss2si r8,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x58, 0x2d, 0xc6 }, { vcvtss2si r8,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x38, 0x2d, 0xc6 }, { vcvtss2si r8,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x78, 0x2d, 0xc6 }, { vcvtss2si r8,xmm30,{rz-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0xe6, 0xf5 }, { vcvttpd2dq ymm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0xe6, 0xf5 }, { vcvttpd2dq ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x1f, 0xe6, 0xf5 }, { vcvttpd2dq ymm30{k7},zmm29,{sae} }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0xe6, 0x31 }, { vcvttpd2dq ymm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x4f, 0xe6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttpd2dq ymm30{k7},ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0xe6, 0x31 }, { vcvttpd2dq ymm30{k7},QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0xe6, 0x72, 0x7f }, { vcvttpd2dq ymm30{k7},ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0xe6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvttpd2dq ymm30{k7},ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0xe6, 0x72, 0x80 }, { vcvttpd2dq ymm30{k7},ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0xe6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvttpd2dq ymm30{k7},ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0xe6, 0x72, 0x7f }, { vcvttpd2dq ymm30{k7},QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0xe6, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvttpd2dq ymm30{k7},QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0xe6, 0x72, 0x80 }, { vcvttpd2dq ymm30{k7},QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x5f, 0xe6, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvttpd2dq ymm30{k7},QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x7e, 0x48, 0x5b, 0xf5 }, { vcvttps2dq zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0x5b, 0xf5 }, { vcvttps2dq zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0x5b, 0xf5 }, { vcvttps2dq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x18, 0x5b, 0xf5 }, { vcvttps2dq zmm30,zmm29,{sae} }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x5b, 0x31 }, { vcvttps2dq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x48, 0x5b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttps2dq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x58, 0x5b, 0x31 }, { vcvttps2dq zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x5b, 0x72, 0x7f }, { vcvttps2dq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x5b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvttps2dq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x5b, 0x72, 0x80 }, { vcvttps2dq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x5b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvttps2dq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7e, 0x58, 0x5b, 0x72, 0x7f }, { vcvttps2dq zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7e, 0x58, 0x5b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvttps2dq zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7e, 0x58, 0x5b, 0x72, 0x80 }, { vcvttps2dq zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7e, 0x58, 0x5b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvttps2dq zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x2c, 0xc6 }, { vcvttsd2si eax,xmm30,{sae} }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x2c, 0xee }, { vcvttsd2si ebp,xmm30,{sae} }
+testcase { 0x62, 0x11, 0x7f, 0x18, 0x2c, 0xee }, { vcvttsd2si r13d,xmm30,{sae} }
+testcase { 0x62, 0x91, 0xff, 0x18, 0x2c, 0xc6 }, { vcvttsd2si rax,xmm30,{sae} }
+testcase { 0x62, 0x11, 0xff, 0x18, 0x2c, 0xc6 }, { vcvttsd2si r8,xmm30,{sae} }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x2c, 0xc6 }, { vcvttss2si eax,xmm30,{sae} }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x2c, 0xee }, { vcvttss2si ebp,xmm30,{sae} }
+testcase { 0x62, 0x11, 0x7e, 0x18, 0x2c, 0xee }, { vcvttss2si r13d,xmm30,{sae} }
+testcase { 0x62, 0x91, 0xfe, 0x18, 0x2c, 0xc6 }, { vcvttss2si rax,xmm30,{sae} }
+testcase { 0x62, 0x11, 0xfe, 0x18, 0x2c, 0xc6 }, { vcvttss2si r8,xmm30,{sae} }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0x7a, 0xf5 }, { vcvtudq2pd zmm30{k7},ymm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0x7a, 0xf5 }, { vcvtudq2pd zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7a, 0x31 }, { vcvtudq2pd zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x4f, 0x7a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtudq2pd zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0x7a, 0x31 }, { vcvtudq2pd zmm30{k7},DWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7a, 0x72, 0x7f }, { vcvtudq2pd zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7a, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vcvtudq2pd zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7a, 0x72, 0x80 }, { vcvtudq2pd zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7a, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vcvtudq2pd zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0x7a, 0x72, 0x7f }, { vcvtudq2pd zmm30{k7},DWORD [rdx+0x1fc]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0x7a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtudq2pd zmm30{k7},DWORD [rdx+0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0x7a, 0x72, 0x80 }, { vcvtudq2pd zmm30{k7},DWORD [rdx-0x200]{1to8} }
+testcase { 0x62, 0x61, 0x7e, 0x5f, 0x7a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtudq2pd zmm30{k7},DWORD [rdx-0x204]{1to8} }
+testcase { 0x62, 0x01, 0x7f, 0x48, 0x7a, 0xf5 }, { vcvtudq2ps zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7f, 0x4f, 0x7a, 0xf5 }, { vcvtudq2ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7f, 0xcf, 0x7a, 0xf5 }, { vcvtudq2ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7f, 0x18, 0x7a, 0xf5 }, { vcvtudq2ps zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0x7f, 0x58, 0x7a, 0xf5 }, { vcvtudq2ps zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0x7f, 0x38, 0x7a, 0xf5 }, { vcvtudq2ps zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0x7f, 0x78, 0x7a, 0xf5 }, { vcvtudq2ps zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0x7f, 0x48, 0x7a, 0x31 }, { vcvtudq2ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7f, 0x48, 0x7a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtudq2ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7f, 0x58, 0x7a, 0x31 }, { vcvtudq2ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7f, 0x48, 0x7a, 0x72, 0x7f }, { vcvtudq2ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7f, 0x48, 0x7a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvtudq2ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7f, 0x48, 0x7a, 0x72, 0x80 }, { vcvtudq2ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7f, 0x48, 0x7a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvtudq2ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7f, 0x58, 0x7a, 0x72, 0x7f }, { vcvtudq2ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7f, 0x58, 0x7a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtudq2ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7f, 0x58, 0x7a, 0x72, 0x80 }, { vcvtudq2ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7f, 0x58, 0x7a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtudq2ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x5e, 0xf4 }, { vdivpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x5e, 0xf4 }, { vdivpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x5e, 0xf4 }, { vdivpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x5e, 0xf4 }, { vdivpd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x95, 0x50, 0x5e, 0xf4 }, { vdivpd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x95, 0x30, 0x5e, 0xf4 }, { vdivpd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x95, 0x70, 0x5e, 0xf4 }, { vdivpd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5e, 0x31 }, { vdivpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x5e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vdivpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5e, 0x31 }, { vdivpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5e, 0x72, 0x7f }, { vdivpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vdivpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5e, 0x72, 0x80 }, { vdivpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vdivpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5e, 0x72, 0x7f }, { vdivpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vdivpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5e, 0x72, 0x80 }, { vdivpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vdivpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x5e, 0xf4 }, { vdivps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x5e, 0xf4 }, { vdivps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x5e, 0xf4 }, { vdivps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x5e, 0xf4 }, { vdivps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x14, 0x50, 0x5e, 0xf4 }, { vdivps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x14, 0x30, 0x5e, 0xf4 }, { vdivps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x14, 0x70, 0x5e, 0xf4 }, { vdivps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5e, 0x31 }, { vdivps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x5e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vdivps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5e, 0x31 }, { vdivps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5e, 0x72, 0x7f }, { vdivps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vdivps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5e, 0x72, 0x80 }, { vdivps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vdivps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5e, 0x72, 0x7f }, { vdivps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vdivps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5e, 0x72, 0x80 }, { vdivps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vdivps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x5e, 0xf4 }, { vdivsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x5e, 0xf4 }, { vdivsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x5e, 0xf4 }, { vdivsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x5e, 0xf4 }, { vdivsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x5e, 0xf4 }, { vdivsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x5e, 0xf4 }, { vdivsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5e, 0x31 }, { vdivsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x5e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vdivsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5e, 0x72, 0x7f }, { vdivsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vdivsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5e, 0x72, 0x80 }, { vdivsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vdivsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x5e, 0xf4 }, { vdivss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x5e, 0xf4 }, { vdivss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x5e, 0xf4 }, { vdivss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x16, 0x57, 0x5e, 0xf4 }, { vdivss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x16, 0x37, 0x5e, 0xf4 }, { vdivss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x16, 0x77, 0x5e, 0xf4 }, { vdivss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5e, 0x31 }, { vdivss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x5e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vdivss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5e, 0x72, 0x7f }, { vdivss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vdivss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5e, 0x72, 0x80 }, { vdivss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vdivss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x88, 0x31 }, { vexpandpd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x88, 0x31 }, { vexpandpd zmm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x88, 0x31 }, { vexpandpd zmm30{k7}{z},ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x88, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vexpandpd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x88, 0x72, 0x7f }, { vexpandpd zmm30,ZWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x88, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vexpandpd zmm30,ZWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x88, 0x72, 0x80 }, { vexpandpd zmm30,ZWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x88, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vexpandpd zmm30,ZWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x88, 0xf5 }, { vexpandpd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x88, 0xf5 }, { vexpandpd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x88, 0xf5 }, { vexpandpd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x88, 0x31 }, { vexpandps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x88, 0x31 }, { vexpandps zmm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x88, 0x31 }, { vexpandps zmm30{k7}{z},ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x88, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vexpandps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x88, 0x72, 0x7f }, { vexpandps zmm30,ZWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x88, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vexpandps zmm30,ZWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x88, 0x72, 0x80 }, { vexpandps zmm30,ZWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x88, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vexpandps zmm30,ZWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x88, 0xf5 }, { vexpandps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x88, 0xf5 }, { vexpandps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x88, 0xf5 }, { vexpandps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x19, 0xee, 0xab }, { vextractf32x4 xmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x19, 0xee, 0xab }, { vextractf32x4 xmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x19, 0xee, 0x7b }, { vextractf32x4 xmm30{k7},zmm29,0x7b }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x1b, 0xee, 0xab }, { vextractf64x4 ymm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x1b, 0xee, 0xab }, { vextractf64x4 ymm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x1b, 0xee, 0x7b }, { vextractf64x4 ymm30{k7},zmm29,0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x39, 0xee, 0xab }, { vextracti32x4 xmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x39, 0xee, 0xab }, { vextracti32x4 xmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x39, 0xee, 0x7b }, { vextracti32x4 xmm30{k7},zmm29,0x7b }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x3b, 0xee, 0xab }, { vextracti64x4 ymm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x3b, 0xee, 0xab }, { vextracti64x4 ymm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x3b, 0xee, 0x7b }, { vextracti64x4 ymm30{k7},zmm29,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x08, 0x17, 0xe8, 0xab }, { vextractps rax,xmm29,0xab }
+testcase { 0x62, 0x63, 0xfd, 0x08, 0x17, 0xe8, 0x7b }, { vextractps rax,xmm29,0x7b }
+testcase { 0x62, 0x43, 0xfd, 0x08, 0x17, 0xe8, 0x7b }, { vextractps r8,xmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x08, 0x17, 0x29, 0x7b }, { vextractps DWORD [rcx],xmm29,0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x08, 0x17, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vextractps DWORD [rax+r14*8+0x123],xmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x08, 0x17, 0x6a, 0x7f, 0x7b }, { vextractps DWORD [rdx+0x1fc],xmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x08, 0x17, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vextractps DWORD [rdx+0x200],xmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x08, 0x17, 0x6a, 0x80, 0x7b }, { vextractps DWORD [rdx-0x200],xmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x08, 0x17, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vextractps DWORD [rdx-0x204],xmm29,0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x98, 0xf4 }, { vfmadd132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x98, 0xf4 }, { vfmadd132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x98, 0xf4 }, { vfmadd132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x98, 0xf4 }, { vfmadd132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x98, 0xf4 }, { vfmadd132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x98, 0xf4 }, { vfmadd132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x98, 0xf4 }, { vfmadd132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x98, 0x31 }, { vfmadd132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x98, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x98, 0x31 }, { vfmadd132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x98, 0x72, 0x7f }, { vfmadd132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x98, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x98, 0x72, 0x80 }, { vfmadd132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x98, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x98, 0x72, 0x7f }, { vfmadd132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x98, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x98, 0x72, 0x80 }, { vfmadd132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x98, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x98, 0xf4 }, { vfmadd132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x98, 0xf4 }, { vfmadd132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x98, 0xf4 }, { vfmadd132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x98, 0xf4 }, { vfmadd132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x98, 0xf4 }, { vfmadd132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x98, 0xf4 }, { vfmadd132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x98, 0xf4 }, { vfmadd132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x98, 0x31 }, { vfmadd132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x98, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x98, 0x31 }, { vfmadd132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x98, 0x72, 0x7f }, { vfmadd132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x98, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x98, 0x72, 0x80 }, { vfmadd132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x98, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x98, 0x72, 0x7f }, { vfmadd132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x98, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x98, 0x72, 0x80 }, { vfmadd132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x98, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0x99, 0xf4 }, { vfmadd132sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x99, 0x31 }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x99, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x99, 0x72, 0x7f }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x99, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x99, 0x72, 0x80 }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x99, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd132sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0x99, 0xf4 }, { vfmadd132ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x99, 0x31 }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x99, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x99, 0x72, 0x7f }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x99, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x99, 0x72, 0x80 }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x99, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd132ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xa8, 0xf4 }, { vfmadd213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xa8, 0xf4 }, { vfmadd213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xa8, 0xf4 }, { vfmadd213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xa8, 0xf4 }, { vfmadd213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xa8, 0xf4 }, { vfmadd213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xa8, 0xf4 }, { vfmadd213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xa8, 0xf4 }, { vfmadd213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa8, 0x31 }, { vfmadd213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xa8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa8, 0x31 }, { vfmadd213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa8, 0x72, 0x7f }, { vfmadd213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa8, 0x72, 0x80 }, { vfmadd213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa8, 0x72, 0x7f }, { vfmadd213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa8, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa8, 0x72, 0x80 }, { vfmadd213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa8, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xa8, 0xf4 }, { vfmadd213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xa8, 0xf4 }, { vfmadd213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xa8, 0xf4 }, { vfmadd213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xa8, 0xf4 }, { vfmadd213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xa8, 0xf4 }, { vfmadd213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xa8, 0xf4 }, { vfmadd213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xa8, 0xf4 }, { vfmadd213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa8, 0x31 }, { vfmadd213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xa8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa8, 0x31 }, { vfmadd213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa8, 0x72, 0x7f }, { vfmadd213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa8, 0x72, 0x80 }, { vfmadd213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa8, 0x72, 0x7f }, { vfmadd213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa8, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa8, 0x72, 0x80 }, { vfmadd213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa8, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xa9, 0xf4 }, { vfmadd213sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xa9, 0x31 }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xa9, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xa9, 0x72, 0x7f }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xa9, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xa9, 0x72, 0x80 }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xa9, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd213sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xa9, 0xf4 }, { vfmadd213ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xa9, 0x31 }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xa9, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xa9, 0x72, 0x7f }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xa9, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xa9, 0x72, 0x80 }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xa9, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd213ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xb8, 0xf4 }, { vfmadd231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xb8, 0xf4 }, { vfmadd231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xb8, 0xf4 }, { vfmadd231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xb8, 0xf4 }, { vfmadd231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xb8, 0xf4 }, { vfmadd231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xb8, 0xf4 }, { vfmadd231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xb8, 0xf4 }, { vfmadd231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb8, 0x31 }, { vfmadd231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xb8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb8, 0x31 }, { vfmadd231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb8, 0x72, 0x7f }, { vfmadd231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb8, 0x72, 0x80 }, { vfmadd231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb8, 0x72, 0x7f }, { vfmadd231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb8, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb8, 0x72, 0x80 }, { vfmadd231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb8, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xb8, 0xf4 }, { vfmadd231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xb8, 0xf4 }, { vfmadd231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xb8, 0xf4 }, { vfmadd231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xb8, 0xf4 }, { vfmadd231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xb8, 0xf4 }, { vfmadd231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xb8, 0xf4 }, { vfmadd231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xb8, 0xf4 }, { vfmadd231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb8, 0x31 }, { vfmadd231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xb8, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb8, 0x31 }, { vfmadd231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb8, 0x72, 0x7f }, { vfmadd231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb8, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmadd231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb8, 0x72, 0x80 }, { vfmadd231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb8, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmadd231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb8, 0x72, 0x7f }, { vfmadd231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb8, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb8, 0x72, 0x80 }, { vfmadd231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb8, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xb9, 0xf4 }, { vfmadd231sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xb9, 0x31 }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xb9, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xb9, 0x72, 0x7f }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xb9, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xb9, 0x72, 0x80 }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xb9, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmadd231sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xb9, 0xf4 }, { vfmadd231ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xb9, 0x31 }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xb9, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xb9, 0x72, 0x7f }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xb9, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xb9, 0x72, 0x80 }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xb9, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmadd231ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x96, 0xf4 }, { vfmaddsub132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x96, 0xf4 }, { vfmaddsub132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x96, 0xf4 }, { vfmaddsub132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x96, 0xf4 }, { vfmaddsub132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x96, 0xf4 }, { vfmaddsub132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x96, 0xf4 }, { vfmaddsub132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x96, 0xf4 }, { vfmaddsub132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x96, 0x31 }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x96, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x96, 0x31 }, { vfmaddsub132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x96, 0x72, 0x7f }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x96, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x96, 0x72, 0x80 }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x96, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x96, 0x72, 0x7f }, { vfmaddsub132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x96, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmaddsub132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x96, 0x72, 0x80 }, { vfmaddsub132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x96, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmaddsub132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x96, 0xf4 }, { vfmaddsub132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x96, 0xf4 }, { vfmaddsub132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x96, 0xf4 }, { vfmaddsub132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x96, 0xf4 }, { vfmaddsub132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x96, 0xf4 }, { vfmaddsub132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x96, 0xf4 }, { vfmaddsub132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x96, 0xf4 }, { vfmaddsub132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x96, 0x31 }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x96, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x96, 0x31 }, { vfmaddsub132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x96, 0x72, 0x7f }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x96, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x96, 0x72, 0x80 }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x96, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x96, 0x72, 0x7f }, { vfmaddsub132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x96, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmaddsub132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x96, 0x72, 0x80 }, { vfmaddsub132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x96, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmaddsub132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xa6, 0xf4 }, { vfmaddsub213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa6, 0x31 }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xa6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa6, 0x31 }, { vfmaddsub213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa6, 0x72, 0x7f }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa6, 0x72, 0x80 }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa6, 0x72, 0x7f }, { vfmaddsub213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa6, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmaddsub213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa6, 0x72, 0x80 }, { vfmaddsub213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa6, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmaddsub213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xa6, 0xf4 }, { vfmaddsub213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa6, 0x31 }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xa6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa6, 0x31 }, { vfmaddsub213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa6, 0x72, 0x7f }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa6, 0x72, 0x80 }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa6, 0x72, 0x7f }, { vfmaddsub213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa6, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmaddsub213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa6, 0x72, 0x80 }, { vfmaddsub213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa6, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmaddsub213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xb6, 0xf4 }, { vfmaddsub231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb6, 0x31 }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xb6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb6, 0x31 }, { vfmaddsub231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb6, 0x72, 0x7f }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb6, 0x72, 0x80 }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb6, 0x72, 0x7f }, { vfmaddsub231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb6, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmaddsub231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb6, 0x72, 0x80 }, { vfmaddsub231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb6, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmaddsub231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xb6, 0xf4 }, { vfmaddsub231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb6, 0x31 }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xb6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb6, 0x31 }, { vfmaddsub231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb6, 0x72, 0x7f }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb6, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb6, 0x72, 0x80 }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb6, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmaddsub231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb6, 0x72, 0x7f }, { vfmaddsub231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb6, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmaddsub231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb6, 0x72, 0x80 }, { vfmaddsub231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb6, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmaddsub231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x9a, 0xf4 }, { vfmsub132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x9a, 0xf4 }, { vfmsub132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x9a, 0xf4 }, { vfmsub132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x9a, 0xf4 }, { vfmsub132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x9a, 0xf4 }, { vfmsub132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x9a, 0xf4 }, { vfmsub132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x9a, 0xf4 }, { vfmsub132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9a, 0x31 }, { vfmsub132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x9a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9a, 0x31 }, { vfmsub132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9a, 0x72, 0x7f }, { vfmsub132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9a, 0x72, 0x80 }, { vfmsub132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9a, 0x72, 0x7f }, { vfmsub132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9a, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9a, 0x72, 0x80 }, { vfmsub132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9a, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x9a, 0xf4 }, { vfmsub132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x9a, 0xf4 }, { vfmsub132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x9a, 0xf4 }, { vfmsub132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x9a, 0xf4 }, { vfmsub132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x9a, 0xf4 }, { vfmsub132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x9a, 0xf4 }, { vfmsub132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x9a, 0xf4 }, { vfmsub132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9a, 0x31 }, { vfmsub132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x9a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9a, 0x31 }, { vfmsub132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9a, 0x72, 0x7f }, { vfmsub132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9a, 0x72, 0x80 }, { vfmsub132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9a, 0x72, 0x7f }, { vfmsub132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9a, 0x72, 0x80 }, { vfmsub132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0x9b, 0xf4 }, { vfmsub132sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9b, 0x31 }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x9b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9b, 0x72, 0x7f }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9b, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9b, 0x72, 0x80 }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9b, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub132sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0x9b, 0xf4 }, { vfmsub132ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9b, 0x31 }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x9b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9b, 0x72, 0x7f }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9b, 0x72, 0x80 }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub132ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xaa, 0xf4 }, { vfmsub213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xaa, 0xf4 }, { vfmsub213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xaa, 0xf4 }, { vfmsub213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xaa, 0xf4 }, { vfmsub213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xaa, 0xf4 }, { vfmsub213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xaa, 0xf4 }, { vfmsub213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xaa, 0xf4 }, { vfmsub213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xaa, 0x31 }, { vfmsub213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xaa, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xaa, 0x31 }, { vfmsub213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xaa, 0x72, 0x7f }, { vfmsub213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xaa, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xaa, 0x72, 0x80 }, { vfmsub213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xaa, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xaa, 0x72, 0x7f }, { vfmsub213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xaa, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xaa, 0x72, 0x80 }, { vfmsub213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xaa, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xaa, 0xf4 }, { vfmsub213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xaa, 0xf4 }, { vfmsub213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xaa, 0xf4 }, { vfmsub213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xaa, 0xf4 }, { vfmsub213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xaa, 0xf4 }, { vfmsub213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xaa, 0xf4 }, { vfmsub213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xaa, 0xf4 }, { vfmsub213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xaa, 0x31 }, { vfmsub213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xaa, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xaa, 0x31 }, { vfmsub213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xaa, 0x72, 0x7f }, { vfmsub213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xaa, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xaa, 0x72, 0x80 }, { vfmsub213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xaa, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xaa, 0x72, 0x7f }, { vfmsub213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xaa, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xaa, 0x72, 0x80 }, { vfmsub213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xaa, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xab, 0xf4 }, { vfmsub213sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xab, 0x31 }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xab, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xab, 0x72, 0x7f }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xab, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xab, 0x72, 0x80 }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xab, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub213sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xab, 0xf4 }, { vfmsub213ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xab, 0x31 }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xab, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xab, 0x72, 0x7f }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xab, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xab, 0x72, 0x80 }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xab, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub213ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xba, 0xf4 }, { vfmsub231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xba, 0xf4 }, { vfmsub231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xba, 0xf4 }, { vfmsub231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xba, 0xf4 }, { vfmsub231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xba, 0xf4 }, { vfmsub231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xba, 0xf4 }, { vfmsub231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xba, 0xf4 }, { vfmsub231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xba, 0x31 }, { vfmsub231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xba, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xba, 0x31 }, { vfmsub231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xba, 0x72, 0x7f }, { vfmsub231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xba, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xba, 0x72, 0x80 }, { vfmsub231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xba, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xba, 0x72, 0x7f }, { vfmsub231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xba, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xba, 0x72, 0x80 }, { vfmsub231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xba, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xba, 0xf4 }, { vfmsub231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xba, 0xf4 }, { vfmsub231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xba, 0xf4 }, { vfmsub231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xba, 0xf4 }, { vfmsub231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xba, 0xf4 }, { vfmsub231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xba, 0xf4 }, { vfmsub231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xba, 0xf4 }, { vfmsub231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xba, 0x31 }, { vfmsub231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xba, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xba, 0x31 }, { vfmsub231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xba, 0x72, 0x7f }, { vfmsub231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xba, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsub231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xba, 0x72, 0x80 }, { vfmsub231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xba, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsub231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xba, 0x72, 0x7f }, { vfmsub231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xba, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xba, 0x72, 0x80 }, { vfmsub231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xba, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xbb, 0xf4 }, { vfmsub231sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbb, 0x31 }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xbb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbb, 0x72, 0x7f }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbb, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbb, 0x72, 0x80 }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbb, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsub231sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xbb, 0xf4 }, { vfmsub231ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbb, 0x31 }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xbb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbb, 0x72, 0x7f }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbb, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbb, 0x72, 0x80 }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbb, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsub231ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x97, 0xf4 }, { vfmsubadd132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x97, 0xf4 }, { vfmsubadd132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x97, 0xf4 }, { vfmsubadd132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x97, 0xf4 }, { vfmsubadd132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x97, 0xf4 }, { vfmsubadd132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x97, 0xf4 }, { vfmsubadd132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x97, 0xf4 }, { vfmsubadd132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x97, 0x31 }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x97, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x97, 0x31 }, { vfmsubadd132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x97, 0x72, 0x7f }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x97, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x97, 0x72, 0x80 }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x97, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x97, 0x72, 0x7f }, { vfmsubadd132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x97, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsubadd132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x97, 0x72, 0x80 }, { vfmsubadd132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x97, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsubadd132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x97, 0xf4 }, { vfmsubadd132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x97, 0xf4 }, { vfmsubadd132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x97, 0xf4 }, { vfmsubadd132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x97, 0xf4 }, { vfmsubadd132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x97, 0xf4 }, { vfmsubadd132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x97, 0xf4 }, { vfmsubadd132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x97, 0xf4 }, { vfmsubadd132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x97, 0x31 }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x97, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x97, 0x31 }, { vfmsubadd132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x97, 0x72, 0x7f }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x97, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x97, 0x72, 0x80 }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x97, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x97, 0x72, 0x7f }, { vfmsubadd132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x97, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsubadd132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x97, 0x72, 0x80 }, { vfmsubadd132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x97, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsubadd132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xa7, 0xf4 }, { vfmsubadd213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa7, 0x31 }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xa7, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa7, 0x31 }, { vfmsubadd213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa7, 0x72, 0x7f }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa7, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa7, 0x72, 0x80 }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xa7, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa7, 0x72, 0x7f }, { vfmsubadd213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa7, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsubadd213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa7, 0x72, 0x80 }, { vfmsubadd213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xa7, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsubadd213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xa7, 0xf4 }, { vfmsubadd213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa7, 0x31 }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xa7, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa7, 0x31 }, { vfmsubadd213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa7, 0x72, 0x7f }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa7, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa7, 0x72, 0x80 }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xa7, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa7, 0x72, 0x7f }, { vfmsubadd213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa7, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsubadd213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa7, 0x72, 0x80 }, { vfmsubadd213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xa7, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsubadd213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xb7, 0xf4 }, { vfmsubadd231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb7, 0x31 }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xb7, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb7, 0x31 }, { vfmsubadd231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb7, 0x72, 0x7f }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb7, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb7, 0x72, 0x80 }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xb7, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb7, 0x72, 0x7f }, { vfmsubadd231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb7, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfmsubadd231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb7, 0x72, 0x80 }, { vfmsubadd231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xb7, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfmsubadd231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xb7, 0xf4 }, { vfmsubadd231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb7, 0x31 }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xb7, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb7, 0x31 }, { vfmsubadd231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb7, 0x72, 0x7f }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb7, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb7, 0x72, 0x80 }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xb7, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfmsubadd231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb7, 0x72, 0x7f }, { vfmsubadd231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb7, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfmsubadd231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb7, 0x72, 0x80 }, { vfmsubadd231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xb7, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfmsubadd231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x9c, 0xf4 }, { vfnmadd132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x9c, 0xf4 }, { vfnmadd132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x9c, 0xf4 }, { vfnmadd132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x9c, 0xf4 }, { vfnmadd132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x9c, 0xf4 }, { vfnmadd132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x9c, 0xf4 }, { vfnmadd132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x9c, 0xf4 }, { vfnmadd132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9c, 0x31 }, { vfnmadd132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x9c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9c, 0x31 }, { vfnmadd132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9c, 0x72, 0x7f }, { vfnmadd132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9c, 0x72, 0x80 }, { vfnmadd132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9c, 0x72, 0x7f }, { vfnmadd132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9c, 0x72, 0x80 }, { vfnmadd132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x9c, 0xf4 }, { vfnmadd132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x9c, 0xf4 }, { vfnmadd132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x9c, 0xf4 }, { vfnmadd132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x9c, 0xf4 }, { vfnmadd132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x9c, 0xf4 }, { vfnmadd132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x9c, 0xf4 }, { vfnmadd132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x9c, 0xf4 }, { vfnmadd132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9c, 0x31 }, { vfnmadd132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x9c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9c, 0x31 }, { vfnmadd132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9c, 0x72, 0x7f }, { vfnmadd132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9c, 0x72, 0x80 }, { vfnmadd132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9c, 0x72, 0x7f }, { vfnmadd132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9c, 0x72, 0x80 }, { vfnmadd132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0x9d, 0xf4 }, { vfnmadd132sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9d, 0x31 }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x9d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9d, 0x72, 0x7f }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9d, 0x72, 0x80 }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd132sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0x9d, 0xf4 }, { vfnmadd132ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9d, 0x31 }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x9d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9d, 0x72, 0x7f }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9d, 0x72, 0x80 }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd132ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xac, 0xf4 }, { vfnmadd213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xac, 0xf4 }, { vfnmadd213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xac, 0xf4 }, { vfnmadd213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xac, 0xf4 }, { vfnmadd213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xac, 0xf4 }, { vfnmadd213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xac, 0xf4 }, { vfnmadd213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xac, 0xf4 }, { vfnmadd213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xac, 0x31 }, { vfnmadd213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xac, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xac, 0x31 }, { vfnmadd213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xac, 0x72, 0x7f }, { vfnmadd213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xac, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xac, 0x72, 0x80 }, { vfnmadd213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xac, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xac, 0x72, 0x7f }, { vfnmadd213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xac, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xac, 0x72, 0x80 }, { vfnmadd213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xac, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xac, 0xf4 }, { vfnmadd213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xac, 0xf4 }, { vfnmadd213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xac, 0xf4 }, { vfnmadd213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xac, 0xf4 }, { vfnmadd213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xac, 0xf4 }, { vfnmadd213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xac, 0xf4 }, { vfnmadd213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xac, 0xf4 }, { vfnmadd213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xac, 0x31 }, { vfnmadd213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xac, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xac, 0x31 }, { vfnmadd213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xac, 0x72, 0x7f }, { vfnmadd213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xac, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xac, 0x72, 0x80 }, { vfnmadd213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xac, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xac, 0x72, 0x7f }, { vfnmadd213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xac, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xac, 0x72, 0x80 }, { vfnmadd213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xac, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xad, 0xf4 }, { vfnmadd213sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xad, 0x31 }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xad, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xad, 0x72, 0x7f }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xad, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xad, 0x72, 0x80 }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xad, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd213sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xad, 0xf4 }, { vfnmadd213ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xad, 0x31 }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xad, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xad, 0x72, 0x7f }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xad, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xad, 0x72, 0x80 }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xad, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd213ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xbc, 0xf4 }, { vfnmadd231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xbc, 0xf4 }, { vfnmadd231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xbc, 0xf4 }, { vfnmadd231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xbc, 0xf4 }, { vfnmadd231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xbc, 0xf4 }, { vfnmadd231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xbc, 0xf4 }, { vfnmadd231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xbc, 0xf4 }, { vfnmadd231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbc, 0x31 }, { vfnmadd231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xbc, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbc, 0x31 }, { vfnmadd231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbc, 0x72, 0x7f }, { vfnmadd231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbc, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbc, 0x72, 0x80 }, { vfnmadd231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbc, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbc, 0x72, 0x7f }, { vfnmadd231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbc, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbc, 0x72, 0x80 }, { vfnmadd231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbc, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xbc, 0xf4 }, { vfnmadd231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xbc, 0xf4 }, { vfnmadd231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xbc, 0xf4 }, { vfnmadd231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xbc, 0xf4 }, { vfnmadd231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xbc, 0xf4 }, { vfnmadd231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xbc, 0xf4 }, { vfnmadd231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xbc, 0xf4 }, { vfnmadd231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbc, 0x31 }, { vfnmadd231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xbc, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbc, 0x31 }, { vfnmadd231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbc, 0x72, 0x7f }, { vfnmadd231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbc, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmadd231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbc, 0x72, 0x80 }, { vfnmadd231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbc, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmadd231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbc, 0x72, 0x7f }, { vfnmadd231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbc, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbc, 0x72, 0x80 }, { vfnmadd231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbc, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xbd, 0xf4 }, { vfnmadd231sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbd, 0x31 }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xbd, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbd, 0x72, 0x7f }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbd, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbd, 0x72, 0x80 }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbd, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmadd231sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xbd, 0xf4 }, { vfnmadd231ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbd, 0x31 }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xbd, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbd, 0x72, 0x7f }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbd, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbd, 0x72, 0x80 }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbd, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmadd231ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x9e, 0xf4 }, { vfnmsub132pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x9e, 0xf4 }, { vfnmsub132pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x9e, 0xf4 }, { vfnmsub132pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x9e, 0xf4 }, { vfnmsub132pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x9e, 0xf4 }, { vfnmsub132pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x9e, 0xf4 }, { vfnmsub132pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x9e, 0xf4 }, { vfnmsub132pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9e, 0x31 }, { vfnmsub132pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x9e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub132pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9e, 0x31 }, { vfnmsub132pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9e, 0x72, 0x7f }, { vfnmsub132pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub132pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9e, 0x72, 0x80 }, { vfnmsub132pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x9e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub132pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9e, 0x72, 0x7f }, { vfnmsub132pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub132pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9e, 0x72, 0x80 }, { vfnmsub132pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x9e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub132pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x9e, 0xf4 }, { vfnmsub132ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x9e, 0xf4 }, { vfnmsub132ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x9e, 0xf4 }, { vfnmsub132ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x9e, 0xf4 }, { vfnmsub132ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x9e, 0xf4 }, { vfnmsub132ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x9e, 0xf4 }, { vfnmsub132ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x9e, 0xf4 }, { vfnmsub132ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9e, 0x31 }, { vfnmsub132ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x9e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub132ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9e, 0x31 }, { vfnmsub132ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9e, 0x72, 0x7f }, { vfnmsub132ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub132ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9e, 0x72, 0x80 }, { vfnmsub132ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x9e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub132ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9e, 0x72, 0x7f }, { vfnmsub132ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub132ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9e, 0x72, 0x80 }, { vfnmsub132ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x9e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub132ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0x9f, 0xf4 }, { vfnmsub132sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9f, 0x31 }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x9f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9f, 0x72, 0x7f }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9f, 0x72, 0x80 }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x9f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub132sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0x9f, 0xf4 }, { vfnmsub132ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9f, 0x31 }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x9f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9f, 0x72, 0x7f }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9f, 0x72, 0x80 }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x9f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub132ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xae, 0xf4 }, { vfnmsub213pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xae, 0xf4 }, { vfnmsub213pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xae, 0xf4 }, { vfnmsub213pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xae, 0xf4 }, { vfnmsub213pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xae, 0xf4 }, { vfnmsub213pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xae, 0xf4 }, { vfnmsub213pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xae, 0xf4 }, { vfnmsub213pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xae, 0x31 }, { vfnmsub213pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xae, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub213pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xae, 0x31 }, { vfnmsub213pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xae, 0x72, 0x7f }, { vfnmsub213pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xae, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub213pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xae, 0x72, 0x80 }, { vfnmsub213pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xae, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub213pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xae, 0x72, 0x7f }, { vfnmsub213pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xae, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub213pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xae, 0x72, 0x80 }, { vfnmsub213pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xae, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub213pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xae, 0xf4 }, { vfnmsub213ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xae, 0xf4 }, { vfnmsub213ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xae, 0xf4 }, { vfnmsub213ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xae, 0xf4 }, { vfnmsub213ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xae, 0xf4 }, { vfnmsub213ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xae, 0xf4 }, { vfnmsub213ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xae, 0xf4 }, { vfnmsub213ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xae, 0x31 }, { vfnmsub213ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xae, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub213ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xae, 0x31 }, { vfnmsub213ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xae, 0x72, 0x7f }, { vfnmsub213ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xae, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub213ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xae, 0x72, 0x80 }, { vfnmsub213ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xae, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub213ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xae, 0x72, 0x7f }, { vfnmsub213ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xae, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub213ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xae, 0x72, 0x80 }, { vfnmsub213ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xae, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub213ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xaf, 0xf4 }, { vfnmsub213sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xaf, 0x31 }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xaf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xaf, 0x72, 0x7f }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xaf, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xaf, 0x72, 0x80 }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xaf, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub213sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xaf, 0xf4 }, { vfnmsub213ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xaf, 0x31 }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xaf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xaf, 0x72, 0x7f }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xaf, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xaf, 0x72, 0x80 }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xaf, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub213ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0xbe, 0xf4 }, { vfnmsub231pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0xbe, 0xf4 }, { vfnmsub231pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0xbe, 0xf4 }, { vfnmsub231pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0xbe, 0xf4 }, { vfnmsub231pd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0xbe, 0xf4 }, { vfnmsub231pd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0xbe, 0xf4 }, { vfnmsub231pd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0xbe, 0xf4 }, { vfnmsub231pd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbe, 0x31 }, { vfnmsub231pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0xbe, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub231pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbe, 0x31 }, { vfnmsub231pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbe, 0x72, 0x7f }, { vfnmsub231pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbe, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub231pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbe, 0x72, 0x80 }, { vfnmsub231pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0xbe, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub231pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbe, 0x72, 0x7f }, { vfnmsub231pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbe, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub231pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbe, 0x72, 0x80 }, { vfnmsub231pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0xbe, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub231pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0xbe, 0xf4 }, { vfnmsub231ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0xbe, 0xf4 }, { vfnmsub231ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0xbe, 0xf4 }, { vfnmsub231ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0xbe, 0xf4 }, { vfnmsub231ps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0xbe, 0xf4 }, { vfnmsub231ps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0xbe, 0xf4 }, { vfnmsub231ps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0xbe, 0xf4 }, { vfnmsub231ps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbe, 0x31 }, { vfnmsub231ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0xbe, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub231ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbe, 0x31 }, { vfnmsub231ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbe, 0x72, 0x7f }, { vfnmsub231ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbe, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vfnmsub231ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbe, 0x72, 0x80 }, { vfnmsub231ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0xbe, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vfnmsub231ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbe, 0x72, 0x7f }, { vfnmsub231ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbe, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub231ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbe, 0x72, 0x80 }, { vfnmsub231ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0xbe, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub231ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0xbf, 0xf4 }, { vfnmsub231sd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbf, 0x31 }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0xbf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbf, 0x72, 0x7f }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbf, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbf, 0x72, 0x80 }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0xbf, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vfnmsub231sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0xbf, 0xf4 }, { vfnmsub231ss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbf, 0x31 }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0xbf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbf, 0x72, 0x7f }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbf, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbf, 0x72, 0x80 }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0xbf, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vfnmsub231ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x92, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherdpd zmm30{k1}, [r14+ymm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x92, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherdpd zmm30{k1}, [r14+ymm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x92, 0x74, 0x39, 0x20 }, { vgatherdpd zmm30{k1}, [r9+ymm31*1+0x100] }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0x92, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherdpd zmm30{k1}, [rcx+ymm31*4+0x400] }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x92, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherdps zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x92, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherdps zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x92, 0x74, 0x39, 0x40 }, { vgatherdps zmm30{k1}, [r9+zmm31*1+0x100] }
+testcase { 0x62, 0x22, 0x7d, 0x41, 0x92, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherdps zmm30{k1}, [rcx+zmm31*4+0x400] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x93, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherqpd zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x93, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherqpd zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x93, 0x74, 0x39, 0x20 }, { vgatherqpd zmm30{k1}, [r9+zmm31*1+0x100] }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0x93, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherqpd zmm30{k1}, [rcx+zmm31*4+0x400] }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x42, 0xf5 }, { vgetexppd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x42, 0xf5 }, { vgetexppd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x42, 0xf5 }, { vgetexppd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x18, 0x42, 0xf5 }, { vgetexppd zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x42, 0x31 }, { vgetexppd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x42, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vgetexppd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x42, 0x31 }, { vgetexppd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x42, 0x72, 0x7f }, { vgetexppd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x42, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vgetexppd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x42, 0x72, 0x80 }, { vgetexppd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x42, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vgetexppd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x42, 0x72, 0x7f }, { vgetexppd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x42, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vgetexppd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x42, 0x72, 0x80 }, { vgetexppd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x42, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vgetexppd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x42, 0xf5 }, { vgetexpps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x42, 0xf5 }, { vgetexpps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x42, 0xf5 }, { vgetexpps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x18, 0x42, 0xf5 }, { vgetexpps zmm30,zmm29,{sae} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x42, 0x31 }, { vgetexpps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x42, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vgetexpps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x42, 0x31 }, { vgetexpps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x42, 0x72, 0x7f }, { vgetexpps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x42, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vgetexpps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x42, 0x72, 0x80 }, { vgetexpps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x42, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vgetexpps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x42, 0x72, 0x7f }, { vgetexpps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x42, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vgetexpps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x42, 0x72, 0x80 }, { vgetexpps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x42, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vgetexpps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x43, 0xf4 }, { vgetexpsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x43, 0xf4 }, { vgetexpsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x43, 0xf4 }, { vgetexpsd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x43, 0x31 }, { vgetexpsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x43, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vgetexpsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x43, 0x72, 0x7f }, { vgetexpsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x43, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vgetexpsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x43, 0x72, 0x80 }, { vgetexpsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x43, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vgetexpsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x43, 0xf4 }, { vgetexpss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x43, 0xf4 }, { vgetexpss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x43, 0xf4 }, { vgetexpss xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x43, 0x31 }, { vgetexpss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x43, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vgetexpss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x43, 0x72, 0x7f }, { vgetexpss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x43, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vgetexpss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x43, 0x72, 0x80 }, { vgetexpss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x43, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vgetexpss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x26, 0xf5, 0xab }, { vgetmantpd zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x26, 0xf5, 0xab }, { vgetmantpd zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x26, 0xf5, 0xab }, { vgetmantpd zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x18, 0x26, 0xf5, 0xab }, { vgetmantpd zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x26, 0xf5, 0x7b }, { vgetmantpd zmm30,zmm29,0x7b }
+testcase { 0x62, 0x03, 0xfd, 0x18, 0x26, 0xf5, 0x7b }, { vgetmantpd zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x26, 0x31, 0x7b }, { vgetmantpd zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x26, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vgetmantpd zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x26, 0x31, 0x7b }, { vgetmantpd zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x26, 0x72, 0x7f, 0x7b }, { vgetmantpd zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x26, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vgetmantpd zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x26, 0x72, 0x80, 0x7b }, { vgetmantpd zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x26, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vgetmantpd zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x26, 0x72, 0x7f, 0x7b }, { vgetmantpd zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x26, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vgetmantpd zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x26, 0x72, 0x80, 0x7b }, { vgetmantpd zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x26, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vgetmantpd zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x26, 0xf5, 0xab }, { vgetmantps zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x26, 0xf5, 0xab }, { vgetmantps zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x26, 0xf5, 0xab }, { vgetmantps zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x18, 0x26, 0xf5, 0xab }, { vgetmantps zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x26, 0xf5, 0x7b }, { vgetmantps zmm30,zmm29,0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x18, 0x26, 0xf5, 0x7b }, { vgetmantps zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x26, 0x31, 0x7b }, { vgetmantps zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x26, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vgetmantps zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x26, 0x31, 0x7b }, { vgetmantps zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x26, 0x72, 0x7f, 0x7b }, { vgetmantps zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x26, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vgetmantps zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x26, 0x72, 0x80, 0x7b }, { vgetmantps zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x26, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vgetmantps zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x26, 0x72, 0x7f, 0x7b }, { vgetmantps zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x26, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vgetmantps zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x26, 0x72, 0x80, 0x7b }, { vgetmantps zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x26, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vgetmantps zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x27, 0xf4, 0xab }, { vgetmantsd xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x87, 0x27, 0xf4, 0xab }, { vgetmantsd xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x27, 0xf4, 0xab }, { vgetmantsd xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x27, 0xf4, 0x7b }, { vgetmantsd xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x27, 0xf4, 0x7b }, { vgetmantsd xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x27, 0x31, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x07, 0x27, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x27, 0x72, 0x7f, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rdx+0x3f8],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x27, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rdx+0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x27, 0x72, 0x80, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rdx-0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x27, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vgetmantsd xmm30{k7},xmm29,QWORD [rdx-0x408],0x7b }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x27, 0xf4, 0xab }, { vgetmantss xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x87, 0x27, 0xf4, 0xab }, { vgetmantss xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x27, 0xf4, 0xab }, { vgetmantss xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x27, 0xf4, 0x7b }, { vgetmantss xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x27, 0xf4, 0x7b }, { vgetmantss xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x27, 0x31, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x07, 0x27, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x27, 0x72, 0x7f, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rdx+0x1fc],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x27, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rdx+0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x27, 0x72, 0x80, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rdx-0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x27, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vgetmantss xmm30{k7},xmm29,DWORD [rdx-0x204],0x7b }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x18, 0xf4, 0xab }, { vinsertf32x4 zmm30{k7},zmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x18, 0xf4, 0xab }, { vinsertf32x4 zmm30{k7}{z},zmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x18, 0xf4, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,xmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x18, 0x31, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x47, 0x18, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x18, 0x72, 0x7f, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rdx+0x7f0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x18, 0xb2, 0x00, 0x08, 0x00, 0x00, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rdx+0x800],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x18, 0x72, 0x80, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rdx-0x800],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x18, 0xb2, 0xf0, 0xf7, 0xff, 0xff, 0x7b }, { vinsertf32x4 zmm30{k7},zmm29,OWORD [rdx-0x810],0x7b }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x1a, 0xf4, 0xab }, { vinsertf64x4 zmm30{k7},zmm29,ymm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x1a, 0xf4, 0xab }, { vinsertf64x4 zmm30{k7}{z},zmm29,ymm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x1a, 0xf4, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,ymm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x1a, 0x31, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x47, 0x1a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x1a, 0x72, 0x7f, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rdx+0xfe0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x1a, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rdx+0x1000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x1a, 0x72, 0x80, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rdx-0x1000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x1a, 0xb2, 0xe0, 0xef, 0xff, 0xff, 0x7b }, { vinsertf64x4 zmm30{k7},zmm29,YWORD [rdx-0x1020],0x7b }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x38, 0xf4, 0xab }, { vinserti32x4 zmm30{k7},zmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x38, 0xf4, 0xab }, { vinserti32x4 zmm30{k7}{z},zmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x38, 0xf4, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,xmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x38, 0x31, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x47, 0x38, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x38, 0x72, 0x7f, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rdx+0x7f0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x38, 0xb2, 0x00, 0x08, 0x00, 0x00, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rdx+0x800],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x38, 0x72, 0x80, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rdx-0x800],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x47, 0x38, 0xb2, 0xf0, 0xf7, 0xff, 0xff, 0x7b }, { vinserti32x4 zmm30{k7},zmm29,OWORD [rdx-0x810],0x7b }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x3a, 0xf4, 0xab }, { vinserti64x4 zmm30{k7},zmm29,ymm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x3a, 0xf4, 0xab }, { vinserti64x4 zmm30{k7}{z},zmm29,ymm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x3a, 0xf4, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,ymm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x3a, 0x31, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x47, 0x3a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x3a, 0x72, 0x7f, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rdx+0xfe0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x3a, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rdx+0x1000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x3a, 0x72, 0x80, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rdx-0x1000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x47, 0x3a, 0xb2, 0xe0, 0xef, 0xff, 0xff, 0x7b }, { vinserti64x4 zmm30{k7},zmm29,YWORD [rdx-0x1020],0x7b }
+testcase { 0x62, 0x03, 0x15, 0x00, 0x21, 0xf4, 0xab }, { vinsertps xmm30,xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x00, 0x21, 0xf4, 0x7b }, { vinsertps xmm30,xmm29,xmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x00, 0x21, 0x31, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x00, 0x21, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x00, 0x21, 0x72, 0x7f, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rdx+0x1fc],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x00, 0x21, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rdx+0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x00, 0x21, 0x72, 0x80, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rdx-0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x00, 0x21, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vinsertps xmm30,xmm29,DWORD [rdx-0x204],0x7b }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x5f, 0xf4 }, { vmaxpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x5f, 0xf4 }, { vmaxpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x5f, 0xf4 }, { vmaxpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x5f, 0xf4 }, { vmaxpd zmm30,zmm29,zmm28,{sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5f, 0x31 }, { vmaxpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x5f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmaxpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5f, 0x31 }, { vmaxpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5f, 0x72, 0x7f }, { vmaxpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmaxpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5f, 0x72, 0x80 }, { vmaxpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmaxpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5f, 0x72, 0x7f }, { vmaxpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmaxpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5f, 0x72, 0x80 }, { vmaxpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmaxpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x5f, 0xf4 }, { vmaxps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x5f, 0xf4 }, { vmaxps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x5f, 0xf4 }, { vmaxps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x5f, 0xf4 }, { vmaxps zmm30,zmm29,zmm28,{sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5f, 0x31 }, { vmaxps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x5f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmaxps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5f, 0x31 }, { vmaxps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5f, 0x72, 0x7f }, { vmaxps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmaxps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5f, 0x72, 0x80 }, { vmaxps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmaxps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5f, 0x72, 0x7f }, { vmaxps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmaxps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5f, 0x72, 0x80 }, { vmaxps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmaxps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x5f, 0xf4 }, { vmaxsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x5f, 0xf4 }, { vmaxsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x5f, 0xf4 }, { vmaxsd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5f, 0x31 }, { vmaxsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x5f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmaxsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5f, 0x72, 0x7f }, { vmaxsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmaxsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5f, 0x72, 0x80 }, { vmaxsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmaxsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x5f, 0xf4 }, { vmaxss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x5f, 0xf4 }, { vmaxss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x5f, 0xf4 }, { vmaxss xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5f, 0x31 }, { vmaxss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x5f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmaxss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5f, 0x72, 0x7f }, { vmaxss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmaxss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5f, 0x72, 0x80 }, { vmaxss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmaxss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x5d, 0xf4 }, { vminpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x5d, 0xf4 }, { vminpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x5d, 0xf4 }, { vminpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x5d, 0xf4 }, { vminpd zmm30,zmm29,zmm28,{sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5d, 0x31 }, { vminpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x5d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vminpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5d, 0x31 }, { vminpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5d, 0x72, 0x7f }, { vminpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vminpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5d, 0x72, 0x80 }, { vminpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vminpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5d, 0x72, 0x7f }, { vminpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vminpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5d, 0x72, 0x80 }, { vminpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vminpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x5d, 0xf4 }, { vminps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x5d, 0xf4 }, { vminps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x5d, 0xf4 }, { vminps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x5d, 0xf4 }, { vminps zmm30,zmm29,zmm28,{sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5d, 0x31 }, { vminps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x5d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vminps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5d, 0x31 }, { vminps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5d, 0x72, 0x7f }, { vminps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vminps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5d, 0x72, 0x80 }, { vminps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vminps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5d, 0x72, 0x7f }, { vminps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vminps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5d, 0x72, 0x80 }, { vminps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vminps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x5d, 0xf4 }, { vminsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x5d, 0xf4 }, { vminsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x5d, 0xf4 }, { vminsd xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5d, 0x31 }, { vminsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x5d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vminsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5d, 0x72, 0x7f }, { vminsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vminsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5d, 0x72, 0x80 }, { vminsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vminsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x5d, 0xf4 }, { vminss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x5d, 0xf4 }, { vminss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x5d, 0xf4 }, { vminss xmm30{k7},xmm29,xmm28,{sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5d, 0x31 }, { vminss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x5d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vminss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5d, 0x72, 0x7f }, { vminss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vminss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5d, 0x72, 0x80 }, { vminss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vminss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0xfd, 0x48, 0x28, 0xf5 }, { vmovapd zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0x28, 0xf5 }, { vmovapd zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0x28, 0xf5 }, { vmovapd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x28, 0x31 }, { vmovapd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x28, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovapd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x28, 0x72, 0x7f }, { vmovapd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x28, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovapd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x28, 0x72, 0x80 }, { vmovapd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x28, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovapd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x28, 0xf5 }, { vmovaps zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x28, 0xf5 }, { vmovaps zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x28, 0xf5 }, { vmovaps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x28, 0x31 }, { vmovaps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x28, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovaps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x28, 0x72, 0x7f }, { vmovaps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x28, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovaps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x28, 0x72, 0x80 }, { vmovaps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x28, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovaps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0xf0 }, { vmovd xmm30,eax }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0xf5 }, { vmovd xmm30,ebp }
+testcase { 0x62, 0x41, 0x7d, 0x08, 0x6e, 0xf5 }, { vmovd xmm30,r13d }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0x31 }, { vmovd xmm30,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x7d, 0x08, 0x6e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovd xmm30,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0x72, 0x7f }, { vmovd xmm30,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmovd xmm30,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0x72, 0x80 }, { vmovd xmm30,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x6e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmovd xmm30,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x7e, 0x31 }, { vmovd DWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0x7d, 0x08, 0x7e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovd DWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x7e, 0x72, 0x7f }, { vmovd DWORD [rdx+0x1fc],xmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x7e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmovd DWORD [rdx+0x200],xmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x7e, 0x72, 0x80 }, { vmovd DWORD [rdx-0x200],xmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x08, 0x7e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmovd DWORD [rdx-0x204],xmm30 }
+testcase { 0x62, 0x01, 0xff, 0x48, 0x12, 0xf5 }, { vmovddup zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xff, 0x4f, 0x12, 0xf5 }, { vmovddup zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xff, 0xcf, 0x12, 0xf5 }, { vmovddup zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0xff, 0x48, 0x12, 0x31 }, { vmovddup zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xff, 0x48, 0x12, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovddup zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xff, 0x48, 0x12, 0x72, 0x7f }, { vmovddup zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xff, 0x48, 0x12, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovddup zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xff, 0x48, 0x12, 0x72, 0x80 }, { vmovddup zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xff, 0x48, 0x12, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovddup zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x7d, 0x48, 0x6f, 0xf5 }, { vmovdqa32 zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7d, 0x4f, 0x6f, 0xf5 }, { vmovdqa32 zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7d, 0xcf, 0x6f, 0xf5 }, { vmovdqa32 zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x6f, 0x31 }, { vmovdqa32 zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7d, 0x48, 0x6f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqa32 zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x6f, 0x72, 0x7f }, { vmovdqa32 zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x6f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqa32 zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x6f, 0x72, 0x80 }, { vmovdqa32 zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x6f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqa32 zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0xfd, 0x48, 0x6f, 0xf5 }, { vmovdqa64 zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0x6f, 0xf5 }, { vmovdqa64 zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0x6f, 0xf5 }, { vmovdqa64 zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x6f, 0x31 }, { vmovdqa64 zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x6f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqa64 zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x6f, 0x72, 0x7f }, { vmovdqa64 zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x6f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqa64 zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x6f, 0x72, 0x80 }, { vmovdqa64 zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x6f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqa64 zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x7e, 0x48, 0x6f, 0xf5 }, { vmovdqu32 zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0x6f, 0xf5 }, { vmovdqu32 zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0x6f, 0xf5 }, { vmovdqu32 zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x6f, 0x31 }, { vmovdqu32 zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x48, 0x6f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqu32 zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x6f, 0x72, 0x7f }, { vmovdqu32 zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x6f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqu32 zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x6f, 0x72, 0x80 }, { vmovdqu32 zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x6f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqu32 zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0xfe, 0x48, 0x6f, 0xf5 }, { vmovdqu64 zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xfe, 0x4f, 0x6f, 0xf5 }, { vmovdqu64 zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfe, 0xcf, 0x6f, 0xf5 }, { vmovdqu64 zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x6f, 0x31 }, { vmovdqu64 zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfe, 0x48, 0x6f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqu64 zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x6f, 0x72, 0x7f }, { vmovdqu64 zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x6f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqu64 zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x6f, 0x72, 0x80 }, { vmovdqu64 zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x6f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqu64 zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x14, 0x00, 0x12, 0xf4 }, { vmovhlps xmm30,xmm29,xmm28 }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x16, 0x29 }, { vmovhpd xmm29,xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x8d, 0x00, 0x16, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovhpd xmm29,xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x16, 0x6a, 0x7f }, { vmovhpd xmm29,xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x16, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vmovhpd xmm29,xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x16, 0x6a, 0x80 }, { vmovhpd xmm29,xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x16, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vmovhpd xmm29,xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x17, 0x31 }, { vmovhpd QWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x17, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovhpd QWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x17, 0x72, 0x7f }, { vmovhpd QWORD [rdx+0x3f8],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x17, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovhpd QWORD [rdx+0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x17, 0x72, 0x80 }, { vmovhpd QWORD [rdx-0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x17, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovhpd QWORD [rdx-0x408],xmm30 }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x16, 0x29 }, { vmovhps xmm29,xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x0c, 0x00, 0x16, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovhps xmm29,xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x16, 0x6a, 0x7f }, { vmovhps xmm29,xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x16, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vmovhps xmm29,xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x16, 0x6a, 0x80 }, { vmovhps xmm29,xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x16, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vmovhps xmm29,xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x17, 0x31 }, { vmovhps QWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0x7c, 0x08, 0x17, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovhps QWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x17, 0x72, 0x7f }, { vmovhps QWORD [rdx+0x3f8],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x17, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovhps QWORD [rdx+0x400],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x17, 0x72, 0x80 }, { vmovhps QWORD [rdx-0x400],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x17, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovhps QWORD [rdx-0x408],xmm30 }
+testcase { 0x62, 0x01, 0x14, 0x00, 0x16, 0xf4 }, { vmovlhps xmm30,xmm29,xmm28 }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x12, 0x29 }, { vmovlpd xmm29,xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x8d, 0x00, 0x12, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovlpd xmm29,xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x12, 0x6a, 0x7f }, { vmovlpd xmm29,xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x12, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vmovlpd xmm29,xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x12, 0x6a, 0x80 }, { vmovlpd xmm29,xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x8d, 0x00, 0x12, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vmovlpd xmm29,xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x13, 0x31 }, { vmovlpd QWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x13, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovlpd QWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x13, 0x72, 0x7f }, { vmovlpd QWORD [rdx+0x3f8],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x13, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovlpd QWORD [rdx+0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x13, 0x72, 0x80 }, { vmovlpd QWORD [rdx-0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x13, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovlpd QWORD [rdx-0x408],xmm30 }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x12, 0x29 }, { vmovlps xmm29,xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x0c, 0x00, 0x12, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovlps xmm29,xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x12, 0x6a, 0x7f }, { vmovlps xmm29,xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x12, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vmovlps xmm29,xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x12, 0x6a, 0x80 }, { vmovlps xmm29,xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x0c, 0x00, 0x12, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vmovlps xmm29,xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x13, 0x31 }, { vmovlps QWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0x7c, 0x08, 0x13, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovlps QWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x13, 0x72, 0x7f }, { vmovlps QWORD [rdx+0x3f8],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x13, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovlps QWORD [rdx+0x400],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x13, 0x72, 0x80 }, { vmovlps QWORD [rdx-0x400],xmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x13, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovlps QWORD [rdx-0x408],xmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0xe7, 0x31 }, { vmovntdq ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x21, 0x7d, 0x48, 0xe7, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovntdq ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0xe7, 0x72, 0x7f }, { vmovntdq ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0xe7, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovntdq ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0xe7, 0x72, 0x80 }, { vmovntdq ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0xe7, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovntdq ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x2a, 0x31 }, { vmovntdqa zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x2a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovntdqa zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x2a, 0x72, 0x7f }, { vmovntdqa zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x2a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovntdqa zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x2a, 0x72, 0x80 }, { vmovntdqa zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x2a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovntdqa zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x2b, 0x31 }, { vmovntpd ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x2b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovntpd ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x2b, 0x72, 0x7f }, { vmovntpd ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x2b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovntpd ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x2b, 0x72, 0x80 }, { vmovntpd ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x2b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovntpd ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x2b, 0x31 }, { vmovntps ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x2b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovntps ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x2b, 0x72, 0x7f }, { vmovntps ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x2b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovntps ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x2b, 0x72, 0x80 }, { vmovntps ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x2b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovntps ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0xf0 }, { vmovq xmm30,rax }
+testcase { 0x62, 0x41, 0xfd, 0x08, 0x6e, 0xf0 }, { vmovq xmm30,r8 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x31 }, { vmovq xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x6e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovq xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x72, 0x7f }, { vmovq xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovq xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x72, 0x80 }, { vmovq xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovq xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x31 }, { vmovq QWORD [rcx],xmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x7e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovq QWORD [rax+r14*8+0x123],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x72, 0x7f }, { vmovq QWORD [rdx+0x3f8],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovq QWORD [rdx+0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x72, 0x80 }, { vmovq QWORD [rdx-0x400],xmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovq QWORD [rdx-0x408],xmm30 }
+testcase { 0x62, 0x01, 0xfe, 0x08, 0x7e, 0xf5 }, { vmovq xmm30,xmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x31 }, { vmovq xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x6e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovq xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x72, 0x7f }, { vmovq xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovq xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0x72, 0x80 }, { vmovq xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x6e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovq xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x29 }, { vmovq QWORD [rcx],xmm29 }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x7e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovq QWORD [rax+r14*8+0x123],xmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x6a, 0x7f }, { vmovq QWORD [rdx+0x3f8],xmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vmovq QWORD [rdx+0x400],xmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0x6a, 0x80 }, { vmovq QWORD [rdx-0x400],xmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x7e, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vmovq QWORD [rdx-0x408],xmm29 }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x10, 0x31 }, { vmovsd xmm30{k7},QWORD [rcx] }
+testcase { 0x62, 0x61, 0xff, 0x8f, 0x10, 0x31 }, { vmovsd xmm30{k7}{z},QWORD [rcx] }
+testcase { 0x62, 0x21, 0xff, 0x0f, 0x10, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovsd xmm30{k7},QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x10, 0x72, 0x7f }, { vmovsd xmm30{k7},QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x10, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovsd xmm30{k7},QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x10, 0x72, 0x80 }, { vmovsd xmm30{k7},QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x10, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovsd xmm30{k7},QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x11, 0x31 }, { vmovsd QWORD [rcx]{k7},xmm30 }
+testcase { 0x62, 0x21, 0xff, 0x0f, 0x11, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovsd QWORD [rax+r14*8+0x123]{k7},xmm30 }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x11, 0x72, 0x7f }, { vmovsd QWORD [rdx+0x3f8]{k7},xmm30 }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x11, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmovsd QWORD [rdx+0x400]{k7},xmm30 }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x11, 0x72, 0x80 }, { vmovsd QWORD [rdx-0x400]{k7},xmm30 }
+testcase { 0x62, 0x61, 0xff, 0x0f, 0x11, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmovsd QWORD [rdx-0x408]{k7},xmm30 }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x10, 0xf4 }, { vmovsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x10, 0xf4 }, { vmovsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x7e, 0x48, 0x16, 0xf5 }, { vmovshdup zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0x16, 0xf5 }, { vmovshdup zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0x16, 0xf5 }, { vmovshdup zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x16, 0x31 }, { vmovshdup zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x48, 0x16, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovshdup zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x16, 0x72, 0x7f }, { vmovshdup zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x16, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovshdup zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x16, 0x72, 0x80 }, { vmovshdup zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x16, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovshdup zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x7e, 0x48, 0x12, 0xf5 }, { vmovsldup zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0x4f, 0x12, 0xf5 }, { vmovsldup zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7e, 0xcf, 0x12, 0xf5 }, { vmovsldup zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x12, 0x31 }, { vmovsldup zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x48, 0x12, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovsldup zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x12, 0x72, 0x7f }, { vmovsldup zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x12, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovsldup zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x12, 0x72, 0x80 }, { vmovsldup zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x12, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovsldup zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x10, 0x31 }, { vmovss xmm30{k7},DWORD [rcx] }
+testcase { 0x62, 0x61, 0x7e, 0x8f, 0x10, 0x31 }, { vmovss xmm30{k7}{z},DWORD [rcx] }
+testcase { 0x62, 0x21, 0x7e, 0x0f, 0x10, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovss xmm30{k7},DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x10, 0x72, 0x7f }, { vmovss xmm30{k7},DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x10, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmovss xmm30{k7},DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x10, 0x72, 0x80 }, { vmovss xmm30{k7},DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x10, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmovss xmm30{k7},DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x11, 0x31 }, { vmovss DWORD [rcx]{k7},xmm30 }
+testcase { 0x62, 0x21, 0x7e, 0x0f, 0x11, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovss DWORD [rax+r14*8+0x123]{k7},xmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x11, 0x72, 0x7f }, { vmovss DWORD [rdx+0x1fc]{k7},xmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x11, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmovss DWORD [rdx+0x200]{k7},xmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x11, 0x72, 0x80 }, { vmovss DWORD [rdx-0x200]{k7},xmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x0f, 0x11, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmovss DWORD [rdx-0x204]{k7},xmm30 }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x10, 0xf4 }, { vmovss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x10, 0xf4 }, { vmovss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0xfd, 0x48, 0x10, 0xf5 }, { vmovupd zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0x10, 0xf5 }, { vmovupd zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0x10, 0xf5 }, { vmovupd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x10, 0x31 }, { vmovupd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x10, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovupd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x10, 0x72, 0x7f }, { vmovupd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x10, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovupd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x10, 0x72, 0x80 }, { vmovupd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x10, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovupd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x10, 0xf5 }, { vmovups zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x10, 0xf5 }, { vmovups zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x10, 0xf5 }, { vmovups zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x10, 0x31 }, { vmovups zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x10, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovups zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x10, 0x72, 0x7f }, { vmovups zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x10, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovups zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x10, 0x72, 0x80 }, { vmovups zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x10, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovups zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x59, 0xf4 }, { vmulpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x59, 0xf4 }, { vmulpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x59, 0xf4 }, { vmulpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x59, 0xf4 }, { vmulpd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x95, 0x50, 0x59, 0xf4 }, { vmulpd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x95, 0x30, 0x59, 0xf4 }, { vmulpd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x95, 0x70, 0x59, 0xf4 }, { vmulpd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x59, 0x31 }, { vmulpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x59, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmulpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x59, 0x31 }, { vmulpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x59, 0x72, 0x7f }, { vmulpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x59, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmulpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x59, 0x72, 0x80 }, { vmulpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x59, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmulpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x59, 0x72, 0x7f }, { vmulpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x59, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmulpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x59, 0x72, 0x80 }, { vmulpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x59, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmulpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x59, 0xf4 }, { vmulps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x59, 0xf4 }, { vmulps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x59, 0xf4 }, { vmulps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x59, 0xf4 }, { vmulps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x14, 0x50, 0x59, 0xf4 }, { vmulps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x14, 0x30, 0x59, 0xf4 }, { vmulps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x14, 0x70, 0x59, 0xf4 }, { vmulps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x59, 0x31 }, { vmulps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x59, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmulps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x59, 0x31 }, { vmulps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x59, 0x72, 0x7f }, { vmulps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x59, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmulps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x59, 0x72, 0x80 }, { vmulps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x59, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmulps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x59, 0x72, 0x7f }, { vmulps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x59, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmulps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x59, 0x72, 0x80 }, { vmulps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x59, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmulps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x59, 0xf4 }, { vmulsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x59, 0xf4 }, { vmulsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x59, 0xf4 }, { vmulsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x59, 0xf4 }, { vmulsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x59, 0xf4 }, { vmulsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x59, 0xf4 }, { vmulsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x59, 0x31 }, { vmulsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x59, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmulsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x59, 0x72, 0x7f }, { vmulsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x59, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vmulsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x59, 0x72, 0x80 }, { vmulsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x59, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vmulsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x59, 0xf4 }, { vmulss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x59, 0xf4 }, { vmulss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x59, 0xf4 }, { vmulss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x16, 0x57, 0x59, 0xf4 }, { vmulss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x16, 0x37, 0x59, 0xf4 }, { vmulss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x16, 0x77, 0x59, 0xf4 }, { vmulss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x59, 0x31 }, { vmulss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x59, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmulss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x59, 0x72, 0x7f }, { vmulss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x59, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vmulss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x59, 0x72, 0x80 }, { vmulss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x59, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vmulss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x1e, 0xf5 }, { vpabsd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x1e, 0xf5 }, { vpabsd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x1e, 0xf5 }, { vpabsd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1e, 0x31 }, { vpabsd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x1e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpabsd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x1e, 0x31 }, { vpabsd zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1e, 0x72, 0x7f }, { vpabsd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpabsd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1e, 0x72, 0x80 }, { vpabsd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x1e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpabsd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x1e, 0x72, 0x7f }, { vpabsd zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x1e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpabsd zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x1e, 0x72, 0x80 }, { vpabsd zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x1e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpabsd zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x1f, 0xf5 }, { vpabsq zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x1f, 0xf5 }, { vpabsq zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x1f, 0xf5 }, { vpabsq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1f, 0x31 }, { vpabsq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x1f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpabsq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x1f, 0x31 }, { vpabsq zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1f, 0x72, 0x7f }, { vpabsq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpabsq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1f, 0x72, 0x80 }, { vpabsq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x1f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpabsq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x1f, 0x72, 0x7f }, { vpabsq zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x1f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpabsq zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x1f, 0x72, 0x80 }, { vpabsq zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x1f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpabsq zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xfe, 0xf4 }, { vpaddd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xfe, 0xf4 }, { vpaddd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xfe, 0xf4 }, { vpaddd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfe, 0x31 }, { vpaddd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xfe, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpaddd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfe, 0x31 }, { vpaddd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfe, 0x72, 0x7f }, { vpaddd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfe, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpaddd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfe, 0x72, 0x80 }, { vpaddd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfe, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpaddd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfe, 0x72, 0x7f }, { vpaddd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfe, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpaddd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfe, 0x72, 0x80 }, { vpaddd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfe, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpaddd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xd4, 0xf4 }, { vpaddq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xd4, 0xf4 }, { vpaddq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xd4, 0xf4 }, { vpaddq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xd4, 0x31 }, { vpaddq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xd4, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpaddq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xd4, 0x31 }, { vpaddq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xd4, 0x72, 0x7f }, { vpaddq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xd4, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpaddq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xd4, 0x72, 0x80 }, { vpaddq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xd4, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpaddq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xd4, 0x72, 0x7f }, { vpaddq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xd4, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpaddq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xd4, 0x72, 0x80 }, { vpaddq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xd4, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpaddq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xdb, 0xf4 }, { vpandd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xdb, 0xf4 }, { vpandd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xdb, 0xf4 }, { vpandd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdb, 0x31 }, { vpandd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xdb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpandd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdb, 0x31 }, { vpandd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdb, 0x72, 0x7f }, { vpandd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdb, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpandd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdb, 0x72, 0x80 }, { vpandd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdb, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpandd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdb, 0x72, 0x7f }, { vpandd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdb, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpandd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdb, 0x72, 0x80 }, { vpandd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdb, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpandd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xdf, 0xf4 }, { vpandnd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xdf, 0xf4 }, { vpandnd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xdf, 0xf4 }, { vpandnd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdf, 0x31 }, { vpandnd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xdf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpandnd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdf, 0x31 }, { vpandnd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdf, 0x72, 0x7f }, { vpandnd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdf, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpandnd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdf, 0x72, 0x80 }, { vpandnd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xdf, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpandnd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdf, 0x72, 0x7f }, { vpandnd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdf, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpandnd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdf, 0x72, 0x80 }, { vpandnd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xdf, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpandnd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xdf, 0xf4 }, { vpandnq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xdf, 0xf4 }, { vpandnq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xdf, 0xf4 }, { vpandnq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdf, 0x31 }, { vpandnq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xdf, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpandnq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdf, 0x31 }, { vpandnq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdf, 0x72, 0x7f }, { vpandnq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdf, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpandnq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdf, 0x72, 0x80 }, { vpandnq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdf, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpandnq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdf, 0x72, 0x7f }, { vpandnq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdf, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpandnq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdf, 0x72, 0x80 }, { vpandnq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdf, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpandnq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xdb, 0xf4 }, { vpandq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xdb, 0xf4 }, { vpandq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xdb, 0xf4 }, { vpandq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdb, 0x31 }, { vpandq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xdb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpandq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdb, 0x31 }, { vpandq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdb, 0x72, 0x7f }, { vpandq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdb, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpandq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdb, 0x72, 0x80 }, { vpandq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xdb, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpandq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdb, 0x72, 0x7f }, { vpandq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdb, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpandq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdb, 0x72, 0x80 }, { vpandq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xdb, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpandq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x64, 0xf4 }, { vpblendmd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x64, 0xf4 }, { vpblendmd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x64, 0xf4 }, { vpblendmd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x64, 0x31 }, { vpblendmd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x64, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpblendmd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x64, 0x31 }, { vpblendmd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x64, 0x72, 0x7f }, { vpblendmd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x64, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpblendmd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x64, 0x72, 0x80 }, { vpblendmd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x64, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpblendmd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x64, 0x72, 0x7f }, { vpblendmd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x64, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpblendmd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x64, 0x72, 0x80 }, { vpblendmd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x64, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpblendmd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x58, 0x31 }, { vpbroadcastd zmm30,DWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x58, 0x31 }, { vpbroadcastd zmm30{k7},DWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x58, 0x31 }, { vpbroadcastd zmm30{k7}{z},DWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x58, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpbroadcastd zmm30,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x58, 0x72, 0x7f }, { vpbroadcastd zmm30,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x58, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpbroadcastd zmm30,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x58, 0x72, 0x80 }, { vpbroadcastd zmm30,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x58, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpbroadcastd zmm30,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x58, 0xf5 }, { vpbroadcastd zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x58, 0xf5 }, { vpbroadcastd zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x7c, 0xf0 }, { vpbroadcastd zmm30,eax }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x7c, 0xf0 }, { vpbroadcastd zmm30{k7},eax }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x7c, 0xf0 }, { vpbroadcastd zmm30{k7}{z},eax }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x7c, 0xf5 }, { vpbroadcastd zmm30,ebp }
+testcase { 0x62, 0x42, 0x7d, 0x48, 0x7c, 0xf5 }, { vpbroadcastd zmm30,r13d }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x59, 0x31 }, { vpbroadcastq zmm30,QWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x59, 0x31 }, { vpbroadcastq zmm30{k7},QWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x59, 0x31 }, { vpbroadcastq zmm30{k7}{z},QWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x59, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpbroadcastq zmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x59, 0x72, 0x7f }, { vpbroadcastq zmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x59, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpbroadcastq zmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x59, 0x72, 0x80 }, { vpbroadcastq zmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x59, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpbroadcastq zmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x59, 0xf5 }, { vpbroadcastq zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x59, 0xf5 }, { vpbroadcastq zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x7c, 0xf0 }, { vpbroadcastq zmm30,rax }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x7c, 0xf0 }, { vpbroadcastq zmm30{k7},rax }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x7c, 0xf0 }, { vpbroadcastq zmm30{k7}{z},rax }
+testcase { 0x62, 0x42, 0xfd, 0x48, 0x7c, 0xf0 }, { vpbroadcastq zmm30,r8 }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0xab }, { vpcmpd k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0xab }, { vpcmpd k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x7b }, { vpcmpd k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x7b }, { vpcmpd k5,zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpcmpd k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x7b }, { vpcmpd k5,zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpcmpd k5,zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x7b }, { vpcmpd k5,zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpcmpd k5,zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x01 }, { vpcmpltd k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0x01 }, { vpcmpltd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x01 }, { vpcmpltd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vpcmpltd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x01 }, { vpcmpltd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vpcmpltd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x01 }, { vpcmpltd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vpcmpltd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x02 }, { vpcmpled k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0x02 }, { vpcmpled k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x02 }, { vpcmpled k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vpcmpled k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x02 }, { vpcmpled k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vpcmpled k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x02 }, { vpcmpled k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vpcmpled k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x04 }, { vpcmpneqd k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0x04 }, { vpcmpneqd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x04 }, { vpcmpneqd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vpcmpneqd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x04 }, { vpcmpneqd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vpcmpneqd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x04 }, { vpcmpneqd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vpcmpneqd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x05 }, { vpcmpnltd k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0x05 }, { vpcmpnltd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x05 }, { vpcmpnltd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vpcmpnltd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x05 }, { vpcmpnltd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vpcmpnltd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x05 }, { vpcmpnltd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vpcmpnltd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1f, 0xed, 0x06 }, { vpcmpnled k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1f, 0xed, 0x06 }, { vpcmpnled k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x29, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x29, 0x06 }, { vpcmpnled k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x7f, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0x6a, 0x80, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vpcmpnled k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x7f, 0x06 }, { vpcmpnled k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vpcmpnled k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0x6a, 0x80, 0x06 }, { vpcmpnled k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1f, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vpcmpnled k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x76, 0xed }, { vpcmpeqd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x76, 0xed }, { vpcmpeqd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x76, 0x29 }, { vpcmpeqd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x76, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcmpeqd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x76, 0x29 }, { vpcmpeqd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x76, 0x6a, 0x7f }, { vpcmpeqd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x76, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vpcmpeqd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x76, 0x6a, 0x80 }, { vpcmpeqd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x76, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vpcmpeqd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x76, 0x6a, 0x7f }, { vpcmpeqd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x76, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vpcmpeqd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x76, 0x6a, 0x80 }, { vpcmpeqd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x76, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vpcmpeqd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x92, 0x8d, 0x40, 0x29, 0xed }, { vpcmpeqq k5,zmm30,zmm29 }
+testcase { 0x62, 0x92, 0x8d, 0x47, 0x29, 0xed }, { vpcmpeqq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x29, 0x29 }, { vpcmpeqq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x8d, 0x40, 0x29, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcmpeqq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x29, 0x29 }, { vpcmpeqq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x29, 0x6a, 0x7f }, { vpcmpeqq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x29, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vpcmpeqq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x29, 0x6a, 0x80 }, { vpcmpeqq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x29, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vpcmpeqq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x29, 0x6a, 0x7f }, { vpcmpeqq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x29, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vpcmpeqq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x29, 0x6a, 0x80 }, { vpcmpeqq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x29, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vpcmpeqq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x66, 0xed }, { vpcmpgtd k5,zmm30,zmm29 }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x66, 0xed }, { vpcmpgtd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x66, 0x29 }, { vpcmpgtd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x66, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcmpgtd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x66, 0x29 }, { vpcmpgtd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x66, 0x6a, 0x7f }, { vpcmpgtd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x66, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vpcmpgtd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x66, 0x6a, 0x80 }, { vpcmpgtd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x66, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vpcmpgtd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x66, 0x6a, 0x7f }, { vpcmpgtd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x66, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vpcmpgtd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x66, 0x6a, 0x80 }, { vpcmpgtd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x66, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vpcmpgtd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x92, 0x8d, 0x40, 0x37, 0xed }, { vpcmpgtq k5,zmm30,zmm29 }
+testcase { 0x62, 0x92, 0x8d, 0x47, 0x37, 0xed }, { vpcmpgtq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x37, 0x29 }, { vpcmpgtq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x8d, 0x40, 0x37, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcmpgtq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x37, 0x29 }, { vpcmpgtq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x37, 0x6a, 0x7f }, { vpcmpgtq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x37, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vpcmpgtq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x37, 0x6a, 0x80 }, { vpcmpgtq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x37, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vpcmpgtq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x37, 0x6a, 0x7f }, { vpcmpgtq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x37, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vpcmpgtq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x37, 0x6a, 0x80 }, { vpcmpgtq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x37, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vpcmpgtq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0xab }, { vpcmpq k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0xab }, { vpcmpq k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x7b }, { vpcmpq k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x7b }, { vpcmpq k5,zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpcmpq k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x7b }, { vpcmpq k5,zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpcmpq k5,zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x7b }, { vpcmpq k5,zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpcmpq k5,zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x01 }, { vpcmpltq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0x01 }, { vpcmpltq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x01 }, { vpcmpltq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vpcmpltq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x01 }, { vpcmpltq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vpcmpltq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x01 }, { vpcmpltq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vpcmpltq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x02 }, { vpcmpleq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0x02 }, { vpcmpleq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x02 }, { vpcmpleq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vpcmpleq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x02 }, { vpcmpleq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vpcmpleq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x02 }, { vpcmpleq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vpcmpleq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x04 }, { vpcmpneqq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0x04 }, { vpcmpneqq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x04 }, { vpcmpneqq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vpcmpneqq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x04 }, { vpcmpneqq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vpcmpneqq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x04 }, { vpcmpneqq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vpcmpneqq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x05 }, { vpcmpnltq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0x05 }, { vpcmpnltq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x05 }, { vpcmpnltq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vpcmpnltq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x05 }, { vpcmpnltq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vpcmpnltq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x05 }, { vpcmpnltq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vpcmpnltq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1f, 0xed, 0x06 }, { vpcmpnleq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1f, 0xed, 0x06 }, { vpcmpnleq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x29, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1f, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x29, 0x06 }, { vpcmpnleq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x7f, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0x6a, 0x80, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1f, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vpcmpnleq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x7f, 0x06 }, { vpcmpnleq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vpcmpnleq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0x6a, 0x80, 0x06 }, { vpcmpnleq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1f, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vpcmpnleq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0xab }, { vpcmpud k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0xab }, { vpcmpud k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x7b }, { vpcmpud k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x7b }, { vpcmpud k5,zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpcmpud k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x7b }, { vpcmpud k5,zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpcmpud k5,zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x7b }, { vpcmpud k5,zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpcmpud k5,zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x00 }, { vpcmpequd k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x00 }, { vpcmpequd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x00 }, { vpcmpequd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vpcmpequd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x00 }, { vpcmpequd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x00 }, { vpcmpequd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x00 }, { vpcmpequd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x00 }, { vpcmpequd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x01 }, { vpcmpltud k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x01 }, { vpcmpltud k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x01 }, { vpcmpltud k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vpcmpltud k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x01 }, { vpcmpltud k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x01 }, { vpcmpltud k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x01 }, { vpcmpltud k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x01 }, { vpcmpltud k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x02 }, { vpcmpleud k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x02 }, { vpcmpleud k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x02 }, { vpcmpleud k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vpcmpleud k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x02 }, { vpcmpleud k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x02 }, { vpcmpleud k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x02 }, { vpcmpleud k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x02 }, { vpcmpleud k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x04 }, { vpcmpnequd k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x04 }, { vpcmpnequd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x04 }, { vpcmpnequd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vpcmpnequd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x04 }, { vpcmpnequd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x04 }, { vpcmpnequd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x04 }, { vpcmpnequd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x04 }, { vpcmpnequd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x05 }, { vpcmpnltud k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x05 }, { vpcmpnltud k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x05 }, { vpcmpnltud k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vpcmpnltud k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x05 }, { vpcmpnltud k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x05 }, { vpcmpnltud k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x05 }, { vpcmpnltud k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x05 }, { vpcmpnltud k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x0d, 0x40, 0x1e, 0xed, 0x06 }, { vpcmpnleud k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x0d, 0x47, 0x1e, 0xed, 0x06 }, { vpcmpnleud k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x29, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x0d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x29, 0x06 }, { vpcmpnleud k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x7f, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0x6a, 0x80, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x0d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vpcmpnleud k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x7f, 0x06 }, { vpcmpnleud k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0x00, 0x02, 0x00, 0x00, 0x06 }, { vpcmpnleud k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0x6a, 0x80, 0x06 }, { vpcmpnleud k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf3, 0x0d, 0x50, 0x1e, 0xaa, 0xfc, 0xfd, 0xff, 0xff, 0x06 }, { vpcmpnleud k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0xab }, { vpcmpuq k5,zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0xab }, { vpcmpuq k5{k7},zmm30,zmm29,0xab }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x7b }, { vpcmpuq k5,zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x7b }, { vpcmpuq k5,zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpcmpuq k5,zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x7b }, { vpcmpuq k5,zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpcmpuq k5,zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x7b }, { vpcmpuq k5,zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpcmpuq k5,zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x00 }, { vpcmpequq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x00 }, { vpcmpequq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x00 }, { vpcmpequq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x00 }, { vpcmpequq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x00 }, { vpcmpequq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x00 }, { vpcmpequq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x00 }, { vpcmpequq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x00 }, { vpcmpequq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x01 }, { vpcmpltuq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x01 }, { vpcmpltuq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x01 }, { vpcmpltuq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x01 }, { vpcmpltuq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x01 }, { vpcmpltuq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x01 }, { vpcmpltuq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x01 }, { vpcmpltuq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x01 }, { vpcmpltuq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x02 }, { vpcmpleuq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x02 }, { vpcmpleuq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x02 }, { vpcmpleuq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x02 }, { vpcmpleuq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x02 }, { vpcmpleuq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x02 }, { vpcmpleuq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x02 }, { vpcmpleuq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x02 }, { vpcmpleuq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x04 }, { vpcmpnequq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x04 }, { vpcmpnequq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x04 }, { vpcmpnequq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x04 }, { vpcmpnequq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x04 }, { vpcmpnequq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x04 }, { vpcmpnequq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x04 }, { vpcmpnequq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x04 }, { vpcmpnequq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x05 }, { vpcmpnltuq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x05 }, { vpcmpnltuq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x05 }, { vpcmpnltuq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x05 }, { vpcmpnltuq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x05 }, { vpcmpnltuq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x05 }, { vpcmpnltuq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x05 }, { vpcmpnltuq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x05 }, { vpcmpnltuq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x93, 0x8d, 0x40, 0x1e, 0xed, 0x06 }, { vpcmpnleuq k5,zmm30,zmm29 }
+testcase { 0x62, 0x93, 0x8d, 0x47, 0x1e, 0xed, 0x06 }, { vpcmpnleuq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x29, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb3, 0x8d, 0x40, 0x1e, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x29, 0x06 }, { vpcmpnleuq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x7f, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0x00, 0x20, 0x00, 0x00, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0x6a, 0x80, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf3, 0x8d, 0x40, 0x1e, 0xaa, 0xc0, 0xdf, 0xff, 0xff, 0x06 }, { vpcmpnleuq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x7f, 0x06 }, { vpcmpnleuq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0x00, 0x04, 0x00, 0x00, 0x06 }, { vpcmpnleuq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0x6a, 0x80, 0x06 }, { vpcmpnleuq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf3, 0x8d, 0x50, 0x1e, 0xaa, 0xf8, 0xfb, 0xff, 0xff, 0x06 }, { vpcmpnleuq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x64, 0xf4 }, { vpblendmq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x64, 0xf4 }, { vpblendmq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x64, 0xf4 }, { vpblendmq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x64, 0x31 }, { vpblendmq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x64, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpblendmq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x64, 0x31 }, { vpblendmq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x64, 0x72, 0x7f }, { vpblendmq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x64, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpblendmq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x64, 0x72, 0x80 }, { vpblendmq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x64, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpblendmq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x64, 0x72, 0x7f }, { vpblendmq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x64, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpblendmq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x64, 0x72, 0x80 }, { vpblendmq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x64, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpblendmq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8b, 0x31 }, { vpcompressd ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x8b, 0x31 }, { vpcompressd ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x8b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcompressd ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8b, 0x72, 0x7f }, { vpcompressd ZWORD [rdx+0x1fc],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpcompressd ZWORD [rdx+0x200],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8b, 0x72, 0x80 }, { vpcompressd ZWORD [rdx-0x200],zmm30 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x8b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpcompressd ZWORD [rdx-0x204],zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x8b, 0xee }, { vpcompressd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x8b, 0xee }, { vpcompressd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x8b, 0xee }, { vpcompressd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x36, 0xf4 }, { vpermd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x36, 0xf4 }, { vpermd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x36, 0xf4 }, { vpermd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x36, 0x31 }, { vpermd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x36, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x36, 0x31 }, { vpermd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x36, 0x72, 0x7f }, { vpermd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x36, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x36, 0x72, 0x80 }, { vpermd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x36, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x36, 0x72, 0x7f }, { vpermd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x36, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x36, 0x72, 0x80 }, { vpermd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x36, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x05, 0xf5, 0xab }, { vpermilpd zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x05, 0xf5, 0xab }, { vpermilpd zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x05, 0xf5, 0xab }, { vpermilpd zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x05, 0xf5, 0x7b }, { vpermilpd zmm30,zmm29,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x05, 0x31, 0x7b }, { vpermilpd zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x05, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpermilpd zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x05, 0x31, 0x7b }, { vpermilpd zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x05, 0x72, 0x7f, 0x7b }, { vpermilpd zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x05, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpermilpd zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x05, 0x72, 0x80, 0x7b }, { vpermilpd zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x05, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpermilpd zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x05, 0x72, 0x7f, 0x7b }, { vpermilpd zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x05, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpermilpd zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x05, 0x72, 0x80, 0x7b }, { vpermilpd zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x05, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpermilpd zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x0d, 0xf4 }, { vpermilpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x0d, 0xf4 }, { vpermilpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x0d, 0xf4 }, { vpermilpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x0d, 0x31 }, { vpermilpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x0d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermilpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x0d, 0x31 }, { vpermilpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x0d, 0x72, 0x7f }, { vpermilpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x0d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermilpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x0d, 0x72, 0x80 }, { vpermilpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x0d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermilpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x0d, 0x72, 0x7f }, { vpermilpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x0d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermilpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x0d, 0x72, 0x80 }, { vpermilpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x0d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermilpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x04, 0xf5, 0xab }, { vpermilps zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x04, 0xf5, 0xab }, { vpermilps zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x04, 0xf5, 0xab }, { vpermilps zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x04, 0xf5, 0x7b }, { vpermilps zmm30,zmm29,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x04, 0x31, 0x7b }, { vpermilps zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x04, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpermilps zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x04, 0x31, 0x7b }, { vpermilps zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x04, 0x72, 0x7f, 0x7b }, { vpermilps zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x04, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpermilps zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x04, 0x72, 0x80, 0x7b }, { vpermilps zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x04, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpermilps zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x04, 0x72, 0x7f, 0x7b }, { vpermilps zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x04, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpermilps zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x04, 0x72, 0x80, 0x7b }, { vpermilps zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x04, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpermilps zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x0c, 0xf4 }, { vpermilps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x0c, 0xf4 }, { vpermilps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x0c, 0xf4 }, { vpermilps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x0c, 0x31 }, { vpermilps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x0c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermilps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x0c, 0x31 }, { vpermilps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x0c, 0x72, 0x7f }, { vpermilps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x0c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermilps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x0c, 0x72, 0x80 }, { vpermilps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x0c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermilps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x0c, 0x72, 0x7f }, { vpermilps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x0c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermilps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x0c, 0x72, 0x80 }, { vpermilps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x0c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermilps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x01, 0xf5, 0xab }, { vpermpd zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x01, 0xf5, 0xab }, { vpermpd zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x01, 0xf5, 0xab }, { vpermpd zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x01, 0xf5, 0x7b }, { vpermpd zmm30,zmm29,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x01, 0x31, 0x7b }, { vpermpd zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x01, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpermpd zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x01, 0x31, 0x7b }, { vpermpd zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x01, 0x72, 0x7f, 0x7b }, { vpermpd zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x01, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpermpd zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x01, 0x72, 0x80, 0x7b }, { vpermpd zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x01, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpermpd zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x01, 0x72, 0x7f, 0x7b }, { vpermpd zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x01, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpermpd zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x01, 0x72, 0x80, 0x7b }, { vpermpd zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x01, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpermpd zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x16, 0xf4 }, { vpermps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x16, 0xf4 }, { vpermps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x16, 0xf4 }, { vpermps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x16, 0x31 }, { vpermps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x16, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x16, 0x31 }, { vpermps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x16, 0x72, 0x7f }, { vpermps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x16, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x16, 0x72, 0x80 }, { vpermps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x16, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x16, 0x72, 0x7f }, { vpermps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x16, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x16, 0x72, 0x80 }, { vpermps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x16, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x00, 0xf5, 0xab }, { vpermq zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x00, 0xf5, 0xab }, { vpermq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x00, 0xf5, 0xab }, { vpermq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x00, 0xf5, 0x7b }, { vpermq zmm30,zmm29,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x00, 0x31, 0x7b }, { vpermq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x00, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpermq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x00, 0x31, 0x7b }, { vpermq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x00, 0x72, 0x7f, 0x7b }, { vpermq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x00, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpermq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x00, 0x72, 0x80, 0x7b }, { vpermq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x00, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpermq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x00, 0x72, 0x7f, 0x7b }, { vpermq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x00, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpermq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x00, 0x72, 0x80, 0x7b }, { vpermq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x00, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpermq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x89, 0x31 }, { vpexpandd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x89, 0x31 }, { vpexpandd zmm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x62, 0x7d, 0xcf, 0x89, 0x31 }, { vpexpandd zmm30{k7}{z},ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x89, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpexpandd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x89, 0x72, 0x7f }, { vpexpandd zmm30,ZWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x89, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpexpandd zmm30,ZWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x89, 0x72, 0x80 }, { vpexpandd zmm30,ZWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x89, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpexpandd zmm30,ZWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x89, 0xf5 }, { vpexpandd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x89, 0xf5 }, { vpexpandd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x89, 0xf5 }, { vpexpandd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x89, 0x31 }, { vpexpandq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x89, 0x31 }, { vpexpandq zmm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x62, 0xfd, 0xcf, 0x89, 0x31 }, { vpexpandq zmm30{k7}{z},ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x89, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpexpandq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x89, 0x72, 0x7f }, { vpexpandq zmm30,ZWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x89, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpexpandq zmm30,ZWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x89, 0x72, 0x80 }, { vpexpandq zmm30,ZWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x89, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpexpandq zmm30,ZWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x89, 0xf5 }, { vpexpandq zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x89, 0xf5 }, { vpexpandq zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x89, 0xf5 }, { vpexpandq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x90, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherdd zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x90, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherdd zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0x90, 0x74, 0x39, 0x40 }, { vpgatherdd zmm30{k1}, [r9+zmm31*1+0x100] }
+testcase { 0x62, 0x22, 0x7d, 0x41, 0x90, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpgatherdd zmm30{k1}, [rcx+zmm31*4+0x400] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x90, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherdq zmm30{k1}, [r14+ymm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x90, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherdq zmm30{k1}, [r14+ymm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x90, 0x74, 0x39, 0x20 }, { vpgatherdq zmm30{k1}, [r9+ymm31*1+0x100] }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0x90, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpgatherdq zmm30{k1}, [rcx+ymm31*4+0x400] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x91, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherqq zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x91, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpgatherqq zmm30{k1}, [r14+zmm31*8+0x7b] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0x91, 0x74, 0x39, 0x20 }, { vpgatherqq zmm30{k1}, [r9+zmm31*1+0x100] }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0x91, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpgatherqq zmm30{k1}, [rcx+zmm31*4+0x400] }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x3d, 0xf4 }, { vpmaxsd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x3d, 0xf4 }, { vpmaxsd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x3d, 0xf4 }, { vpmaxsd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3d, 0x31 }, { vpmaxsd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x3d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmaxsd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3d, 0x31 }, { vpmaxsd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3d, 0x72, 0x7f }, { vpmaxsd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmaxsd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3d, 0x72, 0x80 }, { vpmaxsd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmaxsd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3d, 0x72, 0x7f }, { vpmaxsd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpmaxsd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3d, 0x72, 0x80 }, { vpmaxsd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpmaxsd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x3d, 0xf4 }, { vpmaxsq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x3d, 0xf4 }, { vpmaxsq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x3d, 0xf4 }, { vpmaxsq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3d, 0x31 }, { vpmaxsq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x3d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmaxsq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3d, 0x31 }, { vpmaxsq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3d, 0x72, 0x7f }, { vpmaxsq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmaxsq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3d, 0x72, 0x80 }, { vpmaxsq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmaxsq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3d, 0x72, 0x7f }, { vpmaxsq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmaxsq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3d, 0x72, 0x80 }, { vpmaxsq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmaxsq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x3f, 0xf4 }, { vpmaxud zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x3f, 0xf4 }, { vpmaxud zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x3f, 0xf4 }, { vpmaxud zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3f, 0x31 }, { vpmaxud zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x3f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmaxud zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3f, 0x31 }, { vpmaxud zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3f, 0x72, 0x7f }, { vpmaxud zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmaxud zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3f, 0x72, 0x80 }, { vpmaxud zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmaxud zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3f, 0x72, 0x7f }, { vpmaxud zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpmaxud zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3f, 0x72, 0x80 }, { vpmaxud zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpmaxud zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x3f, 0xf4 }, { vpmaxuq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x3f, 0xf4 }, { vpmaxuq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x3f, 0xf4 }, { vpmaxuq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3f, 0x31 }, { vpmaxuq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x3f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmaxuq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3f, 0x31 }, { vpmaxuq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3f, 0x72, 0x7f }, { vpmaxuq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmaxuq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3f, 0x72, 0x80 }, { vpmaxuq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmaxuq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3f, 0x72, 0x7f }, { vpmaxuq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmaxuq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3f, 0x72, 0x80 }, { vpmaxuq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmaxuq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x39, 0xf4 }, { vpminsd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x39, 0xf4 }, { vpminsd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x39, 0xf4 }, { vpminsd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x39, 0x31 }, { vpminsd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x39, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpminsd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x39, 0x31 }, { vpminsd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x39, 0x72, 0x7f }, { vpminsd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x39, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpminsd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x39, 0x72, 0x80 }, { vpminsd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x39, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpminsd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x39, 0x72, 0x7f }, { vpminsd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x39, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpminsd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x39, 0x72, 0x80 }, { vpminsd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x39, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpminsd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x39, 0xf4 }, { vpminsq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x39, 0xf4 }, { vpminsq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x39, 0xf4 }, { vpminsq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x39, 0x31 }, { vpminsq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x39, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpminsq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x39, 0x31 }, { vpminsq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x39, 0x72, 0x7f }, { vpminsq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x39, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpminsq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x39, 0x72, 0x80 }, { vpminsq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x39, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpminsq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x39, 0x72, 0x7f }, { vpminsq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x39, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpminsq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x39, 0x72, 0x80 }, { vpminsq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x39, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpminsq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x3b, 0xf4 }, { vpminud zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x3b, 0xf4 }, { vpminud zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x3b, 0xf4 }, { vpminud zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3b, 0x31 }, { vpminud zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x3b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpminud zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3b, 0x31 }, { vpminud zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3b, 0x72, 0x7f }, { vpminud zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpminud zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3b, 0x72, 0x80 }, { vpminud zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x3b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpminud zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3b, 0x72, 0x7f }, { vpminud zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpminud zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3b, 0x72, 0x80 }, { vpminud zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x3b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpminud zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x3b, 0xf4 }, { vpminuq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x3b, 0xf4 }, { vpminuq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x3b, 0xf4 }, { vpminuq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3b, 0x31 }, { vpminuq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x3b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpminuq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3b, 0x31 }, { vpminuq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3b, 0x72, 0x7f }, { vpminuq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3b, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpminuq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3b, 0x72, 0x80 }, { vpminuq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x3b, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpminuq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3b, 0x72, 0x7f }, { vpminuq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3b, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpminuq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3b, 0x72, 0x80 }, { vpminuq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x3b, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpminuq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x21, 0xf5 }, { vpmovsxbd zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x21, 0xf5 }, { vpmovsxbd zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x21, 0x31 }, { vpmovsxbd zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x21, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsxbd zmm30{k7},OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x21, 0x72, 0x7f }, { vpmovsxbd zmm30{k7},OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x21, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovsxbd zmm30{k7},OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x21, 0x72, 0x80 }, { vpmovsxbd zmm30{k7},OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x21, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovsxbd zmm30{k7},OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x22, 0xf5 }, { vpmovsxbq zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x22, 0xf5 }, { vpmovsxbq zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x22, 0x31 }, { vpmovsxbq zmm30{k7},QWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x22, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsxbq zmm30{k7},QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x22, 0x72, 0x7f }, { vpmovsxbq zmm30{k7},QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x22, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmovsxbq zmm30{k7},QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x22, 0x72, 0x80 }, { vpmovsxbq zmm30{k7},QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x22, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmovsxbq zmm30{k7},QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x25, 0xf5 }, { vpmovsxdq zmm30{k7},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x25, 0xf5 }, { vpmovsxdq zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x25, 0x31 }, { vpmovsxdq zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x25, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsxdq zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x25, 0x72, 0x7f }, { vpmovsxdq zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x25, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovsxdq zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x25, 0x72, 0x80 }, { vpmovsxdq zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x25, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovsxdq zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x23, 0xf5 }, { vpmovsxwd zmm30{k7},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x23, 0xf5 }, { vpmovsxwd zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x23, 0x31 }, { vpmovsxwd zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x23, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsxwd zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x23, 0x72, 0x7f }, { vpmovsxwd zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x23, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovsxwd zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x23, 0x72, 0x80 }, { vpmovsxwd zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x23, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovsxwd zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x24, 0xf5 }, { vpmovsxwq zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x24, 0xf5 }, { vpmovsxwq zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x24, 0x31 }, { vpmovsxwq zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x24, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsxwq zmm30{k7},OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x24, 0x72, 0x7f }, { vpmovsxwq zmm30{k7},OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x24, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovsxwq zmm30{k7},OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x24, 0x72, 0x80 }, { vpmovsxwq zmm30{k7},OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x24, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovsxwq zmm30{k7},OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x31, 0xf5 }, { vpmovzxbd zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x31, 0xf5 }, { vpmovzxbd zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x31, 0x31 }, { vpmovzxbd zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x31, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovzxbd zmm30{k7},OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x31, 0x72, 0x7f }, { vpmovzxbd zmm30{k7},OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x31, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovzxbd zmm30{k7},OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x31, 0x72, 0x80 }, { vpmovzxbd zmm30{k7},OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x31, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovzxbd zmm30{k7},OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x32, 0xf5 }, { vpmovzxbq zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x32, 0xf5 }, { vpmovzxbq zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x32, 0x31 }, { vpmovzxbq zmm30{k7},QWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x32, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovzxbq zmm30{k7},QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x32, 0x72, 0x7f }, { vpmovzxbq zmm30{k7},QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x32, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmovzxbq zmm30{k7},QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x32, 0x72, 0x80 }, { vpmovzxbq zmm30{k7},QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x32, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmovzxbq zmm30{k7},QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x35, 0xf5 }, { vpmovzxdq zmm30{k7},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x35, 0xf5 }, { vpmovzxdq zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x35, 0x31 }, { vpmovzxdq zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x35, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovzxdq zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x35, 0x72, 0x7f }, { vpmovzxdq zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x35, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovzxdq zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x35, 0x72, 0x80 }, { vpmovzxdq zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x35, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovzxdq zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x33, 0xf5 }, { vpmovzxwd zmm30{k7},ymm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x33, 0xf5 }, { vpmovzxwd zmm30{k7}{z},ymm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x33, 0x31 }, { vpmovzxwd zmm30{k7},YWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x33, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovzxwd zmm30{k7},YWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x33, 0x72, 0x7f }, { vpmovzxwd zmm30{k7},YWORD [rdx+0xfe0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x33, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovzxwd zmm30{k7},YWORD [rdx+0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x33, 0x72, 0x80 }, { vpmovzxwd zmm30{k7},YWORD [rdx-0x1000] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x33, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovzxwd zmm30{k7},YWORD [rdx-0x1020] }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x34, 0xf5 }, { vpmovzxwq zmm30{k7},xmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x34, 0xf5 }, { vpmovzxwq zmm30{k7}{z},xmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x34, 0x31 }, { vpmovzxwq zmm30{k7},OWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x4f, 0x34, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovzxwq zmm30{k7},OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x34, 0x72, 0x7f }, { vpmovzxwq zmm30{k7},OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x34, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovzxwq zmm30{k7},OWORD [rdx+0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x34, 0x72, 0x80 }, { vpmovzxwq zmm30{k7},OWORD [rdx-0x800] }
+testcase { 0x62, 0x62, 0x7d, 0x4f, 0x34, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovzxwq zmm30{k7},OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x28, 0xf4 }, { vpmuldq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x28, 0xf4 }, { vpmuldq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x28, 0xf4 }, { vpmuldq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x28, 0x31 }, { vpmuldq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x28, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmuldq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x28, 0x31 }, { vpmuldq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x28, 0x72, 0x7f }, { vpmuldq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x28, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmuldq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x28, 0x72, 0x80 }, { vpmuldq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x28, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmuldq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x28, 0x72, 0x7f }, { vpmuldq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x28, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmuldq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x28, 0x72, 0x80 }, { vpmuldq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x28, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmuldq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x40, 0xf4 }, { vpmulld zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x40, 0xf4 }, { vpmulld zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x40, 0xf4 }, { vpmulld zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x40, 0x31 }, { vpmulld zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x40, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmulld zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x40, 0x31 }, { vpmulld zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x40, 0x72, 0x7f }, { vpmulld zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x40, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmulld zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x40, 0x72, 0x80 }, { vpmulld zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x40, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmulld zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x40, 0x72, 0x7f }, { vpmulld zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x40, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpmulld zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x40, 0x72, 0x80 }, { vpmulld zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x40, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpmulld zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xf4, 0xf4 }, { vpmuludq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xf4, 0xf4 }, { vpmuludq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xf4, 0xf4 }, { vpmuludq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xf4, 0x31 }, { vpmuludq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xf4, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmuludq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xf4, 0x31 }, { vpmuludq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xf4, 0x72, 0x7f }, { vpmuludq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xf4, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpmuludq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xf4, 0x72, 0x80 }, { vpmuludq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xf4, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpmuludq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xf4, 0x72, 0x7f }, { vpmuludq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xf4, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmuludq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xf4, 0x72, 0x80 }, { vpmuludq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xf4, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmuludq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xeb, 0xf4 }, { vpord zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xeb, 0xf4 }, { vpord zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xeb, 0xf4 }, { vpord zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xeb, 0x31 }, { vpord zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xeb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpord zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xeb, 0x31 }, { vpord zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xeb, 0x72, 0x7f }, { vpord zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xeb, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpord zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xeb, 0x72, 0x80 }, { vpord zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xeb, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpord zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xeb, 0x72, 0x7f }, { vpord zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xeb, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpord zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xeb, 0x72, 0x80 }, { vpord zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xeb, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpord zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xeb, 0xf4 }, { vporq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xeb, 0xf4 }, { vporq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xeb, 0xf4 }, { vporq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xeb, 0x31 }, { vporq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xeb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vporq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xeb, 0x31 }, { vporq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xeb, 0x72, 0x7f }, { vporq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xeb, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vporq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xeb, 0x72, 0x80 }, { vporq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xeb, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vporq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xeb, 0x72, 0x7f }, { vporq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xeb, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vporq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xeb, 0x72, 0x80 }, { vporq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xeb, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vporq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa0, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterdd [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa0, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterdd [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa0, 0x74, 0x39, 0x40 }, { vpscatterdd [r9+zmm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0x7d, 0x41, 0xa0, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpscatterdd [rcx+zmm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa0, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterdq [r14+ymm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa0, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterdq [r14+ymm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa0, 0x74, 0x39, 0x20 }, { vpscatterdq [r9+ymm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0xa0, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpscatterdq [rcx+ymm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa1, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterqq [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa1, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vpscatterqq [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa1, 0x74, 0x39, 0x20 }, { vpscatterqq [r9+zmm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0xa1, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vpscatterqq [rcx+zmm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x01, 0x7d, 0x48, 0x70, 0xf5, 0xab }, { vpshufd zmm30,zmm29,0xab }
+testcase { 0x62, 0x01, 0x7d, 0x4f, 0x70, 0xf5, 0xab }, { vpshufd zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x01, 0x7d, 0xcf, 0x70, 0xf5, 0xab }, { vpshufd zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x01, 0x7d, 0x48, 0x70, 0xf5, 0x7b }, { vpshufd zmm30,zmm29,0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x70, 0x31, 0x7b }, { vpshufd zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x21, 0x7d, 0x48, 0x70, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpshufd zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x70, 0x31, 0x7b }, { vpshufd zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x70, 0x72, 0x7f, 0x7b }, { vpshufd zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x70, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpshufd zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x70, 0x72, 0x80, 0x7b }, { vpshufd zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x70, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpshufd zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x70, 0x72, 0x7f, 0x7b }, { vpshufd zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x70, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpshufd zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x70, 0x72, 0x80, 0x7b }, { vpshufd zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x7d, 0x58, 0x70, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpshufd zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xf2, 0xf4 }, { vpslld zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xf2, 0xf4 }, { vpslld zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xf2, 0x31 }, { vpslld zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x47, 0xf2, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpslld zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xf2, 0x72, 0x7f }, { vpslld zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xf2, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpslld zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xf2, 0x72, 0x80 }, { vpslld zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xf2, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpslld zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xf3, 0xf4 }, { vpsllq zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xf3, 0xf4 }, { vpsllq zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xf3, 0x31 }, { vpsllq zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x47, 0xf3, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsllq zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xf3, 0x72, 0x7f }, { vpsllq zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xf3, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpsllq zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xf3, 0x72, 0x80 }, { vpsllq zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xf3, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpsllq zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x47, 0xf4 }, { vpsllvd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x47, 0xf4 }, { vpsllvd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x47, 0xf4 }, { vpsllvd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x47, 0x31 }, { vpsllvd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x47, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsllvd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x47, 0x31 }, { vpsllvd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x47, 0x72, 0x7f }, { vpsllvd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x47, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsllvd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x47, 0x72, 0x80 }, { vpsllvd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x47, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsllvd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x47, 0x72, 0x7f }, { vpsllvd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x47, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpsllvd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x47, 0x72, 0x80 }, { vpsllvd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x47, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpsllvd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x47, 0xf4 }, { vpsllvq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x47, 0xf4 }, { vpsllvq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x47, 0xf4 }, { vpsllvq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x47, 0x31 }, { vpsllvq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x47, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsllvq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x47, 0x31 }, { vpsllvq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x47, 0x72, 0x7f }, { vpsllvq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x47, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsllvq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x47, 0x72, 0x80 }, { vpsllvq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x47, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsllvq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x47, 0x72, 0x7f }, { vpsllvq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x47, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpsllvq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x47, 0x72, 0x80 }, { vpsllvq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x47, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpsllvq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xe2, 0xf4 }, { vpsrad zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xe2, 0xf4 }, { vpsrad zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xe2, 0x31 }, { vpsrad zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x47, 0xe2, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsrad zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xe2, 0x72, 0x7f }, { vpsrad zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xe2, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpsrad zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xe2, 0x72, 0x80 }, { vpsrad zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xe2, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpsrad zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xe2, 0xf4 }, { vpsraq zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xe2, 0xf4 }, { vpsraq zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xe2, 0x31 }, { vpsraq zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x47, 0xe2, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsraq zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xe2, 0x72, 0x7f }, { vpsraq zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xe2, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpsraq zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xe2, 0x72, 0x80 }, { vpsraq zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xe2, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpsraq zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x46, 0xf4 }, { vpsravd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x46, 0xf4 }, { vpsravd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x46, 0xf4 }, { vpsravd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x46, 0x31 }, { vpsravd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x46, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsravd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x46, 0x31 }, { vpsravd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x46, 0x72, 0x7f }, { vpsravd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x46, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsravd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x46, 0x72, 0x80 }, { vpsravd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x46, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsravd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x46, 0x72, 0x7f }, { vpsravd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x46, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpsravd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x46, 0x72, 0x80 }, { vpsravd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x46, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpsravd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x46, 0xf4 }, { vpsravq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x46, 0xf4 }, { vpsravq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x46, 0xf4 }, { vpsravq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x46, 0x31 }, { vpsravq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x46, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsravq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x46, 0x31 }, { vpsravq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x46, 0x72, 0x7f }, { vpsravq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x46, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsravq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x46, 0x72, 0x80 }, { vpsravq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x46, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsravq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x46, 0x72, 0x7f }, { vpsravq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x46, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpsravq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x46, 0x72, 0x80 }, { vpsravq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x46, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpsravq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xd2, 0xf4 }, { vpsrld zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xd2, 0xf4 }, { vpsrld zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xd2, 0x31 }, { vpsrld zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x47, 0xd2, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsrld zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xd2, 0x72, 0x7f }, { vpsrld zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xd2, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpsrld zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xd2, 0x72, 0x80 }, { vpsrld zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x15, 0x47, 0xd2, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpsrld zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xd3, 0xf4 }, { vpsrlq zmm30{k7},zmm29,xmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xd3, 0xf4 }, { vpsrlq zmm30{k7}{z},zmm29,xmm28 }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xd3, 0x31 }, { vpsrlq zmm30{k7},zmm29,OWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x47, 0xd3, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsrlq zmm30{k7},zmm29,OWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xd3, 0x72, 0x7f }, { vpsrlq zmm30{k7},zmm29,OWORD [rdx+0x7f0] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xd3, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpsrlq zmm30{k7},zmm29,OWORD [rdx+0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xd3, 0x72, 0x80 }, { vpsrlq zmm30{k7},zmm29,OWORD [rdx-0x800] }
+testcase { 0x62, 0x61, 0x95, 0x47, 0xd3, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpsrlq zmm30{k7},zmm29,OWORD [rdx-0x810] }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x45, 0xf4 }, { vpsrlvd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x45, 0xf4 }, { vpsrlvd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x45, 0xf4 }, { vpsrlvd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x45, 0x31 }, { vpsrlvd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x45, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsrlvd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x45, 0x31 }, { vpsrlvd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x45, 0x72, 0x7f }, { vpsrlvd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x45, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsrlvd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x45, 0x72, 0x80 }, { vpsrlvd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x45, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsrlvd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x45, 0x72, 0x7f }, { vpsrlvd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x45, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpsrlvd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x45, 0x72, 0x80 }, { vpsrlvd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x45, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpsrlvd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x45, 0xf4 }, { vpsrlvq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x45, 0xf4 }, { vpsrlvq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x45, 0xf4 }, { vpsrlvq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x45, 0x31 }, { vpsrlvq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x45, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsrlvq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x45, 0x31 }, { vpsrlvq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x45, 0x72, 0x7f }, { vpsrlvq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x45, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsrlvq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x45, 0x72, 0x80 }, { vpsrlvq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x45, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsrlvq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x45, 0x72, 0x7f }, { vpsrlvq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x45, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpsrlvq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x45, 0x72, 0x80 }, { vpsrlvq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x45, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpsrlvq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xd5, 0xab }, { vpsrld zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x72, 0xd5, 0xab }, { vpsrld zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0xc7, 0x72, 0xd5, 0xab }, { vpsrld zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xd5, 0x7b }, { vpsrld zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x11, 0x7b }, { vpsrld zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x72, 0x94, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpsrld zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x11, 0x7b }, { vpsrld zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x52, 0x7f, 0x7b }, { vpsrld zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x92, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpsrld zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x52, 0x80, 0x7b }, { vpsrld zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x92, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpsrld zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x52, 0x7f, 0x7b }, { vpsrld zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x92, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpsrld zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x52, 0x80, 0x7b }, { vpsrld zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x92, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpsrld zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x73, 0xd5, 0xab }, { vpsrlq zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0x73, 0xd5, 0xab }, { vpsrlq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0xc7, 0x73, 0xd5, 0xab }, { vpsrlq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x73, 0xd5, 0x7b }, { vpsrlq zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x11, 0x7b }, { vpsrlq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0x73, 0x94, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpsrlq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x11, 0x7b }, { vpsrlq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x52, 0x7f, 0x7b }, { vpsrlq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x92, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpsrlq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x52, 0x80, 0x7b }, { vpsrlq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x92, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpsrlq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x52, 0x7f, 0x7b }, { vpsrlq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x92, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpsrlq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x52, 0x80, 0x7b }, { vpsrlq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x92, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpsrlq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xfa, 0xf4 }, { vpsubd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xfa, 0xf4 }, { vpsubd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xfa, 0xf4 }, { vpsubd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfa, 0x31 }, { vpsubd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xfa, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsubd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfa, 0x31 }, { vpsubd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfa, 0x72, 0x7f }, { vpsubd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfa, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsubd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfa, 0x72, 0x80 }, { vpsubd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xfa, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsubd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfa, 0x72, 0x7f }, { vpsubd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfa, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpsubd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfa, 0x72, 0x80 }, { vpsubd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xfa, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpsubd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xfb, 0xf4 }, { vpsubq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xfb, 0xf4 }, { vpsubq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xfb, 0xf4 }, { vpsubq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xfb, 0x31 }, { vpsubq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xfb, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpsubq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xfb, 0x31 }, { vpsubq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xfb, 0x72, 0x7f }, { vpsubq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xfb, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpsubq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xfb, 0x72, 0x80 }, { vpsubq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xfb, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpsubq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xfb, 0x72, 0x7f }, { vpsubq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xfb, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpsubq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xfb, 0x72, 0x80 }, { vpsubq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xfb, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpsubq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x92, 0x0d, 0x40, 0x27, 0xed }, { vptestmd k5,zmm30,zmm29 }
+testcase { 0x62, 0x92, 0x0d, 0x47, 0x27, 0xed }, { vptestmd k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf2, 0x0d, 0x40, 0x27, 0x29 }, { vptestmd k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x0d, 0x40, 0x27, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vptestmd k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x0d, 0x50, 0x27, 0x29 }, { vptestmd k5,zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0xf2, 0x0d, 0x40, 0x27, 0x6a, 0x7f }, { vptestmd k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x0d, 0x40, 0x27, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vptestmd k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x0d, 0x40, 0x27, 0x6a, 0x80 }, { vptestmd k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x0d, 0x40, 0x27, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vptestmd k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x0d, 0x50, 0x27, 0x6a, 0x7f }, { vptestmd k5,zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0xf2, 0x0d, 0x50, 0x27, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vptestmd k5,zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0xf2, 0x0d, 0x50, 0x27, 0x6a, 0x80 }, { vptestmd k5,zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0xf2, 0x0d, 0x50, 0x27, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vptestmd k5,zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x92, 0x8d, 0x40, 0x27, 0xed }, { vptestmq k5,zmm30,zmm29 }
+testcase { 0x62, 0x92, 0x8d, 0x47, 0x27, 0xed }, { vptestmq k5{k7},zmm30,zmm29 }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x27, 0x29 }, { vptestmq k5,zmm30,ZWORD [rcx] }
+testcase { 0x62, 0xb2, 0x8d, 0x40, 0x27, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vptestmq k5,zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x27, 0x29 }, { vptestmq k5,zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x27, 0x6a, 0x7f }, { vptestmq k5,zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x27, 0xaa, 0x00, 0x20, 0x00, 0x00 }, { vptestmq k5,zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x27, 0x6a, 0x80 }, { vptestmq k5,zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0xf2, 0x8d, 0x40, 0x27, 0xaa, 0xc0, 0xdf, 0xff, 0xff }, { vptestmq k5,zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x27, 0x6a, 0x7f }, { vptestmq k5,zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x27, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vptestmq k5,zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x27, 0x6a, 0x80 }, { vptestmq k5,zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0xf2, 0x8d, 0x50, 0x27, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vptestmq k5,zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0x6a, 0xf4 }, { vpunpckhdq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0x6a, 0xf4 }, { vpunpckhdq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0x6a, 0xf4 }, { vpunpckhdq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x6a, 0x31 }, { vpunpckhdq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0x6a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpunpckhdq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x6a, 0x31 }, { vpunpckhdq zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x6a, 0x72, 0x7f }, { vpunpckhdq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x6a, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpunpckhdq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x6a, 0x72, 0x80 }, { vpunpckhdq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x6a, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpunpckhdq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x6a, 0x72, 0x7f }, { vpunpckhdq zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x6a, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpunpckhdq zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x6a, 0x72, 0x80 }, { vpunpckhdq zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x6a, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpunpckhdq zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x6d, 0xf4 }, { vpunpckhqdq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x6d, 0xf4 }, { vpunpckhqdq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x6d, 0xf4 }, { vpunpckhqdq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6d, 0x31 }, { vpunpckhqdq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x6d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpunpckhqdq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6d, 0x31 }, { vpunpckhqdq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6d, 0x72, 0x7f }, { vpunpckhqdq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6d, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpunpckhqdq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6d, 0x72, 0x80 }, { vpunpckhqdq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6d, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpunpckhqdq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6d, 0x72, 0x7f }, { vpunpckhqdq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpunpckhqdq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6d, 0x72, 0x80 }, { vpunpckhqdq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpunpckhqdq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0x62, 0xf4 }, { vpunpckldq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0x62, 0xf4 }, { vpunpckldq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0x62, 0xf4 }, { vpunpckldq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x62, 0x31 }, { vpunpckldq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0x62, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpunpckldq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x62, 0x31 }, { vpunpckldq zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x62, 0x72, 0x7f }, { vpunpckldq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x62, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpunpckldq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x62, 0x72, 0x80 }, { vpunpckldq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0x62, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpunpckldq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x62, 0x72, 0x7f }, { vpunpckldq zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x62, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpunpckldq zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x62, 0x72, 0x80 }, { vpunpckldq zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0x62, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpunpckldq zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x6c, 0xf4 }, { vpunpcklqdq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x6c, 0xf4 }, { vpunpcklqdq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x6c, 0xf4 }, { vpunpcklqdq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6c, 0x31 }, { vpunpcklqdq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x6c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpunpcklqdq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6c, 0x31 }, { vpunpcklqdq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6c, 0x72, 0x7f }, { vpunpcklqdq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpunpcklqdq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6c, 0x72, 0x80 }, { vpunpcklqdq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x6c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpunpcklqdq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6c, 0x72, 0x7f }, { vpunpcklqdq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpunpcklqdq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6c, 0x72, 0x80 }, { vpunpcklqdq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x6c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpunpcklqdq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x15, 0x40, 0xef, 0xf4 }, { vpxord zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0x47, 0xef, 0xf4 }, { vpxord zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x15, 0xc7, 0xef, 0xf4 }, { vpxord zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xef, 0x31 }, { vpxord zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x15, 0x40, 0xef, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpxord zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xef, 0x31 }, { vpxord zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xef, 0x72, 0x7f }, { vpxord zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xef, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpxord zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xef, 0x72, 0x80 }, { vpxord zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x15, 0x40, 0xef, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpxord zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xef, 0x72, 0x7f }, { vpxord zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xef, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpxord zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xef, 0x72, 0x80 }, { vpxord zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x15, 0x50, 0xef, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpxord zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xef, 0xf4 }, { vpxorq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xef, 0xf4 }, { vpxorq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xef, 0xf4 }, { vpxorq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xef, 0x31 }, { vpxorq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xef, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpxorq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xef, 0x31 }, { vpxorq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xef, 0x72, 0x7f }, { vpxorq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xef, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpxorq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xef, 0x72, 0x80 }, { vpxorq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xef, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpxorq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xef, 0x72, 0x7f }, { vpxorq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xef, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpxorq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xef, 0x72, 0x80 }, { vpxorq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xef, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpxorq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x4c, 0xf5 }, { vrcp14pd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x4c, 0xf5 }, { vrcp14pd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x4c, 0xf5 }, { vrcp14pd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4c, 0x31 }, { vrcp14pd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x4c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp14pd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4c, 0x31 }, { vrcp14pd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4c, 0x72, 0x7f }, { vrcp14pd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrcp14pd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4c, 0x72, 0x80 }, { vrcp14pd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrcp14pd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4c, 0x72, 0x7f }, { vrcp14pd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrcp14pd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4c, 0x72, 0x80 }, { vrcp14pd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrcp14pd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x4c, 0xf5 }, { vrcp14ps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x4c, 0xf5 }, { vrcp14ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x4c, 0xf5 }, { vrcp14ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4c, 0x31 }, { vrcp14ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x4c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp14ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4c, 0x31 }, { vrcp14ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4c, 0x72, 0x7f }, { vrcp14ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrcp14ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4c, 0x72, 0x80 }, { vrcp14ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrcp14ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4c, 0x72, 0x7f }, { vrcp14ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrcp14ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4c, 0x72, 0x80 }, { vrcp14ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrcp14ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x4d, 0xf4 }, { vrcp14sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x4d, 0xf4 }, { vrcp14sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4d, 0x31 }, { vrcp14sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x4d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp14sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4d, 0x72, 0x7f }, { vrcp14sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrcp14sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4d, 0x72, 0x80 }, { vrcp14sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrcp14sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x4d, 0xf4 }, { vrcp14ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x4d, 0xf4 }, { vrcp14ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4d, 0x31 }, { vrcp14ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x4d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrcp14ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4d, 0x72, 0x7f }, { vrcp14ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrcp14ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4d, 0x72, 0x80 }, { vrcp14ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrcp14ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x4e, 0xf5 }, { vrsqrt14pd zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x4e, 0xf5 }, { vrsqrt14pd zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x4e, 0xf5 }, { vrsqrt14pd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4e, 0x31 }, { vrsqrt14pd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x4e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt14pd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4e, 0x31 }, { vrsqrt14pd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4e, 0x72, 0x7f }, { vrsqrt14pd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrsqrt14pd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4e, 0x72, 0x80 }, { vrsqrt14pd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x4e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrsqrt14pd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4e, 0x72, 0x7f }, { vrsqrt14pd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrsqrt14pd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4e, 0x72, 0x80 }, { vrsqrt14pd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0xfd, 0x58, 0x4e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrsqrt14pd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x7d, 0x48, 0x4e, 0xf5 }, { vrsqrt14ps zmm30,zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0x4f, 0x4e, 0xf5 }, { vrsqrt14ps zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7d, 0xcf, 0x4e, 0xf5 }, { vrsqrt14ps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4e, 0x31 }, { vrsqrt14ps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x7d, 0x48, 0x4e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt14ps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4e, 0x31 }, { vrsqrt14ps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4e, 0x72, 0x7f }, { vrsqrt14ps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vrsqrt14ps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4e, 0x72, 0x80 }, { vrsqrt14ps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x7d, 0x48, 0x4e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vrsqrt14ps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4e, 0x72, 0x7f }, { vrsqrt14ps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrsqrt14ps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4e, 0x72, 0x80 }, { vrsqrt14ps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x7d, 0x58, 0x4e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrsqrt14ps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x4f, 0xf4 }, { vrsqrt14sd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x4f, 0xf4 }, { vrsqrt14sd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4f, 0x31 }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x4f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4f, 0x72, 0x7f }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4f, 0x72, 0x80 }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x4f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vrsqrt14sd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x4f, 0xf4 }, { vrsqrt14ss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x4f, 0xf4 }, { vrsqrt14ss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4f, 0x31 }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x4f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4f, 0x72, 0x7f }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4f, 0x72, 0x80 }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x4f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vrsqrt14ss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa2, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterdpd [r14+ymm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa2, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterdpd [r14+ymm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa2, 0x74, 0x39, 0x20 }, { vscatterdpd [r9+ymm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0xa2, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterdpd [rcx+ymm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa2, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterdps [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa2, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterdps [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0x7d, 0x41, 0xa2, 0x74, 0x39, 0x40 }, { vscatterdps [r9+zmm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0x7d, 0x41, 0xa2, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterdps [rcx+zmm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa3, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterqpd [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa3, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterqpd [r14+zmm31*8+0x7b]{k1},zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x41, 0xa3, 0x74, 0x39, 0x20 }, { vscatterqpd [r9+zmm31*1+0x100]{k1},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x41, 0xa3, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterqpd [rcx+zmm31*4+0x400]{k1},zmm30 }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xc6, 0xf4, 0xab }, { vshufpd zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x95, 0x47, 0xc6, 0xf4, 0xab }, { vshufpd zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0xc6, 0xf4, 0xab }, { vshufpd zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x95, 0x40, 0xc6, 0xf4, 0x7b }, { vshufpd zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xc6, 0x31, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x21, 0x95, 0x40, 0xc6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xc6, 0x31, 0x7b }, { vshufpd zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xc6, 0x72, 0x7f, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xc6, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xc6, 0x72, 0x80, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x61, 0x95, 0x40, 0xc6, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshufpd zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xc6, 0x72, 0x7f, 0x7b }, { vshufpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xc6, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vshufpd zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xc6, 0x72, 0x80, 0x7b }, { vshufpd zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x61, 0x95, 0x50, 0xc6, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vshufpd zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x01, 0x14, 0x40, 0xc6, 0xf4, 0xab }, { vshufps zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x14, 0x47, 0xc6, 0xf4, 0xab }, { vshufps zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0xc6, 0xf4, 0xab }, { vshufps zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x01, 0x14, 0x40, 0xc6, 0xf4, 0x7b }, { vshufps zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x61, 0x14, 0x40, 0xc6, 0x31, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x21, 0x14, 0x40, 0xc6, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x61, 0x14, 0x50, 0xc6, 0x31, 0x7b }, { vshufps zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x14, 0x40, 0xc6, 0x72, 0x7f, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x61, 0x14, 0x40, 0xc6, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x61, 0x14, 0x40, 0xc6, 0x72, 0x80, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x61, 0x14, 0x40, 0xc6, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshufps zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x61, 0x14, 0x50, 0xc6, 0x72, 0x7f, 0x7b }, { vshufps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x14, 0x50, 0xc6, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vshufps zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x14, 0x50, 0xc6, 0x72, 0x80, 0x7b }, { vshufps zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x61, 0x14, 0x50, 0xc6, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vshufps zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x01, 0xfd, 0x48, 0x51, 0xf5 }, { vsqrtpd zmm30,zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x4f, 0x51, 0xf5 }, { vsqrtpd zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0xcf, 0x51, 0xf5 }, { vsqrtpd zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x18, 0x51, 0xf5 }, { vsqrtpd zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x58, 0x51, 0xf5 }, { vsqrtpd zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x38, 0x51, 0xf5 }, { vsqrtpd zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0xfd, 0x78, 0x51, 0xf5 }, { vsqrtpd zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x51, 0x31 }, { vsqrtpd zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x51, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsqrtpd zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x58, 0x51, 0x31 }, { vsqrtpd zmm30,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x51, 0x72, 0x7f }, { vsqrtpd zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x51, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vsqrtpd zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x51, 0x72, 0x80 }, { vsqrtpd zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x51, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vsqrtpd zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfd, 0x58, 0x51, 0x72, 0x7f }, { vsqrtpd zmm30,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x58, 0x51, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vsqrtpd zmm30,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x58, 0x51, 0x72, 0x80 }, { vsqrtpd zmm30,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfd, 0x58, 0x51, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vsqrtpd zmm30,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x51, 0xf5 }, { vsqrtps zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x51, 0xf5 }, { vsqrtps zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x51, 0xf5 }, { vsqrtps zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x51, 0xf5 }, { vsqrtps zmm30,zmm29,{rn-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x58, 0x51, 0xf5 }, { vsqrtps zmm30,zmm29,{ru-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x38, 0x51, 0xf5 }, { vsqrtps zmm30,zmm29,{rd-sae} }
+testcase { 0x62, 0x01, 0x7c, 0x78, 0x51, 0xf5 }, { vsqrtps zmm30,zmm29,{rz-sae} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x51, 0x31 }, { vsqrtps zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x51, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsqrtps zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x51, 0x31 }, { vsqrtps zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x51, 0x72, 0x7f }, { vsqrtps zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x51, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vsqrtps zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x51, 0x72, 0x80 }, { vsqrtps zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x51, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vsqrtps zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x51, 0x72, 0x7f }, { vsqrtps zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x51, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vsqrtps zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x51, 0x72, 0x80 }, { vsqrtps zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x51, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vsqrtps zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x51, 0xf4 }, { vsqrtsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x51, 0xf4 }, { vsqrtsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x51, 0xf4 }, { vsqrtsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x51, 0xf4 }, { vsqrtsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x51, 0xf4 }, { vsqrtsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x51, 0xf4 }, { vsqrtsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x51, 0x31 }, { vsqrtsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x51, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsqrtsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x51, 0x72, 0x7f }, { vsqrtsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x51, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vsqrtsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x51, 0x72, 0x80 }, { vsqrtsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x51, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vsqrtsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x51, 0xf4 }, { vsqrtss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x51, 0xf4 }, { vsqrtss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x51, 0xf4 }, { vsqrtss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x16, 0x57, 0x51, 0xf4 }, { vsqrtss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x16, 0x37, 0x51, 0xf4 }, { vsqrtss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x16, 0x77, 0x51, 0xf4 }, { vsqrtss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x51, 0x31 }, { vsqrtss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x51, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsqrtss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x51, 0x72, 0x7f }, { vsqrtss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x51, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vsqrtss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x51, 0x72, 0x80 }, { vsqrtss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x51, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vsqrtss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x5c, 0xf4 }, { vsubpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x5c, 0xf4 }, { vsubpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x5c, 0xf4 }, { vsubpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x10, 0x5c, 0xf4 }, { vsubpd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x95, 0x50, 0x5c, 0xf4 }, { vsubpd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x95, 0x30, 0x5c, 0xf4 }, { vsubpd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x95, 0x70, 0x5c, 0xf4 }, { vsubpd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5c, 0x31 }, { vsubpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x5c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsubpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5c, 0x31 }, { vsubpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5c, 0x72, 0x7f }, { vsubpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vsubpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5c, 0x72, 0x80 }, { vsubpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x5c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vsubpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5c, 0x72, 0x7f }, { vsubpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vsubpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5c, 0x72, 0x80 }, { vsubpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x5c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vsubpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x5c, 0xf4 }, { vsubps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x5c, 0xf4 }, { vsubps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x5c, 0xf4 }, { vsubps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x10, 0x5c, 0xf4 }, { vsubps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x14, 0x50, 0x5c, 0xf4 }, { vsubps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x14, 0x30, 0x5c, 0xf4 }, { vsubps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x14, 0x70, 0x5c, 0xf4 }, { vsubps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5c, 0x31 }, { vsubps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x5c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsubps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5c, 0x31 }, { vsubps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5c, 0x72, 0x7f }, { vsubps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vsubps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5c, 0x72, 0x80 }, { vsubps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x5c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vsubps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5c, 0x72, 0x7f }, { vsubps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vsubps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5c, 0x72, 0x80 }, { vsubps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x5c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vsubps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x97, 0x07, 0x5c, 0xf4 }, { vsubsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x87, 0x5c, 0xf4 }, { vsubsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x97, 0x17, 0x5c, 0xf4 }, { vsubsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x97, 0x57, 0x5c, 0xf4 }, { vsubsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x97, 0x37, 0x5c, 0xf4 }, { vsubsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x97, 0x77, 0x5c, 0xf4 }, { vsubsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5c, 0x31 }, { vsubsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x07, 0x5c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsubsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5c, 0x72, 0x7f }, { vsubsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vsubsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5c, 0x72, 0x80 }, { vsubsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x07, 0x5c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vsubsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x16, 0x07, 0x5c, 0xf4 }, { vsubss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x87, 0x5c, 0xf4 }, { vsubss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x01, 0x16, 0x17, 0x5c, 0xf4 }, { vsubss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x01, 0x16, 0x57, 0x5c, 0xf4 }, { vsubss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x01, 0x16, 0x37, 0x5c, 0xf4 }, { vsubss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x01, 0x16, 0x77, 0x5c, 0xf4 }, { vsubss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5c, 0x31 }, { vsubss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x07, 0x5c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vsubss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5c, 0x72, 0x7f }, { vsubss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vsubss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5c, 0x72, 0x80 }, { vsubss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x07, 0x5c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vsubss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0xfd, 0x08, 0x2e, 0xf5 }, { vucomisd xmm30,xmm29 }
+testcase { 0x62, 0x01, 0xfd, 0x18, 0x2e, 0xf5 }, { vucomisd xmm30,xmm29,{sae} }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2e, 0x31 }, { vucomisd xmm30,QWORD [rcx] }
+testcase { 0x62, 0x21, 0xfd, 0x08, 0x2e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vucomisd xmm30,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2e, 0x72, 0x7f }, { vucomisd xmm30,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vucomisd xmm30,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2e, 0x72, 0x80 }, { vucomisd xmm30,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0xfd, 0x08, 0x2e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vucomisd xmm30,QWORD [rdx-0x408] }
+testcase { 0x62, 0x01, 0x7c, 0x08, 0x2e, 0xf5 }, { vucomiss xmm30,xmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x2e, 0xf5 }, { vucomiss xmm30,xmm29,{sae} }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2e, 0x31 }, { vucomiss xmm30,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x08, 0x2e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vucomiss xmm30,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2e, 0x72, 0x7f }, { vucomiss xmm30,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vucomiss xmm30,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2e, 0x72, 0x80 }, { vucomiss xmm30,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x7c, 0x08, 0x2e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vucomiss xmm30,DWORD [rdx-0x204] }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x15, 0xf4 }, { vunpckhpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x15, 0xf4 }, { vunpckhpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x15, 0xf4 }, { vunpckhpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x15, 0x31 }, { vunpckhpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x15, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vunpckhpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x15, 0x31 }, { vunpckhpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x15, 0x72, 0x7f }, { vunpckhpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x15, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vunpckhpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x15, 0x72, 0x80 }, { vunpckhpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x15, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vunpckhpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x15, 0x72, 0x7f }, { vunpckhpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x15, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vunpckhpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x15, 0x72, 0x80 }, { vunpckhpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x15, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vunpckhpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x15, 0xf4 }, { vunpckhps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x15, 0xf4 }, { vunpckhps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x15, 0xf4 }, { vunpckhps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x15, 0x31 }, { vunpckhps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x15, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vunpckhps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x15, 0x31 }, { vunpckhps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x15, 0x72, 0x7f }, { vunpckhps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x15, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vunpckhps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x15, 0x72, 0x80 }, { vunpckhps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x15, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vunpckhps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x15, 0x72, 0x7f }, { vunpckhps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x15, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vunpckhps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x15, 0x72, 0x80 }, { vunpckhps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x15, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vunpckhps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x01, 0x95, 0x40, 0x14, 0xf4 }, { vunpcklpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0x47, 0x14, 0xf4 }, { vunpcklpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x95, 0xc7, 0x14, 0xf4 }, { vunpcklpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x14, 0x31 }, { vunpcklpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x95, 0x40, 0x14, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vunpcklpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x14, 0x31 }, { vunpcklpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x14, 0x72, 0x7f }, { vunpcklpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x14, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vunpcklpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x14, 0x72, 0x80 }, { vunpcklpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x95, 0x40, 0x14, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vunpcklpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x14, 0x72, 0x7f }, { vunpcklpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x14, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vunpcklpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x14, 0x72, 0x80 }, { vunpcklpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0x95, 0x50, 0x14, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vunpcklpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x14, 0x40, 0x14, 0xf4 }, { vunpcklps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0x47, 0x14, 0xf4 }, { vunpcklps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x01, 0x14, 0xc7, 0x14, 0xf4 }, { vunpcklps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x14, 0x31 }, { vunpcklps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x14, 0x40, 0x14, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vunpcklps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x14, 0x31 }, { vunpcklps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x14, 0x72, 0x7f }, { vunpcklps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x14, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vunpcklps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x14, 0x72, 0x80 }, { vunpcklps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x14, 0x40, 0x14, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vunpcklps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x14, 0x72, 0x7f }, { vunpcklps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x14, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vunpcklps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x14, 0x72, 0x80 }, { vunpcklps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x14, 0x50, 0x14, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vunpcklps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x25, 0xf4, 0xab }, { vpternlogd zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x25, 0xf4, 0xab }, { vpternlogd zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x25, 0xf4, 0xab }, { vpternlogd zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x25, 0xf4, 0x7b }, { vpternlogd zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x25, 0x31, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x40, 0x25, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x25, 0x31, 0x7b }, { vpternlogd zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x25, 0x72, 0x7f, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x25, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x25, 0x72, 0x80, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x25, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpternlogd zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x25, 0x72, 0x7f, 0x7b }, { vpternlogd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x25, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpternlogd zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x25, 0x72, 0x80, 0x7b }, { vpternlogd zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x25, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpternlogd zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x25, 0xf4, 0xab }, { vpternlogq zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x25, 0xf4, 0xab }, { vpternlogq zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x25, 0xf4, 0xab }, { vpternlogq zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x25, 0xf4, 0x7b }, { vpternlogq zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x25, 0x31, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x40, 0x25, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x25, 0x31, 0x7b }, { vpternlogq zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x25, 0x72, 0x7f, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x25, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x25, 0x72, 0x80, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x25, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpternlogq zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x25, 0x72, 0x7f, 0x7b }, { vpternlogq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x25, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpternlogq zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x25, 0x72, 0x80, 0x7b }, { vpternlogq zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x25, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpternlogq zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x32, 0xee }, { vpmovqb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x32, 0xee }, { vpmovqb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x22, 0xee }, { vpmovsqb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x22, 0xee }, { vpmovsqb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x12, 0xee }, { vpmovusqb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x12, 0xee }, { vpmovusqb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x34, 0xee }, { vpmovqw xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x34, 0xee }, { vpmovqw xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x24, 0xee }, { vpmovsqw xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x24, 0xee }, { vpmovsqw xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x14, 0xee }, { vpmovusqw xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x14, 0xee }, { vpmovusqw xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x35, 0xee }, { vpmovqd ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x35, 0xee }, { vpmovqd ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x25, 0xee }, { vpmovsqd ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x25, 0xee }, { vpmovsqd ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x15, 0xee }, { vpmovusqd ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x15, 0xee }, { vpmovusqd ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x31, 0xee }, { vpmovdb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x31, 0xee }, { vpmovdb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x21, 0xee }, { vpmovsdb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x21, 0xee }, { vpmovsdb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x11, 0xee }, { vpmovusdb xmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x11, 0xee }, { vpmovusdb xmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x33, 0xee }, { vpmovdw ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x33, 0xee }, { vpmovdw ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x23, 0xee }, { vpmovsdw ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x23, 0xee }, { vpmovsdw ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0x4f, 0x13, 0xee }, { vpmovusdw ymm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0x7e, 0xcf, 0x13, 0xee }, { vpmovusdw ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x23, 0xf4, 0xab }, { vshuff32x4 zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x23, 0xf4, 0xab }, { vshuff32x4 zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x23, 0xf4, 0xab }, { vshuff32x4 zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x23, 0xf4, 0x7b }, { vshuff32x4 zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x23, 0x31, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x40, 0x23, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x23, 0x31, 0x7b }, { vshuff32x4 zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x23, 0x72, 0x7f, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x23, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x23, 0x72, 0x80, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x23, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshuff32x4 zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x23, 0x72, 0x7f, 0x7b }, { vshuff32x4 zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x23, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vshuff32x4 zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x23, 0x72, 0x80, 0x7b }, { vshuff32x4 zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x23, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vshuff32x4 zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x23, 0xf4, 0xab }, { vshuff64x2 zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x23, 0xf4, 0xab }, { vshuff64x2 zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x23, 0xf4, 0xab }, { vshuff64x2 zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x23, 0xf4, 0x7b }, { vshuff64x2 zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x23, 0x31, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x40, 0x23, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x23, 0x31, 0x7b }, { vshuff64x2 zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x23, 0x72, 0x7f, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x23, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x23, 0x72, 0x80, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x23, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshuff64x2 zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x23, 0x72, 0x7f, 0x7b }, { vshuff64x2 zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x23, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vshuff64x2 zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x23, 0x72, 0x80, 0x7b }, { vshuff64x2 zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x23, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vshuff64x2 zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x43, 0xf4, 0xab }, { vshufi32x4 zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x43, 0xf4, 0xab }, { vshufi32x4 zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x43, 0xf4, 0xab }, { vshufi32x4 zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x43, 0xf4, 0x7b }, { vshufi32x4 zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x43, 0x31, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x40, 0x43, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x43, 0x31, 0x7b }, { vshufi32x4 zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x43, 0x72, 0x7f, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x43, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x43, 0x72, 0x80, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x43, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshufi32x4 zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x43, 0x72, 0x7f, 0x7b }, { vshufi32x4 zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x43, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vshufi32x4 zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x43, 0x72, 0x80, 0x7b }, { vshufi32x4 zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x43, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vshufi32x4 zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x43, 0xf4, 0xab }, { vshufi64x2 zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x43, 0xf4, 0xab }, { vshufi64x2 zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x43, 0xf4, 0xab }, { vshufi64x2 zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x43, 0xf4, 0x7b }, { vshufi64x2 zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x43, 0x31, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x40, 0x43, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x43, 0x31, 0x7b }, { vshufi64x2 zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x43, 0x72, 0x7f, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x43, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x43, 0x72, 0x80, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x43, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vshufi64x2 zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x43, 0x72, 0x7f, 0x7b }, { vshufi64x2 zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x43, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vshufi64x2 zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x43, 0x72, 0x80, 0x7b }, { vshufi64x2 zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x43, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vshufi64x2 zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x36, 0xf4 }, { vpermq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x36, 0xf4 }, { vpermq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x36, 0xf4 }, { vpermq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x36, 0x31 }, { vpermq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x36, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x36, 0x31 }, { vpermq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x36, 0x72, 0x7f }, { vpermq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x36, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x36, 0x72, 0x80 }, { vpermq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x36, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x36, 0x72, 0x7f }, { vpermq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x36, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x36, 0x72, 0x80 }, { vpermq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x36, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x16, 0xf4 }, { vpermpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x16, 0xf4 }, { vpermpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x16, 0xf4 }, { vpermpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x16, 0x31 }, { vpermpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x16, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x16, 0x31 }, { vpermpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x16, 0x72, 0x7f }, { vpermpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x16, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x16, 0x72, 0x80 }, { vpermpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x16, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x16, 0x72, 0x7f }, { vpermpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x16, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x16, 0x72, 0x80 }, { vpermpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x16, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x7e, 0xf4 }, { vpermt2d zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x7e, 0xf4 }, { vpermt2d zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x7e, 0xf4 }, { vpermt2d zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7e, 0x31 }, { vpermt2d zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x7e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermt2d zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7e, 0x31 }, { vpermt2d zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7e, 0x72, 0x7f }, { vpermt2d zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermt2d zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7e, 0x72, 0x80 }, { vpermt2d zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermt2d zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7e, 0x72, 0x7f }, { vpermt2d zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7e, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermt2d zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7e, 0x72, 0x80 }, { vpermt2d zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7e, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermt2d zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x7e, 0xf4 }, { vpermt2q zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x7e, 0xf4 }, { vpermt2q zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x7e, 0xf4 }, { vpermt2q zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7e, 0x31 }, { vpermt2q zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x7e, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermt2q zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7e, 0x31 }, { vpermt2q zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7e, 0x72, 0x7f }, { vpermt2q zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7e, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermt2q zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7e, 0x72, 0x80 }, { vpermt2q zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7e, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermt2q zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7e, 0x72, 0x7f }, { vpermt2q zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7e, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermt2q zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7e, 0x72, 0x80 }, { vpermt2q zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7e, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermt2q zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x7f, 0xf4 }, { vpermt2ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x7f, 0xf4 }, { vpermt2ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x7f, 0xf4 }, { vpermt2ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7f, 0x31 }, { vpermt2ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermt2ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7f, 0x31 }, { vpermt2ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7f, 0x72, 0x7f }, { vpermt2ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermt2ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7f, 0x72, 0x80 }, { vpermt2ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermt2ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7f, 0x72, 0x7f }, { vpermt2ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7f, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermt2ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7f, 0x72, 0x80 }, { vpermt2ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x7f, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermt2ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x7f, 0xf4 }, { vpermt2pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x7f, 0xf4 }, { vpermt2pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x7f, 0xf4 }, { vpermt2pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7f, 0x31 }, { vpermt2pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermt2pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7f, 0x31 }, { vpermt2pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7f, 0x72, 0x7f }, { vpermt2pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermt2pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7f, 0x72, 0x80 }, { vpermt2pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermt2pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7f, 0x72, 0x7f }, { vpermt2pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7f, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermt2pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7f, 0x72, 0x80 }, { vpermt2pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x7f, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermt2pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x03, 0xf4, 0xab }, { valignq zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x03, 0xf4, 0xab }, { valignq zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x03, 0xf4, 0xab }, { valignq zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x03, 0xf4, 0x7b }, { valignq zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x03, 0x31, 0x7b }, { valignq zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x40, 0x03, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { valignq zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x03, 0x31, 0x7b }, { valignq zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x03, 0x72, 0x7f, 0x7b }, { valignq zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x03, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { valignq zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x03, 0x72, 0x80, 0x7b }, { valignq zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x03, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { valignq zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x03, 0x72, 0x7f, 0x7b }, { valignq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x03, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { valignq zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x03, 0x72, 0x80, 0x7b }, { valignq zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x03, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { valignq zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x91, 0x7f, 0x08, 0x79, 0xc6 }, { vcvtsd2usi eax,xmm30 }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x79, 0xc6 }, { vcvtsd2usi eax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x58, 0x79, 0xc6 }, { vcvtsd2usi eax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x38, 0x79, 0xc6 }, { vcvtsd2usi eax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x78, 0x79, 0xc6 }, { vcvtsd2usi eax,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x01 }, { vcvtsd2usi eax,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7f, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2usi eax,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x42, 0x7f }, { vcvtsd2usi eax,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2usi eax,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x42, 0x80 }, { vcvtsd2usi eax,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2usi eax,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x7f, 0x08, 0x79, 0xee }, { vcvtsd2usi ebp,xmm30 }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x79, 0xee }, { vcvtsd2usi ebp,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x58, 0x79, 0xee }, { vcvtsd2usi ebp,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x38, 0x79, 0xee }, { vcvtsd2usi ebp,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7f, 0x78, 0x79, 0xee }, { vcvtsd2usi ebp,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x29 }, { vcvtsd2usi ebp,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7f, 0x08, 0x79, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2usi ebp,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x6a, 0x7f }, { vcvtsd2usi ebp,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2usi ebp,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0x6a, 0x80 }, { vcvtsd2usi ebp,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x79, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2usi ebp,QWORD [rdx-0x408] }
+testcase { 0x62, 0x11, 0x7f, 0x08, 0x79, 0xee }, { vcvtsd2usi r13d,xmm30 }
+testcase { 0x62, 0x11, 0x7f, 0x18, 0x79, 0xee }, { vcvtsd2usi r13d,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x58, 0x79, 0xee }, { vcvtsd2usi r13d,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x38, 0x79, 0xee }, { vcvtsd2usi r13d,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0x7f, 0x78, 0x79, 0xee }, { vcvtsd2usi r13d,xmm30,{rz-sae} }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x79, 0x29 }, { vcvtsd2usi r13d,QWORD [rcx] }
+testcase { 0x62, 0x31, 0x7f, 0x08, 0x79, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2usi r13d,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x79, 0x6a, 0x7f }, { vcvtsd2usi r13d,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x79, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2usi r13d,QWORD [rdx+0x400] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x79, 0x6a, 0x80 }, { vcvtsd2usi r13d,QWORD [rdx-0x400] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x79, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2usi r13d,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0xff, 0x08, 0x79, 0xc6 }, { vcvtsd2usi rax,xmm30 }
+testcase { 0x62, 0x91, 0xff, 0x18, 0x79, 0xc6 }, { vcvtsd2usi rax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0xff, 0x58, 0x79, 0xc6 }, { vcvtsd2usi rax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0xff, 0x38, 0x79, 0xc6 }, { vcvtsd2usi rax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0xff, 0x78, 0x79, 0xc6 }, { vcvtsd2usi rax,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x79, 0x01 }, { vcvtsd2usi rax,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0xff, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2usi rax,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x79, 0x42, 0x7f }, { vcvtsd2usi rax,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x79, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2usi rax,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x79, 0x42, 0x80 }, { vcvtsd2usi rax,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x79, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2usi rax,QWORD [rdx-0x408] }
+testcase { 0x62, 0x11, 0xff, 0x08, 0x79, 0xc6 }, { vcvtsd2usi r8,xmm30 }
+testcase { 0x62, 0x11, 0xff, 0x18, 0x79, 0xc6 }, { vcvtsd2usi r8,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0xff, 0x58, 0x79, 0xc6 }, { vcvtsd2usi r8,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0xff, 0x38, 0x79, 0xc6 }, { vcvtsd2usi r8,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0xff, 0x78, 0x79, 0xc6 }, { vcvtsd2usi r8,xmm30,{rz-sae} }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x79, 0x01 }, { vcvtsd2usi r8,QWORD [rcx] }
+testcase { 0x62, 0x31, 0xff, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtsd2usi r8,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x79, 0x42, 0x7f }, { vcvtsd2usi r8,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x79, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvtsd2usi r8,QWORD [rdx+0x400] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x79, 0x42, 0x80 }, { vcvtsd2usi r8,QWORD [rdx-0x400] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x79, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvtsd2usi r8,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x7e, 0x08, 0x79, 0xc6 }, { vcvtss2usi eax,xmm30 }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x79, 0xc6 }, { vcvtss2usi eax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x58, 0x79, 0xc6 }, { vcvtss2usi eax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x38, 0x79, 0xc6 }, { vcvtss2usi eax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x78, 0x79, 0xc6 }, { vcvtss2usi eax,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x01 }, { vcvtss2usi eax,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7e, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2usi eax,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x42, 0x7f }, { vcvtss2usi eax,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2usi eax,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x42, 0x80 }, { vcvtss2usi eax,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2usi eax,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x7e, 0x08, 0x79, 0xee }, { vcvtss2usi ebp,xmm30 }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x79, 0xee }, { vcvtss2usi ebp,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x58, 0x79, 0xee }, { vcvtss2usi ebp,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x38, 0x79, 0xee }, { vcvtss2usi ebp,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0x7e, 0x78, 0x79, 0xee }, { vcvtss2usi ebp,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x29 }, { vcvtss2usi ebp,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7e, 0x08, 0x79, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2usi ebp,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x6a, 0x7f }, { vcvtss2usi ebp,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2usi ebp,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0x6a, 0x80 }, { vcvtss2usi ebp,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x79, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2usi ebp,DWORD [rdx-0x204] }
+testcase { 0x62, 0x11, 0x7e, 0x08, 0x79, 0xee }, { vcvtss2usi r13d,xmm30 }
+testcase { 0x62, 0x11, 0x7e, 0x18, 0x79, 0xee }, { vcvtss2usi r13d,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x58, 0x79, 0xee }, { vcvtss2usi r13d,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x38, 0x79, 0xee }, { vcvtss2usi r13d,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0x7e, 0x78, 0x79, 0xee }, { vcvtss2usi r13d,xmm30,{rz-sae} }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x79, 0x29 }, { vcvtss2usi r13d,DWORD [rcx] }
+testcase { 0x62, 0x31, 0x7e, 0x08, 0x79, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2usi r13d,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x79, 0x6a, 0x7f }, { vcvtss2usi r13d,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x79, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2usi r13d,DWORD [rdx+0x200] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x79, 0x6a, 0x80 }, { vcvtss2usi r13d,DWORD [rdx-0x200] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x79, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2usi r13d,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0xfe, 0x08, 0x79, 0xc6 }, { vcvtss2usi rax,xmm30 }
+testcase { 0x62, 0x91, 0xfe, 0x18, 0x79, 0xc6 }, { vcvtss2usi rax,xmm30,{rn-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x58, 0x79, 0xc6 }, { vcvtss2usi rax,xmm30,{ru-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x38, 0x79, 0xc6 }, { vcvtss2usi rax,xmm30,{rd-sae} }
+testcase { 0x62, 0x91, 0xfe, 0x78, 0x79, 0xc6 }, { vcvtss2usi rax,xmm30,{rz-sae} }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x79, 0x01 }, { vcvtss2usi rax,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0xfe, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2usi rax,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x79, 0x42, 0x7f }, { vcvtss2usi rax,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x79, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2usi rax,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x79, 0x42, 0x80 }, { vcvtss2usi rax,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x79, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2usi rax,DWORD [rdx-0x204] }
+testcase { 0x62, 0x11, 0xfe, 0x08, 0x79, 0xc6 }, { vcvtss2usi r8,xmm30 }
+testcase { 0x62, 0x11, 0xfe, 0x18, 0x79, 0xc6 }, { vcvtss2usi r8,xmm30,{rn-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x58, 0x79, 0xc6 }, { vcvtss2usi r8,xmm30,{ru-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x38, 0x79, 0xc6 }, { vcvtss2usi r8,xmm30,{rd-sae} }
+testcase { 0x62, 0x11, 0xfe, 0x78, 0x79, 0xc6 }, { vcvtss2usi r8,xmm30,{rz-sae} }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x79, 0x01 }, { vcvtss2usi r8,DWORD [rcx] }
+testcase { 0x62, 0x31, 0xfe, 0x08, 0x79, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtss2usi r8,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x79, 0x42, 0x7f }, { vcvtss2usi r8,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x79, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvtss2usi r8,DWORD [rdx+0x200] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x79, 0x42, 0x80 }, { vcvtss2usi r8,DWORD [rdx-0x200] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x79, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvtss2usi r8,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,eax }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0xf5 }, { vcvtusi2sd xmm30,xmm29,ebp }
+testcase { 0x62, 0x41, 0x17, 0x00, 0x7b, 0xf5 }, { vcvtusi2sd xmm30,xmm29,r13d }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0x31 }, { vcvtusi2sd xmm30,xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x17, 0x00, 0x7b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtusi2sd xmm30,xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0x72, 0x7f }, { vcvtusi2sd xmm30,xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtusi2sd xmm30,xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0x72, 0x80 }, { vcvtusi2sd xmm30,xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x17, 0x00, 0x7b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtusi2sd xmm30,xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,rax }
+testcase { 0x62, 0x61, 0x97, 0x10, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rn-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x50, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{ru-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x30, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rd-sae},rax }
+testcase { 0x62, 0x61, 0x97, 0x70, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rz-sae},rax }
+testcase { 0x62, 0x41, 0x97, 0x00, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,r8 }
+testcase { 0x62, 0x41, 0x97, 0x10, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rn-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x50, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{ru-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x30, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rd-sae},r8 }
+testcase { 0x62, 0x41, 0x97, 0x70, 0x7b, 0xf0 }, { vcvtusi2sd xmm30,xmm29,{rz-sae},r8 }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0x31 }, { vcvtusi2sd xmm30,xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x97, 0x00, 0x7b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtusi2sd xmm30,xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0x72, 0x7f }, { vcvtusi2sd xmm30,xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtusi2sd xmm30,xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0x72, 0x80 }, { vcvtusi2sd xmm30,xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x97, 0x00, 0x7b, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtusi2sd xmm30,xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,eax }
+testcase { 0x62, 0x61, 0x16, 0x10, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rn-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x50, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{ru-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x30, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rd-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x70, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rz-sae},eax }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,ebp }
+testcase { 0x62, 0x61, 0x16, 0x10, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rn-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x50, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{ru-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x30, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rd-sae},ebp }
+testcase { 0x62, 0x61, 0x16, 0x70, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rz-sae},ebp }
+testcase { 0x62, 0x41, 0x16, 0x00, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,r13d }
+testcase { 0x62, 0x41, 0x16, 0x10, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rn-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x50, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{ru-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x30, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rd-sae},r13d }
+testcase { 0x62, 0x41, 0x16, 0x70, 0x7b, 0xf5 }, { vcvtusi2ss xmm30,xmm29,{rz-sae},r13d }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0x31 }, { vcvtusi2ss xmm30,xmm29,DWORD [rcx] }
+testcase { 0x62, 0x21, 0x16, 0x00, 0x7b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtusi2ss xmm30,xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0x72, 0x7f }, { vcvtusi2ss xmm30,xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvtusi2ss xmm30,xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0x72, 0x80 }, { vcvtusi2ss xmm30,xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x61, 0x16, 0x00, 0x7b, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvtusi2ss xmm30,xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,rax }
+testcase { 0x62, 0x61, 0x96, 0x10, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rn-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x50, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{ru-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x30, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rd-sae},rax }
+testcase { 0x62, 0x61, 0x96, 0x70, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rz-sae},rax }
+testcase { 0x62, 0x41, 0x96, 0x00, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,r8 }
+testcase { 0x62, 0x41, 0x96, 0x10, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rn-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x50, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{ru-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x30, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rd-sae},r8 }
+testcase { 0x62, 0x41, 0x96, 0x70, 0x7b, 0xf0 }, { vcvtusi2ss xmm30,xmm29,{rz-sae},r8 }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0x31 }, { vcvtusi2ss xmm30,xmm29,QWORD [rcx] }
+testcase { 0x62, 0x21, 0x96, 0x00, 0x7b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvtusi2ss xmm30,xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0x72, 0x7f }, { vcvtusi2ss xmm30,xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvtusi2ss xmm30,xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0x72, 0x80 }, { vcvtusi2ss xmm30,xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x61, 0x96, 0x00, 0x7b, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvtusi2ss xmm30,xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x2c, 0xf4 }, { vscalefpd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x2c, 0xf4 }, { vscalefpd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x2c, 0xf4 }, { vscalefpd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x10, 0x2c, 0xf4 }, { vscalefpd zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x50, 0x2c, 0xf4 }, { vscalefpd zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x30, 0x2c, 0xf4 }, { vscalefpd zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x70, 0x2c, 0xf4 }, { vscalefpd zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x2c, 0x31 }, { vscalefpd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x2c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vscalefpd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x2c, 0x31 }, { vscalefpd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x2c, 0x72, 0x7f }, { vscalefpd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x2c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vscalefpd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x2c, 0x72, 0x80 }, { vscalefpd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x2c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vscalefpd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x2c, 0x72, 0x7f }, { vscalefpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x2c, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vscalefpd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x2c, 0x72, 0x80 }, { vscalefpd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x2c, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vscalefpd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x2c, 0xf4 }, { vscalefps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x2c, 0xf4 }, { vscalefps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x2c, 0xf4 }, { vscalefps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x10, 0x2c, 0xf4 }, { vscalefps zmm30,zmm29,zmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x50, 0x2c, 0xf4 }, { vscalefps zmm30,zmm29,zmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x30, 0x2c, 0xf4 }, { vscalefps zmm30,zmm29,zmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x70, 0x2c, 0xf4 }, { vscalefps zmm30,zmm29,zmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x2c, 0x31 }, { vscalefps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x2c, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vscalefps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x2c, 0x31 }, { vscalefps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x2c, 0x72, 0x7f }, { vscalefps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x2c, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vscalefps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x2c, 0x72, 0x80 }, { vscalefps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x2c, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vscalefps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x2c, 0x72, 0x7f }, { vscalefps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x2c, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vscalefps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x2c, 0x72, 0x80 }, { vscalefps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x2c, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vscalefps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x07, 0x2d, 0xf4 }, { vscalefsd xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x87, 0x2d, 0xf4 }, { vscalefsd xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x95, 0x17, 0x2d, 0xf4 }, { vscalefsd xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x95, 0x57, 0x2d, 0xf4 }, { vscalefsd xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x95, 0x37, 0x2d, 0xf4 }, { vscalefsd xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x95, 0x77, 0x2d, 0xf4 }, { vscalefsd xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x2d, 0x31 }, { vscalefsd xmm30{k7},xmm29,QWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x07, 0x2d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vscalefsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x2d, 0x72, 0x7f }, { vscalefsd xmm30{k7},xmm29,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x2d, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vscalefsd xmm30{k7},xmm29,QWORD [rdx+0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x2d, 0x72, 0x80 }, { vscalefsd xmm30{k7},xmm29,QWORD [rdx-0x400] }
+testcase { 0x62, 0x62, 0x95, 0x07, 0x2d, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vscalefsd xmm30{k7},xmm29,QWORD [rdx-0x408] }
+testcase { 0x62, 0x02, 0x15, 0x07, 0x2d, 0xf4 }, { vscalefss xmm30{k7},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x87, 0x2d, 0xf4 }, { vscalefss xmm30{k7}{z},xmm29,xmm28 }
+testcase { 0x62, 0x02, 0x15, 0x17, 0x2d, 0xf4 }, { vscalefss xmm30{k7},xmm29,xmm28,{rn-sae} }
+testcase { 0x62, 0x02, 0x15, 0x57, 0x2d, 0xf4 }, { vscalefss xmm30{k7},xmm29,xmm28,{ru-sae} }
+testcase { 0x62, 0x02, 0x15, 0x37, 0x2d, 0xf4 }, { vscalefss xmm30{k7},xmm29,xmm28,{rd-sae} }
+testcase { 0x62, 0x02, 0x15, 0x77, 0x2d, 0xf4 }, { vscalefss xmm30{k7},xmm29,xmm28,{rz-sae} }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x2d, 0x31 }, { vscalefss xmm30{k7},xmm29,DWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x07, 0x2d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vscalefss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x2d, 0x72, 0x7f }, { vscalefss xmm30{k7},xmm29,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x2d, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vscalefss xmm30{k7},xmm29,DWORD [rdx+0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x2d, 0x72, 0x80 }, { vscalefss xmm30{k7},xmm29,DWORD [rdx-0x200] }
+testcase { 0x62, 0x62, 0x15, 0x07, 0x2d, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vscalefss xmm30{k7},xmm29,DWORD [rdx-0x204] }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x54, 0xf4, 0xab }, { vfixupimmps zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x47, 0x54, 0xf4, 0xab }, { vfixupimmps zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0xc7, 0x54, 0xf4, 0xab }, { vfixupimmps zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x10, 0x54, 0xf4, 0xab }, { vfixupimmps zmm30,zmm29,zmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x15, 0x40, 0x54, 0xf4, 0x7b }, { vfixupimmps zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x03, 0x15, 0x10, 0x54, 0xf4, 0x7b }, { vfixupimmps zmm30,zmm29,zmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x54, 0x31, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x40, 0x54, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x54, 0x31, 0x7b }, { vfixupimmps zmm30,zmm29,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x54, 0x72, 0x7f, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x54, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x54, 0x72, 0x80, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x40, 0x54, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vfixupimmps zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x54, 0x72, 0x7f, 0x7b }, { vfixupimmps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x54, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vfixupimmps zmm30,zmm29,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x54, 0x72, 0x80, 0x7b }, { vfixupimmps zmm30,zmm29,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x50, 0x54, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vfixupimmps zmm30,zmm29,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x54, 0xf4, 0xab }, { vfixupimmpd zmm30,zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x47, 0x54, 0xf4, 0xab }, { vfixupimmpd zmm30{k7},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0xc7, 0x54, 0xf4, 0xab }, { vfixupimmpd zmm30{k7}{z},zmm29,zmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x10, 0x54, 0xf4, 0xab }, { vfixupimmpd zmm30,zmm29,zmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x95, 0x40, 0x54, 0xf4, 0x7b }, { vfixupimmpd zmm30,zmm29,zmm28,0x7b }
+testcase { 0x62, 0x03, 0x95, 0x10, 0x54, 0xf4, 0x7b }, { vfixupimmpd zmm30,zmm29,zmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x54, 0x31, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x40, 0x54, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x54, 0x31, 0x7b }, { vfixupimmpd zmm30,zmm29,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x54, 0x72, 0x7f, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x54, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x54, 0x72, 0x80, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x40, 0x54, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vfixupimmpd zmm30,zmm29,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x54, 0x72, 0x7f, 0x7b }, { vfixupimmpd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x54, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vfixupimmpd zmm30,zmm29,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x54, 0x72, 0x80, 0x7b }, { vfixupimmpd zmm30,zmm29,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x50, 0x54, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vfixupimmpd zmm30,zmm29,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x55, 0xf4, 0xab }, { vfixupimmss xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x87, 0x55, 0xf4, 0xab }, { vfixupimmss xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x55, 0xf4, 0xab }, { vfixupimmss xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x55, 0xf4, 0x7b }, { vfixupimmss xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x55, 0xf4, 0x7b }, { vfixupimmss xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x55, 0x31, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x07, 0x55, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x55, 0x72, 0x7f, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rdx+0x1fc],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x55, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rdx+0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x55, 0x72, 0x80, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rdx-0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x55, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vfixupimmss xmm30{k7},xmm29,DWORD [rdx-0x204],0x7b }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x55, 0xf4, 0xab }, { vfixupimmsd xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x87, 0x55, 0xf4, 0xab }, { vfixupimmsd xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x55, 0xf4, 0xab }, { vfixupimmsd xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x55, 0xf4, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x55, 0xf4, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x55, 0x31, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x07, 0x55, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x55, 0x72, 0x7f, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rdx+0x3f8],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x55, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rdx+0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x55, 0x72, 0x80, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rdx-0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x55, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vfixupimmsd xmm30{k7},xmm29,QWORD [rdx-0x408],0x7b }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xf5, 0xab }, { vpslld zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x72, 0xf5, 0xab }, { vpslld zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0xc7, 0x72, 0xf5, 0xab }, { vpslld zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xf5, 0x7b }, { vpslld zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x31, 0x7b }, { vpslld zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x72, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpslld zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x31, 0x7b }, { vpslld zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x72, 0x7f, 0x7b }, { vpslld zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpslld zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x72, 0x80, 0x7b }, { vpslld zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpslld zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x72, 0x7f, 0x7b }, { vpslld zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpslld zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x72, 0x80, 0x7b }, { vpslld zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpslld zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x73, 0xf5, 0xab }, { vpsllq zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0x73, 0xf5, 0xab }, { vpsllq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0xc7, 0x73, 0xf5, 0xab }, { vpsllq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x73, 0xf5, 0x7b }, { vpsllq zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x31, 0x7b }, { vpsllq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0x73, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpsllq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x31, 0x7b }, { vpsllq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x72, 0x7f, 0x7b }, { vpsllq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpsllq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0x72, 0x80, 0x7b }, { vpsllq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x73, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpsllq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x72, 0x7f, 0x7b }, { vpsllq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpsllq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0x72, 0x80, 0x7b }, { vpsllq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x73, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpsllq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xe5, 0xab }, { vpsrad zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x72, 0xe5, 0xab }, { vpsrad zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0xc7, 0x72, 0xe5, 0xab }, { vpsrad zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xe5, 0x7b }, { vpsrad zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x21, 0x7b }, { vpsrad zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x72, 0xa4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpsrad zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x21, 0x7b }, { vpsrad zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x62, 0x7f, 0x7b }, { vpsrad zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0xa2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpsrad zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x62, 0x80, 0x7b }, { vpsrad zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0xa2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpsrad zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x62, 0x7f, 0x7b }, { vpsrad zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0xa2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vpsrad zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x62, 0x80, 0x7b }, { vpsrad zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0xa2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vpsrad zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xe5, 0xab }, { vpsraq zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0x72, 0xe5, 0xab }, { vpsraq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0xc7, 0x72, 0xe5, 0xab }, { vpsraq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xe5, 0x7b }, { vpsraq zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x21, 0x7b }, { vpsraq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0x72, 0xa4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vpsraq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x21, 0x7b }, { vpsraq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x62, 0x7f, 0x7b }, { vpsraq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0xa2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vpsraq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x62, 0x80, 0x7b }, { vpsraq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0xa2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vpsraq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x62, 0x7f, 0x7b }, { vpsraq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0xa2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vpsraq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x62, 0x80, 0x7b }, { vpsraq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0xa2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vpsraq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x15, 0xf4 }, { vprolvd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x15, 0xf4 }, { vprolvd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x15, 0xf4 }, { vprolvd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x15, 0x31 }, { vprolvd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x15, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vprolvd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x15, 0x31 }, { vprolvd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x15, 0x72, 0x7f }, { vprolvd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x15, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vprolvd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x15, 0x72, 0x80 }, { vprolvd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x15, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vprolvd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x15, 0x72, 0x7f }, { vprolvd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x15, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vprolvd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x15, 0x72, 0x80 }, { vprolvd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x15, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vprolvd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xcd, 0xab }, { vprold zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x72, 0xcd, 0xab }, { vprold zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0xc7, 0x72, 0xcd, 0xab }, { vprold zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xcd, 0x7b }, { vprold zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x09, 0x7b }, { vprold zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x72, 0x8c, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vprold zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x09, 0x7b }, { vprold zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x4a, 0x7f, 0x7b }, { vprold zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x8a, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vprold zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x4a, 0x80, 0x7b }, { vprold zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x8a, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vprold zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x4a, 0x7f, 0x7b }, { vprold zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x8a, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vprold zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x4a, 0x80, 0x7b }, { vprold zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x8a, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vprold zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x15, 0xf4 }, { vprolvq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x15, 0xf4 }, { vprolvq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x15, 0xf4 }, { vprolvq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x15, 0x31 }, { vprolvq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x15, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vprolvq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x15, 0x31 }, { vprolvq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x15, 0x72, 0x7f }, { vprolvq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x15, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vprolvq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x15, 0x72, 0x80 }, { vprolvq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x15, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vprolvq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x15, 0x72, 0x7f }, { vprolvq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x15, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vprolvq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x15, 0x72, 0x80 }, { vprolvq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x15, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vprolvq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xcd, 0xab }, { vprolq zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0x72, 0xcd, 0xab }, { vprolq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0xc7, 0x72, 0xcd, 0xab }, { vprolq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xcd, 0x7b }, { vprolq zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x09, 0x7b }, { vprolq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0x72, 0x8c, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vprolq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x09, 0x7b }, { vprolq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x4a, 0x7f, 0x7b }, { vprolq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x8a, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vprolq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x4a, 0x80, 0x7b }, { vprolq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x8a, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vprolq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x4a, 0x7f, 0x7b }, { vprolq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x8a, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vprolq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x4a, 0x80, 0x7b }, { vprolq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x8a, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vprolq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x14, 0xf4 }, { vprorvd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x14, 0xf4 }, { vprorvd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x14, 0xf4 }, { vprorvd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x14, 0x31 }, { vprorvd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x14, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vprorvd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x14, 0x31 }, { vprorvd zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x14, 0x72, 0x7f }, { vprorvd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x14, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vprorvd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x14, 0x72, 0x80 }, { vprorvd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x14, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vprorvd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x14, 0x72, 0x7f }, { vprorvd zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x14, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vprorvd zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x14, 0x72, 0x80 }, { vprorvd zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x14, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vprorvd zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xc5, 0xab }, { vprord zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x47, 0x72, 0xc5, 0xab }, { vprord zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0xc7, 0x72, 0xc5, 0xab }, { vprord zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x0d, 0x40, 0x72, 0xc5, 0x7b }, { vprord zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x01, 0x7b }, { vprord zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x0d, 0x40, 0x72, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vprord zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x01, 0x7b }, { vprord zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x42, 0x7f, 0x7b }, { vprord zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x82, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vprord zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x42, 0x80, 0x7b }, { vprord zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x40, 0x72, 0x82, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vprord zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x42, 0x7f, 0x7b }, { vprord zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x82, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vprord zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x42, 0x80, 0x7b }, { vprord zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0xf1, 0x0d, 0x50, 0x72, 0x82, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vprord zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x14, 0xf4 }, { vprorvq zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x14, 0xf4 }, { vprorvq zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x14, 0xf4 }, { vprorvq zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x14, 0x31 }, { vprorvq zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x14, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vprorvq zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x14, 0x31 }, { vprorvq zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x14, 0x72, 0x7f }, { vprorvq zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x14, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vprorvq zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x14, 0x72, 0x80 }, { vprorvq zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x14, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vprorvq zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x14, 0x72, 0x7f }, { vprorvq zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x14, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vprorvq zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x14, 0x72, 0x80 }, { vprorvq zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x14, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vprorvq zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xc5, 0xab }, { vprorq zmm30,zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x47, 0x72, 0xc5, 0xab }, { vprorq zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0xc7, 0x72, 0xc5, 0xab }, { vprorq zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x91, 0x8d, 0x40, 0x72, 0xc5, 0x7b }, { vprorq zmm30,zmm29,0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x01, 0x7b }, { vprorq zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0xb1, 0x8d, 0x40, 0x72, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vprorq zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x01, 0x7b }, { vprorq zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x42, 0x7f, 0x7b }, { vprorq zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x82, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vprorq zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x42, 0x80, 0x7b }, { vprorq zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x40, 0x72, 0x82, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vprorq zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x42, 0x7f, 0x7b }, { vprorq zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x82, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vprorq zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x42, 0x80, 0x7b }, { vprorq zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0xf1, 0x8d, 0x50, 0x72, 0x82, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vprorq zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x09, 0xf5, 0xab }, { vrndscalepd zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x4f, 0x09, 0xf5, 0xab }, { vrndscalepd zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0xcf, 0x09, 0xf5, 0xab }, { vrndscalepd zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0xfd, 0x18, 0x09, 0xf5, 0xab }, { vrndscalepd zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x03, 0xfd, 0x48, 0x09, 0xf5, 0x7b }, { vrndscalepd zmm30,zmm29,0x7b }
+testcase { 0x62, 0x03, 0xfd, 0x18, 0x09, 0xf5, 0x7b }, { vrndscalepd zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x09, 0x31, 0x7b }, { vrndscalepd zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x09, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vrndscalepd zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x09, 0x31, 0x7b }, { vrndscalepd zmm30,QWORD [rcx]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x09, 0x72, 0x7f, 0x7b }, { vrndscalepd zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x09, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vrndscalepd zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x09, 0x72, 0x80, 0x7b }, { vrndscalepd zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x09, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vrndscalepd zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x09, 0x72, 0x7f, 0x7b }, { vrndscalepd zmm30,QWORD [rdx+0x3f8]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x09, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vrndscalepd zmm30,QWORD [rdx+0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x09, 0x72, 0x80, 0x7b }, { vrndscalepd zmm30,QWORD [rdx-0x400]{1to8},0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x58, 0x09, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vrndscalepd zmm30,QWORD [rdx-0x408]{1to8},0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x08, 0xf5, 0xab }, { vrndscaleps zmm30,zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x4f, 0x08, 0xf5, 0xab }, { vrndscaleps zmm30{k7},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0xcf, 0x08, 0xf5, 0xab }, { vrndscaleps zmm30{k7}{z},zmm29,0xab }
+testcase { 0x62, 0x03, 0x7d, 0x18, 0x08, 0xf5, 0xab }, { vrndscaleps zmm30,zmm29,{sae},0xab }
+testcase { 0x62, 0x03, 0x7d, 0x48, 0x08, 0xf5, 0x7b }, { vrndscaleps zmm30,zmm29,0x7b }
+testcase { 0x62, 0x03, 0x7d, 0x18, 0x08, 0xf5, 0x7b }, { vrndscaleps zmm30,zmm29,{sae},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x08, 0x31, 0x7b }, { vrndscaleps zmm30,ZWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x08, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vrndscaleps zmm30,ZWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x08, 0x31, 0x7b }, { vrndscaleps zmm30,DWORD [rcx]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x08, 0x72, 0x7f, 0x7b }, { vrndscaleps zmm30,ZWORD [rdx+0x1fc0],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x08, 0xb2, 0x00, 0x20, 0x00, 0x00, 0x7b }, { vrndscaleps zmm30,ZWORD [rdx+0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x08, 0x72, 0x80, 0x7b }, { vrndscaleps zmm30,ZWORD [rdx-0x2000],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x08, 0xb2, 0xc0, 0xdf, 0xff, 0xff, 0x7b }, { vrndscaleps zmm30,ZWORD [rdx-0x2040],0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x08, 0x72, 0x7f, 0x7b }, { vrndscaleps zmm30,DWORD [rdx+0x1fc]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x08, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vrndscaleps zmm30,DWORD [rdx+0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x08, 0x72, 0x80, 0x7b }, { vrndscaleps zmm30,DWORD [rdx-0x200]{1to16},0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x58, 0x08, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vrndscaleps zmm30,DWORD [rdx-0x204]{1to16},0x7b }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x0b, 0xf4, 0xab }, { vrndscalesd xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x87, 0x0b, 0xf4, 0xab }, { vrndscalesd xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x0b, 0xf4, 0xab }, { vrndscalesd xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x95, 0x07, 0x0b, 0xf4, 0x7b }, { vrndscalesd xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x95, 0x17, 0x0b, 0xf4, 0x7b }, { vrndscalesd xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x0b, 0x31, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x95, 0x07, 0x0b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x0b, 0x72, 0x7f, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rdx+0x3f8],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x0b, 0xb2, 0x00, 0x04, 0x00, 0x00, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rdx+0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x0b, 0x72, 0x80, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rdx-0x400],0x7b }
+testcase { 0x62, 0x63, 0x95, 0x07, 0x0b, 0xb2, 0xf8, 0xfb, 0xff, 0xff, 0x7b }, { vrndscalesd xmm30{k7},xmm29,QWORD [rdx-0x408],0x7b }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x0a, 0xf4, 0xab }, { vrndscaless xmm30{k7},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x87, 0x0a, 0xf4, 0xab }, { vrndscaless xmm30{k7}{z},xmm29,xmm28,0xab }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x0a, 0xf4, 0xab }, { vrndscaless xmm30{k7},xmm29,xmm28,{sae},0xab }
+testcase { 0x62, 0x03, 0x15, 0x07, 0x0a, 0xf4, 0x7b }, { vrndscaless xmm30{k7},xmm29,xmm28,0x7b }
+testcase { 0x62, 0x03, 0x15, 0x17, 0x0a, 0xf4, 0x7b }, { vrndscaless xmm30{k7},xmm29,xmm28,{sae},0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x0a, 0x31, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rcx],0x7b }
+testcase { 0x62, 0x23, 0x15, 0x07, 0x0a, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rax+r14*8+0x123],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x0a, 0x72, 0x7f, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rdx+0x1fc],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x0a, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rdx+0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x0a, 0x72, 0x80, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rdx-0x200],0x7b }
+testcase { 0x62, 0x63, 0x15, 0x07, 0x0a, 0xb2, 0xfc, 0xfd, 0xff, 0xff, 0x7b }, { vrndscaless xmm30{k7},xmm29,DWORD [rdx-0x204],0x7b }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8b, 0x31 }, { vpcompressq ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x4f, 0x8b, 0x31 }, { vpcompressq ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0xfd, 0x48, 0x8b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpcompressq ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8b, 0x72, 0x7f }, { vpcompressq ZWORD [rdx+0x3f8],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8b, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpcompressq ZWORD [rdx+0x400],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8b, 0x72, 0x80 }, { vpcompressq ZWORD [rdx-0x400],zmm30 }
+testcase { 0x62, 0x62, 0xfd, 0x48, 0x8b, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpcompressq ZWORD [rdx-0x408],zmm30 }
+testcase { 0x62, 0x02, 0xfd, 0x48, 0x8b, 0xee }, { vpcompressq zmm30,zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0x4f, 0x8b, 0xee }, { vpcompressq zmm30{k7},zmm29 }
+testcase { 0x62, 0x02, 0xfd, 0xcf, 0x8b, 0xee }, { vpcompressq zmm30{k7}{z},zmm29 }
+testcase { 0xc5, 0xcc, 0x41, 0xef }, { kandw k5,k6,k7 }
+testcase { 0xc5, 0xcc, 0x42, 0xef }, { kandnw k5,k6,k7 }
+testcase { 0xc5, 0xcc, 0x45, 0xef }, { korw k5,k6,k7 }
+testcase { 0xc5, 0xcc, 0x46, 0xef }, { kxnorw k5,k6,k7 }
+testcase { 0xc5, 0xcc, 0x47, 0xef }, { kxorw k5,k6,k7 }
+testcase { 0xc5, 0xf8, 0x44, 0xee }, { knotw k5,k6 }
+testcase { 0xc5, 0xf8, 0x98, 0xee }, { kortestw k5,k6 }
+testcase { 0xc4, 0xe3, 0xf9, 0x30, 0xee, 0xab }, { kshiftrw k5,k6,0xab }
+testcase { 0xc4, 0xe3, 0xf9, 0x30, 0xee, 0x7b }, { kshiftrw k5,k6,0x7b }
+testcase { 0xc4, 0xe3, 0xf9, 0x32, 0xee, 0xab }, { kshiftlw k5,k6,0xab }
+testcase { 0xc4, 0xe3, 0xf9, 0x32, 0xee, 0x7b }, { kshiftlw k5,k6,0x7b }
+testcase { 0xc5, 0xf8, 0x90, 0xee }, { kmovw k5,k6 }
+testcase { 0xc5, 0xf8, 0x90, 0x29 }, { kmovw k5,WORD [rcx] }
+testcase { 0xc4, 0xa1, 0x78, 0x90, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { kmovw k5,WORD [rax+r14*8+0x123] }
+testcase { 0xc5, 0xf8, 0x91, 0x29 }, { kmovw WORD [rcx],k5 }
+testcase { 0xc4, 0xa1, 0x78, 0x91, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { kmovw WORD [rax+r14*8+0x123],k5 }
+testcase { 0xc5, 0xf8, 0x92, 0xe8 }, { kmovw k5,eax }
+testcase { 0xc5, 0xf8, 0x92, 0xed }, { kmovw k5,ebp }
+testcase { 0xc4, 0xc1, 0x78, 0x92, 0xed }, { kmovw k5,r13d }
+testcase { 0xc5, 0xf8, 0x93, 0xc5 }, { kmovw eax,k5 }
+testcase { 0xc5, 0xf8, 0x93, 0xed }, { kmovw ebp,k5 }
+testcase { 0xc5, 0x78, 0x93, 0xed }, { kmovw r13d,k5 }
+testcase { 0xc5, 0xcd, 0x4b, 0xef }, { kunpckbw k5,k6,k7 }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0x31, 0xab }, { vcvtps2ph YWORD [rcx],zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x4f, 0x1d, 0x31, 0xab }, { vcvtps2ph YWORD [rcx]{k7},zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0x31, 0x7b }, { vcvtps2ph YWORD [rcx],zmm30,0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x1d, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vcvtps2ph YWORD [rax+r14*8+0x123],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0x72, 0x7f, 0x7b }, { vcvtps2ph YWORD [rdx+0xfe0],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x7b }, { vcvtps2ph YWORD [rdx+0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0x72, 0x80, 0x7b }, { vcvtps2ph YWORD [rdx-0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x1d, 0xb2, 0xe0, 0xef, 0xff, 0xff, 0x7b }, { vcvtps2ph YWORD [rdx-0x1020],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0x31, 0xab }, { vextractf32x4 OWORD [rcx],zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x4f, 0x19, 0x31, 0xab }, { vextractf32x4 OWORD [rcx]{k7},zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0x31, 0x7b }, { vextractf32x4 OWORD [rcx],zmm30,0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x19, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vextractf32x4 OWORD [rax+r14*8+0x123],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0x72, 0x7f, 0x7b }, { vextractf32x4 OWORD [rdx+0x7f0],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0xb2, 0x00, 0x08, 0x00, 0x00, 0x7b }, { vextractf32x4 OWORD [rdx+0x800],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0x72, 0x80, 0x7b }, { vextractf32x4 OWORD [rdx-0x800],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x19, 0xb2, 0xf0, 0xf7, 0xff, 0xff, 0x7b }, { vextractf32x4 OWORD [rdx-0x810],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0x31, 0xab }, { vextractf64x4 YWORD [rcx],zmm30,0xab }
+testcase { 0x62, 0x63, 0xfd, 0x4f, 0x1b, 0x31, 0xab }, { vextractf64x4 YWORD [rcx]{k7},zmm30,0xab }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0x31, 0x7b }, { vextractf64x4 YWORD [rcx],zmm30,0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x1b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vextractf64x4 YWORD [rax+r14*8+0x123],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0x72, 0x7f, 0x7b }, { vextractf64x4 YWORD [rdx+0xfe0],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x7b }, { vextractf64x4 YWORD [rdx+0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0x72, 0x80, 0x7b }, { vextractf64x4 YWORD [rdx-0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x1b, 0xb2, 0xe0, 0xef, 0xff, 0xff, 0x7b }, { vextractf64x4 YWORD [rdx-0x1020],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0x31, 0xab }, { vextracti32x4 OWORD [rcx],zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x4f, 0x39, 0x31, 0xab }, { vextracti32x4 OWORD [rcx]{k7},zmm30,0xab }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0x31, 0x7b }, { vextracti32x4 OWORD [rcx],zmm30,0x7b }
+testcase { 0x62, 0x23, 0x7d, 0x48, 0x39, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vextracti32x4 OWORD [rax+r14*8+0x123],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0x72, 0x7f, 0x7b }, { vextracti32x4 OWORD [rdx+0x7f0],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0xb2, 0x00, 0x08, 0x00, 0x00, 0x7b }, { vextracti32x4 OWORD [rdx+0x800],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0x72, 0x80, 0x7b }, { vextracti32x4 OWORD [rdx-0x800],zmm30,0x7b }
+testcase { 0x62, 0x63, 0x7d, 0x48, 0x39, 0xb2, 0xf0, 0xf7, 0xff, 0xff, 0x7b }, { vextracti32x4 OWORD [rdx-0x810],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0x31, 0xab }, { vextracti64x4 YWORD [rcx],zmm30,0xab }
+testcase { 0x62, 0x63, 0xfd, 0x4f, 0x3b, 0x31, 0xab }, { vextracti64x4 YWORD [rcx]{k7},zmm30,0xab }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0x31, 0x7b }, { vextracti64x4 YWORD [rcx],zmm30,0x7b }
+testcase { 0x62, 0x23, 0xfd, 0x48, 0x3b, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00, 0x7b }, { vextracti64x4 YWORD [rax+r14*8+0x123],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0x72, 0x7f, 0x7b }, { vextracti64x4 YWORD [rdx+0xfe0],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x7b }, { vextracti64x4 YWORD [rdx+0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0x72, 0x80, 0x7b }, { vextracti64x4 YWORD [rdx-0x1000],zmm30,0x7b }
+testcase { 0x62, 0x63, 0xfd, 0x48, 0x3b, 0xb2, 0xe0, 0xef, 0xff, 0xff, 0x7b }, { vextracti64x4 YWORD [rdx-0x1020],zmm30,0x7b }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x29, 0x31 }, { vmovapd ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x29, 0x31 }, { vmovapd ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x29, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovapd ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x29, 0x72, 0x7f }, { vmovapd ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x29, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovapd ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x29, 0x72, 0x80 }, { vmovapd ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x29, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovapd ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x29, 0x31 }, { vmovaps ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x29, 0x31 }, { vmovaps ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x29, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovaps ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x29, 0x72, 0x7f }, { vmovaps ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x29, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovaps ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x29, 0x72, 0x80 }, { vmovaps ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x29, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovaps ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x7f, 0x31 }, { vmovdqa32 ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x4f, 0x7f, 0x31 }, { vmovdqa32 ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0x7d, 0x48, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqa32 ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x7f, 0x72, 0x7f }, { vmovdqa32 ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqa32 ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x7f, 0x72, 0x80 }, { vmovdqa32 ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7d, 0x48, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqa32 ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x7f, 0x31 }, { vmovdqa64 ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x7f, 0x31 }, { vmovdqa64 ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqa64 ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x7f, 0x72, 0x7f }, { vmovdqa64 ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqa64 ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x7f, 0x72, 0x80 }, { vmovdqa64 ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqa64 ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x7f, 0x31 }, { vmovdqu32 ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x4f, 0x7f, 0x31 }, { vmovdqu32 ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0x7e, 0x48, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqu32 ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x7f, 0x72, 0x7f }, { vmovdqu32 ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqu32 ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x7f, 0x72, 0x80 }, { vmovdqu32 ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7e, 0x48, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqu32 ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x7f, 0x31 }, { vmovdqu64 ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x4f, 0x7f, 0x31 }, { vmovdqu64 ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0xfe, 0x48, 0x7f, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovdqu64 ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x7f, 0x72, 0x7f }, { vmovdqu64 ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x7f, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovdqu64 ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x7f, 0x72, 0x80 }, { vmovdqu64 ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfe, 0x48, 0x7f, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovdqu64 ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x11, 0x31 }, { vmovupd ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x4f, 0x11, 0x31 }, { vmovupd ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0xfd, 0x48, 0x11, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovupd ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x11, 0x72, 0x7f }, { vmovupd ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x11, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovupd ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x11, 0x72, 0x80 }, { vmovupd ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0xfd, 0x48, 0x11, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovupd ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x11, 0x31 }, { vmovups ZWORD [rcx],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x4f, 0x11, 0x31 }, { vmovups ZWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x11, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vmovups ZWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x11, 0x72, 0x7f }, { vmovups ZWORD [rdx+0x1fc0],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x11, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vmovups ZWORD [rdx+0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x11, 0x72, 0x80 }, { vmovups ZWORD [rdx-0x2000],zmm30 }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x11, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vmovups ZWORD [rdx-0x2040],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x32, 0x31 }, { vpmovqb QWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x32, 0x31 }, { vpmovqb QWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x32, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovqb QWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x32, 0x72, 0x7f }, { vpmovqb QWORD [rdx+0x3f8],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x32, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmovqb QWORD [rdx+0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x32, 0x72, 0x80 }, { vpmovqb QWORD [rdx-0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x32, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmovqb QWORD [rdx-0x408],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x22, 0x31 }, { vpmovsqb QWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x22, 0x31 }, { vpmovsqb QWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x22, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsqb QWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x22, 0x72, 0x7f }, { vpmovsqb QWORD [rdx+0x3f8],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x22, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmovsqb QWORD [rdx+0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x22, 0x72, 0x80 }, { vpmovsqb QWORD [rdx-0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x22, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmovsqb QWORD [rdx-0x408],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x12, 0x31 }, { vpmovusqb QWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x12, 0x31 }, { vpmovusqb QWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x12, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovusqb QWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x12, 0x72, 0x7f }, { vpmovusqb QWORD [rdx+0x3f8],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x12, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpmovusqb QWORD [rdx+0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x12, 0x72, 0x80 }, { vpmovusqb QWORD [rdx-0x400],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x12, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpmovusqb QWORD [rdx-0x408],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x34, 0x31 }, { vpmovqw OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x34, 0x31 }, { vpmovqw OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x34, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovqw OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x34, 0x72, 0x7f }, { vpmovqw OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x34, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovqw OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x34, 0x72, 0x80 }, { vpmovqw OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x34, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovqw OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x24, 0x31 }, { vpmovsqw OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x24, 0x31 }, { vpmovsqw OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x24, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsqw OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x24, 0x72, 0x7f }, { vpmovsqw OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x24, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovsqw OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x24, 0x72, 0x80 }, { vpmovsqw OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x24, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovsqw OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x14, 0x31 }, { vpmovusqw OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x14, 0x31 }, { vpmovusqw OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x14, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovusqw OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x14, 0x72, 0x7f }, { vpmovusqw OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x14, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovusqw OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x14, 0x72, 0x80 }, { vpmovusqw OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x14, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovusqw OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x35, 0x31 }, { vpmovqd YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x35, 0x31 }, { vpmovqd YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x35, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovqd YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x35, 0x72, 0x7f }, { vpmovqd YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x35, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovqd YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x35, 0x72, 0x80 }, { vpmovqd YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x35, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovqd YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x25, 0x31 }, { vpmovsqd YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x25, 0x31 }, { vpmovsqd YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x25, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsqd YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x25, 0x72, 0x7f }, { vpmovsqd YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x25, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovsqd YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x25, 0x72, 0x80 }, { vpmovsqd YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x25, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovsqd YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x15, 0x31 }, { vpmovusqd YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x15, 0x31 }, { vpmovusqd YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x15, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovusqd YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x15, 0x72, 0x7f }, { vpmovusqd YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x15, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovusqd YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x15, 0x72, 0x80 }, { vpmovusqd YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x15, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovusqd YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x31, 0x31 }, { vpmovdb OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x31, 0x31 }, { vpmovdb OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x31, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovdb OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x31, 0x72, 0x7f }, { vpmovdb OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x31, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovdb OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x31, 0x72, 0x80 }, { vpmovdb OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x31, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovdb OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x21, 0x31 }, { vpmovsdb OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x21, 0x31 }, { vpmovsdb OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x21, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsdb OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x21, 0x72, 0x7f }, { vpmovsdb OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x21, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovsdb OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x21, 0x72, 0x80 }, { vpmovsdb OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x21, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovsdb OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x11, 0x31 }, { vpmovusdb OWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x11, 0x31 }, { vpmovusdb OWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x11, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovusdb OWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x11, 0x72, 0x7f }, { vpmovusdb OWORD [rdx+0x7f0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x11, 0xb2, 0x00, 0x08, 0x00, 0x00 }, { vpmovusdb OWORD [rdx+0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x11, 0x72, 0x80 }, { vpmovusdb OWORD [rdx-0x800],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x11, 0xb2, 0xf0, 0xf7, 0xff, 0xff }, { vpmovusdb OWORD [rdx-0x810],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x33, 0x31 }, { vpmovdw YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x33, 0x31 }, { vpmovdw YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x33, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovdw YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x33, 0x72, 0x7f }, { vpmovdw YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x33, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovdw YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x33, 0x72, 0x80 }, { vpmovdw YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x33, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovdw YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x23, 0x31 }, { vpmovsdw YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x23, 0x31 }, { vpmovsdw YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x23, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovsdw YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x23, 0x72, 0x7f }, { vpmovsdw YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x23, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovsdw YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x23, 0x72, 0x80 }, { vpmovsdw YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x23, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovsdw YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x13, 0x31 }, { vpmovusdw YWORD [rcx],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x4f, 0x13, 0x31 }, { vpmovusdw YWORD [rcx]{k7},zmm30 }
+testcase { 0x62, 0x22, 0x7e, 0x48, 0x13, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpmovusdw YWORD [rax+r14*8+0x123],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x13, 0x72, 0x7f }, { vpmovusdw YWORD [rdx+0xfe0],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x13, 0xb2, 0x00, 0x10, 0x00, 0x00 }, { vpmovusdw YWORD [rdx+0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x13, 0x72, 0x80 }, { vpmovusdw YWORD [rdx-0x1000],zmm30 }
+testcase { 0x62, 0x62, 0x7e, 0x48, 0x13, 0xb2, 0xe0, 0xef, 0xff, 0xff }, { vpmovusdw YWORD [rdx-0x1020],zmm30 }
+testcase { 0x62, 0x01, 0xfc, 0x4f, 0x78, 0xf5 }, { vcvttpd2udq ymm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0xfc, 0xcf, 0x78, 0xf5 }, { vcvttpd2udq ymm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0xfc, 0x1f, 0x78, 0xf5 }, { vcvttpd2udq ymm30{k7},zmm29,{sae} }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x78, 0x31 }, { vcvttpd2udq ymm30{k7},ZWORD [rcx] }
+testcase { 0x62, 0x21, 0xfc, 0x4f, 0x78, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttpd2udq ymm30{k7},ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x78, 0x31 }, { vcvttpd2udq ymm30{k7},QWORD [rcx]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x78, 0x72, 0x7f }, { vcvttpd2udq ymm30{k7},ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x78, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvttpd2udq ymm30{k7},ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x78, 0x72, 0x80 }, { vcvttpd2udq ymm30{k7},ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0xfc, 0x4f, 0x78, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvttpd2udq ymm30{k7},ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x78, 0x72, 0x7f }, { vcvttpd2udq ymm30{k7},QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x78, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vcvttpd2udq ymm30{k7},QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x78, 0x72, 0x80 }, { vcvttpd2udq ymm30{k7},QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x61, 0xfc, 0x5f, 0x78, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vcvttpd2udq ymm30{k7},QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x01, 0x7c, 0x48, 0x78, 0xf5 }, { vcvttps2udq zmm30,zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x4f, 0x78, 0xf5 }, { vcvttps2udq zmm30{k7},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0xcf, 0x78, 0xf5 }, { vcvttps2udq zmm30{k7}{z},zmm29 }
+testcase { 0x62, 0x01, 0x7c, 0x18, 0x78, 0xf5 }, { vcvttps2udq zmm30,zmm29,{sae} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x78, 0x31 }, { vcvttps2udq zmm30,ZWORD [rcx] }
+testcase { 0x62, 0x21, 0x7c, 0x48, 0x78, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttps2udq zmm30,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x78, 0x31 }, { vcvttps2udq zmm30,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x78, 0x72, 0x7f }, { vcvttps2udq zmm30,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x78, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vcvttps2udq zmm30,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x78, 0x72, 0x80 }, { vcvttps2udq zmm30,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x61, 0x7c, 0x48, 0x78, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vcvttps2udq zmm30,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x78, 0x72, 0x7f }, { vcvttps2udq zmm30,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x78, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vcvttps2udq zmm30,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x78, 0x72, 0x80 }, { vcvttps2udq zmm30,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x61, 0x7c, 0x58, 0x78, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vcvttps2udq zmm30,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x91, 0x7f, 0x08, 0x78, 0xc6 }, { vcvttsd2usi eax,xmm30 }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x78, 0xc6 }, { vcvttsd2usi eax,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x01 }, { vcvttsd2usi eax,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7f, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttsd2usi eax,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x42, 0x7f }, { vcvttsd2usi eax,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvttsd2usi eax,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x42, 0x80 }, { vcvttsd2usi eax,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvttsd2usi eax,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x7f, 0x08, 0x78, 0xee }, { vcvttsd2usi ebp,xmm30 }
+testcase { 0x62, 0x91, 0x7f, 0x18, 0x78, 0xee }, { vcvttsd2usi ebp,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x29 }, { vcvttsd2usi ebp,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7f, 0x08, 0x78, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttsd2usi ebp,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x6a, 0x7f }, { vcvttsd2usi ebp,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vcvttsd2usi ebp,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0x6a, 0x80 }, { vcvttsd2usi ebp,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0x7f, 0x08, 0x78, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vcvttsd2usi ebp,QWORD [rdx-0x408] }
+testcase { 0x62, 0x11, 0x7f, 0x08, 0x78, 0xee }, { vcvttsd2usi r13d,xmm30 }
+testcase { 0x62, 0x11, 0x7f, 0x18, 0x78, 0xee }, { vcvttsd2usi r13d,xmm30,{sae} }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x78, 0x29 }, { vcvttsd2usi r13d,QWORD [rcx] }
+testcase { 0x62, 0x31, 0x7f, 0x08, 0x78, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttsd2usi r13d,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x78, 0x6a, 0x7f }, { vcvttsd2usi r13d,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x78, 0xaa, 0x00, 0x04, 0x00, 0x00 }, { vcvttsd2usi r13d,QWORD [rdx+0x400] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x78, 0x6a, 0x80 }, { vcvttsd2usi r13d,QWORD [rdx-0x400] }
+testcase { 0x62, 0x71, 0x7f, 0x08, 0x78, 0xaa, 0xf8, 0xfb, 0xff, 0xff }, { vcvttsd2usi r13d,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0xff, 0x08, 0x78, 0xc6 }, { vcvttsd2usi rax,xmm30 }
+testcase { 0x62, 0x91, 0xff, 0x18, 0x78, 0xc6 }, { vcvttsd2usi rax,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x78, 0x01 }, { vcvttsd2usi rax,QWORD [rcx] }
+testcase { 0x62, 0xb1, 0xff, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttsd2usi rax,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x78, 0x42, 0x7f }, { vcvttsd2usi rax,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x78, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvttsd2usi rax,QWORD [rdx+0x400] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x78, 0x42, 0x80 }, { vcvttsd2usi rax,QWORD [rdx-0x400] }
+testcase { 0x62, 0xf1, 0xff, 0x08, 0x78, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvttsd2usi rax,QWORD [rdx-0x408] }
+testcase { 0x62, 0x11, 0xff, 0x08, 0x78, 0xc6 }, { vcvttsd2usi r8,xmm30 }
+testcase { 0x62, 0x11, 0xff, 0x18, 0x78, 0xc6 }, { vcvttsd2usi r8,xmm30,{sae} }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x78, 0x01 }, { vcvttsd2usi r8,QWORD [rcx] }
+testcase { 0x62, 0x31, 0xff, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttsd2usi r8,QWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x78, 0x42, 0x7f }, { vcvttsd2usi r8,QWORD [rdx+0x3f8] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x78, 0x82, 0x00, 0x04, 0x00, 0x00 }, { vcvttsd2usi r8,QWORD [rdx+0x400] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x78, 0x42, 0x80 }, { vcvttsd2usi r8,QWORD [rdx-0x400] }
+testcase { 0x62, 0x71, 0xff, 0x08, 0x78, 0x82, 0xf8, 0xfb, 0xff, 0xff }, { vcvttsd2usi r8,QWORD [rdx-0x408] }
+testcase { 0x62, 0x91, 0x7e, 0x08, 0x78, 0xc6 }, { vcvttss2usi eax,xmm30 }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x78, 0xc6 }, { vcvttss2usi eax,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x01 }, { vcvttss2usi eax,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7e, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttss2usi eax,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x42, 0x7f }, { vcvttss2usi eax,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvttss2usi eax,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x42, 0x80 }, { vcvttss2usi eax,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvttss2usi eax,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0x7e, 0x08, 0x78, 0xee }, { vcvttss2usi ebp,xmm30 }
+testcase { 0x62, 0x91, 0x7e, 0x18, 0x78, 0xee }, { vcvttss2usi ebp,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x29 }, { vcvttss2usi ebp,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0x7e, 0x08, 0x78, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttss2usi ebp,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x6a, 0x7f }, { vcvttss2usi ebp,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vcvttss2usi ebp,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0x6a, 0x80 }, { vcvttss2usi ebp,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0x7e, 0x08, 0x78, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vcvttss2usi ebp,DWORD [rdx-0x204] }
+testcase { 0x62, 0x11, 0x7e, 0x08, 0x78, 0xee }, { vcvttss2usi r13d,xmm30 }
+testcase { 0x62, 0x11, 0x7e, 0x18, 0x78, 0xee }, { vcvttss2usi r13d,xmm30,{sae} }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x78, 0x29 }, { vcvttss2usi r13d,DWORD [rcx] }
+testcase { 0x62, 0x31, 0x7e, 0x08, 0x78, 0xac, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttss2usi r13d,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x78, 0x6a, 0x7f }, { vcvttss2usi r13d,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x78, 0xaa, 0x00, 0x02, 0x00, 0x00 }, { vcvttss2usi r13d,DWORD [rdx+0x200] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x78, 0x6a, 0x80 }, { vcvttss2usi r13d,DWORD [rdx-0x200] }
+testcase { 0x62, 0x71, 0x7e, 0x08, 0x78, 0xaa, 0xfc, 0xfd, 0xff, 0xff }, { vcvttss2usi r13d,DWORD [rdx-0x204] }
+testcase { 0x62, 0x91, 0xfe, 0x08, 0x78, 0xc6 }, { vcvttss2usi rax,xmm30 }
+testcase { 0x62, 0x91, 0xfe, 0x18, 0x78, 0xc6 }, { vcvttss2usi rax,xmm30,{sae} }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x78, 0x01 }, { vcvttss2usi rax,DWORD [rcx] }
+testcase { 0x62, 0xb1, 0xfe, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttss2usi rax,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x78, 0x42, 0x7f }, { vcvttss2usi rax,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x78, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvttss2usi rax,DWORD [rdx+0x200] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x78, 0x42, 0x80 }, { vcvttss2usi rax,DWORD [rdx-0x200] }
+testcase { 0x62, 0xf1, 0xfe, 0x08, 0x78, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvttss2usi rax,DWORD [rdx-0x204] }
+testcase { 0x62, 0x11, 0xfe, 0x08, 0x78, 0xc6 }, { vcvttss2usi r8,xmm30 }
+testcase { 0x62, 0x11, 0xfe, 0x18, 0x78, 0xc6 }, { vcvttss2usi r8,xmm30,{sae} }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x78, 0x01 }, { vcvttss2usi r8,DWORD [rcx] }
+testcase { 0x62, 0x31, 0xfe, 0x08, 0x78, 0x84, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vcvttss2usi r8,DWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x78, 0x42, 0x7f }, { vcvttss2usi r8,DWORD [rdx+0x1fc] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x78, 0x82, 0x00, 0x02, 0x00, 0x00 }, { vcvttss2usi r8,DWORD [rdx+0x200] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x78, 0x42, 0x80 }, { vcvttss2usi r8,DWORD [rdx-0x200] }
+testcase { 0x62, 0x71, 0xfe, 0x08, 0x78, 0x82, 0xfc, 0xfd, 0xff, 0xff }, { vcvttss2usi r8,DWORD [rdx-0x204] }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x76, 0xf4 }, { vpermi2d zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x76, 0xf4 }, { vpermi2d zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x76, 0xf4 }, { vpermi2d zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x76, 0x31 }, { vpermi2d zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x76, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermi2d zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x76, 0x31 }, { vpermi2d zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x76, 0x72, 0x7f }, { vpermi2d zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x76, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermi2d zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x76, 0x72, 0x80 }, { vpermi2d zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x76, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermi2d zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x76, 0x72, 0x7f }, { vpermi2d zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x76, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermi2d zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x76, 0x72, 0x80 }, { vpermi2d zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x76, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermi2d zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x76, 0xf4 }, { vpermi2q zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x76, 0xf4 }, { vpermi2q zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x76, 0xf4 }, { vpermi2q zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x76, 0x31 }, { vpermi2q zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x76, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermi2q zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x76, 0x31 }, { vpermi2q zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x76, 0x72, 0x7f }, { vpermi2q zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x76, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermi2q zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x76, 0x72, 0x80 }, { vpermi2q zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x76, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermi2q zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x76, 0x72, 0x7f }, { vpermi2q zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x76, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermi2q zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x76, 0x72, 0x80 }, { vpermi2q zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x76, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermi2q zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
+testcase { 0x62, 0x02, 0x15, 0x40, 0x77, 0xf4 }, { vpermi2ps zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0x47, 0x77, 0xf4 }, { vpermi2ps zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x15, 0xc7, 0x77, 0xf4 }, { vpermi2ps zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x77, 0x31 }, { vpermi2ps zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x15, 0x40, 0x77, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermi2ps zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x77, 0x31 }, { vpermi2ps zmm30,zmm29,DWORD [rcx]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x77, 0x72, 0x7f }, { vpermi2ps zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x77, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermi2ps zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x77, 0x72, 0x80 }, { vpermi2ps zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x15, 0x40, 0x77, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermi2ps zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x77, 0x72, 0x7f }, { vpermi2ps zmm30,zmm29,DWORD [rdx+0x1fc]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x77, 0xb2, 0x00, 0x02, 0x00, 0x00 }, { vpermi2ps zmm30,zmm29,DWORD [rdx+0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x77, 0x72, 0x80 }, { vpermi2ps zmm30,zmm29,DWORD [rdx-0x200]{1to16} }
+testcase { 0x62, 0x62, 0x15, 0x50, 0x77, 0xb2, 0xfc, 0xfd, 0xff, 0xff }, { vpermi2ps zmm30,zmm29,DWORD [rdx-0x204]{1to16} }
+testcase { 0x62, 0x02, 0x95, 0x40, 0x77, 0xf4 }, { vpermi2pd zmm30,zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0x47, 0x77, 0xf4 }, { vpermi2pd zmm30{k7},zmm29,zmm28 }
+testcase { 0x62, 0x02, 0x95, 0xc7, 0x77, 0xf4 }, { vpermi2pd zmm30{k7}{z},zmm29,zmm28 }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x77, 0x31 }, { vpermi2pd zmm30,zmm29,ZWORD [rcx] }
+testcase { 0x62, 0x22, 0x95, 0x40, 0x77, 0xb4, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { vpermi2pd zmm30,zmm29,ZWORD [rax+r14*8+0x123] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x77, 0x31 }, { vpermi2pd zmm30,zmm29,QWORD [rcx]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x77, 0x72, 0x7f }, { vpermi2pd zmm30,zmm29,ZWORD [rdx+0x1fc0] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x77, 0xb2, 0x00, 0x20, 0x00, 0x00 }, { vpermi2pd zmm30,zmm29,ZWORD [rdx+0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x77, 0x72, 0x80 }, { vpermi2pd zmm30,zmm29,ZWORD [rdx-0x2000] }
+testcase { 0x62, 0x62, 0x95, 0x40, 0x77, 0xb2, 0xc0, 0xdf, 0xff, 0xff }, { vpermi2pd zmm30,zmm29,ZWORD [rdx-0x2040] }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x77, 0x72, 0x7f }, { vpermi2pd zmm30,zmm29,QWORD [rdx+0x3f8]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x77, 0xb2, 0x00, 0x04, 0x00, 0x00 }, { vpermi2pd zmm30,zmm29,QWORD [rdx+0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x77, 0x72, 0x80 }, { vpermi2pd zmm30,zmm29,QWORD [rdx-0x400]{1to8} }
+testcase { 0x62, 0x62, 0x95, 0x50, 0x77, 0xb2, 0xf8, 0xfb, 0xff, 0xff }, { vpermi2pd zmm30,zmm29,QWORD [rdx-0x408]{1to8} }
diff --git a/test/avx512pf.asm b/test/avx512pf.asm
new file mode 100644
index 00000000..88f2c1c5
--- /dev/null
+++ b/test/avx512pf.asm
@@ -0,0 +1,88 @@
+;Testname=avx512pf; Arguments=-fbin -oavx512pf.bin -O0 -DSRC; Files=stdout stderr avx512pf.bin
+; AVX-512PF testcases from gas
+;------------------------
+;
+; This file is taken from there
+; https://gnu.googlesource.com/binutils/+/master/gas/testsuite/gas/i386/x86-64-avx512pf-intel.d
+; So the original author is "H.J. Lu" <hongjiu dot lu at intel dot com>
+;
+; Jin Kyu Song converted it for the nasm testing suite using gas2nasm.py
+
+%macro testcase 2
+ %ifdef BIN
+ db %1
+ %endif
+ %ifdef SRC
+ %2
+ %endif
+%endmacro
+
+
+bits 64
+
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x4c, 0x39, 0x20 }, { vgatherpf0dpd [r9+ymm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc6, 0x8c, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf0dpd [rcx+ymm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x4c, 0x39, 0x40 }, { vgatherpf0dps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc6, 0x8c, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf0dps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x4c, 0x39, 0x20 }, { vgatherpf0qpd [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc7, 0x8c, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf0qpd [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x8c, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf0qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x4c, 0x39, 0x40 }, { vgatherpf0qps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc7, 0x8c, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf0qps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x54, 0x39, 0x20 }, { vgatherpf1dpd [r9+ymm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc6, 0x94, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf1dpd [rcx+ymm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x54, 0x39, 0x40 }, { vgatherpf1dps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc6, 0x94, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf1dps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x54, 0x39, 0x20 }, { vgatherpf1qpd [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc7, 0x94, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf1qpd [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x94, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vgatherpf1qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x54, 0x39, 0x40 }, { vgatherpf1qps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc7, 0x94, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vgatherpf1qps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x6c, 0x39, 0x20 }, { vscatterpf0dpd [r9+ymm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc6, 0xac, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf0dpd [rcx+ymm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x6c, 0x39, 0x40 }, { vscatterpf0dps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc6, 0xac, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf0dps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x6c, 0x39, 0x20 }, { vscatterpf0qpd [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc7, 0xac, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf0qpd [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0xac, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf0qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x6c, 0x39, 0x40 }, { vscatterpf0qps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc7, 0xac, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf0qps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1dpd [r14+ymm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc6, 0x74, 0x39, 0x20 }, { vscatterpf1dpd [r9+ymm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc6, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf1dpd [rcx+ymm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1dps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc6, 0x74, 0x39, 0x40 }, { vscatterpf1dps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc6, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf1dps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1qpd [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0xfd, 0x41, 0xc7, 0x74, 0x39, 0x20 }, { vscatterpf1qpd [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0xfd, 0x41, 0xc7, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf1qpd [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0xb4, 0xfe, 0x7b, 0x00, 0x00, 0x00 }, { vscatterpf1qps [r14+zmm31*8+0x7b]{k1} }
+testcase { 0x62, 0x92, 0x7d, 0x41, 0xc7, 0x74, 0x39, 0x40 }, { vscatterpf1qps [r9+zmm31*1+0x100]{k1} }
+testcase { 0x62, 0xb2, 0x7d, 0x41, 0xc7, 0xb4, 0xb9, 0x00, 0x04, 0x00, 0x00 }, { vscatterpf1qps [rcx+zmm31*4+0x400]{k1} }
+testcase { 0x0f, 0x0d, 0x11 }, { prefetchwt1 BYTE [rcx] }
+testcase { 0x42, 0x0f, 0x0d, 0x94, 0xf0, 0x23, 0x01, 0x00, 0x00 }, { prefetchwt1 BYTE [rax+r14*8+0x123] }
diff --git a/test/bcd.asm b/test/bcd.asm
new file mode 100644
index 00000000..b58d81aa
--- /dev/null
+++ b/test/bcd.asm
@@ -0,0 +1,23 @@
+;Testname=optimized; Arguments=-Ox -fbin -obcd.bin; Files=stdout stderr bcd.bin
+
+ dt 765432109876543210p
+ dt -765432109876543210p
+ dt +765432109876543210p
+ dt 123p
+ dt -456p
+ dt +789p
+ dt 98765432109876543210p
+ dt 123.0
+ dt 0x123p+44
+ dt 789p
+
+ dt 0p765432109876543210
+ dt -0p765432109876543210
+ dt +0p765432109876543210
+ dt 0p123
+ dt -0p456
+ dt +0p789
+ dt 0p98765432109876543210
+ dt 123.0
+ dt 0x123p+44
+ dt 0p789
diff --git a/test/binexe.asm b/test/binexe.asm
new file mode 100644
index 00000000..2a9eb6e8
--- /dev/null
+++ b/test/binexe.asm
@@ -0,0 +1,35 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obinexe.exe -i../misc/; Files=stdout stderr binexe.exe
+;Testname=optimized; Arguments=-Ox -fbin -obinexe.exe -i../misc/; Files=stdout stderr binexe.exe
+
+; Demonstration of how to write an entire .EXE format program by using
+; the `exebin.mac' macro package.
+; To build:
+; nasm -fbin binexe.asm -o binexe.exe -ipath
+; (where `path' is such as to allow the %include directive to find
+; exebin.mac)
+; To test:
+; binexe
+; (should print `hello, world')
+
+%include "exebin.mac"
+
+ EXE_begin
+ EXE_stack 64 ; demonstrates overriding the 0x800 default
+
+ section .text
+
+ mov ax,cs
+ mov ds,ax
+
+ mov dx,hello
+ mov ah,9
+ int 0x21
+
+ mov ax,0x4c00
+ int 0x21
+
+ section .data
+
+hello: db 'hello, world', 13, 10, '$'
+
+ EXE_end
diff --git a/test/bintest.asm b/test/bintest.asm
new file mode 100644
index 00000000..57a3b2df
--- /dev/null
+++ b/test/bintest.asm
@@ -0,0 +1,59 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obintest.bin; Files=stdout stderr bintest.bin
+;Testname=optimized; Arguments=-Ox -fbin -obintest.bin; Files=stdout stderr bintest.bin
+
+; test source file for assembling to binary files
+; build with:
+; nasm -f bin -o bintest.com bintest.asm
+
+; When run (as a DOS .COM file), this program should print
+; hello, world
+; on two successive lines, then exit cleanly.
+
+; This file should test the following:
+; [1] Define a text-section symbol
+; [2] Define a data-section symbol
+; [3] Define a BSS-section symbol
+; [4] Define a NASM local label
+; [5] Reference a NASM local label
+; [6] Reference a text-section symbol in the text section
+; [7] Reference a data-section symbol in the text section
+; [8] Reference a BSS-section symbol in the text section
+; [9] Reference a text-section symbol in the data section
+; [10] Reference a data-section symbol in the data section
+; [11] Reference a BSS-section symbol in the data section
+
+ BITS 16
+ ORG 0x100
+
+ SECTION .text
+
+ jmp start ; [6]
+
+endX mov ax,0x4c00 ; [1]
+ int 0x21
+
+start mov byte [bss_sym],',' ; [1] [8]
+ mov bx,[bssptr] ; [7]
+ mov al,[bx]
+ mov bx,[dataptr] ; [7]
+ mov [bx],al
+ mov cx,2
+.loop mov dx,datasym ; [1] [4] [7]
+ mov ah,9
+ push cx
+ int 0x21
+ pop cx
+ loop .loop ; [5] [6]
+ mov bx,[textptr] ; [7]
+ jmp bx
+
+ SECTION .data
+
+datasym db 'hello world', 13, 10, '$' ; [2]
+bssptr dw bss_sym ; [2] [11]
+dataptr dw datasym+5 ; [2] [10]
+textptr dw endX ; [2] [9]
+
+ SECTION .bss
+
+bss_sym resb 1 ; [3]
diff --git a/test/bisect.sh b/test/bisect.sh
new file mode 100755
index 00000000..98bdb37d
--- /dev/null
+++ b/test/bisect.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Usage:
+
+# Make a test and a golden file, read ./performtest.pl --help
+
+# cd nasm
+# cp -r test somewhere (copy test dir out of the tree)
+# git bisect start HEAD nasm-2.07 (where HEAD is bad and nasm-2.07 is good)
+# git bisect run somewhere/test/bisect.sh br2148476 (what you want to test)
+
+# Done
+
+
+# Slow but sure
+./autogen.sh
+./configure
+make
+
+NASMDIR=$(pwd)
+cd $(dirname "$0")
+./performtest.pl "--nasm=$NASMDIR/nasm" "$1.asm" --verbose
diff --git a/test/br1879590.asm b/test/br1879590.asm
new file mode 100644
index 00000000..23e38728
--- /dev/null
+++ b/test/br1879590.asm
@@ -0,0 +1,25 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr1879590.bin; Files=stdout stderr br1879590.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr1879590.bin; Files=stdout stderr br1879590.bin
+
+ bits 32
+
+ pavgb mm0,[ebx]
+ pavgb mm0,qword [ebx]
+ pavgw mm0,[ebx]
+ pavgw mm0,qword [ebx]
+ pavgb xmm0,[ebx]
+ pavgb xmm0,oword [ebx]
+ pavgw xmm0,[ebx]
+ pavgw xmm0,oword [ebx]
+
+ bits 64
+
+ pavgb mm0,[rbx]
+ pavgb mm0,qword [rbx]
+ pavgw mm0,[rbx]
+ pavgw mm0,qword [rbx]
+ pavgb xmm0,[rbx]
+ pavgb xmm0,oword [rbx]
+ pavgw xmm0,[rbx]
+ pavgw xmm0,oword [rbx]
+
diff --git a/test/br2003451.asm b/test/br2003451.asm
new file mode 100644
index 00000000..74e32345
--- /dev/null
+++ b/test/br2003451.asm
@@ -0,0 +1,17 @@
+;Testname=optimized; Arguments=-Ox -fbin -obr2003451.bin; Files=stdout stderr br2003451.bin
+
+ cpu 8086
+ org 0
+
+ ; MOV r/m16,imm16
+ ; (imm16 given as number)
+ mov word [bx], 10h
+
+ ; MOV r/m16,imm16
+ ; (imm16 given as label)
+ mov word [bx], label
+
+ align 10h
+
+ ; This label is at address 10h
+label:
diff --git a/test/br2030823.asm b/test/br2030823.asm
new file mode 100644
index 00000000..fd8f5eba
--- /dev/null
+++ b/test/br2030823.asm
@@ -0,0 +1,7 @@
+;Testname=optimized; Arguments=-Ox -fbin -obr2030823.bin; Files=stdout stderr br2030823.bin
+
+bits 64
+ VFMADDPD xmm0, xmm1, [0], xmm3
+ VFMADDPD xmm0, xmm1, xmm2, [0]
+ VFMADDPD ymm0, ymm1, [0], ymm3
+ VFMADDPD ymm0, ymm1, ymm2, [0]
diff --git a/test/br2148476.asm b/test/br2148476.asm
new file mode 100644
index 00000000..b1ff0e8f
--- /dev/null
+++ b/test/br2148476.asm
@@ -0,0 +1,221 @@
+;Testname=test; Arguments=-fbin -obr2148476.bin; Files=stdout stderr br2148476.bin
+
+ bits 64
+
+ cvtdq2pd xmm0, xmm1
+ cvtdq2pd xmm0, [rdi]
+ cvtdq2pd xmm0, qword [rdi]
+
+ cvtdq2ps xmm0, xmm1
+ cvtdq2ps xmm0, [rdi]
+ cvtdq2ps xmm0, oword [rdi]
+
+ cvtpd2dq xmm0, xmm1
+ cvtpd2dq xmm0, [rdi]
+ cvtpd2dq xmm0, oword [rdi]
+
+ cvtpd2pi mm0, xmm1
+ cvtpd2pi mm0, [rdi]
+ cvtpd2pi mm0, oword [rdi]
+
+ cvtpd2ps xmm0, xmm1
+ cvtpd2ps xmm0, [rdi]
+ cvtpd2ps xmm0, oword [rdi]
+
+ cvtpi2pd xmm0, mm1
+ cvtpi2pd xmm0, [rdi]
+ cvtpi2pd xmm0, qword [rdi]
+
+ cvtpi2ps xmm0, mm1
+ cvtpi2ps xmm0, [rdi]
+ cvtpi2ps xmm0, qword [rdi]
+
+ cvtps2dq xmm0, xmm1
+ cvtps2dq xmm0, [rdi]
+ cvtps2dq xmm0, oword [rdi]
+
+ cvtps2pd xmm0, xmm1
+ cvtps2pd xmm0, [rdi]
+ cvtps2pd xmm0, qword [rdi]
+
+ cvtps2pi mm0, xmm1
+ cvtps2pi mm0, [rdi]
+ cvtps2pi mm0, qword [rdi]
+
+ cvtsd2si eax, xmm1
+ cvtsd2si eax, [rdi]
+ cvtsd2si eax, qword [rdi]
+ cvtsd2si rax, xmm1
+ cvtsd2si rax, [rdi]
+ cvtsd2si rax, qword [rdi]
+
+ cvtsd2ss xmm0, xmm1
+ cvtsd2ss xmm0, [rdi]
+ cvtsd2ss xmm0, qword [rdi]
+
+ cvtsi2sd xmm0, eax
+ cvtsi2sd xmm0, [rdi] ; Compatibility
+ cvtsi2sd xmm0, dword [rdi]
+ cvtsi2sd xmm0, rax
+ cvtsi2sd xmm0, qword [rdi]
+
+ cvtsi2ss xmm0, eax
+ cvtsi2ss xmm0, [rdi] ; Compatibility
+ cvtsi2ss xmm0, dword [rdi]
+ cvtsi2ss xmm0, rax
+ cvtsi2ss xmm0, qword [rdi]
+
+ cvtss2sd xmm0, xmm1
+ cvtss2sd xmm0, [rdi]
+ cvtss2sd xmm0, dword [rdi]
+
+ cvtss2si eax, xmm1
+ cvtss2si eax, [rdi]
+ cvtss2si eax, dword [rdi]
+ cvtss2si rax, xmm1
+ cvtss2si rax, [rdi]
+ cvtss2si rax, dword [rdi]
+
+ cvttpd2dq xmm0, xmm1
+ cvttpd2dq xmm0, [rdi]
+ cvttpd2dq xmm0, oword [rdi]
+
+ cvttpd2pi mm0, xmm1
+ cvttpd2pi mm0, [rdi]
+ cvttpd2pi mm0, oword [rdi]
+
+ cvttps2dq xmm0, xmm1
+ cvttps2dq xmm0, [rdi]
+ cvttps2dq xmm0, oword [rdi]
+
+ cvttps2pi mm0, xmm1
+ cvttps2pi mm0, [rdi]
+ cvttps2pi mm0, qword [rdi]
+
+ cvttsd2si eax, xmm1
+ cvttsd2si eax, [rdi] ; Compatibility
+ cvttsd2si eax, qword [rdi]
+ cvttsd2si rax, xmm1
+ cvttsd2si rax, [rdi]
+ cvttsd2si rax, qword [rdi]
+
+ cvttss2si eax, xmm1
+ cvttss2si eax, [rdi] ; Compatibility
+ cvttss2si eax, dword [rdi]
+ cvttss2si rax, xmm1
+ cvttss2si rax, [rdi]
+ cvttss2si rax, dword [rdi]
+
+ vcvtdq2pd xmm0, xmm1
+ vcvtdq2pd xmm0, [rdi]
+ vcvtdq2pd xmm0, qword [rdi]
+ vcvtdq2pd ymm0, xmm1
+ vcvtdq2pd ymm0, [rdi]
+ vcvtdq2pd ymm0, oword [rdi]
+
+ vcvtdq2ps xmm0, xmm1
+ vcvtdq2ps xmm0, [rdi]
+ vcvtdq2ps xmm0, oword [rdi]
+ vcvtdq2ps ymm0, ymm1
+ vcvtdq2ps ymm0, [rdi]
+ vcvtdq2ps ymm0, yword [rdi]
+
+ vcvtpd2dq xmm0, xmm1
+ vcvtpd2dq xmm0, oword [rdi]
+ vcvtpd2dq xmm0, ymm1
+ vcvtpd2dq xmm0, yword [rdi]
+
+ vcvtpd2ps xmm0, xmm1
+ vcvtpd2ps xmm0, oword [rdi]
+ vcvtpd2ps xmm0, ymm1
+ vcvtpd2ps xmm0, yword [rdi]
+
+ vcvtps2dq xmm0, xmm1
+ vcvtps2dq xmm0, [rdi]
+ vcvtps2dq xmm0, oword [rdi]
+ vcvtps2dq ymm0, ymm1
+ vcvtps2dq ymm0, [rdi]
+ vcvtps2dq ymm0, yword [rdi]
+
+ vcvtps2pd xmm0, xmm1
+ vcvtps2pd xmm0, [rdi]
+ vcvtps2pd xmm0, qword [rdi]
+ vcvtps2pd ymm0, xmm1
+ vcvtps2pd ymm0, [rdi]
+ vcvtps2pd ymm0, oword [rdi]
+
+ vcvtsd2si eax, xmm1
+ vcvtsd2si eax, [rdi]
+ vcvtsd2si eax, qword [rdi]
+ vcvtsd2si rax, xmm1
+ vcvtsd2si rax, [rdi]
+ vcvtsd2si rax, qword [rdi]
+
+ vcvtsd2ss xmm0, xmm1
+ vcvtsd2ss xmm0, [rdi]
+ vcvtsd2ss xmm0, qword [rdi]
+ vcvtsd2ss xmm0, xmm1, xmm2
+ vcvtsd2ss xmm0, xmm1, [rdi]
+ vcvtsd2ss xmm0, xmm1, qword [rdi]
+
+ vcvtsi2sd xmm0, eax
+ vcvtsi2sd xmm0, [rdi] ; Compatibility
+ vcvtsi2sd xmm0, dword [rdi]
+ vcvtsi2sd xmm0, rax
+ vcvtsi2sd xmm0, qword [rdi]
+ vcvtsi2sd xmm0, xmm1, eax
+ vcvtsi2sd xmm0, xmm1, [rdi] ; Compatibility
+ vcvtsi2sd xmm0, xmm1, dword [rdi]
+ vcvtsi2sd xmm0, xmm1, rax
+ vcvtsi2sd xmm0, xmm1, qword [rdi]
+
+ vcvtsi2ss xmm0, eax
+ vcvtsi2ss xmm0, [rdi] ; Compatibility
+ vcvtsi2ss xmm0, dword [rdi]
+ vcvtsi2ss xmm0, rax
+ vcvtsi2ss xmm0, qword [rdi]
+ vcvtsi2ss xmm0, xmm1, eax
+ vcvtsi2ss xmm0, xmm1, [rdi] ; Compatibility
+ vcvtsi2ss xmm0, xmm1, dword [rdi]
+ vcvtsi2ss xmm0, xmm1, rax
+ vcvtsi2ss xmm0, xmm1, qword [rdi]
+
+ vcvtss2sd xmm0, xmm1
+ vcvtss2sd xmm0, [rdi]
+ vcvtss2sd xmm0, dword [rdi]
+ vcvtss2sd xmm0, xmm1, xmm2
+ vcvtss2sd xmm0, xmm1, [rdi]
+ vcvtss2sd xmm0, xmm1, dword [rdi]
+
+ vcvtss2si eax, xmm1
+ vcvtss2si eax, [rdi]
+ vcvtss2si eax, dword [rdi]
+ vcvtss2si rax, xmm1
+ vcvtss2si rax, [rdi]
+ vcvtss2si rax, dword [rdi]
+
+ vcvttpd2dq xmm0, xmm1
+ vcvttpd2dq xmm0, oword [rdi]
+ vcvttpd2dq xmm0, ymm1
+ vcvttpd2dq xmm0, yword [rdi]
+
+ vcvttps2dq xmm0, xmm1
+ vcvttps2dq xmm0, [rdi]
+ vcvttps2dq xmm0, oword [rdi]
+ vcvttps2dq ymm0, ymm1
+ vcvttps2dq ymm0, [rdi]
+ vcvttps2dq ymm0, yword [rdi]
+
+ vcvttsd2si eax, xmm1
+ vcvttsd2si eax, [rdi] ; Compatibility
+ vcvttsd2si eax, qword [rdi]
+ vcvttsd2si rax, xmm1
+ vcvttsd2si rax, [rdi]
+ vcvttsd2si rax, qword [rdi]
+
+ vcvttss2si eax, xmm1
+ vcvttss2si eax, [rdi] ; Compatibility
+ vcvttss2si eax, dword [rdi]
+ vcvttss2si rax, xmm1
+ vcvttss2si rax, [rdi]
+ vcvttss2si rax, dword [rdi]
diff --git a/test/br2222615.asm b/test/br2222615.asm
new file mode 100644
index 00000000..7acef6c8
--- /dev/null
+++ b/test/br2222615.asm
@@ -0,0 +1,19 @@
+;Testname=noerror; Arguments=-fbin -obr2222615.bin; Files=stdout stderr br2222615.bin
+;Testname=error; Arguments=-DERROR -fbin -obr2222615.bin; Files=stdout stderr br2222615.bin
+
+%macro bluttan 0
+ nop
+%endmacro
+
+%ifnmacro bluttan
+ %error "bluttan is a macro"
+%endif
+
+%ifmacro blej
+ %error "blej is not a macro"
+%endif
+
+%ifdef ERROR
+ %ifnmacro
+ %endif
+%endif
diff --git a/test/br2496848.asm b/test/br2496848.asm
new file mode 100644
index 00000000..a60b7c9e
--- /dev/null
+++ b/test/br2496848.asm
@@ -0,0 +1,42 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -o br2496848.bin; Files=stdout stderr br2496848.bin
+;Testname=optimized; Arguments=-Ox -fbin -o br2496848.bin; Files=stdout stderr br2496848.bin
+
+bits 64
+
+foo:
+
+default abs
+
+mov al, [qword 0xffffffffffffffff]
+mov al, [qword 0x1ffffffffffffffff]
+
+mov cl, [byte 0x12345678]
+
+default rel
+
+mov cl, [foo]
+mov cl, [foo + 0x10000000]
+mov cl, [foo + 0x100000000]
+
+mov cl, [0x100]
+mov cl, [$$ + 0x100]
+
+mov cl, [rax - 1]
+mov cl, [rax + 0xffffffff]
+mov cl, [rax + 0x1ffffffff]
+
+bits 32
+mov cl, [eax - 1]
+mov cl, [eax + 0xffffffff]
+mov cl, [eax + 0x1ffffffff]
+mov cl, [byte eax + 0xffffffff]
+mov cl, [byte eax + 0x1ffffffff]
+mov cl, [byte eax + 0x1000ffff]
+
+bits 16
+mov cl, [di - 1]
+mov cl, [di + 0xffff]
+mov cl, [di + 0x1ffff]
+mov cl, [byte di + 0xffff]
+mov cl, [byte di + 0x1ffff]
+mov cl, [byte di + 0x10ff]
diff --git a/test/br3005117.asm b/test/br3005117.asm
new file mode 100644
index 00000000..66a46f8f
--- /dev/null
+++ b/test/br3005117.asm
@@ -0,0 +1,26 @@
+;Testname=br3005117; Arguments=-Ox -felf -obr3005117.o; Files=stdout stderr br3005117.o
+
+%macro B_STRUC 1-*
+%push foo
+%define %$strucname %1
+%%top_%$strucname:
+%rep %0 - 1
+%rotate 1
+resb %{$strucname}%1 - ($ - %%top_%$strucname)
+%1:
+%endrep
+resb %{$strucname}_size - ($ - %%top_%$strucname)
+%pop
+%endmacro
+
+struc timeval
+.tv_sec resd 1
+.tv_usec resd 1
+endstruc
+
+mov [timeval_struct.tv_sec], eax
+
+section .bss
+
+timeval_struct B_STRUC timeval, .tv_sec, .tv_usec
+ timeval_struct_len equ $ - timeval_struct
diff --git a/test/br3026808.asm b/test/br3026808.asm
new file mode 100644
index 00000000..d84923a1
--- /dev/null
+++ b/test/br3026808.asm
@@ -0,0 +1,20 @@
+;Testname=br3026808; Arguments=-Ox -fbin -obr3026808.o; Files=stdout stderr br3026808.o
+
+%imacro proc 1
+ %push proc
+ %assign %$arg 1
+%endmacro
+
+%imacro arg 0-1 1
+ %assign %$arg %1+%$arg
+%endmacro
+
+%imacro endproc 0
+ %pop
+%endmacro
+
+;----------------------------
+
+proc Test
+ %$ARG arg
+endproc
diff --git a/test/br3028880.asm b/test/br3028880.asm
new file mode 100644
index 00000000..b6b2cf2b
--- /dev/null
+++ b/test/br3028880.asm
@@ -0,0 +1,8 @@
+;Testname=br3028880; Arguments=-Ox -fbin -obr3028880.o; Files=stdout stderr br3028880.o
+
+%macro import 1
+ %define %%incfile %!PROJECTBASEDIR/%{1}.inc
+%endmacro
+
+import foo
+
diff --git a/test/br3041451.asm b/test/br3041451.asm
new file mode 100644
index 00000000..c8b0f3a7
--- /dev/null
+++ b/test/br3041451.asm
@@ -0,0 +1,59 @@
+;Testname=br3041451; Arguments=-Ox -fbin -obr3041451.bin; Files=stdout stderr br3041451.bin
+
+ [bits 64]
+
+ ;
+ ; HIT: Maximum possible value
+ %assign i 0
+ %rep ((1<<62)-1)
+ mov rax, i
+ %assign i i+1
+ %if i == 2
+ %exitrep
+ %endif
+ %endrep
+
+ ;
+ ; MISS: It's negative
+ %assign i 0
+ %rep 0xffffFFFFffffFFFE
+ mov rax, 0xffffFFFFffffFFFE
+ %assign i i+1
+ %if i == 2
+ %exitrep
+ %endif
+ %endrep
+
+ ;
+ ; MISS: It's negative
+ %assign i 0
+ %rep 0xffffFFFFffffFFFF
+ db i
+ %assign i i+1
+ %if i == 2
+ %exitrep
+ %endif
+ %endrep
+
+ ;
+ ; MISS: It's negative
+ %assign i 0
+ %rep -2
+ db i
+ %assign i i+1
+ %if i == 2
+ %exitrep
+ %endif
+ %endrep
+
+ ;
+ ; MISS: It's negative
+ %assign i 0
+ %rep -1
+ db i
+ %assign i i+1
+ %if i == 2
+ %exitrep
+ %endif
+ %endrep
+
diff --git a/test/br3058845.asm b/test/br3058845.asm
new file mode 100644
index 00000000..c42f5d50
--- /dev/null
+++ b/test/br3058845.asm
@@ -0,0 +1,14 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3058845.bin; Files=stdout stderr br3058845.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3058845.bin; Files=stdout stderr br3058845.bin
+
+BITS 16
+cmp ax, 0xFFFF
+cmp eax, 0xFFFF_FFFF
+
+BITS 32
+cmp ax, 0xFFFF
+cmp eax, 0xFFFF_FFFF
+
+BITS 64
+cmp ax, 0xFFFF
+cmp eax, 0xFFFF_FFFF
diff --git a/test/br3066383.asm b/test/br3066383.asm
new file mode 100644
index 00000000..d6a8646b
--- /dev/null
+++ b/test/br3066383.asm
@@ -0,0 +1,70 @@
+;Testname=br3066383; Arguments=-Ox -fbin -obr3066383.bin; Files=stdout stderr br3066383.bin
+
+;
+; this is a for BR3005117
+; http://sourceforge.net/tracker/?func=detail&aid=3005117&group_id=6208&atid=106208
+;
+%macro b_struc 1-*
+ %push foo
+ %define %$strucname %1
+%%top_%$strucname:
+ %rep %0 - 1
+ %rotate 1
+ resb %{$strucname}%1 - ($ - %%top_%$strucname)
+%1:
+ %endrep
+ resb %{$strucname}_size - ($ - %%top_%$strucname)
+ %pop
+%endmacro
+
+struc timeval
+ .tv_sec resd 1
+ .tv_usec resd 1
+endstruc
+
+section .text
+ mov [timeval_struct.tv_sec], eax
+
+section .bss
+ timeval_struct b_struc timeval, .tv_sec, .tv_usec
+ timeval_struct_len equ $ - timeval_struct
+
+section .text
+
+;
+; this is a test for BR3026808
+; http://sourceforge.net/tracker/?func=detail&aid=3026808&group_id=6208&atid=106208
+;
+%imacro proc 1
+ %push proc
+ %assign %$arg 1
+%endmacro
+
+%imacro arg 0-1 1
+ %assign %$arg %1+%$arg
+%endmacro
+
+%imacro endproc 0
+ %pop
+%endmacro
+
+proc Test
+ %$ARG arg
+endproc
+
+;
+; this is a test for BR3066383
+; http://sourceforge.net/tracker/?func=detail&aid=3066383&group_id=6208&atid=106208
+;
+%macro pp_local 1
+ %push
+ %assign %$_uses 0
+ %rep 4
+ %assign %$_ur%$_uses %$_uses
+ mov ecx, %$_ur%$_uses
+ %assign %$_uses %$_uses+1
+ %endrep
+ %pop
+%endmacro
+
+pp_local 1
diff --git a/test/br3074517.asm b/test/br3074517.asm
new file mode 100644
index 00000000..96978095
--- /dev/null
+++ b/test/br3074517.asm
@@ -0,0 +1,12 @@
+;%define UNDEFINED
+%macro macro 0
+ %ifndef UNDEFINED
+ %rep 1
+ %fatal This should display "fatal: (m:3)"
+ %endrep
+ %endif
+ %fatal This should display "fatal: (m:6)" if 'UNDEFINED' defined
+%endmacro
+
+macro
+
diff --git a/test/br3092924.asm b/test/br3092924.asm
new file mode 100644
index 00000000..3f9cde04
--- /dev/null
+++ b/test/br3092924.asm
@@ -0,0 +1,25 @@
+%define RNUM 0x10000 ; max of relocations in a section is 0xffff
+
+section .data1
+ r1 dd RNUM
+
+section .data2
+ r2 dd RNUM
+
+%macro x1 1
+ mov eax, [r1 + %1]
+%endmacro
+
+%macro x2 1
+ mov eax, [r2 + %1]
+%endmacro
+
+section .text1
+
+ %assign i 0
+ %rep RNUM
+ x1 i
+ x2 i
+ %assign i i+1
+ %endrep
+
diff --git a/test/br3104312.asm b/test/br3104312.asm
new file mode 100644
index 00000000..0dee16b8
--- /dev/null
+++ b/test/br3104312.asm
@@ -0,0 +1,11 @@
+%if 1 < 8000_0002h
+ %warning No bug with 8000_0002h
+%else
+ %warning Bug with 8000_0002h
+%endif
+
+%if 1 < 8000_0001h
+ %warning No bug with 8000_0001h
+%else
+ %warning Bug with 8000_0001h
+%endif
diff --git a/test/br3109604.asm b/test/br3109604.asm
new file mode 100644
index 00000000..9032e8d5
--- /dev/null
+++ b/test/br3109604.asm
@@ -0,0 +1,9 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3109604.bin; Files=stdout stderr br3109604.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3109604.bin; Files=stdout stderr br3109604.bin
+
+ bits 64
+b0: vmovd xmm2, [rdx+r9]
+e0:
+
+ section .data
+len: dd e0 - b0 ; Should be 6
diff --git a/test/br3174983.asm b/test/br3174983.asm
new file mode 100644
index 00000000..5b349958
--- /dev/null
+++ b/test/br3174983.asm
@@ -0,0 +1,9 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3174983.bin; Files=stdout stderr br3174983.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3174983.bin; Files=stdout stderr br3174983.bin
+
+ bits 32
+ vpextrw ecx,xmm0,8 ; c5 f9 c5 c8 08
+ vpextrw ecx,xmm2,3 ; c5 f9 c5 ca 03
+
+ bits 64
+ vpextrw rcx,xmm0,8 ; c5 f9 c5 c8 08
diff --git a/test/br3187743.asm b/test/br3187743.asm
new file mode 100644
index 00000000..6adf4198
--- /dev/null
+++ b/test/br3187743.asm
@@ -0,0 +1,7 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3187743.bin; Files=stdout stderr br3187743.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3187743.bin; Files=stdout stderr br3187743.bin
+
+ bits 64
+
+ vlddqu xmm0,[edi]
+ vlddqu ymm0,[edi]
diff --git a/test/br3189064.asm b/test/br3189064.asm
new file mode 100644
index 00000000..d62df506
--- /dev/null
+++ b/test/br3189064.asm
@@ -0,0 +1,7 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3189064.bin; Files=stdout stderr br3189064.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3189064.bin; Files=stdout stderr br3189064.bin
+
+[bits 64]
+ VMASKMOVPS [edi],ymm0,ymm1
+ VEXTRACTF128 xmm0,ymm1,1
+ VEXTRACTF128 [edi],ymm1,1
diff --git a/test/br3200749.asm b/test/br3200749.asm
new file mode 100644
index 00000000..79e35f8c
--- /dev/null
+++ b/test/br3200749.asm
@@ -0,0 +1,9 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3200749.bin; Files=stdout stderr br3200749.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3200749.bin; Files=stdout stderr br3200749.bin
+%define IFNDEF %ifndef
+%define ENDIF %endif
+
+IFNDEF foo
+ ; bar
+ENDIF
+
diff --git a/test/br3385573.asm b/test/br3385573.asm
new file mode 100644
index 00000000..a6e3abaa
--- /dev/null
+++ b/test/br3385573.asm
@@ -0,0 +1,11 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3385573.bin; Files=stdout stderr br3385573.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3385573.bin; Files=stdout stderr br3385573.bin
+[bits 64]
+
+ vpmovsxbw ymm1, xmm2
+ vpsllw ymm1, ymm2, 3
+ vpslld ymm1, ymm2, 3
+ vpsllq ymm1, ymm2, 3
+ vpsrld ymm1, ymm2, 3
+ vpsrad ymm1, ymm2, 3
+ vpermq ymm1, [rsi], 9
diff --git a/test/br3392252.asm b/test/br3392252.asm
new file mode 100644
index 00000000..82b9e1c7
--- /dev/null
+++ b/test/br3392252.asm
@@ -0,0 +1,43 @@
+;Testname=br3392252; Arguments=-Ox -fbin -obrbr3392252.o; Files=stdout stderr br3392252.o
+
+[BITS 64]
+
+ bextr rax, rsi, 1
+ bextr eax, esi, 1
+ bextr eax, esi, eax
+
+ blcfill edx, ebx
+ blcfill edx, [ebx]
+ blcfill rax, rbx
+
+ blci edx, ebx
+ blci edx, [ebx]
+ blci rax, rbx
+
+ blcic edx, ebx
+ blcic edx, [ebx]
+ blcic rax, rbx
+
+ blcmsk edx, ebx
+ blcmsk edx, [ebx]
+ blcmsk rax, rbx
+
+ blcs edx, ebx
+ blcs edx, [ebx]
+ blcs rax, rbx
+
+ blsfill edx, ebx
+ blsfill edx, [ebx]
+ blsfill rax, rbx
+
+ blsic edx, ebx
+ blsic edx, [ebx]
+ blsic rax, rbx
+
+ t1mskc edx, ebx
+ t1mskc edx, [ebx]
+ t1mskc rax, rbx
+
+ tzmsk edx, ebx
+ tzmsk edx, [ebx]
+ tzmsk rax, rbx
diff --git a/test/br3392259.asm b/test/br3392259.asm
new file mode 100644
index 00000000..bf12f0af
--- /dev/null
+++ b/test/br3392259.asm
@@ -0,0 +1,8 @@
+;Testname=br3392259; Arguments=-Ox -felf64 -obr3392259.o; Files=stdout stderr br3392259.o
+[BITS 64]
+
+ VMOVNTDQA ymm1, yword [rsi] ; fails: "error: invalid combination of opcode and operands"
+ VMOVNTDQA ymm1, [rsi] ; works
+ VMOVNTDQA xmm1, oword [rsi] ; works
+ MOVNTDQA xmm1, oword [rsi] ; fails, see bug 978756: "error: mismatch in operand sizes"
+ MOVNTDQA xmm1, [rsi] ; works
diff --git a/test/br3392363.asm b/test/br3392363.asm
new file mode 100644
index 00000000..b0bbbbd9
--- /dev/null
+++ b/test/br3392363.asm
@@ -0,0 +1,4 @@
+ vaddps zmm0 {k1}, zmm0, zmm0
+ rep
+ vaddps zmm0 {k1}, zmm0, zmm0
+ rep movsd
diff --git a/test/br3392392.asm b/test/br3392392.asm
new file mode 100644
index 00000000..0143aa47
--- /dev/null
+++ b/test/br3392392.asm
@@ -0,0 +1,16 @@
+ bits 64
+ vpaddd zmm0, zmm0, [rax]{1to16}
+ vpaddd zmm2{k3}, zmm0, zmm1
+ vpaddd zmm2 {k3}, zmm0, zmm1
+ vpaddd zmm0{k1}, zmm0, [rax]{1to16}
+ vmovdqa32 [rsi]{k1}, zmm1
+ vmovdqa32 [rsi]{z}, zmm1
+ vmovdqa32 [rsi]{k1}{z}, zmm1
+ vmovdqa32 [rsi]{z}{k1}, zmm1
+%ifdef ERROR
+ vmovdqa32 [rsi]{z}{1to16}, zmm1
+ vmovdqa32 [rsi]{z}{k1}{1to16}, zmm1
+ vpaddd zmm0, zmm0, [rax]{k1}
+ vpaddd zmm0, zmm1, zmm2{1to16}
+%endif
+
diff --git a/test/br3392396.asm b/test/br3392396.asm
new file mode 100644
index 00000000..beb71cf1
--- /dev/null
+++ b/test/br3392396.asm
@@ -0,0 +1,5 @@
+ bits 64
+ vmovdqa32 [rdi],zmm16
+ vmovdqa32 [rdi+64],zmm17
+ vmovdqa32 [rdi+128],zmm18
+ vmovdqa32 [rdi+192],zmm19
diff --git a/test/br3392411.asm b/test/br3392411.asm
new file mode 100644
index 00000000..02071a88
--- /dev/null
+++ b/test/br3392411.asm
@@ -0,0 +1,22 @@
+bits 64
+default rel
+
+%use smartalign
+
+section .text code align=32
+
+align 32
+
+nop
+jz LDone
+
+%rep 10
+ nop
+%endrep
+
+align 16
+%rep 115
+ nop
+%endrep
+
+LDone:
diff --git a/test/br3392418.asm b/test/br3392418.asm
new file mode 100644
index 00000000..7139870d
--- /dev/null
+++ b/test/br3392418.asm
@@ -0,0 +1,3 @@
+ section __LD,__compact_unwind data debug
+
+ dd 0
diff --git a/test/br3392439.asm b/test/br3392439.asm
new file mode 100644
index 00000000..1af47084
--- /dev/null
+++ b/test/br3392439.asm
@@ -0,0 +1,25 @@
+segment _TEXT class=CODE USE32 align=1 CPU=686
+
+extern _entry
+
+start:
+ mov ax, 0x18
+ mov ds, ax
+ mov es, ax
+ mov ss, ax
+ xor eax, eax
+ mov ax, 0x1234
+ shl eax, 4
+ add eax, 0x3000
+ mov esp, [eax]
+
+ call _entry
+
+.infloop:
+ hlt
+ jmp .infloop
+
+
+global _ret_16
+_ret_16:
+ jmp dword 0x10:0x8000
diff --git a/test/br3392442.asm b/test/br3392442.asm
new file mode 100644
index 00000000..e7a0511c
--- /dev/null
+++ b/test/br3392442.asm
@@ -0,0 +1,6 @@
+ ;; Bug report 3392442: invalid warning
+
+ and byte [0], ~80h
+ and byte [0], 0xfff
+ and byte [0], -256
+ and byte [0], -257
diff --git a/test/br560575.asm b/test/br560575.asm
new file mode 100644
index 00000000..a252db63
--- /dev/null
+++ b/test/br560575.asm
@@ -0,0 +1,17 @@
+;Testname=aout; Arguments=-faout -obr560575.o; Files=stderr stdout br560575.o
+;Testname=aoutb; Arguments=-faoutb -obr560575.o; Files=stderr stdout br560575.o
+;Testname=coff; Arguments=-fcoff -obr560575.o; Files=stderr stdout br560575.o
+;Testname=elf32; Arguments=-felf32 -obr560575.o; Files=stderr stdout br560575.o
+;Testname=elf64; Arguments=-felf64 -obr560575.o; Files=stderr stdout br560575.o
+;Testname=as86; Arguments=-fas86 -obr560575.o; Files=stderr stdout br560575.o
+;Testname=win32; Arguments=-fwin32 -obr560575.o; Files=stderr stdout br560575.o
+;Testname=win64; Arguments=-fwin64 -obr560575.o; Files=stderr stdout br560575.o
+;Testname=rdf; Arguments=-frdf -obr560575.o; Files=stderr stdout br560575.o
+;Testname=ieee; Arguments=-fieee -obr560575.o; Files=stderr stdout br560575.o
+;Testname=macho; Arguments=-fmacho -obr560575.o; Files=stderr stdout br560575.o
+
+;Test for bug report 560575 - Using SEG with non-relocatable values doesn't work
+;
+ dw seg ~1
+ dw seg "a"
+ dw seg 'a'
diff --git a/test/br560873.asm b/test/br560873.asm
new file mode 100644
index 00000000..21334926
--- /dev/null
+++ b/test/br560873.asm
@@ -0,0 +1,27 @@
+;Testname=unoptimized; Arguments=-O0 -frdf -obr560873.rdf; Files=stdout stderr br560873.rdf
+;Testname=optimized; Arguments=-Ox -frdf -obr560873.rdf; Files=stdout stderr br560873.rdf
+
+label:
+ bits 16
+ call far dword label
+ mov [label],ax
+ mov [label],eax
+ mov [word label],ax
+ mov [word label],eax
+ mov [dword label],ax
+ mov [dword label],eax
+ push 3700
+ push word 3700
+ push dword 3700
+
+ bits 32
+ call far word label
+ mov [label],ax
+ mov [label],eax
+ mov [word label],ax
+ mov [word label],eax
+ mov [dword label],ax
+ mov [dword label],eax
+ push 3700
+ push word 3700
+ push dword 3700
diff --git a/test/br890790.asm b/test/br890790.asm
new file mode 100644
index 00000000..a0023825
--- /dev/null
+++ b/test/br890790.asm
@@ -0,0 +1,7 @@
+;Testname=test; Arguments=-fbin -obr890790.bin; Files=stdout stderr br890790.bin
+%rep 5
+ db 0
+ %include "br890790_i.asm"
+%endrep
+
+db 1
diff --git a/test/br890790_i.asm b/test/br890790_i.asm
new file mode 100644
index 00000000..7ff797f3
--- /dev/null
+++ b/test/br890790_i.asm
@@ -0,0 +1 @@
+db 2
diff --git a/test/br978756.asm b/test/br978756.asm
new file mode 100644
index 00000000..3b85c2f4
--- /dev/null
+++ b/test/br978756.asm
@@ -0,0 +1,7 @@
+;Testname=br978756; Arguments=-Ox -felf64 -obr978756.o; Files=stdout stderr br978756.o
+[bits 64]
+ MOVNTDQA xmm1, oword [rsi]
+ MOVLPD xmm2, qword [rdi]
+ MOVLPD xmm2, [rdi]
+ MOVLPD qword [rdi], xmm2
+ MOVLPD [rdi], xmm2
diff --git a/test/changed.asm b/test/changed.asm
new file mode 100644
index 00000000..7ea2cc4d
--- /dev/null
+++ b/test/changed.asm
@@ -0,0 +1,383 @@
+;This file demonstrates many of the differences between NASM version X and NASM
+;version 0.97
+;
+; changed.asm is copyright (C) 1998 John S. Fine
+;
+; It may be redistributed under the same conditions as NASM as described in
+; LICENSE file in the NASM archive
+;_________________________________
+;
+; nasm changed.asm -l changed.lst
+;
+; When assembled without any -d switches, it includes examples which:
+; Work correctly in version X
+; and Work incorrectly and/or display warnings in version 0.97
+; and Do not prevent the generation of output in version 0.97
+;
+; Not all the differences can be seen in the .lst file. I suggest that you use
+; "ndisasm changes" to examine the code actually generated.
+;_________________________________
+;
+; nasm changed.asm -l changed.lst -doldmsg
+;
+; When assembled with -doldmsg, it adds examples which:
+; Work correctly in version X
+; and Generate error messages in version 0.97 and do not generate output
+;_________________________________
+;
+; nasm changed.asm -l changed.lst -doldcrash
+;
+; When assembled with -doldcrash, it adds examples which:
+; Work correctly in version X
+; and Cause NASM to crash in version 0.97
+;_________________________________
+;
+; nasm changed.asm -l changed.lst -dnewmsg
+;
+; When assembled with -dnewmsg, it adds examples which:
+; Generate error messages in version X
+; and Generate wrong output without warning or error message in version 0.97
+;-----------------------------------------------------------------------------
+
+; Please note that I have reported the name of the person who made the
+; correction based on very limited information. In several cases, I am sure I
+; will identify the wrong author. Please send me any corrections; I don't
+; intend to insult or exclude anyone.
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in assemble()
+;
+; The following generated "call next" / "call next-1" instead of
+; two copies of "call next"
+;
+ times 2 a16 call next
+next:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in parse_line() (and other routines)
+;
+; This used to jmp to prior.1, when it should be here.1
+;
+prior:
+.1:
+here: jmp .1
+.1:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in assemble()
+;
+; Strings used in dq and dt were not zero filled correctly
+;
+ dq 'b'
+
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in isn_names[]
+;
+; Was not recognised as an instruction
+;
+ int01 ; Instead of INT1
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Jim Hague in ???
+;
+; Forward references were instruction level rather than per operand
+;
+ shr word [forwardref],1
+forwardref:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; It used to silently discard id characters appended to a multi-line
+; macro parameter (such as the x in %1x below).
+;
+%macro xxx 1
+%1: nop
+%{1}x: jmp %1x
+%endmacro
+xxx yyy
+
+;-----------------------------------------------------------------------------
+; Bug added by John in preproc.c 0.98-J4, removed by John in 0.98-J5
+;
+; Tested here to make sure it stays removed
+;
+%macro TestElse 1
+%if %1=0
+%elif %1=1
+nop
+%endif
+%endmacro
+TestElse 1
+
+%ifdef oldmsg
+;***************************************************************
+;
+; The following examples will generate error messages in 0.97 and will generate
+; correct output in the new version.
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in isns.dat
+;
+; The optional "near" was not permitted on JMP and CALL
+;
+ jmp near here
+
+;-----------------------------------------------------------------------------
+; Feature added by Simon in stdscan()
+;
+; You can now use the numeric value of strings in %assign
+;
+%assign xxx 'ABCD'
+ dd xxx
+
+;-----------------------------------------------------------------------------
+; Feature added by John in add_vectors()
+;
+; Stranger address expressions are now supported as long as they resolve to
+; something valid.
+;
+ mov ax, [eax + ebx + ecx - eax]
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in ???
+;
+; The EQU directive affected local labels in a way that was inconsistent
+; between passes
+;
+.local:
+neither equ $
+ jmp .local
+
+;-----------------------------------------------------------------------------
+; Feature added by Jules in parse_line
+;
+; You can override a size specifier
+;
+%define arg1 dword [bp+4]
+ cmp word arg1, 2
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; You could not use a label on the same line with a macro invocation, if the
+; macro definition began with a preprocessor directive.
+;
+ struc mytype
+.long resd 1
+ endstruc
+
+lbl istruc mytype
+ at mytype.long, dd 'ABCD'
+ iend
+
+;-----------------------------------------------------------------------------
+; Warning removed by John in preproc.c
+;
+; In order to allow macros that extend the definition of instructions, I
+; disabled the warning on a multi-line macro referencing itself.
+;
+%endif ;NASM 0.97 doesn't handle %0 etc. inside false %if
+%macro push 1-* ;
+%rep %0 ;
+push %1 ;
+%rotate 1 ;
+%endrep ;
+%endmacro ;
+%ifdef oldmsg ;
+
+ push ax,bx
+
+;-----------------------------------------------------------------------------
+; Warning removed by John in preproc.c
+;
+; To support other types of macros that extend the definition of instructions,
+; I disabled the warning on a multi-line macro called with the wrong number of
+; parameters. PUSH and POP can be extended equally well by either method, but
+; other intruction extensions may need one method or the other, so I made both
+; work.
+;
+; Note that neither of these warnings was really needed, because a later stage
+; of NASM would almost always give an adequate error message if the macro use
+; really was wrong.
+;
+%endif
+%macro pop 2-*
+%rep %0
+pop %1
+%rotate 1
+%endrep
+%endmacro
+%ifdef oldmsg
+
+ pop ax,bx
+%endif
+
+
+%ifdef newmsg ;***************************************************************
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in parse_line() (and other routines)
+;
+; This invalid code used to assemble without errors
+;
+myself equ myself+1
+ jmp myself
+
+;-----------------------------------------------------------------------------
+; Change made by John in preproc.c
+;
+; In 0.97, an id that appears as a label on a macro invocation was always
+; prepended to the first line of the macro expansion. That caused several
+; bugs, but also could be used in tricks like the arg macro in c16.mac and
+; c32.mac.
+;
+; In version X, an id that appears as a label on a macro invocation will
+; normally be defined as a label for the address at which the macro is
+; invoked, regardless of whether the first line of the macro expansion is
+; something that can take a label. The new token %00 may be used for any
+; of the situations in which the old prepend behavior was doing something
+; tricky but useful. %00 can also be used more than once and in places
+; other than the start of the expansion.
+;
+%endif
+%assign arg_off 0
+
+%imacro arg 0-1 2 ;arg defined the old way
+ equ arg_off
+%assign arg_off %1+arg_off
+%endmacro
+
+%ifdef newmsg
+arg_example arg
+%endif
+
+%imacro arg2 0-1 2 ;arg defined the new way
+%00 equ arg_off
+%assign arg_off %1+arg_off
+%endmacro
+
+%ifdef oldmsg
+arg_example2 arg2
+
+;-----------------------------------------------------------------------------
+; Change made by Jules and John in INSNS.DAT
+;
+; Various instruction in which the size of an immediate is built-in to the
+; instruction set, now allow you to redundantly specify that size as long
+; as you specify it correctly
+;
+ AAD byte 5
+ AAM byte 5
+ BT bx, byte 3
+ BTC cx, byte 4
+ BTR dx, byte 5
+ BTS si, byte 6
+ IN eax, byte 0x40
+ INT byte 21h
+ OUT byte 70h, ax
+ RET word 2
+ RETN word 2
+ RETF word 4
+
+; note "ENTER" has not been changed yet.
+
+;-----------------------------------------------------------------------------
+; Enhancement by hpa in insns.dat et al
+;
+; Simplified adding new instructions, and added some missing instructions
+;
+ int03 ; Instead of INT3
+ ud1 ; No documented mnemonic for this one
+ ud2
+ sysenter
+ sysexit
+ syscall
+ sysret
+ fxsave [ebx]
+ fxrstor [es:ebx+esi*4+0x3000]
+
+;-----------------------------------------------------------------------------
+; Enhancement by hpa in insns.dat et al
+;
+; Actually make SSE work, and use the -p option to ndisasm to select
+; one of several aliased opcodes
+;
+ sqrtps xmm0,[ebx+10] ; SSE opcode
+ paddsiw mm0,[ebx+10] ; Cyrix opcode with the same byte seq.
+
+;-----------------------------------------------------------------------------
+; Enhancement by hpa in preproc.c
+;
+; Support %undef to remoce a single-line macro
+;
+%define TEST_ME 42
+%ifndef TEST_ME
+%error "TEST_ME not defined after %define"
+%endif
+
+%undef TEST_ME
+%ifdef TEST_ME
+%error "TEST_ME defined after %undef"
+%endif
+
+;-----------------------------------------------------------------------------
+; Bug fix by hpa in insns.dat
+;
+; PSHUFW and PINSRW weren't handling the implicit sizes correctly; all of
+; the entries below are (or should be) legal
+;
+ pshufw mm2, mm1, 3
+ pshufw mm3,[ebx],2
+ pshufw mm7,[0+edi*8],1
+
+ pshufw mm2, mm1, byte 3
+ pshufw mm3,[ebx],byte 2
+ pshufw mm7,[0+edi*8],byte 1
+
+ pshufw mm2, mm1, 3
+ pshufw mm3, qword [ebx], 2
+ pshufw mm7, qword [0+edi*8], 1
+
+ pshufw mm2, mm1, byte 3
+ pshufw mm3, qword [ebx], byte 2
+ pshufw mm7, qword [0+edi*8], byte 1
+
+ pinsrw mm1, [esi], 1
+ pinsrw mm1, word [esi], 1
+ pinsrw mm1, [esi], byte 1
+ pinsrw mm1, word [esi], byte 1
+
+
+%endif ; oldmsg
+
+%ifdef oldcrash ;*************************************************************
+
+This_label_is_256_characters_long__There_used_to_be_a_bug_in_stdscan_which_made_it_crash_when_it_did_a_keyword_search_on_any_label_longer_than_255_characters__Now_anything_longer_than_MAX_KEYWORD_is_always_a_symbol__It_will_not_even_try_a_keyword_search___
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; Builds of NASM that prohibit dereferencing a NULL pointer used to crash if a
+; macro that started with a blank line was invoked with a label
+;
+%macro empty_macro 0
+
+%endm
+
+emlabel empty_macro
+ jmp emlabel
+
+;-----------------------------------------------------------------------------
+; Enhancement by Conan Brink in preproc.c
+;
+; Allow %rep to be nested
+;
+%rep 4
+%rep 5
+ nop
+%endrep
+%endrep
+
+%endif
diff --git a/test/cofftest.asm b/test/cofftest.asm
new file mode 100644
index 00000000..6b845e2e
--- /dev/null
+++ b/test/cofftest.asm
@@ -0,0 +1,85 @@
+;Cannot be automatically tested because it differs every time,
+;I guess because of a date/time field.
+
+; test source file for assembling to COFF
+; build with (under DJGPP, for example):
+; nasm -f coff cofftest.asm
+; gcc -o cofftest cofftest.c cofftest.o
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+
+ BITS 32
+ GLOBAL _lrotate ; [1]
+ GLOBAL _greet ; [1]
+ GLOBAL _asmstr ; [2]
+ GLOBAL _textptr ; [2]
+ GLOBAL _selfptr ; [2]
+ GLOBAL _integer ; [3]
+ EXTERN _printf ; [10]
+ COMMON _commvar 4 ; [7]
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+_lrotate: ; [1]
+ push ebp
+ mov ebp,esp
+ mov eax,[ebp+8]
+ mov ecx,[ebp+12]
+.label rol eax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov esp,ebp
+ pop ebp
+ ret
+
+; prototype: void greet(void);
+_greet mov eax,[_integer] ; [14]
+ inc eax
+ mov [localint],eax ; [14]
+ push dword [_commvar]
+ mov eax,[localptr] ; [13]
+ push dword [eax]
+ push dword [_integer] ; [1] [14]
+ push dword _printfstr ; [13]
+ call _printf ; [11]
+ add esp,16
+ ret
+
+ SECTION .data
+
+; a string
+_asmstr db 'hello, world', 0 ; [2]
+
+; a string for Printf
+_printfstr db "integer==%d, localint==%d, commvar=%d"
+ db 10, 0
+
+; some pointers
+localptr dd localint ; [5] [17]
+_textptr dd _greet ; [15]
+_selfptr dd _selfptr ; [16]
+
+ SECTION .bss
+
+; an integer
+_integer resd 1 ; [3]
+
+; a local integer
+localint resd 1 ; [6]
diff --git a/test/cofftest.c b/test/cofftest.c
new file mode 100644
index 00000000..77f610fc
--- /dev/null
+++ b/test/cofftest.c
@@ -0,0 +1,35 @@
+/*
+ * test source file for assembling to COFF
+ * build with (under DJGPP, for example):
+ * nasm -f coff cofftest.asm
+ * gcc -o cofftest cofftest.c cofftest.o
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+
+extern int lrotate(int32_t, int);
+extern void greet(void);
+extern int8_t asmstr[];
+extern void *selfptr;
+extern void *textptr;
+extern int integer, commvar;
+
+int main(void)
+{
+
+ printf("Testing lrotate: should get 0x00400000, 0x00000001\n");
+ printf("lrotate(0x00040000, 4) = 0x%08lx\n", lrotate(0x40000, 4));
+ printf("lrotate(0x00040000, 14) = 0x%08lx\n", lrotate(0x40000, 14));
+
+ printf("This string should read `hello, world': `%s'\n", asmstr);
+
+ printf("The integers here should be 1234, 1235 and 4321:\n");
+ integer = 1234;
+ commvar = 4321;
+ greet();
+
+ printf("These pointers should be equal: %p and %p\n", &greet, textptr);
+
+ printf("So should these: %p and %p\n", selfptr, &selfptr);
+}
diff --git a/test/crc32.asm b/test/crc32.asm
new file mode 100644
index 00000000..c1ddb296
--- /dev/null
+++ b/test/crc32.asm
@@ -0,0 +1,37 @@
+;Testname=test; Arguments=-fbin -ocrc32.bin; Files=stdout stderr crc32.bin
+
+ bits 16
+
+ crc32 eax,cl
+ crc32 eax,byte [di]
+ crc32 eax,cx
+ crc32 eax,word [di]
+ crc32 eax,ecx
+ crc32 eax,dword [di]
+
+ bits 32
+ align 16
+
+ crc32 eax,cl
+ crc32 eax,byte [edi]
+ crc32 eax,cx
+ crc32 eax,word [edi]
+ crc32 eax,ecx
+ crc32 eax,dword [edi]
+
+ bits 64
+ align 16
+
+ crc32 eax,cl
+ crc32 eax,byte [rdi]
+ crc32 eax,r9b
+ crc32 eax,cx
+ crc32 eax,word [rdi]
+ crc32 eax,ecx
+ crc32 eax,dword [rdi]
+ crc32 rax,cl
+ crc32 rax,byte [rdi]
+ crc32 rax,r9b
+ crc32 rax,rcx
+ crc32 rax,qword [rdi]
+ crc32 rax,r9
diff --git a/test/ctxlocal.asm b/test/ctxlocal.asm
new file mode 100644
index 00000000..93e9fcae
--- /dev/null
+++ b/test/ctxlocal.asm
@@ -0,0 +1,25 @@
+;;
+;; Test of context-local labels
+;;
+
+ bits 64
+ extern everywhere ; Test of extern -> global promotion, too
+ extern tjosan
+here:
+ jz .there
+%push foo
+ jo %$mordor
+ hlt
+%$mordor:
+ nop
+%pop
+.there:
+ ret
+
+everywhere:
+ ret
+
+ global everywhere
+
+tjosan:
+ ret
diff --git a/test/cv8struc.asm b/test/cv8struc.asm
new file mode 100644
index 00000000..eac6d8bb
--- /dev/null
+++ b/test/cv8struc.asm
@@ -0,0 +1,14 @@
+struc A_STRUC
+ ._a: resw 1
+endstruc
+
+a_struc:
+ istruc A_STRUC
+ at A_STRUC._a, dw 1
+ iend
+
+ section .data
+foo:
+ dd 0x11111111
+.bar:
+ dd 0x22222222
diff --git a/test/dtbcd.asm b/test/dtbcd.asm
new file mode 100644
index 00000000..fcccff63
--- /dev/null
+++ b/test/dtbcd.asm
@@ -0,0 +1,72 @@
+;
+; This is a macro to generate packed BCD constants.
+; It is obsoleted by "dt" with a packed BCD value with a "p"
+; suffix, but it is included here as a rest of nested %rep.
+;
+%macro dtbcd 1-*.nolist
+ %push dtbcd
+ %rep %0
+ %defstr %$abc %1
+ %substr %$sign %$abc 1
+ %if %$sign == '-'
+ %substr %$abc %$abc 2,-1
+ %xdefine %$sign 0x80
+ %elif %$sign == '+'
+ %substr %$abc %$abc 2,-1
+ %xdefine %$sign 0x00
+ %else
+ %xdefine %$sign 0x00
+ %endif
+ %strlen %$abclen %$abc
+ %defstr %$abclen_str %$abclen
+ %assign %$pos %$abclen
+ %assign %$bc 0
+ %assign %$ld -1
+ %rep %$abclen
+ %substr %$chr %$abc %$pos
+ %assign %$pos %$pos-1
+ %if %$chr >= '0' && %$chr <= '9'
+ %if %$ld < 0
+ %assign %$ld %$chr-'0'
+ %assign %$bc %$bc+1
+ %if %$bc > 9
+ %warning "too many digits in BCD constant"
+ %exitrep
+ %endif
+ %else
+ db %$ld+((%$chr-'0') << 4)
+ %assign %$ld -1
+ %endif
+ %elif %$chr == '_'
+ ; Do nothing...
+ %else
+ %error "invalid character in BCD constant"
+ %exitrep
+ %endif
+ %endrep
+ %if %$ld >= 0
+ db %$ld
+ %endif
+ %rep 9-%$bc
+ db 0
+ %endrep
+ db %$sign
+ %rotate 1
+ %endrep
+ %pop
+%endmacro
+
+ dtbcd 123, -456, +789
+ dt 123p, -456p, +789p
+ dtbcd 765432109876543210
+ dt 765432109876543210p
+ dtbcd -765432109876543210
+ dt -765432109876543210p
+ dtbcd +765_432_109_876_543_210
+ dt +765_432_109_876_543_210p
+ dtbcd -765_432_109_876_543_210
+ dt -765_432_109_876_543_210p
+
+ ;; Both of these should warn...
+ dtbcd 8_765_432_109_876_543_210
+ dt 8_765_432_109_876_543_210p
diff --git a/test/elf64so.asm b/test/elf64so.asm
new file mode 100644
index 00000000..f1b23464
--- /dev/null
+++ b/test/elf64so.asm
@@ -0,0 +1,118 @@
+; test source file for assembling to ELF64 shared library
+; build with:
+; nasm -f elf64 elf64so.asm
+; ld -shared -o elf64so.so elf64so.o
+; test with:
+; gcc -o elf64so elftest64.c ./elf64so.so
+; ./elf64so
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+
+ BITS 64
+ GLOBAL lrotate:function ; [1]
+ GLOBAL greet_s:function ; [1]
+ GLOBAL greet_m:function ; [1]
+ GLOBAL asmstr:data asmstr.end-asmstr ; [2]
+ GLOBAL textptr:data 8 ; [2]
+ GLOBAL selfptr:data 8 ; [2]
+ GLOBAL useless:data 8 ; [3]
+ GLOBAL integer:data 8 ; [3]
+ EXTERN printf ; [10]
+ COMMON commvar 8:8 ; [7]
+ EXTERN _GLOBAL_OFFSET_TABLE_
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+lrotate: ; [1]
+ push rbp
+ mov rbp,rsp
+ mov rax,rdi
+ mov rcx,rsi
+.label rol rax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov rsp,rbp
+ pop rbp
+ ret
+
+;; prototype: void greet_*(void);
+;;
+;; Arguments are: rdi - rsi - rdx - rcx - r8 - r9
+;; Registers: rbx, rbp, r12-r15 are saved
+;; greet_s() is Small PIC model, greet_m() is Medium PIC model
+;; (Large model cannot be linked with other code)
+;;
+greet_s:
+ ;; This instruction is useless, this is only a test...
+ cmp qword [rel integer wrt ..got],0
+ mov rax,[rel commvar wrt ..got] ; &commvar
+ mov rcx,[rax] ; commvar
+ mov rax,[rel integer wrt ..got] ; &integer
+ mov rsi,[rax]
+ lea rdx,[rsi+1]
+ mov [rel localint],rdx ; localint = integer+1
+ mov rax,[rel localptr] ; localptr
+ mov rdx,[rax] ; *localptr = localint
+ lea rdi,[rel printfstr]
+ xor eax,eax ; No fp arguments
+ jmp printf wrt ..plt ; [10]
+
+greet_m:
+ push r15 ; Used by convention...
+ lea r15,[rel _GLOBAL_OFFSET_TABLE_]
+ mov rax,[rel commvar wrt ..got] ; &commvar
+ mov rcx,[rax] ; commvar
+ mov rax,[rel integer wrt ..got] ; &integer
+ mov rsi,[rax]
+ lea rdx,[rsi+1]
+ mov rax,localint wrt ..gotoff ; &localint - r15
+ mov [rax+r15],rdx ; localint = integer+1
+ mov rax,localptr wrt ..gotoff ; &localptr - r15
+ mov rax,[rax+r15] ; localptr
+ mov rdx,[rax] ; *localptr = localint
+ mov rdi,printfstr wrt ..gotoff ; &printfstr - r15
+ add rdi,r15 ; &printfstr
+ xor eax,eax ; No fp arguments
+ pop r15
+ jmp printf wrt ..plt ; [10]
+
+ SECTION .data
+
+; a string
+asmstr db 'hello, world', 0 ; [2]
+.end:
+
+; a string for Printf
+printfstr db "integer=%ld, localint=%ld, commvar=%ld", 10, 0
+
+; some pointers
+localptr dq localint ; [5] [17]
+textptr dq greet_s wrt ..sym ; [15]
+selfptr dq selfptr wrt ..sym ; [16]
+
+ SECTION .bss
+; a useless symbol
+useless resq 1
+
+; an integer
+integer resq 1 ; [3]
+
+; a local integer
+localint resq 1 ; [6]
diff --git a/test/elf_visibility.asm b/test/elf_visibility.asm
new file mode 100644
index 00000000..4874b62d
--- /dev/null
+++ b/test/elf_visibility.asm
@@ -0,0 +1,10 @@
+global foo
+global foo_hidden:function hidden
+
+SECTION .text align=16
+
+foo:
+foo_hidden:
+foo_label:
+ret
+
diff --git a/test/elfso.asm b/test/elfso.asm
new file mode 100644
index 00000000..e72497ba
--- /dev/null
+++ b/test/elfso.asm
@@ -0,0 +1,100 @@
+;Testname=unoptimized; Arguments=-O0 -felf -oelfso.o; Files=stdout stderr elfso.o
+;Testname=optimized; Arguments=-Ox -felf -oelfso.o; Files=stdout stderr elfso.o
+
+; test source file for assembling to ELF shared library
+; build with:
+; nasm -f elf elfso.asm
+; ld -shared -o elfso.so elfso.o
+; test with:
+; gcc -o elfso elftest.c ./elfso.so
+; ./elfso
+; (assuming your gcc is ELF, and you're running bash)
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+
+ BITS 32
+ GLOBAL lrotate:function ; [1]
+ GLOBAL greet:function ; [1]
+ GLOBAL asmstr:data asmstr.end-asmstr ; [2]
+ GLOBAL textptr:data 4 ; [2]
+ GLOBAL selfptr:data 4 ; [2]
+ GLOBAL integer:data 4 ; [3]
+ EXTERN printf ; [10]
+ COMMON commvar 4:4 ; [7]
+ EXTERN _GLOBAL_OFFSET_TABLE_
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+lrotate: ; [1]
+ push ebp
+ mov ebp,esp
+ mov eax,[ebp+8]
+ mov ecx,[ebp+12]
+.label rol eax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov esp,ebp
+ pop ebp
+ ret
+
+; prototype: void greet(void);
+greet push ebx ; we'll use EBX for GOT, so save it
+ call .getgot
+.getgot: pop ebx
+ add ebx,_GLOBAL_OFFSET_TABLE_ + $$ - .getgot wrt ..gotpc
+ mov eax,[ebx+integer wrt ..got] ; [14]
+ mov eax,[eax]
+ inc eax
+ mov [ebx+localint wrt ..gotoff],eax ; [14]
+ mov eax,[ebx+commvar wrt ..got]
+ push dword [eax]
+ mov eax,[ebx+localptr wrt ..gotoff] ; [13]
+ push dword [eax]
+ mov eax,[ebx+integer wrt ..got] ; [1] [14]
+ push dword [eax]
+ lea eax,[ebx+printfstr wrt ..gotoff]
+ push eax ; [13]
+ call printf wrt ..plt ; [11]
+ add esp,16
+ pop ebx
+ ret
+
+ SECTION .data
+
+; a string
+asmstr db 'hello, world', 0 ; [2]
+.end
+
+; a string for Printf
+printfstr db "integer==%d, localint==%d, commvar=%d"
+ db 10, 0
+
+; some pointers
+localptr dd localint ; [5] [17]
+textptr dd greet wrt ..sym ; [15]
+selfptr dd selfptr wrt ..sym ; [16]
+
+ SECTION .bss
+
+; an integer
+integer resd 1 ; [3]
+
+; a local integer
+localint resd 1 ; [6]
diff --git a/test/elftest.asm b/test/elftest.asm
new file mode 100644
index 00000000..fcfb362b
--- /dev/null
+++ b/test/elftest.asm
@@ -0,0 +1,87 @@
+; test source file for assembling to ELF
+; build with:
+; nasm -f elf elftest.asm
+; gcc -o elftest elftest.c elftest.o
+; (assuming your gcc is ELF)
+
+; This file should test the following:
+; [1] Define and export a global text-section symbol
+; [2] Define and export a global data-section symbol
+; [3] Define and export a global BSS-section symbol
+; [4] Define a non-global text-section symbol
+; [5] Define a non-global data-section symbol
+; [6] Define a non-global BSS-section symbol
+; [7] Define a COMMON symbol
+; [8] Define a NASM local label
+; [9] Reference a NASM local label
+; [10] Import an external symbol
+; [11] Make a PC-relative call to an external symbol
+; [12] Reference a text-section symbol in the text section
+; [13] Reference a data-section symbol in the text section
+; [14] Reference a BSS-section symbol in the text section
+; [15] Reference a text-section symbol in the data section
+; [16] Reference a data-section symbol in the data section
+; [17] Reference a BSS-section symbol in the data section
+; [18] Define a non-global rodata-section symbol
+
+ BITS 32
+ GLOBAL lrotate ; [1]
+ GLOBAL greet ; [1]
+ GLOBAL asmstr ; [2]
+ GLOBAL textptr ; [2]
+ GLOBAL selfptr ; [2]
+ GLOBAL integer ; [3]
+ EXTERN printf ; [10]
+ COMMON commvar 4 ; [7]
+
+ SECTION .text
+
+; prototype: long lrotate(long x, int num);
+lrotate: ; [1]
+ push ebp
+ mov ebp,esp
+ mov eax,[ebp+8]
+ mov ecx,[ebp+12]
+.label rol eax,1 ; [4] [8]
+ loop .label ; [9] [12]
+ mov esp,ebp
+ pop ebp
+ ret
+
+; prototype: void greet(void);
+greet mov eax,[integer] ; [14]
+ inc eax
+ mov [localint],eax ; [14]
+ push dword [commvar]
+ mov eax,[localptr] ; [13]
+ push dword [eax]
+ push dword [integer] ; [1] [14]
+ push dword printfstr ; [13]
+ call printf ; [11]
+ add esp,16
+ ret
+
+ SECTION .data
+
+; a string
+asmstr db 'hello, world', 0 ; [2]
+
+; a string for Printf
+printfstr db "integer==%d, localint==%d, commvar=%d"
+ db 10, 0
+
+; some pointers
+localptr dd localint ; [5] [17]
+textptr dd greet ; [15]
+selfptr dd selfptr ; [16]
+
+ SECTION .bss
+
+; an integer
+integer resd 1 ; [3]
+
+; a local integer
+localint resd 1 ; [6]
+
+ SECTION .rodata
+readonly dd readonly ; [18]
diff --git a/test/elftest.c b/test/elftest.c
new file mode 100644
index 00000000..42b3f7e9
--- /dev/null
+++ b/test/elftest.c
@@ -0,0 +1,38 @@
+/*
+ * test source file for assembling to ELF
+ * build with:
+ * nasm -f elf elftest.asm
+ * gcc -o elftest elftest.c elftest.o
+ * (assuming your gcc is ELF)
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+
+extern int lrotate(int32_t, int);
+extern void greet(void);
+extern int8_t asmstr[];
+extern void *selfptr;
+extern void *textptr;
+extern int integer, commvar;
+
+int main(void)
+{
+
+ printf("Testing lrotate: should get 0x00400000, 0x00000001\n");
+ printf("lrotate(0x00040000, 4) = 0x%08lx\n", lrotate(0x40000, 4));
+ printf("lrotate(0x00040000, 14) = 0x%08lx\n", lrotate(0x40000, 14));
+
+ printf("This string should read `hello, world': `%s'\n", asmstr);
+
+ printf("The integers here should be 1234, 1235 and 4321:\n");
+ integer = 1234;
+ commvar = 4321;
+ greet();
+
+ printf("These pointers should be equal: %p and %p\n", &greet, textptr);
+
+ printf("So should these: %p and %p\n", selfptr, &selfptr);
+
+ return 0;
+}
diff --git a/test/elftest64.c b/test/elftest64.c
new file mode 100644
index 00000000..1f3dec1f
--- /dev/null
+++ b/test/elftest64.c
@@ -0,0 +1,43 @@
+/*
+ * build with:
+ * nasm -f elf64 elf64so.asm
+ * ld -shared -o elf64so.so elf64so.o
+ * test with:
+ * gcc -o elf64so elftest64.c ./elf64so.so
+ * ./elf64so
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+
+extern long lrotate(long, int);
+extern void greet_s(void);
+extern void greet_m(void);
+extern int8_t asmstr[];
+extern void *selfptr;
+extern void *textptr;
+extern long integer;
+long commvar;
+
+int main(void)
+{
+
+ printf("Testing lrotate: should get 0x00400000, 0x00000001\n");
+ printf("lrotate(0x00040000, 4) = 0x%08lx\n", lrotate(0x40000, 4));
+ printf("lrotate(0x00040000, 46) = 0x%08lx\n", lrotate(0x40000, 46));
+
+ printf("This string should read `hello, world': `%s'\n", asmstr);
+
+ printf("&integer = %p, &commvar = %p\n", &integer, &commvar);
+ printf("The integers here should be 1234, 1235 and 4321:\n");
+ integer = 1234;
+ commvar = 4321;
+ greet_s();
+ greet_m();
+
+ printf("These pointers should be equal: %p and %p\n", &greet_s, textptr);
+
+ printf("So should these: %p and %p\n", selfptr, &selfptr);
+
+ return 0;
+}
diff --git a/test/elif.asm b/test/elif.asm
new file mode 100644
index 00000000..49e66688
--- /dev/null
+++ b/test/elif.asm
@@ -0,0 +1,39 @@
+;Testname=unoptimized; Arguments=-O0 -fobj -oelif.obj; Files=stdout stderr elif.obj
+;Testname=optimized; Arguments=-Ox -fobj -oelif.obj; Files=stdout stderr elif.obj
+
+%macro DosPrintMsg 1+
+%ifnid %1
+section .data
+%%str_to_print:db %1
+section .text
+ mov dx,%%str_to_print
+ mov ah,9
+ int 0x21
+%else
+ mov dx,(%1)
+ mov ah,9
+ int 0x21
+%endif
+%endmacro
+
+%macro DosExit 1
+%if (%1) == 0
+;use short-form return 0 exit
+ int 0x20
+%elif ((%1) < 256) && ((%1) > 0)
+ mov ax,0x4C00 | (%1)
+ int 0x21
+%else
+%error Invalid return value
+%endif
+%endmacro
+
+org 0x100
+ DosPrintMsg predefined_str
+ DosPrintMsg "Using string with macro-defined label",10,0
+ DosExit 0
+ DosExit 1
+ DosExit 256
+
+section .data
+predefined_str:db "Using string with predefined label",10,0
diff --git a/test/expimp.asm b/test/expimp.asm
new file mode 100644
index 00000000..89e32a14
--- /dev/null
+++ b/test/expimp.asm
@@ -0,0 +1,90 @@
+;Testname=O0; Arguments=-O0 -fbin -oexpimp.bin; Files=stdout stderr expimp.bin
+;Testname=O1; Arguments=-O1 -fbin -oexpimp.bin; Files=stdout stderr expimp.bin
+;Testname=Ox; Arguments=-Ox -fbin -oexpimp.bin; Files=stdout stderr expimp.bin
+;Testname=error-O0; Arguments=-O0 -fbin -oexpimp.bin -DERROR; Files=stdout stderr expimp.bin
+;Testname=error-Ox; Arguments=-Ox -fbin -oexpimp.bin -DERROR; Files=stdout stderr expimp.bin
+
+;
+; Test of explicitly and implicitly sized operands
+;
+ BITS 32
+
+ add esi,2 ; Implicit
+ add esi,123456h ; Implicit
+ add esi,byte 2 ; Explicit
+ add esi,dword 2 ; Explicit
+ add esi,dword 123456h ; Explicit
+ add esi,byte 123456h ; Explicit Truncation
+
+ add esi,strict 2 ; Implicit Strict
+ add esi,strict 123456h ; Implicit Strict
+ add esi,strict byte 2 ; Explicit Strict
+ add esi,strict dword 2 ; Explicit Strict
+ add esi,strict dword 123456h ; Explicit Strict
+ add esi,strict byte 123456h ; Explicit Strict Truncation
+
+ add eax,2 ; Implicit
+ add eax,123456h ; Implicit
+ add eax,byte 2 ; Explicit
+ add eax,dword 2 ; Explicit
+ add eax,dword 123456h ; Explicit
+ add eax,byte 123456h ; Explicit Truncation
+
+ add eax,strict 2 ; Implicit Strict
+ add eax,strict 123456h ; Implicit Strict
+ add eax,strict byte 2 ; Explicit Strict
+ add eax,strict dword 2 ; Explicit Strict
+ add eax,strict dword 123456h ; Explicit Strict
+ add eax,strict byte 123456h ; Explicit Strict Truncation
+
+ imul dx,3 ; Implicit
+ imul dx,byte 3 ; Explicit
+ imul dx,word 3 ; Explicit
+ imul dx,strict byte 3 ; Explicit Strict
+ imul dx,strict word 3 ; Explicit Strict
+
+;
+; Same thing with branches
+;
+start:
+ jmp short start ; Explicit
+ jmp near start ; Explicit
+ jmp word start ; Explicit
+ jmp dword start ; Explicit
+ jmp short forward ; Explicit
+ jmp near forward ; Explicit
+ jmp word forward ; Explicit
+ jmp dword forward ; Explicit
+%ifdef ERROR
+ jmp short faraway ; Explicit (ERROR)
+%endif
+ jmp near faraway ; Explicit
+ jmp word faraway ; Explicit
+ jmp dword faraway ; Explicit
+ jmp start ; Implicit
+ jmp forward ; Implicit
+ jmp faraway ; Implicit
+
+ jmp strict short start ; Explicit Strict
+ jmp strict near start ; Explicit Strict
+ jmp strict word start ; Explicit Strict
+ jmp strict dword start ; Explicit Strict
+ jmp strict short forward ; Explicit Strict
+ jmp strict near forward ; Explicit Strict
+ jmp strict word forward ; Explicit Strict
+ jmp strict dword forward ; Explicit Strict
+%ifdef ERROR
+ jmp strict short faraway ; Explicit (ERROR)
+%endif
+ jmp strict near faraway ; Explicit Strict
+ jmp strict word faraway ; Explicit Strict
+ jmp strict dword faraway ; Explicit Strict
+ jmp strict start ; Implicit Strict
+ jmp strict forward ; Implicit Strict
+ jmp strict faraway ; Implicit Strict
+forward:
+
+ times 256 nop
+faraway:
+
+
diff --git a/test/far64.asm b/test/far64.asm
new file mode 100644
index 00000000..e18bca42
--- /dev/null
+++ b/test/far64.asm
@@ -0,0 +1,10 @@
+;Testname=test; Arguments=-fbin -ofar64.bin; Files=stdout stderr far64.bin
+; BR 2039212
+ bits 64
+
+ call qword far [rax]
+ jmp qword far [rax]
+ call dword far [rax]
+ jmp dword far [rax]
+ call far [rax]
+ jmp far [rax]
diff --git a/test/float.asm b/test/float.asm
new file mode 100644
index 00000000..88519b2e
--- /dev/null
+++ b/test/float.asm
@@ -0,0 +1,186 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -ofloat.bin; Files=stdout stderr float.bin
+;Testname=optimized; Arguments=-Ox -fbin -ofloat.bin; Files=stdout stderr float.bin
+
+;
+; Test of floating-point formats
+;
+
+; 8-bit
+ db 1.0
+ db +1.0
+ db -1.0
+ db 1.5
+ db +1.5
+ db -1.5
+ db 0.0
+ db +0.0
+ db -0.0
+ db 1.83203125
+ db +1.83203125
+ db -1.83203125
+ db 1.83203125e1
+ db +1.83203125e1
+ db -1.83203125e1
+ db 1.83203125e-1
+ db +1.83203125e-1
+ db -1.83203125e-1
+ db 1.13203125e-2 ; Denormal!
+ db +1.13203125e-2 ; Denormal!
+ db -1.13203125e-2 ; Denormal!
+ db __Infinity__
+ db +__Infinity__
+ db -__Infinity__
+ db __NaN__
+ db __QNaN__
+ db __SNaN__
+ db 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
+
+; 16-bit
+ dw 1.0
+ dw +1.0
+ dw -1.0
+ dw 1.5
+ dw +1.5
+ dw -1.5
+ dw 0.0
+ dw +0.0
+ dw -0.0
+ dw 1.83203125
+ dw +1.83203125
+ dw -1.83203125
+ dw 1.83203125e3
+ dw +1.83203125e3
+ dw -1.83203125e3
+ dw 1.83203125e-3
+ dw +1.83203125e-3
+ dw -1.83203125e-3
+ dw 1.83203125e-6 ; Denormal!
+ dw +1.83203125e-6 ; Denormal!
+ dw -1.83203125e-6 ; Denormal!
+ dw __Infinity__
+ dw +__Infinity__
+ dw -__Infinity__
+ dw __NaN__
+ dw __QNaN__
+ dw __SNaN__
+ dw 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
+
+; 32-bit
+ dd 1.0
+ dd +1.0
+ dd -1.0
+ dd 1.5
+ dd +1.5
+ dd -1.5
+ dd 0.0
+ dd +0.0
+ dd -0.0
+ dd 1.83203125
+ dd +1.83203125
+ dd -1.83203125
+ dd 1.83203125e15
+ dd +1.83203125e15
+ dd -1.83203125e15
+ dd 1.83203125e-15
+ dd +1.83203125e-15
+ dd -1.83203125e-15
+ dd 1.83203125e-40 ; Denormal!
+ dd +1.83203125e-40 ; Denormal!
+ dd -1.83203125e-40 ; Denormal!
+ dd __Infinity__
+ dd +__Infinity__
+ dd -__Infinity__
+ dd __NaN__
+ dd __QNaN__
+ dd __SNaN__
+ dd 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
+
+; 64-bit
+ dq 1.0
+ dq +1.0
+ dq -1.0
+ dq 1.5
+ dq +1.5
+ dq -1.5
+ dq 0.0
+ dq +0.0
+ dq -0.0
+ dq 1.83203125
+ dq +1.83203125
+ dq -1.83203125
+ dq 1.83203125e300
+ dq +1.83203125e300
+ dq -1.83203125e300
+ dq 1.83203125e-300
+ dq +1.83203125e-300
+ dq -1.83203125e-300
+ dq 1.83203125e-320 ; Denormal!
+ dq +1.83203125e-320 ; Denormal!
+ dq -1.83203125e-320 ; Denormal!
+ dq __Infinity__
+ dq +__Infinity__
+ dq -__Infinity__
+ dq __NaN__
+ dq __QNaN__
+ dq __SNaN__
+ dq 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
+
+; 80-bit
+ dt 1.0
+ dt +1.0
+ dt -1.0
+ dt 1.5
+ dt +1.5
+ dt -1.5
+ dt 0.0
+ dt +0.0
+ dt -0.0
+ dt 1.83203125
+ dt +1.83203125
+ dt -1.83203125
+ dt 1.83203125e+4000
+ dt +1.83203125e+4000
+ dt -1.83203125e+4000
+ dt 1.83203125e-4000
+ dt +1.83203125e-4000
+ dt -1.83203125e-4000
+ dt 1.83203125e-4940 ; Denormal!
+ dt +1.83203125e-4940 ; Denormal!
+ dt -1.83203125e-4940 ; Denormal!
+ dt __Infinity__
+ dt +__Infinity__
+ dt -__Infinity__
+ dt __NaN__
+ dt __QNaN__
+ dt __SNaN__
+ dt 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
+
+; 128-bit
+ do 1.0
+ do +1.0
+ do -1.0
+ do 1.5
+ do +1.5
+ do -1.5
+ do 0.0
+ do +0.0
+ do -0.0
+ do 1.83203125
+ do +1.83203125
+ do -1.83203125
+ do 1.83203125e+4000
+ do +1.83203125e+4000
+ do -1.83203125e+4000
+ do 1.83203125e-4000
+ do +1.83203125e-4000
+ do -1.83203125e-4000
+ do 1.83203125e-4940 ; Denormal!
+ do +1.83203125e-4940 ; Denormal!
+ do -1.83203125e-4940 ; Denormal!
+ do __Infinity__
+ do +__Infinity__
+ do -__Infinity__
+ do __NaN__
+ do __QNaN__
+ do __SNaN__
+ do 3.1415926535_8979323846_2643383279_5028841971_6939937510_5
diff --git a/test/float8.asm b/test/float8.asm
new file mode 100644
index 00000000..d59abecc
--- /dev/null
+++ b/test/float8.asm
@@ -0,0 +1,135 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -ofloat8.bin; Files=stdout stderr float8.bin
+;Testname=optimized; Arguments=-Ox -fbin -ofloat8.bin; Files=stdout stderr float8.bin
+
+; Test of 8-bit floating-point constants
+
+ ; Zero
+ db 0.0 ; 00h
+
+ ; Denorms
+ db 0.001953125 ; 01h
+ db 0.00390625 ; 02h
+ db 0.005859375 ; 03h
+ db 0.0078125 ; 04h
+ db 0.009765625 ; 05h
+ db 0.01171875 ; 06h
+ db 0.013671875 ; 07h
+
+ ; Normals
+ db 0.015625 ; 08h
+ db 0.017578125 ; 09h
+ db 0.01953125 ; 0Ah
+ db 0.021484375 ; 0Bh
+ db 0.0234375 ; 0Ch
+ db 0.025390625 ; 0Dh
+ db 0.02734375 ; 0Eh
+ db 0.029296875 ; 0Fh
+ db 0.03125 ; 10h
+ db 0.03515625 ; 11h
+ db 0.0390625 ; 12h
+ db 0.04296875 ; 13h
+ db 0.046875 ; 14h
+ db 0.05078125 ; 15h
+ db 0.0546875 ; 16h
+ db 0.05859375 ; 17h
+ db 0.0625 ; 18h
+ db 0.0703125 ; 19h
+ db 0.078125 ; 1Ah
+ db 0.0859375 ; 1Bh
+ db 0.09375 ; 1Ch
+ db 0.1015625 ; 1Dh
+ db 0.109375 ; 1Eh
+ db 0.1171875 ; 1Fh
+ db 0.125 ; 20h
+ db 0.140625 ; 21h
+ db 0.15625 ; 22h
+ db 0.171875 ; 23h
+ db 0.1875 ; 24h
+ db 0.203125 ; 25h
+ db 0.21875 ; 26h
+ db 0.234375 ; 27h
+ db 0.25 ; 28h
+ db 0.28125 ; 29h
+ db 0.3125 ; 2Ah
+ db 0.34375 ; 2Bh
+ db 0.375 ; 2Ch
+ db 0.40625 ; 2Dh
+ db 0.4375 ; 2Eh
+ db 0.46875 ; 2Fh
+ db 0.5 ; 30h
+ db 0.5625 ; 31h
+ db 0.625 ; 32h
+ db 0.6875 ; 33h
+ db 0.75 ; 34h
+ db 0.8125 ; 35h
+ db 0.875 ; 36h
+ db 0.9375 ; 37h
+ db 1.0 ; 38h
+ db 1.125 ; 39h
+ db 1.25 ; 3Ah
+ db 1.375 ; 3Bh
+ db 1.5 ; 3Ch
+ db 1.625 ; 3Dh
+ db 1.75 ; 3Eh
+ db 1.875 ; 3Fh
+ db 2.0 ; 40h
+ db 2.25 ; 41h
+ db 2.5 ; 42h
+ db 2.75 ; 43h
+ db 3.0 ; 44h
+ db 3.25 ; 45h
+ db 3.5 ; 46h
+ db 3.75 ; 47h
+ db 4.0 ; 48h
+ db 4.5 ; 49h
+ db 5.0 ; 4Ah
+ db 5.5 ; 4Bh
+ db 6.0 ; 4Ch
+ db 6.5 ; 4Dh
+ db 7.0 ; 4Eh
+ db 7.5 ; 4Fh
+ db 8.0 ; 50h
+ db 9.0 ; 51h
+ db 10.0 ; 52h
+ db 11.0 ; 53h
+ db 12.0 ; 54h
+ db 13.0 ; 55h
+ db 14.0 ; 56h
+ db 15.0 ; 57h
+ db 16.0 ; 58h
+ db 18.0 ; 59h
+ db 20.0 ; 5Ah
+ db 22.0 ; 5Bh
+ db 24.0 ; 5Ch
+ db 26.0 ; 5Dh
+ db 28.0 ; 5Eh
+ db 30.0 ; 5Fh
+ db 32.0 ; 60h
+ db 36.0 ; 61h
+ db 40.0 ; 62h
+ db 44.0 ; 63h
+ db 48.0 ; 64h
+ db 52.0 ; 65h
+ db 56.0 ; 66h
+ db 60.0 ; 67h
+ db 64.0 ; 68h
+ db 72.0 ; 69h
+ db 80.0 ; 6Ah
+ db 88.0 ; 6Bh
+ db 96.0 ; 6Ch
+ db 104.0 ; 6Dh
+ db 112.0 ; 6Eh
+ db 120.0 ; 6Fh
+ db 128.0 ; 70h
+ db 144.0 ; 71h
+ db 160.0 ; 72h
+ db 176.0 ; 73h
+ db 192.0 ; 74h
+ db 208.0 ; 75h
+ db 224.0 ; 76h
+ db 240.0 ; 77h
+
+ ; Exceptionals
+ db __Infinity__ ; 78h
+ db __SNaN__ ; 79h
+ db __QNaN__ ; 7Ch
diff --git a/test/floatb.asm b/test/floatb.asm
new file mode 100644
index 00000000..dc0422e0
--- /dev/null
+++ b/test/floatb.asm
@@ -0,0 +1,35 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -ofloatb.bin; Files=stdout stderr floatb.bin
+;Testname=optimized; Arguments=-Ox -fbin -ofloatb.bin; Files=stdout stderr floatb.bin
+
+ ;; Known problematic floating-point numbers and their proper
+ ;; encoding...
+
+ bits 64
+
+ dd 1.1e10
+ dd 0x5023e9ac ; Should be...
+
+ dd 50.40e9
+ dd 0x513bc130 ; Should be...
+
+ dq 1.4e23
+ dq 0x44bda56a4b0835c0
+
+ dq 50.48e21
+ dq 0x44a5610d7502feae
+
+ dt 1.2e28
+ dq 0x9b18ab5df7180b6c
+ dw 0x405c
+
+ dt 50.46e25
+ dq 0xd0b29a67e95dcb60
+ dw 0x4057
+
+ ;; Way too big numbers, should overflow to +Inf
+ dd 1.0E646456955
+ dd 1.0E646456956
+ dd 1.0E2147483646
+ dd 1.0E2147483647
+ dd 1.0E2147483648
+ dd 1.0E2147483649
diff --git a/test/floatexp.asm b/test/floatexp.asm
new file mode 100644
index 00000000..2bc359eb
--- /dev/null
+++ b/test/floatexp.asm
@@ -0,0 +1,382 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -ofloatexp.bin; Files=stdout stderr floatexp.bin
+;Testname=optimized; Arguments=-Ox -fbin -ofloatexp.bin; Files=stdout stderr floatexp.bin
+
+ bits 64
+;
+; Test of floating-point formats
+;
+
+; 8-bit
+ mov al,__float8__(1.0)
+ mov al,__float8__(+1.0)
+ mov al,__float8__(-1.0)
+ mov al,__float8__(0.0)
+ mov al,__float8__(+0.0)
+ mov al,__float8__(-0.0)
+ mov al,__float8__(1.83203125)
+ mov al,__float8__(+1.83203125)
+ mov al,__float8__(-1.83203125)
+ mov al,__float8__(1.83203125e1)
+ mov al,__float8__(+1.83203125e1)
+ mov al,__float8__(-1.83203125e1)
+ mov al,__float8__(1.83203125e-1)
+ mov al,__float8__(+1.83203125e-1)
+ mov al,__float8__(-1.83203125e-1)
+ mov al,__float8__(1.13203125e-2) ; Denormal!
+ mov al,__float8__(+1.13203125e-2) ; Denormal!
+ mov al,__float8__(-1.13203125e-2) ; Denormal!
+ mov al,__float8__(__Infinity__)
+ mov al,__float8__(+__Infinity__)
+ mov al,__float8__(-__Infinity__)
+ mov al,__float8__(__NaN__)
+ mov al,__float8__(__QNaN__)
+ mov al,__float8__(__SNaN__)
+
+; 16-bit
+ mov ax,__float16__(1.0)
+ mov ax,__float16__(+1.0)
+ mov ax,__float16__(-1.0)
+ mov ax,__float16__(0.0)
+ mov ax,__float16__(+0.0)
+ mov ax,__float16__(-0.0)
+ mov ax,__float16__(1.83203125)
+ mov ax,__float16__(+1.83203125)
+ mov ax,__float16__(-1.83203125)
+ mov ax,__float16__(1.83203125e3)
+ mov ax,__float16__(+1.83203125e3)
+ mov ax,__float16__(-1.83203125e3)
+ mov ax,__float16__(1.83203125e-3)
+ mov ax,__float16__(+1.83203125e-3)
+ mov ax,__float16__(-1.83203125e-3)
+ mov ax,__float16__(1.83203125e-6) ; Denormal!
+ mov ax,__float16__(+1.83203125e-6) ; Denormal!
+ mov ax,__float16__(-1.83203125e-6) ; Denormal!
+ mov ax,__float16__(__Infinity__)
+ mov ax,__float16__(+__Infinity__)
+ mov ax,__float16__(-__Infinity__)
+ mov ax,__float16__(__NaN__)
+ mov ax,__float16__(__QNaN__)
+ mov ax,__float16__(__SNaN__)
+
+; 32-bit
+ mov eax,__float32__(1.0)
+ mov eax,__float32__(+1.0)
+ mov eax,__float32__(-1.0)
+ mov eax,__float32__(0.0)
+ mov eax,__float32__(+0.0)
+ mov eax,__float32__(-0.0)
+ mov eax,__float32__(1.83203125)
+ mov eax,__float32__(+1.83203125)
+ mov eax,__float32__(-1.83203125)
+ mov eax,__float32__(1.83203125e15)
+ mov eax,__float32__(+1.83203125e15)
+ mov eax,__float32__(-1.83203125e15)
+ mov eax,__float32__(1.83203125e-15)
+ mov eax,__float32__(+1.83203125e-15)
+ mov eax,__float32__(-1.83203125e-15)
+ mov eax,__float32__(1.83203125e-40) ; Denormal!
+ mov eax,__float32__(+1.83203125e-40) ; Denormal!
+ mov eax,__float32__(-1.83203125e-40) ; Denormal!
+ mov eax,__float32__(__Infinity__)
+ mov eax,__float32__(+__Infinity__)
+ mov eax,__float32__(-__Infinity__)
+ mov eax,__float32__(__NaN__)
+ mov eax,__float32__(__QNaN__)
+ mov eax,__float32__(__SNaN__)
+
+; 64-bit
+ mov rax,__float64__(1.0)
+ mov rax,__float64__(+1.0)
+ mov rax,__float64__(-1.0)
+ mov rax,__float64__(0.0)
+ mov rax,__float64__(+0.0)
+ mov rax,__float64__(-0.0)
+ mov rax,__float64__(1.83203125)
+ mov rax,__float64__(+1.83203125)
+ mov rax,__float64__(-1.83203125)
+ mov rax,__float64__(1.83203125e300)
+ mov rax,__float64__(+1.83203125e300)
+ mov rax,__float64__(-1.83203125e300)
+ mov rax,__float64__(1.83203125e-300)
+ mov rax,__float64__(+1.83203125e-300)
+ mov rax,__float64__(-1.83203125e-300)
+ mov rax,__float64__(1.83203125e-320) ; Denormal!
+ mov rax,__float64__(+1.83203125e-320) ; Denormal!
+ mov rax,__float64__(-1.83203125e-320) ; Denormal!
+ mov rax,__float64__(__Infinity__)
+ mov rax,__float64__(+__Infinity__)
+ mov rax,__float64__(-__Infinity__)
+ mov rax,__float64__(__NaN__)
+ mov rax,__float64__(__QNaN__)
+ mov rax,__float64__(__SNaN__)
+
+; 80-bit
+ mov rax,__float80m__(1.0)
+ mov ax,__float80e__(1.0)
+ mov rax,__float80m__(+1.0)
+ mov ax,__float80e__(+1.0)
+ mov rax,__float80m__(-1.0)
+ mov ax,__float80e__(-1.0)
+ mov rax,__float80m__(0.0)
+ mov ax,__float80e__(0.0)
+ mov rax,__float80m__(+0.0)
+ mov ax,__float80e__(+0.0)
+ mov rax,__float80m__(-0.0)
+ mov ax,__float80e__(-0.0)
+ mov rax,__float80m__(1.83203125)
+ mov ax,__float80e__(1.83203125)
+ mov rax,__float80m__(+1.83203125)
+ mov ax,__float80e__(+1.83203125)
+ mov rax,__float80m__(-1.83203125)
+ mov ax,__float80e__(-1.83203125)
+ mov rax,__float80m__(1.83203125e+4000)
+ mov ax,__float80e__(1.83203125e+4000)
+ mov rax,__float80m__(+1.83203125e+4000)
+ mov ax,__float80e__(+1.83203125e+4000)
+ mov rax,__float80m__(-1.83203125e+4000)
+ mov ax,__float80e__(-1.83203125e+4000)
+ mov rax,__float80m__(1.83203125e-4000)
+ mov ax,__float80e__(1.83203125e-4000)
+ mov rax,__float80m__(+1.83203125e-4000)
+ mov ax,__float80e__(+1.83203125e-4000)
+ mov rax,__float80m__(-1.83203125e-4000)
+ mov ax,__float80e__(-1.83203125e-4000)
+ mov rax,__float80m__(1.83203125e-4940) ; Denormal!
+ mov ax,__float80e__(1.83203125e-4940) ; Denormal!
+ mov rax,__float80m__(+1.83203125e-4940) ; Denormal!
+ mov ax,__float80e__(+1.83203125e-4940) ; Denormal!
+ mov rax,__float80m__(-1.83203125e-4940) ; Denormal!
+ mov ax,__float80e__(-1.83203125e-4940) ; Denormal!
+ mov rax,__float80m__(__Infinity__)
+ mov ax,__float80e__(__Infinity__)
+ mov rax,__float80m__(+__Infinity__)
+ mov ax,__float80e__(+__Infinity__)
+ mov rax,__float80m__(-__Infinity__)
+ mov ax,__float80e__(-__Infinity__)
+ mov rax,__float80m__(__NaN__)
+ mov ax,__float80e__(__NaN__)
+ mov rax,__float80m__(__QNaN__)
+ mov ax,__float80e__(__QNaN__)
+ mov rax,__float80m__(__SNaN__)
+ mov ax,__float80e__(__SNaN__)
+
+; 128-bit
+ mov rax,__float128l__(1.0)
+ mov rax,__float128h__(1.0)
+ mov rax,__float128l__(+1.0)
+ mov rax,__float128h__(+1.0)
+ mov rax,__float128l__(-1.0)
+ mov rax,__float128h__(-1.0)
+ mov rax,__float128l__(0.0)
+ mov rax,__float128h__(0.0)
+ mov rax,__float128l__(+0.0)
+ mov rax,__float128h__(+0.0)
+ mov rax,__float128l__(-0.0)
+ mov rax,__float128h__(-0.0)
+ mov rax,__float128l__(1.83203125)
+ mov rax,__float128h__(1.83203125)
+ mov rax,__float128l__(+1.83203125)
+ mov rax,__float128h__(+1.83203125)
+ mov rax,__float128l__(-1.83203125)
+ mov rax,__float128h__(-1.83203125)
+ mov rax,__float128l__(1.83203125e+4000)
+ mov rax,__float128h__(1.83203125e+4000)
+ mov rax,__float128l__(+1.83203125e+4000)
+ mov rax,__float128h__(+1.83203125e+4000)
+ mov rax,__float128l__(-1.83203125e+4000)
+ mov rax,__float128h__(-1.83203125e+4000)
+ mov rax,__float128l__(1.83203125e-4000)
+ mov rax,__float128h__(1.83203125e-4000)
+ mov rax,__float128l__(+1.83203125e-4000)
+ mov rax,__float128h__(+1.83203125e-4000)
+ mov rax,__float128l__(-1.83203125e-4000)
+ mov rax,__float128h__(-1.83203125e-4000)
+ mov rax,__float128l__(1.83203125e-4940) ; Denormal!
+ mov rax,__float128h__(1.83203125e-4940) ; Denormal!
+ mov rax,__float128l__(+1.83203125e-4940) ; Denormal!
+ mov rax,__float128h__(+1.83203125e-4940) ; Denormal!
+ mov rax,__float128l__(-1.83203125e-4940) ; Denormal!
+ mov rax,__float128h__(-1.83203125e-4940) ; Denormal!
+ mov rax,__float128l__(__Infinity__)
+ mov rax,__float128h__(__Infinity__)
+ mov rax,__float128l__(+__Infinity__)
+ mov rax,__float128h__(+__Infinity__)
+ mov rax,__float128l__(-__Infinity__)
+ mov rax,__float128h__(-__Infinity__)
+ mov rax,__float128l__(__NaN__)
+ mov rax,__float128h__(__NaN__)
+ mov rax,__float128l__(__QNaN__)
+ mov rax,__float128h__(__QNaN__)
+ mov rax,__float128l__(__SNaN__)
+ mov rax,__float128h__(__SNaN__)
+
+;
+; Test hexadecimal floating-point numbers
+;
+
+; 16-bit
+ mov ax,__float16__(1.0)
+ mov ax,__float16__(0x1.0)
+ mov ax,__float16__(2.0)
+ mov ax,__float16__(0x2.0)
+ mov ax,__float16__(0x1.0p+1)
+ mov ax,__float16__(0x1.0p-1)
+ mov ax,__float16__(0x0.0)
+ mov ax,__float16__(0x1.23456789)
+ mov ax,__float16__(0x0.123456789)
+ mov ax,__float16__(0x0.0000123456789)
+ mov ax,__float16__(0x1.23456789p10)
+ mov ax,__float16__(0x1.23456789p+10)
+ mov ax,__float16__(0x1.23456789p-10)
+ mov ax,__float16__(0x0.123456789p10)
+ mov ax,__float16__(0x0.123456789p+10)
+ mov ax,__float16__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov ax,__float16__(0x0.0000123456789)
+ mov ax,__float16__(0x0.0000123456789p+10)
+ mov ax,__float16__(0x0.0000123456789p-10)
+
+; 32-bit
+ mov eax,__float32__(1.0)
+ mov eax,__float32__(0x1.0)
+ mov eax,__float32__(2.0)
+ mov eax,__float32__(0x2.0)
+ mov eax,__float32__(0x1.0p+1)
+ mov eax,__float32__(0x1.0p-1)
+ mov eax,__float32__(0x0.0)
+ mov eax,__float32__(0x1.23456789)
+ mov eax,__float32__(0x0.123456789)
+ mov eax,__float32__(0x0.0000123456789)
+ mov eax,__float32__(0x1.23456789p10)
+ mov eax,__float32__(0x1.23456789p+10)
+ mov eax,__float32__(0x1.23456789p-10)
+ mov eax,__float32__(0x0.123456789p10)
+ mov eax,__float32__(0x0.123456789p+10)
+ mov eax,__float32__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov eax,__float32__(0x0.0000123456789)
+ mov eax,__float32__(0x0.0000123456789p+10)
+ mov eax,__float32__(0x0.0000123456789p-10)
+ mov eax,__float32__(0x123456789.0)
+ mov eax,__float32__(0x0000123456789.0)
+ mov eax,__float32__(0x123456789.0p+0)
+ mov eax,__float32__(0x123456789.0p+64)
+
+; 64-bit
+ mov rax,__float64__(1.0)
+ mov rax,__float64__(0x1.0)
+ mov rax,__float64__(2.0)
+ mov rax,__float64__(0x2.0)
+ mov rax,__float64__(0x1.0p+1)
+ mov rax,__float64__(0x1.0p-1)
+ mov rax,__float64__(0x0.0)
+ mov rax,__float64__(0x1.23456789)
+ mov rax,__float64__(0x0.123456789)
+ mov rax,__float64__(0x0.0000123456789)
+ mov rax,__float64__(0x1.23456789p10)
+ mov rax,__float64__(0x1.23456789p+10)
+ mov rax,__float64__(0x1.23456789p-10)
+ mov rax,__float64__(0x0.123456789p10)
+ mov rax,__float64__(0x0.123456789p+10)
+ mov rax,__float64__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov rax,__float64__(0x0.0000123456789)
+ mov rax,__float64__(0x0.0000123456789p+10)
+ mov rax,__float64__(0x0.0000123456789p-10)
+ mov rax,__float64__(0x123456789.0)
+ mov rax,__float64__(0x0000123456789.0)
+ mov rax,__float64__(0x123456789.0p+0)
+ mov rax,__float64__(0x123456789.0p+300)
+
+; 80-bit
+ mov rax,__float80m__(1.0)
+ mov ax,__float80e__(1.0)
+ mov rax,__float80m__(0x1.0)
+ mov ax,__float80e__(0x1.0)
+ mov rax,__float80m__(2.0)
+ mov ax,__float80e__(2.0)
+ mov rax,__float80m__(0x2.0)
+ mov ax,__float80e__(0x2.0)
+ mov rax,__float80m__(0x1.0p+1)
+ mov ax,__float80e__(0x1.0p+1)
+ mov rax,__float80m__(0x1.0p-1)
+ mov ax,__float80e__(0x1.0p-1)
+ mov rax,__float80m__(0x0.0)
+ mov ax,__float80e__(0x0.0)
+ mov rax,__float80m__(0x1.23456789)
+ mov ax,__float80e__(0x1.23456789)
+ mov rax,__float80m__(0x0.123456789)
+ mov ax,__float80e__(0x0.123456789)
+ mov rax,__float80m__(0x0.0000123456789)
+ mov ax,__float80e__(0x0.0000123456789)
+ mov rax,__float80m__(0x1.23456789p10)
+ mov ax,__float80e__(0x1.23456789p10)
+ mov rax,__float80m__(0x1.23456789p+10)
+ mov ax,__float80e__(0x1.23456789p+10)
+ mov rax,__float80m__(0x1.23456789p-10)
+ mov ax,__float80e__(0x1.23456789p-10)
+ mov rax,__float80m__(0x0.123456789p10)
+ mov ax,__float80e__(0x0.123456789p10)
+ mov rax,__float80m__(0x0.123456789p+10)
+ mov ax,__float80e__(0x0.123456789p+10)
+ mov rax,__float80m__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov ax,__float80e__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov rax,__float80m__(0x0.0000123456789)
+ mov ax,__float80e__(0x0.0000123456789)
+ mov rax,__float80m__(0x0.0000123456789p+10)
+ mov ax,__float80e__(0x0.0000123456789p+10)
+ mov rax,__float80m__(0x0.0000123456789p-10)
+ mov ax,__float80e__(0x0.0000123456789p-10)
+ mov rax,__float80m__(0x123456789.0)
+ mov ax,__float80e__(0x123456789.0)
+ mov rax,__float80m__(0x0000123456789.0)
+ mov ax,__float80e__(0x0000123456789.0)
+ mov rax,__float80m__(0x123456789.0p+0)
+ mov ax,__float80e__(0x123456789.0p+0)
+ mov rax,__float80m__(0x123456789.0p+1024)
+ mov ax,__float80e__(0x123456789.0p+1024)
+
+; 128-bit
+ mov rax,__float128l__(1.0)
+ mov rax,__float128h__(1.0)
+ mov rax,__float128l__(0x1.0)
+ mov rax,__float128h__(0x1.0)
+ mov rax,__float128l__(2.0)
+ mov rax,__float128h__(2.0)
+ mov rax,__float128l__(0x2.0)
+ mov rax,__float128h__(0x2.0)
+ mov rax,__float128l__(0x1.0p+1)
+ mov rax,__float128h__(0x1.0p+1)
+ mov rax,__float128l__(0x1.0p-1)
+ mov rax,__float128h__(0x1.0p-1)
+ mov rax,__float128l__(0x0.0)
+ mov rax,__float128h__(0x0.0)
+ mov rax,__float128l__(0x1.23456789)
+ mov rax,__float128h__(0x1.23456789)
+ mov rax,__float128l__(0x0.123456789)
+ mov rax,__float128h__(0x0.123456789)
+ mov rax,__float128l__(0x0.0000123456789)
+ mov rax,__float128h__(0x0.0000123456789)
+ mov rax,__float128l__(0x1.23456789p10)
+ mov rax,__float128h__(0x1.23456789p10)
+ mov rax,__float128l__(0x1.23456789p+10)
+ mov rax,__float128h__(0x1.23456789p+10)
+ mov rax,__float128l__(0x1.23456789p-10)
+ mov rax,__float128h__(0x1.23456789p-10)
+ mov rax,__float128l__(0x0.123456789p10)
+ mov rax,__float128h__(0x0.123456789p10)
+ mov rax,__float128l__(0x0.123456789p+10)
+ mov rax,__float128h__(0x0.123456789p+10)
+ mov rax,__float128l__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov rax,__float128h__(0x0.123456789abcdef0123456789abcdef012345p-10)
+ mov rax,__float128l__(0x0.0000123456789)
+ mov rax,__float128h__(0x0.0000123456789)
+ mov rax,__float128l__(0x0.0000123456789p+10)
+ mov rax,__float128h__(0x0.0000123456789p+10)
+ mov rax,__float128l__(0x0.0000123456789p-10)
+ mov rax,__float128h__(0x0.0000123456789p-10)
+ mov rax,__float128l__(0x123456789.0)
+ mov rax,__float128h__(0x123456789.0)
+ mov rax,__float128l__(0x0000123456789.0)
+ mov rax,__float128h__(0x0000123456789.0)
+ mov rax,__float128l__(0x123456789.0p+0)
+ mov rax,__float128h__(0x123456789.0p+0)
+ mov rax,__float128l__(0x123456789.0p+1024)
+ mov rax,__float128h__(0x123456789.0p+1024)
diff --git a/test/floatize.asm b/test/floatize.asm
new file mode 100644
index 00000000..cc0bbe92
--- /dev/null
+++ b/test/floatize.asm
@@ -0,0 +1,19 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -ofloatize.bin; Files=stdout stderr floatize.bin
+;Testname=optimized; Arguments=-Ox -fbin -ofloatize.bin; Files=stdout stderr floatize.bin
+
+%assign x13 13+26
+%assign f16 __float16__(1.6e-7)
+%assign f32 __float32__(1.6e-7)
+%assign f64 __float64__(1.6e-7)
+%assign f80m __float80m__(1.6e-7)
+%assign f80e __float80e__(1.6e-7)
+%assign f128l __float128l__(1.6e-7)
+%assign f128h __float128h__(1.6e-7)
+
+ dw f16
+ dd f32
+ dq f64
+ dq f80m
+ dw f80e
+ dq f128l
+ dq f128h
diff --git a/test/floattest.asm b/test/floattest.asm
new file mode 100644
index 00000000..3c7ba8b0
--- /dev/null
+++ b/test/floattest.asm
@@ -0,0 +1,28 @@
+;Testname=optimized; Arguments=-Ox -felf -ofloattest.o; Files=stdout stderr floattest.o
+
+; nasm -O99 -f elf32 floattest.asm
+; ld -m elf_i386 -o floattest floattest.o -I/lib/ld-linux.so.2 -lc
+
+ global _start
+ extern printf
+
+ section .text
+_start:
+
+ fld qword [num1]
+ fadd qword [num2]
+ sub esp, 8
+ fstp qword [esp]
+ push fmt
+ call printf
+ add esp, 4*3
+
+ mov eax, 1
+ xor ebx, ebx
+ int 80h
+
+ section .data
+num1 dq 41.5
+num2 dq 0.5
+
+fmt db "%f", 10, 0
diff --git a/test/floatx.asm b/test/floatx.asm
new file mode 100644
index 00000000..7368e504
--- /dev/null
+++ b/test/floatx.asm
@@ -0,0 +1,525 @@
+;
+; floatx.asm
+;
+; Test hexadecimal floating-point numbers
+
+%define Inf __Infinity__
+%define NaN __QNaN__
+
+; 16-bit
+ dw 1.0
+ dw 0x1.0
+ dw 2.0
+ dw 0x2.0
+ dw 0x1.0p+1
+ dw 0x1.0p-1
+ dw 0x0.0
+ dw 0x1.23456789
+ dw 0x0.123456789
+ dw 0x0.0000123456789
+ dw 0x1.23456789p10
+ dw 0x1.23456789p+10
+ dw 0x1.23456789p-10
+ dw 0x0.123456789p10
+ dw 0x0.123456789p+10
+ dw 0x0.123456789abcdef0123456789abcdef012345p-10
+ dw 0x0.0000123456789
+ dw 0x0.0000123456789p+10
+ dw 0x0.0000123456789p-10
+ dw 0x1.0p-25 ; Underflow
+ dw 0x1.01p-25 ; Rounds to denorm
+ dw 0x1.0p-24 ; Smallest denorm
+ dw 0x1.ffffffffffffffffffffffffffffp-16 ; Rounds to denorm
+ dw 0x1.0p-15 ; Denorm
+ dw 0x1.ffffffffffffffffffffffffffffp-15 ; Rounds to normal
+ dw 0x1.0p-14 ; Smallest non-denorm
+ dw 0x1.0p+15 ; Biggest possible exponent
+ dw 0x1.ffffffffffffffffffffffffffffp+15 ; Rounds to infinity
+ dw Inf ; Infinity
+ dw NaN
+
+; 32-bit
+ dd 1.0
+ dd 0x1.0
+ dd 2.0
+ dd 0x2.0
+ dd 0x1.0p+1
+ dd 0x1.0p-1
+ dd 0x0.0
+ dd 0x1.23456789
+ dd 0x0.123456789
+ dd 0x0.0000123456789
+ dd 0x1.23456789p10
+ dd 0x1.23456789p+10
+ dd 0x1.23456789p-10
+ dd 0x0.123456789p10
+ dd 0x0.123456789p+10
+ dd 0x0.123456789abcdef0123456789abcdef012345p-10
+ dd 0x0.0000123456789
+ dd 0x0.0000123456789p+10
+ dd 0x0.0000123456789p-10
+ dd 0x123456789.0
+ dd 0x0000123456789.0
+ dd 0x123456789.0p+0
+ dd 0x123456789.0p+64
+ dd 0x1.0p-150 ; Underflow
+ dd 0x1.01p-150 ; Rounds to denorm
+ dd 0x1.0p-149 ; Smallest denorm
+ dd 0x1.ffffffffffffffffffffffffffffp-128 ; Rounds to denorm
+ dd 0x1.0p-127 ; Denorm
+ dd 0x1.ffffffffffffffffffffffffffffp-127 ; Rounds to normal
+ dd 0x1.0p-126 ; Smallest non-denorm
+ dd 0x1.0p+127 ; Biggest possible exponent
+ dd 0x1.ffffffffffffffffffffffffffffp+127 ; Rounds to infinity
+ dd Inf ; Infinity
+ dd NaN
+
+; 64-bit
+ dq 1.0
+ dq 0x1.0
+ dq 2.0
+ dq 0x2.0
+ dq 0x1.0p+1
+ dq 0x1.0p-1
+ dq 0x0.0
+ dq 0x1.23456789
+ dq 0x0.123456789
+ dq 0x0.0000123456789
+ dq 0x1.23456789p10
+ dq 0x1.23456789p+10
+ dq 0x1.23456789p-10
+ dq 0x0.123456789p10
+ dq 0x0.123456789p+10
+ dq 0x0.123456789abcdef0123456789abcdef012345p-10
+ dq 0x0.0000123456789
+ dq 0x0.0000123456789p+10
+ dq 0x0.0000123456789p-10
+ dq 0x123456789.0
+ dq 0x0000123456789.0
+ dq 0x123456789.0p+0
+ dq 0x123456789.0p+300
+ dq 0x1.0p-1075 ; Underflow
+ dq 0x1.01p-1075 ; Rounds to denorm
+ dq 0x1.0p-1074 ; Smallest denorm
+ dq 0x1.ffffffffffffffffffffffffffffp-1024 ; Rounds to denorm
+ dq 0x1.0p-1023 ; Denorm
+ dq 0x1.ffffffffffffffffffffffffffffp-1023 ; Rounds to normal
+ dq 0x1.0p-1022 ; Smallest non-denorm
+ dq 0x1.0p+1023 ; Biggest possible exponent
+ dq 0x1.ffffffffffffffffffffffffffffp+1023 ; Rounds to infinity
+ dq Inf ; Infinity
+ dq NaN
+
+; 80-bit
+ dt 1.0
+ dt 0x1.0
+ dt 2.0
+ dt 0x2.0
+ dt 0x1.0p+1
+ dt 0x1.0p-1
+ dt 0x0.0
+ dt 0x1.23456789
+ dt 0x0.123456789
+ dt 0x0.0000123456789
+ dt 0x1.23456789p10
+ dt 0x1.23456789p+10
+ dt 0x1.23456789p-10
+ dt 0x0.123456789p10
+ dt 0x0.123456789p+10
+ dt 0x0.123456789abcdef0123456789abcdef012345p-10
+ dt 0x0.0000123456789
+ dt 0x0.0000123456789p+10
+ dt 0x0.0000123456789p-10
+ dt 0x123456789.0
+ dt 0x0000123456789.0
+ dt 0x123456789.0p+0
+ dt 0x123456789.0p+1024
+ dt 0x1.0p-16446 ; Underflow
+ dt 0x1.01p-16446 ; Rounds to denorm
+ dt 0x1.0p-16445 ; Smallest denorm
+ dt 0x1.ffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ dt 0x1.0p-16383 ; Denorm
+ dt 0x1.ffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ dt 0x1.0p-16382 ; Smallest non-denorm
+ dt 0x1.0p+16383 ; Biggest possible exponent
+ dt 0x1.ffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ dt Inf ; Infinity
+ dt NaN
+
+; 128-bit
+ do 1.0
+ do 0x1.0
+ do 2.0
+ do 0x2.0
+ do 0x1.0p+1
+ do 0x1.0p-1
+ do 0x0.0
+ do 0x1.23456789
+ do 0x0.123456789
+ do 0x0.0000123456789
+ do 0x1.23456789p10
+ do 0x1.23456789p+10
+ do 0x1.23456789p-10
+ do 0x0.123456789p10
+ do 0x0.123456789p+10
+ do 0x0.123456789abcdef0123456789abcdef012345p-10
+ do 0x0.0000123456789
+ do 0x0.0000123456789p+10
+ do 0x0.0000123456789p-10
+ do 0x123456789.0
+ do 0x0000123456789.0
+ do 0x123456789.0p+0
+ do 0x123456789.0p+1024
+ do 0x1.0p-16495 ; Underflow
+ do 0x1.01p-16495 ; Rounds to denorm
+ do 0x1.0p-16494 ; Smallest denorm
+ do 0x1.ffffffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ do 0x1.0p-16383 ; Denorm
+ do 0x1.ffffffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ do 0x1.0p-16382 ; Smallest non-denorm
+ do 0x1.0p+16383 ; Biggest possible exponent
+ do 0x1.ffffffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ do Inf ; Infinity
+ do NaN
+
+; 16-bit
+ dw 1.0
+ dw 0h1.0
+ dw 2.0
+ dw 0h2.0
+ dw 0h1.0p+1
+ dw 0h1.0p-1
+ dw 0h0.0
+ dw 0h1.23456789
+ dw 0h0.123456789
+ dw 0h0.0000123456789
+ dw 0h1.23456789p10
+ dw 0h1.23456789p+10
+ dw 0h1.23456789p-10
+ dw 0h0.123456789p10
+ dw 0h0.123456789p+10
+ dw 0h0.123456789abcdef0123456789abcdef012345p-10
+ dw 0h0.0000123456789
+ dw 0h0.0000123456789p+10
+ dw 0h0.0000123456789p-10
+ dw 0h1.0p-25 ; Underflow
+ dw 0h1.0p-24 ; Smallest denorm
+ dw 0h1.ffffffffffffffffffffffffffffp-16 ; Rounds to denorm
+ dw 0h1.0p-15 ; Denorm
+ dw 0h1.ffffffffffffffffffffffffffffp-15 ; Rounds to normal
+ dw 0h1.0p-14 ; Smallest non-denorm
+ dw 0h1.0p+15 ; Biggest possible exponent
+ dw 0h1.ffffffffffffffffffffffffffffp+15 ; Rounds to infinity
+ dw Inf ; Infinity
+ dw NaN
+
+; 32-bit
+ dd 1.0
+ dd 0h1.0
+ dd 2.0
+ dd 0h2.0
+ dd 0h1.0p+1
+ dd 0h1.0p-1
+ dd 0h0.0
+ dd 0h1.23456789
+ dd 0h0.123456789
+ dd 0h0.0000123456789
+ dd 0h1.23456789p10
+ dd 0h1.23456789p+10
+ dd 0h1.23456789p-10
+ dd 0h0.123456789p10
+ dd 0h0.123456789p+10
+ dd 0h0.123456789abcdef0123456789abcdef012345p-10
+ dd 0h0.0000123456789
+ dd 0h0.0000123456789p+10
+ dd 0h0.0000123456789p-10
+ dd 0h123456789.0
+ dd 0h0000123456789.0
+ dd 0h123456789.0p+0
+ dd 0h123456789.0p+64
+ dd 0h1.0p-150 ; Underflow
+ dd 0h1.0p-149 ; Smallest denorm
+ dd 0h1.ffffffffffffffffffffffffffffp-128 ; Rounds to denorm
+ dd 0h1.0p-127 ; Denorm
+ dd 0h1.ffffffffffffffffffffffffffffp-127 ; Rounds to normal
+ dd 0h1.0p-126 ; Smallest non-denorm
+ dd 0h1.0p+127 ; Biggest possible exponent
+ dd 0h1.ffffffffffffffffffffffffffffp+127 ; Rounds to infinity
+ dd Inf ; Infinity
+ dd NaN
+
+; 64-bit
+ dq 1.0
+ dq 0h1.0
+ dq 2.0
+ dq 0h2.0
+ dq 0h1.0p+1
+ dq 0h1.0p-1
+ dq 0h0.0
+ dq 0h1.23456789
+ dq 0h0.123456789
+ dq 0h0.0000123456789
+ dq 0h1.23456789p10
+ dq 0h1.23456789p+10
+ dq 0h1.23456789p-10
+ dq 0h0.123456789p10
+ dq 0h0.123456789p+10
+ dq 0h0.123456789abcdef0123456789abcdef012345p-10
+ dq 0h0.0000123456789
+ dq 0h0.0000123456789p+10
+ dq 0h0.0000123456789p-10
+ dq 0h123456789.0
+ dq 0h0000123456789.0
+ dq 0h123456789.0p+0
+ dq 0h123456789.0p+300
+ dq 0h1.0p-1075 ; Underflow
+ dq 0h1.0p-1074 ; Smallest denorm
+ dq 0h1.ffffffffffffffffffffffffffffp-1024 ; Rounds to denorm
+ dq 0h1.0p-1023 ; Denorm
+ dq 0h1.ffffffffffffffffffffffffffffp-1023 ; Rounds to normal
+ dq 0h1.0p-1022 ; Smallest non-denorm
+ dq 0h1.0p+1023 ; Biggest possible exponent
+ dq 0h1.ffffffffffffffffffffffffffffp+1023 ; Rounds to infinity
+ dq Inf ; Infinity
+ dq NaN
+
+; 80-bit
+ dt 1.0
+ dt 0h1.0
+ dt 2.0
+ dt 0h2.0
+ dt 0h1.0p+1
+ dt 0h1.0p-1
+ dt 0h0.0
+ dt 0h1.23456789
+ dt 0h0.123456789
+ dt 0h0.0000123456789
+ dt 0h1.23456789p10
+ dt 0h1.23456789p+10
+ dt 0h1.23456789p-10
+ dt 0h0.123456789p10
+ dt 0h0.123456789p+10
+ dt 0h0.123456789abcdef0123456789abcdef012345p-10
+ dt 0h0.0000123456789
+ dt 0h0.0000123456789p+10
+ dt 0h0.0000123456789p-10
+ dt 0h123456789.0
+ dt 0h0000123456789.0
+ dt 0h123456789.0p+0
+ dt 0h123456789.0p+1024
+ dt 0h1.0p-16446 ; Underflow
+ dt 0h1.0p-16445 ; Smallest denorm
+ dt 0h1.ffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ dt 0h1.0p-16383 ; Denorm
+ dt 0h1.ffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ dt 0h1.0p-16382 ; Smallest non-denorm
+ dt 0h1.0p+16383 ; Biggest possible exponent
+ dt 0h1.ffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ dt Inf ; Infinity
+ dt NaN
+
+; 128-bit
+ do 1.0
+ do 0h1.0
+ do 2.0
+ do 0h2.0
+ do 0h1.0p+1
+ do 0h1.0p-1
+ do 0h0.0
+ do 0h1.23456789
+ do 0h0.123456789
+ do 0h0.0000123456789
+ do 0h1.23456789p10
+ do 0h1.23456789p+10
+ do 0h1.23456789p-10
+ do 0h0.123456789p10
+ do 0h0.123456789p+10
+ do 0h0.123456789abcdef0123456789abcdef012345p-10
+ do 0h0.0000123456789
+ do 0h0.0000123456789p+10
+ do 0h0.0000123456789p-10
+ do 0h123456789.0
+ do 0h0000123456789.0
+ do 0h123456789.0p+0
+ do 0h123456789.0p+1024
+ do 0h1.0p-16495 ; Underflow
+ do 0h1.0p-16494 ; Smallest denorm
+ do 0h1.ffffffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ do 0h1.0p-16383 ; Denorm
+ do 0h1.ffffffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ do 0h1.0p-16382 ; Smallest non-denorm
+ do 0h1.0p+16383 ; Biggest possible exponent
+ do 0h1.ffffffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ do Inf ; Infinity
+ do NaN
+
+; 16-bit
+ dw 1.0
+ dw $1.0
+ dw 2.0
+ dw $2.0
+ dw $1.0p+1
+ dw $1.0p-1
+ dw $0.0
+ dw $1.23456789
+ dw $0.123456789
+ dw $0.0000123456789
+ dw $1.23456789p10
+ dw $1.23456789p+10
+ dw $1.23456789p-10
+ dw $0.123456789p10
+ dw $0.123456789p+10
+ dw $0.123456789abcdef0123456789abcdef012345p-10
+ dw $0.0000123456789
+ dw $0.0000123456789p+10
+ dw $0.0000123456789p-10
+ dw $1.0p-25 ; Underflow
+ dw $1.0p-24 ; Smallest denorm
+ dw $1.ffffffffffffffffffffffffffffp-16 ; Rounds to denorm
+ dw $1.0p-15 ; Denorm
+ dw $1.ffffffffffffffffffffffffffffp-15 ; Rounds to normal
+ dw $1.0p-14 ; Smallest non-denorm
+ dw $1.0p+15 ; Biggest possible exponent
+ dw $1.ffffffffffffffffffffffffffffp+15 ; Rounds to infinity
+ dw Inf ; Infinity
+ dw NaN
+
+; 32-bit
+ dd 1.0
+ dd $1.0
+ dd 2.0
+ dd $2.0
+ dd $1.0p+1
+ dd $1.0p-1
+ dd $0.0
+ dd $1.23456789
+ dd $0.123456789
+ dd $0.0000123456789
+ dd $1.23456789p10
+ dd $1.23456789p+10
+ dd $1.23456789p-10
+ dd $0.123456789p10
+ dd $0.123456789p+10
+ dd $0.123456789abcdef0123456789abcdef012345p-10
+ dd $0.0000123456789
+ dd $0.0000123456789p+10
+ dd $0.0000123456789p-10
+ dd $123456789.0
+ dd $0000123456789.0
+ dd $123456789.0p+0
+ dd $123456789.0p+64
+ dd $1.0p-150 ; Underflow
+ dd $1.0p-149 ; Smallest denorm
+ dd $1.ffffffffffffffffffffffffffffp-128 ; Rounds to denorm
+ dd $1.0p-127 ; Denorm
+ dd $1.ffffffffffffffffffffffffffffp-127 ; Rounds to normal
+ dd $1.0p-126 ; Smallest non-denorm
+ dd $1.0p+127 ; Biggest possible exponent
+ dd $1.ffffffffffffffffffffffffffffp+127 ; Rounds to infinity
+ dd Inf ; Infinity
+ dd NaN
+
+; 64-bit
+ dq 1.0
+ dq $1.0
+ dq 2.0
+ dq $2.0
+ dq $1.0p+1
+ dq $1.0p-1
+ dq $0.0
+ dq $1.23456789
+ dq $0.123456789
+ dq $0.0000123456789
+ dq $1.23456789p10
+ dq $1.23456789p+10
+ dq $1.23456789p-10
+ dq $0.123456789p10
+ dq $0.123456789p+10
+ dq $0.123456789abcdef0123456789abcdef012345p-10
+ dq $0.0000123456789
+ dq $0.0000123456789p+10
+ dq $0.0000123456789p-10
+ dq $123456789.0
+ dq $0000123456789.0
+ dq $123456789.0p+0
+ dq $123456789.0p+300
+ dq $1.0p-1075 ; Underflow
+ dq $1.0p-1074 ; Smallest denorm
+ dq $1.ffffffffffffffffffffffffffffp-1024 ; Rounds to denorm
+ dq $1.0p-1023 ; Denorm
+ dq $1.ffffffffffffffffffffffffffffp-1023 ; Rounds to normal
+ dq $1.0p-1022 ; Smallest non-denorm
+ dq $1.0p+1023 ; Biggest possible exponent
+ dq $1.ffffffffffffffffffffffffffffp+1023 ; Rounds to infinity
+ dq Inf ; Infinity
+ dq NaN
+
+; 80-bit
+ dt 1.0
+ dt $1.0
+ dt 2.0
+ dt $2.0
+ dt $1.0p+1
+ dt $1.0p-1
+ dt $0.0
+ dt $1.23456789
+ dt $0.123456789
+ dt $0.0000123456789
+ dt $1.23456789p10
+ dt $1.23456789p+10
+ dt $1.23456789p-10
+ dt $0.123456789p10
+ dt $0.123456789p+10
+ dt $0.123456789abcdef0123456789abcdef012345p-10
+ dt $0.0000123456789
+ dt $0.0000123456789p+10
+ dt $0.0000123456789p-10
+ dt $123456789.0
+ dt $0000123456789.0
+ dt $123456789.0p+0
+ dt $123456789.0p+1024
+ dt $1.0p-16446 ; Underflow
+ dt $1.0p-16445 ; Smallest denorm
+ dt $1.ffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ dt $1.0p-16383 ; Denorm
+ dt $1.ffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ dt $1.0p-16382 ; Smallest non-denorm
+ dt $1.0p+16383 ; Biggest possible exponent
+ dt $1.ffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ dt Inf ; Infinity
+ dt NaN
+
+; 128-bit
+ do 1.0
+ do $1.0
+ do 2.0
+ do $2.0
+ do $1.0p+1
+ do $1.0p-1
+ do $0.0
+ do $1.23456789
+ do $0.123456789
+ do $0.0000123456789
+ do $1.23456789p10
+ do $1.23456789p+10
+ do $1.23456789p-10
+ do $0.123456789p10
+ do $0.123456789p+10
+ do $0.123456789abcdef0123456789abcdef012345p-10
+ do $0.0000123456789
+ do $0.0000123456789p+10
+ do $0.0000123456789p-10
+ do $123456789.0
+ do $0000123456789.0
+ do $123456789.0p+0
+ do $123456789.0p+1024
+ do $1.0p-16495 ; Underflow
+ do $1.0p-16494 ; Smallest denorm
+ do $1.ffffffffffffffffffffffffffffffffp-16384 ; Rounds to denorm
+ do $1.0p-16383 ; Denorm
+ do $1.ffffffffffffffffffffffffffffffffp-16383 ; Rounds to normal
+ do $1.0p-16382 ; Smallest non-denorm
+ do $1.0p+16383 ; Biggest possible exponent
+ do $1.ffffffffffffffffffffffffffffffffp+16383 ; Rounds to infinity
+ do Inf ; Infinity
+ do NaN
diff --git a/test/fpu.asm b/test/fpu.asm
new file mode 100644
index 00000000..4051fddd
--- /dev/null
+++ b/test/fpu.asm
@@ -0,0 +1,127 @@
+;Testname=test; Arguments=-fbin -ofpu.bin; Files=stdout stderr fpu.bin
+
+; relaxed encodings for FPU instructions, which NASM should support
+; -----------------------------------------------------------------
+
+%define void
+%define reg_fpu0 st0
+%define reg_fpu st1
+
+; no operands instead of one operand:
+
+ ; F(U)COM(P), FCOM2, FCOMP3, FCOMP5
+
+ FCOM void
+ FCOMP void
+ FUCOM void
+ FUCOMP void
+; FCOM2 void
+; FCOMP3 void
+; FCOMP5 void
+
+ ; FLD, FST, FSTP, FSTP1, FSTP8, FSTP9
+
+ FLD void
+ FST void
+ FSTP void
+; FSTP1 void
+; FSTP8 void
+; FSTP9 void
+
+ ; FXCH, FXCH4, FXCH7, FFREE, FFREEP
+
+ FXCH void
+; FXCH4 void
+; FXCH7 void
+ FFREE void
+ FFREEP void
+
+; no operands instead of two operands:
+
+ ; FADD(P), FMUL(P), FSUBR(P), FSUB(P), FDIVR(P), FDIV(P)
+
+ FADD void
+ FADDP void
+ FMUL void
+ FMULP void
+ FSUBR void
+ FSUBRP void
+ FSUB void
+ FSUBP void
+ FDIVR void
+ FDIVRP void
+ FDIV void
+ FDIVP void
+
+; one operand instead of two operands:
+
+ ; FADD, FMUL, FSUB, FSUBR, FDIV, FDIVR
+
+ FADD reg_fpu
+ FMUL reg_fpu
+ FSUB reg_fpu
+ FSUBR reg_fpu
+ FDIV reg_fpu
+ FDIVR reg_fpu
+
+ ; FADD, FMUL, FSUBR, FSUB, FDIVR, FDIV (with TO qualifier)
+
+ FADD to reg_fpu
+ FMUL to reg_fpu
+ FSUBR to reg_fpu
+ FSUB to reg_fpu
+ FDIVR to reg_fpu
+ FDIV to reg_fpu
+
+ ; FADDP, FMULP, FSUBRP, FSUBP, FDIVRP, FDIVP
+
+ FADDP reg_fpu
+ FMULP reg_fpu
+ FSUBRP reg_fpu
+ FSUBP reg_fpu
+ FDIVRP reg_fpu
+ FDIVP reg_fpu
+
+ ; FCMOV(N)B, FCMOV(N)E, FCMOV(N)BE, FCMOV(N)U, and F(U)COMI(P)
+
+ FCMOVB reg_fpu
+ FCMOVNB reg_fpu
+ FCMOVE reg_fpu
+ FCMOVNE reg_fpu
+ FCMOVBE reg_fpu
+ FCMOVNBE reg_fpu
+ FCMOVU reg_fpu
+ FCMOVNU reg_fpu
+ FCOMI reg_fpu
+ FCOMIP reg_fpu
+ FUCOMI reg_fpu
+ FUCOMIP reg_fpu
+
+; two operands instead of one operand:
+
+ ; these don't really exist, and thus are _NOT_ supported:
+
+; FCOM reg_fpu,reg_fpu0
+; FCOM reg_fpu0,reg_fpu
+; FUCOM reg_fpu,reg_fpu0
+; FUCOM reg_fpu0,reg_fpu
+; FCOMP reg_fpu,reg_fpu0
+; FCOMP reg_fpu0,reg_fpu
+; FUCOMP reg_fpu,reg_fpu0
+; FUCOMP reg_fpu0,reg_fpu
+
+; FCOM2 reg_fpu,reg_fpu0
+; FCOM2 reg_fpu0,reg_fpu
+; FCOMP3 reg_fpu,reg_fpu0
+; FCOMP3 reg_fpu0,reg_fpu
+; FCOMP5 reg_fpu,reg_fpu0
+; FCOMP5 reg_fpu0,reg_fpu
+
+; FXCH reg_fpu,reg_fpu0
+; FXCH reg_fpu0,reg_fpu
+; FXCH4 reg_fpu,reg_fpu0
+; FXCH4 reg_fpu0,reg_fpu
+; FXCH7 reg_fpu,reg_fpu0
+; FXCH7 reg_fpu0,reg_fpu
+
+; EOF
diff --git a/test/fwdopt.asm b/test/fwdopt.asm
new file mode 100644
index 00000000..48dbc3fc
--- /dev/null
+++ b/test/fwdopt.asm
@@ -0,0 +1,133 @@
+;Testname=test; Arguments=-fbin -ofwdopt.bin; Files=stdout stderr fwdopt.bin
+n0: jmp n1
+n1: jmp n2
+n2: jmp n3
+n3: jmp n4
+n4: jmp n5
+n5: jmp n6
+n6: jmp n7
+n7: jmp n8
+n8: jmp n9
+n9: jmp n10
+n10: jmp n11
+n11: jmp n12
+n12: jmp n13
+n13: jmp n14
+n14: jmp n15
+n15: jmp n16
+n16: jmp n17
+n17: jmp n18
+n18: jmp n19
+n19: jmp n20
+n20: jmp n21
+n21: jmp n22
+n22: jmp n23
+n23: jmp n24
+n24: jmp n25
+n25: jmp n26
+n26: jmp n27
+n27: jmp n28
+n28: jmp n29
+n29: jmp n30
+n30: jmp n31
+n31: jmp n32
+n32: jmp n33
+n33: jmp n34
+n34: jmp n35
+n35: jmp n36
+n36: jmp n37
+n37: jmp n38
+n38: jmp n39
+n39: jmp n40
+n40: jmp n41
+n41: jmp n42
+n42: jmp n43
+n43: jmp n44
+n44: jmp n45
+n45: jmp n46
+n46: jmp n47
+n47: jmp n48
+n48: jmp n49
+n49: jmp n50
+n50: jmp n51
+n51: jmp n52
+n52: jmp n53
+n53: jmp n54
+n54: jmp n55
+n55: jmp n56
+n56: jmp n57
+n57: jmp n58
+n58: jmp n59
+n59: jmp n60
+n60: jmp n61
+n61: jmp n62
+n62: jmp n63
+n63: jmp n64
+n64: jmp n65
+n65: jmp n66
+n66: jmp n67
+n67: jmp n68
+n68: jmp n69
+n69: jmp n70
+n70: jmp n71
+n71: jmp n72
+n72: jmp n73
+n73: jmp n74
+n74: jmp n75
+n75: jmp n76
+n76: jmp n77
+n77: jmp n78
+n78: jmp n79
+n79: jmp n80
+n80: jmp n81
+n81: jmp n82
+n82: jmp n83
+n83: jmp n84
+n84: jmp n85
+n85: jmp n86
+n86: jmp n87
+n87: jmp n88
+n88: jmp n89
+n89: jmp n90
+n90: jmp n91
+n91: jmp n92
+n92: jmp n93
+n93: jmp n94
+n94: jmp n95
+n95: jmp n96
+n96: jmp n97
+n97: jmp n98
+n98: jmp n99
+n99: jmp n100
+n100: jmp n101
+n101: jmp n102
+n102: jmp n103
+n103: jmp n104
+n104: jmp n105
+n105: jmp n106
+n106: jmp n107
+n107: jmp n108
+n108: jmp n109
+n109: jmp n110
+n110: jmp n111
+n111: jmp n112
+n112: jmp n113
+n113: jmp n114
+n114: jmp n115
+n115: jmp n116
+n116: jmp n117
+n117: jmp n118
+n118: jmp n119
+n119: jmp n120
+n120: jmp n121
+n121: jmp n122
+n122: jmp n123
+n123: jmp n124
+n124: jmp n125
+n125: jmp n126
+n126: jmp n127
+n127: jmp n0
+
+ ;; This should emit exactly 3 NOP bytes
+ times 260-($-$$) nop
+ hlt
diff --git a/test/fwdoptpp.asm b/test/fwdoptpp.asm
new file mode 100644
index 00000000..e1f5dd63
--- /dev/null
+++ b/test/fwdoptpp.asm
@@ -0,0 +1,150 @@
+;Testname=error; Arguments=-fbin -DERROR -ofwdoptpp.bin; Files=stdout stderr fwdoptpp.bin
+;Testname=fatal; Arguments=-fbin -DFATAL -ofwdoptpp.bin; Files=stdout stderr fwdoptpp.bin
+;Testname=warning; Arguments=-fbin -DWARNING -ofwdoptpp.bin; Files=stdout stderr fwdoptpp.bin
+
+%ifndef ERROR
+ %ifndef FATAL
+ %ifndef WARNING
+ %define ERROR 1
+ %endif
+ %endif
+%endif
+
+n0: jmp n1
+n1: jmp n2
+n2: jmp n3
+n3: jmp n4
+n4: jmp n5
+n5: jmp n6
+n6: jmp n7
+n7: jmp n8
+n8: jmp n9
+n9: jmp n10
+n10: jmp n11
+n11: jmp n12
+n12: jmp n13
+n13: jmp n14
+n14: jmp n15
+n15: jmp n16
+n16: jmp n17
+n17: jmp n18
+n18: jmp n19
+n19: jmp n20
+n20: jmp n21
+n21: jmp n22
+n22: jmp n23
+n23: jmp n24
+n24: jmp n25
+n25: jmp n26
+n26: jmp n27
+n27: jmp n28
+n28: jmp n29
+n29: jmp n30
+n30: jmp n31
+n31: jmp n32
+n32: jmp n33
+n33: jmp n34
+n34: jmp n35
+n35: jmp n36
+n36: jmp n37
+n37: jmp n38
+n38: jmp n39
+n39: jmp n40
+n40: jmp n41
+n41: jmp n42
+n42: jmp n43
+n43: jmp n44
+n44: jmp n45
+n45: jmp n46
+n46: jmp n47
+n47: jmp n48
+n48: jmp n49
+n49: jmp n50
+n50: jmp n51
+n51: jmp n52
+n52: jmp n53
+n53: jmp n54
+n54: jmp n55
+n55: jmp n56
+n56: jmp n57
+n57: jmp n58
+n58: jmp n59
+n59: jmp n60
+n60: jmp n61
+n61: jmp n62
+n62: jmp n63
+n63: jmp n64
+n64: jmp n65
+n65: jmp n66
+n66: jmp n67
+n67: jmp n68
+n68: jmp n69
+n69: jmp n70
+n70: jmp n71
+n71: jmp n72
+n72: jmp n73
+n73: jmp n74
+n74: jmp n75
+n75: jmp n76
+n76: jmp n77
+n77: jmp n78
+n78: jmp n79
+n79: jmp n80
+n80: jmp n81
+n81: jmp n82
+n82: jmp n83
+n83: jmp n84
+n84: jmp n85
+n85: jmp n86
+n86: jmp n87
+n87: jmp n88
+n88: jmp n89
+n89: jmp n90
+n90: jmp n91
+n91: jmp n92
+n92: jmp n93
+n93: jmp n94
+n94: jmp n95
+n95: jmp n96
+n96: jmp n97
+n97: jmp n98
+n98: jmp n99
+n99: jmp n100
+n100: jmp n101
+n101: jmp n102
+n102: jmp n103
+n103: jmp n104
+n104: jmp n105
+n105: jmp n106
+n106: jmp n107
+n107: jmp n108
+n108: jmp n109
+n109: jmp n110
+n110: jmp n111
+n111: jmp n112
+n112: jmp n113
+n113: jmp n114
+n114: jmp n115
+n115: jmp n116
+n116: jmp n117
+n117: jmp n118
+n118: jmp n119
+n119: jmp n120
+n120: jmp n121
+n121: jmp n122
+n122: jmp n123
+n123: jmp n124
+n124: jmp n125
+n125: jmp n126
+n126: jmp n127
+n127: jmp n0
+
+%if ($-$$) > 257
+ %ifdef FATAL
+ %fatal "Out of space!"
+ %elifdef ERROR
+ %error "Out of space!"
+ %elifdef WARNING
+ %warning "Out of space!"
+ %endif
+%endif
diff --git a/test/gas2nasm.py b/test/gas2nasm.py
new file mode 100755
index 00000000..cc45be5f
--- /dev/null
+++ b/test/gas2nasm.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python -tt
+# -*- python -*-
+# Convert gas testsuite file to NASM test asm file
+# usage >
+# python gas2nasm.py -i input_gas_file -o output_nasm_file -b bits
+# e.g. python gas2nasm.py -i x86-64-avx512f-intel.d -o avx512f.asm -b 64
+
+import sys
+import os
+import optparse
+import re
+
+def setup():
+ parser = optparse.OptionParser()
+ parser.add_option('-i', dest='input', action='store',
+ default="",
+ help='Name for input gas testsuite file.')
+ parser.add_option('-o', dest='output', action='store',
+ default="",
+ help='Name for output NASM test asm file.')
+ parser.add_option('-b', dest='bits', action='store',
+ default="",
+ help='Bits for output ASM file.')
+ parser.add_option('-r', dest='raw_output', action='store',
+ default="",
+ help='Name for raw output bytes in text')
+ (options, args) = parser.parse_args()
+ return options
+
+def read(options):
+ with open(options.input, 'rb') as f:
+ recs = []
+ for line in f:
+ if line[0] == '[':
+ d = []
+ strr = line[16:].partition(' ')
+ if strr[1] == '':
+ strr = line[16:].partition('\t')
+ l = strr[0].strip()
+ r = strr[2].strip()
+ d.append(l)
+ d.append(r)
+ recs.append(d)
+ return recs
+
+def commas(recs):
+ replace_tbl = {' PTR':'', '\\':'', 'MM':'', 'XWORD':'OWORD'}
+ reccommas = []
+ for insn in recs:
+ new = []
+ byte = '0x' + insn[0].replace(' ', ', 0x')
+ for rep in replace_tbl.keys():
+ insn[1] = insn[1].replace(rep, replace_tbl[rep])
+ mnemonic = insn[1]
+
+ # gas size specifier for gather and scatter insturctions seems wrong. just remove them.
+ if 'gather' in insn[1] or 'scatter' in insn[1]:
+ mnemonic = mnemonic.replace('ZWORD', '')
+
+ new.append(byte)
+ new.append(mnemonic)
+ reccommas.append(new)
+ return reccommas
+
+# The spaces reserved here can be adjusted according to the output string length.
+# maxlen printed out at the end of the process will give a hint for it.
+outstrfmt = "testcase\t{ %-70s }, { %-60s }\n"
+
+macro = "%macro testcase 2\n %ifdef BIN\n db %1\n %endif\n %ifdef SRC\n %2\n %endif\n%endmacro\n\n\n"
+
+def write(data, options):
+ if options.output:
+ with open(options.output, 'wb') as out:
+ out.write(macro)
+ if options.bits:
+ out.write('bits ' + options.bits + '\n\n')
+ for insn in data:
+ outstr = outstrfmt % tuple(insn)
+ out.write(outstr)
+
+def write_rawbytes(data, options):
+ if options.raw_output:
+ with open(options.raw_output, 'wb') as out:
+ for insn in data:
+ out.write(insn[0] + '\n')
+
+if __name__ == "__main__":
+ options = setup()
+ recs = read(options)
+
+ write_rawbytes(recs, options)
+
+ recs = commas(recs)
+
+ write(recs, options)
+
+ maxlen = [0,0,0,0,0,0,0,0]
+ for insn in recs:
+#print insn[0] + '\t<-\t' + insn[1]
+ print outstrfmt[:-1] % tuple(insn)
+ for i, strstr in enumerate(insn):
+ if maxlen[i] < len(strstr): maxlen[i] = len(strstr)
+
+ print maxlen
diff --git a/test/gather.asm b/test/gather.asm
new file mode 100644
index 00000000..03037008
--- /dev/null
+++ b/test/gather.asm
@@ -0,0 +1,11 @@
+ bits 64
+
+ VGATHERQPS xmm1, [xmm0 + rsi], xmm2 ; OK
+ VGATHERQPS xmm1, [ymm0 + rsi], xmm2 ; fail: error: invalid effective address
+ VGATHERDPD ymm1, [xmm0 + rsi], ymm2 ; OK
+ VGATHERDPD xmm1, [xmm0 + rsi], xmm2 ; OK
+ VGATHERQPD xmm1, [xmm0 + rsi], xmm2 ; OK
+ VGATHERQPD ymm1, [ymm0 + rsi], ymm2 ; OK
+ VPGATHERQD xmm1, [xmm0 + rsi], xmm2 ; OK
+ VPGATHERQD xmm1, [ymm0 + rsi], xmm2 ; fail: error: invalid effective address
+ VPGATHERDQ ymm1, [xmm0 + rsi], ymm2 ; OK
diff --git a/test/gotoff64.asm b/test/gotoff64.asm
new file mode 100644
index 00000000..05f5882b
--- /dev/null
+++ b/test/gotoff64.asm
@@ -0,0 +1,25 @@
+;Testname=noerr; Arguments=-felf64 -ogotoff64.o; Files=stdout stderr gotoff64.o
+;Testname=err; Arguments=-DERROR -felf64 -ogotoff64.o; Files=stdout stderr gotoff64.o
+
+ bits 64
+ default rel
+
+ extern foo
+
+ mov r15,[foo wrt ..got]
+ lea r12,[foo wrt ..got]
+%ifdef ERROR
+ lea rax,[foo wrt ..gotoff]
+ mov rax,[foo wrt ..gotoff]
+%endif
+
+ default abs
+
+ mov r15,[foo wrt ..got]
+ lea r12,[foo wrt ..got]
+ mov rax,[qword foo wrt ..got]
+%ifdef ERROR
+ lea rax,[foo wrt ..gotoff]
+ mov rax,[foo wrt ..gotoff]
+%endif
+ mov rax,[qword foo wrt ..gotoff]
diff --git a/test/hexfp.asm b/test/hexfp.asm
new file mode 100644
index 00000000..02c972f8
--- /dev/null
+++ b/test/hexfp.asm
@@ -0,0 +1,25 @@
+;; BR 3392399
+
+; All of these should be the same value...
+%macro fp 1
+ %1 0.5
+ %1 5e-1
+ %1 0x1.0p-1
+ %1 0x0.8p0
+ %1 0x0.8
+ %1 0x8p-4
+ %1 0x.8
+ %1 0x1p-1
+ %1 0x0.1p3
+ %1 0x0.01p7
+ %1 0x0.01p7
+ %1 0x0.001p11
+
+%endmacro
+
+ fp do
+ fp dt
+ fp dq
+ fp dd
+ fp dw
+ fp dd
diff --git a/test/hle.asm b/test/hle.asm
new file mode 100644
index 00000000..e59b4f58
--- /dev/null
+++ b/test/hle.asm
@@ -0,0 +1,19 @@
+ bits 32
+
+ xacquire lock add [esi],eax
+ xacquire xchg [eax],ebx
+ xrelease lock mov [eax],ecx
+ xrelease mov [eax],ecx
+ xacquire add ecx,[eax]
+ xrelease mov [eax],ecx
+
+ ; Different opcodes!
+ mov [sym],eax
+ xrelease mov [sym],eax
+ xacquire mov [sym],eax
+
+ mov [sym],al
+ xrelease mov [sym],al
+ xacquire mov [sym],al
+
+sym dd 0
diff --git a/test/ifelse.asm b/test/ifelse.asm
new file mode 100644
index 00000000..bbb0d796
--- /dev/null
+++ b/test/ifelse.asm
@@ -0,0 +1,46 @@
+;Testname=ifelse; Arguments=-fbin -oifelse.bin; Files=stdout stderr ifelse.bin
+
+;No problems -> db 3
+%if 0
+ db 0
+%elif 0 > 0
+ db 1
+%elif 1 < 1
+ db 2
+%else
+ db 3
+%endif
+
+;Garbage after else, elif after else -> db 5
+%if 0
+ db 4
+%else trailing garbage
+ db 5
+%elif 1
+ db 6
+%endif
+
+;Garbage after endif ->
+%if 0
+ db 7
+%endif trailing garbage
+
+;else after else -> db 9
+%if 0
+ db 8
+%else
+ db 9
+%else
+ db 10
+%endif
+
+;Problem preprocessed out, no warning ->
+%if 0
+ %if 1
+ db 11
+ %else
+ db 12
+ %else
+ db 13
+ %endif
+%endif
diff --git a/test/ifenv.asm b/test/ifenv.asm
new file mode 100644
index 00000000..15f12f88
--- /dev/null
+++ b/test/ifenv.asm
@@ -0,0 +1,31 @@
+%macro import 1
+ %defstr %%incfile %!PROJECTBASEDIR/%{1}.inc
+ %defstr %%decfile %!'PROJECTBASEDIR'/%{1}.dec
+ db %%incfile, `\n`
+ db %%decfile, `\n`
+%endmacro
+
+%ifenv PROJECTBASEDIR
+import foo
+%else
+%warning No PROJECTBASEDIR defined
+%endif
+
+%ifenv %!PROJECTBASEDIR
+import foo
+%else
+%warning No PROJECTBASEDIR defined
+%endif
+
+%ifenv 'PROJECTBASEDIR'
+import foo
+%else
+%warning No PROJECTBASEDIR defined
+%endif
+
+%ifenv %!'PROJECTBASEDIR'
+import foo
+%else
+%warning No PROJECTBASEDIR defined
+%endif
+
diff --git a/test/ifmacro.asm b/test/ifmacro.asm
new file mode 100644
index 00000000..53f3d291
--- /dev/null
+++ b/test/ifmacro.asm
@@ -0,0 +1,413 @@
+;Testname=test; Arguments=-fbin -oifmacro.txt; Files=stdout stderr ifmacro.txt
+
+;
+; ifmacro.asm
+;
+; Test of the new ifmacro directive
+;
+; This file produces a human-readable text file when compiled
+; with -f bin
+;
+
+%define LF 10
+
+%macro dummy 2
+ db 'This is a dummy macro, '
+ db 'arg1 = ', %1, ', '
+ db 'arg2 = ', %2, LF
+%endmacro
+
+ dummy 'this', 'that'
+
+%ifdef CR
+ db '%ifdef CR', LF
+%endif
+
+%ifdef LF
+ db '%ifdef LF', LF
+%endif
+
+%ifmacro dummy 1
+ db '%ifmacro dummy 1', LF
+%endif
+
+%ifmacro dummy 2
+ db '%ifmacro dummy 2', LF
+%endif
+
+%ifmacro dummy 3
+ db '%ifmacro dummy 3', LF
+%endif
+
+%ifmacro dummy 1+
+ db '%ifmacro dummy 1+', LF
+%endif
+
+%ifmacro dummy 2+
+ db '%ifmacro dummy 2+', LF
+%endif
+
+%ifmacro dummy 3+
+ db '%ifmacro dummy 3+', LF
+%endif
+
+%ifmacro dummy
+ db '%ifmacro dummy', LF
+%endif
+
+%ifmacro dummy 0-1
+ db '%ifmacro dummy 0-1', LF
+%endif
+
+%ifmacro dummy 1-2
+ db '%ifmacro dummy 1-2', LF
+%endif
+
+%ifmacro dummy 2-3
+ db '%ifmacro dummy 2-3', LF
+%endif
+
+%ifmacro dummy 3-4
+ db '%ifmacro dummy 3-4', LF
+%endif
+
+%ifmacro LF
+ db '%ifmacro LF', LF
+%endif
+
+%ifndef CR
+ db '%ifndef CR', LF
+%endif
+
+%ifndef LF
+ db '%ifndef LF', LF
+%endif
+
+%ifnmacro dummy 1
+ db '%ifnmacro dummy 1', LF
+%endif
+
+%ifnmacro dummy 2
+ db '%ifnmacro dummy 2', LF
+%endif
+
+%ifnmacro dummy 3
+ db '%ifnmacro dummy 3', LF
+%endif
+
+%ifnmacro dummy 1+
+ db '%ifnmacro dummy 1+', LF
+%endif
+
+%ifnmacro dummy 2+
+ db '%ifnmacro dummy 2+', LF
+%endif
+
+%ifnmacro dummy 3+
+ db '%ifnmacro dummy 3+', LF
+%endif
+
+%ifnmacro dummy
+ db '%ifnmacro dummy', LF
+%endif
+
+%ifnmacro dummy 0-1
+ db '%ifnmacro dummy 0-1', LF
+%endif
+
+%ifnmacro dummy 1-2
+ db '%ifnmacro dummy 1-2', LF
+%endif
+
+%ifnmacro dummy 2-3
+ db '%ifnmacro dummy 2-3', LF
+%endif
+
+%ifnmacro dummy 3-4
+ db '%ifnmacro dummy 3-4', LF
+%endif
+
+%ifnmacro LF
+ db '%ifnmacro LF', LF
+%endif
+
+%if 0
+%elifdef CR
+ db '%elifdef CR', CR
+%endif
+
+%if 0
+%elifdef LF
+ db '%elifdef LF', LF
+%endif
+
+%if 0
+%elifmacro dummy 1
+ db '%elifmacro dummy 1', LF
+%endif
+
+%if 0
+%elifmacro dummy 2
+ db '%elifmacro dummy 2', LF
+%endif
+
+%if 0
+%elifmacro dummy 3
+ db '%elifmacro dummy 3', LF
+%endif
+
+%if 0
+%elifmacro dummy 1+
+ db '%elifmacro dummy 1+', LF
+%endif
+
+%if 0
+%elifmacro dummy 2+
+ db '%elifmacro dummy 2+', LF
+%endif
+
+%if 0
+%elifmacro dummy 3+
+ db '%elifmacro dummy 3+', LF
+%endif
+
+%if 0
+%elifmacro dummy
+ db '%elifmacro dummy', LF
+%endif
+
+%if 0
+%elifmacro dummy 0-1
+ db '%elifmacro dummy 0-1', LF
+%endif
+
+%if 0
+%elifmacro dummy 1-2
+ db '%elifmacro dummy 1-2', LF
+%endif
+
+%if 0
+%elifmacro dummy 2-3
+ db '%elifmacro dummy 2-3', LF
+%endif
+
+%if 0
+%elifmacro dummy 3-4
+ db '%elifmacro dummy 3-4', LF
+%endif
+
+%if 0
+%elifmacro LF
+ db '%elifmacro LF', LF
+%endif
+
+%if 0
+%elifndef CR
+ db '%elifndef CR', LF
+%endif
+
+%if 0
+%elifndef LF
+ db '%elifndef LF', LF
+%endif
+
+%if 0
+%elifnmacro dummy 1
+ db '%elifnmacro dummy 1', LF
+%endif
+
+%if 0
+%elifnmacro dummy 2
+ db '%elifnmacro dummy 2', LF
+%endif
+
+%if 0
+%elifnmacro dummy 3
+ db '%elifnmacro dummy 3', LF
+%endif
+
+%if 0
+%elifnmacro dummy 1+
+ db '%elifnmacro dummy 1+', LF
+%endif
+
+%if 0
+%elifnmacro dummy 2+
+ db '%elifnmacro dummy 2+', LF
+%endif
+
+%if 0
+%elifnmacro dummy 3+
+ db '%elifnmacro dummy 3+', LF
+%endif
+
+%if 0
+%elifnmacro dummy
+ db '%elifnmacro dummy', LF
+%endif
+
+%if 0
+%elifnmacro dummy 0-1
+ db '%elifnmacro dummy 0-1', LF
+%endif
+
+%if 0
+%elifnmacro dummy 1-2
+ db '%elifnmacro dummy 1-2', LF
+%endif
+
+%if 0
+%elifnmacro dummy 2-3
+ db '%elifnmacro dummy 2-3', LF
+%endif
+
+%if 0
+%elifnmacro dummy 3-4
+ db '%elifnmacro dummy 3-4', LF
+%endif
+
+%if 0
+%elifnmacro LF
+ db '%elifnmacro LF', LF
+%endif
+
+%if 1
+%elifdef CR
+ db 'bad %elifdef CR', LF
+%endif
+
+%if 1
+%elifdef LF
+ db 'bad %elifdef LF', LF
+%endif
+
+%if 1
+%elifmacro dummy 1
+ db 'bad %elifmacro dummy 1', LF
+%endif
+
+%if 1
+%elifmacro dummy 2
+ db 'bad %elifmacro dummy 2', LF
+%endif
+
+%if 1
+%elifmacro dummy 3
+ db 'bad %elifmacro dummy 3', LF
+%endif
+
+%if 1
+%elifmacro dummy 1+
+ db 'bad %elifmacro dummy 1+', LF
+%endif
+
+%if 1
+%elifmacro dummy 2+
+ db 'bad %elifmacro dummy 2+', LF
+%endif
+
+%if 1
+%elifmacro dummy 3+
+ db 'bad %elifmacro dummy 3+', LF
+%endif
+
+%if 1
+%elifmacro dummy
+ db 'bad %elifmacro dummy', LF
+%endif
+
+%if 1
+%elifmacro dummy 0-1
+ db 'bad %elifmacro dummy 0-1', LF
+%endif
+
+%if 1
+%elifmacro dummy 1-2
+ db 'bad %elifmacro dummy 1-2', LF
+%endif
+
+%if 1
+%elifmacro dummy 2-3
+ db 'bad %elifmacro dummy 2-3', LF
+%endif
+
+%if 1
+%elifmacro dummy 3-4
+ db 'bad %elifmacro dummy 3-4', LF
+%endif
+
+%if 1
+%elifmacro LF
+ db 'bad %elifmacro LF', LF
+%endif
+
+%if 1
+%elifndef CR
+ db 'bad %elifndef CR', LF
+%endif
+
+%if 1
+%elifndef LF
+ db 'bad %elifndef LF', LF
+%endif
+
+%if 1
+%elifnmacro dummy 1
+ db 'bad %elifnmacro dummy 1', LF
+%endif
+
+%if 1
+%elifnmacro dummy 2
+ db 'bad %elifnmacro dummy 2', LF
+%endif
+
+%if 1
+%elifnmacro dummy 3
+ db 'bad %elifnmacro dummy 3', LF
+%endif
+
+%if 1
+%elifnmacro dummy 1+
+ db 'bad %elifnmacro dummy 1+', LF
+%endif
+
+%if 1
+%elifnmacro dummy 2+
+ db 'bad %elifnmacro dummy 2+', LF
+%endif
+
+%if 1
+%elifnmacro dummy 3+
+ db 'bad %elifnmacro dummy 3+', LF
+%endif
+
+%if 1
+%elifnmacro dummy
+ db 'bad %elifnmacro dummy', LF
+%endif
+
+%if 1
+%elifnmacro dummy 0-1
+ db 'bad %elifnmacro dummy 0-1', LF
+%endif
+
+%if 1
+%elifnmacro dummy 1-2
+ db 'bad %elifnmacro dummy 1-2', LF
+%endif
+
+%if 1
+%elifnmacro dummy 2-3
+ db 'bad %elifnmacro dummy 2-3', LF
+%endif
+
+%if 1
+%elifnmacro dummy 3-4
+ db 'bad %elifnmacro dummy 3-4', LF
+%endif
+
+%if 1
+%elifnmacro LF
+ db 'bad %elifnmacro LF', LF
+%endif
+
diff --git a/test/iftoken.asm b/test/iftoken.asm
new file mode 100644
index 00000000..7a0fec49
--- /dev/null
+++ b/test/iftoken.asm
@@ -0,0 +1,317 @@
+;Testname=test; Arguments=-fbin -oiftoken.txt; Files=stdout stderr iftoken.txt
+
+%define ZMACRO
+%define NMACRO 1
+%define TMACRO 1 2
+ db 'N "":'
+%iftoken
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "":'
+%iftoken ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "ZMACRO":'
+%iftoken ZMACRO
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty ZMACRO
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "ZMACRO":'
+%iftoken ZMACRO ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty ZMACRO ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "NMACRO":'
+%iftoken NMACRO
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty NMACRO
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "NMACRO":'
+%iftoken NMACRO ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty NMACRO ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "TMACRO":'
+%iftoken TMACRO
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty TMACRO
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "TMACRO":'
+%iftoken TMACRO ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty TMACRO ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "1":'
+%iftoken 1
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "1":'
+%iftoken 1 ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1 ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "+1":'
+%iftoken +1
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty +1
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "+1":'
+%iftoken +1 ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty +1 ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "1 2":'
+%iftoken 1 2
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1 2
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "1 2":'
+%iftoken 1 2 ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1 2 ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "1,2":'
+%iftoken 1,2
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1,2
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "1,2":'
+%iftoken 1,2 ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty 1,2 ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "foo":'
+%iftoken foo
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty foo
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "foo":'
+%iftoken foo ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty foo ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "foo bar":'
+%iftoken foo bar
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty foo bar
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "foo bar":'
+%iftoken foo bar ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty foo bar ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "%":'
+%iftoken %
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty %
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "%":'
+%iftoken % ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty % ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "+foo":'
+%iftoken +foo
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty +foo
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "+foo":'
+%iftoken +foo ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty +foo ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'N "<<":'
+%iftoken <<
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty <<
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
+ db 'C "<<":'
+%iftoken << ; With a comment!
+ db ' token'
+%else
+ db ' ntoken'
+%endif
+%ifempty << ; With a comment!
+ db ' empty'
+%else
+ db ' nempty'
+%endif
+ db 10
diff --git a/test/iftoken.pl b/test/iftoken.pl
new file mode 100755
index 00000000..925dd40c
--- /dev/null
+++ b/test/iftoken.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+
+@list = ('', 'ZMACRO', 'NMACRO', 'TMACRO', '1', '+1', '1 2', '1,2',
+ 'foo', 'foo bar', '%', '+foo', '<<');
+@tests = ('token', 'empty');
+
+print ";Testname=test; Arguments=-fbin -oiftoken.txt; Files=stdout stderr iftoken.txt"
+print "%define ZMACRO\n";
+print "%define NMACRO 1\n";
+print "%define TMACRO 1 2\n";
+
+foreach $x (@list) {
+ print "\tdb 'N \"$x\":'\n";
+ foreach $t (@tests) {
+ print "%if$t $x\n";
+ print "\tdb ' $t'\n";
+ print "%else\n";
+ print "\tdb ' n$t'\n";
+ print "%endif\n";
+ }
+ print "\tdb 10\n";
+
+ print "\tdb 'C \"$x\":'\n";
+ foreach $t (@tests) {
+ print "%if$t $x ; With a comment!\n";
+ print "\tdb ' $t'\n";
+ print "%else\n";
+ print "\tdb ' n$t'\n";
+ print "%endif\n";
+ }
+ print "\tdb 10\n";
+}
diff --git a/test/ilog2.asm b/test/ilog2.asm
new file mode 100644
index 00000000..2796af80
--- /dev/null
+++ b/test/ilog2.asm
@@ -0,0 +1,271 @@
+%use ifunc
+
+ db ilog2(0x1)
+ db ilog2(0x2)
+ db ilog2(0x4)
+ db ilog2(0x8)
+ db ilog2(0x10)
+ db ilog2(0x20)
+ db ilog2(0x40)
+ db ilog2(0x80)
+ db ilog2(0x100)
+ db ilog2(0x200)
+ db ilog2(0x400)
+ db ilog2(0x800)
+ db ilog2(0x1000)
+ db ilog2(0x2000)
+ db ilog2(0x4000)
+ db ilog2(0x8000)
+ db ilog2(0x10000)
+ db ilog2(0x20000)
+ db ilog2(0x40000)
+ db ilog2(0x80000)
+ db ilog2(0x100000)
+ db ilog2(0x200000)
+ db ilog2(0x400000)
+ db ilog2(0x800000)
+ db ilog2(0x1000000)
+ db ilog2(0x2000000)
+ db ilog2(0x4000000)
+ db ilog2(0x8000000)
+ db ilog2(0x10000000)
+ db ilog2(0x20000000)
+ db ilog2(0x40000000)
+ db ilog2(0x80000000)
+
+ db ilog2w(0x1)
+ db ilog2w(0x2)
+ db ilog2w(0x4)
+ db ilog2w(0x8)
+ db ilog2w(0x10)
+ db ilog2w(0x20)
+ db ilog2w(0x40)
+ db ilog2w(0x80)
+ db ilog2w(0x100)
+ db ilog2w(0x200)
+ db ilog2w(0x400)
+ db ilog2w(0x800)
+ db ilog2w(0x1000)
+ db ilog2w(0x2000)
+ db ilog2w(0x4000)
+ db ilog2w(0x8000)
+ db ilog2w(0x10000)
+ db ilog2w(0x20000)
+ db ilog2w(0x40000)
+ db ilog2w(0x80000)
+ db ilog2w(0x100000)
+ db ilog2w(0x200000)
+ db ilog2w(0x400000)
+ db ilog2w(0x800000)
+ db ilog2w(0x1000000)
+ db ilog2w(0x2000000)
+ db ilog2w(0x4000000)
+ db ilog2w(0x8000000)
+ db ilog2w(0x10000000)
+ db ilog2w(0x20000000)
+ db ilog2w(0x40000000)
+ db ilog2w(0x80000000)
+
+ db ilog2f(0x1)
+ db ilog2f(0x2)
+ db ilog2f(0x4)
+ db ilog2f(0x8)
+ db ilog2f(0x10)
+ db ilog2f(0x20)
+ db ilog2f(0x40)
+ db ilog2f(0x80)
+ db ilog2f(0x100)
+ db ilog2f(0x200)
+ db ilog2f(0x400)
+ db ilog2f(0x800)
+ db ilog2f(0x1000)
+ db ilog2f(0x2000)
+ db ilog2f(0x4000)
+ db ilog2f(0x8000)
+ db ilog2f(0x10000)
+ db ilog2f(0x20000)
+ db ilog2f(0x40000)
+ db ilog2f(0x80000)
+ db ilog2f(0x100000)
+ db ilog2f(0x200000)
+ db ilog2f(0x400000)
+ db ilog2f(0x800000)
+ db ilog2f(0x1000000)
+ db ilog2f(0x2000000)
+ db ilog2f(0x4000000)
+ db ilog2f(0x8000000)
+ db ilog2f(0x10000000)
+ db ilog2f(0x20000000)
+ db ilog2f(0x40000000)
+ db ilog2f(0x80000000)
+
+ db ilog2c(0x1)
+ db ilog2c(0x2)
+ db ilog2c(0x4)
+ db ilog2c(0x8)
+ db ilog2c(0x10)
+ db ilog2c(0x20)
+ db ilog2c(0x40)
+ db ilog2c(0x80)
+ db ilog2c(0x100)
+ db ilog2c(0x200)
+ db ilog2c(0x400)
+ db ilog2c(0x800)
+ db ilog2c(0x1000)
+ db ilog2c(0x2000)
+ db ilog2c(0x4000)
+ db ilog2c(0x8000)
+ db ilog2c(0x10000)
+ db ilog2c(0x20000)
+ db ilog2c(0x40000)
+ db ilog2c(0x80000)
+ db ilog2c(0x100000)
+ db ilog2c(0x200000)
+ db ilog2c(0x400000)
+ db ilog2c(0x800000)
+ db ilog2c(0x1000000)
+ db ilog2c(0x2000000)
+ db ilog2c(0x4000000)
+ db ilog2c(0x8000000)
+ db ilog2c(0x10000000)
+ db ilog2c(0x20000000)
+ db ilog2c(0x40000000)
+ db ilog2c(0x80000000)
+
+%ifdef ERROR
+ db ilog2(0x0)
+ db ilog2(0x3)
+ db ilog2(0x5)
+ db ilog2(0x9)
+ db ilog2(0x10)
+ db ilog2(0x30)
+ db ilog2(0x50)
+ db ilog2(0x90)
+ db ilog2(0x100)
+ db ilog2(0x300)
+ db ilog2(0x500)
+ db ilog2(0x900)
+ db ilog2(0x1000)
+ db ilog2(0x3000)
+ db ilog2(0x5000)
+ db ilog2(0x9000)
+ db ilog2(0x10000)
+ db ilog2(0x30000)
+ db ilog2(0x50000)
+ db ilog2(0x90000)
+ db ilog2(0x100000)
+ db ilog2(0x300000)
+ db ilog2(0x500000)
+ db ilog2(0x900000)
+ db ilog2(0x1000000)
+ db ilog2(0x3000000)
+ db ilog2(0x5000000)
+ db ilog2(0x9000000)
+ db ilog2(0x10000000)
+ db ilog2(0x30000000)
+ db ilog2(0x50000000)
+ db ilog2(0x90000000)
+%endif
+
+%ifdef WARNING
+ db ilog2w(0x0)
+ db ilog2w(0x3)
+ db ilog2w(0x5)
+ db ilog2w(0x9)
+ db ilog2w(0x10)
+ db ilog2w(0x30)
+ db ilog2w(0x50)
+ db ilog2w(0x90)
+ db ilog2w(0x100)
+ db ilog2w(0x300)
+ db ilog2w(0x500)
+ db ilog2w(0x900)
+ db ilog2w(0x1000)
+ db ilog2w(0x3000)
+ db ilog2w(0x5000)
+ db ilog2w(0x9000)
+ db ilog2w(0x10000)
+ db ilog2w(0x30000)
+ db ilog2w(0x50000)
+ db ilog2w(0x90000)
+ db ilog2w(0x100000)
+ db ilog2w(0x300000)
+ db ilog2w(0x500000)
+ db ilog2w(0x900000)
+ db ilog2w(0x1000000)
+ db ilog2w(0x3000000)
+ db ilog2w(0x5000000)
+ db ilog2w(0x9000000)
+ db ilog2w(0x10000000)
+ db ilog2w(0x30000000)
+ db ilog2w(0x50000000)
+ db ilog2w(0x90000000)
+%endif
+
+ db ilog2f(0x0)
+ db ilog2f(0x1)
+ db ilog2f(0x3)
+ db ilog2f(0x5)
+ db ilog2f(0x9)
+ db ilog2f(0x10)
+ db ilog2f(0x30)
+ db ilog2f(0x50)
+ db ilog2f(0x90)
+ db ilog2f(0x100)
+ db ilog2f(0x300)
+ db ilog2f(0x500)
+ db ilog2f(0x900)
+ db ilog2f(0x1000)
+ db ilog2f(0x3000)
+ db ilog2f(0x5000)
+ db ilog2f(0x9000)
+ db ilog2f(0x10000)
+ db ilog2f(0x30000)
+ db ilog2f(0x50000)
+ db ilog2f(0x90000)
+ db ilog2f(0x100000)
+ db ilog2f(0x300000)
+ db ilog2f(0x500000)
+ db ilog2f(0x900000)
+ db ilog2f(0x1000000)
+ db ilog2f(0x3000000)
+ db ilog2f(0x5000000)
+ db ilog2f(0x9000000)
+ db ilog2f(0x10000000)
+ db ilog2f(0x30000000)
+ db ilog2f(0x50000000)
+ db ilog2f(0x90000000)
+
+ db ilog2c(0x0)
+ db ilog2c(0x1)
+ db ilog2c(0x3)
+ db ilog2c(0x5)
+ db ilog2c(0x9)
+ db ilog2c(0x10)
+ db ilog2c(0x30)
+ db ilog2c(0x50)
+ db ilog2c(0x90)
+ db ilog2c(0x100)
+ db ilog2c(0x300)
+ db ilog2c(0x500)
+ db ilog2c(0x900)
+ db ilog2c(0x1000)
+ db ilog2c(0x3000)
+ db ilog2c(0x5000)
+ db ilog2c(0x9000)
+ db ilog2c(0x10000)
+ db ilog2c(0x30000)
+ db ilog2c(0x50000)
+ db ilog2c(0x90000)
+ db ilog2c(0x100000)
+ db ilog2c(0x300000)
+ db ilog2c(0x500000)
+ db ilog2c(0x900000)
+ db ilog2c(0x1000000)
+ db ilog2c(0x3000000)
+ db ilog2c(0x5000000)
+ db ilog2c(0x9000000)
+ db ilog2c(0x10000000)
+ db ilog2c(0x30000000)
+ db ilog2c(0x50000000)
+ db ilog2c(0x90000000)
diff --git a/test/imacro.asm b/test/imacro.asm
new file mode 100644
index 00000000..bc397cc3
--- /dev/null
+++ b/test/imacro.asm
@@ -0,0 +1,8 @@
+;Testname=test; Arguments=-fbin -oimacro.bin; Files=stdout stderr imacro.bin
+
+%imacro Zero 1
+ xor %1,%1
+%endmacro
+
+ Zero eax
+ zero eax
diff --git a/test/imm.asm b/test/imm.asm
new file mode 100644
index 00000000..6b24c880
--- /dev/null
+++ b/test/imm.asm
@@ -0,0 +1,23 @@
+ bits 64
+
+ mov eax,1
+ mov eax,-1
+ mov eax,0x11111111
+ mov ecx,2
+ add ecx,-6
+ add ecx,strict dword -6
+ add ecx,4
+ add ecx,strict dword 4
+ add ecx,10000
+ xor ecx,0xffffffff
+ xor ecx,dword 0xffffffff
+ xor ecx,strict dword 0xffffffff
+ xor ecx,-1
+ xor ecx,dword -1
+ xor ecx,strict dword -1
+ add edx,byte ($-$$)
+%ifnidn __OUTPUT_FORMAT__,bin
+ extern foo, bar
+ add eax,byte foo
+ add edx,byte (bar-$$)
+%endif
diff --git a/test/imm64.asm b/test/imm64.asm
new file mode 100644
index 00000000..a1140443
--- /dev/null
+++ b/test/imm64.asm
@@ -0,0 +1,61 @@
+;Testname=imm64-O0; Arguments=-O0 -fbin -oimm64.bin; Files=stdout stderr imm64.bin
+;Testname=imm64-O1; Arguments=-O1 -fbin -oimm64.bin; Files=stdout stderr imm64.bin
+;Testname=imm64-Ox; Arguments=-Ox -fbin -oimm64.bin; Files=stdout stderr imm64.bin
+
+ bits 64
+ mov rax,11223344h
+ mov rax,dword 11223344h
+ mov eax,11223344h
+ mov [rax],dword 11223344h ; 32-bit operation
+ mov qword [rax],11223344h
+ mov qword [rax],dword 11223344h
+
+ mov rax,0_ffffffff_8899aabbh
+ mov rax,dword 0_ffffffff_8899aabbh
+ mov eax,0_ffffffff_8899aabbh
+ mov [rax],dword 0_ffffffff_8899aabbh ; 32-bit operation
+ mov qword [rax],0_ffffffff_8899aabbh
+ mov qword [rax],dword 0_ffffffff_8899aabbh
+
+ mov rax,7fffffffh
+ mov rax,80000000h
+ mov rax,0_ffffffffh
+ mov rax,1_00000000h
+ mov rax,0_ffffffff_7fffffffh
+ mov rax,0_ffffffff_80000000h
+
+ mov rax,0_11223344_8899aabbh
+ mov rax,dword 0_11223344_8899aabbh
+ mov eax,0_11223344_8899aabbh
+ mov [rax],dword 0_11223344_8899aabbh ; 32-bit operation
+ mov qword [rax],0_11223344_8899aabbh
+ mov qword [rax],dword 0_11223344_8899aabbh
+
+ mov rax,strict 11223344h
+ mov rax,strict dword 11223344h
+ mov eax,strict 11223344h
+ mov [rax],strict dword 11223344h ; 32-bit operation
+ mov qword [rax],strict 11223344h
+ mov qword [rax],strict dword 11223344h
+
+ mov rax,strict 0_ffffffff_8899aabbh
+ mov rax,strict dword 0_ffffffff_8899aabbh
+ mov eax,strict 0_ffffffff_8899aabbh
+ mov [rax],strict dword 0_ffffffff_8899aabbh ; 32-bit operation
+ mov qword [rax],strict 0_ffffffff_8899aabbh
+ mov qword [rax],strict dword 0_ffffffff_8899aabbh
+
+ mov rax,strict 7fffffffh
+ mov rax,strict 80000000h
+ mov rax,strict 0_ffffffffh
+ mov rax,strict 1_00000000h
+ mov rax,strict 0_ffffffff_7fffffffh
+ mov rax,strict 0_ffffffff_80000000h
+
+ mov rax,strict 0_11223344_8899aabbh
+ mov rax,strict dword 0_11223344_8899aabbh
+ mov eax,strict 0_11223344_8899aabbh
+ mov [rax],strict dword 0_11223344_8899aabbh ; 32-bit operation
+ mov qword [rax],strict 0_11223344_8899aabbh
+ mov qword [rax],strict dword 0_11223344_8899aabbh
+
diff --git a/test/immwarn.asm b/test/immwarn.asm
new file mode 100644
index 00000000..8bffbfae
--- /dev/null
+++ b/test/immwarn.asm
@@ -0,0 +1,91 @@
+;Testname=onowarn; Arguments=-Ox -DOPT=1 -DWARN=0 -fbin -oimmwarn.bin; Files=stdout stderr immwarn.bin
+;Testname=owarn; Arguments=-Ox -DOPT=1 -DWARN=1 -fbin -oimmwarn.bin; Files=stdout stderr immwarn.bin
+;Testname=nowarn; Arguments=-O0 -DOPT=0 -DWARN=0 -fbin -oimmwarn.bin; Files=stdout stderr immwarn.bin
+;Testname=warn; Arguments=-O0 -DOPT=1 -DWARN=1 -fbin -oimmwarn.bin; Files=stdout stderr immwarn.bin
+
+%ifndef WARN
+ %define WARN 1
+%endif
+
+ bits 16
+ push 1
+%if WARN
+ push 0ffffffffh
+%endif
+ push -1
+ push 0ffffh
+ push byte 0FFFFh
+
+ add ax,0FFFFh
+%if WARN
+ add ax,0FFFFFFFFh
+%endif
+ add ax,-1
+ add ax,byte 0FFFFh
+%if WARN
+ add ax,byte 0FFFFFFFFh
+%endif
+ add ax,-1
+
+ add cx,0FFFFh
+%if WARN
+ add cx,0FFFFFFFFh
+%endif
+ add cx,-1
+ add cx,byte 0FFFFh
+%if WARN
+ add cx,byte 0FFFFFFFFh
+%endif
+ add cx,-1
+
+ bits 32
+ push 1
+ push 0ffffffffh
+ push -1
+ push 0ffffh
+
+ push byte 1
+%if WARN
+ push byte 0ffffh
+%endif
+ push byte -1
+
+ push word 1
+ push word 0ffffh
+ push word -1
+
+ push dword 1
+ push dword 0ffffffffh
+ push dword -1
+
+ add eax,0FFFFh
+ add eax,0FFFFFFFFh
+ add eax,-1
+
+ add ecx,0FFFFh
+ add ecx,0FFFFFFFFh
+ add ecx,-1
+
+ bits 64
+ mov eax,7fffffffh
+ mov eax,80000000h
+ mov rax,7fffffffh
+ mov rax,80000000h
+%if WARN
+ mov rax,dword 80000000h
+%endif
+ add rcx,0FFFFh
+%if WARN
+ add rcx,0FFFFFFFFh
+%endif
+ add rcx,-1
+
+ add ecx,0FFFFh
+ add ecx,0FFFFFFFFh
+ add ecx,-1
+
+ push byte 1
+%if WARN
+ push byte 0ffffffffh
+%endif
+ push byte -1
diff --git a/test/imul.asm b/test/imul.asm
new file mode 100644
index 00000000..d30d25f1
--- /dev/null
+++ b/test/imul.asm
@@ -0,0 +1,117 @@
+;Testname=nowarn; Arguments=-fbin -oimul.bin; Files=stdout stderr imul.bin
+;Testname=warn; Arguments=-DWARN -fbin -oimul.bin; Files=stdout stderr imul.bin
+
+%macro test 1-3 5 -2
+ bits %1
+
+%undef MEM
+%if %1 == 16
+ %define MEM [di]
+%elif %1 == 32
+ %define MEM [edi]
+%elif %1 == 64
+ %define MEM [rdi]
+%endif
+
+ imul al
+ imul byte MEM
+ imul ax
+ imul word MEM
+ imul eax
+ imul dword MEM
+%if %1 == 64
+ imul rdx
+ imul qword MEM
+%endif
+
+ imul ax,cx
+ imul ax,MEM
+ imul ax,word MEM
+ imul eax,ecx
+ imul eax,MEM
+ imul eax,dword MEM
+%if %1 == 64
+ imul rax,rcx
+ imul rax,MEM
+ imul rax,qword MEM
+%endif
+
+ imul ax,cx,%2
+ imul ax,cx,byte %2
+ imul ax,MEM,%2
+ imul ax,word MEM,%2
+ imul eax,ecx,%2
+ imul eax,ecx,byte %2
+ imul eax,MEM,%2
+ imul eax,dword MEM,%2
+%if %1 == 64
+ imul rax,rcx,%2
+ imul rax,rcx,byte %2
+ imul rax,MEM,%2
+ imul rax,qword MEM,%2
+%endif
+
+ imul ax,%2
+ imul ax,byte %2
+ imul eax,%2
+ imul eax,byte %2
+%if %1 == 64
+ imul rax,%2
+ imul rax,byte %2
+%endif
+
+ imul ax,cx,0x1234
+ imul ax,MEM,0x1234
+ imul ax,word MEM,0x1234
+ imul eax,ecx,0x12345678
+ imul eax,MEM,0x12345678
+ imul eax,dword MEM,0x12345678
+%if %1 == 64
+ imul rax,rcx,0x12345678
+ imul rax,MEM,0x12345678
+ imul rax,qword MEM,0x12345678
+%endif
+
+ imul ax,0x1234
+ imul eax,0x12345678
+%if %1 == 64
+ imul rax,0x12345678
+%endif
+
+ imul ax,cx,0xfffe
+ imul ax,MEM,0xfffe
+ imul ax,word MEM,0xfffe
+ imul ax,cx,0xfe
+ imul ax,MEM,0xfe
+ imul ax,word MEM,0xfe
+ imul eax,ecx,0xfffffffe
+ imul eax,MEM,0xfffffffe
+ imul eax,dword MEM,0xfffffffe
+ imul eax,ecx,0xfffe
+ imul eax,MEM,0xfffe
+ imul eax,dword MEM,0xfffe
+%if %1 == 64
+ imul rax,rcx,%3
+ imul rax,MEM,%3
+ imul rax,qword MEM,%3
+ imul rax,rcx,0xfffe
+ imul rax,MEM,0xfffe
+ imul rax,qword MEM,0xfffe
+%endif
+
+ imul ax,0xfffe
+ imul eax,0xfffffffe
+%if %1 == 64
+ imul rax,%3
+%endif
+%endmacro
+
+ test 16
+ test 32
+ test 64
+
+%ifdef WARN
+ test 16,0x999
+ test 32,0x999999
+ test 64,0x999999999,0xfffffffe
+%endif
diff --git a/test/inc1.asm b/test/inc1.asm
new file mode 100644
index 00000000..0e1058b5
--- /dev/null
+++ b/test/inc1.asm
@@ -0,0 +1,6 @@
+; This file is part of the include test.
+; See inctest.asm for build instructions.
+
+message: db 'hello, world',13,10,'$'
+
+%include "inc2.asm"
diff --git a/test/inc2.asm b/test/inc2.asm
new file mode 100644
index 00000000..c3ba2f75
--- /dev/null
+++ b/test/inc2.asm
@@ -0,0 +1,8 @@
+; This file is part of the include test.
+; See inctest.asm for build instructions.
+
+_main: mov dx,message
+ mov ah,9
+ int 21h
+ mov ax,4c00h
+ int 21h
diff --git a/test/incbin.asm b/test/incbin.asm
new file mode 100644
index 00000000..40b18e49
--- /dev/null
+++ b/test/incbin.asm
@@ -0,0 +1,7 @@
+ db '*** ONCE ***', 0Ah
+ incbin "incbin.data",32
+
+ section more start=0x1000000
+ db '*** TWELVE ***', 0Ah
+ times 12 incbin "incbin.data",32
+ db '<END>', 0Ah
diff --git a/test/incbin.data b/test/incbin.data
new file mode 100644
index 00000000..40f9d947
--- /dev/null
+++ b/test/incbin.data
@@ -0,0 +1,2 @@
+This is the wrong line of text.
+This is the right line of text.
diff --git a/test/inctest.asm b/test/inctest.asm
new file mode 100644
index 00000000..35f29107
--- /dev/null
+++ b/test/inctest.asm
@@ -0,0 +1,15 @@
+;Testname=test; Arguments=-fbin -oinctest.com; Files=stdout stderr inctest.com
+
+; This file, plus inc1.asm and inc2.asm, test NASM's file inclusion
+; mechanism.
+;
+; This produces a DOS .COM file: to assemble, use
+; nasm -f bin inctest.asm -o inctest.com
+; and when run, it should print `hello, world'.
+
+ BITS 16
+ ORG 0x100
+
+ jmp _main
+
+%include "inc1.asm"
diff --git a/test/insnlbl.asm b/test/insnlbl.asm
new file mode 100644
index 00000000..e4563723
--- /dev/null
+++ b/test/insnlbl.asm
@@ -0,0 +1,12 @@
+;Testname=test; Arguments=-fbin -oinsnlbl.bin; Files=stdout stderr insnlbl.bin
+
+;
+; Test "instruction as label" -- make opcodes legal as labels if
+; they are followed by a colon.
+;
+
+do: jmp dq+2
+ dw do, add, sub, dq
+add: jmp add-2
+sub: jmp do+2
+dq: dw $-sub
diff --git a/test/invlpga.asm b/test/invlpga.asm
new file mode 100644
index 00000000..21ab4b42
--- /dev/null
+++ b/test/invlpga.asm
@@ -0,0 +1,11 @@
+;Testname=unoptimized; Arguments=-fbin -oinvlpga.bin; Files=stdout stderr invlpga.bin
+;Testname=optimized; Arguments=-fbin -oinvlpga.bin -Ox; Files=stdout stderr invlpga.bin
+
+ bits 32
+ invlpga
+ invlpga ax,ecx
+ invlpga eax,ecx
+ bits 64
+ invlpga
+ invlpga eax,ecx
+ invlpga rax,ecx
diff --git a/test/jmp64.asm b/test/jmp64.asm
new file mode 100644
index 00000000..616b0e6a
--- /dev/null
+++ b/test/jmp64.asm
@@ -0,0 +1,19 @@
+;Testname=test; Arguments=-fbin -ojmp64.bin; Files=stdout stderr jmp64.bin
+
+ bits 64
+ jmp rcx
+ jmp [rax]
+ jmp qword [rax]
+ jmp near [rax]
+ jmp near qword [rax]
+ jmp far [rax]
+ jmp far dword [rax]
+ jmp far qword [rax]
+ call rcx
+ call [rax]
+ call qword [rax]
+ call near [rax]
+ call near qword [rax]
+ call far [rax]
+ call far dword [rax]
+ call far qword [rax]
diff --git a/test/lar_lsl.asm b/test/lar_lsl.asm
new file mode 100644
index 00000000..a0a9c0eb
--- /dev/null
+++ b/test/lar_lsl.asm
@@ -0,0 +1,124 @@
+;Testname=test; Arguments=-fbin -olar_lsl.bin; Files=stdout stderr lar_lsl.bin
+
+; LAR/LSL
+;---------
+
+; 1x ; = invalid due to lack of REX
+; 3x ; = invalid due to Mw
+
+%macro m 1
+
+ bits 16
+
+ %1 ax, ax
+ %1 ax,eax
+; %1 ax,rax
+
+ %1 eax, ax
+ %1 eax,eax
+; %1 eax,rax
+
+; %1 rax, ax
+; %1 rax,eax
+; %1 rax,rax
+
+ %1 ax, [0]
+ %1 ax, word [0]
+;;; %1 ax,dword [0]
+; %1 ax,qword [0]
+
+ %1 eax, [0]
+ %1 eax, word [0]
+;;; %1 eax,dword [0]
+; %1 eax,qword [0]
+
+; %1 rax, [0]
+; %1 rax, word [0]
+; %1 rax,dword [0]
+; %1 rax,qword [0]
+
+ bits 32
+
+ %1 ax, ax
+ %1 ax,eax
+; %1 ax,rax
+
+ %1 eax, ax
+ %1 eax,eax
+; %1 eax,rax
+
+; %1 rax, ax
+; %1 rax,eax
+; %1 rax,rax
+
+ %1 ax, [0]
+ %1 ax, word [0]
+;;; %1 ax,dword [0]
+; %1 ax,qword [0]
+
+ %1 eax, [0]
+ %1 eax, word [0]
+;;; %1 eax,dword [0]
+; %1 eax,qword [0]
+
+; %1 rax, [0]
+; %1 rax, word [0]
+; %1 rax,dword [0]
+; %1 rax,qword [0]
+
+ bits 64
+
+ %1 ax, ax
+ %1 ax,eax
+ %1 ax,rax ; $TODO: shouldn't emit REX.W $
+
+ %1 eax, ax
+ %1 eax,eax
+ %1 eax,rax ; $TODO: shouldn't emit REX.W $
+
+ %1 rax, ax
+ %1 rax,eax
+ %1 rax,rax
+
+ %1 ax, [0]
+ %1 ax, word [0]
+;;; %1 ax,dword [0]
+;;; %1 ax,qword [0]
+
+ %1 eax, [0]
+ %1 eax, word [0]
+;;; %1 eax,dword [0]
+;;; %1 eax,qword [0]
+
+ %1 rax, [0]
+ %1 rax, word [0]
+;;; %1 rax,dword [0]
+;;; %1 rax,qword [0]
+
+%endmacro
+
+m lar
+
+m lsl
+
+bits 16
+lar ax,[ si]
+lar ax,[esi]
+bits 32
+lar ax,[ si]
+lar ax,[esi]
+bits 64
+lar ax,[esi]
+lar ax,[rsi]
+
+bits 16
+lsl ax,[ si]
+lsl ax,[esi]
+bits 32
+lsl ax,[ si]
+lsl ax,[esi]
+bits 64
+lar ax,[esi]
+lsl ax,[rsi]
+
+; EOF
diff --git a/test/larlsl.asm b/test/larlsl.asm
new file mode 100644
index 00000000..cddaac79
--- /dev/null
+++ b/test/larlsl.asm
@@ -0,0 +1,23 @@
+;Testname=test; Arguments=-fbin -olarlsl.bin; Files=stdout stderr larlsl.bin
+
+ bits 64
+
+ lar ax,bx
+ lar ax,[rsi]
+ lar ax,word [rsi]
+ lar eax,bx
+ lar eax,[rsi]
+ lar eax,word [rsi]
+ lar rax,bx
+ lar rax,[rsi]
+ lar rax,word [rsi]
+
+ lsl ax,bx
+ lsl ax,[rsi]
+ lsl ax,word [rsi]
+ lsl eax,bx
+ lsl eax,[rsi]
+ lsl eax,word [rsi]
+ lsl rax,bx
+ lsl rax,[rsi]
+ lsl rax,word [rsi]
diff --git a/test/lnxhello.asm b/test/lnxhello.asm
new file mode 100644
index 00000000..1aa5a5f8
--- /dev/null
+++ b/test/lnxhello.asm
@@ -0,0 +1,54 @@
+;Testname=aout; Arguments=-faout -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=aoutb; Arguments=-faoutb -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=as86; Arguments=-fas86 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=elf32; Arguments=-felf32 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+
+;
+; Assembly "Hello, World!" for Linux
+;
+
+
+; Properly defined in <sys/syscall.h>
+%define SYS_exit 1
+%define SYS_write 4
+
+ section .text
+
+ global _start
+_start:
+ ; gdb doesn't like to stop at the entry point address, so
+ ; we put a nop here for pure convenience
+ nop
+
+
+write_hello:
+ mov edx, hello_len
+ mov ecx, hello
+
+.loop:
+ mov eax, SYS_write
+ mov ebx, 1 ; stdout
+ int 80h
+
+ cmp eax, -4096
+ ja error
+
+ add ecx, eax
+ sub edx, eax
+ jnz .loop
+
+ok:
+ mov eax, SYS_exit
+ xor ebx, ebx
+ int 80h
+ hlt
+
+error:
+ mov eax, SYS_exit
+ mov ebx, 1 ; Error
+ int 80h
+ hlt
+
+ section .rodata
+hello: db "Hello, World!", 10
+hello_len equ $-hello
diff --git a/test/local.asm b/test/local.asm
new file mode 100644
index 00000000..8a42bb86
--- /dev/null
+++ b/test/local.asm
@@ -0,0 +1,19 @@
+;Testname=test; Arguments=-fbin -olocal.bin; Files=stdout stderr local.bin
+ bits 32
+
+%push bluttan
+
+%define %$localsize 0
+
+%stacksize flat
+%local l1:qword, l2:dword, l3:dword, l4:qword
+%arg a1:qword, a2:dword, a3:dword, a4:qword
+
+ mov eax,[a1]
+ mov ebx,[a2]
+ mov ecx,[a3]
+ mov edx,[a4]
+ mov [l1],eax
+ mov [l2],ebx
+ mov [l3],ecx
+ mov [l4],edx
diff --git a/test/loopoffs.asm b/test/loopoffs.asm
new file mode 100644
index 00000000..54ef4ac6
--- /dev/null
+++ b/test/loopoffs.asm
@@ -0,0 +1,12 @@
+;Testname=unoptimized; Arguments=-fbin -oloopoffs.bin -O0; Files=stdout stderr loopoffs.bin
+;Testname=optimized; Arguments=-fbin -oloopoffs.bin -Ox; Files=stdout stderr loopoffs.bin
+ bits 16
+delay: loop delay
+ loop $
+delay2: a32 loop delay2
+ a32 loop $
+delay3: loop delay3,ecx
+ loop $,ecx
+delay4: a32 loop delay4,ecx
+ a32 loop $,ecx
+ \ No newline at end of file
diff --git a/test/lwp.asm b/test/lwp.asm
new file mode 100644
index 00000000..f097b63b
--- /dev/null
+++ b/test/lwp.asm
@@ -0,0 +1,213 @@
+; LWP testcases from 2010/03/22 binutils change: no more 16-bit variants
+;------------------------------------------------------------------------
+
+%define testcase3(x) x
+%define testcase3(x,y) y,x
+%define testcase3(x,y,z) z,y,x
+
+%macro testcase 3.nolist ; uncomment one of the two, and compare the -f bin and -l output between them
+; db %1
+; %2 testcase3(%3)
+%endmacro
+
+bits 32
+
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc0 }, { llwpcb }, { eax }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc1 }, { llwpcb }, { ecx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc2 }, { llwpcb }, { edx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc3 }, { llwpcb }, { ebx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc4 }, { llwpcb }, { esp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc5 }, { llwpcb }, { ebp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc6 }, { llwpcb }, { esi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc7 }, { llwpcb }, { edi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcf }, { slwpcb }, { edi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xce }, { slwpcb }, { esi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcd }, { slwpcb }, { ebp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcc }, { slwpcb }, { esp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcb }, { slwpcb }, { ebx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xca }, { slwpcb }, { edx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc9 }, { slwpcb }, { ecx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc8 }, { slwpcb }, { eax }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0xc7, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,edi,eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0xc6, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,esi,ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0xc5, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ebp,edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0xc4, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,esp,ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0xc3, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ebx,esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0xc2, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,edx,ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0xc1, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ecx,esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0xc0, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,eax,edi }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0xcf, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,edi,eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0xce, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,esi,ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0xcd, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ebp,edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0xcc, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,esp,ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0xcb, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ebx,esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0xca, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,edx,ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0xc9, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ecx,esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0xc8, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,eax,edi }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0x07, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[edi],eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0x06, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[esi],ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0x45, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ebp],edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0x04, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[esp],ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0x03, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ebx],esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0x02, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[edx],ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0x01, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ecx],esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[eax],edi }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0x0f, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[edi],eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0x0e, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[esi],ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0x4d, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ebp],edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0x0c, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[esp],ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0x0b, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ebx],esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0x0a, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[edx],ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0x09, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ecx],esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0x08, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[eax],edi }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0x87, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+edi],eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0x86, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+esi],ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0x85, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ebp],edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0x84, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+esp],ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0x83, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ebx],esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0x82, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+edx],ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0x81, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ecx],esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0x80, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+eax],edi }
+testcase { 0x8f, 0xea, 0x78, 0x12, 0x8f, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+edi],eax }
+testcase { 0x8f, 0xea, 0x70, 0x12, 0x8e, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+esi],ecx }
+testcase { 0x8f, 0xea, 0x68, 0x12, 0x8d, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ebp],edx }
+testcase { 0x8f, 0xea, 0x60, 0x12, 0x8c, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+esp],ebx }
+testcase { 0x8f, 0xea, 0x58, 0x12, 0x8b, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ebx],esp }
+testcase { 0x8f, 0xea, 0x50, 0x12, 0x8a, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+edx],ebp }
+testcase { 0x8f, 0xea, 0x48, 0x12, 0x89, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ecx],esi }
+testcase { 0x8f, 0xea, 0x40, 0x12, 0x88, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+eax],edi }
+
+bits 64
+
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc0 }, { llwpcb }, { eax }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc1 }, { llwpcb }, { ecx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc2 }, { llwpcb }, { edx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc3 }, { llwpcb }, { ebx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc4 }, { llwpcb }, { esp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc5 }, { llwpcb }, { ebp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc6 }, { llwpcb }, { esi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc7 }, { llwpcb }, { edi }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc0 }, { llwpcb }, { r8d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc1 }, { llwpcb }, { r9d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc2 }, { llwpcb }, { r10d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc3 }, { llwpcb }, { r11d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc4 }, { llwpcb }, { r12d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc5 }, { llwpcb }, { r13d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc6 }, { llwpcb }, { r14d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc7 }, { llwpcb }, { r15d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xcf }, { slwpcb }, { r15d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xce }, { slwpcb }, { r14d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xcd }, { slwpcb }, { r13d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xcc }, { slwpcb }, { r12d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xcb }, { slwpcb }, { r11d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xca }, { slwpcb }, { r10d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc9 }, { slwpcb }, { r9d }
+testcase { 0x8f, 0xc9, 0x78, 0x12, 0xc8 }, { slwpcb }, { r8d }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcf }, { slwpcb }, { edi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xce }, { slwpcb }, { esi }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcd }, { slwpcb }, { ebp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcc }, { slwpcb }, { esp }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xcb }, { slwpcb }, { ebx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xca }, { slwpcb }, { edx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc9 }, { slwpcb }, { ecx }
+testcase { 0x8f, 0xe9, 0x78, 0x12, 0xc8 }, { slwpcb }, { eax }
+testcase { 0x8f, 0xca, 0x78, 0x12, 0xc7, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r15d,eax }
+testcase { 0x8f, 0xca, 0x70, 0x12, 0xc6, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r14d,ecx }
+testcase { 0x8f, 0xca, 0x68, 0x12, 0xc5, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r13d,edx }
+testcase { 0x8f, 0xca, 0x60, 0x12, 0xc4, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r12d,ebx }
+testcase { 0x8f, 0xca, 0x58, 0x12, 0xc3, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r11d,esp }
+testcase { 0x8f, 0xca, 0x50, 0x12, 0xc2, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r10d,ebp }
+testcase { 0x8f, 0xca, 0x48, 0x12, 0xc1, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r9d,esi }
+testcase { 0x8f, 0xca, 0x40, 0x12, 0xc0, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,r8d,edi }
+testcase { 0x8f, 0xea, 0x38, 0x12, 0xc7, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,edi,r8d }
+testcase { 0x8f, 0xea, 0x30, 0x12, 0xc6, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,esi,r9d }
+testcase { 0x8f, 0xea, 0x28, 0x12, 0xc5, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ebp,r10d }
+testcase { 0x8f, 0xea, 0x20, 0x12, 0xc4, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,esp,r11d }
+testcase { 0x8f, 0xea, 0x18, 0x12, 0xc3, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ebx,r12d }
+testcase { 0x8f, 0xea, 0x10, 0x12, 0xc2, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,edx,r13d }
+testcase { 0x8f, 0xea, 0x08, 0x12, 0xc1, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,ecx,r14d }
+testcase { 0x8f, 0xea, 0x00, 0x12, 0xc0, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,eax,r15d }
+testcase { 0x8f, 0xca, 0x78, 0x12, 0xcf, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r15d,eax }
+testcase { 0x8f, 0xca, 0x70, 0x12, 0xce, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r14d,ecx }
+testcase { 0x8f, 0xca, 0x68, 0x12, 0xcd, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r13d,edx }
+testcase { 0x8f, 0xca, 0x60, 0x12, 0xcc, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r12d,ebx }
+testcase { 0x8f, 0xca, 0x58, 0x12, 0xcb, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r11d,esp }
+testcase { 0x8f, 0xca, 0x50, 0x12, 0xca, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r10d,ebp }
+testcase { 0x8f, 0xca, 0x48, 0x12, 0xc9, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r9d,esi }
+testcase { 0x8f, 0xca, 0x40, 0x12, 0xc8, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,r8d,edi }
+testcase { 0x8f, 0xea, 0x38, 0x12, 0xcf, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,edi,r8d }
+testcase { 0x8f, 0xea, 0x30, 0x12, 0xce, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,esi,r9d }
+testcase { 0x8f, 0xea, 0x28, 0x12, 0xcd, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ebp,r10d }
+testcase { 0x8f, 0xea, 0x20, 0x12, 0xcc, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,esp,r11d }
+testcase { 0x8f, 0xea, 0x18, 0x12, 0xcb, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ebx,r12d }
+testcase { 0x8f, 0xea, 0x10, 0x12, 0xca, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,edx,r13d }
+testcase { 0x8f, 0xea, 0x08, 0x12, 0xc9, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,ecx,r14d }
+testcase { 0x8f, 0xea, 0x00, 0x12, 0xc8, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,eax,r15d }
+testcase { 0x67, 0x8f, 0xca, 0x78, 0x12, 0x07, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r15d],eax }
+testcase { 0x67, 0x8f, 0xca, 0x70, 0x12, 0x06, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r14d],ecx }
+testcase { 0x67, 0x8f, 0xca, 0x68, 0x12, 0x45, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r13d],edx }
+testcase { 0x67, 0x8f, 0xca, 0x60, 0x12, 0x04, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r12d],ebx }
+testcase { 0x67, 0x8f, 0xca, 0x58, 0x12, 0x03, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r11d],esp }
+testcase { 0x67, 0x8f, 0xca, 0x50, 0x12, 0x02, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r10d],ebp }
+testcase { 0x67, 0x8f, 0xca, 0x48, 0x12, 0x01, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r9d],esi }
+testcase { 0x67, 0x8f, 0xca, 0x40, 0x12, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[r8d],edi }
+testcase { 0x67, 0x8f, 0xea, 0x38, 0x12, 0x07, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[edi],r8d }
+testcase { 0x67, 0x8f, 0xea, 0x30, 0x12, 0x06, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[esi],r9d }
+testcase { 0x67, 0x8f, 0xea, 0x28, 0x12, 0x45, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ebp],r10d }
+testcase { 0x67, 0x8f, 0xea, 0x20, 0x12, 0x04, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[esp],r11d }
+testcase { 0x67, 0x8f, 0xea, 0x18, 0x12, 0x03, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ebx],r12d }
+testcase { 0x67, 0x8f, 0xea, 0x10, 0x12, 0x02, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[edx],r13d }
+testcase { 0x67, 0x8f, 0xea, 0x08, 0x12, 0x01, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[ecx],r14d }
+testcase { 0x67, 0x8f, 0xea, 0x00, 0x12, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[eax],r15d }
+testcase { 0x67, 0x8f, 0xca, 0x78, 0x12, 0x0f, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r15d],eax }
+testcase { 0x67, 0x8f, 0xca, 0x70, 0x12, 0x0e, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r14d],ecx }
+testcase { 0x67, 0x8f, 0xca, 0x68, 0x12, 0x4d, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r13d],edx }
+testcase { 0x67, 0x8f, 0xca, 0x60, 0x12, 0x0c, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r12d],ebx }
+testcase { 0x67, 0x8f, 0xca, 0x58, 0x12, 0x0b, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r11d],esp }
+testcase { 0x67, 0x8f, 0xca, 0x50, 0x12, 0x0a, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r10d],ebp }
+testcase { 0x67, 0x8f, 0xca, 0x48, 0x12, 0x09, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r9d],esi }
+testcase { 0x67, 0x8f, 0xca, 0x40, 0x12, 0x08, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[r8d],edi }
+testcase { 0x67, 0x8f, 0xea, 0x38, 0x12, 0x0f, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[edi],r8d }
+testcase { 0x67, 0x8f, 0xea, 0x30, 0x12, 0x0e, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[esi],r9d }
+testcase { 0x67, 0x8f, 0xea, 0x28, 0x12, 0x4d, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ebp],r10d }
+testcase { 0x67, 0x8f, 0xea, 0x20, 0x12, 0x0c, 0x24, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[esp],r11d }
+testcase { 0x67, 0x8f, 0xea, 0x18, 0x12, 0x0b, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ebx],r12d }
+testcase { 0x67, 0x8f, 0xea, 0x10, 0x12, 0x0a, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[edx],r13d }
+testcase { 0x67, 0x8f, 0xea, 0x08, 0x12, 0x09, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[ecx],r14d }
+testcase { 0x67, 0x8f, 0xea, 0x00, 0x12, 0x08, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[eax],r15d }
+testcase { 0x67, 0x8f, 0xca, 0x78, 0x12, 0x87, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r15d],eax }
+testcase { 0x67, 0x8f, 0xca, 0x70, 0x12, 0x86, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r14d],ecx }
+testcase { 0x67, 0x8f, 0xca, 0x68, 0x12, 0x85, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r13d],edx }
+testcase { 0x67, 0x8f, 0xca, 0x60, 0x12, 0x84, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r12d],ebx }
+testcase { 0x67, 0x8f, 0xca, 0x58, 0x12, 0x83, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r11d],esp }
+testcase { 0x67, 0x8f, 0xca, 0x50, 0x12, 0x82, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r10d],ebp }
+testcase { 0x67, 0x8f, 0xca, 0x48, 0x12, 0x81, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r9d],esi }
+testcase { 0x67, 0x8f, 0xca, 0x40, 0x12, 0x80, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+r8d],edi }
+testcase { 0x67, 0x8f, 0xea, 0x38, 0x12, 0x87, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+edi],r8d }
+testcase { 0x67, 0x8f, 0xea, 0x30, 0x12, 0x86, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+esi],r9d }
+testcase { 0x67, 0x8f, 0xea, 0x28, 0x12, 0x85, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ebp],r10d }
+testcase { 0x67, 0x8f, 0xea, 0x20, 0x12, 0x84, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+esp],r11d }
+testcase { 0x67, 0x8f, 0xea, 0x18, 0x12, 0x83, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ebx],r12d }
+testcase { 0x67, 0x8f, 0xea, 0x10, 0x12, 0x82, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+edx],r13d }
+testcase { 0x67, 0x8f, 0xea, 0x08, 0x12, 0x81, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+ecx],r14d }
+testcase { 0x67, 0x8f, 0xea, 0x00, 0x12, 0x80, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpins }, { 0x12345678,[0xcafe+eax],r15d }
+testcase { 0x67, 0x8f, 0xca, 0x78, 0x12, 0x8f, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r15d],eax }
+testcase { 0x67, 0x8f, 0xca, 0x70, 0x12, 0x8e, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r14d],ecx }
+testcase { 0x67, 0x8f, 0xca, 0x68, 0x12, 0x8d, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r13d],edx }
+testcase { 0x67, 0x8f, 0xca, 0x60, 0x12, 0x8c, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r12d],ebx }
+testcase { 0x67, 0x8f, 0xca, 0x58, 0x12, 0x8b, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r11d],esp }
+testcase { 0x67, 0x8f, 0xca, 0x50, 0x12, 0x8a, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r10d],ebp }
+testcase { 0x67, 0x8f, 0xca, 0x48, 0x12, 0x89, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r9d],esi }
+testcase { 0x67, 0x8f, 0xca, 0x40, 0x12, 0x88, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+r8d],edi }
+testcase { 0x67, 0x8f, 0xea, 0x38, 0x12, 0x8f, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+edi],r8d }
+testcase { 0x67, 0x8f, 0xea, 0x30, 0x12, 0x8e, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+esi],r9d }
+testcase { 0x67, 0x8f, 0xea, 0x28, 0x12, 0x8d, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ebp],r10d }
+testcase { 0x67, 0x8f, 0xea, 0x20, 0x12, 0x8c, 0x24, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+esp],r11d }
+testcase { 0x67, 0x8f, 0xea, 0x18, 0x12, 0x8b, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ebx],r12d }
+testcase { 0x67, 0x8f, 0xea, 0x10, 0x12, 0x8a, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+edx],r13d }
+testcase { 0x67, 0x8f, 0xea, 0x08, 0x12, 0x89, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+ecx],r14d }
+testcase { 0x67, 0x8f, 0xea, 0x00, 0x12, 0x88, 0xfe, 0xca, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12 }, { lwpval }, { 0x12345678,[0xcafe+eax],r15d }
+
+; EOF
+
+
diff --git a/test/macro-defaults.asm b/test/macro-defaults.asm
new file mode 100644
index 00000000..047f2053
--- /dev/null
+++ b/test/macro-defaults.asm
@@ -0,0 +1,64 @@
+;Testname=warning; Arguments=-fbin -omacdef.bin -w+macro-defaults; Files=stdout stderr macdef.bin
+;Testname=nonwarning; Arguments=-fbin -omacdef.bin -w-macro-defaults; Files=stdout stderr macdef.bin
+
+%MACRO mmac_fix 1 a
+ ; While defined to take one parameter, any invocation will
+ ; see two, due to the default parameter.
+ %warning %0 %1 %2 %3 %4 %5
+%ENDMACRO
+mmac_fix one
+
+%MACRO mmac_var 1-2 a,b
+ ; While defined to take one or two parameters, invocations
+ ; will see three, due to the default parameters.
+ %warning %0 %1 %2 %3 %4 %5
+%ENDMACRO
+mmac_var one
+mmac_var one,two
+
+%MACRO mmac_plus 1-2+ a,b
+ ; This does not warn. Although this looks like two default
+ ; parameters, it ends up being only one: the "+" limits it
+ ; to two parameters; if invoked without a second parameter
+ ; the second parameter will be "a,b".
+ %warning %0 %1 %2 %3 %4 %5
+ ;Check rotating behaviour
+%ENDMACRO
+mmac_plus one
+mmac_plus one,two
+mmac_plus one,two,three
+
+%MACRO mmac_star 1-* a,b
+ ; This does not warn. Because the "*" extends the range of
+ ; parameters to infinity, the "a,b" default parameters can
+ ; not exceed that range.
+ %warning %0 %1 %2 %3 %4 %5
+%ENDMACRO
+mmac_star one
+mmac_star one,two
+mmac_star one,two,three
+
+%MACRO mmac_rotate 0-* a,b
+ %warning %0 %1 %2 %3 %4 %5
+ ;%rotate should rotate all parameters
+ %rotate 1
+ %warning %0 %1 %2 %3 %4 %5
+%ENDMACRO
+mmac_rotate
+mmac_rotate one
+mmac_rotate one,two
+mmac_rotate one,two,three
+
+;Scope / evaluation time test
+%define I 0
+%assign J 0
+%xdefine K 0
+
+%MACRO mmac_scope 0 I J K
+ %warning %1 %2 %3
+%ENDMACRO
+
+%define I 1
+%assign J 1
+%xdefine K 1
+mmac_scope
diff --git a/test/macroerr.asm b/test/macroerr.asm
new file mode 100644
index 00000000..d1be751c
--- /dev/null
+++ b/test/macroerr.asm
@@ -0,0 +1,12 @@
+%include "macroerr.inc"
+
+%macro bluttan 1
+ mov eax,%1
+ blej %1
+%endmacro
+
+ bluttan ptr
+ blej ptr
+ dd ptr, ptr
+
+ptr:
diff --git a/test/macroerr.inc b/test/macroerr.inc
new file mode 100644
index 00000000..f40f7e60
--- /dev/null
+++ b/test/macroerr.inc
@@ -0,0 +1,3 @@
+%macro blej 1
+ mov eax,%1
+%endmacro
diff --git a/test/mmxsize.asm b/test/mmxsize.asm
new file mode 100644
index 00000000..0a478391
--- /dev/null
+++ b/test/mmxsize.asm
@@ -0,0 +1,38 @@
+;Testname=unoptimized; Arguments=-fbin -ommxsize.bin -O0; Files=stdout stderr mmxsize.bin
+;Testname=optimized; Arguments=-fbin -ommxsize.bin -Ox; Files=stdout stderr mmxsize.bin
+ bits 32
+ movd mm0,eax
+ movd mm0,[foo]
+ movq mm0,[foo]
+ movd mm0,dword [foo]
+ movq mm0,qword [foo]
+ movmskps eax,xmm1
+ movmskpd eax,xmm1
+ nop
+ movd xmm0,eax
+ movd xmm0,[foo]
+ movq xmm0,[foo]
+ movd xmm0,dword [foo]
+ movq xmm0,qword [foo]
+ nop
+
+ bits 64
+ movd mm0,eax
+ movq mm0,[foo]
+ movd mm0,dword [foo]
+ movq mm0,qword [foo]
+ movq mm0,rax
+ movmskps eax,xmm1
+ movmskpd eax,xmm1
+ nop
+ movd xmm0,eax
+ movq xmm0,[foo]
+ movd xmm0,dword [foo]
+ movq xmm0,qword [foo]
+ movq xmm0,rax
+ movmskps rax,xmm1
+ movmskpd rax,xmm1
+ nop
+
+ section .bss
+foo resq 1
diff --git a/test/movd.asm b/test/movd.asm
new file mode 100644
index 00000000..42df0af9
--- /dev/null
+++ b/test/movd.asm
@@ -0,0 +1,12 @@
+;Testname=optimized; Arguments=-Ox -fbin -omovd.bin; Files=stdout stderr movd.bin
+[BITS 32]
+ movd mm0,eax
+ movd mm0,[eax]
+ movd [eax],mm0
+ movd eax,mm0
+
+ movd xmm0,eax
+ movd xmm0,[eax]
+
+ movd [eax],xmm0
+ movd eax,xmm0
diff --git a/test/movd64.asm b/test/movd64.asm
new file mode 100644
index 00000000..b328c349
--- /dev/null
+++ b/test/movd64.asm
@@ -0,0 +1,15 @@
+ bits 64
+
+ movd r8d, mm1
+ movd r8, mm1
+ movq r8, mm1
+
+ movd [rax], mm1
+ movq [rax], mm1
+ movd dword [rax], mm1
+; movq dword [rax], mm1
+ movd qword [rax], mm1
+ movq qword [rax], mm1
+
+; movd mm2, mm1
+ movq mm2, mm1
diff --git a/test/movimm.asm b/test/movimm.asm
new file mode 100644
index 00000000..c34c1669
--- /dev/null
+++ b/test/movimm.asm
@@ -0,0 +1,28 @@
+;Testname=unoptimized; Arguments=-fbin -omovimm.bin -O0; Files=stdout stderr movimm.bin
+;Testname=optimized; Arguments=-fbin -omovimm.bin -Ox; Files=stdout stderr movimm.bin
+ bits 64
+
+ mov rax,1234567890abcdefh
+ mov eax,1234567890abcdefh
+ mov rax,dword 1234567890abcdefh
+ mov rax,qword 1234567890abcdefh
+ mov dword [rsi],1234567890abcdefh
+ mov qword [rsi],1234567890abcdefh
+ mov dword [rsi],dword 1234567890abcdefh
+ mov qword [rsi],dword 1234567890abcdefh
+; mov qword [rsi],qword 1234567890abcdefh ; Error
+; mov [rsi],qword 1234567890abcdefh ; Error
+ mov [rsi],dword 1234567890abcdefh
+
+ ; The optimizer probably should compact these forms, doesn't yet?
+ mov rax,12345678h
+ mov eax,12345678h
+ mov rax,dword 12345678h
+ mov rax,qword 12345678h
+ mov dword [rsi],12345678h
+ mov qword [rsi],12345678h
+ mov dword [rsi],dword 12345678h
+ mov qword [rsi],dword 12345678h
+; mov qword [rsi],qword 12345678h ; Error
+; mov [rsi],qword 12345678h ; Error
+ mov [rsi],dword 12345678h
diff --git a/test/movnti.asm b/test/movnti.asm
new file mode 100644
index 00000000..920f3279
--- /dev/null
+++ b/test/movnti.asm
@@ -0,0 +1,10 @@
+;Testname=test; Arguments=-fbin -omovnti.bin; Files=stdout stderr movnti.bin
+; BR 2028995
+
+ bits 16
+ movnti [si],eax
+ bits 32
+ movnti [esi],eax
+ bits 64
+ movnti [rsi],eax
+ movnti [rsi],rax
diff --git a/test/mpx-64.asm b/test/mpx-64.asm
new file mode 100644
index 00000000..d1776221
--- /dev/null
+++ b/test/mpx-64.asm
@@ -0,0 +1,120 @@
+;Testname=mpx-64; Arguments=-felf64 -ompx-64.o -O0; Files=stdout stderr mpx-64.o
+BITS 64
+
+ bndmk bnd1, [r11]
+ bndmk bnd1, [rax]
+ bndmk bnd1, [0x399]
+ bndmk bnd1, [r9+0x3]
+ bndmk bnd1, [rax+0x3]
+ bndmk bnd1, [3,1*r12]
+ bndmk bnd1, [rax+rcx]
+ bndmk bnd1, [r11+1*rax+0x3]
+ bndmk bnd1, [rbx+1*r9+0x3]
+
+ ; bndmov
+ bndmov bnd1, [r11]
+ bndmov bnd1, [rax]
+ bndmov bnd1, [0x399]
+ bndmov bnd2, [r9+0x3]
+ bndmov bnd2, [rax+0x3]
+ bndmov bnd0, [1*r12+0x3]
+ bndmov bnd2, [rax+rdx]
+ bndmov bnd1, [r11+1*rax+0x3]
+ bndmov bnd1, [rbx+1*r9+0x3]
+ bndmov bnd0, bnd2
+
+ bndmov [r11], bnd1
+ bndmov [rax], bnd1
+ bndmov [0x399], bnd1
+ bndmov [r9+0x3], bnd2
+ bndmov [rax+0x3], bnd2
+ bndmov [1*r12+0x3], bnd0
+ bndmov [rax+rdx], bnd2
+ bndmov [r11+1*rax+0x3], bnd1
+ bndmov [rbx+1*r9+0x3], bnd1
+ bndmov bnd2, bnd0
+
+ ; bndcl
+ bndcl bnd1, [r11]
+ bndcl bnd1, [rax]
+ bndcl bnd1, r11
+ bndcl bnd1, rcx
+ bndcl bnd1, [0x399]
+ bndcl bnd1, [r9+0x3]
+ bndcl bnd1, [rax+0x3]
+ bndcl bnd1, [1*r12+0x3]
+ bndcl bnd1, [rax+rcx]
+ bndcl bnd1, [r11+1*rax+0x3]
+ bndcl bnd1, [rbx+1*r9+0x3]
+
+ ; bndcu
+ bndcu bnd1, [r11]
+ bndcu bnd1, [rax]
+ bndcu bnd1, r11
+ bndcu bnd1, rcx
+ bndcu bnd1, [0x399]
+ bndcu bnd1, [r9+0x3]
+ bndcu bnd1, [rax+0x3]
+ bndcu bnd1, [1*r12+0x3]
+ bndcu bnd1, [rax+rcx]
+ bndcu bnd1, [r11+1*rax+0x3]
+ bndcu bnd1, [rbx+1*r9+0x3]
+
+ ; bndcn
+ bndcn bnd1, [r11]
+ bndcn bnd1, [rax]
+ bndcn bnd1, r11
+ bndcn bnd1, rcx
+ bndcn bnd1, [0x399]
+ bndcn bnd1, [r9+0x3]
+ bndcn bnd1, [rax+0x3]
+ bndcn bnd1, [1*r9+0x3]
+ bndcn bnd1, [rax+rcx]
+ bndcn bnd1, [r11+1*rax+0x3]
+ bndcn bnd1, [rbx+1*r9+0x3]
+
+ ; bndstx
+ ; next 5 lines should be parsed same
+ bndstx [rax+0x3,rbx], bnd0 ; NASM - split EA
+ bndstx [rax+rbx*1+0x3], bnd0 ; GAS
+ bndstx [rax+rbx+3], bnd0 ; GAS
+ bndstx [rax+0x3], bnd0, rbx ; ICC-1
+ bndstx [rax+0x3], rbx, bnd0 ; ICC-2
+
+ ; next 5 lines should be parsed same
+ bndstx [,rcx*1], bnd2 ; NASM
+ bndstx [0,rcx*1], bnd2 ; NASM
+ bndstx [0], bnd2, rcx ; ICC-1
+ bndstx [0], rcx, bnd2 ; ICC-2
+ bndstx [rcx*1], bnd2 ; GAS - rcx is encoded as index only when it is mib
+
+ ; next 3 lines should be parsed same
+ bndstx [3,1*r12], bnd2 ; NASM
+ bndstx [1*r12+3], bnd2 ; GAS
+ bndstx [3], r12, bnd2 ; ICC
+
+ bndstx [r12+0x399], bnd3
+ bndstx [r11+0x1234], bnd1
+ bndstx [rbx+0x1234], bnd2
+ bndstx [rdx], bnd1
+
+ ; bndldx
+ bndldx bnd0, [rax+rbx*1+0x3]
+ bndldx bnd2, [rbx+rdx+3]
+ bndldx bnd3, [r12+0x399]
+ bndldx bnd1, [r11+0x1234]
+ bndldx bnd2, [rbx+0x1234]
+ bndldx bnd2, [1*rbx+3]
+ bndldx bnd2, [1*r12+3]
+ bndldx bnd1, [rdx]
+
+ ; bnd
+ bnd ret
+ bnd call foo
+ bnd jmp foo ; when it becomes a Jb form - short jmp (eb),
+ ; bnd prefix is silently dropped
+ bnd jmp near 0 ; near jmp (opcode e9)
+; bnd jmp short 0 ; explicit short jmp (opcode eb) : error
+ bnd jno foo
+
+foo: bnd ret
diff --git a/test/mpx.asm b/test/mpx.asm
new file mode 100644
index 00000000..4e981568
--- /dev/null
+++ b/test/mpx.asm
@@ -0,0 +1,89 @@
+;Testname=mpx; Arguments=-felf -ompx.o -O0; Files=stdout stderr mpx.o
+BITS 32
+
+ bndmk bnd1, [eax]
+ bndmk bnd1, [0x399]
+ bndmk bnd1, [ecx+0x3]
+ bndmk bnd1, [eax+ecx]
+ bndmk bnd1, [ecx*1]
+ bndmk bnd1, [edx+1*eax+0x3]
+
+ ; bndmov
+ bndmov bnd1, [eax]
+ bndmov bnd1, [0x399]
+ bndmov bnd1, [ecx+0x3]
+ bndmov bnd1, [eax+ecx]
+ bndmov bnd1, [ecx*1]
+ bndmov bnd1, [edx+1*eax+0x3]
+ bndmov bnd0, bnd1
+
+ bndmov [eax], bnd1
+ bndmov [0x399], bnd1
+ bndmov [ecx+0x3], bnd1
+ bndmov [eax+ecx], bnd1
+ bndmov [ecx*1], bnd1
+ bndmov [edx+1*eax+0x3], bnd1
+ bndmov bnd1, bnd0
+
+ ; bndcl
+ bndcl bnd1, [eax]
+ bndcl bnd1, ecx
+ bndcl bnd1, [0x399]
+ bndcl bnd1, [ecx+0x3]
+ bndcl bnd1, [eax+ecx]
+ bndcl bnd1, [ecx*1]
+ bndcl bnd1, [edx+1*eax+0x3]
+
+ ; bndcu
+ bndcu bnd1, [eax]
+ bndcu bnd1, ecx
+ bndcu bnd1, [0x399]
+ bndcu bnd1, [ecx+0x3]
+ bndcu bnd1, [eax+ecx]
+ bndcu bnd1, [ecx*1]
+ bndcu bnd1, [edx+1*eax+0x3]
+
+ ; bndcn
+ bndcn bnd1, [eax]
+ bndcn bnd1, ecx
+ bndcn bnd1, [0x399]
+ bndcn bnd1, [ecx+0x3]
+ bndcn bnd1, [eax+ecx]
+ bndcn bnd1, [ecx*1]
+ bndcn bnd1, [edx+1*eax+0x3]
+
+ ; bndstx
+ bndstx [eax+ebx*1+0x3], bnd0
+ bndstx [eax+0x3,ebx], bnd0
+ bndstx [eax+0x3], bnd0, ebx
+ bndstx [eax+0x3], ebx, bnd0
+ bndstx [ecx*1], bnd2
+ bndstx [,ecx*1], bnd2
+ bndstx [0,ecx*1], bnd2
+ bndstx [0], bnd2, ecx
+ bndstx [0], ecx, bnd2
+ bndstx [edx+0x399], bnd3
+ bndstx [1*ebx+3], bnd2
+ bndstx [3,1*ebx], bnd2
+ bndstx [3], ebx, bnd2
+ bndstx [edx], bnd1
+
+ ; bndldx
+ bndldx bnd0, [eax+ebx*1+0x3]
+ bndldx bnd2, [ebx+edx+3]
+ bndldx bnd2, [ecx*1]
+ bndldx bnd3, [edx+0x399]
+ bndldx bnd2, [1*ebx+3]
+ bndldx bnd2, [3], ebx
+ bndldx bnd1, [edx]
+
+ ; bnd
+ bnd ret
+ bnd call foo
+ bnd jmp foo ; when it becomes a Jb form - short jmp (eb),
+ ; bnd prefix is silently dropped
+ bnd jmp near 0 ; near jmp (opcode e9)
+; bnd jmp short 0 ; explicit short jmp (opcode eb) : error
+ bnd jno foo
+
+foo: bnd ret
diff --git a/test/multisection.asm b/test/multisection.asm
new file mode 100644
index 00000000..34e7f7d8
--- /dev/null
+++ b/test/multisection.asm
@@ -0,0 +1,96 @@
+;Testname=aout; Arguments=-faout -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=aoutb; Arguments=-faoutb -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=as86; Arguments=-fas86 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=elf32; Arguments=-felf32 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=elf64; Arguments=-felf64 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=obj; Arguments=-fobj -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=rdf; Arguments=-frdf -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=win32; Arguments=-fwin32 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+;Testname=win64; Arguments=-fwin64 -olnxhello.o -Ox; Files=stdout stderr lnxhello.o
+
+; To test where code that is placed before any explicit SECTION
+; gets placed, and what happens if a .text section has an ORG
+;statement, uncomment the following lines.
+;
+; times 10h nop
+;
+;section .text
+;org 0x300
+; times 20h inc ax
+
+; let's see which of these sections can be placed in the specified order.
+
+section .appspecific
+section .data
+section .stringdata
+section .mytext
+section .code
+section .extra_code
+
+
+section .stringdata
+mystr1: db "Hello, this is string 1", 13, 10, '$'
+
+section .extra_code
+org 0x200
+bits 16
+more:
+ mov si, asciz1
+ mov ah, 0x0E
+ xor bx, bx
+.print:
+ lodsb
+ test al, al
+ jz .end
+ int 0x10
+ jmp short .print
+.end:
+
+ xor ax, ax
+ int 0x16
+
+ mov ax, 0x4c00
+ int 0x21
+
+section .appspecific
+asciz1: db "This is string 2", 0
+
+section .code
+org 0x100
+bits 16
+
+start:
+ mov dx, mystr1
+ mov ah, 9
+ int 0x21
+
+ xor ax, ax
+ int 0x16
+
+ jmp more
+
+section .text
+ xor eax,eax
+ times 50h nop
+
+section .mytext
+
+ xor ebx,ebx
+
+section .data
+ db 95h,95h,95h,95h,95h,95h,95h,95h
+
+section .hmm
+ resd 2
+
+section .bss
+ resd 8
+
+section .final1
+ inc ax
+
+section .final2
+ inc bx
+
+section .final3
+ inc cx
diff --git a/test/nasmformat.asm b/test/nasmformat.asm
new file mode 100644
index 00000000..ea19b923
--- /dev/null
+++ b/test/nasmformat.asm
@@ -0,0 +1,17 @@
+;Testname=obj; Arguments=-fobj -onasmfomat.o; Files=stdout stderr nasmfomat.o
+;Testname=bin; Arguments=-fbin -onasmfomat.o; Files=stdout stderr nasmfomat.o
+;Testname=rdf; Arguments=-frdf -onasmfomat.o; Files=stdout stderr nasmfomat.o
+
+%if __OUTPUT_FORMAT__ == 'bin'
+
+db 'This is binary format file'
+
+%elif __OUTPUT_FORMAT__ == 'obj'
+
+db 'This is object format file'
+
+%else
+
+db 'This is some other format file'
+
+%endif
diff --git a/test/new b/test/new
new file mode 100755
index 00000000..403b4fb7
--- /dev/null
+++ b/test/new
@@ -0,0 +1,9 @@
+#!/bin/sh
+for f; do
+ if [ -e "$f".asm ]; then
+ # For safety...
+ echo "$0: $f already exists" 1>&2
+ exit 1
+ fi
+ echo ";Testname=test; Arguments=-fbin -o$f.bin; Files=stdout stderr $f.bin" > "$f".asm
+done
diff --git a/test/newrdwr.asm b/test/newrdwr.asm
new file mode 100644
index 00000000..dcfc1942
--- /dev/null
+++ b/test/newrdwr.asm
@@ -0,0 +1,24 @@
+;Testname=test; Arguments=-fbin -onewrdwr.bin; Files=stdout stderr newrdwr.bin
+
+ bits 64
+
+ rdfsbase eax
+ rdfsbase rax
+ rdgsbase eax
+ rdgsbase rax
+ rdrand ax
+ rdrand eax
+ rdrand rax
+ wrfsbase eax
+ wrfsbase rax
+ wrgsbase eax
+ wrgsbase rax
+
+ osp rdfsbase eax
+ osp rdfsbase rax
+ osp rdgsbase eax
+ osp rdgsbase rax
+ osp wrfsbase eax
+ osp wrfsbase rax
+ osp wrgsbase eax
+ osp wrgsbase rax
diff --git a/test/nop.asm b/test/nop.asm
new file mode 100644
index 00000000..71b7f7b2
--- /dev/null
+++ b/test/nop.asm
@@ -0,0 +1,17 @@
+;Testname=unoptimized; Arguments=-fbin -onop.bin; Files=stdout stderr nop.bin
+;Testname=optimized; Arguments=-fbin -onop.bin -Ox; Files=stdout stderr nop.bin
+
+ bits 64
+
+ nop
+ o64 nop
+ pause
+ o64 pause
+
+ xchg ax,ax
+ xchg eax,eax
+ xchg rax,rax
+
+ rep xchg ax,ax
+ rep xchg eax,eax
+ rep xchg rax,rax
diff --git a/test/nullfile.asm b/test/nullfile.asm
new file mode 100644
index 00000000..83e306e0
--- /dev/null
+++ b/test/nullfile.asm
@@ -0,0 +1,4 @@
+;Testname=test; Arguments=-fbin -onull.bin; Files=stdout stderr null.bin
+;
+; A file that produces no output has been known to occationally crash NASM.
+;
diff --git a/test/objexe.asm b/test/objexe.asm
new file mode 100644
index 00000000..9959f40f
--- /dev/null
+++ b/test/objexe.asm
@@ -0,0 +1,30 @@
+; Demonstration of how to write an entire .EXE format program as a .OBJ
+; file to be linked. Tested with the VAL free linker.
+; To build:
+; nasm -fobj objexe.asm
+; val objexe.obj,objexe.exe;
+; To test:
+; objexe
+; (should print `hello, world')
+
+ segment code
+
+..start: mov ax,data
+ mov ds,ax
+ mov ax,stack
+ mov ss,ax
+ mov sp,stacktop
+
+ mov dx,hello
+ mov ah,9
+ int 0x21
+
+ mov ax,0x4c00
+ int 0x21
+
+ segment data
+hello: db 'hello, world', 13, 10, '$'
+
+ segment stack stack
+ resb 64
+stacktop:
diff --git a/test/objlink.c b/test/objlink.c
new file mode 100644
index 00000000..b767b012
--- /dev/null
+++ b/test/objlink.c
@@ -0,0 +1,33 @@
+/*
+ * test source file for assembling to Microsoft 16-bit .OBJ
+ * build with (16-bit Microsoft C):
+ * nasm -f obj objtest.asm
+ * cl /AL objtest.obj objlink.c
+ * other compilers should work too, provided they handle large
+ * model in the same way as MS C
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+
+int8_t text[] = "hello, world\n";
+
+extern void function(int8_t *);
+extern int bsssym, commvar;
+extern void *selfptr;
+extern void *selfptr2;
+
+int main(void)
+{
+ printf("these should be identical: %p, %p\n",
+ (int32_t)selfptr, (int32_t)&selfptr);
+ printf("these should be equivalent but different: %p, %p\n",
+ (int32_t)selfptr2, (int32_t)&selfptr2);
+ printf("you should see \"hello, world\" twice:\n");
+ bsssym = 0xF00D;
+ commvar = 0xD00F;
+ function(text);
+ printf("this should be 0xF00E: 0x%X\n", bsssym);
+ printf("this should be 0xD00E: 0x%X\n", commvar);
+ return 0;
+}
diff --git a/test/objtest.asm b/test/objtest.asm
new file mode 100644
index 00000000..c68f7cbb
--- /dev/null
+++ b/test/objtest.asm
@@ -0,0 +1,87 @@
+;Testname=unoptimized; Arguments=-O0 -fobj -oobj.o; Files=stdout stderr obj.o
+;Testname=optimized; Arguments=-Ox -fobj -oobj.o; Files=stdout stderr obj.o
+
+; test source file for assembling to Microsoft 16-bit .OBJ
+; build with (16-bit Microsoft C):
+; nasm -f obj objtest.asm
+; cl /AL objtest.obj objlink.c
+; other compilers should work too, provided they handle large
+; model in the same way as MS C
+
+; This file should test the following:
+; [1] Define and export a global symbol
+; [2] Define a non-global symbol
+; [3] Define a common symbol
+; [4] Define a NASM local label
+; [5] Reference a NASM local label
+; [6] Import an external symbol
+; [7] Make a PC-relative relocated reference
+; [8] Reference a symbol in the same section as itself
+; [9] Reference a symbol in a different segment from itself
+; [10] Define a segment group
+; [11] Take the offset of a symbol in a grouped segment w.r.t. its segment
+; [12] Reserve uninitialised data space in a segment
+; [13] Directly take the segment address of a segment
+; [14] Directly take the segment address of a group
+; [15] Use SEG on a non-external
+; [16] Use SEG on an external
+
+ bits 16
+
+ global _bsssym ; [1]
+ global _function ; [1]
+ global _selfptr ; [1]
+ global _selfptr2 ; [1]
+ common _commvar 2 ; [3]
+ extern _printf ; [6]
+
+ group mygroup mybss mydata
+ group mygroup2 mycode mycode2
+
+ segment mycode private
+
+_function push bp
+ mov bp,sp
+ push ds
+ mov ax,mygroup ; [14]
+ mov ds,ax
+ inc word [_bsssym] ; [9]
+ mov ax,seg _commvar
+ mov ds,ax
+ dec word [_commvar]
+ pop ds
+ mov ax,[bp+6]
+ mov dx,[bp+8]
+ push dx
+ push ax
+ push dx
+ push ax
+ call far [cs:.printf] ; [5] [8]
+ pop ax
+ pop ax
+ call trampoline ; [7]
+ pop ax
+ pop ax
+ mov sp,bp
+ pop bp
+ retf
+
+.printf dw _printf, seg _printf ; [2] [4] [16]
+.printfd dd _printf, seg _printf ; [2] [4] [16]
+.printfq dq _printf, seg _printf ; [2] [4] [16]
+
+ segment mycode2 private
+
+trampoline: pop ax
+ push cs
+ push ax
+ jmp far _printf
+
+ segment mybss private
+
+_bsssym resw 64 ; [12]
+
+ segment mydata private
+
+_selfptr dw _selfptr, seg _selfptr ; [8] [15]
+_selfptr2 dw _selfptr2 wrt mydata, mydata ; [11] [13]
diff --git a/test/optimization.asm b/test/optimization.asm
new file mode 100644
index 00000000..d78209d9
--- /dev/null
+++ b/test/optimization.asm
@@ -0,0 +1,104 @@
+;Testname=O0; Arguments=-O0 -fbin -ooptimization.bin; Files=stdout stderr optimization.bin
+;Testname=O1; Arguments=-O1 -fbin -ooptimization.bin; Files=stdout stderr optimization.bin
+;Testname=Ox; Arguments=-Ox -fbin -ooptimization.bin; Files=stdout stderr optimization.bin
+
+BITS 32
+
+; Simple
+jmp foo
+times 124 nop
+foo:
+
+; Must start short to converge optimally
+jmp car
+times 127 nop
+car:
+
+; Always near
+jmp cdr
+times 128 nop
+cdr:
+
+
+; Simple
+add eax, quux2 - quux1
+quux1:
+times 127 nop
+quux2:
+
+; Must start short
+corge1:
+add eax, corge2 - corge1
+times 127 - 3 nop
+corge2:
+
+
+; Simple
+lea eax, [bolug2-bolug1]
+bolug1:
+times 127 nop
+bolug2:
+
+; Must start short
+calog1:
+lea eax, [calog2-calog1]
+times 127 - 3 nop
+calog2:
+
+
+; Simple
+lea eax, [eax+dolug2-dolug1]
+dolug1:
+times 127 nop
+dolug2:
+
+; Must start short
+ealog1:
+lea eax, [eax+ealog2-ealog1]
+times 127 - 3 nop
+ealog2:
+
+; Must stay long!
+lea eax, [eax+folug2-folug1]
+folug1:
+times 128 nop
+folug2:
+
+; Must stay long!
+galog1:
+lea eax, [eax+galog2-galog1]
+times 128 - 3 nop
+galog2:
+
+; Sbyte tests...
+onetwentysix equ 126
+onetwentynine equ 129
+
+add eax,onetwentyseven ; sbyte (forward)
+add eax,onetwentyeight ; not sbyte (forward)
+add eax,onetwentyseven ; sbyte (forward)
+add eax,onetwentysix ; sbyte (backward)
+add eax,onetwentynine ; not sbyte (backward)
+add ecx,onetwentyseven ; sbyte (forward)
+add ecx,onetwentyeight ; not sbyte (forward)
+add ecx,onetwentyseven ; sbyte (forward)
+add ecx,onetwentysix ; sbyte (backward)
+add ecx,onetwentynine ; not sbyte (backward)
+
+onetwentyseven equ 127
+onetwentyeight equ 128
+
+; Simple
+add eax, holug2-holug1
+holug1:
+times 127 nop
+holug2:
+
+; Must start short
+ialog1:
+add eax, ialog2-ialog1
+times 127 - 3 nop
+ialog2:
+
+; Do not confuse forward references and segmentless addresses!
+jmp 12345
diff --git a/test/org.asm b/test/org.asm
new file mode 100644
index 00000000..792c39a5
--- /dev/null
+++ b/test/org.asm
@@ -0,0 +1,18 @@
+;Testname=elf64; Arguments=-Ox -felf64 -oorg.o; Files=stdout stderr org.o
+;Testname=win64; Arguments=-Ox -fwin64 -oorg.o; Files=stdout stderr org.o
+
+;
+; Simple test of a 64-bit org directive
+;
+ bits 64
+ org 0xffffffffffff0000
+
+hello: jmp there
+ nop
+ nop
+there:
+ add rax,[rsp+rbx]
+ inc eax
+
+ section .data
+there_ptr dq there
diff --git a/test/paste.asm b/test/paste.asm
new file mode 100644
index 00000000..0bc48384
--- /dev/null
+++ b/test/paste.asm
@@ -0,0 +1,12 @@
+%macro bug 1-*
+ %push foo
+ %define %$v %1
+ %define vv %$v_ %+ %1
+ %%top_{%$v}%1:
+ mov eax, eax
+ mov eax, %%top_{%$v}%1
+ mov eax, vv
+ %pop
+%endmacro
+
+bug a
diff --git a/test/pcrel.asm b/test/pcrel.asm
new file mode 100644
index 00000000..53e0aa41
--- /dev/null
+++ b/test/pcrel.asm
@@ -0,0 +1,52 @@
+ bits 32
+foo: ; Backwards reference
+ mov eax,[foo - $]
+ mov ebx,[ebx + foo - $]
+ mov ecx,foo - $
+ mov edx,foo - bar
+
+ mov eax,[bar - $]
+ mov ebx,[ebx + bar - $]
+ mov ecx,bar - $
+ mov edx,bar - foo
+
+ mov eax,[baz - $]
+ mov ebx,[ebx + baz - $]
+ mov esi,[baz - bar]
+ mov ecx,baz - $
+ mov edx,baz - bar
+
+ bits 64
+ default rel
+
+ times 16 nop
+
+ mov eax,[foo]
+ mov eax,[foo - $]
+ mov eax,[abs foo - $]
+ mov ebx,[rbx + foo - $]
+ mov ecx,foo - $
+ mov edx,foo - bar
+
+ mov eax,[bar]
+ mov eax,[bar - $]
+ mov eax,[abs bar - $]
+ mov ebx,[rbx + bar - $]
+ mov ecx,bar - $
+ mov edx,bar - foo
+
+ mov eax,[baz]
+ mov eax,[baz - $]
+ mov eax,[abs baz - $]
+ mov ebx,[rbx + baz - $]
+ mov esi,[baz - bar]
+ mov esi,[abs baz - bar]
+ mov ecx,baz - $
+ mov edx,baz - bar
+
+bar: ; Forwards reference
+ hlt
+
+ section ".data"
+baz: ; Other-segment reference
+ dd 0
diff --git a/test/perf/label.pl b/test/perf/label.pl
new file mode 100755
index 00000000..9b59768f
--- /dev/null
+++ b/test/perf/label.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+#
+# Generate a test case for label lookup performance
+#
+
+($len) = @ARGV;
+$len = 100000 unless ($len);
+
+print "\tbits 32\n";
+print "\tsection .data\n";
+print "\n";
+
+for ($i = 0; $i < $len; $i++) {
+ print "l$i:\n";
+ for ($j = 0; $j < 8; $j++) {
+ print "\tdd l", int(rand($i+1)), "\n";
+ }
+}
diff --git a/test/perf/macro.pl b/test/perf/macro.pl
new file mode 100755
index 00000000..b7298054
--- /dev/null
+++ b/test/perf/macro.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+#
+# Generate a test case for macro lookup performance
+#
+
+($len) = @ARGV;
+$len = 100000 unless ($len);
+
+print "\tbits 32\n";
+print "\tsection .data\n";
+print "\n";
+
+for ($i = 0; $i < $len; $i++) {
+ print "%define m$i $i\n";
+ for ($j = 0; $j < 8; $j++) {
+ print "\tdd m", int(rand($i+1)), "\n";
+ }
+}
diff --git a/test/perf/token.pl b/test/perf/token.pl
new file mode 100755
index 00000000..4a9e3aec
--- /dev/null
+++ b/test/perf/token.pl
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+#
+# Generate a test case for token lookup performance
+#
+
+@insns = qw(add sub adc sbb and or xor mov);
+@regs = qw(eax ebx ecx edx esp ebp esi edi);
+
+srand(0);
+sub pickone(@) {
+ return $_[int(rand(scalar @_))];
+}
+
+($len) = @ARGV;
+$len = 1000000 unless ($len);
+
+print "\tbits 32\n";
+print "\n";
+
+for ($i = 0; $i < $len; $i++) {
+ print "\t", pickone(@insns), " ",
+ pickone(@regs), ",", pickone(@regs), "\n";
+}
diff --git a/test/performtest.pl b/test/performtest.pl
new file mode 100755
index 00000000..f7865b39
--- /dev/null
+++ b/test/performtest.pl
@@ -0,0 +1,192 @@
+#!/usr/bin/perl
+#Perform tests on nasm
+
+use strict;
+use warnings;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Usage qw(pod2usage);
+
+use File::Basename qw(fileparse);
+use File::Compare qw(compare compare_text);
+use File::Copy qw(move);
+use File::Path qw(mkpath rmtree);
+
+#sub debugprint { print (pop() . "\n"); }
+ sub debugprint { }
+
+my $globalresult = 0;
+
+#Process one testfile
+sub perform {
+ my ($clean, $diff, $golden, $nasm, $quiet, $testpath) = @_;
+ my ($stdoutfile, $stderrfile) = ("stdout", "stderr");
+
+ my ($testname, $ignoredpath, $ignoredsuffix) = fileparse($testpath, ".asm");
+ debugprint $testname;
+
+ my $outputdir = $golden ? "golden" : "testresults";
+
+ mkdir "$outputdir" unless -d "$outputdir";
+
+ if ($clean) {
+ rmtree "$outputdir/$testname";
+ return;
+ }
+
+ if(-d "$outputdir/$testname") {
+ rmtree "$outputdir/$testname";
+ }
+
+ open(TESTFILE, '<', $testpath) or (warn "Can't open $testpath\n", return);
+ TEST:
+ while(<TESTFILE>) {
+ #See if there is a test case
+ last unless /Testname=(.*);\s*Arguments=(.*);\s*Files=(.*)/;
+ my ($subname, $arguments, $files) = ($1, $2, $3);
+ debugprint("$subname | $arguments | $files");
+
+ #Call nasm with this test case
+ system("$nasm $arguments $testpath > $stdoutfile 2> $stderrfile");
+ debugprint("$nasm $arguments $testpath > $stdoutfile 2> $stderrfile ----> $?");
+
+ #Move the output to the test dir
+ mkpath("$outputdir/$testname/$subname");
+ foreach(split / /,$files) {
+ if (-f $_) {
+ move($_, "$outputdir/$testname/$subname/$_") or die $!
+ }
+ }
+ unlink ("$stdoutfile", "$stderrfile"); #Just to be sure
+
+ if($golden) {
+ print "Test $testname/$subname created.\n" unless $quiet;
+ } else {
+ #Compare them with the golden files
+ my $result = 0;
+ my @failedfiles = ();
+ foreach(split / /, $files) {
+ if(-f "$outputdir/$testname/$subname/$_") {
+ my $temp;
+ if($_ eq $stdoutfile or $_ eq $stderrfile) {
+ #Compare stdout and stderr in text mode so line ending changes won't matter
+ $temp = compare_text("$outputdir/$testname/$subname/$_", "golden/$testname/$subname/$_",
+ sub { my ($a, $b) = @_;
+ $a =~ s/\r//g;
+ $b =~ s/\r//g;
+ $a ne $b; } );
+ } else {
+ $temp = compare("$outputdir/$testname/$subname/$_", "golden/$testname/$subname/$_");
+ }
+
+ if($temp == 1) {
+ #different
+ $result = 1;
+ $globalresult = 1;
+ push @failedfiles, $_;
+ } elsif($temp == -1) {
+ #error
+ print "Can't compare at $testname/$subname file $_\n";
+ next TEST;
+ }
+ } elsif (-f "golden/$testname/$subname/$_") {
+ #File exists in golden but not in output
+ $result = 1;
+ $globalresult = 1;
+ push @failedfiles, $_;
+ }
+ }
+
+ if($result == 0) {
+ print "Test $testname/$subname succeeded.\n" unless $quiet;
+ } elsif ($result == 1) {
+ print "Test $testname/$subname failed on @failedfiles.\n";
+ if($diff) {
+ for(@failedfiles) {
+ if($_ eq $stdoutfile or $_ eq $stderrfile) {
+ system "diff -u golden/$testname/$subname/$_ $outputdir/$testname/$subname/$_";
+ print "\n";
+ }
+ }
+ }
+ } else {
+ die "Impossible result";
+ }
+ }
+ }
+ close(TESTFILE);
+}
+
+my $nasm;
+my $clean = 0;
+my $diff = 0;
+my $golden = 0;
+my $help = 0;
+my $verbose = 0;
+
+GetOptions('clean' => \$clean,
+ 'diff'=> \$diff,
+ 'golden' => \$golden,
+ 'help' => \$help,
+ 'verbose' => \$verbose,
+ 'nasm=s' => \$nasm
+ ) or pod2usage();
+
+pod2usage() if $help;
+die "Please specify either --nasm or --clean. Use --help for help.\n"
+unless $nasm or $clean;
+die "Please specify the test files, e.g. *.asm\n" unless @ARGV;
+
+unless (!defined $nasm or -x $nasm) {
+ warn "Warning: $nasm may not be executable. Expect problems.\n\n";
+ sleep 5;
+}
+
+perform($clean, $diff, $golden, $nasm, ! $verbose, $_) foreach @ARGV;
+exit $globalresult;
+
+__END__
+
+=head1 NAME
+
+performtest.pl - NASM regression tester based on golden files
+
+=head1 SYNOPSIS
+
+performtest.pl [options] [testfile.asm ...]
+
+Runs NASM on the specified test files and compare the results
+with "golden" output files.
+
+ Options:
+ --clean Clean up test results (or golden files with --golden)
+ --diff Execute diff when stdout or stderr don't match
+ --golden Create golden files
+ --help Get this help
+ --nasm=file Specify the file name for the NASM executable, e.g. ../nasm
+ --verbose Get more output
+
+ If --clean is not specified, --nasm is required.
+
+ testfile.asm ...:
+ One or more files that NASM should be tested with,
+ often *.asm in the test directory.
+ It should contain one or more option lines at the start,
+ in the following format:
+
+;Testname=<testname>; Arguments=<arguments to nasm>; Files=<output files>
+
+ If no such lines are found at the start, the file is skipped.
+ testname should ideally describe the arguments, eg. unoptimized for -O0.
+ arguments can be an optimization level (-O), an output format (-f),
+ an output file specifier (-o) etc.
+ The output files should be a space seperated list of files that will
+ be checked for regressions. This should often be the output file
+ and the special files stdout and stderr.
+
+Any mismatch could be a regression,
+but it doesn't have to be. COFF files have a timestamp which
+makes this method useless. ELF files have a comment section
+with the current version of NASM, so they will change each version number.
+
+=cut
diff --git a/test/pextrw.asm b/test/pextrw.asm
new file mode 100644
index 00000000..41c50b7a
--- /dev/null
+++ b/test/pextrw.asm
@@ -0,0 +1,3 @@
+ bits 64
+
+ pextrw rax,xmm0,0
diff --git a/test/pinsr16.asm b/test/pinsr16.asm
new file mode 100644
index 00000000..0159839a
--- /dev/null
+++ b/test/pinsr16.asm
@@ -0,0 +1,53 @@
+;Testname=test; Arguments=-O0 -fbin -opinsr16.bin; Files=stdout stderr pinsr16.bin
+ bits 16
+
+ pinsrw mm0,eax,0
+ pinsrw mm1,si,0
+ pinsrw mm2,[bx],0
+ pinsrw mm3,word [bx],0
+
+ pinsrb xmm0,eax,0
+ pinsrb xmm1,sil,0
+; pinsrb xmm1,bh,0
+ pinsrb xmm2,[bx],0
+ pinsrb xmm3,byte [bx],0
+
+ pinsrw xmm0,eax,0
+ pinsrw xmm1,si,0
+ pinsrw xmm2,[bx],0
+ pinsrw xmm3,word [bx],0
+
+ pinsrd xmm0,eax,0
+ pinsrd xmm1,esi,0
+ pinsrd xmm2,[bx],0
+ pinsrd xmm3,dword [bx],0
+
+ vpinsrb xmm0,eax,0
+ vpinsrb xmm1,bl,0
+ vpinsrb xmm2,[bx],0
+ vpinsrb xmm3,byte [bx],0
+
+ vpinsrw xmm0,eax,0
+ vpinsrw xmm1,si,0
+ vpinsrw xmm2,[bx],0
+ vpinsrw xmm3,word [bx],0
+
+ vpinsrd xmm0,eax,0
+ vpinsrd xmm1,esi,0
+ vpinsrd xmm2,[bx],0
+ vpinsrd xmm3,dword [bx],0
+
+ vpinsrb xmm4,xmm0,eax,0
+ vpinsrb xmm5,xmm1,bl,0
+ vpinsrb xmm6,xmm2,[bx],0
+ vpinsrb xmm7,xmm3,byte [bx],0
+
+ vpinsrw xmm4,xmm0,eax,0
+ vpinsrw xmm5,xmm1,si,0
+ vpinsrw xmm6,xmm2,[bx],0
+ vpinsrw xmm7,xmm3,word [bx],0
+
+ vpinsrd xmm4,xmm0,eax,0
+ vpinsrd xmm5,xmm1,esi,0
+ vpinsrd xmm6,xmm2,[bx],0
+ vpinsrd xmm7,xmm3,dword [bx],0
diff --git a/test/pinsr32.asm b/test/pinsr32.asm
new file mode 100644
index 00000000..24b3e585
--- /dev/null
+++ b/test/pinsr32.asm
@@ -0,0 +1,53 @@
+;Testname=test; Arguments=-O0 -fbin -opinsr32.bin; Files=stdout stderr pinsr32.bin
+ bits 32
+
+ pinsrw mm0,eax,0
+ pinsrw mm1,si,0
+ pinsrw mm2,[ecx],0
+ pinsrw mm3,word [ecx],0
+
+ pinsrb xmm0,eax,0
+ pinsrb xmm1,sil,0
+; pinsrb xmm1,bh,0
+ pinsrb xmm2,[ecx],0
+ pinsrb xmm3,byte [ecx],0
+
+ pinsrw xmm0,eax,0
+ pinsrw xmm1,si,0
+ pinsrw xmm2,[ecx],0
+ pinsrw xmm3,word [ecx],0
+
+ pinsrd xmm0,eax,0
+ pinsrd xmm1,esi,0
+ pinsrd xmm2,[ecx],0
+ pinsrd xmm3,dword [ecx],0
+
+ vpinsrb xmm0,eax,0
+ vpinsrb xmm1,bl,0
+ vpinsrb xmm2,[ecx],0
+ vpinsrb xmm3,byte [ecx],0
+
+ vpinsrw xmm0,eax,0
+ vpinsrw xmm1,si,0
+ vpinsrw xmm2,[ecx],0
+ vpinsrw xmm3,word [ecx],0
+
+ vpinsrd xmm0,eax,0
+ vpinsrd xmm1,esi,0
+ vpinsrd xmm2,[ecx],0
+ vpinsrd xmm3,dword [ecx],0
+
+ vpinsrb xmm4,xmm0,eax,0
+ vpinsrb xmm5,xmm1,bl,0
+ vpinsrb xmm6,xmm2,[ecx],0
+ vpinsrb xmm7,xmm3,byte [ecx],0
+
+ vpinsrw xmm4,xmm0,eax,0
+ vpinsrw xmm5,xmm1,si,0
+ vpinsrw xmm6,xmm2,[ecx],0
+ vpinsrw xmm7,xmm3,word [ecx],0
+
+ vpinsrd xmm4,xmm0,eax,0
+ vpinsrd xmm5,xmm1,esi,0
+ vpinsrd xmm6,xmm2,[ecx],0
+ vpinsrd xmm7,xmm3,dword [ecx],0
diff --git a/test/pinsr64.asm b/test/pinsr64.asm
new file mode 100644
index 00000000..8eedfddc
--- /dev/null
+++ b/test/pinsr64.asm
@@ -0,0 +1,68 @@
+;Testname=test; Arguments=-O0 -fbin -opinsr64.bin; Files=stdout stderr pinsr64.bin
+ bits 64
+
+ pinsrw mm0,eax,0
+ pinsrw mm1,si,0
+ pinsrw mm2,[rcx],0
+ pinsrw mm3,word [rcx],0
+
+ pinsrb xmm0,eax,0
+ pinsrb xmm1,sil,0
+; pinsrb xmm1,bh,0
+ pinsrb xmm2,[rcx],0
+ pinsrb xmm3,byte [rcx],0
+
+ pinsrw xmm0,eax,0
+ pinsrw xmm1,si,0
+ pinsrw xmm2,[rcx],0
+ pinsrw xmm3,word [rcx],0
+
+ pinsrd xmm0,eax,0
+ pinsrd xmm1,esi,0
+ pinsrd xmm2,[rcx],0
+ pinsrd xmm3,dword [rcx],0
+
+ pinsrq xmm0,rax,0
+ pinsrq xmm1,rsi,0
+ pinsrq xmm2,[rcx],0
+ pinsrq xmm3,qword [rcx],0
+
+ vpinsrb xmm0,eax,0
+ vpinsrb xmm1,sil,0
+ vpinsrb xmm2,[rcx],0
+ vpinsrb xmm3,byte [rcx],0
+
+ vpinsrw xmm0,eax,0
+ vpinsrw xmm1,si,0
+ vpinsrw xmm2,[rcx],0
+ vpinsrw xmm3,word [rcx],0
+
+ vpinsrd xmm0,eax,0
+ vpinsrd xmm1,esi,0
+ vpinsrd xmm2,[rcx],0
+ vpinsrd xmm3,dword [rcx],0
+
+ vpinsrq xmm0,rax,0
+ vpinsrq xmm1,rsi,0
+ vpinsrq xmm2,[rcx],0
+ vpinsrq xmm3,qword [rcx],0
+
+ vpinsrb xmm4,xmm0,eax,0
+ vpinsrb xmm5,xmm1,sil,0
+ vpinsrb xmm6,xmm2,[rcx],0
+ vpinsrb xmm7,xmm3,byte [rcx],0
+
+ vpinsrw xmm4,xmm0,eax,0
+ vpinsrw xmm5,xmm1,si,0
+ vpinsrw xmm6,xmm2,[rcx],0
+ vpinsrw xmm7,xmm3,word [rcx],0
+
+ vpinsrd xmm4,xmm0,eax,0
+ vpinsrd xmm5,xmm1,esi,0
+ vpinsrd xmm6,xmm2,[rcx],0
+ vpinsrd xmm7,xmm3,dword [rcx],0
+
+ vpinsrq xmm4,xmm0,rax,0
+ vpinsrq xmm5,xmm1,rsi,0
+ vpinsrq xmm6,xmm2,[rcx],0
+ vpinsrq xmm7,xmm3,qword [rdx],0
diff --git a/test/popcnt.asm b/test/popcnt.asm
new file mode 100644
index 00000000..00096198
--- /dev/null
+++ b/test/popcnt.asm
@@ -0,0 +1,32 @@
+;Testname=test; Arguments=-fbin -opopcnt.bin; Files=stdout stderr popcnt.bin
+
+ bits 16
+
+ popcnt ax,cx
+ popcnt ax,[si]
+ popcnt ax,word [si]
+ popcnt eax,ecx
+ popcnt eax,[si]
+ popcnt eax,dword [si]
+
+ bits 32
+
+ popcnt ax,cx
+ popcnt ax,[esi]
+ popcnt ax,word [esi]
+ popcnt eax,ecx
+ popcnt eax,[esi]
+ popcnt eax,dword [esi]
+
+ bits 64
+
+ popcnt ax,cx
+ popcnt ax,[rsi]
+ popcnt ax,word [rsi]
+ popcnt eax,ecx
+ popcnt eax,[rsi]
+ popcnt eax,dword [rsi]
+ popcnt rax,rcx
+ popcnt rax,[rsi]
+ popcnt rax,qword [rsi]
+ \ No newline at end of file
diff --git a/test/ppindirect.asm b/test/ppindirect.asm
new file mode 100644
index 00000000..0a30d075
--- /dev/null
+++ b/test/ppindirect.asm
@@ -0,0 +1,42 @@
+;Testname=test; Arguments=-E -o ppindirect.out; Files=ppindirect.out
+
+; Fun tests of the preprocessor indirection mode...
+
+%assign foo1 11
+%assign foo11 1111
+%assign foo2 22
+%assign foo22 2222
+%assign foo3 33
+%assign foo33 3333
+%assign n 2
+foo%[foo%[n]]*100
+foo%[n]*100
+%assign foo%[foo%[n]] foo%[foo%[n]]*100
+;%assign foo%[n] foo%[n]*100
+
+ foo1
+ foo2
+ foo3
+ foo11
+ foo22
+ foo33
+
+%define foo33bar 999999
+ %[foo%[foo3]bar]
+
+%assign bctr 0
+%macro bluttan 0
+%assign bctr bctr+1
+%assign bluttan%[bctr] bctr
+%defstr bstr bluttan%[bctr]
+ bluttan%[bctr]
+ bstr
+%endmacro
+
+%rep 20
+ bluttan
+%endrep
+%rep 20
+ bluttan%[bctr]
+%assign bctr bctr-1
+%endrep
diff --git a/test/pragma.asm b/test/pragma.asm
new file mode 100644
index 00000000..cecd984b
--- /dev/null
+++ b/test/pragma.asm
@@ -0,0 +1,12 @@
+%pragma
+%pragma bluttan
+%pragma bluttan blej
+%pragma "Hej tomtegubbar"
+%define PR asm foobar
+%pragma PR
+%pragma preproc
+%pragma preproc tjo fidelittan preproc
+%pragma dbg tjo fidelittan output
+%pragma dbgdbg tjo fidelittan debug format
+%pragma Dbg Tjo Fidelittan Output
+%pragma Dbgdbg Tjo Fidelittan Debug Format
diff --git a/test/prefix66.asm b/test/prefix66.asm
new file mode 100644
index 00000000..4d9eb00a
--- /dev/null
+++ b/test/prefix66.asm
@@ -0,0 +1,28 @@
+;Testname=test; Arguments=-fbin -oprefix66.bin; Files=stdout stderr prefix66.bin
+
+BITS 16
+cmp ax, 1
+o16 cmp ax, 1
+o32 cmp ax, 1
+
+cmp eax, 1
+o16 cmp eax, 1
+o32 cmp eax, 1
+
+BITS 32
+cmp ax, 1
+o16 cmp ax, 1
+o32 cmp ax, 1
+
+cmp eax, 1
+o16 cmp eax, 1
+o32 cmp eax, 1
+
+BITS 64
+cmp ax, 1
+o16 cmp ax, 1
+o32 cmp ax, 1
+
+cmp eax, 1
+o16 cmp eax, 1
+o32 cmp eax, 1
diff --git a/test/ptr.asm b/test/ptr.asm
new file mode 100644
index 00000000..bad32952
--- /dev/null
+++ b/test/ptr.asm
@@ -0,0 +1,4 @@
+ ;; This should warn but still assemble, as the code is correct
+
+ mov eax,dword ptr
+ptr:
diff --git a/test/pushseg.asm b/test/pushseg.asm
new file mode 100644
index 00000000..7bd7c955
--- /dev/null
+++ b/test/pushseg.asm
@@ -0,0 +1,17 @@
+;Testname=test; Arguments=-fbin -opushseg.bin; Files=stdout stderr pushseg.bin
+
+ bits 16
+
+ push cs
+ push ds
+ push es
+ push ss
+ push fs
+ push gs
+
+ pop gs
+ pop fs
+ pop ss
+ pop es
+ pop ds
+ pop cs ; 8086 only, does not disassemble
diff --git a/test/r13.asm b/test/r13.asm
new file mode 100644
index 00000000..88079e1b
--- /dev/null
+++ b/test/r13.asm
@@ -0,0 +1,15 @@
+;Testname=test; Arguments=-fbin -or13.bin; Files=stdout stderr r13.bin
+
+ bits 64
+ mov rax,[rbx]
+ mov rax,[rbx*4]
+ mov rax,[rbx+rbx*2]
+ mov rax,[r13+rbx*2]
+ mov rax,[rbp]
+ mov rax,[rbp*4]
+ mov rax,[rbp+rbp*2]
+ mov rax,[rbp+r13*2]
+ mov rax,[r13]
+ mov rax,[r13*4]
+ mov rax,[r13+rbp*2]
+ mov rax,[r13+r13*2]
diff --git a/test/radix.asm b/test/radix.asm
new file mode 100644
index 00000000..1c564572
--- /dev/null
+++ b/test/radix.asm
@@ -0,0 +1,54 @@
+;Testname=test; Arguments=-fbin -oradix.bin; Files=stdout stderr radix.bin
+
+ ;; Integer constants...
+
+ dd 1010_0101 ; Decimal
+ dd 01010_0101 ; Decimal (*not* octal!)
+ dd 0d1010_0101 ; Decimal
+ dd 0t1010_0101 ; Decimal
+ dd 1010_0101d ; Decimal
+ dd 1010_0101t ; Decimal
+
+ dd 0b1010_0101 ; Binary
+ dd 0y1010_0101 ; Binary
+ dd 1010_0101b ; Binary
+ dd 1010_0101y ; Binary
+
+ dd 0o1010_0101 ; Octal
+ dd 0q1010_0101 ; Octal
+ dd 1010_0101o ; Octal
+ dd 1010_0101q ; Octal
+
+ dd 0h1010_0101 ; Hex
+ dd 0x1010_0101 ; Hex
+ dd 1010_0101h ; Hex
+ dd 1010_0101x ; Hex
+ dd $1010_0101 ; Hex
+
+ db 0h ; Zero!
+ db 0x ; Zero!
+ db 0b ; Zero!
+ db 0dh ; Hex
+ db 0bh ; Hex
+ db 0dx ; Hex
+ db 0bx ; Hex
+ db 0hd ; Hex
+ db 0hb ; Hex
+ db 0xd ; Hex
+ db 0xb ; Hex
+
+ ;; Floating-point constants
+ ;; All of these should output B4A21147
+ dd 3.7282705e+4 ; Decimal
+ dd 00003.7282705e+4 ; Decimal
+ dd 0d3.7282705e+4 ; Decimal
+ dd 0t3.7282705e+4 ; Decimal
+
+ dd 0x1.23456789p+15 ; Hex
+ dd 0h1.23456789p+15 ; Hex
+
+ dd 0o1.10642547422p+15 ; Octal
+ dd 0q1.10642547422p+15 ; Octal
+
+ dd 0b1.0010_0011_0100_0101_0110_0111_1000_1001p+15 ; Binary
+ dd 0y1.0010_0011_0100_0101_0110_0111_1000_1001p+15 ; Binary
diff --git a/test/rdpid.asm b/test/rdpid.asm
new file mode 100644
index 00000000..76d9fc26
--- /dev/null
+++ b/test/rdpid.asm
@@ -0,0 +1,21 @@
+%ifdef ERROR
+ %define ERR(x) x
+%else
+ %define ERR(x)
+%endif
+
+ bits 16
+
+ rdpid eax
+ ERR(rdpid ax)
+
+ bits 32
+
+ rdpid ebx
+ ERR(rdpid bx)
+
+ bits 64
+
+ rdpid rcx
+ rdpid ecx
+ ERR(rdpid cx)
diff --git a/test/reldef.asm b/test/reldef.asm
new file mode 100644
index 00000000..1741e13d
--- /dev/null
+++ b/test/reldef.asm
@@ -0,0 +1,57 @@
+ bits 64
+ default rel
+
+%if 1
+ extern bar
+%else
+ section .bss
+bar: resd 0
+%endif
+
+ global start
+ global foo
+
+ section .rodata
+rod1: dd 0x01234567
+rod2: dd 0x89abcdef
+
+ section .text
+start:
+ call .next
+.next: pop rsi
+ sub rsi,.next-$$
+
+ lea rax, [rod1]
+ lea rcx, [rod2]
+ lea rdx, [bar]
+ lea rbx, [foo]
+
+ lea rax, [rdi+rod1-$$]
+ lea rcx, [rdi+rod2-$$]
+ lea rdx, [rdi+bar-$$]
+ lea rbx, [rdi+foo-$$]
+
+ mov rax, [rdi+rod1-$$]
+ mov rcx, [rdi+rod2-$$]
+ mov rdx, [rdi+bar-$$]
+ mov rbx, [rdi+foo-$$]
+
+ mov rax, dword rod1-$$
+ mov rcx, dword rod2-$$
+ mov rdx, dword bar-$$
+ mov rbx, dword foo-$$
+
+ section .data
+ dq rod1
+ dq rod2
+ dq bar
+ dq foo
+foo:
+ dd rod1 - $
+ dd rod1 - $$
+ dd rod2 - $
+ dd rod2 - $$
+ dd bar - $
+ dd bar - $$
+ dd foo - $
+ dd foo - $$
diff --git a/test/relocs.asm b/test/relocs.asm
new file mode 100644
index 00000000..cc560f28
--- /dev/null
+++ b/test/relocs.asm
@@ -0,0 +1,20 @@
+ bits 64
+ extern foo
+
+ mov eax,[foo]
+ mov rax,[foo]
+ mov rax,[qword foo]
+
+ mov eax,[a32 foo]
+ mov rax,[a32 foo]
+ mov rax,[a32 qword foo]
+
+ mov eax,foo
+ mov rax,dword foo
+ mov rax,qword foo
+ mov eax,foo
+ mov rax,dword foo
+ mov rax,qword foo
+
+ dd foo
+ dq foo
diff --git a/test/ret.asm b/test/ret.asm
new file mode 100644
index 00000000..a6aa5332
--- /dev/null
+++ b/test/ret.asm
@@ -0,0 +1,56 @@
+ ;; All the flavors of RET
+%ifndef ERROR
+ %define ERROR 0
+%endif
+
+
+ bits 16
+
+ ret
+ retn
+ retf
+ retw
+ retnw
+ retfw
+ retd
+ retnd
+ retfd
+%if ERROR
+ retq
+ retnq
+ retfq
+%endif
+
+ bits 32
+
+ ret
+ retn
+ retf
+ retw
+ retnw
+ retfw
+ retd
+ retnd
+ retfd
+%if ERROR
+ retq
+ retnq
+ retfq
+%endif
+
+ bits 64
+
+ ret
+ retn
+ retf ; Probably should have been RETFQ, but: legacy...
+ retw
+ retnw
+ retfw
+%if ERROR
+ retd
+ retnd
+%endif
+ retfd
+ retq
+ retnq
+ retfq
diff --git a/test/riprel.asm b/test/riprel.asm
new file mode 100644
index 00000000..757a8dd1
--- /dev/null
+++ b/test/riprel.asm
@@ -0,0 +1,5357 @@
+;Testname=unoptimized; Arguments=-fbin -oriprel.bin -O0; Files=stdout stderr riprel.bin
+;Testname=optimized; Arguments=-fbin -oriprel.bin -Ox; Files=stdout stderr riprel.bin
+ bits 64
+
+ default abs
+
+ mov al,[foo]
+ mov bl,[foo]
+ mov ax,[foo]
+ mov bx,[foo]
+ mov eax,[foo]
+ mov ebx,[foo]
+ mov rax,[foo]
+ mov rbx,[foo]
+ mov al,[0xaaaaaaaaaaaaaaaa]
+ mov bl,[0xaaaaaaaaaaaaaaaa]
+ mov ax,[0xaaaaaaaaaaaaaaaa]
+ mov bx,[0xaaaaaaaaaaaaaaaa]
+ mov eax,[0xaaaaaaaaaaaaaaaa]
+ mov ebx,[0xaaaaaaaaaaaaaaaa]
+ mov rax,[0xaaaaaaaaaaaaaaaa]
+ mov rbx,[0xaaaaaaaaaaaaaaaa]
+ mov al,[0xbbbbbbbb]
+ mov bl,[0xbbbbbbbb]
+ mov ax,[0xbbbbbbbb]
+ mov bx,[0xbbbbbbbb]
+ mov eax,[0xbbbbbbbb]
+ mov ebx,[0xbbbbbbbb]
+ mov rax,[0xbbbbbbbb]
+ mov rbx,[0xbbbbbbbb]
+ mov al,[0xffffffffcccccccc]
+ mov bl,[0xffffffffcccccccc]
+ mov ax,[0xffffffffcccccccc]
+ mov bx,[0xffffffffcccccccc]
+ mov eax,[0xffffffffcccccccc]
+ mov ebx,[0xffffffffcccccccc]
+ mov rax,[0xffffffffcccccccc]
+ mov rbx,[0xffffffffcccccccc]
+
+ mov al,[dword foo]
+ mov bl,[dword foo]
+ mov ax,[dword foo]
+ mov bx,[dword foo]
+ mov eax,[dword foo]
+ mov ebx,[dword foo]
+ mov rax,[dword foo]
+ mov rbx,[dword foo]
+ mov al,[dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[dword 0xbbbbbbbb]
+ mov bl,[dword 0xbbbbbbbb]
+ mov ax,[dword 0xbbbbbbbb]
+ mov bx,[dword 0xbbbbbbbb]
+ mov eax,[dword 0xbbbbbbbb]
+ mov ebx,[dword 0xbbbbbbbb]
+ mov rax,[dword 0xbbbbbbbb]
+ mov rbx,[dword 0xbbbbbbbb]
+ mov al,[dword 0xffffffffcccccccc]
+ mov bl,[dword 0xffffffffcccccccc]
+ mov ax,[dword 0xffffffffcccccccc]
+ mov bx,[dword 0xffffffffcccccccc]
+ mov eax,[dword 0xffffffffcccccccc]
+ mov ebx,[dword 0xffffffffcccccccc]
+ mov rax,[dword 0xffffffffcccccccc]
+ mov rbx,[dword 0xffffffffcccccccc]
+
+ mov al,[qword foo]
+ mov bl,[qword foo]
+ mov ax,[qword foo]
+ mov bx,[qword foo]
+ mov eax,[qword foo]
+ mov ebx,[qword foo]
+ mov rax,[qword foo]
+ mov rbx,[qword foo]
+ mov al,[qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[qword 0xbbbbbbbb]
+ mov bl,[qword 0xbbbbbbbb]
+ mov ax,[qword 0xbbbbbbbb]
+ mov bx,[qword 0xbbbbbbbb]
+ mov eax,[qword 0xbbbbbbbb]
+ mov ebx,[qword 0xbbbbbbbb]
+ mov rax,[qword 0xbbbbbbbb]
+ mov rbx,[qword 0xbbbbbbbb]
+ mov al,[qword 0xffffffffcccccccc]
+ mov bl,[qword 0xffffffffcccccccc]
+ mov ax,[qword 0xffffffffcccccccc]
+ mov bx,[qword 0xffffffffcccccccc]
+ mov eax,[qword 0xffffffffcccccccc]
+ mov ebx,[qword 0xffffffffcccccccc]
+ mov rax,[qword 0xffffffffcccccccc]
+ mov rbx,[qword 0xffffffffcccccccc]
+
+ mov al,[a64 foo]
+ mov bl,[a64 foo]
+ mov ax,[a64 foo]
+ mov bx,[a64 foo]
+ mov eax,[a64 foo]
+ mov ebx,[a64 foo]
+ mov rax,[a64 foo]
+ mov rbx,[a64 foo]
+ mov al,[a64 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 0xbbbbbbbb]
+ mov bl,[a64 0xbbbbbbbb]
+ mov ax,[a64 0xbbbbbbbb]
+ mov bx,[a64 0xbbbbbbbb]
+ mov eax,[a64 0xbbbbbbbb]
+ mov ebx,[a64 0xbbbbbbbb]
+ mov rax,[a64 0xbbbbbbbb]
+ mov rbx,[a64 0xbbbbbbbb]
+ mov al,[a64 0xffffffffcccccccc]
+ mov bl,[a64 0xffffffffcccccccc]
+ mov ax,[a64 0xffffffffcccccccc]
+ mov bx,[a64 0xffffffffcccccccc]
+ mov eax,[a64 0xffffffffcccccccc]
+ mov ebx,[a64 0xffffffffcccccccc]
+ mov rax,[a64 0xffffffffcccccccc]
+ mov rbx,[a64 0xffffffffcccccccc]
+
+ mov al,[a64 dword foo]
+ mov bl,[a64 dword foo]
+ mov ax,[a64 dword foo]
+ mov bx,[a64 dword foo]
+ mov eax,[a64 dword foo]
+ mov ebx,[a64 dword foo]
+ mov rax,[a64 dword foo]
+ mov rbx,[a64 dword foo]
+ mov al,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword 0xbbbbbbbb]
+ mov bl,[a64 dword 0xbbbbbbbb]
+ mov ax,[a64 dword 0xbbbbbbbb]
+ mov bx,[a64 dword 0xbbbbbbbb]
+ mov eax,[a64 dword 0xbbbbbbbb]
+ mov ebx,[a64 dword 0xbbbbbbbb]
+ mov rax,[a64 dword 0xbbbbbbbb]
+ mov rbx,[a64 dword 0xbbbbbbbb]
+ mov al,[a64 dword 0xffffffffcccccccc]
+ mov bl,[a64 dword 0xffffffffcccccccc]
+ mov ax,[a64 dword 0xffffffffcccccccc]
+ mov bx,[a64 dword 0xffffffffcccccccc]
+ mov eax,[a64 dword 0xffffffffcccccccc]
+ mov ebx,[a64 dword 0xffffffffcccccccc]
+ mov rax,[a64 dword 0xffffffffcccccccc]
+ mov rbx,[a64 dword 0xffffffffcccccccc]
+
+ mov al,[a64 qword foo]
+ mov bl,[a64 qword foo]
+ mov ax,[a64 qword foo]
+ mov bx,[a64 qword foo]
+ mov eax,[a64 qword foo]
+ mov ebx,[a64 qword foo]
+ mov rax,[a64 qword foo]
+ mov rbx,[a64 qword foo]
+ mov al,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword 0xbbbbbbbb]
+ mov bl,[a64 qword 0xbbbbbbbb]
+ mov ax,[a64 qword 0xbbbbbbbb]
+ mov bx,[a64 qword 0xbbbbbbbb]
+ mov eax,[a64 qword 0xbbbbbbbb]
+ mov ebx,[a64 qword 0xbbbbbbbb]
+ mov rax,[a64 qword 0xbbbbbbbb]
+ mov rbx,[a64 qword 0xbbbbbbbb]
+ mov al,[a64 qword 0xffffffffcccccccc]
+ mov bl,[a64 qword 0xffffffffcccccccc]
+ mov ax,[a64 qword 0xffffffffcccccccc]
+ mov bx,[a64 qword 0xffffffffcccccccc]
+ mov eax,[a64 qword 0xffffffffcccccccc]
+ mov ebx,[a64 qword 0xffffffffcccccccc]
+ mov rax,[a64 qword 0xffffffffcccccccc]
+ mov rbx,[a64 qword 0xffffffffcccccccc]
+
+ mov al,[a32 foo]
+ mov bl,[a32 foo]
+ mov ax,[a32 foo]
+ mov bx,[a32 foo]
+ mov eax,[a32 foo]
+ mov ebx,[a32 foo]
+ mov rax,[a32 foo]
+ mov rbx,[a32 foo]
+ mov al,[a32 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 0xbbbbbbbb]
+ mov bl,[a32 0xbbbbbbbb]
+ mov ax,[a32 0xbbbbbbbb]
+ mov bx,[a32 0xbbbbbbbb]
+ mov eax,[a32 0xbbbbbbbb]
+ mov ebx,[a32 0xbbbbbbbb]
+ mov rax,[a32 0xbbbbbbbb]
+ mov rbx,[a32 0xbbbbbbbb]
+ mov al,[a32 0xffffffffcccccccc]
+ mov bl,[a32 0xffffffffcccccccc]
+ mov ax,[a32 0xffffffffcccccccc]
+ mov bx,[a32 0xffffffffcccccccc]
+ mov eax,[a32 0xffffffffcccccccc]
+ mov ebx,[a32 0xffffffffcccccccc]
+ mov rax,[a32 0xffffffffcccccccc]
+ mov rbx,[a32 0xffffffffcccccccc]
+
+ mov al,[a32 dword foo]
+ mov bl,[a32 dword foo]
+ mov ax,[a32 dword foo]
+ mov bx,[a32 dword foo]
+ mov eax,[a32 dword foo]
+ mov ebx,[a32 dword foo]
+ mov rax,[a32 dword foo]
+ mov rbx,[a32 dword foo]
+ mov al,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword 0xbbbbbbbb]
+ mov bl,[a32 dword 0xbbbbbbbb]
+ mov ax,[a32 dword 0xbbbbbbbb]
+ mov bx,[a32 dword 0xbbbbbbbb]
+ mov eax,[a32 dword 0xbbbbbbbb]
+ mov ebx,[a32 dword 0xbbbbbbbb]
+ mov rax,[a32 dword 0xbbbbbbbb]
+ mov rbx,[a32 dword 0xbbbbbbbb]
+ mov al,[a32 dword 0xffffffffcccccccc]
+ mov bl,[a32 dword 0xffffffffcccccccc]
+ mov ax,[a32 dword 0xffffffffcccccccc]
+ mov bx,[a32 dword 0xffffffffcccccccc]
+ mov eax,[a32 dword 0xffffffffcccccccc]
+ mov ebx,[a32 dword 0xffffffffcccccccc]
+ mov rax,[a32 dword 0xffffffffcccccccc]
+ mov rbx,[a32 dword 0xffffffffcccccccc]
+
+ mov al,[a32 qword foo]
+ mov bl,[a32 qword foo]
+ mov ax,[a32 qword foo]
+ mov bx,[a32 qword foo]
+ mov eax,[a32 qword foo]
+ mov ebx,[a32 qword foo]
+ mov rax,[a32 qword foo]
+ mov rbx,[a32 qword foo]
+ mov al,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword 0xbbbbbbbb]
+ mov bl,[a32 qword 0xbbbbbbbb]
+ mov ax,[a32 qword 0xbbbbbbbb]
+ mov bx,[a32 qword 0xbbbbbbbb]
+ mov eax,[a32 qword 0xbbbbbbbb]
+ mov ebx,[a32 qword 0xbbbbbbbb]
+ mov rax,[a32 qword 0xbbbbbbbb]
+ mov rbx,[a32 qword 0xbbbbbbbb]
+ mov al,[a32 qword 0xffffffffcccccccc]
+ mov bl,[a32 qword 0xffffffffcccccccc]
+ mov ax,[a32 qword 0xffffffffcccccccc]
+ mov bx,[a32 qword 0xffffffffcccccccc]
+ mov eax,[a32 qword 0xffffffffcccccccc]
+ mov ebx,[a32 qword 0xffffffffcccccccc]
+ mov rax,[a32 qword 0xffffffffcccccccc]
+ mov rbx,[a32 qword 0xffffffffcccccccc]
+
+ mov al,[abs foo]
+ mov bl,[abs foo]
+ mov ax,[abs foo]
+ mov bx,[abs foo]
+ mov eax,[abs foo]
+ mov ebx,[abs foo]
+ mov rax,[abs foo]
+ mov rbx,[abs foo]
+ mov al,[abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs 0xbbbbbbbb]
+ mov bl,[abs 0xbbbbbbbb]
+ mov ax,[abs 0xbbbbbbbb]
+ mov bx,[abs 0xbbbbbbbb]
+ mov eax,[abs 0xbbbbbbbb]
+ mov ebx,[abs 0xbbbbbbbb]
+ mov rax,[abs 0xbbbbbbbb]
+ mov rbx,[abs 0xbbbbbbbb]
+ mov al,[abs 0xffffffffcccccccc]
+ mov bl,[abs 0xffffffffcccccccc]
+ mov ax,[abs 0xffffffffcccccccc]
+ mov bx,[abs 0xffffffffcccccccc]
+ mov eax,[abs 0xffffffffcccccccc]
+ mov ebx,[abs 0xffffffffcccccccc]
+ mov rax,[abs 0xffffffffcccccccc]
+ mov rbx,[abs 0xffffffffcccccccc]
+
+ mov al,[abs dword foo]
+ mov bl,[abs dword foo]
+ mov ax,[abs dword foo]
+ mov bx,[abs dword foo]
+ mov eax,[abs dword foo]
+ mov ebx,[abs dword foo]
+ mov rax,[abs dword foo]
+ mov rbx,[abs dword foo]
+ mov al,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword 0xbbbbbbbb]
+ mov bl,[abs dword 0xbbbbbbbb]
+ mov ax,[abs dword 0xbbbbbbbb]
+ mov bx,[abs dword 0xbbbbbbbb]
+ mov eax,[abs dword 0xbbbbbbbb]
+ mov ebx,[abs dword 0xbbbbbbbb]
+ mov rax,[abs dword 0xbbbbbbbb]
+ mov rbx,[abs dword 0xbbbbbbbb]
+ mov al,[abs dword 0xffffffffcccccccc]
+ mov bl,[abs dword 0xffffffffcccccccc]
+ mov ax,[abs dword 0xffffffffcccccccc]
+ mov bx,[abs dword 0xffffffffcccccccc]
+ mov eax,[abs dword 0xffffffffcccccccc]
+ mov ebx,[abs dword 0xffffffffcccccccc]
+ mov rax,[abs dword 0xffffffffcccccccc]
+ mov rbx,[abs dword 0xffffffffcccccccc]
+
+ mov al,[abs qword foo]
+ mov bl,[abs qword foo]
+ mov ax,[abs qword foo]
+ mov bx,[abs qword foo]
+ mov eax,[abs qword foo]
+ mov ebx,[abs qword foo]
+ mov rax,[abs qword foo]
+ mov rbx,[abs qword foo]
+ mov al,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword 0xbbbbbbbb]
+ mov bl,[abs qword 0xbbbbbbbb]
+ mov ax,[abs qword 0xbbbbbbbb]
+ mov bx,[abs qword 0xbbbbbbbb]
+ mov eax,[abs qword 0xbbbbbbbb]
+ mov ebx,[abs qword 0xbbbbbbbb]
+ mov rax,[abs qword 0xbbbbbbbb]
+ mov rbx,[abs qword 0xbbbbbbbb]
+ mov al,[abs qword 0xffffffffcccccccc]
+ mov bl,[abs qword 0xffffffffcccccccc]
+ mov ax,[abs qword 0xffffffffcccccccc]
+ mov bx,[abs qword 0xffffffffcccccccc]
+ mov eax,[abs qword 0xffffffffcccccccc]
+ mov ebx,[abs qword 0xffffffffcccccccc]
+ mov rax,[abs qword 0xffffffffcccccccc]
+ mov rbx,[abs qword 0xffffffffcccccccc]
+
+ mov al,[a64 abs foo]
+ mov bl,[a64 abs foo]
+ mov ax,[a64 abs foo]
+ mov bx,[a64 abs foo]
+ mov eax,[a64 abs foo]
+ mov ebx,[a64 abs foo]
+ mov rax,[a64 abs foo]
+ mov rbx,[a64 abs foo]
+ mov al,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs 0xbbbbbbbb]
+ mov bl,[a64 abs 0xbbbbbbbb]
+ mov ax,[a64 abs 0xbbbbbbbb]
+ mov bx,[a64 abs 0xbbbbbbbb]
+ mov eax,[a64 abs 0xbbbbbbbb]
+ mov ebx,[a64 abs 0xbbbbbbbb]
+ mov rax,[a64 abs 0xbbbbbbbb]
+ mov rbx,[a64 abs 0xbbbbbbbb]
+ mov al,[a64 abs 0xffffffffcccccccc]
+ mov bl,[a64 abs 0xffffffffcccccccc]
+ mov ax,[a64 abs 0xffffffffcccccccc]
+ mov bx,[a64 abs 0xffffffffcccccccc]
+ mov eax,[a64 abs 0xffffffffcccccccc]
+ mov ebx,[a64 abs 0xffffffffcccccccc]
+ mov rax,[a64 abs 0xffffffffcccccccc]
+ mov rbx,[a64 abs 0xffffffffcccccccc]
+
+ mov al,[a64 abs dword foo]
+ mov bl,[a64 abs dword foo]
+ mov ax,[a64 abs dword foo]
+ mov bx,[a64 abs dword foo]
+ mov eax,[a64 abs dword foo]
+ mov ebx,[a64 abs dword foo]
+ mov rax,[a64 abs dword foo]
+ mov rbx,[a64 abs dword foo]
+ mov al,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword 0xbbbbbbbb]
+ mov bl,[a64 abs dword 0xbbbbbbbb]
+ mov ax,[a64 abs dword 0xbbbbbbbb]
+ mov bx,[a64 abs dword 0xbbbbbbbb]
+ mov eax,[a64 abs dword 0xbbbbbbbb]
+ mov ebx,[a64 abs dword 0xbbbbbbbb]
+ mov rax,[a64 abs dword 0xbbbbbbbb]
+ mov rbx,[a64 abs dword 0xbbbbbbbb]
+ mov al,[a64 abs dword 0xffffffffcccccccc]
+ mov bl,[a64 abs dword 0xffffffffcccccccc]
+ mov ax,[a64 abs dword 0xffffffffcccccccc]
+ mov bx,[a64 abs dword 0xffffffffcccccccc]
+ mov eax,[a64 abs dword 0xffffffffcccccccc]
+ mov ebx,[a64 abs dword 0xffffffffcccccccc]
+ mov rax,[a64 abs dword 0xffffffffcccccccc]
+ mov rbx,[a64 abs dword 0xffffffffcccccccc]
+
+ mov al,[a64 abs qword foo]
+ mov bl,[a64 abs qword foo]
+ mov ax,[a64 abs qword foo]
+ mov bx,[a64 abs qword foo]
+ mov eax,[a64 abs qword foo]
+ mov ebx,[a64 abs qword foo]
+ mov rax,[a64 abs qword foo]
+ mov rbx,[a64 abs qword foo]
+ mov al,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword 0xbbbbbbbb]
+ mov bl,[a64 abs qword 0xbbbbbbbb]
+ mov ax,[a64 abs qword 0xbbbbbbbb]
+ mov bx,[a64 abs qword 0xbbbbbbbb]
+ mov eax,[a64 abs qword 0xbbbbbbbb]
+ mov ebx,[a64 abs qword 0xbbbbbbbb]
+ mov rax,[a64 abs qword 0xbbbbbbbb]
+ mov rbx,[a64 abs qword 0xbbbbbbbb]
+ mov al,[a64 abs qword 0xffffffffcccccccc]
+ mov bl,[a64 abs qword 0xffffffffcccccccc]
+ mov ax,[a64 abs qword 0xffffffffcccccccc]
+ mov bx,[a64 abs qword 0xffffffffcccccccc]
+ mov eax,[a64 abs qword 0xffffffffcccccccc]
+ mov ebx,[a64 abs qword 0xffffffffcccccccc]
+ mov rax,[a64 abs qword 0xffffffffcccccccc]
+ mov rbx,[a64 abs qword 0xffffffffcccccccc]
+
+ mov al,[a32 abs foo]
+ mov bl,[a32 abs foo]
+ mov ax,[a32 abs foo]
+ mov bx,[a32 abs foo]
+ mov eax,[a32 abs foo]
+ mov ebx,[a32 abs foo]
+ mov rax,[a32 abs foo]
+ mov rbx,[a32 abs foo]
+ mov al,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs 0xbbbbbbbb]
+ mov bl,[a32 abs 0xbbbbbbbb]
+ mov ax,[a32 abs 0xbbbbbbbb]
+ mov bx,[a32 abs 0xbbbbbbbb]
+ mov eax,[a32 abs 0xbbbbbbbb]
+ mov ebx,[a32 abs 0xbbbbbbbb]
+ mov rax,[a32 abs 0xbbbbbbbb]
+ mov rbx,[a32 abs 0xbbbbbbbb]
+ mov al,[a32 abs 0xffffffffcccccccc]
+ mov bl,[a32 abs 0xffffffffcccccccc]
+ mov ax,[a32 abs 0xffffffffcccccccc]
+ mov bx,[a32 abs 0xffffffffcccccccc]
+ mov eax,[a32 abs 0xffffffffcccccccc]
+ mov ebx,[a32 abs 0xffffffffcccccccc]
+ mov rax,[a32 abs 0xffffffffcccccccc]
+ mov rbx,[a32 abs 0xffffffffcccccccc]
+
+ mov al,[a32 abs dword foo]
+ mov bl,[a32 abs dword foo]
+ mov ax,[a32 abs dword foo]
+ mov bx,[a32 abs dword foo]
+ mov eax,[a32 abs dword foo]
+ mov ebx,[a32 abs dword foo]
+ mov rax,[a32 abs dword foo]
+ mov rbx,[a32 abs dword foo]
+ mov al,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword 0xbbbbbbbb]
+ mov bl,[a32 abs dword 0xbbbbbbbb]
+ mov ax,[a32 abs dword 0xbbbbbbbb]
+ mov bx,[a32 abs dword 0xbbbbbbbb]
+ mov eax,[a32 abs dword 0xbbbbbbbb]
+ mov ebx,[a32 abs dword 0xbbbbbbbb]
+ mov rax,[a32 abs dword 0xbbbbbbbb]
+ mov rbx,[a32 abs dword 0xbbbbbbbb]
+ mov al,[a32 abs dword 0xffffffffcccccccc]
+ mov bl,[a32 abs dword 0xffffffffcccccccc]
+ mov ax,[a32 abs dword 0xffffffffcccccccc]
+ mov bx,[a32 abs dword 0xffffffffcccccccc]
+ mov eax,[a32 abs dword 0xffffffffcccccccc]
+ mov ebx,[a32 abs dword 0xffffffffcccccccc]
+ mov rax,[a32 abs dword 0xffffffffcccccccc]
+ mov rbx,[a32 abs dword 0xffffffffcccccccc]
+
+ mov al,[a32 abs qword foo]
+ mov bl,[a32 abs qword foo]
+ mov ax,[a32 abs qword foo]
+ mov bx,[a32 abs qword foo]
+ mov eax,[a32 abs qword foo]
+ mov ebx,[a32 abs qword foo]
+ mov rax,[a32 abs qword foo]
+ mov rbx,[a32 abs qword foo]
+ mov al,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword 0xbbbbbbbb]
+ mov bl,[a32 abs qword 0xbbbbbbbb]
+ mov ax,[a32 abs qword 0xbbbbbbbb]
+ mov bx,[a32 abs qword 0xbbbbbbbb]
+ mov eax,[a32 abs qword 0xbbbbbbbb]
+ mov ebx,[a32 abs qword 0xbbbbbbbb]
+ mov rax,[a32 abs qword 0xbbbbbbbb]
+ mov rbx,[a32 abs qword 0xbbbbbbbb]
+ mov al,[a32 abs qword 0xffffffffcccccccc]
+ mov bl,[a32 abs qword 0xffffffffcccccccc]
+ mov ax,[a32 abs qword 0xffffffffcccccccc]
+ mov bx,[a32 abs qword 0xffffffffcccccccc]
+ mov eax,[a32 abs qword 0xffffffffcccccccc]
+ mov ebx,[a32 abs qword 0xffffffffcccccccc]
+ mov rax,[a32 abs qword 0xffffffffcccccccc]
+ mov rbx,[a32 abs qword 0xffffffffcccccccc]
+
+ mov al,[rel foo]
+ mov bl,[rel foo]
+ mov ax,[rel foo]
+ mov bx,[rel foo]
+ mov eax,[rel foo]
+ mov ebx,[rel foo]
+ mov rax,[rel foo]
+ mov rbx,[rel foo]
+ mov al,[rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel 0xbbbbbbbb]
+ mov bl,[rel 0xbbbbbbbb]
+ mov ax,[rel 0xbbbbbbbb]
+ mov bx,[rel 0xbbbbbbbb]
+ mov eax,[rel 0xbbbbbbbb]
+ mov ebx,[rel 0xbbbbbbbb]
+ mov rax,[rel 0xbbbbbbbb]
+ mov rbx,[rel 0xbbbbbbbb]
+ mov al,[rel 0xffffffffcccccccc]
+ mov bl,[rel 0xffffffffcccccccc]
+ mov ax,[rel 0xffffffffcccccccc]
+ mov bx,[rel 0xffffffffcccccccc]
+ mov eax,[rel 0xffffffffcccccccc]
+ mov ebx,[rel 0xffffffffcccccccc]
+ mov rax,[rel 0xffffffffcccccccc]
+ mov rbx,[rel 0xffffffffcccccccc]
+
+ mov al,[rel dword foo]
+ mov bl,[rel dword foo]
+ mov ax,[rel dword foo]
+ mov bx,[rel dword foo]
+ mov eax,[rel dword foo]
+ mov ebx,[rel dword foo]
+ mov rax,[rel dword foo]
+ mov rbx,[rel dword foo]
+ mov al,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword 0xbbbbbbbb]
+ mov bl,[rel dword 0xbbbbbbbb]
+ mov ax,[rel dword 0xbbbbbbbb]
+ mov bx,[rel dword 0xbbbbbbbb]
+ mov eax,[rel dword 0xbbbbbbbb]
+ mov ebx,[rel dword 0xbbbbbbbb]
+ mov rax,[rel dword 0xbbbbbbbb]
+ mov rbx,[rel dword 0xbbbbbbbb]
+ mov al,[rel dword 0xffffffffcccccccc]
+ mov bl,[rel dword 0xffffffffcccccccc]
+ mov ax,[rel dword 0xffffffffcccccccc]
+ mov bx,[rel dword 0xffffffffcccccccc]
+ mov eax,[rel dword 0xffffffffcccccccc]
+ mov ebx,[rel dword 0xffffffffcccccccc]
+ mov rax,[rel dword 0xffffffffcccccccc]
+ mov rbx,[rel dword 0xffffffffcccccccc]
+
+ mov al,[rel qword foo]
+ mov bl,[rel qword foo]
+ mov ax,[rel qword foo]
+ mov bx,[rel qword foo]
+ mov eax,[rel qword foo]
+ mov ebx,[rel qword foo]
+ mov rax,[rel qword foo]
+ mov rbx,[rel qword foo]
+ mov al,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword 0xbbbbbbbb]
+ mov bl,[rel qword 0xbbbbbbbb]
+ mov ax,[rel qword 0xbbbbbbbb]
+ mov bx,[rel qword 0xbbbbbbbb]
+ mov eax,[rel qword 0xbbbbbbbb]
+ mov ebx,[rel qword 0xbbbbbbbb]
+ mov rax,[rel qword 0xbbbbbbbb]
+ mov rbx,[rel qword 0xbbbbbbbb]
+ mov al,[rel qword 0xffffffffcccccccc]
+ mov bl,[rel qword 0xffffffffcccccccc]
+ mov ax,[rel qword 0xffffffffcccccccc]
+ mov bx,[rel qword 0xffffffffcccccccc]
+ mov eax,[rel qword 0xffffffffcccccccc]
+ mov ebx,[rel qword 0xffffffffcccccccc]
+ mov rax,[rel qword 0xffffffffcccccccc]
+ mov rbx,[rel qword 0xffffffffcccccccc]
+
+ mov al,[a64 rel foo]
+ mov bl,[a64 rel foo]
+ mov ax,[a64 rel foo]
+ mov bx,[a64 rel foo]
+ mov eax,[a64 rel foo]
+ mov ebx,[a64 rel foo]
+ mov rax,[a64 rel foo]
+ mov rbx,[a64 rel foo]
+ mov al,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel 0xbbbbbbbb]
+ mov bl,[a64 rel 0xbbbbbbbb]
+ mov ax,[a64 rel 0xbbbbbbbb]
+ mov bx,[a64 rel 0xbbbbbbbb]
+ mov eax,[a64 rel 0xbbbbbbbb]
+ mov ebx,[a64 rel 0xbbbbbbbb]
+ mov rax,[a64 rel 0xbbbbbbbb]
+ mov rbx,[a64 rel 0xbbbbbbbb]
+ mov al,[a64 rel 0xffffffffcccccccc]
+ mov bl,[a64 rel 0xffffffffcccccccc]
+ mov ax,[a64 rel 0xffffffffcccccccc]
+ mov bx,[a64 rel 0xffffffffcccccccc]
+ mov eax,[a64 rel 0xffffffffcccccccc]
+ mov ebx,[a64 rel 0xffffffffcccccccc]
+ mov rax,[a64 rel 0xffffffffcccccccc]
+ mov rbx,[a64 rel 0xffffffffcccccccc]
+
+ mov al,[a64 rel dword foo]
+ mov bl,[a64 rel dword foo]
+ mov ax,[a64 rel dword foo]
+ mov bx,[a64 rel dword foo]
+ mov eax,[a64 rel dword foo]
+ mov ebx,[a64 rel dword foo]
+ mov rax,[a64 rel dword foo]
+ mov rbx,[a64 rel dword foo]
+ mov al,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword 0xbbbbbbbb]
+ mov bl,[a64 rel dword 0xbbbbbbbb]
+ mov ax,[a64 rel dword 0xbbbbbbbb]
+ mov bx,[a64 rel dword 0xbbbbbbbb]
+ mov eax,[a64 rel dword 0xbbbbbbbb]
+ mov ebx,[a64 rel dword 0xbbbbbbbb]
+ mov rax,[a64 rel dword 0xbbbbbbbb]
+ mov rbx,[a64 rel dword 0xbbbbbbbb]
+ mov al,[a64 rel dword 0xffffffffcccccccc]
+ mov bl,[a64 rel dword 0xffffffffcccccccc]
+ mov ax,[a64 rel dword 0xffffffffcccccccc]
+ mov bx,[a64 rel dword 0xffffffffcccccccc]
+ mov eax,[a64 rel dword 0xffffffffcccccccc]
+ mov ebx,[a64 rel dword 0xffffffffcccccccc]
+ mov rax,[a64 rel dword 0xffffffffcccccccc]
+ mov rbx,[a64 rel dword 0xffffffffcccccccc]
+
+ mov al,[a64 rel qword foo]
+ mov bl,[a64 rel qword foo]
+ mov ax,[a64 rel qword foo]
+ mov bx,[a64 rel qword foo]
+ mov eax,[a64 rel qword foo]
+ mov ebx,[a64 rel qword foo]
+ mov rax,[a64 rel qword foo]
+ mov rbx,[a64 rel qword foo]
+ mov al,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword 0xbbbbbbbb]
+ mov bl,[a64 rel qword 0xbbbbbbbb]
+ mov ax,[a64 rel qword 0xbbbbbbbb]
+ mov bx,[a64 rel qword 0xbbbbbbbb]
+ mov eax,[a64 rel qword 0xbbbbbbbb]
+ mov ebx,[a64 rel qword 0xbbbbbbbb]
+ mov rax,[a64 rel qword 0xbbbbbbbb]
+ mov rbx,[a64 rel qword 0xbbbbbbbb]
+ mov al,[a64 rel qword 0xffffffffcccccccc]
+ mov bl,[a64 rel qword 0xffffffffcccccccc]
+ mov ax,[a64 rel qword 0xffffffffcccccccc]
+ mov bx,[a64 rel qword 0xffffffffcccccccc]
+ mov eax,[a64 rel qword 0xffffffffcccccccc]
+ mov ebx,[a64 rel qword 0xffffffffcccccccc]
+ mov rax,[a64 rel qword 0xffffffffcccccccc]
+ mov rbx,[a64 rel qword 0xffffffffcccccccc]
+
+ mov al,[a32 rel foo]
+ mov bl,[a32 rel foo]
+ mov ax,[a32 rel foo]
+ mov bx,[a32 rel foo]
+ mov eax,[a32 rel foo]
+ mov ebx,[a32 rel foo]
+ mov rax,[a32 rel foo]
+ mov rbx,[a32 rel foo]
+ mov al,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel 0xbbbbbbbb]
+ mov bl,[a32 rel 0xbbbbbbbb]
+ mov ax,[a32 rel 0xbbbbbbbb]
+ mov bx,[a32 rel 0xbbbbbbbb]
+ mov eax,[a32 rel 0xbbbbbbbb]
+ mov ebx,[a32 rel 0xbbbbbbbb]
+ mov rax,[a32 rel 0xbbbbbbbb]
+ mov rbx,[a32 rel 0xbbbbbbbb]
+ mov al,[a32 rel 0xffffffffcccccccc]
+ mov bl,[a32 rel 0xffffffffcccccccc]
+ mov ax,[a32 rel 0xffffffffcccccccc]
+ mov bx,[a32 rel 0xffffffffcccccccc]
+ mov eax,[a32 rel 0xffffffffcccccccc]
+ mov ebx,[a32 rel 0xffffffffcccccccc]
+ mov rax,[a32 rel 0xffffffffcccccccc]
+ mov rbx,[a32 rel 0xffffffffcccccccc]
+
+ mov al,[a32 rel dword foo]
+ mov bl,[a32 rel dword foo]
+ mov ax,[a32 rel dword foo]
+ mov bx,[a32 rel dword foo]
+ mov eax,[a32 rel dword foo]
+ mov ebx,[a32 rel dword foo]
+ mov rax,[a32 rel dword foo]
+ mov rbx,[a32 rel dword foo]
+ mov al,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword 0xbbbbbbbb]
+ mov bl,[a32 rel dword 0xbbbbbbbb]
+ mov ax,[a32 rel dword 0xbbbbbbbb]
+ mov bx,[a32 rel dword 0xbbbbbbbb]
+ mov eax,[a32 rel dword 0xbbbbbbbb]
+ mov ebx,[a32 rel dword 0xbbbbbbbb]
+ mov rax,[a32 rel dword 0xbbbbbbbb]
+ mov rbx,[a32 rel dword 0xbbbbbbbb]
+ mov al,[a32 rel dword 0xffffffffcccccccc]
+ mov bl,[a32 rel dword 0xffffffffcccccccc]
+ mov ax,[a32 rel dword 0xffffffffcccccccc]
+ mov bx,[a32 rel dword 0xffffffffcccccccc]
+ mov eax,[a32 rel dword 0xffffffffcccccccc]
+ mov ebx,[a32 rel dword 0xffffffffcccccccc]
+ mov rax,[a32 rel dword 0xffffffffcccccccc]
+ mov rbx,[a32 rel dword 0xffffffffcccccccc]
+
+ mov al,[a32 rel qword foo]
+ mov bl,[a32 rel qword foo]
+ mov ax,[a32 rel qword foo]
+ mov bx,[a32 rel qword foo]
+ mov eax,[a32 rel qword foo]
+ mov ebx,[a32 rel qword foo]
+ mov rax,[a32 rel qword foo]
+ mov rbx,[a32 rel qword foo]
+ mov al,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword 0xbbbbbbbb]
+ mov bl,[a32 rel qword 0xbbbbbbbb]
+ mov ax,[a32 rel qword 0xbbbbbbbb]
+ mov bx,[a32 rel qword 0xbbbbbbbb]
+ mov eax,[a32 rel qword 0xbbbbbbbb]
+ mov ebx,[a32 rel qword 0xbbbbbbbb]
+ mov rax,[a32 rel qword 0xbbbbbbbb]
+ mov rbx,[a32 rel qword 0xbbbbbbbb]
+ mov al,[a32 rel qword 0xffffffffcccccccc]
+ mov bl,[a32 rel qword 0xffffffffcccccccc]
+ mov ax,[a32 rel qword 0xffffffffcccccccc]
+ mov bx,[a32 rel qword 0xffffffffcccccccc]
+ mov eax,[a32 rel qword 0xffffffffcccccccc]
+ mov ebx,[a32 rel qword 0xffffffffcccccccc]
+ mov rax,[a32 rel qword 0xffffffffcccccccc]
+ mov rbx,[a32 rel qword 0xffffffffcccccccc]
+
+ mov al,[fs:foo]
+ mov bl,[fs:foo]
+ mov ax,[fs:foo]
+ mov bx,[fs:foo]
+ mov eax,[fs:foo]
+ mov ebx,[fs:foo]
+ mov rax,[fs:foo]
+ mov rbx,[fs:foo]
+ mov al,[fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[fs:0xbbbbbbbb]
+ mov bl,[fs:0xbbbbbbbb]
+ mov ax,[fs:0xbbbbbbbb]
+ mov bx,[fs:0xbbbbbbbb]
+ mov eax,[fs:0xbbbbbbbb]
+ mov ebx,[fs:0xbbbbbbbb]
+ mov rax,[fs:0xbbbbbbbb]
+ mov rbx,[fs:0xbbbbbbbb]
+ mov al,[fs:0xffffffffcccccccc]
+ mov bl,[fs:0xffffffffcccccccc]
+ mov ax,[fs:0xffffffffcccccccc]
+ mov bx,[fs:0xffffffffcccccccc]
+ mov eax,[fs:0xffffffffcccccccc]
+ mov ebx,[fs:0xffffffffcccccccc]
+ mov rax,[fs:0xffffffffcccccccc]
+ mov rbx,[fs:0xffffffffcccccccc]
+
+ mov al,[dword fs:foo]
+ mov bl,[dword fs:foo]
+ mov ax,[dword fs:foo]
+ mov bx,[dword fs:foo]
+ mov eax,[dword fs:foo]
+ mov ebx,[dword fs:foo]
+ mov rax,[dword fs:foo]
+ mov rbx,[dword fs:foo]
+ mov al,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[dword fs:0xbbbbbbbb]
+ mov bl,[dword fs:0xbbbbbbbb]
+ mov ax,[dword fs:0xbbbbbbbb]
+ mov bx,[dword fs:0xbbbbbbbb]
+ mov eax,[dword fs:0xbbbbbbbb]
+ mov ebx,[dword fs:0xbbbbbbbb]
+ mov rax,[dword fs:0xbbbbbbbb]
+ mov rbx,[dword fs:0xbbbbbbbb]
+ mov al,[dword fs:0xffffffffcccccccc]
+ mov bl,[dword fs:0xffffffffcccccccc]
+ mov ax,[dword fs:0xffffffffcccccccc]
+ mov bx,[dword fs:0xffffffffcccccccc]
+ mov eax,[dword fs:0xffffffffcccccccc]
+ mov ebx,[dword fs:0xffffffffcccccccc]
+ mov rax,[dword fs:0xffffffffcccccccc]
+ mov rbx,[dword fs:0xffffffffcccccccc]
+
+ mov al,[qword fs:foo]
+ mov bl,[qword fs:foo]
+ mov ax,[qword fs:foo]
+ mov bx,[qword fs:foo]
+ mov eax,[qword fs:foo]
+ mov ebx,[qword fs:foo]
+ mov rax,[qword fs:foo]
+ mov rbx,[qword fs:foo]
+ mov al,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[qword fs:0xbbbbbbbb]
+ mov bl,[qword fs:0xbbbbbbbb]
+ mov ax,[qword fs:0xbbbbbbbb]
+ mov bx,[qword fs:0xbbbbbbbb]
+ mov eax,[qword fs:0xbbbbbbbb]
+ mov ebx,[qword fs:0xbbbbbbbb]
+ mov rax,[qword fs:0xbbbbbbbb]
+ mov rbx,[qword fs:0xbbbbbbbb]
+ mov al,[qword fs:0xffffffffcccccccc]
+ mov bl,[qword fs:0xffffffffcccccccc]
+ mov ax,[qword fs:0xffffffffcccccccc]
+ mov bx,[qword fs:0xffffffffcccccccc]
+ mov eax,[qword fs:0xffffffffcccccccc]
+ mov ebx,[qword fs:0xffffffffcccccccc]
+ mov rax,[qword fs:0xffffffffcccccccc]
+ mov rbx,[qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 fs:foo]
+ mov bl,[a64 fs:foo]
+ mov ax,[a64 fs:foo]
+ mov bx,[a64 fs:foo]
+ mov eax,[a64 fs:foo]
+ mov ebx,[a64 fs:foo]
+ mov rax,[a64 fs:foo]
+ mov rbx,[a64 fs:foo]
+ mov al,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 fs:0xbbbbbbbb]
+ mov bl,[a64 fs:0xbbbbbbbb]
+ mov ax,[a64 fs:0xbbbbbbbb]
+ mov bx,[a64 fs:0xbbbbbbbb]
+ mov eax,[a64 fs:0xbbbbbbbb]
+ mov ebx,[a64 fs:0xbbbbbbbb]
+ mov rax,[a64 fs:0xbbbbbbbb]
+ mov rbx,[a64 fs:0xbbbbbbbb]
+ mov al,[a64 fs:0xffffffffcccccccc]
+ mov bl,[a64 fs:0xffffffffcccccccc]
+ mov ax,[a64 fs:0xffffffffcccccccc]
+ mov bx,[a64 fs:0xffffffffcccccccc]
+ mov eax,[a64 fs:0xffffffffcccccccc]
+ mov ebx,[a64 fs:0xffffffffcccccccc]
+ mov rax,[a64 fs:0xffffffffcccccccc]
+ mov rbx,[a64 fs:0xffffffffcccccccc]
+
+ mov al,[a64 dword fs:foo]
+ mov bl,[a64 dword fs:foo]
+ mov ax,[a64 dword fs:foo]
+ mov bx,[a64 dword fs:foo]
+ mov eax,[a64 dword fs:foo]
+ mov ebx,[a64 dword fs:foo]
+ mov rax,[a64 dword fs:foo]
+ mov rbx,[a64 dword fs:foo]
+ mov al,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword fs:0xbbbbbbbb]
+ mov bl,[a64 dword fs:0xbbbbbbbb]
+ mov ax,[a64 dword fs:0xbbbbbbbb]
+ mov bx,[a64 dword fs:0xbbbbbbbb]
+ mov eax,[a64 dword fs:0xbbbbbbbb]
+ mov ebx,[a64 dword fs:0xbbbbbbbb]
+ mov rax,[a64 dword fs:0xbbbbbbbb]
+ mov rbx,[a64 dword fs:0xbbbbbbbb]
+ mov al,[a64 dword fs:0xffffffffcccccccc]
+ mov bl,[a64 dword fs:0xffffffffcccccccc]
+ mov ax,[a64 dword fs:0xffffffffcccccccc]
+ mov bx,[a64 dword fs:0xffffffffcccccccc]
+ mov eax,[a64 dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 dword fs:0xffffffffcccccccc]
+ mov rax,[a64 dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 qword fs:foo]
+ mov bl,[a64 qword fs:foo]
+ mov ax,[a64 qword fs:foo]
+ mov bx,[a64 qword fs:foo]
+ mov eax,[a64 qword fs:foo]
+ mov ebx,[a64 qword fs:foo]
+ mov rax,[a64 qword fs:foo]
+ mov rbx,[a64 qword fs:foo]
+ mov al,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword fs:0xbbbbbbbb]
+ mov bl,[a64 qword fs:0xbbbbbbbb]
+ mov ax,[a64 qword fs:0xbbbbbbbb]
+ mov bx,[a64 qword fs:0xbbbbbbbb]
+ mov eax,[a64 qword fs:0xbbbbbbbb]
+ mov ebx,[a64 qword fs:0xbbbbbbbb]
+ mov rax,[a64 qword fs:0xbbbbbbbb]
+ mov rbx,[a64 qword fs:0xbbbbbbbb]
+ mov al,[a64 qword fs:0xffffffffcccccccc]
+ mov bl,[a64 qword fs:0xffffffffcccccccc]
+ mov ax,[a64 qword fs:0xffffffffcccccccc]
+ mov bx,[a64 qword fs:0xffffffffcccccccc]
+ mov eax,[a64 qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 qword fs:0xffffffffcccccccc]
+ mov rax,[a64 qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 fs:foo]
+ mov bl,[a32 fs:foo]
+ mov ax,[a32 fs:foo]
+ mov bx,[a32 fs:foo]
+ mov eax,[a32 fs:foo]
+ mov ebx,[a32 fs:foo]
+ mov rax,[a32 fs:foo]
+ mov rbx,[a32 fs:foo]
+ mov al,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 fs:0xbbbbbbbb]
+ mov bl,[a32 fs:0xbbbbbbbb]
+ mov ax,[a32 fs:0xbbbbbbbb]
+ mov bx,[a32 fs:0xbbbbbbbb]
+ mov eax,[a32 fs:0xbbbbbbbb]
+ mov ebx,[a32 fs:0xbbbbbbbb]
+ mov rax,[a32 fs:0xbbbbbbbb]
+ mov rbx,[a32 fs:0xbbbbbbbb]
+ mov al,[a32 fs:0xffffffffcccccccc]
+ mov bl,[a32 fs:0xffffffffcccccccc]
+ mov ax,[a32 fs:0xffffffffcccccccc]
+ mov bx,[a32 fs:0xffffffffcccccccc]
+ mov eax,[a32 fs:0xffffffffcccccccc]
+ mov ebx,[a32 fs:0xffffffffcccccccc]
+ mov rax,[a32 fs:0xffffffffcccccccc]
+ mov rbx,[a32 fs:0xffffffffcccccccc]
+
+ mov al,[a32 dword fs:foo]
+ mov bl,[a32 dword fs:foo]
+ mov ax,[a32 dword fs:foo]
+ mov bx,[a32 dword fs:foo]
+ mov eax,[a32 dword fs:foo]
+ mov ebx,[a32 dword fs:foo]
+ mov rax,[a32 dword fs:foo]
+ mov rbx,[a32 dword fs:foo]
+ mov al,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword fs:0xbbbbbbbb]
+ mov bl,[a32 dword fs:0xbbbbbbbb]
+ mov ax,[a32 dword fs:0xbbbbbbbb]
+ mov bx,[a32 dword fs:0xbbbbbbbb]
+ mov eax,[a32 dword fs:0xbbbbbbbb]
+ mov ebx,[a32 dword fs:0xbbbbbbbb]
+ mov rax,[a32 dword fs:0xbbbbbbbb]
+ mov rbx,[a32 dword fs:0xbbbbbbbb]
+ mov al,[a32 dword fs:0xffffffffcccccccc]
+ mov bl,[a32 dword fs:0xffffffffcccccccc]
+ mov ax,[a32 dword fs:0xffffffffcccccccc]
+ mov bx,[a32 dword fs:0xffffffffcccccccc]
+ mov eax,[a32 dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 dword fs:0xffffffffcccccccc]
+ mov rax,[a32 dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 qword fs:foo]
+ mov bl,[a32 qword fs:foo]
+ mov ax,[a32 qword fs:foo]
+ mov bx,[a32 qword fs:foo]
+ mov eax,[a32 qword fs:foo]
+ mov ebx,[a32 qword fs:foo]
+ mov rax,[a32 qword fs:foo]
+ mov rbx,[a32 qword fs:foo]
+ mov al,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword fs:0xbbbbbbbb]
+ mov bl,[a32 qword fs:0xbbbbbbbb]
+ mov ax,[a32 qword fs:0xbbbbbbbb]
+ mov bx,[a32 qword fs:0xbbbbbbbb]
+ mov eax,[a32 qword fs:0xbbbbbbbb]
+ mov ebx,[a32 qword fs:0xbbbbbbbb]
+ mov rax,[a32 qword fs:0xbbbbbbbb]
+ mov rbx,[a32 qword fs:0xbbbbbbbb]
+ mov al,[a32 qword fs:0xffffffffcccccccc]
+ mov bl,[a32 qword fs:0xffffffffcccccccc]
+ mov ax,[a32 qword fs:0xffffffffcccccccc]
+ mov bx,[a32 qword fs:0xffffffffcccccccc]
+ mov eax,[a32 qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 qword fs:0xffffffffcccccccc]
+ mov rax,[a32 qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 qword fs:0xffffffffcccccccc]
+
+ mov al,[abs fs:foo]
+ mov bl,[abs fs:foo]
+ mov ax,[abs fs:foo]
+ mov bx,[abs fs:foo]
+ mov eax,[abs fs:foo]
+ mov ebx,[abs fs:foo]
+ mov rax,[abs fs:foo]
+ mov rbx,[abs fs:foo]
+ mov al,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs fs:0xbbbbbbbb]
+ mov bl,[abs fs:0xbbbbbbbb]
+ mov ax,[abs fs:0xbbbbbbbb]
+ mov bx,[abs fs:0xbbbbbbbb]
+ mov eax,[abs fs:0xbbbbbbbb]
+ mov ebx,[abs fs:0xbbbbbbbb]
+ mov rax,[abs fs:0xbbbbbbbb]
+ mov rbx,[abs fs:0xbbbbbbbb]
+ mov al,[abs fs:0xffffffffcccccccc]
+ mov bl,[abs fs:0xffffffffcccccccc]
+ mov ax,[abs fs:0xffffffffcccccccc]
+ mov bx,[abs fs:0xffffffffcccccccc]
+ mov eax,[abs fs:0xffffffffcccccccc]
+ mov ebx,[abs fs:0xffffffffcccccccc]
+ mov rax,[abs fs:0xffffffffcccccccc]
+ mov rbx,[abs fs:0xffffffffcccccccc]
+
+ mov al,[abs dword fs:foo]
+ mov bl,[abs dword fs:foo]
+ mov ax,[abs dword fs:foo]
+ mov bx,[abs dword fs:foo]
+ mov eax,[abs dword fs:foo]
+ mov ebx,[abs dword fs:foo]
+ mov rax,[abs dword fs:foo]
+ mov rbx,[abs dword fs:foo]
+ mov al,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword fs:0xbbbbbbbb]
+ mov bl,[abs dword fs:0xbbbbbbbb]
+ mov ax,[abs dword fs:0xbbbbbbbb]
+ mov bx,[abs dword fs:0xbbbbbbbb]
+ mov eax,[abs dword fs:0xbbbbbbbb]
+ mov ebx,[abs dword fs:0xbbbbbbbb]
+ mov rax,[abs dword fs:0xbbbbbbbb]
+ mov rbx,[abs dword fs:0xbbbbbbbb]
+ mov al,[abs dword fs:0xffffffffcccccccc]
+ mov bl,[abs dword fs:0xffffffffcccccccc]
+ mov ax,[abs dword fs:0xffffffffcccccccc]
+ mov bx,[abs dword fs:0xffffffffcccccccc]
+ mov eax,[abs dword fs:0xffffffffcccccccc]
+ mov ebx,[abs dword fs:0xffffffffcccccccc]
+ mov rax,[abs dword fs:0xffffffffcccccccc]
+ mov rbx,[abs dword fs:0xffffffffcccccccc]
+
+ mov al,[abs qword fs:foo]
+ mov bl,[abs qword fs:foo]
+ mov ax,[abs qword fs:foo]
+ mov bx,[abs qword fs:foo]
+ mov eax,[abs qword fs:foo]
+ mov ebx,[abs qword fs:foo]
+ mov rax,[abs qword fs:foo]
+ mov rbx,[abs qword fs:foo]
+ mov al,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword fs:0xbbbbbbbb]
+ mov bl,[abs qword fs:0xbbbbbbbb]
+ mov ax,[abs qword fs:0xbbbbbbbb]
+ mov bx,[abs qword fs:0xbbbbbbbb]
+ mov eax,[abs qword fs:0xbbbbbbbb]
+ mov ebx,[abs qword fs:0xbbbbbbbb]
+ mov rax,[abs qword fs:0xbbbbbbbb]
+ mov rbx,[abs qword fs:0xbbbbbbbb]
+ mov al,[abs qword fs:0xffffffffcccccccc]
+ mov bl,[abs qword fs:0xffffffffcccccccc]
+ mov ax,[abs qword fs:0xffffffffcccccccc]
+ mov bx,[abs qword fs:0xffffffffcccccccc]
+ mov eax,[abs qword fs:0xffffffffcccccccc]
+ mov ebx,[abs qword fs:0xffffffffcccccccc]
+ mov rax,[abs qword fs:0xffffffffcccccccc]
+ mov rbx,[abs qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs fs:foo]
+ mov bl,[a64 abs fs:foo]
+ mov ax,[a64 abs fs:foo]
+ mov bx,[a64 abs fs:foo]
+ mov eax,[a64 abs fs:foo]
+ mov ebx,[a64 abs fs:foo]
+ mov rax,[a64 abs fs:foo]
+ mov rbx,[a64 abs fs:foo]
+ mov al,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs fs:0xbbbbbbbb]
+ mov bl,[a64 abs fs:0xbbbbbbbb]
+ mov ax,[a64 abs fs:0xbbbbbbbb]
+ mov bx,[a64 abs fs:0xbbbbbbbb]
+ mov eax,[a64 abs fs:0xbbbbbbbb]
+ mov ebx,[a64 abs fs:0xbbbbbbbb]
+ mov rax,[a64 abs fs:0xbbbbbbbb]
+ mov rbx,[a64 abs fs:0xbbbbbbbb]
+ mov al,[a64 abs fs:0xffffffffcccccccc]
+ mov bl,[a64 abs fs:0xffffffffcccccccc]
+ mov ax,[a64 abs fs:0xffffffffcccccccc]
+ mov bx,[a64 abs fs:0xffffffffcccccccc]
+ mov eax,[a64 abs fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs fs:0xffffffffcccccccc]
+ mov rax,[a64 abs fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs dword fs:foo]
+ mov bl,[a64 abs dword fs:foo]
+ mov ax,[a64 abs dword fs:foo]
+ mov bx,[a64 abs dword fs:foo]
+ mov eax,[a64 abs dword fs:foo]
+ mov ebx,[a64 abs dword fs:foo]
+ mov rax,[a64 abs dword fs:foo]
+ mov rbx,[a64 abs dword fs:foo]
+ mov al,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword fs:0xbbbbbbbb]
+ mov bl,[a64 abs dword fs:0xbbbbbbbb]
+ mov ax,[a64 abs dword fs:0xbbbbbbbb]
+ mov bx,[a64 abs dword fs:0xbbbbbbbb]
+ mov eax,[a64 abs dword fs:0xbbbbbbbb]
+ mov ebx,[a64 abs dword fs:0xbbbbbbbb]
+ mov rax,[a64 abs dword fs:0xbbbbbbbb]
+ mov rbx,[a64 abs dword fs:0xbbbbbbbb]
+ mov al,[a64 abs dword fs:0xffffffffcccccccc]
+ mov bl,[a64 abs dword fs:0xffffffffcccccccc]
+ mov ax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov bx,[a64 abs dword fs:0xffffffffcccccccc]
+ mov eax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs dword fs:0xffffffffcccccccc]
+ mov rax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs qword fs:foo]
+ mov bl,[a64 abs qword fs:foo]
+ mov ax,[a64 abs qword fs:foo]
+ mov bx,[a64 abs qword fs:foo]
+ mov eax,[a64 abs qword fs:foo]
+ mov ebx,[a64 abs qword fs:foo]
+ mov rax,[a64 abs qword fs:foo]
+ mov rbx,[a64 abs qword fs:foo]
+ mov al,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword fs:0xbbbbbbbb]
+ mov bl,[a64 abs qword fs:0xbbbbbbbb]
+ mov ax,[a64 abs qword fs:0xbbbbbbbb]
+ mov bx,[a64 abs qword fs:0xbbbbbbbb]
+ mov eax,[a64 abs qword fs:0xbbbbbbbb]
+ mov ebx,[a64 abs qword fs:0xbbbbbbbb]
+ mov rax,[a64 abs qword fs:0xbbbbbbbb]
+ mov rbx,[a64 abs qword fs:0xbbbbbbbb]
+ mov al,[a64 abs qword fs:0xffffffffcccccccc]
+ mov bl,[a64 abs qword fs:0xffffffffcccccccc]
+ mov ax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov bx,[a64 abs qword fs:0xffffffffcccccccc]
+ mov eax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs qword fs:0xffffffffcccccccc]
+ mov rax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs fs:foo]
+ mov bl,[a32 abs fs:foo]
+ mov ax,[a32 abs fs:foo]
+ mov bx,[a32 abs fs:foo]
+ mov eax,[a32 abs fs:foo]
+ mov ebx,[a32 abs fs:foo]
+ mov rax,[a32 abs fs:foo]
+ mov rbx,[a32 abs fs:foo]
+ mov al,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs fs:0xbbbbbbbb]
+ mov bl,[a32 abs fs:0xbbbbbbbb]
+ mov ax,[a32 abs fs:0xbbbbbbbb]
+ mov bx,[a32 abs fs:0xbbbbbbbb]
+ mov eax,[a32 abs fs:0xbbbbbbbb]
+ mov ebx,[a32 abs fs:0xbbbbbbbb]
+ mov rax,[a32 abs fs:0xbbbbbbbb]
+ mov rbx,[a32 abs fs:0xbbbbbbbb]
+ mov al,[a32 abs fs:0xffffffffcccccccc]
+ mov bl,[a32 abs fs:0xffffffffcccccccc]
+ mov ax,[a32 abs fs:0xffffffffcccccccc]
+ mov bx,[a32 abs fs:0xffffffffcccccccc]
+ mov eax,[a32 abs fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs fs:0xffffffffcccccccc]
+ mov rax,[a32 abs fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs dword fs:foo]
+ mov bl,[a32 abs dword fs:foo]
+ mov ax,[a32 abs dword fs:foo]
+ mov bx,[a32 abs dword fs:foo]
+ mov eax,[a32 abs dword fs:foo]
+ mov ebx,[a32 abs dword fs:foo]
+ mov rax,[a32 abs dword fs:foo]
+ mov rbx,[a32 abs dword fs:foo]
+ mov al,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword fs:0xbbbbbbbb]
+ mov bl,[a32 abs dword fs:0xbbbbbbbb]
+ mov ax,[a32 abs dword fs:0xbbbbbbbb]
+ mov bx,[a32 abs dword fs:0xbbbbbbbb]
+ mov eax,[a32 abs dword fs:0xbbbbbbbb]
+ mov ebx,[a32 abs dword fs:0xbbbbbbbb]
+ mov rax,[a32 abs dword fs:0xbbbbbbbb]
+ mov rbx,[a32 abs dword fs:0xbbbbbbbb]
+ mov al,[a32 abs dword fs:0xffffffffcccccccc]
+ mov bl,[a32 abs dword fs:0xffffffffcccccccc]
+ mov ax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov bx,[a32 abs dword fs:0xffffffffcccccccc]
+ mov eax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs dword fs:0xffffffffcccccccc]
+ mov rax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs qword fs:foo]
+ mov bl,[a32 abs qword fs:foo]
+ mov ax,[a32 abs qword fs:foo]
+ mov bx,[a32 abs qword fs:foo]
+ mov eax,[a32 abs qword fs:foo]
+ mov ebx,[a32 abs qword fs:foo]
+ mov rax,[a32 abs qword fs:foo]
+ mov rbx,[a32 abs qword fs:foo]
+ mov al,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword fs:0xbbbbbbbb]
+ mov bl,[a32 abs qword fs:0xbbbbbbbb]
+ mov ax,[a32 abs qword fs:0xbbbbbbbb]
+ mov bx,[a32 abs qword fs:0xbbbbbbbb]
+ mov eax,[a32 abs qword fs:0xbbbbbbbb]
+ mov ebx,[a32 abs qword fs:0xbbbbbbbb]
+ mov rax,[a32 abs qword fs:0xbbbbbbbb]
+ mov rbx,[a32 abs qword fs:0xbbbbbbbb]
+ mov al,[a32 abs qword fs:0xffffffffcccccccc]
+ mov bl,[a32 abs qword fs:0xffffffffcccccccc]
+ mov ax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov bx,[a32 abs qword fs:0xffffffffcccccccc]
+ mov eax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs qword fs:0xffffffffcccccccc]
+ mov rax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs qword fs:0xffffffffcccccccc]
+
+ mov al,[rel fs:foo]
+ mov bl,[rel fs:foo]
+ mov ax,[rel fs:foo]
+ mov bx,[rel fs:foo]
+ mov eax,[rel fs:foo]
+ mov ebx,[rel fs:foo]
+ mov rax,[rel fs:foo]
+ mov rbx,[rel fs:foo]
+ mov al,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel fs:0xbbbbbbbb]
+ mov bl,[rel fs:0xbbbbbbbb]
+ mov ax,[rel fs:0xbbbbbbbb]
+ mov bx,[rel fs:0xbbbbbbbb]
+ mov eax,[rel fs:0xbbbbbbbb]
+ mov ebx,[rel fs:0xbbbbbbbb]
+ mov rax,[rel fs:0xbbbbbbbb]
+ mov rbx,[rel fs:0xbbbbbbbb]
+ mov al,[rel fs:0xffffffffcccccccc]
+ mov bl,[rel fs:0xffffffffcccccccc]
+ mov ax,[rel fs:0xffffffffcccccccc]
+ mov bx,[rel fs:0xffffffffcccccccc]
+ mov eax,[rel fs:0xffffffffcccccccc]
+ mov ebx,[rel fs:0xffffffffcccccccc]
+ mov rax,[rel fs:0xffffffffcccccccc]
+ mov rbx,[rel fs:0xffffffffcccccccc]
+
+ mov al,[rel dword fs:foo]
+ mov bl,[rel dword fs:foo]
+ mov ax,[rel dword fs:foo]
+ mov bx,[rel dword fs:foo]
+ mov eax,[rel dword fs:foo]
+ mov ebx,[rel dword fs:foo]
+ mov rax,[rel dword fs:foo]
+ mov rbx,[rel dword fs:foo]
+ mov al,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword fs:0xbbbbbbbb]
+ mov bl,[rel dword fs:0xbbbbbbbb]
+ mov ax,[rel dword fs:0xbbbbbbbb]
+ mov bx,[rel dword fs:0xbbbbbbbb]
+ mov eax,[rel dword fs:0xbbbbbbbb]
+ mov ebx,[rel dword fs:0xbbbbbbbb]
+ mov rax,[rel dword fs:0xbbbbbbbb]
+ mov rbx,[rel dword fs:0xbbbbbbbb]
+ mov al,[rel dword fs:0xffffffffcccccccc]
+ mov bl,[rel dword fs:0xffffffffcccccccc]
+ mov ax,[rel dword fs:0xffffffffcccccccc]
+ mov bx,[rel dword fs:0xffffffffcccccccc]
+ mov eax,[rel dword fs:0xffffffffcccccccc]
+ mov ebx,[rel dword fs:0xffffffffcccccccc]
+ mov rax,[rel dword fs:0xffffffffcccccccc]
+ mov rbx,[rel dword fs:0xffffffffcccccccc]
+
+ mov al,[rel qword fs:foo]
+ mov bl,[rel qword fs:foo]
+ mov ax,[rel qword fs:foo]
+ mov bx,[rel qword fs:foo]
+ mov eax,[rel qword fs:foo]
+ mov ebx,[rel qword fs:foo]
+ mov rax,[rel qword fs:foo]
+ mov rbx,[rel qword fs:foo]
+ mov al,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword fs:0xbbbbbbbb]
+ mov bl,[rel qword fs:0xbbbbbbbb]
+ mov ax,[rel qword fs:0xbbbbbbbb]
+ mov bx,[rel qword fs:0xbbbbbbbb]
+ mov eax,[rel qword fs:0xbbbbbbbb]
+ mov ebx,[rel qword fs:0xbbbbbbbb]
+ mov rax,[rel qword fs:0xbbbbbbbb]
+ mov rbx,[rel qword fs:0xbbbbbbbb]
+ mov al,[rel qword fs:0xffffffffcccccccc]
+ mov bl,[rel qword fs:0xffffffffcccccccc]
+ mov ax,[rel qword fs:0xffffffffcccccccc]
+ mov bx,[rel qword fs:0xffffffffcccccccc]
+ mov eax,[rel qword fs:0xffffffffcccccccc]
+ mov ebx,[rel qword fs:0xffffffffcccccccc]
+ mov rax,[rel qword fs:0xffffffffcccccccc]
+ mov rbx,[rel qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel fs:foo]
+ mov bl,[a64 rel fs:foo]
+ mov ax,[a64 rel fs:foo]
+ mov bx,[a64 rel fs:foo]
+ mov eax,[a64 rel fs:foo]
+ mov ebx,[a64 rel fs:foo]
+ mov rax,[a64 rel fs:foo]
+ mov rbx,[a64 rel fs:foo]
+ mov al,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel fs:0xbbbbbbbb]
+ mov bl,[a64 rel fs:0xbbbbbbbb]
+ mov ax,[a64 rel fs:0xbbbbbbbb]
+ mov bx,[a64 rel fs:0xbbbbbbbb]
+ mov eax,[a64 rel fs:0xbbbbbbbb]
+ mov ebx,[a64 rel fs:0xbbbbbbbb]
+ mov rax,[a64 rel fs:0xbbbbbbbb]
+ mov rbx,[a64 rel fs:0xbbbbbbbb]
+ mov al,[a64 rel fs:0xffffffffcccccccc]
+ mov bl,[a64 rel fs:0xffffffffcccccccc]
+ mov ax,[a64 rel fs:0xffffffffcccccccc]
+ mov bx,[a64 rel fs:0xffffffffcccccccc]
+ mov eax,[a64 rel fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel fs:0xffffffffcccccccc]
+ mov rax,[a64 rel fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel dword fs:foo]
+ mov bl,[a64 rel dword fs:foo]
+ mov ax,[a64 rel dword fs:foo]
+ mov bx,[a64 rel dword fs:foo]
+ mov eax,[a64 rel dword fs:foo]
+ mov ebx,[a64 rel dword fs:foo]
+ mov rax,[a64 rel dword fs:foo]
+ mov rbx,[a64 rel dword fs:foo]
+ mov al,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword fs:0xbbbbbbbb]
+ mov bl,[a64 rel dword fs:0xbbbbbbbb]
+ mov ax,[a64 rel dword fs:0xbbbbbbbb]
+ mov bx,[a64 rel dword fs:0xbbbbbbbb]
+ mov eax,[a64 rel dword fs:0xbbbbbbbb]
+ mov ebx,[a64 rel dword fs:0xbbbbbbbb]
+ mov rax,[a64 rel dword fs:0xbbbbbbbb]
+ mov rbx,[a64 rel dword fs:0xbbbbbbbb]
+ mov al,[a64 rel dword fs:0xffffffffcccccccc]
+ mov bl,[a64 rel dword fs:0xffffffffcccccccc]
+ mov ax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov bx,[a64 rel dword fs:0xffffffffcccccccc]
+ mov eax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel dword fs:0xffffffffcccccccc]
+ mov rax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel qword fs:foo]
+ mov bl,[a64 rel qword fs:foo]
+ mov ax,[a64 rel qword fs:foo]
+ mov bx,[a64 rel qword fs:foo]
+ mov eax,[a64 rel qword fs:foo]
+ mov ebx,[a64 rel qword fs:foo]
+ mov rax,[a64 rel qword fs:foo]
+ mov rbx,[a64 rel qword fs:foo]
+ mov al,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword fs:0xbbbbbbbb]
+ mov bl,[a64 rel qword fs:0xbbbbbbbb]
+ mov ax,[a64 rel qword fs:0xbbbbbbbb]
+ mov bx,[a64 rel qword fs:0xbbbbbbbb]
+ mov eax,[a64 rel qword fs:0xbbbbbbbb]
+ mov ebx,[a64 rel qword fs:0xbbbbbbbb]
+ mov rax,[a64 rel qword fs:0xbbbbbbbb]
+ mov rbx,[a64 rel qword fs:0xbbbbbbbb]
+ mov al,[a64 rel qword fs:0xffffffffcccccccc]
+ mov bl,[a64 rel qword fs:0xffffffffcccccccc]
+ mov ax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov bx,[a64 rel qword fs:0xffffffffcccccccc]
+ mov eax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel qword fs:0xffffffffcccccccc]
+ mov rax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel fs:foo]
+ mov bl,[a32 rel fs:foo]
+ mov ax,[a32 rel fs:foo]
+ mov bx,[a32 rel fs:foo]
+ mov eax,[a32 rel fs:foo]
+ mov ebx,[a32 rel fs:foo]
+ mov rax,[a32 rel fs:foo]
+ mov rbx,[a32 rel fs:foo]
+ mov al,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel fs:0xbbbbbbbb]
+ mov bl,[a32 rel fs:0xbbbbbbbb]
+ mov ax,[a32 rel fs:0xbbbbbbbb]
+ mov bx,[a32 rel fs:0xbbbbbbbb]
+ mov eax,[a32 rel fs:0xbbbbbbbb]
+ mov ebx,[a32 rel fs:0xbbbbbbbb]
+ mov rax,[a32 rel fs:0xbbbbbbbb]
+ mov rbx,[a32 rel fs:0xbbbbbbbb]
+ mov al,[a32 rel fs:0xffffffffcccccccc]
+ mov bl,[a32 rel fs:0xffffffffcccccccc]
+ mov ax,[a32 rel fs:0xffffffffcccccccc]
+ mov bx,[a32 rel fs:0xffffffffcccccccc]
+ mov eax,[a32 rel fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel fs:0xffffffffcccccccc]
+ mov rax,[a32 rel fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel dword fs:foo]
+ mov bl,[a32 rel dword fs:foo]
+ mov ax,[a32 rel dword fs:foo]
+ mov bx,[a32 rel dword fs:foo]
+ mov eax,[a32 rel dword fs:foo]
+ mov ebx,[a32 rel dword fs:foo]
+ mov rax,[a32 rel dword fs:foo]
+ mov rbx,[a32 rel dword fs:foo]
+ mov al,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword fs:0xbbbbbbbb]
+ mov bl,[a32 rel dword fs:0xbbbbbbbb]
+ mov ax,[a32 rel dword fs:0xbbbbbbbb]
+ mov bx,[a32 rel dword fs:0xbbbbbbbb]
+ mov eax,[a32 rel dword fs:0xbbbbbbbb]
+ mov ebx,[a32 rel dword fs:0xbbbbbbbb]
+ mov rax,[a32 rel dword fs:0xbbbbbbbb]
+ mov rbx,[a32 rel dword fs:0xbbbbbbbb]
+ mov al,[a32 rel dword fs:0xffffffffcccccccc]
+ mov bl,[a32 rel dword fs:0xffffffffcccccccc]
+ mov ax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov bx,[a32 rel dword fs:0xffffffffcccccccc]
+ mov eax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel dword fs:0xffffffffcccccccc]
+ mov rax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel qword fs:foo]
+ mov bl,[a32 rel qword fs:foo]
+ mov ax,[a32 rel qword fs:foo]
+ mov bx,[a32 rel qword fs:foo]
+ mov eax,[a32 rel qword fs:foo]
+ mov ebx,[a32 rel qword fs:foo]
+ mov rax,[a32 rel qword fs:foo]
+ mov rbx,[a32 rel qword fs:foo]
+ mov al,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword fs:0xbbbbbbbb]
+ mov bl,[a32 rel qword fs:0xbbbbbbbb]
+ mov ax,[a32 rel qword fs:0xbbbbbbbb]
+ mov bx,[a32 rel qword fs:0xbbbbbbbb]
+ mov eax,[a32 rel qword fs:0xbbbbbbbb]
+ mov ebx,[a32 rel qword fs:0xbbbbbbbb]
+ mov rax,[a32 rel qword fs:0xbbbbbbbb]
+ mov rbx,[a32 rel qword fs:0xbbbbbbbb]
+ mov al,[a32 rel qword fs:0xffffffffcccccccc]
+ mov bl,[a32 rel qword fs:0xffffffffcccccccc]
+ mov ax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov bx,[a32 rel qword fs:0xffffffffcccccccc]
+ mov eax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel qword fs:0xffffffffcccccccc]
+ mov rax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel qword fs:0xffffffffcccccccc]
+
+ mov al,[es:foo]
+ mov bl,[es:foo]
+ mov ax,[es:foo]
+ mov bx,[es:foo]
+ mov eax,[es:foo]
+ mov ebx,[es:foo]
+ mov rax,[es:foo]
+ mov rbx,[es:foo]
+ mov al,[es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[es:0xaaaaaaaaaaaaaaaa]
+ mov al,[es:0xbbbbbbbb]
+ mov bl,[es:0xbbbbbbbb]
+ mov ax,[es:0xbbbbbbbb]
+ mov bx,[es:0xbbbbbbbb]
+ mov eax,[es:0xbbbbbbbb]
+ mov ebx,[es:0xbbbbbbbb]
+ mov rax,[es:0xbbbbbbbb]
+ mov rbx,[es:0xbbbbbbbb]
+ mov al,[es:0xffffffffcccccccc]
+ mov bl,[es:0xffffffffcccccccc]
+ mov ax,[es:0xffffffffcccccccc]
+ mov bx,[es:0xffffffffcccccccc]
+ mov eax,[es:0xffffffffcccccccc]
+ mov ebx,[es:0xffffffffcccccccc]
+ mov rax,[es:0xffffffffcccccccc]
+ mov rbx,[es:0xffffffffcccccccc]
+
+ mov al,[dword es:foo]
+ mov bl,[dword es:foo]
+ mov ax,[dword es:foo]
+ mov bx,[dword es:foo]
+ mov eax,[dword es:foo]
+ mov ebx,[dword es:foo]
+ mov rax,[dword es:foo]
+ mov rbx,[dword es:foo]
+ mov al,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[dword es:0xbbbbbbbb]
+ mov bl,[dword es:0xbbbbbbbb]
+ mov ax,[dword es:0xbbbbbbbb]
+ mov bx,[dword es:0xbbbbbbbb]
+ mov eax,[dword es:0xbbbbbbbb]
+ mov ebx,[dword es:0xbbbbbbbb]
+ mov rax,[dword es:0xbbbbbbbb]
+ mov rbx,[dword es:0xbbbbbbbb]
+ mov al,[dword es:0xffffffffcccccccc]
+ mov bl,[dword es:0xffffffffcccccccc]
+ mov ax,[dword es:0xffffffffcccccccc]
+ mov bx,[dword es:0xffffffffcccccccc]
+ mov eax,[dword es:0xffffffffcccccccc]
+ mov ebx,[dword es:0xffffffffcccccccc]
+ mov rax,[dword es:0xffffffffcccccccc]
+ mov rbx,[dword es:0xffffffffcccccccc]
+
+ mov al,[qword es:foo]
+ mov bl,[qword es:foo]
+ mov ax,[qword es:foo]
+ mov bx,[qword es:foo]
+ mov eax,[qword es:foo]
+ mov ebx,[qword es:foo]
+ mov rax,[qword es:foo]
+ mov rbx,[qword es:foo]
+ mov al,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[qword es:0xbbbbbbbb]
+ mov bl,[qword es:0xbbbbbbbb]
+ mov ax,[qword es:0xbbbbbbbb]
+ mov bx,[qword es:0xbbbbbbbb]
+ mov eax,[qword es:0xbbbbbbbb]
+ mov ebx,[qword es:0xbbbbbbbb]
+ mov rax,[qword es:0xbbbbbbbb]
+ mov rbx,[qword es:0xbbbbbbbb]
+ mov al,[qword es:0xffffffffcccccccc]
+ mov bl,[qword es:0xffffffffcccccccc]
+ mov ax,[qword es:0xffffffffcccccccc]
+ mov bx,[qword es:0xffffffffcccccccc]
+ mov eax,[qword es:0xffffffffcccccccc]
+ mov ebx,[qword es:0xffffffffcccccccc]
+ mov rax,[qword es:0xffffffffcccccccc]
+ mov rbx,[qword es:0xffffffffcccccccc]
+
+ mov al,[a64 es:foo]
+ mov bl,[a64 es:foo]
+ mov ax,[a64 es:foo]
+ mov bx,[a64 es:foo]
+ mov eax,[a64 es:foo]
+ mov ebx,[a64 es:foo]
+ mov rax,[a64 es:foo]
+ mov rbx,[a64 es:foo]
+ mov al,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 es:0xbbbbbbbb]
+ mov bl,[a64 es:0xbbbbbbbb]
+ mov ax,[a64 es:0xbbbbbbbb]
+ mov bx,[a64 es:0xbbbbbbbb]
+ mov eax,[a64 es:0xbbbbbbbb]
+ mov ebx,[a64 es:0xbbbbbbbb]
+ mov rax,[a64 es:0xbbbbbbbb]
+ mov rbx,[a64 es:0xbbbbbbbb]
+ mov al,[a64 es:0xffffffffcccccccc]
+ mov bl,[a64 es:0xffffffffcccccccc]
+ mov ax,[a64 es:0xffffffffcccccccc]
+ mov bx,[a64 es:0xffffffffcccccccc]
+ mov eax,[a64 es:0xffffffffcccccccc]
+ mov ebx,[a64 es:0xffffffffcccccccc]
+ mov rax,[a64 es:0xffffffffcccccccc]
+ mov rbx,[a64 es:0xffffffffcccccccc]
+
+ mov al,[a64 dword es:foo]
+ mov bl,[a64 dword es:foo]
+ mov ax,[a64 dword es:foo]
+ mov bx,[a64 dword es:foo]
+ mov eax,[a64 dword es:foo]
+ mov ebx,[a64 dword es:foo]
+ mov rax,[a64 dword es:foo]
+ mov rbx,[a64 dword es:foo]
+ mov al,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword es:0xbbbbbbbb]
+ mov bl,[a64 dword es:0xbbbbbbbb]
+ mov ax,[a64 dword es:0xbbbbbbbb]
+ mov bx,[a64 dword es:0xbbbbbbbb]
+ mov eax,[a64 dword es:0xbbbbbbbb]
+ mov ebx,[a64 dword es:0xbbbbbbbb]
+ mov rax,[a64 dword es:0xbbbbbbbb]
+ mov rbx,[a64 dword es:0xbbbbbbbb]
+ mov al,[a64 dword es:0xffffffffcccccccc]
+ mov bl,[a64 dword es:0xffffffffcccccccc]
+ mov ax,[a64 dword es:0xffffffffcccccccc]
+ mov bx,[a64 dword es:0xffffffffcccccccc]
+ mov eax,[a64 dword es:0xffffffffcccccccc]
+ mov ebx,[a64 dword es:0xffffffffcccccccc]
+ mov rax,[a64 dword es:0xffffffffcccccccc]
+ mov rbx,[a64 dword es:0xffffffffcccccccc]
+
+ mov al,[a64 qword es:foo]
+ mov bl,[a64 qword es:foo]
+ mov ax,[a64 qword es:foo]
+ mov bx,[a64 qword es:foo]
+ mov eax,[a64 qword es:foo]
+ mov ebx,[a64 qword es:foo]
+ mov rax,[a64 qword es:foo]
+ mov rbx,[a64 qword es:foo]
+ mov al,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword es:0xbbbbbbbb]
+ mov bl,[a64 qword es:0xbbbbbbbb]
+ mov ax,[a64 qword es:0xbbbbbbbb]
+ mov bx,[a64 qword es:0xbbbbbbbb]
+ mov eax,[a64 qword es:0xbbbbbbbb]
+ mov ebx,[a64 qword es:0xbbbbbbbb]
+ mov rax,[a64 qword es:0xbbbbbbbb]
+ mov rbx,[a64 qword es:0xbbbbbbbb]
+ mov al,[a64 qword es:0xffffffffcccccccc]
+ mov bl,[a64 qword es:0xffffffffcccccccc]
+ mov ax,[a64 qword es:0xffffffffcccccccc]
+ mov bx,[a64 qword es:0xffffffffcccccccc]
+ mov eax,[a64 qword es:0xffffffffcccccccc]
+ mov ebx,[a64 qword es:0xffffffffcccccccc]
+ mov rax,[a64 qword es:0xffffffffcccccccc]
+ mov rbx,[a64 qword es:0xffffffffcccccccc]
+
+ mov al,[a32 es:foo]
+ mov bl,[a32 es:foo]
+ mov ax,[a32 es:foo]
+ mov bx,[a32 es:foo]
+ mov eax,[a32 es:foo]
+ mov ebx,[a32 es:foo]
+ mov rax,[a32 es:foo]
+ mov rbx,[a32 es:foo]
+ mov al,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 es:0xbbbbbbbb]
+ mov bl,[a32 es:0xbbbbbbbb]
+ mov ax,[a32 es:0xbbbbbbbb]
+ mov bx,[a32 es:0xbbbbbbbb]
+ mov eax,[a32 es:0xbbbbbbbb]
+ mov ebx,[a32 es:0xbbbbbbbb]
+ mov rax,[a32 es:0xbbbbbbbb]
+ mov rbx,[a32 es:0xbbbbbbbb]
+ mov al,[a32 es:0xffffffffcccccccc]
+ mov bl,[a32 es:0xffffffffcccccccc]
+ mov ax,[a32 es:0xffffffffcccccccc]
+ mov bx,[a32 es:0xffffffffcccccccc]
+ mov eax,[a32 es:0xffffffffcccccccc]
+ mov ebx,[a32 es:0xffffffffcccccccc]
+ mov rax,[a32 es:0xffffffffcccccccc]
+ mov rbx,[a32 es:0xffffffffcccccccc]
+
+ mov al,[a32 dword es:foo]
+ mov bl,[a32 dword es:foo]
+ mov ax,[a32 dword es:foo]
+ mov bx,[a32 dword es:foo]
+ mov eax,[a32 dword es:foo]
+ mov ebx,[a32 dword es:foo]
+ mov rax,[a32 dword es:foo]
+ mov rbx,[a32 dword es:foo]
+ mov al,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword es:0xbbbbbbbb]
+ mov bl,[a32 dword es:0xbbbbbbbb]
+ mov ax,[a32 dword es:0xbbbbbbbb]
+ mov bx,[a32 dword es:0xbbbbbbbb]
+ mov eax,[a32 dword es:0xbbbbbbbb]
+ mov ebx,[a32 dword es:0xbbbbbbbb]
+ mov rax,[a32 dword es:0xbbbbbbbb]
+ mov rbx,[a32 dword es:0xbbbbbbbb]
+ mov al,[a32 dword es:0xffffffffcccccccc]
+ mov bl,[a32 dword es:0xffffffffcccccccc]
+ mov ax,[a32 dword es:0xffffffffcccccccc]
+ mov bx,[a32 dword es:0xffffffffcccccccc]
+ mov eax,[a32 dword es:0xffffffffcccccccc]
+ mov ebx,[a32 dword es:0xffffffffcccccccc]
+ mov rax,[a32 dword es:0xffffffffcccccccc]
+ mov rbx,[a32 dword es:0xffffffffcccccccc]
+
+ mov al,[a32 qword es:foo]
+ mov bl,[a32 qword es:foo]
+ mov ax,[a32 qword es:foo]
+ mov bx,[a32 qword es:foo]
+ mov eax,[a32 qword es:foo]
+ mov ebx,[a32 qword es:foo]
+ mov rax,[a32 qword es:foo]
+ mov rbx,[a32 qword es:foo]
+ mov al,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword es:0xbbbbbbbb]
+ mov bl,[a32 qword es:0xbbbbbbbb]
+ mov ax,[a32 qword es:0xbbbbbbbb]
+ mov bx,[a32 qword es:0xbbbbbbbb]
+ mov eax,[a32 qword es:0xbbbbbbbb]
+ mov ebx,[a32 qword es:0xbbbbbbbb]
+ mov rax,[a32 qword es:0xbbbbbbbb]
+ mov rbx,[a32 qword es:0xbbbbbbbb]
+ mov al,[a32 qword es:0xffffffffcccccccc]
+ mov bl,[a32 qword es:0xffffffffcccccccc]
+ mov ax,[a32 qword es:0xffffffffcccccccc]
+ mov bx,[a32 qword es:0xffffffffcccccccc]
+ mov eax,[a32 qword es:0xffffffffcccccccc]
+ mov ebx,[a32 qword es:0xffffffffcccccccc]
+ mov rax,[a32 qword es:0xffffffffcccccccc]
+ mov rbx,[a32 qword es:0xffffffffcccccccc]
+
+ mov al,[abs es:foo]
+ mov bl,[abs es:foo]
+ mov ax,[abs es:foo]
+ mov bx,[abs es:foo]
+ mov eax,[abs es:foo]
+ mov ebx,[abs es:foo]
+ mov rax,[abs es:foo]
+ mov rbx,[abs es:foo]
+ mov al,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs es:0xbbbbbbbb]
+ mov bl,[abs es:0xbbbbbbbb]
+ mov ax,[abs es:0xbbbbbbbb]
+ mov bx,[abs es:0xbbbbbbbb]
+ mov eax,[abs es:0xbbbbbbbb]
+ mov ebx,[abs es:0xbbbbbbbb]
+ mov rax,[abs es:0xbbbbbbbb]
+ mov rbx,[abs es:0xbbbbbbbb]
+ mov al,[abs es:0xffffffffcccccccc]
+ mov bl,[abs es:0xffffffffcccccccc]
+ mov ax,[abs es:0xffffffffcccccccc]
+ mov bx,[abs es:0xffffffffcccccccc]
+ mov eax,[abs es:0xffffffffcccccccc]
+ mov ebx,[abs es:0xffffffffcccccccc]
+ mov rax,[abs es:0xffffffffcccccccc]
+ mov rbx,[abs es:0xffffffffcccccccc]
+
+ mov al,[abs dword es:foo]
+ mov bl,[abs dword es:foo]
+ mov ax,[abs dword es:foo]
+ mov bx,[abs dword es:foo]
+ mov eax,[abs dword es:foo]
+ mov ebx,[abs dword es:foo]
+ mov rax,[abs dword es:foo]
+ mov rbx,[abs dword es:foo]
+ mov al,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword es:0xbbbbbbbb]
+ mov bl,[abs dword es:0xbbbbbbbb]
+ mov ax,[abs dword es:0xbbbbbbbb]
+ mov bx,[abs dword es:0xbbbbbbbb]
+ mov eax,[abs dword es:0xbbbbbbbb]
+ mov ebx,[abs dword es:0xbbbbbbbb]
+ mov rax,[abs dword es:0xbbbbbbbb]
+ mov rbx,[abs dword es:0xbbbbbbbb]
+ mov al,[abs dword es:0xffffffffcccccccc]
+ mov bl,[abs dword es:0xffffffffcccccccc]
+ mov ax,[abs dword es:0xffffffffcccccccc]
+ mov bx,[abs dword es:0xffffffffcccccccc]
+ mov eax,[abs dword es:0xffffffffcccccccc]
+ mov ebx,[abs dword es:0xffffffffcccccccc]
+ mov rax,[abs dword es:0xffffffffcccccccc]
+ mov rbx,[abs dword es:0xffffffffcccccccc]
+
+ mov al,[abs qword es:foo]
+ mov bl,[abs qword es:foo]
+ mov ax,[abs qword es:foo]
+ mov bx,[abs qword es:foo]
+ mov eax,[abs qword es:foo]
+ mov ebx,[abs qword es:foo]
+ mov rax,[abs qword es:foo]
+ mov rbx,[abs qword es:foo]
+ mov al,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword es:0xbbbbbbbb]
+ mov bl,[abs qword es:0xbbbbbbbb]
+ mov ax,[abs qword es:0xbbbbbbbb]
+ mov bx,[abs qword es:0xbbbbbbbb]
+ mov eax,[abs qword es:0xbbbbbbbb]
+ mov ebx,[abs qword es:0xbbbbbbbb]
+ mov rax,[abs qword es:0xbbbbbbbb]
+ mov rbx,[abs qword es:0xbbbbbbbb]
+ mov al,[abs qword es:0xffffffffcccccccc]
+ mov bl,[abs qword es:0xffffffffcccccccc]
+ mov ax,[abs qword es:0xffffffffcccccccc]
+ mov bx,[abs qword es:0xffffffffcccccccc]
+ mov eax,[abs qword es:0xffffffffcccccccc]
+ mov ebx,[abs qword es:0xffffffffcccccccc]
+ mov rax,[abs qword es:0xffffffffcccccccc]
+ mov rbx,[abs qword es:0xffffffffcccccccc]
+
+ mov al,[a64 abs es:foo]
+ mov bl,[a64 abs es:foo]
+ mov ax,[a64 abs es:foo]
+ mov bx,[a64 abs es:foo]
+ mov eax,[a64 abs es:foo]
+ mov ebx,[a64 abs es:foo]
+ mov rax,[a64 abs es:foo]
+ mov rbx,[a64 abs es:foo]
+ mov al,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs es:0xbbbbbbbb]
+ mov bl,[a64 abs es:0xbbbbbbbb]
+ mov ax,[a64 abs es:0xbbbbbbbb]
+ mov bx,[a64 abs es:0xbbbbbbbb]
+ mov eax,[a64 abs es:0xbbbbbbbb]
+ mov ebx,[a64 abs es:0xbbbbbbbb]
+ mov rax,[a64 abs es:0xbbbbbbbb]
+ mov rbx,[a64 abs es:0xbbbbbbbb]
+ mov al,[a64 abs es:0xffffffffcccccccc]
+ mov bl,[a64 abs es:0xffffffffcccccccc]
+ mov ax,[a64 abs es:0xffffffffcccccccc]
+ mov bx,[a64 abs es:0xffffffffcccccccc]
+ mov eax,[a64 abs es:0xffffffffcccccccc]
+ mov ebx,[a64 abs es:0xffffffffcccccccc]
+ mov rax,[a64 abs es:0xffffffffcccccccc]
+ mov rbx,[a64 abs es:0xffffffffcccccccc]
+
+ mov al,[a64 abs dword es:foo]
+ mov bl,[a64 abs dword es:foo]
+ mov ax,[a64 abs dword es:foo]
+ mov bx,[a64 abs dword es:foo]
+ mov eax,[a64 abs dword es:foo]
+ mov ebx,[a64 abs dword es:foo]
+ mov rax,[a64 abs dword es:foo]
+ mov rbx,[a64 abs dword es:foo]
+ mov al,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword es:0xbbbbbbbb]
+ mov bl,[a64 abs dword es:0xbbbbbbbb]
+ mov ax,[a64 abs dword es:0xbbbbbbbb]
+ mov bx,[a64 abs dword es:0xbbbbbbbb]
+ mov eax,[a64 abs dword es:0xbbbbbbbb]
+ mov ebx,[a64 abs dword es:0xbbbbbbbb]
+ mov rax,[a64 abs dword es:0xbbbbbbbb]
+ mov rbx,[a64 abs dword es:0xbbbbbbbb]
+ mov al,[a64 abs dword es:0xffffffffcccccccc]
+ mov bl,[a64 abs dword es:0xffffffffcccccccc]
+ mov ax,[a64 abs dword es:0xffffffffcccccccc]
+ mov bx,[a64 abs dword es:0xffffffffcccccccc]
+ mov eax,[a64 abs dword es:0xffffffffcccccccc]
+ mov ebx,[a64 abs dword es:0xffffffffcccccccc]
+ mov rax,[a64 abs dword es:0xffffffffcccccccc]
+ mov rbx,[a64 abs dword es:0xffffffffcccccccc]
+
+ mov al,[a64 abs qword es:foo]
+ mov bl,[a64 abs qword es:foo]
+ mov ax,[a64 abs qword es:foo]
+ mov bx,[a64 abs qword es:foo]
+ mov eax,[a64 abs qword es:foo]
+ mov ebx,[a64 abs qword es:foo]
+ mov rax,[a64 abs qword es:foo]
+ mov rbx,[a64 abs qword es:foo]
+ mov al,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword es:0xbbbbbbbb]
+ mov bl,[a64 abs qword es:0xbbbbbbbb]
+ mov ax,[a64 abs qword es:0xbbbbbbbb]
+ mov bx,[a64 abs qword es:0xbbbbbbbb]
+ mov eax,[a64 abs qword es:0xbbbbbbbb]
+ mov ebx,[a64 abs qword es:0xbbbbbbbb]
+ mov rax,[a64 abs qword es:0xbbbbbbbb]
+ mov rbx,[a64 abs qword es:0xbbbbbbbb]
+ mov al,[a64 abs qword es:0xffffffffcccccccc]
+ mov bl,[a64 abs qword es:0xffffffffcccccccc]
+ mov ax,[a64 abs qword es:0xffffffffcccccccc]
+ mov bx,[a64 abs qword es:0xffffffffcccccccc]
+ mov eax,[a64 abs qword es:0xffffffffcccccccc]
+ mov ebx,[a64 abs qword es:0xffffffffcccccccc]
+ mov rax,[a64 abs qword es:0xffffffffcccccccc]
+ mov rbx,[a64 abs qword es:0xffffffffcccccccc]
+
+ mov al,[a32 abs es:foo]
+ mov bl,[a32 abs es:foo]
+ mov ax,[a32 abs es:foo]
+ mov bx,[a32 abs es:foo]
+ mov eax,[a32 abs es:foo]
+ mov ebx,[a32 abs es:foo]
+ mov rax,[a32 abs es:foo]
+ mov rbx,[a32 abs es:foo]
+ mov al,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs es:0xbbbbbbbb]
+ mov bl,[a32 abs es:0xbbbbbbbb]
+ mov ax,[a32 abs es:0xbbbbbbbb]
+ mov bx,[a32 abs es:0xbbbbbbbb]
+ mov eax,[a32 abs es:0xbbbbbbbb]
+ mov ebx,[a32 abs es:0xbbbbbbbb]
+ mov rax,[a32 abs es:0xbbbbbbbb]
+ mov rbx,[a32 abs es:0xbbbbbbbb]
+ mov al,[a32 abs es:0xffffffffcccccccc]
+ mov bl,[a32 abs es:0xffffffffcccccccc]
+ mov ax,[a32 abs es:0xffffffffcccccccc]
+ mov bx,[a32 abs es:0xffffffffcccccccc]
+ mov eax,[a32 abs es:0xffffffffcccccccc]
+ mov ebx,[a32 abs es:0xffffffffcccccccc]
+ mov rax,[a32 abs es:0xffffffffcccccccc]
+ mov rbx,[a32 abs es:0xffffffffcccccccc]
+
+ mov al,[a32 abs dword es:foo]
+ mov bl,[a32 abs dword es:foo]
+ mov ax,[a32 abs dword es:foo]
+ mov bx,[a32 abs dword es:foo]
+ mov eax,[a32 abs dword es:foo]
+ mov ebx,[a32 abs dword es:foo]
+ mov rax,[a32 abs dword es:foo]
+ mov rbx,[a32 abs dword es:foo]
+ mov al,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword es:0xbbbbbbbb]
+ mov bl,[a32 abs dword es:0xbbbbbbbb]
+ mov ax,[a32 abs dword es:0xbbbbbbbb]
+ mov bx,[a32 abs dword es:0xbbbbbbbb]
+ mov eax,[a32 abs dword es:0xbbbbbbbb]
+ mov ebx,[a32 abs dword es:0xbbbbbbbb]
+ mov rax,[a32 abs dword es:0xbbbbbbbb]
+ mov rbx,[a32 abs dword es:0xbbbbbbbb]
+ mov al,[a32 abs dword es:0xffffffffcccccccc]
+ mov bl,[a32 abs dword es:0xffffffffcccccccc]
+ mov ax,[a32 abs dword es:0xffffffffcccccccc]
+ mov bx,[a32 abs dword es:0xffffffffcccccccc]
+ mov eax,[a32 abs dword es:0xffffffffcccccccc]
+ mov ebx,[a32 abs dword es:0xffffffffcccccccc]
+ mov rax,[a32 abs dword es:0xffffffffcccccccc]
+ mov rbx,[a32 abs dword es:0xffffffffcccccccc]
+
+ mov al,[a32 abs qword es:foo]
+ mov bl,[a32 abs qword es:foo]
+ mov ax,[a32 abs qword es:foo]
+ mov bx,[a32 abs qword es:foo]
+ mov eax,[a32 abs qword es:foo]
+ mov ebx,[a32 abs qword es:foo]
+ mov rax,[a32 abs qword es:foo]
+ mov rbx,[a32 abs qword es:foo]
+ mov al,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword es:0xbbbbbbbb]
+ mov bl,[a32 abs qword es:0xbbbbbbbb]
+ mov ax,[a32 abs qword es:0xbbbbbbbb]
+ mov bx,[a32 abs qword es:0xbbbbbbbb]
+ mov eax,[a32 abs qword es:0xbbbbbbbb]
+ mov ebx,[a32 abs qword es:0xbbbbbbbb]
+ mov rax,[a32 abs qword es:0xbbbbbbbb]
+ mov rbx,[a32 abs qword es:0xbbbbbbbb]
+ mov al,[a32 abs qword es:0xffffffffcccccccc]
+ mov bl,[a32 abs qword es:0xffffffffcccccccc]
+ mov ax,[a32 abs qword es:0xffffffffcccccccc]
+ mov bx,[a32 abs qword es:0xffffffffcccccccc]
+ mov eax,[a32 abs qword es:0xffffffffcccccccc]
+ mov ebx,[a32 abs qword es:0xffffffffcccccccc]
+ mov rax,[a32 abs qword es:0xffffffffcccccccc]
+ mov rbx,[a32 abs qword es:0xffffffffcccccccc]
+
+ mov al,[rel es:foo]
+ mov bl,[rel es:foo]
+ mov ax,[rel es:foo]
+ mov bx,[rel es:foo]
+ mov eax,[rel es:foo]
+ mov ebx,[rel es:foo]
+ mov rax,[rel es:foo]
+ mov rbx,[rel es:foo]
+ mov al,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel es:0xbbbbbbbb]
+ mov bl,[rel es:0xbbbbbbbb]
+ mov ax,[rel es:0xbbbbbbbb]
+ mov bx,[rel es:0xbbbbbbbb]
+ mov eax,[rel es:0xbbbbbbbb]
+ mov ebx,[rel es:0xbbbbbbbb]
+ mov rax,[rel es:0xbbbbbbbb]
+ mov rbx,[rel es:0xbbbbbbbb]
+ mov al,[rel es:0xffffffffcccccccc]
+ mov bl,[rel es:0xffffffffcccccccc]
+ mov ax,[rel es:0xffffffffcccccccc]
+ mov bx,[rel es:0xffffffffcccccccc]
+ mov eax,[rel es:0xffffffffcccccccc]
+ mov ebx,[rel es:0xffffffffcccccccc]
+ mov rax,[rel es:0xffffffffcccccccc]
+ mov rbx,[rel es:0xffffffffcccccccc]
+
+ mov al,[rel dword es:foo]
+ mov bl,[rel dword es:foo]
+ mov ax,[rel dword es:foo]
+ mov bx,[rel dword es:foo]
+ mov eax,[rel dword es:foo]
+ mov ebx,[rel dword es:foo]
+ mov rax,[rel dword es:foo]
+ mov rbx,[rel dword es:foo]
+ mov al,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword es:0xbbbbbbbb]
+ mov bl,[rel dword es:0xbbbbbbbb]
+ mov ax,[rel dword es:0xbbbbbbbb]
+ mov bx,[rel dword es:0xbbbbbbbb]
+ mov eax,[rel dword es:0xbbbbbbbb]
+ mov ebx,[rel dword es:0xbbbbbbbb]
+ mov rax,[rel dword es:0xbbbbbbbb]
+ mov rbx,[rel dword es:0xbbbbbbbb]
+ mov al,[rel dword es:0xffffffffcccccccc]
+ mov bl,[rel dword es:0xffffffffcccccccc]
+ mov ax,[rel dword es:0xffffffffcccccccc]
+ mov bx,[rel dword es:0xffffffffcccccccc]
+ mov eax,[rel dword es:0xffffffffcccccccc]
+ mov ebx,[rel dword es:0xffffffffcccccccc]
+ mov rax,[rel dword es:0xffffffffcccccccc]
+ mov rbx,[rel dword es:0xffffffffcccccccc]
+
+ mov al,[rel qword es:foo]
+ mov bl,[rel qword es:foo]
+ mov ax,[rel qword es:foo]
+ mov bx,[rel qword es:foo]
+ mov eax,[rel qword es:foo]
+ mov ebx,[rel qword es:foo]
+ mov rax,[rel qword es:foo]
+ mov rbx,[rel qword es:foo]
+ mov al,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword es:0xbbbbbbbb]
+ mov bl,[rel qword es:0xbbbbbbbb]
+ mov ax,[rel qword es:0xbbbbbbbb]
+ mov bx,[rel qword es:0xbbbbbbbb]
+ mov eax,[rel qword es:0xbbbbbbbb]
+ mov ebx,[rel qword es:0xbbbbbbbb]
+ mov rax,[rel qword es:0xbbbbbbbb]
+ mov rbx,[rel qword es:0xbbbbbbbb]
+ mov al,[rel qword es:0xffffffffcccccccc]
+ mov bl,[rel qword es:0xffffffffcccccccc]
+ mov ax,[rel qword es:0xffffffffcccccccc]
+ mov bx,[rel qword es:0xffffffffcccccccc]
+ mov eax,[rel qword es:0xffffffffcccccccc]
+ mov ebx,[rel qword es:0xffffffffcccccccc]
+ mov rax,[rel qword es:0xffffffffcccccccc]
+ mov rbx,[rel qword es:0xffffffffcccccccc]
+
+ mov al,[a64 rel es:foo]
+ mov bl,[a64 rel es:foo]
+ mov ax,[a64 rel es:foo]
+ mov bx,[a64 rel es:foo]
+ mov eax,[a64 rel es:foo]
+ mov ebx,[a64 rel es:foo]
+ mov rax,[a64 rel es:foo]
+ mov rbx,[a64 rel es:foo]
+ mov al,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel es:0xbbbbbbbb]
+ mov bl,[a64 rel es:0xbbbbbbbb]
+ mov ax,[a64 rel es:0xbbbbbbbb]
+ mov bx,[a64 rel es:0xbbbbbbbb]
+ mov eax,[a64 rel es:0xbbbbbbbb]
+ mov ebx,[a64 rel es:0xbbbbbbbb]
+ mov rax,[a64 rel es:0xbbbbbbbb]
+ mov rbx,[a64 rel es:0xbbbbbbbb]
+ mov al,[a64 rel es:0xffffffffcccccccc]
+ mov bl,[a64 rel es:0xffffffffcccccccc]
+ mov ax,[a64 rel es:0xffffffffcccccccc]
+ mov bx,[a64 rel es:0xffffffffcccccccc]
+ mov eax,[a64 rel es:0xffffffffcccccccc]
+ mov ebx,[a64 rel es:0xffffffffcccccccc]
+ mov rax,[a64 rel es:0xffffffffcccccccc]
+ mov rbx,[a64 rel es:0xffffffffcccccccc]
+
+ mov al,[a64 rel dword es:foo]
+ mov bl,[a64 rel dword es:foo]
+ mov ax,[a64 rel dword es:foo]
+ mov bx,[a64 rel dword es:foo]
+ mov eax,[a64 rel dword es:foo]
+ mov ebx,[a64 rel dword es:foo]
+ mov rax,[a64 rel dword es:foo]
+ mov rbx,[a64 rel dword es:foo]
+ mov al,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword es:0xbbbbbbbb]
+ mov bl,[a64 rel dword es:0xbbbbbbbb]
+ mov ax,[a64 rel dword es:0xbbbbbbbb]
+ mov bx,[a64 rel dword es:0xbbbbbbbb]
+ mov eax,[a64 rel dword es:0xbbbbbbbb]
+ mov ebx,[a64 rel dword es:0xbbbbbbbb]
+ mov rax,[a64 rel dword es:0xbbbbbbbb]
+ mov rbx,[a64 rel dword es:0xbbbbbbbb]
+ mov al,[a64 rel dword es:0xffffffffcccccccc]
+ mov bl,[a64 rel dword es:0xffffffffcccccccc]
+ mov ax,[a64 rel dword es:0xffffffffcccccccc]
+ mov bx,[a64 rel dword es:0xffffffffcccccccc]
+ mov eax,[a64 rel dword es:0xffffffffcccccccc]
+ mov ebx,[a64 rel dword es:0xffffffffcccccccc]
+ mov rax,[a64 rel dword es:0xffffffffcccccccc]
+ mov rbx,[a64 rel dword es:0xffffffffcccccccc]
+
+ mov al,[a64 rel qword es:foo]
+ mov bl,[a64 rel qword es:foo]
+ mov ax,[a64 rel qword es:foo]
+ mov bx,[a64 rel qword es:foo]
+ mov eax,[a64 rel qword es:foo]
+ mov ebx,[a64 rel qword es:foo]
+ mov rax,[a64 rel qword es:foo]
+ mov rbx,[a64 rel qword es:foo]
+ mov al,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword es:0xbbbbbbbb]
+ mov bl,[a64 rel qword es:0xbbbbbbbb]
+ mov ax,[a64 rel qword es:0xbbbbbbbb]
+ mov bx,[a64 rel qword es:0xbbbbbbbb]
+ mov eax,[a64 rel qword es:0xbbbbbbbb]
+ mov ebx,[a64 rel qword es:0xbbbbbbbb]
+ mov rax,[a64 rel qword es:0xbbbbbbbb]
+ mov rbx,[a64 rel qword es:0xbbbbbbbb]
+ mov al,[a64 rel qword es:0xffffffffcccccccc]
+ mov bl,[a64 rel qword es:0xffffffffcccccccc]
+ mov ax,[a64 rel qword es:0xffffffffcccccccc]
+ mov bx,[a64 rel qword es:0xffffffffcccccccc]
+ mov eax,[a64 rel qword es:0xffffffffcccccccc]
+ mov ebx,[a64 rel qword es:0xffffffffcccccccc]
+ mov rax,[a64 rel qword es:0xffffffffcccccccc]
+ mov rbx,[a64 rel qword es:0xffffffffcccccccc]
+
+ mov al,[a32 rel es:foo]
+ mov bl,[a32 rel es:foo]
+ mov ax,[a32 rel es:foo]
+ mov bx,[a32 rel es:foo]
+ mov eax,[a32 rel es:foo]
+ mov ebx,[a32 rel es:foo]
+ mov rax,[a32 rel es:foo]
+ mov rbx,[a32 rel es:foo]
+ mov al,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel es:0xbbbbbbbb]
+ mov bl,[a32 rel es:0xbbbbbbbb]
+ mov ax,[a32 rel es:0xbbbbbbbb]
+ mov bx,[a32 rel es:0xbbbbbbbb]
+ mov eax,[a32 rel es:0xbbbbbbbb]
+ mov ebx,[a32 rel es:0xbbbbbbbb]
+ mov rax,[a32 rel es:0xbbbbbbbb]
+ mov rbx,[a32 rel es:0xbbbbbbbb]
+ mov al,[a32 rel es:0xffffffffcccccccc]
+ mov bl,[a32 rel es:0xffffffffcccccccc]
+ mov ax,[a32 rel es:0xffffffffcccccccc]
+ mov bx,[a32 rel es:0xffffffffcccccccc]
+ mov eax,[a32 rel es:0xffffffffcccccccc]
+ mov ebx,[a32 rel es:0xffffffffcccccccc]
+ mov rax,[a32 rel es:0xffffffffcccccccc]
+ mov rbx,[a32 rel es:0xffffffffcccccccc]
+
+ mov al,[a32 rel dword es:foo]
+ mov bl,[a32 rel dword es:foo]
+ mov ax,[a32 rel dword es:foo]
+ mov bx,[a32 rel dword es:foo]
+ mov eax,[a32 rel dword es:foo]
+ mov ebx,[a32 rel dword es:foo]
+ mov rax,[a32 rel dword es:foo]
+ mov rbx,[a32 rel dword es:foo]
+ mov al,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword es:0xbbbbbbbb]
+ mov bl,[a32 rel dword es:0xbbbbbbbb]
+ mov ax,[a32 rel dword es:0xbbbbbbbb]
+ mov bx,[a32 rel dword es:0xbbbbbbbb]
+ mov eax,[a32 rel dword es:0xbbbbbbbb]
+ mov ebx,[a32 rel dword es:0xbbbbbbbb]
+ mov rax,[a32 rel dword es:0xbbbbbbbb]
+ mov rbx,[a32 rel dword es:0xbbbbbbbb]
+ mov al,[a32 rel dword es:0xffffffffcccccccc]
+ mov bl,[a32 rel dword es:0xffffffffcccccccc]
+ mov ax,[a32 rel dword es:0xffffffffcccccccc]
+ mov bx,[a32 rel dword es:0xffffffffcccccccc]
+ mov eax,[a32 rel dword es:0xffffffffcccccccc]
+ mov ebx,[a32 rel dword es:0xffffffffcccccccc]
+ mov rax,[a32 rel dword es:0xffffffffcccccccc]
+ mov rbx,[a32 rel dword es:0xffffffffcccccccc]
+
+ mov al,[a32 rel qword es:foo]
+ mov bl,[a32 rel qword es:foo]
+ mov ax,[a32 rel qword es:foo]
+ mov bx,[a32 rel qword es:foo]
+ mov eax,[a32 rel qword es:foo]
+ mov ebx,[a32 rel qword es:foo]
+ mov rax,[a32 rel qword es:foo]
+ mov rbx,[a32 rel qword es:foo]
+ mov al,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword es:0xbbbbbbbb]
+ mov bl,[a32 rel qword es:0xbbbbbbbb]
+ mov ax,[a32 rel qword es:0xbbbbbbbb]
+ mov bx,[a32 rel qword es:0xbbbbbbbb]
+ mov eax,[a32 rel qword es:0xbbbbbbbb]
+ mov ebx,[a32 rel qword es:0xbbbbbbbb]
+ mov rax,[a32 rel qword es:0xbbbbbbbb]
+ mov rbx,[a32 rel qword es:0xbbbbbbbb]
+ mov al,[a32 rel qword es:0xffffffffcccccccc]
+ mov bl,[a32 rel qword es:0xffffffffcccccccc]
+ mov ax,[a32 rel qword es:0xffffffffcccccccc]
+ mov bx,[a32 rel qword es:0xffffffffcccccccc]
+ mov eax,[a32 rel qword es:0xffffffffcccccccc]
+ mov ebx,[a32 rel qword es:0xffffffffcccccccc]
+ mov rax,[a32 rel qword es:0xffffffffcccccccc]
+ mov rbx,[a32 rel qword es:0xffffffffcccccccc]
+
+
+ default rel
+
+ mov al,[foo]
+ mov bl,[foo]
+ mov ax,[foo]
+ mov bx,[foo]
+ mov eax,[foo]
+ mov ebx,[foo]
+ mov rax,[foo]
+ mov rbx,[foo]
+ mov al,[0xaaaaaaaaaaaaaaaa]
+ mov bl,[0xaaaaaaaaaaaaaaaa]
+ mov ax,[0xaaaaaaaaaaaaaaaa]
+ mov bx,[0xaaaaaaaaaaaaaaaa]
+ mov eax,[0xaaaaaaaaaaaaaaaa]
+ mov ebx,[0xaaaaaaaaaaaaaaaa]
+ mov rax,[0xaaaaaaaaaaaaaaaa]
+ mov rbx,[0xaaaaaaaaaaaaaaaa]
+ mov al,[0xbbbbbbbb]
+ mov bl,[0xbbbbbbbb]
+ mov ax,[0xbbbbbbbb]
+ mov bx,[0xbbbbbbbb]
+ mov eax,[0xbbbbbbbb]
+ mov ebx,[0xbbbbbbbb]
+ mov rax,[0xbbbbbbbb]
+ mov rbx,[0xbbbbbbbb]
+ mov al,[0xffffffffcccccccc]
+ mov bl,[0xffffffffcccccccc]
+ mov ax,[0xffffffffcccccccc]
+ mov bx,[0xffffffffcccccccc]
+ mov eax,[0xffffffffcccccccc]
+ mov ebx,[0xffffffffcccccccc]
+ mov rax,[0xffffffffcccccccc]
+ mov rbx,[0xffffffffcccccccc]
+
+ mov al,[dword foo]
+ mov bl,[dword foo]
+ mov ax,[dword foo]
+ mov bx,[dword foo]
+ mov eax,[dword foo]
+ mov ebx,[dword foo]
+ mov rax,[dword foo]
+ mov rbx,[dword foo]
+ mov al,[dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[dword 0xbbbbbbbb]
+ mov bl,[dword 0xbbbbbbbb]
+ mov ax,[dword 0xbbbbbbbb]
+ mov bx,[dword 0xbbbbbbbb]
+ mov eax,[dword 0xbbbbbbbb]
+ mov ebx,[dword 0xbbbbbbbb]
+ mov rax,[dword 0xbbbbbbbb]
+ mov rbx,[dword 0xbbbbbbbb]
+ mov al,[dword 0xffffffffcccccccc]
+ mov bl,[dword 0xffffffffcccccccc]
+ mov ax,[dword 0xffffffffcccccccc]
+ mov bx,[dword 0xffffffffcccccccc]
+ mov eax,[dword 0xffffffffcccccccc]
+ mov ebx,[dword 0xffffffffcccccccc]
+ mov rax,[dword 0xffffffffcccccccc]
+ mov rbx,[dword 0xffffffffcccccccc]
+
+ mov al,[qword foo]
+ mov bl,[qword foo]
+ mov ax,[qword foo]
+ mov bx,[qword foo]
+ mov eax,[qword foo]
+ mov ebx,[qword foo]
+ mov rax,[qword foo]
+ mov rbx,[qword foo]
+ mov al,[qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[qword 0xbbbbbbbb]
+ mov bl,[qword 0xbbbbbbbb]
+ mov ax,[qword 0xbbbbbbbb]
+ mov bx,[qword 0xbbbbbbbb]
+ mov eax,[qword 0xbbbbbbbb]
+ mov ebx,[qword 0xbbbbbbbb]
+ mov rax,[qword 0xbbbbbbbb]
+ mov rbx,[qword 0xbbbbbbbb]
+ mov al,[qword 0xffffffffcccccccc]
+ mov bl,[qword 0xffffffffcccccccc]
+ mov ax,[qword 0xffffffffcccccccc]
+ mov bx,[qword 0xffffffffcccccccc]
+ mov eax,[qword 0xffffffffcccccccc]
+ mov ebx,[qword 0xffffffffcccccccc]
+ mov rax,[qword 0xffffffffcccccccc]
+ mov rbx,[qword 0xffffffffcccccccc]
+
+ mov al,[a64 foo]
+ mov bl,[a64 foo]
+ mov ax,[a64 foo]
+ mov bx,[a64 foo]
+ mov eax,[a64 foo]
+ mov ebx,[a64 foo]
+ mov rax,[a64 foo]
+ mov rbx,[a64 foo]
+ mov al,[a64 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 0xbbbbbbbb]
+ mov bl,[a64 0xbbbbbbbb]
+ mov ax,[a64 0xbbbbbbbb]
+ mov bx,[a64 0xbbbbbbbb]
+ mov eax,[a64 0xbbbbbbbb]
+ mov ebx,[a64 0xbbbbbbbb]
+ mov rax,[a64 0xbbbbbbbb]
+ mov rbx,[a64 0xbbbbbbbb]
+ mov al,[a64 0xffffffffcccccccc]
+ mov bl,[a64 0xffffffffcccccccc]
+ mov ax,[a64 0xffffffffcccccccc]
+ mov bx,[a64 0xffffffffcccccccc]
+ mov eax,[a64 0xffffffffcccccccc]
+ mov ebx,[a64 0xffffffffcccccccc]
+ mov rax,[a64 0xffffffffcccccccc]
+ mov rbx,[a64 0xffffffffcccccccc]
+
+ mov al,[a64 dword foo]
+ mov bl,[a64 dword foo]
+ mov ax,[a64 dword foo]
+ mov bx,[a64 dword foo]
+ mov eax,[a64 dword foo]
+ mov ebx,[a64 dword foo]
+ mov rax,[a64 dword foo]
+ mov rbx,[a64 dword foo]
+ mov al,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword 0xbbbbbbbb]
+ mov bl,[a64 dword 0xbbbbbbbb]
+ mov ax,[a64 dword 0xbbbbbbbb]
+ mov bx,[a64 dword 0xbbbbbbbb]
+ mov eax,[a64 dword 0xbbbbbbbb]
+ mov ebx,[a64 dword 0xbbbbbbbb]
+ mov rax,[a64 dword 0xbbbbbbbb]
+ mov rbx,[a64 dword 0xbbbbbbbb]
+ mov al,[a64 dword 0xffffffffcccccccc]
+ mov bl,[a64 dword 0xffffffffcccccccc]
+ mov ax,[a64 dword 0xffffffffcccccccc]
+ mov bx,[a64 dword 0xffffffffcccccccc]
+ mov eax,[a64 dword 0xffffffffcccccccc]
+ mov ebx,[a64 dword 0xffffffffcccccccc]
+ mov rax,[a64 dword 0xffffffffcccccccc]
+ mov rbx,[a64 dword 0xffffffffcccccccc]
+
+ mov al,[a64 qword foo]
+ mov bl,[a64 qword foo]
+ mov ax,[a64 qword foo]
+ mov bx,[a64 qword foo]
+ mov eax,[a64 qword foo]
+ mov ebx,[a64 qword foo]
+ mov rax,[a64 qword foo]
+ mov rbx,[a64 qword foo]
+ mov al,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword 0xbbbbbbbb]
+ mov bl,[a64 qword 0xbbbbbbbb]
+ mov ax,[a64 qword 0xbbbbbbbb]
+ mov bx,[a64 qword 0xbbbbbbbb]
+ mov eax,[a64 qword 0xbbbbbbbb]
+ mov ebx,[a64 qword 0xbbbbbbbb]
+ mov rax,[a64 qword 0xbbbbbbbb]
+ mov rbx,[a64 qword 0xbbbbbbbb]
+ mov al,[a64 qword 0xffffffffcccccccc]
+ mov bl,[a64 qword 0xffffffffcccccccc]
+ mov ax,[a64 qword 0xffffffffcccccccc]
+ mov bx,[a64 qword 0xffffffffcccccccc]
+ mov eax,[a64 qword 0xffffffffcccccccc]
+ mov ebx,[a64 qword 0xffffffffcccccccc]
+ mov rax,[a64 qword 0xffffffffcccccccc]
+ mov rbx,[a64 qword 0xffffffffcccccccc]
+
+ mov al,[a32 foo]
+ mov bl,[a32 foo]
+ mov ax,[a32 foo]
+ mov bx,[a32 foo]
+ mov eax,[a32 foo]
+ mov ebx,[a32 foo]
+ mov rax,[a32 foo]
+ mov rbx,[a32 foo]
+ mov al,[a32 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 0xbbbbbbbb]
+ mov bl,[a32 0xbbbbbbbb]
+ mov ax,[a32 0xbbbbbbbb]
+ mov bx,[a32 0xbbbbbbbb]
+ mov eax,[a32 0xbbbbbbbb]
+ mov ebx,[a32 0xbbbbbbbb]
+ mov rax,[a32 0xbbbbbbbb]
+ mov rbx,[a32 0xbbbbbbbb]
+ mov al,[a32 0xffffffffcccccccc]
+ mov bl,[a32 0xffffffffcccccccc]
+ mov ax,[a32 0xffffffffcccccccc]
+ mov bx,[a32 0xffffffffcccccccc]
+ mov eax,[a32 0xffffffffcccccccc]
+ mov ebx,[a32 0xffffffffcccccccc]
+ mov rax,[a32 0xffffffffcccccccc]
+ mov rbx,[a32 0xffffffffcccccccc]
+
+ mov al,[a32 dword foo]
+ mov bl,[a32 dword foo]
+ mov ax,[a32 dword foo]
+ mov bx,[a32 dword foo]
+ mov eax,[a32 dword foo]
+ mov ebx,[a32 dword foo]
+ mov rax,[a32 dword foo]
+ mov rbx,[a32 dword foo]
+ mov al,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword 0xbbbbbbbb]
+ mov bl,[a32 dword 0xbbbbbbbb]
+ mov ax,[a32 dword 0xbbbbbbbb]
+ mov bx,[a32 dword 0xbbbbbbbb]
+ mov eax,[a32 dword 0xbbbbbbbb]
+ mov ebx,[a32 dword 0xbbbbbbbb]
+ mov rax,[a32 dword 0xbbbbbbbb]
+ mov rbx,[a32 dword 0xbbbbbbbb]
+ mov al,[a32 dword 0xffffffffcccccccc]
+ mov bl,[a32 dword 0xffffffffcccccccc]
+ mov ax,[a32 dword 0xffffffffcccccccc]
+ mov bx,[a32 dword 0xffffffffcccccccc]
+ mov eax,[a32 dword 0xffffffffcccccccc]
+ mov ebx,[a32 dword 0xffffffffcccccccc]
+ mov rax,[a32 dword 0xffffffffcccccccc]
+ mov rbx,[a32 dword 0xffffffffcccccccc]
+
+ mov al,[a32 qword foo]
+ mov bl,[a32 qword foo]
+ mov ax,[a32 qword foo]
+ mov bx,[a32 qword foo]
+ mov eax,[a32 qword foo]
+ mov ebx,[a32 qword foo]
+ mov rax,[a32 qword foo]
+ mov rbx,[a32 qword foo]
+ mov al,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword 0xbbbbbbbb]
+ mov bl,[a32 qword 0xbbbbbbbb]
+ mov ax,[a32 qword 0xbbbbbbbb]
+ mov bx,[a32 qword 0xbbbbbbbb]
+ mov eax,[a32 qword 0xbbbbbbbb]
+ mov ebx,[a32 qword 0xbbbbbbbb]
+ mov rax,[a32 qword 0xbbbbbbbb]
+ mov rbx,[a32 qword 0xbbbbbbbb]
+ mov al,[a32 qword 0xffffffffcccccccc]
+ mov bl,[a32 qword 0xffffffffcccccccc]
+ mov ax,[a32 qword 0xffffffffcccccccc]
+ mov bx,[a32 qword 0xffffffffcccccccc]
+ mov eax,[a32 qword 0xffffffffcccccccc]
+ mov ebx,[a32 qword 0xffffffffcccccccc]
+ mov rax,[a32 qword 0xffffffffcccccccc]
+ mov rbx,[a32 qword 0xffffffffcccccccc]
+
+ mov al,[abs foo]
+ mov bl,[abs foo]
+ mov ax,[abs foo]
+ mov bx,[abs foo]
+ mov eax,[abs foo]
+ mov ebx,[abs foo]
+ mov rax,[abs foo]
+ mov rbx,[abs foo]
+ mov al,[abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs 0xbbbbbbbb]
+ mov bl,[abs 0xbbbbbbbb]
+ mov ax,[abs 0xbbbbbbbb]
+ mov bx,[abs 0xbbbbbbbb]
+ mov eax,[abs 0xbbbbbbbb]
+ mov ebx,[abs 0xbbbbbbbb]
+ mov rax,[abs 0xbbbbbbbb]
+ mov rbx,[abs 0xbbbbbbbb]
+ mov al,[abs 0xffffffffcccccccc]
+ mov bl,[abs 0xffffffffcccccccc]
+ mov ax,[abs 0xffffffffcccccccc]
+ mov bx,[abs 0xffffffffcccccccc]
+ mov eax,[abs 0xffffffffcccccccc]
+ mov ebx,[abs 0xffffffffcccccccc]
+ mov rax,[abs 0xffffffffcccccccc]
+ mov rbx,[abs 0xffffffffcccccccc]
+
+ mov al,[abs dword foo]
+ mov bl,[abs dword foo]
+ mov ax,[abs dword foo]
+ mov bx,[abs dword foo]
+ mov eax,[abs dword foo]
+ mov ebx,[abs dword foo]
+ mov rax,[abs dword foo]
+ mov rbx,[abs dword foo]
+ mov al,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword 0xbbbbbbbb]
+ mov bl,[abs dword 0xbbbbbbbb]
+ mov ax,[abs dword 0xbbbbbbbb]
+ mov bx,[abs dword 0xbbbbbbbb]
+ mov eax,[abs dword 0xbbbbbbbb]
+ mov ebx,[abs dword 0xbbbbbbbb]
+ mov rax,[abs dword 0xbbbbbbbb]
+ mov rbx,[abs dword 0xbbbbbbbb]
+ mov al,[abs dword 0xffffffffcccccccc]
+ mov bl,[abs dword 0xffffffffcccccccc]
+ mov ax,[abs dword 0xffffffffcccccccc]
+ mov bx,[abs dword 0xffffffffcccccccc]
+ mov eax,[abs dword 0xffffffffcccccccc]
+ mov ebx,[abs dword 0xffffffffcccccccc]
+ mov rax,[abs dword 0xffffffffcccccccc]
+ mov rbx,[abs dword 0xffffffffcccccccc]
+
+ mov al,[abs qword foo]
+ mov bl,[abs qword foo]
+ mov ax,[abs qword foo]
+ mov bx,[abs qword foo]
+ mov eax,[abs qword foo]
+ mov ebx,[abs qword foo]
+ mov rax,[abs qword foo]
+ mov rbx,[abs qword foo]
+ mov al,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword 0xbbbbbbbb]
+ mov bl,[abs qword 0xbbbbbbbb]
+ mov ax,[abs qword 0xbbbbbbbb]
+ mov bx,[abs qword 0xbbbbbbbb]
+ mov eax,[abs qword 0xbbbbbbbb]
+ mov ebx,[abs qword 0xbbbbbbbb]
+ mov rax,[abs qword 0xbbbbbbbb]
+ mov rbx,[abs qword 0xbbbbbbbb]
+ mov al,[abs qword 0xffffffffcccccccc]
+ mov bl,[abs qword 0xffffffffcccccccc]
+ mov ax,[abs qword 0xffffffffcccccccc]
+ mov bx,[abs qword 0xffffffffcccccccc]
+ mov eax,[abs qword 0xffffffffcccccccc]
+ mov ebx,[abs qword 0xffffffffcccccccc]
+ mov rax,[abs qword 0xffffffffcccccccc]
+ mov rbx,[abs qword 0xffffffffcccccccc]
+
+ mov al,[a64 abs foo]
+ mov bl,[a64 abs foo]
+ mov ax,[a64 abs foo]
+ mov bx,[a64 abs foo]
+ mov eax,[a64 abs foo]
+ mov ebx,[a64 abs foo]
+ mov rax,[a64 abs foo]
+ mov rbx,[a64 abs foo]
+ mov al,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs 0xbbbbbbbb]
+ mov bl,[a64 abs 0xbbbbbbbb]
+ mov ax,[a64 abs 0xbbbbbbbb]
+ mov bx,[a64 abs 0xbbbbbbbb]
+ mov eax,[a64 abs 0xbbbbbbbb]
+ mov ebx,[a64 abs 0xbbbbbbbb]
+ mov rax,[a64 abs 0xbbbbbbbb]
+ mov rbx,[a64 abs 0xbbbbbbbb]
+ mov al,[a64 abs 0xffffffffcccccccc]
+ mov bl,[a64 abs 0xffffffffcccccccc]
+ mov ax,[a64 abs 0xffffffffcccccccc]
+ mov bx,[a64 abs 0xffffffffcccccccc]
+ mov eax,[a64 abs 0xffffffffcccccccc]
+ mov ebx,[a64 abs 0xffffffffcccccccc]
+ mov rax,[a64 abs 0xffffffffcccccccc]
+ mov rbx,[a64 abs 0xffffffffcccccccc]
+
+ mov al,[a64 abs dword foo]
+ mov bl,[a64 abs dword foo]
+ mov ax,[a64 abs dword foo]
+ mov bx,[a64 abs dword foo]
+ mov eax,[a64 abs dword foo]
+ mov ebx,[a64 abs dword foo]
+ mov rax,[a64 abs dword foo]
+ mov rbx,[a64 abs dword foo]
+ mov al,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword 0xbbbbbbbb]
+ mov bl,[a64 abs dword 0xbbbbbbbb]
+ mov ax,[a64 abs dword 0xbbbbbbbb]
+ mov bx,[a64 abs dword 0xbbbbbbbb]
+ mov eax,[a64 abs dword 0xbbbbbbbb]
+ mov ebx,[a64 abs dword 0xbbbbbbbb]
+ mov rax,[a64 abs dword 0xbbbbbbbb]
+ mov rbx,[a64 abs dword 0xbbbbbbbb]
+ mov al,[a64 abs dword 0xffffffffcccccccc]
+ mov bl,[a64 abs dword 0xffffffffcccccccc]
+ mov ax,[a64 abs dword 0xffffffffcccccccc]
+ mov bx,[a64 abs dword 0xffffffffcccccccc]
+ mov eax,[a64 abs dword 0xffffffffcccccccc]
+ mov ebx,[a64 abs dword 0xffffffffcccccccc]
+ mov rax,[a64 abs dword 0xffffffffcccccccc]
+ mov rbx,[a64 abs dword 0xffffffffcccccccc]
+
+ mov al,[a64 abs qword foo]
+ mov bl,[a64 abs qword foo]
+ mov ax,[a64 abs qword foo]
+ mov bx,[a64 abs qword foo]
+ mov eax,[a64 abs qword foo]
+ mov ebx,[a64 abs qword foo]
+ mov rax,[a64 abs qword foo]
+ mov rbx,[a64 abs qword foo]
+ mov al,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword 0xbbbbbbbb]
+ mov bl,[a64 abs qword 0xbbbbbbbb]
+ mov ax,[a64 abs qword 0xbbbbbbbb]
+ mov bx,[a64 abs qword 0xbbbbbbbb]
+ mov eax,[a64 abs qword 0xbbbbbbbb]
+ mov ebx,[a64 abs qword 0xbbbbbbbb]
+ mov rax,[a64 abs qword 0xbbbbbbbb]
+ mov rbx,[a64 abs qword 0xbbbbbbbb]
+ mov al,[a64 abs qword 0xffffffffcccccccc]
+ mov bl,[a64 abs qword 0xffffffffcccccccc]
+ mov ax,[a64 abs qword 0xffffffffcccccccc]
+ mov bx,[a64 abs qword 0xffffffffcccccccc]
+ mov eax,[a64 abs qword 0xffffffffcccccccc]
+ mov ebx,[a64 abs qword 0xffffffffcccccccc]
+ mov rax,[a64 abs qword 0xffffffffcccccccc]
+ mov rbx,[a64 abs qword 0xffffffffcccccccc]
+
+ mov al,[a32 abs foo]
+ mov bl,[a32 abs foo]
+ mov ax,[a32 abs foo]
+ mov bx,[a32 abs foo]
+ mov eax,[a32 abs foo]
+ mov ebx,[a32 abs foo]
+ mov rax,[a32 abs foo]
+ mov rbx,[a32 abs foo]
+ mov al,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs 0xbbbbbbbb]
+ mov bl,[a32 abs 0xbbbbbbbb]
+ mov ax,[a32 abs 0xbbbbbbbb]
+ mov bx,[a32 abs 0xbbbbbbbb]
+ mov eax,[a32 abs 0xbbbbbbbb]
+ mov ebx,[a32 abs 0xbbbbbbbb]
+ mov rax,[a32 abs 0xbbbbbbbb]
+ mov rbx,[a32 abs 0xbbbbbbbb]
+ mov al,[a32 abs 0xffffffffcccccccc]
+ mov bl,[a32 abs 0xffffffffcccccccc]
+ mov ax,[a32 abs 0xffffffffcccccccc]
+ mov bx,[a32 abs 0xffffffffcccccccc]
+ mov eax,[a32 abs 0xffffffffcccccccc]
+ mov ebx,[a32 abs 0xffffffffcccccccc]
+ mov rax,[a32 abs 0xffffffffcccccccc]
+ mov rbx,[a32 abs 0xffffffffcccccccc]
+
+ mov al,[a32 abs dword foo]
+ mov bl,[a32 abs dword foo]
+ mov ax,[a32 abs dword foo]
+ mov bx,[a32 abs dword foo]
+ mov eax,[a32 abs dword foo]
+ mov ebx,[a32 abs dword foo]
+ mov rax,[a32 abs dword foo]
+ mov rbx,[a32 abs dword foo]
+ mov al,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword 0xbbbbbbbb]
+ mov bl,[a32 abs dword 0xbbbbbbbb]
+ mov ax,[a32 abs dword 0xbbbbbbbb]
+ mov bx,[a32 abs dword 0xbbbbbbbb]
+ mov eax,[a32 abs dword 0xbbbbbbbb]
+ mov ebx,[a32 abs dword 0xbbbbbbbb]
+ mov rax,[a32 abs dword 0xbbbbbbbb]
+ mov rbx,[a32 abs dword 0xbbbbbbbb]
+ mov al,[a32 abs dword 0xffffffffcccccccc]
+ mov bl,[a32 abs dword 0xffffffffcccccccc]
+ mov ax,[a32 abs dword 0xffffffffcccccccc]
+ mov bx,[a32 abs dword 0xffffffffcccccccc]
+ mov eax,[a32 abs dword 0xffffffffcccccccc]
+ mov ebx,[a32 abs dword 0xffffffffcccccccc]
+ mov rax,[a32 abs dword 0xffffffffcccccccc]
+ mov rbx,[a32 abs dword 0xffffffffcccccccc]
+
+ mov al,[a32 abs qword foo]
+ mov bl,[a32 abs qword foo]
+ mov ax,[a32 abs qword foo]
+ mov bx,[a32 abs qword foo]
+ mov eax,[a32 abs qword foo]
+ mov ebx,[a32 abs qword foo]
+ mov rax,[a32 abs qword foo]
+ mov rbx,[a32 abs qword foo]
+ mov al,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword 0xbbbbbbbb]
+ mov bl,[a32 abs qword 0xbbbbbbbb]
+ mov ax,[a32 abs qword 0xbbbbbbbb]
+ mov bx,[a32 abs qword 0xbbbbbbbb]
+ mov eax,[a32 abs qword 0xbbbbbbbb]
+ mov ebx,[a32 abs qword 0xbbbbbbbb]
+ mov rax,[a32 abs qword 0xbbbbbbbb]
+ mov rbx,[a32 abs qword 0xbbbbbbbb]
+ mov al,[a32 abs qword 0xffffffffcccccccc]
+ mov bl,[a32 abs qword 0xffffffffcccccccc]
+ mov ax,[a32 abs qword 0xffffffffcccccccc]
+ mov bx,[a32 abs qword 0xffffffffcccccccc]
+ mov eax,[a32 abs qword 0xffffffffcccccccc]
+ mov ebx,[a32 abs qword 0xffffffffcccccccc]
+ mov rax,[a32 abs qword 0xffffffffcccccccc]
+ mov rbx,[a32 abs qword 0xffffffffcccccccc]
+
+ mov al,[rel foo]
+ mov bl,[rel foo]
+ mov ax,[rel foo]
+ mov bx,[rel foo]
+ mov eax,[rel foo]
+ mov ebx,[rel foo]
+ mov rax,[rel foo]
+ mov rbx,[rel foo]
+ mov al,[rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel 0xbbbbbbbb]
+ mov bl,[rel 0xbbbbbbbb]
+ mov ax,[rel 0xbbbbbbbb]
+ mov bx,[rel 0xbbbbbbbb]
+ mov eax,[rel 0xbbbbbbbb]
+ mov ebx,[rel 0xbbbbbbbb]
+ mov rax,[rel 0xbbbbbbbb]
+ mov rbx,[rel 0xbbbbbbbb]
+ mov al,[rel 0xffffffffcccccccc]
+ mov bl,[rel 0xffffffffcccccccc]
+ mov ax,[rel 0xffffffffcccccccc]
+ mov bx,[rel 0xffffffffcccccccc]
+ mov eax,[rel 0xffffffffcccccccc]
+ mov ebx,[rel 0xffffffffcccccccc]
+ mov rax,[rel 0xffffffffcccccccc]
+ mov rbx,[rel 0xffffffffcccccccc]
+
+ mov al,[rel dword foo]
+ mov bl,[rel dword foo]
+ mov ax,[rel dword foo]
+ mov bx,[rel dword foo]
+ mov eax,[rel dword foo]
+ mov ebx,[rel dword foo]
+ mov rax,[rel dword foo]
+ mov rbx,[rel dword foo]
+ mov al,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword 0xbbbbbbbb]
+ mov bl,[rel dword 0xbbbbbbbb]
+ mov ax,[rel dword 0xbbbbbbbb]
+ mov bx,[rel dword 0xbbbbbbbb]
+ mov eax,[rel dword 0xbbbbbbbb]
+ mov ebx,[rel dword 0xbbbbbbbb]
+ mov rax,[rel dword 0xbbbbbbbb]
+ mov rbx,[rel dword 0xbbbbbbbb]
+ mov al,[rel dword 0xffffffffcccccccc]
+ mov bl,[rel dword 0xffffffffcccccccc]
+ mov ax,[rel dword 0xffffffffcccccccc]
+ mov bx,[rel dword 0xffffffffcccccccc]
+ mov eax,[rel dword 0xffffffffcccccccc]
+ mov ebx,[rel dword 0xffffffffcccccccc]
+ mov rax,[rel dword 0xffffffffcccccccc]
+ mov rbx,[rel dword 0xffffffffcccccccc]
+
+ mov al,[rel qword foo]
+ mov bl,[rel qword foo]
+ mov ax,[rel qword foo]
+ mov bx,[rel qword foo]
+ mov eax,[rel qword foo]
+ mov ebx,[rel qword foo]
+ mov rax,[rel qword foo]
+ mov rbx,[rel qword foo]
+ mov al,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword 0xbbbbbbbb]
+ mov bl,[rel qword 0xbbbbbbbb]
+ mov ax,[rel qword 0xbbbbbbbb]
+ mov bx,[rel qword 0xbbbbbbbb]
+ mov eax,[rel qword 0xbbbbbbbb]
+ mov ebx,[rel qword 0xbbbbbbbb]
+ mov rax,[rel qword 0xbbbbbbbb]
+ mov rbx,[rel qword 0xbbbbbbbb]
+ mov al,[rel qword 0xffffffffcccccccc]
+ mov bl,[rel qword 0xffffffffcccccccc]
+ mov ax,[rel qword 0xffffffffcccccccc]
+ mov bx,[rel qword 0xffffffffcccccccc]
+ mov eax,[rel qword 0xffffffffcccccccc]
+ mov ebx,[rel qword 0xffffffffcccccccc]
+ mov rax,[rel qword 0xffffffffcccccccc]
+ mov rbx,[rel qword 0xffffffffcccccccc]
+
+ mov al,[a64 rel foo]
+ mov bl,[a64 rel foo]
+ mov ax,[a64 rel foo]
+ mov bx,[a64 rel foo]
+ mov eax,[a64 rel foo]
+ mov ebx,[a64 rel foo]
+ mov rax,[a64 rel foo]
+ mov rbx,[a64 rel foo]
+ mov al,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel 0xbbbbbbbb]
+ mov bl,[a64 rel 0xbbbbbbbb]
+ mov ax,[a64 rel 0xbbbbbbbb]
+ mov bx,[a64 rel 0xbbbbbbbb]
+ mov eax,[a64 rel 0xbbbbbbbb]
+ mov ebx,[a64 rel 0xbbbbbbbb]
+ mov rax,[a64 rel 0xbbbbbbbb]
+ mov rbx,[a64 rel 0xbbbbbbbb]
+ mov al,[a64 rel 0xffffffffcccccccc]
+ mov bl,[a64 rel 0xffffffffcccccccc]
+ mov ax,[a64 rel 0xffffffffcccccccc]
+ mov bx,[a64 rel 0xffffffffcccccccc]
+ mov eax,[a64 rel 0xffffffffcccccccc]
+ mov ebx,[a64 rel 0xffffffffcccccccc]
+ mov rax,[a64 rel 0xffffffffcccccccc]
+ mov rbx,[a64 rel 0xffffffffcccccccc]
+
+ mov al,[a64 rel dword foo]
+ mov bl,[a64 rel dword foo]
+ mov ax,[a64 rel dword foo]
+ mov bx,[a64 rel dword foo]
+ mov eax,[a64 rel dword foo]
+ mov ebx,[a64 rel dword foo]
+ mov rax,[a64 rel dword foo]
+ mov rbx,[a64 rel dword foo]
+ mov al,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword 0xbbbbbbbb]
+ mov bl,[a64 rel dword 0xbbbbbbbb]
+ mov ax,[a64 rel dword 0xbbbbbbbb]
+ mov bx,[a64 rel dword 0xbbbbbbbb]
+ mov eax,[a64 rel dword 0xbbbbbbbb]
+ mov ebx,[a64 rel dword 0xbbbbbbbb]
+ mov rax,[a64 rel dword 0xbbbbbbbb]
+ mov rbx,[a64 rel dword 0xbbbbbbbb]
+ mov al,[a64 rel dword 0xffffffffcccccccc]
+ mov bl,[a64 rel dword 0xffffffffcccccccc]
+ mov ax,[a64 rel dword 0xffffffffcccccccc]
+ mov bx,[a64 rel dword 0xffffffffcccccccc]
+ mov eax,[a64 rel dword 0xffffffffcccccccc]
+ mov ebx,[a64 rel dword 0xffffffffcccccccc]
+ mov rax,[a64 rel dword 0xffffffffcccccccc]
+ mov rbx,[a64 rel dword 0xffffffffcccccccc]
+
+ mov al,[a64 rel qword foo]
+ mov bl,[a64 rel qword foo]
+ mov ax,[a64 rel qword foo]
+ mov bx,[a64 rel qword foo]
+ mov eax,[a64 rel qword foo]
+ mov ebx,[a64 rel qword foo]
+ mov rax,[a64 rel qword foo]
+ mov rbx,[a64 rel qword foo]
+ mov al,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword 0xbbbbbbbb]
+ mov bl,[a64 rel qword 0xbbbbbbbb]
+ mov ax,[a64 rel qword 0xbbbbbbbb]
+ mov bx,[a64 rel qword 0xbbbbbbbb]
+ mov eax,[a64 rel qword 0xbbbbbbbb]
+ mov ebx,[a64 rel qword 0xbbbbbbbb]
+ mov rax,[a64 rel qword 0xbbbbbbbb]
+ mov rbx,[a64 rel qword 0xbbbbbbbb]
+ mov al,[a64 rel qword 0xffffffffcccccccc]
+ mov bl,[a64 rel qword 0xffffffffcccccccc]
+ mov ax,[a64 rel qword 0xffffffffcccccccc]
+ mov bx,[a64 rel qword 0xffffffffcccccccc]
+ mov eax,[a64 rel qword 0xffffffffcccccccc]
+ mov ebx,[a64 rel qword 0xffffffffcccccccc]
+ mov rax,[a64 rel qword 0xffffffffcccccccc]
+ mov rbx,[a64 rel qword 0xffffffffcccccccc]
+
+ mov al,[a32 rel foo]
+ mov bl,[a32 rel foo]
+ mov ax,[a32 rel foo]
+ mov bx,[a32 rel foo]
+ mov eax,[a32 rel foo]
+ mov ebx,[a32 rel foo]
+ mov rax,[a32 rel foo]
+ mov rbx,[a32 rel foo]
+ mov al,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel 0xbbbbbbbb]
+ mov bl,[a32 rel 0xbbbbbbbb]
+ mov ax,[a32 rel 0xbbbbbbbb]
+ mov bx,[a32 rel 0xbbbbbbbb]
+ mov eax,[a32 rel 0xbbbbbbbb]
+ mov ebx,[a32 rel 0xbbbbbbbb]
+ mov rax,[a32 rel 0xbbbbbbbb]
+ mov rbx,[a32 rel 0xbbbbbbbb]
+ mov al,[a32 rel 0xffffffffcccccccc]
+ mov bl,[a32 rel 0xffffffffcccccccc]
+ mov ax,[a32 rel 0xffffffffcccccccc]
+ mov bx,[a32 rel 0xffffffffcccccccc]
+ mov eax,[a32 rel 0xffffffffcccccccc]
+ mov ebx,[a32 rel 0xffffffffcccccccc]
+ mov rax,[a32 rel 0xffffffffcccccccc]
+ mov rbx,[a32 rel 0xffffffffcccccccc]
+
+ mov al,[a32 rel dword foo]
+ mov bl,[a32 rel dword foo]
+ mov ax,[a32 rel dword foo]
+ mov bx,[a32 rel dword foo]
+ mov eax,[a32 rel dword foo]
+ mov ebx,[a32 rel dword foo]
+ mov rax,[a32 rel dword foo]
+ mov rbx,[a32 rel dword foo]
+ mov al,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword 0xbbbbbbbb]
+ mov bl,[a32 rel dword 0xbbbbbbbb]
+ mov ax,[a32 rel dword 0xbbbbbbbb]
+ mov bx,[a32 rel dword 0xbbbbbbbb]
+ mov eax,[a32 rel dword 0xbbbbbbbb]
+ mov ebx,[a32 rel dword 0xbbbbbbbb]
+ mov rax,[a32 rel dword 0xbbbbbbbb]
+ mov rbx,[a32 rel dword 0xbbbbbbbb]
+ mov al,[a32 rel dword 0xffffffffcccccccc]
+ mov bl,[a32 rel dword 0xffffffffcccccccc]
+ mov ax,[a32 rel dword 0xffffffffcccccccc]
+ mov bx,[a32 rel dword 0xffffffffcccccccc]
+ mov eax,[a32 rel dword 0xffffffffcccccccc]
+ mov ebx,[a32 rel dword 0xffffffffcccccccc]
+ mov rax,[a32 rel dword 0xffffffffcccccccc]
+ mov rbx,[a32 rel dword 0xffffffffcccccccc]
+
+ mov al,[a32 rel qword foo]
+ mov bl,[a32 rel qword foo]
+ mov ax,[a32 rel qword foo]
+ mov bx,[a32 rel qword foo]
+ mov eax,[a32 rel qword foo]
+ mov ebx,[a32 rel qword foo]
+ mov rax,[a32 rel qword foo]
+ mov rbx,[a32 rel qword foo]
+ mov al,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword 0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword 0xbbbbbbbb]
+ mov bl,[a32 rel qword 0xbbbbbbbb]
+ mov ax,[a32 rel qword 0xbbbbbbbb]
+ mov bx,[a32 rel qword 0xbbbbbbbb]
+ mov eax,[a32 rel qword 0xbbbbbbbb]
+ mov ebx,[a32 rel qword 0xbbbbbbbb]
+ mov rax,[a32 rel qword 0xbbbbbbbb]
+ mov rbx,[a32 rel qword 0xbbbbbbbb]
+ mov al,[a32 rel qword 0xffffffffcccccccc]
+ mov bl,[a32 rel qword 0xffffffffcccccccc]
+ mov ax,[a32 rel qword 0xffffffffcccccccc]
+ mov bx,[a32 rel qword 0xffffffffcccccccc]
+ mov eax,[a32 rel qword 0xffffffffcccccccc]
+ mov ebx,[a32 rel qword 0xffffffffcccccccc]
+ mov rax,[a32 rel qword 0xffffffffcccccccc]
+ mov rbx,[a32 rel qword 0xffffffffcccccccc]
+
+ mov al,[fs:foo]
+ mov bl,[fs:foo]
+ mov ax,[fs:foo]
+ mov bx,[fs:foo]
+ mov eax,[fs:foo]
+ mov ebx,[fs:foo]
+ mov rax,[fs:foo]
+ mov rbx,[fs:foo]
+ mov al,[fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[fs:0xbbbbbbbb]
+ mov bl,[fs:0xbbbbbbbb]
+ mov ax,[fs:0xbbbbbbbb]
+ mov bx,[fs:0xbbbbbbbb]
+ mov eax,[fs:0xbbbbbbbb]
+ mov ebx,[fs:0xbbbbbbbb]
+ mov rax,[fs:0xbbbbbbbb]
+ mov rbx,[fs:0xbbbbbbbb]
+ mov al,[fs:0xffffffffcccccccc]
+ mov bl,[fs:0xffffffffcccccccc]
+ mov ax,[fs:0xffffffffcccccccc]
+ mov bx,[fs:0xffffffffcccccccc]
+ mov eax,[fs:0xffffffffcccccccc]
+ mov ebx,[fs:0xffffffffcccccccc]
+ mov rax,[fs:0xffffffffcccccccc]
+ mov rbx,[fs:0xffffffffcccccccc]
+
+ mov al,[dword fs:foo]
+ mov bl,[dword fs:foo]
+ mov ax,[dword fs:foo]
+ mov bx,[dword fs:foo]
+ mov eax,[dword fs:foo]
+ mov ebx,[dword fs:foo]
+ mov rax,[dword fs:foo]
+ mov rbx,[dword fs:foo]
+ mov al,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[dword fs:0xbbbbbbbb]
+ mov bl,[dword fs:0xbbbbbbbb]
+ mov ax,[dword fs:0xbbbbbbbb]
+ mov bx,[dword fs:0xbbbbbbbb]
+ mov eax,[dword fs:0xbbbbbbbb]
+ mov ebx,[dword fs:0xbbbbbbbb]
+ mov rax,[dword fs:0xbbbbbbbb]
+ mov rbx,[dword fs:0xbbbbbbbb]
+ mov al,[dword fs:0xffffffffcccccccc]
+ mov bl,[dword fs:0xffffffffcccccccc]
+ mov ax,[dword fs:0xffffffffcccccccc]
+ mov bx,[dword fs:0xffffffffcccccccc]
+ mov eax,[dword fs:0xffffffffcccccccc]
+ mov ebx,[dword fs:0xffffffffcccccccc]
+ mov rax,[dword fs:0xffffffffcccccccc]
+ mov rbx,[dword fs:0xffffffffcccccccc]
+
+ mov al,[qword fs:foo]
+ mov bl,[qword fs:foo]
+ mov ax,[qword fs:foo]
+ mov bx,[qword fs:foo]
+ mov eax,[qword fs:foo]
+ mov ebx,[qword fs:foo]
+ mov rax,[qword fs:foo]
+ mov rbx,[qword fs:foo]
+ mov al,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[qword fs:0xbbbbbbbb]
+ mov bl,[qword fs:0xbbbbbbbb]
+ mov ax,[qword fs:0xbbbbbbbb]
+ mov bx,[qword fs:0xbbbbbbbb]
+ mov eax,[qword fs:0xbbbbbbbb]
+ mov ebx,[qword fs:0xbbbbbbbb]
+ mov rax,[qword fs:0xbbbbbbbb]
+ mov rbx,[qword fs:0xbbbbbbbb]
+ mov al,[qword fs:0xffffffffcccccccc]
+ mov bl,[qword fs:0xffffffffcccccccc]
+ mov ax,[qword fs:0xffffffffcccccccc]
+ mov bx,[qword fs:0xffffffffcccccccc]
+ mov eax,[qword fs:0xffffffffcccccccc]
+ mov ebx,[qword fs:0xffffffffcccccccc]
+ mov rax,[qword fs:0xffffffffcccccccc]
+ mov rbx,[qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 fs:foo]
+ mov bl,[a64 fs:foo]
+ mov ax,[a64 fs:foo]
+ mov bx,[a64 fs:foo]
+ mov eax,[a64 fs:foo]
+ mov ebx,[a64 fs:foo]
+ mov rax,[a64 fs:foo]
+ mov rbx,[a64 fs:foo]
+ mov al,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 fs:0xbbbbbbbb]
+ mov bl,[a64 fs:0xbbbbbbbb]
+ mov ax,[a64 fs:0xbbbbbbbb]
+ mov bx,[a64 fs:0xbbbbbbbb]
+ mov eax,[a64 fs:0xbbbbbbbb]
+ mov ebx,[a64 fs:0xbbbbbbbb]
+ mov rax,[a64 fs:0xbbbbbbbb]
+ mov rbx,[a64 fs:0xbbbbbbbb]
+ mov al,[a64 fs:0xffffffffcccccccc]
+ mov bl,[a64 fs:0xffffffffcccccccc]
+ mov ax,[a64 fs:0xffffffffcccccccc]
+ mov bx,[a64 fs:0xffffffffcccccccc]
+ mov eax,[a64 fs:0xffffffffcccccccc]
+ mov ebx,[a64 fs:0xffffffffcccccccc]
+ mov rax,[a64 fs:0xffffffffcccccccc]
+ mov rbx,[a64 fs:0xffffffffcccccccc]
+
+ mov al,[a64 dword fs:foo]
+ mov bl,[a64 dword fs:foo]
+ mov ax,[a64 dword fs:foo]
+ mov bx,[a64 dword fs:foo]
+ mov eax,[a64 dword fs:foo]
+ mov ebx,[a64 dword fs:foo]
+ mov rax,[a64 dword fs:foo]
+ mov rbx,[a64 dword fs:foo]
+ mov al,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword fs:0xbbbbbbbb]
+ mov bl,[a64 dword fs:0xbbbbbbbb]
+ mov ax,[a64 dword fs:0xbbbbbbbb]
+ mov bx,[a64 dword fs:0xbbbbbbbb]
+ mov eax,[a64 dword fs:0xbbbbbbbb]
+ mov ebx,[a64 dword fs:0xbbbbbbbb]
+ mov rax,[a64 dword fs:0xbbbbbbbb]
+ mov rbx,[a64 dword fs:0xbbbbbbbb]
+ mov al,[a64 dword fs:0xffffffffcccccccc]
+ mov bl,[a64 dword fs:0xffffffffcccccccc]
+ mov ax,[a64 dword fs:0xffffffffcccccccc]
+ mov bx,[a64 dword fs:0xffffffffcccccccc]
+ mov eax,[a64 dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 dword fs:0xffffffffcccccccc]
+ mov rax,[a64 dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 qword fs:foo]
+ mov bl,[a64 qword fs:foo]
+ mov ax,[a64 qword fs:foo]
+ mov bx,[a64 qword fs:foo]
+ mov eax,[a64 qword fs:foo]
+ mov ebx,[a64 qword fs:foo]
+ mov rax,[a64 qword fs:foo]
+ mov rbx,[a64 qword fs:foo]
+ mov al,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword fs:0xbbbbbbbb]
+ mov bl,[a64 qword fs:0xbbbbbbbb]
+ mov ax,[a64 qword fs:0xbbbbbbbb]
+ mov bx,[a64 qword fs:0xbbbbbbbb]
+ mov eax,[a64 qword fs:0xbbbbbbbb]
+ mov ebx,[a64 qword fs:0xbbbbbbbb]
+ mov rax,[a64 qword fs:0xbbbbbbbb]
+ mov rbx,[a64 qword fs:0xbbbbbbbb]
+ mov al,[a64 qword fs:0xffffffffcccccccc]
+ mov bl,[a64 qword fs:0xffffffffcccccccc]
+ mov ax,[a64 qword fs:0xffffffffcccccccc]
+ mov bx,[a64 qword fs:0xffffffffcccccccc]
+ mov eax,[a64 qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 qword fs:0xffffffffcccccccc]
+ mov rax,[a64 qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 fs:foo]
+ mov bl,[a32 fs:foo]
+ mov ax,[a32 fs:foo]
+ mov bx,[a32 fs:foo]
+ mov eax,[a32 fs:foo]
+ mov ebx,[a32 fs:foo]
+ mov rax,[a32 fs:foo]
+ mov rbx,[a32 fs:foo]
+ mov al,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 fs:0xbbbbbbbb]
+ mov bl,[a32 fs:0xbbbbbbbb]
+ mov ax,[a32 fs:0xbbbbbbbb]
+ mov bx,[a32 fs:0xbbbbbbbb]
+ mov eax,[a32 fs:0xbbbbbbbb]
+ mov ebx,[a32 fs:0xbbbbbbbb]
+ mov rax,[a32 fs:0xbbbbbbbb]
+ mov rbx,[a32 fs:0xbbbbbbbb]
+ mov al,[a32 fs:0xffffffffcccccccc]
+ mov bl,[a32 fs:0xffffffffcccccccc]
+ mov ax,[a32 fs:0xffffffffcccccccc]
+ mov bx,[a32 fs:0xffffffffcccccccc]
+ mov eax,[a32 fs:0xffffffffcccccccc]
+ mov ebx,[a32 fs:0xffffffffcccccccc]
+ mov rax,[a32 fs:0xffffffffcccccccc]
+ mov rbx,[a32 fs:0xffffffffcccccccc]
+
+ mov al,[a32 dword fs:foo]
+ mov bl,[a32 dword fs:foo]
+ mov ax,[a32 dword fs:foo]
+ mov bx,[a32 dword fs:foo]
+ mov eax,[a32 dword fs:foo]
+ mov ebx,[a32 dword fs:foo]
+ mov rax,[a32 dword fs:foo]
+ mov rbx,[a32 dword fs:foo]
+ mov al,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword fs:0xbbbbbbbb]
+ mov bl,[a32 dword fs:0xbbbbbbbb]
+ mov ax,[a32 dword fs:0xbbbbbbbb]
+ mov bx,[a32 dword fs:0xbbbbbbbb]
+ mov eax,[a32 dword fs:0xbbbbbbbb]
+ mov ebx,[a32 dword fs:0xbbbbbbbb]
+ mov rax,[a32 dword fs:0xbbbbbbbb]
+ mov rbx,[a32 dword fs:0xbbbbbbbb]
+ mov al,[a32 dword fs:0xffffffffcccccccc]
+ mov bl,[a32 dword fs:0xffffffffcccccccc]
+ mov ax,[a32 dword fs:0xffffffffcccccccc]
+ mov bx,[a32 dword fs:0xffffffffcccccccc]
+ mov eax,[a32 dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 dword fs:0xffffffffcccccccc]
+ mov rax,[a32 dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 qword fs:foo]
+ mov bl,[a32 qword fs:foo]
+ mov ax,[a32 qword fs:foo]
+ mov bx,[a32 qword fs:foo]
+ mov eax,[a32 qword fs:foo]
+ mov ebx,[a32 qword fs:foo]
+ mov rax,[a32 qword fs:foo]
+ mov rbx,[a32 qword fs:foo]
+ mov al,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword fs:0xbbbbbbbb]
+ mov bl,[a32 qword fs:0xbbbbbbbb]
+ mov ax,[a32 qword fs:0xbbbbbbbb]
+ mov bx,[a32 qword fs:0xbbbbbbbb]
+ mov eax,[a32 qword fs:0xbbbbbbbb]
+ mov ebx,[a32 qword fs:0xbbbbbbbb]
+ mov rax,[a32 qword fs:0xbbbbbbbb]
+ mov rbx,[a32 qword fs:0xbbbbbbbb]
+ mov al,[a32 qword fs:0xffffffffcccccccc]
+ mov bl,[a32 qword fs:0xffffffffcccccccc]
+ mov ax,[a32 qword fs:0xffffffffcccccccc]
+ mov bx,[a32 qword fs:0xffffffffcccccccc]
+ mov eax,[a32 qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 qword fs:0xffffffffcccccccc]
+ mov rax,[a32 qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 qword fs:0xffffffffcccccccc]
+
+ mov al,[abs fs:foo]
+ mov bl,[abs fs:foo]
+ mov ax,[abs fs:foo]
+ mov bx,[abs fs:foo]
+ mov eax,[abs fs:foo]
+ mov ebx,[abs fs:foo]
+ mov rax,[abs fs:foo]
+ mov rbx,[abs fs:foo]
+ mov al,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs fs:0xbbbbbbbb]
+ mov bl,[abs fs:0xbbbbbbbb]
+ mov ax,[abs fs:0xbbbbbbbb]
+ mov bx,[abs fs:0xbbbbbbbb]
+ mov eax,[abs fs:0xbbbbbbbb]
+ mov ebx,[abs fs:0xbbbbbbbb]
+ mov rax,[abs fs:0xbbbbbbbb]
+ mov rbx,[abs fs:0xbbbbbbbb]
+ mov al,[abs fs:0xffffffffcccccccc]
+ mov bl,[abs fs:0xffffffffcccccccc]
+ mov ax,[abs fs:0xffffffffcccccccc]
+ mov bx,[abs fs:0xffffffffcccccccc]
+ mov eax,[abs fs:0xffffffffcccccccc]
+ mov ebx,[abs fs:0xffffffffcccccccc]
+ mov rax,[abs fs:0xffffffffcccccccc]
+ mov rbx,[abs fs:0xffffffffcccccccc]
+
+ mov al,[abs dword fs:foo]
+ mov bl,[abs dword fs:foo]
+ mov ax,[abs dword fs:foo]
+ mov bx,[abs dword fs:foo]
+ mov eax,[abs dword fs:foo]
+ mov ebx,[abs dword fs:foo]
+ mov rax,[abs dword fs:foo]
+ mov rbx,[abs dword fs:foo]
+ mov al,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword fs:0xbbbbbbbb]
+ mov bl,[abs dword fs:0xbbbbbbbb]
+ mov ax,[abs dword fs:0xbbbbbbbb]
+ mov bx,[abs dword fs:0xbbbbbbbb]
+ mov eax,[abs dword fs:0xbbbbbbbb]
+ mov ebx,[abs dword fs:0xbbbbbbbb]
+ mov rax,[abs dword fs:0xbbbbbbbb]
+ mov rbx,[abs dword fs:0xbbbbbbbb]
+ mov al,[abs dword fs:0xffffffffcccccccc]
+ mov bl,[abs dword fs:0xffffffffcccccccc]
+ mov ax,[abs dword fs:0xffffffffcccccccc]
+ mov bx,[abs dword fs:0xffffffffcccccccc]
+ mov eax,[abs dword fs:0xffffffffcccccccc]
+ mov ebx,[abs dword fs:0xffffffffcccccccc]
+ mov rax,[abs dword fs:0xffffffffcccccccc]
+ mov rbx,[abs dword fs:0xffffffffcccccccc]
+
+ mov al,[abs qword fs:foo]
+ mov bl,[abs qword fs:foo]
+ mov ax,[abs qword fs:foo]
+ mov bx,[abs qword fs:foo]
+ mov eax,[abs qword fs:foo]
+ mov ebx,[abs qword fs:foo]
+ mov rax,[abs qword fs:foo]
+ mov rbx,[abs qword fs:foo]
+ mov al,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword fs:0xbbbbbbbb]
+ mov bl,[abs qword fs:0xbbbbbbbb]
+ mov ax,[abs qword fs:0xbbbbbbbb]
+ mov bx,[abs qword fs:0xbbbbbbbb]
+ mov eax,[abs qword fs:0xbbbbbbbb]
+ mov ebx,[abs qword fs:0xbbbbbbbb]
+ mov rax,[abs qword fs:0xbbbbbbbb]
+ mov rbx,[abs qword fs:0xbbbbbbbb]
+ mov al,[abs qword fs:0xffffffffcccccccc]
+ mov bl,[abs qword fs:0xffffffffcccccccc]
+ mov ax,[abs qword fs:0xffffffffcccccccc]
+ mov bx,[abs qword fs:0xffffffffcccccccc]
+ mov eax,[abs qword fs:0xffffffffcccccccc]
+ mov ebx,[abs qword fs:0xffffffffcccccccc]
+ mov rax,[abs qword fs:0xffffffffcccccccc]
+ mov rbx,[abs qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs fs:foo]
+ mov bl,[a64 abs fs:foo]
+ mov ax,[a64 abs fs:foo]
+ mov bx,[a64 abs fs:foo]
+ mov eax,[a64 abs fs:foo]
+ mov ebx,[a64 abs fs:foo]
+ mov rax,[a64 abs fs:foo]
+ mov rbx,[a64 abs fs:foo]
+ mov al,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs fs:0xbbbbbbbb]
+ mov bl,[a64 abs fs:0xbbbbbbbb]
+ mov ax,[a64 abs fs:0xbbbbbbbb]
+ mov bx,[a64 abs fs:0xbbbbbbbb]
+ mov eax,[a64 abs fs:0xbbbbbbbb]
+ mov ebx,[a64 abs fs:0xbbbbbbbb]
+ mov rax,[a64 abs fs:0xbbbbbbbb]
+ mov rbx,[a64 abs fs:0xbbbbbbbb]
+ mov al,[a64 abs fs:0xffffffffcccccccc]
+ mov bl,[a64 abs fs:0xffffffffcccccccc]
+ mov ax,[a64 abs fs:0xffffffffcccccccc]
+ mov bx,[a64 abs fs:0xffffffffcccccccc]
+ mov eax,[a64 abs fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs fs:0xffffffffcccccccc]
+ mov rax,[a64 abs fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs dword fs:foo]
+ mov bl,[a64 abs dword fs:foo]
+ mov ax,[a64 abs dword fs:foo]
+ mov bx,[a64 abs dword fs:foo]
+ mov eax,[a64 abs dword fs:foo]
+ mov ebx,[a64 abs dword fs:foo]
+ mov rax,[a64 abs dword fs:foo]
+ mov rbx,[a64 abs dword fs:foo]
+ mov al,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword fs:0xbbbbbbbb]
+ mov bl,[a64 abs dword fs:0xbbbbbbbb]
+ mov ax,[a64 abs dword fs:0xbbbbbbbb]
+ mov bx,[a64 abs dword fs:0xbbbbbbbb]
+ mov eax,[a64 abs dword fs:0xbbbbbbbb]
+ mov ebx,[a64 abs dword fs:0xbbbbbbbb]
+ mov rax,[a64 abs dword fs:0xbbbbbbbb]
+ mov rbx,[a64 abs dword fs:0xbbbbbbbb]
+ mov al,[a64 abs dword fs:0xffffffffcccccccc]
+ mov bl,[a64 abs dword fs:0xffffffffcccccccc]
+ mov ax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov bx,[a64 abs dword fs:0xffffffffcccccccc]
+ mov eax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs dword fs:0xffffffffcccccccc]
+ mov rax,[a64 abs dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 abs qword fs:foo]
+ mov bl,[a64 abs qword fs:foo]
+ mov ax,[a64 abs qword fs:foo]
+ mov bx,[a64 abs qword fs:foo]
+ mov eax,[a64 abs qword fs:foo]
+ mov ebx,[a64 abs qword fs:foo]
+ mov rax,[a64 abs qword fs:foo]
+ mov rbx,[a64 abs qword fs:foo]
+ mov al,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword fs:0xbbbbbbbb]
+ mov bl,[a64 abs qword fs:0xbbbbbbbb]
+ mov ax,[a64 abs qword fs:0xbbbbbbbb]
+ mov bx,[a64 abs qword fs:0xbbbbbbbb]
+ mov eax,[a64 abs qword fs:0xbbbbbbbb]
+ mov ebx,[a64 abs qword fs:0xbbbbbbbb]
+ mov rax,[a64 abs qword fs:0xbbbbbbbb]
+ mov rbx,[a64 abs qword fs:0xbbbbbbbb]
+ mov al,[a64 abs qword fs:0xffffffffcccccccc]
+ mov bl,[a64 abs qword fs:0xffffffffcccccccc]
+ mov ax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov bx,[a64 abs qword fs:0xffffffffcccccccc]
+ mov eax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 abs qword fs:0xffffffffcccccccc]
+ mov rax,[a64 abs qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 abs qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs fs:foo]
+ mov bl,[a32 abs fs:foo]
+ mov ax,[a32 abs fs:foo]
+ mov bx,[a32 abs fs:foo]
+ mov eax,[a32 abs fs:foo]
+ mov ebx,[a32 abs fs:foo]
+ mov rax,[a32 abs fs:foo]
+ mov rbx,[a32 abs fs:foo]
+ mov al,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs fs:0xbbbbbbbb]
+ mov bl,[a32 abs fs:0xbbbbbbbb]
+ mov ax,[a32 abs fs:0xbbbbbbbb]
+ mov bx,[a32 abs fs:0xbbbbbbbb]
+ mov eax,[a32 abs fs:0xbbbbbbbb]
+ mov ebx,[a32 abs fs:0xbbbbbbbb]
+ mov rax,[a32 abs fs:0xbbbbbbbb]
+ mov rbx,[a32 abs fs:0xbbbbbbbb]
+ mov al,[a32 abs fs:0xffffffffcccccccc]
+ mov bl,[a32 abs fs:0xffffffffcccccccc]
+ mov ax,[a32 abs fs:0xffffffffcccccccc]
+ mov bx,[a32 abs fs:0xffffffffcccccccc]
+ mov eax,[a32 abs fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs fs:0xffffffffcccccccc]
+ mov rax,[a32 abs fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs dword fs:foo]
+ mov bl,[a32 abs dword fs:foo]
+ mov ax,[a32 abs dword fs:foo]
+ mov bx,[a32 abs dword fs:foo]
+ mov eax,[a32 abs dword fs:foo]
+ mov ebx,[a32 abs dword fs:foo]
+ mov rax,[a32 abs dword fs:foo]
+ mov rbx,[a32 abs dword fs:foo]
+ mov al,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword fs:0xbbbbbbbb]
+ mov bl,[a32 abs dword fs:0xbbbbbbbb]
+ mov ax,[a32 abs dword fs:0xbbbbbbbb]
+ mov bx,[a32 abs dword fs:0xbbbbbbbb]
+ mov eax,[a32 abs dword fs:0xbbbbbbbb]
+ mov ebx,[a32 abs dword fs:0xbbbbbbbb]
+ mov rax,[a32 abs dword fs:0xbbbbbbbb]
+ mov rbx,[a32 abs dword fs:0xbbbbbbbb]
+ mov al,[a32 abs dword fs:0xffffffffcccccccc]
+ mov bl,[a32 abs dword fs:0xffffffffcccccccc]
+ mov ax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov bx,[a32 abs dword fs:0xffffffffcccccccc]
+ mov eax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs dword fs:0xffffffffcccccccc]
+ mov rax,[a32 abs dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 abs qword fs:foo]
+ mov bl,[a32 abs qword fs:foo]
+ mov ax,[a32 abs qword fs:foo]
+ mov bx,[a32 abs qword fs:foo]
+ mov eax,[a32 abs qword fs:foo]
+ mov ebx,[a32 abs qword fs:foo]
+ mov rax,[a32 abs qword fs:foo]
+ mov rbx,[a32 abs qword fs:foo]
+ mov al,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword fs:0xbbbbbbbb]
+ mov bl,[a32 abs qword fs:0xbbbbbbbb]
+ mov ax,[a32 abs qword fs:0xbbbbbbbb]
+ mov bx,[a32 abs qword fs:0xbbbbbbbb]
+ mov eax,[a32 abs qword fs:0xbbbbbbbb]
+ mov ebx,[a32 abs qword fs:0xbbbbbbbb]
+ mov rax,[a32 abs qword fs:0xbbbbbbbb]
+ mov rbx,[a32 abs qword fs:0xbbbbbbbb]
+ mov al,[a32 abs qword fs:0xffffffffcccccccc]
+ mov bl,[a32 abs qword fs:0xffffffffcccccccc]
+ mov ax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov bx,[a32 abs qword fs:0xffffffffcccccccc]
+ mov eax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 abs qword fs:0xffffffffcccccccc]
+ mov rax,[a32 abs qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 abs qword fs:0xffffffffcccccccc]
+
+ mov al,[rel fs:foo]
+ mov bl,[rel fs:foo]
+ mov ax,[rel fs:foo]
+ mov bx,[rel fs:foo]
+ mov eax,[rel fs:foo]
+ mov ebx,[rel fs:foo]
+ mov rax,[rel fs:foo]
+ mov rbx,[rel fs:foo]
+ mov al,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel fs:0xbbbbbbbb]
+ mov bl,[rel fs:0xbbbbbbbb]
+ mov ax,[rel fs:0xbbbbbbbb]
+ mov bx,[rel fs:0xbbbbbbbb]
+ mov eax,[rel fs:0xbbbbbbbb]
+ mov ebx,[rel fs:0xbbbbbbbb]
+ mov rax,[rel fs:0xbbbbbbbb]
+ mov rbx,[rel fs:0xbbbbbbbb]
+ mov al,[rel fs:0xffffffffcccccccc]
+ mov bl,[rel fs:0xffffffffcccccccc]
+ mov ax,[rel fs:0xffffffffcccccccc]
+ mov bx,[rel fs:0xffffffffcccccccc]
+ mov eax,[rel fs:0xffffffffcccccccc]
+ mov ebx,[rel fs:0xffffffffcccccccc]
+ mov rax,[rel fs:0xffffffffcccccccc]
+ mov rbx,[rel fs:0xffffffffcccccccc]
+
+ mov al,[rel dword fs:foo]
+ mov bl,[rel dword fs:foo]
+ mov ax,[rel dword fs:foo]
+ mov bx,[rel dword fs:foo]
+ mov eax,[rel dword fs:foo]
+ mov ebx,[rel dword fs:foo]
+ mov rax,[rel dword fs:foo]
+ mov rbx,[rel dword fs:foo]
+ mov al,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword fs:0xbbbbbbbb]
+ mov bl,[rel dword fs:0xbbbbbbbb]
+ mov ax,[rel dword fs:0xbbbbbbbb]
+ mov bx,[rel dword fs:0xbbbbbbbb]
+ mov eax,[rel dword fs:0xbbbbbbbb]
+ mov ebx,[rel dword fs:0xbbbbbbbb]
+ mov rax,[rel dword fs:0xbbbbbbbb]
+ mov rbx,[rel dword fs:0xbbbbbbbb]
+ mov al,[rel dword fs:0xffffffffcccccccc]
+ mov bl,[rel dword fs:0xffffffffcccccccc]
+ mov ax,[rel dword fs:0xffffffffcccccccc]
+ mov bx,[rel dword fs:0xffffffffcccccccc]
+ mov eax,[rel dword fs:0xffffffffcccccccc]
+ mov ebx,[rel dword fs:0xffffffffcccccccc]
+ mov rax,[rel dword fs:0xffffffffcccccccc]
+ mov rbx,[rel dword fs:0xffffffffcccccccc]
+
+ mov al,[rel qword fs:foo]
+ mov bl,[rel qword fs:foo]
+ mov ax,[rel qword fs:foo]
+ mov bx,[rel qword fs:foo]
+ mov eax,[rel qword fs:foo]
+ mov ebx,[rel qword fs:foo]
+ mov rax,[rel qword fs:foo]
+ mov rbx,[rel qword fs:foo]
+ mov al,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword fs:0xbbbbbbbb]
+ mov bl,[rel qword fs:0xbbbbbbbb]
+ mov ax,[rel qword fs:0xbbbbbbbb]
+ mov bx,[rel qword fs:0xbbbbbbbb]
+ mov eax,[rel qword fs:0xbbbbbbbb]
+ mov ebx,[rel qword fs:0xbbbbbbbb]
+ mov rax,[rel qword fs:0xbbbbbbbb]
+ mov rbx,[rel qword fs:0xbbbbbbbb]
+ mov al,[rel qword fs:0xffffffffcccccccc]
+ mov bl,[rel qword fs:0xffffffffcccccccc]
+ mov ax,[rel qword fs:0xffffffffcccccccc]
+ mov bx,[rel qword fs:0xffffffffcccccccc]
+ mov eax,[rel qword fs:0xffffffffcccccccc]
+ mov ebx,[rel qword fs:0xffffffffcccccccc]
+ mov rax,[rel qword fs:0xffffffffcccccccc]
+ mov rbx,[rel qword fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel fs:foo]
+ mov bl,[a64 rel fs:foo]
+ mov ax,[a64 rel fs:foo]
+ mov bx,[a64 rel fs:foo]
+ mov eax,[a64 rel fs:foo]
+ mov ebx,[a64 rel fs:foo]
+ mov rax,[a64 rel fs:foo]
+ mov rbx,[a64 rel fs:foo]
+ mov al,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel fs:0xbbbbbbbb]
+ mov bl,[a64 rel fs:0xbbbbbbbb]
+ mov ax,[a64 rel fs:0xbbbbbbbb]
+ mov bx,[a64 rel fs:0xbbbbbbbb]
+ mov eax,[a64 rel fs:0xbbbbbbbb]
+ mov ebx,[a64 rel fs:0xbbbbbbbb]
+ mov rax,[a64 rel fs:0xbbbbbbbb]
+ mov rbx,[a64 rel fs:0xbbbbbbbb]
+ mov al,[a64 rel fs:0xffffffffcccccccc]
+ mov bl,[a64 rel fs:0xffffffffcccccccc]
+ mov ax,[a64 rel fs:0xffffffffcccccccc]
+ mov bx,[a64 rel fs:0xffffffffcccccccc]
+ mov eax,[a64 rel fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel fs:0xffffffffcccccccc]
+ mov rax,[a64 rel fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel dword fs:foo]
+ mov bl,[a64 rel dword fs:foo]
+ mov ax,[a64 rel dword fs:foo]
+ mov bx,[a64 rel dword fs:foo]
+ mov eax,[a64 rel dword fs:foo]
+ mov ebx,[a64 rel dword fs:foo]
+ mov rax,[a64 rel dword fs:foo]
+ mov rbx,[a64 rel dword fs:foo]
+ mov al,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword fs:0xbbbbbbbb]
+ mov bl,[a64 rel dword fs:0xbbbbbbbb]
+ mov ax,[a64 rel dword fs:0xbbbbbbbb]
+ mov bx,[a64 rel dword fs:0xbbbbbbbb]
+ mov eax,[a64 rel dword fs:0xbbbbbbbb]
+ mov ebx,[a64 rel dword fs:0xbbbbbbbb]
+ mov rax,[a64 rel dword fs:0xbbbbbbbb]
+ mov rbx,[a64 rel dword fs:0xbbbbbbbb]
+ mov al,[a64 rel dword fs:0xffffffffcccccccc]
+ mov bl,[a64 rel dword fs:0xffffffffcccccccc]
+ mov ax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov bx,[a64 rel dword fs:0xffffffffcccccccc]
+ mov eax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel dword fs:0xffffffffcccccccc]
+ mov rax,[a64 rel dword fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel dword fs:0xffffffffcccccccc]
+
+ mov al,[a64 rel qword fs:foo]
+ mov bl,[a64 rel qword fs:foo]
+ mov ax,[a64 rel qword fs:foo]
+ mov bx,[a64 rel qword fs:foo]
+ mov eax,[a64 rel qword fs:foo]
+ mov ebx,[a64 rel qword fs:foo]
+ mov rax,[a64 rel qword fs:foo]
+ mov rbx,[a64 rel qword fs:foo]
+ mov al,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword fs:0xbbbbbbbb]
+ mov bl,[a64 rel qword fs:0xbbbbbbbb]
+ mov ax,[a64 rel qword fs:0xbbbbbbbb]
+ mov bx,[a64 rel qword fs:0xbbbbbbbb]
+ mov eax,[a64 rel qword fs:0xbbbbbbbb]
+ mov ebx,[a64 rel qword fs:0xbbbbbbbb]
+ mov rax,[a64 rel qword fs:0xbbbbbbbb]
+ mov rbx,[a64 rel qword fs:0xbbbbbbbb]
+ mov al,[a64 rel qword fs:0xffffffffcccccccc]
+ mov bl,[a64 rel qword fs:0xffffffffcccccccc]
+ mov ax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov bx,[a64 rel qword fs:0xffffffffcccccccc]
+ mov eax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov ebx,[a64 rel qword fs:0xffffffffcccccccc]
+ mov rax,[a64 rel qword fs:0xffffffffcccccccc]
+ mov rbx,[a64 rel qword fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel fs:foo]
+ mov bl,[a32 rel fs:foo]
+ mov ax,[a32 rel fs:foo]
+ mov bx,[a32 rel fs:foo]
+ mov eax,[a32 rel fs:foo]
+ mov ebx,[a32 rel fs:foo]
+ mov rax,[a32 rel fs:foo]
+ mov rbx,[a32 rel fs:foo]
+ mov al,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel fs:0xbbbbbbbb]
+ mov bl,[a32 rel fs:0xbbbbbbbb]
+ mov ax,[a32 rel fs:0xbbbbbbbb]
+ mov bx,[a32 rel fs:0xbbbbbbbb]
+ mov eax,[a32 rel fs:0xbbbbbbbb]
+ mov ebx,[a32 rel fs:0xbbbbbbbb]
+ mov rax,[a32 rel fs:0xbbbbbbbb]
+ mov rbx,[a32 rel fs:0xbbbbbbbb]
+ mov al,[a32 rel fs:0xffffffffcccccccc]
+ mov bl,[a32 rel fs:0xffffffffcccccccc]
+ mov ax,[a32 rel fs:0xffffffffcccccccc]
+ mov bx,[a32 rel fs:0xffffffffcccccccc]
+ mov eax,[a32 rel fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel fs:0xffffffffcccccccc]
+ mov rax,[a32 rel fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel dword fs:foo]
+ mov bl,[a32 rel dword fs:foo]
+ mov ax,[a32 rel dword fs:foo]
+ mov bx,[a32 rel dword fs:foo]
+ mov eax,[a32 rel dword fs:foo]
+ mov ebx,[a32 rel dword fs:foo]
+ mov rax,[a32 rel dword fs:foo]
+ mov rbx,[a32 rel dword fs:foo]
+ mov al,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword fs:0xbbbbbbbb]
+ mov bl,[a32 rel dword fs:0xbbbbbbbb]
+ mov ax,[a32 rel dword fs:0xbbbbbbbb]
+ mov bx,[a32 rel dword fs:0xbbbbbbbb]
+ mov eax,[a32 rel dword fs:0xbbbbbbbb]
+ mov ebx,[a32 rel dword fs:0xbbbbbbbb]
+ mov rax,[a32 rel dword fs:0xbbbbbbbb]
+ mov rbx,[a32 rel dword fs:0xbbbbbbbb]
+ mov al,[a32 rel dword fs:0xffffffffcccccccc]
+ mov bl,[a32 rel dword fs:0xffffffffcccccccc]
+ mov ax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov bx,[a32 rel dword fs:0xffffffffcccccccc]
+ mov eax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel dword fs:0xffffffffcccccccc]
+ mov rax,[a32 rel dword fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel dword fs:0xffffffffcccccccc]
+
+ mov al,[a32 rel qword fs:foo]
+ mov bl,[a32 rel qword fs:foo]
+ mov ax,[a32 rel qword fs:foo]
+ mov bx,[a32 rel qword fs:foo]
+ mov eax,[a32 rel qword fs:foo]
+ mov ebx,[a32 rel qword fs:foo]
+ mov rax,[a32 rel qword fs:foo]
+ mov rbx,[a32 rel qword fs:foo]
+ mov al,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword fs:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword fs:0xbbbbbbbb]
+ mov bl,[a32 rel qword fs:0xbbbbbbbb]
+ mov ax,[a32 rel qword fs:0xbbbbbbbb]
+ mov bx,[a32 rel qword fs:0xbbbbbbbb]
+ mov eax,[a32 rel qword fs:0xbbbbbbbb]
+ mov ebx,[a32 rel qword fs:0xbbbbbbbb]
+ mov rax,[a32 rel qword fs:0xbbbbbbbb]
+ mov rbx,[a32 rel qword fs:0xbbbbbbbb]
+ mov al,[a32 rel qword fs:0xffffffffcccccccc]
+ mov bl,[a32 rel qword fs:0xffffffffcccccccc]
+ mov ax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov bx,[a32 rel qword fs:0xffffffffcccccccc]
+ mov eax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov ebx,[a32 rel qword fs:0xffffffffcccccccc]
+ mov rax,[a32 rel qword fs:0xffffffffcccccccc]
+ mov rbx,[a32 rel qword fs:0xffffffffcccccccc]
+
+ mov al,[es:foo]
+ mov bl,[es:foo]
+ mov ax,[es:foo]
+ mov bx,[es:foo]
+ mov eax,[es:foo]
+ mov ebx,[es:foo]
+ mov rax,[es:foo]
+ mov rbx,[es:foo]
+ mov al,[es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[es:0xaaaaaaaaaaaaaaaa]
+ mov al,[es:0xbbbbbbbb]
+ mov bl,[es:0xbbbbbbbb]
+ mov ax,[es:0xbbbbbbbb]
+ mov bx,[es:0xbbbbbbbb]
+ mov eax,[es:0xbbbbbbbb]
+ mov ebx,[es:0xbbbbbbbb]
+ mov rax,[es:0xbbbbbbbb]
+ mov rbx,[es:0xbbbbbbbb]
+ mov al,[es:0xffffffffcccccccc]
+ mov bl,[es:0xffffffffcccccccc]
+ mov ax,[es:0xffffffffcccccccc]
+ mov bx,[es:0xffffffffcccccccc]
+ mov eax,[es:0xffffffffcccccccc]
+ mov ebx,[es:0xffffffffcccccccc]
+ mov rax,[es:0xffffffffcccccccc]
+ mov rbx,[es:0xffffffffcccccccc]
+
+ mov al,[dword es:foo]
+ mov bl,[dword es:foo]
+ mov ax,[dword es:foo]
+ mov bx,[dword es:foo]
+ mov eax,[dword es:foo]
+ mov ebx,[dword es:foo]
+ mov rax,[dword es:foo]
+ mov rbx,[dword es:foo]
+ mov al,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[dword es:0xbbbbbbbb]
+ mov bl,[dword es:0xbbbbbbbb]
+ mov ax,[dword es:0xbbbbbbbb]
+ mov bx,[dword es:0xbbbbbbbb]
+ mov eax,[dword es:0xbbbbbbbb]
+ mov ebx,[dword es:0xbbbbbbbb]
+ mov rax,[dword es:0xbbbbbbbb]
+ mov rbx,[dword es:0xbbbbbbbb]
+ mov al,[dword es:0xffffffffcccccccc]
+ mov bl,[dword es:0xffffffffcccccccc]
+ mov ax,[dword es:0xffffffffcccccccc]
+ mov bx,[dword es:0xffffffffcccccccc]
+ mov eax,[dword es:0xffffffffcccccccc]
+ mov ebx,[dword es:0xffffffffcccccccc]
+ mov rax,[dword es:0xffffffffcccccccc]
+ mov rbx,[dword es:0xffffffffcccccccc]
+
+ mov al,[qword es:foo]
+ mov bl,[qword es:foo]
+ mov ax,[qword es:foo]
+ mov bx,[qword es:foo]
+ mov eax,[qword es:foo]
+ mov ebx,[qword es:foo]
+ mov rax,[qword es:foo]
+ mov rbx,[qword es:foo]
+ mov al,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[qword es:0xbbbbbbbb]
+ mov bl,[qword es:0xbbbbbbbb]
+ mov ax,[qword es:0xbbbbbbbb]
+ mov bx,[qword es:0xbbbbbbbb]
+ mov eax,[qword es:0xbbbbbbbb]
+ mov ebx,[qword es:0xbbbbbbbb]
+ mov rax,[qword es:0xbbbbbbbb]
+ mov rbx,[qword es:0xbbbbbbbb]
+ mov al,[qword es:0xffffffffcccccccc]
+ mov bl,[qword es:0xffffffffcccccccc]
+ mov ax,[qword es:0xffffffffcccccccc]
+ mov bx,[qword es:0xffffffffcccccccc]
+ mov eax,[qword es:0xffffffffcccccccc]
+ mov ebx,[qword es:0xffffffffcccccccc]
+ mov rax,[qword es:0xffffffffcccccccc]
+ mov rbx,[qword es:0xffffffffcccccccc]
+
+ mov al,[a64 es:foo]
+ mov bl,[a64 es:foo]
+ mov ax,[a64 es:foo]
+ mov bx,[a64 es:foo]
+ mov eax,[a64 es:foo]
+ mov ebx,[a64 es:foo]
+ mov rax,[a64 es:foo]
+ mov rbx,[a64 es:foo]
+ mov al,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 es:0xbbbbbbbb]
+ mov bl,[a64 es:0xbbbbbbbb]
+ mov ax,[a64 es:0xbbbbbbbb]
+ mov bx,[a64 es:0xbbbbbbbb]
+ mov eax,[a64 es:0xbbbbbbbb]
+ mov ebx,[a64 es:0xbbbbbbbb]
+ mov rax,[a64 es:0xbbbbbbbb]
+ mov rbx,[a64 es:0xbbbbbbbb]
+ mov al,[a64 es:0xffffffffcccccccc]
+ mov bl,[a64 es:0xffffffffcccccccc]
+ mov ax,[a64 es:0xffffffffcccccccc]
+ mov bx,[a64 es:0xffffffffcccccccc]
+ mov eax,[a64 es:0xffffffffcccccccc]
+ mov ebx,[a64 es:0xffffffffcccccccc]
+ mov rax,[a64 es:0xffffffffcccccccc]
+ mov rbx,[a64 es:0xffffffffcccccccc]
+
+ mov al,[a64 dword es:foo]
+ mov bl,[a64 dword es:foo]
+ mov ax,[a64 dword es:foo]
+ mov bx,[a64 dword es:foo]
+ mov eax,[a64 dword es:foo]
+ mov ebx,[a64 dword es:foo]
+ mov rax,[a64 dword es:foo]
+ mov rbx,[a64 dword es:foo]
+ mov al,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 dword es:0xbbbbbbbb]
+ mov bl,[a64 dword es:0xbbbbbbbb]
+ mov ax,[a64 dword es:0xbbbbbbbb]
+ mov bx,[a64 dword es:0xbbbbbbbb]
+ mov eax,[a64 dword es:0xbbbbbbbb]
+ mov ebx,[a64 dword es:0xbbbbbbbb]
+ mov rax,[a64 dword es:0xbbbbbbbb]
+ mov rbx,[a64 dword es:0xbbbbbbbb]
+ mov al,[a64 dword es:0xffffffffcccccccc]
+ mov bl,[a64 dword es:0xffffffffcccccccc]
+ mov ax,[a64 dword es:0xffffffffcccccccc]
+ mov bx,[a64 dword es:0xffffffffcccccccc]
+ mov eax,[a64 dword es:0xffffffffcccccccc]
+ mov ebx,[a64 dword es:0xffffffffcccccccc]
+ mov rax,[a64 dword es:0xffffffffcccccccc]
+ mov rbx,[a64 dword es:0xffffffffcccccccc]
+
+ mov al,[a64 qword es:foo]
+ mov bl,[a64 qword es:foo]
+ mov ax,[a64 qword es:foo]
+ mov bx,[a64 qword es:foo]
+ mov eax,[a64 qword es:foo]
+ mov ebx,[a64 qword es:foo]
+ mov rax,[a64 qword es:foo]
+ mov rbx,[a64 qword es:foo]
+ mov al,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 qword es:0xbbbbbbbb]
+ mov bl,[a64 qword es:0xbbbbbbbb]
+ mov ax,[a64 qword es:0xbbbbbbbb]
+ mov bx,[a64 qword es:0xbbbbbbbb]
+ mov eax,[a64 qword es:0xbbbbbbbb]
+ mov ebx,[a64 qword es:0xbbbbbbbb]
+ mov rax,[a64 qword es:0xbbbbbbbb]
+ mov rbx,[a64 qword es:0xbbbbbbbb]
+ mov al,[a64 qword es:0xffffffffcccccccc]
+ mov bl,[a64 qword es:0xffffffffcccccccc]
+ mov ax,[a64 qword es:0xffffffffcccccccc]
+ mov bx,[a64 qword es:0xffffffffcccccccc]
+ mov eax,[a64 qword es:0xffffffffcccccccc]
+ mov ebx,[a64 qword es:0xffffffffcccccccc]
+ mov rax,[a64 qword es:0xffffffffcccccccc]
+ mov rbx,[a64 qword es:0xffffffffcccccccc]
+
+ mov al,[a32 es:foo]
+ mov bl,[a32 es:foo]
+ mov ax,[a32 es:foo]
+ mov bx,[a32 es:foo]
+ mov eax,[a32 es:foo]
+ mov ebx,[a32 es:foo]
+ mov rax,[a32 es:foo]
+ mov rbx,[a32 es:foo]
+ mov al,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 es:0xbbbbbbbb]
+ mov bl,[a32 es:0xbbbbbbbb]
+ mov ax,[a32 es:0xbbbbbbbb]
+ mov bx,[a32 es:0xbbbbbbbb]
+ mov eax,[a32 es:0xbbbbbbbb]
+ mov ebx,[a32 es:0xbbbbbbbb]
+ mov rax,[a32 es:0xbbbbbbbb]
+ mov rbx,[a32 es:0xbbbbbbbb]
+ mov al,[a32 es:0xffffffffcccccccc]
+ mov bl,[a32 es:0xffffffffcccccccc]
+ mov ax,[a32 es:0xffffffffcccccccc]
+ mov bx,[a32 es:0xffffffffcccccccc]
+ mov eax,[a32 es:0xffffffffcccccccc]
+ mov ebx,[a32 es:0xffffffffcccccccc]
+ mov rax,[a32 es:0xffffffffcccccccc]
+ mov rbx,[a32 es:0xffffffffcccccccc]
+
+ mov al,[a32 dword es:foo]
+ mov bl,[a32 dword es:foo]
+ mov ax,[a32 dword es:foo]
+ mov bx,[a32 dword es:foo]
+ mov eax,[a32 dword es:foo]
+ mov ebx,[a32 dword es:foo]
+ mov rax,[a32 dword es:foo]
+ mov rbx,[a32 dword es:foo]
+ mov al,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 dword es:0xbbbbbbbb]
+ mov bl,[a32 dword es:0xbbbbbbbb]
+ mov ax,[a32 dword es:0xbbbbbbbb]
+ mov bx,[a32 dword es:0xbbbbbbbb]
+ mov eax,[a32 dword es:0xbbbbbbbb]
+ mov ebx,[a32 dword es:0xbbbbbbbb]
+ mov rax,[a32 dword es:0xbbbbbbbb]
+ mov rbx,[a32 dword es:0xbbbbbbbb]
+ mov al,[a32 dword es:0xffffffffcccccccc]
+ mov bl,[a32 dword es:0xffffffffcccccccc]
+ mov ax,[a32 dword es:0xffffffffcccccccc]
+ mov bx,[a32 dword es:0xffffffffcccccccc]
+ mov eax,[a32 dword es:0xffffffffcccccccc]
+ mov ebx,[a32 dword es:0xffffffffcccccccc]
+ mov rax,[a32 dword es:0xffffffffcccccccc]
+ mov rbx,[a32 dword es:0xffffffffcccccccc]
+
+ mov al,[a32 qword es:foo]
+ mov bl,[a32 qword es:foo]
+ mov ax,[a32 qword es:foo]
+ mov bx,[a32 qword es:foo]
+ mov eax,[a32 qword es:foo]
+ mov ebx,[a32 qword es:foo]
+ mov rax,[a32 qword es:foo]
+ mov rbx,[a32 qword es:foo]
+ mov al,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 qword es:0xbbbbbbbb]
+ mov bl,[a32 qword es:0xbbbbbbbb]
+ mov ax,[a32 qword es:0xbbbbbbbb]
+ mov bx,[a32 qword es:0xbbbbbbbb]
+ mov eax,[a32 qword es:0xbbbbbbbb]
+ mov ebx,[a32 qword es:0xbbbbbbbb]
+ mov rax,[a32 qword es:0xbbbbbbbb]
+ mov rbx,[a32 qword es:0xbbbbbbbb]
+ mov al,[a32 qword es:0xffffffffcccccccc]
+ mov bl,[a32 qword es:0xffffffffcccccccc]
+ mov ax,[a32 qword es:0xffffffffcccccccc]
+ mov bx,[a32 qword es:0xffffffffcccccccc]
+ mov eax,[a32 qword es:0xffffffffcccccccc]
+ mov ebx,[a32 qword es:0xffffffffcccccccc]
+ mov rax,[a32 qword es:0xffffffffcccccccc]
+ mov rbx,[a32 qword es:0xffffffffcccccccc]
+
+ mov al,[abs es:foo]
+ mov bl,[abs es:foo]
+ mov ax,[abs es:foo]
+ mov bx,[abs es:foo]
+ mov eax,[abs es:foo]
+ mov ebx,[abs es:foo]
+ mov rax,[abs es:foo]
+ mov rbx,[abs es:foo]
+ mov al,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs es:0xbbbbbbbb]
+ mov bl,[abs es:0xbbbbbbbb]
+ mov ax,[abs es:0xbbbbbbbb]
+ mov bx,[abs es:0xbbbbbbbb]
+ mov eax,[abs es:0xbbbbbbbb]
+ mov ebx,[abs es:0xbbbbbbbb]
+ mov rax,[abs es:0xbbbbbbbb]
+ mov rbx,[abs es:0xbbbbbbbb]
+ mov al,[abs es:0xffffffffcccccccc]
+ mov bl,[abs es:0xffffffffcccccccc]
+ mov ax,[abs es:0xffffffffcccccccc]
+ mov bx,[abs es:0xffffffffcccccccc]
+ mov eax,[abs es:0xffffffffcccccccc]
+ mov ebx,[abs es:0xffffffffcccccccc]
+ mov rax,[abs es:0xffffffffcccccccc]
+ mov rbx,[abs es:0xffffffffcccccccc]
+
+ mov al,[abs dword es:foo]
+ mov bl,[abs dword es:foo]
+ mov ax,[abs dword es:foo]
+ mov bx,[abs dword es:foo]
+ mov eax,[abs dword es:foo]
+ mov ebx,[abs dword es:foo]
+ mov rax,[abs dword es:foo]
+ mov rbx,[abs dword es:foo]
+ mov al,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs dword es:0xbbbbbbbb]
+ mov bl,[abs dword es:0xbbbbbbbb]
+ mov ax,[abs dword es:0xbbbbbbbb]
+ mov bx,[abs dword es:0xbbbbbbbb]
+ mov eax,[abs dword es:0xbbbbbbbb]
+ mov ebx,[abs dword es:0xbbbbbbbb]
+ mov rax,[abs dword es:0xbbbbbbbb]
+ mov rbx,[abs dword es:0xbbbbbbbb]
+ mov al,[abs dword es:0xffffffffcccccccc]
+ mov bl,[abs dword es:0xffffffffcccccccc]
+ mov ax,[abs dword es:0xffffffffcccccccc]
+ mov bx,[abs dword es:0xffffffffcccccccc]
+ mov eax,[abs dword es:0xffffffffcccccccc]
+ mov ebx,[abs dword es:0xffffffffcccccccc]
+ mov rax,[abs dword es:0xffffffffcccccccc]
+ mov rbx,[abs dword es:0xffffffffcccccccc]
+
+ mov al,[abs qword es:foo]
+ mov bl,[abs qword es:foo]
+ mov ax,[abs qword es:foo]
+ mov bx,[abs qword es:foo]
+ mov eax,[abs qword es:foo]
+ mov ebx,[abs qword es:foo]
+ mov rax,[abs qword es:foo]
+ mov rbx,[abs qword es:foo]
+ mov al,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[abs qword es:0xbbbbbbbb]
+ mov bl,[abs qword es:0xbbbbbbbb]
+ mov ax,[abs qword es:0xbbbbbbbb]
+ mov bx,[abs qword es:0xbbbbbbbb]
+ mov eax,[abs qword es:0xbbbbbbbb]
+ mov ebx,[abs qword es:0xbbbbbbbb]
+ mov rax,[abs qword es:0xbbbbbbbb]
+ mov rbx,[abs qword es:0xbbbbbbbb]
+ mov al,[abs qword es:0xffffffffcccccccc]
+ mov bl,[abs qword es:0xffffffffcccccccc]
+ mov ax,[abs qword es:0xffffffffcccccccc]
+ mov bx,[abs qword es:0xffffffffcccccccc]
+ mov eax,[abs qword es:0xffffffffcccccccc]
+ mov ebx,[abs qword es:0xffffffffcccccccc]
+ mov rax,[abs qword es:0xffffffffcccccccc]
+ mov rbx,[abs qword es:0xffffffffcccccccc]
+
+ mov al,[a64 abs es:foo]
+ mov bl,[a64 abs es:foo]
+ mov ax,[a64 abs es:foo]
+ mov bx,[a64 abs es:foo]
+ mov eax,[a64 abs es:foo]
+ mov ebx,[a64 abs es:foo]
+ mov rax,[a64 abs es:foo]
+ mov rbx,[a64 abs es:foo]
+ mov al,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs es:0xbbbbbbbb]
+ mov bl,[a64 abs es:0xbbbbbbbb]
+ mov ax,[a64 abs es:0xbbbbbbbb]
+ mov bx,[a64 abs es:0xbbbbbbbb]
+ mov eax,[a64 abs es:0xbbbbbbbb]
+ mov ebx,[a64 abs es:0xbbbbbbbb]
+ mov rax,[a64 abs es:0xbbbbbbbb]
+ mov rbx,[a64 abs es:0xbbbbbbbb]
+ mov al,[a64 abs es:0xffffffffcccccccc]
+ mov bl,[a64 abs es:0xffffffffcccccccc]
+ mov ax,[a64 abs es:0xffffffffcccccccc]
+ mov bx,[a64 abs es:0xffffffffcccccccc]
+ mov eax,[a64 abs es:0xffffffffcccccccc]
+ mov ebx,[a64 abs es:0xffffffffcccccccc]
+ mov rax,[a64 abs es:0xffffffffcccccccc]
+ mov rbx,[a64 abs es:0xffffffffcccccccc]
+
+ mov al,[a64 abs dword es:foo]
+ mov bl,[a64 abs dword es:foo]
+ mov ax,[a64 abs dword es:foo]
+ mov bx,[a64 abs dword es:foo]
+ mov eax,[a64 abs dword es:foo]
+ mov ebx,[a64 abs dword es:foo]
+ mov rax,[a64 abs dword es:foo]
+ mov rbx,[a64 abs dword es:foo]
+ mov al,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs dword es:0xbbbbbbbb]
+ mov bl,[a64 abs dword es:0xbbbbbbbb]
+ mov ax,[a64 abs dword es:0xbbbbbbbb]
+ mov bx,[a64 abs dword es:0xbbbbbbbb]
+ mov eax,[a64 abs dword es:0xbbbbbbbb]
+ mov ebx,[a64 abs dword es:0xbbbbbbbb]
+ mov rax,[a64 abs dword es:0xbbbbbbbb]
+ mov rbx,[a64 abs dword es:0xbbbbbbbb]
+ mov al,[a64 abs dword es:0xffffffffcccccccc]
+ mov bl,[a64 abs dword es:0xffffffffcccccccc]
+ mov ax,[a64 abs dword es:0xffffffffcccccccc]
+ mov bx,[a64 abs dword es:0xffffffffcccccccc]
+ mov eax,[a64 abs dword es:0xffffffffcccccccc]
+ mov ebx,[a64 abs dword es:0xffffffffcccccccc]
+ mov rax,[a64 abs dword es:0xffffffffcccccccc]
+ mov rbx,[a64 abs dword es:0xffffffffcccccccc]
+
+ mov al,[a64 abs qword es:foo]
+ mov bl,[a64 abs qword es:foo]
+ mov ax,[a64 abs qword es:foo]
+ mov bx,[a64 abs qword es:foo]
+ mov eax,[a64 abs qword es:foo]
+ mov ebx,[a64 abs qword es:foo]
+ mov rax,[a64 abs qword es:foo]
+ mov rbx,[a64 abs qword es:foo]
+ mov al,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 abs qword es:0xbbbbbbbb]
+ mov bl,[a64 abs qword es:0xbbbbbbbb]
+ mov ax,[a64 abs qword es:0xbbbbbbbb]
+ mov bx,[a64 abs qword es:0xbbbbbbbb]
+ mov eax,[a64 abs qword es:0xbbbbbbbb]
+ mov ebx,[a64 abs qword es:0xbbbbbbbb]
+ mov rax,[a64 abs qword es:0xbbbbbbbb]
+ mov rbx,[a64 abs qword es:0xbbbbbbbb]
+ mov al,[a64 abs qword es:0xffffffffcccccccc]
+ mov bl,[a64 abs qword es:0xffffffffcccccccc]
+ mov ax,[a64 abs qword es:0xffffffffcccccccc]
+ mov bx,[a64 abs qword es:0xffffffffcccccccc]
+ mov eax,[a64 abs qword es:0xffffffffcccccccc]
+ mov ebx,[a64 abs qword es:0xffffffffcccccccc]
+ mov rax,[a64 abs qword es:0xffffffffcccccccc]
+ mov rbx,[a64 abs qword es:0xffffffffcccccccc]
+
+ mov al,[a32 abs es:foo]
+ mov bl,[a32 abs es:foo]
+ mov ax,[a32 abs es:foo]
+ mov bx,[a32 abs es:foo]
+ mov eax,[a32 abs es:foo]
+ mov ebx,[a32 abs es:foo]
+ mov rax,[a32 abs es:foo]
+ mov rbx,[a32 abs es:foo]
+ mov al,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs es:0xbbbbbbbb]
+ mov bl,[a32 abs es:0xbbbbbbbb]
+ mov ax,[a32 abs es:0xbbbbbbbb]
+ mov bx,[a32 abs es:0xbbbbbbbb]
+ mov eax,[a32 abs es:0xbbbbbbbb]
+ mov ebx,[a32 abs es:0xbbbbbbbb]
+ mov rax,[a32 abs es:0xbbbbbbbb]
+ mov rbx,[a32 abs es:0xbbbbbbbb]
+ mov al,[a32 abs es:0xffffffffcccccccc]
+ mov bl,[a32 abs es:0xffffffffcccccccc]
+ mov ax,[a32 abs es:0xffffffffcccccccc]
+ mov bx,[a32 abs es:0xffffffffcccccccc]
+ mov eax,[a32 abs es:0xffffffffcccccccc]
+ mov ebx,[a32 abs es:0xffffffffcccccccc]
+ mov rax,[a32 abs es:0xffffffffcccccccc]
+ mov rbx,[a32 abs es:0xffffffffcccccccc]
+
+ mov al,[a32 abs dword es:foo]
+ mov bl,[a32 abs dword es:foo]
+ mov ax,[a32 abs dword es:foo]
+ mov bx,[a32 abs dword es:foo]
+ mov eax,[a32 abs dword es:foo]
+ mov ebx,[a32 abs dword es:foo]
+ mov rax,[a32 abs dword es:foo]
+ mov rbx,[a32 abs dword es:foo]
+ mov al,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs dword es:0xbbbbbbbb]
+ mov bl,[a32 abs dword es:0xbbbbbbbb]
+ mov ax,[a32 abs dword es:0xbbbbbbbb]
+ mov bx,[a32 abs dword es:0xbbbbbbbb]
+ mov eax,[a32 abs dword es:0xbbbbbbbb]
+ mov ebx,[a32 abs dword es:0xbbbbbbbb]
+ mov rax,[a32 abs dword es:0xbbbbbbbb]
+ mov rbx,[a32 abs dword es:0xbbbbbbbb]
+ mov al,[a32 abs dword es:0xffffffffcccccccc]
+ mov bl,[a32 abs dword es:0xffffffffcccccccc]
+ mov ax,[a32 abs dword es:0xffffffffcccccccc]
+ mov bx,[a32 abs dword es:0xffffffffcccccccc]
+ mov eax,[a32 abs dword es:0xffffffffcccccccc]
+ mov ebx,[a32 abs dword es:0xffffffffcccccccc]
+ mov rax,[a32 abs dword es:0xffffffffcccccccc]
+ mov rbx,[a32 abs dword es:0xffffffffcccccccc]
+
+ mov al,[a32 abs qword es:foo]
+ mov bl,[a32 abs qword es:foo]
+ mov ax,[a32 abs qword es:foo]
+ mov bx,[a32 abs qword es:foo]
+ mov eax,[a32 abs qword es:foo]
+ mov ebx,[a32 abs qword es:foo]
+ mov rax,[a32 abs qword es:foo]
+ mov rbx,[a32 abs qword es:foo]
+ mov al,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 abs qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 abs qword es:0xbbbbbbbb]
+ mov bl,[a32 abs qword es:0xbbbbbbbb]
+ mov ax,[a32 abs qword es:0xbbbbbbbb]
+ mov bx,[a32 abs qword es:0xbbbbbbbb]
+ mov eax,[a32 abs qword es:0xbbbbbbbb]
+ mov ebx,[a32 abs qword es:0xbbbbbbbb]
+ mov rax,[a32 abs qword es:0xbbbbbbbb]
+ mov rbx,[a32 abs qword es:0xbbbbbbbb]
+ mov al,[a32 abs qword es:0xffffffffcccccccc]
+ mov bl,[a32 abs qword es:0xffffffffcccccccc]
+ mov ax,[a32 abs qword es:0xffffffffcccccccc]
+ mov bx,[a32 abs qword es:0xffffffffcccccccc]
+ mov eax,[a32 abs qword es:0xffffffffcccccccc]
+ mov ebx,[a32 abs qword es:0xffffffffcccccccc]
+ mov rax,[a32 abs qword es:0xffffffffcccccccc]
+ mov rbx,[a32 abs qword es:0xffffffffcccccccc]
+
+ mov al,[rel es:foo]
+ mov bl,[rel es:foo]
+ mov ax,[rel es:foo]
+ mov bx,[rel es:foo]
+ mov eax,[rel es:foo]
+ mov ebx,[rel es:foo]
+ mov rax,[rel es:foo]
+ mov rbx,[rel es:foo]
+ mov al,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel es:0xbbbbbbbb]
+ mov bl,[rel es:0xbbbbbbbb]
+ mov ax,[rel es:0xbbbbbbbb]
+ mov bx,[rel es:0xbbbbbbbb]
+ mov eax,[rel es:0xbbbbbbbb]
+ mov ebx,[rel es:0xbbbbbbbb]
+ mov rax,[rel es:0xbbbbbbbb]
+ mov rbx,[rel es:0xbbbbbbbb]
+ mov al,[rel es:0xffffffffcccccccc]
+ mov bl,[rel es:0xffffffffcccccccc]
+ mov ax,[rel es:0xffffffffcccccccc]
+ mov bx,[rel es:0xffffffffcccccccc]
+ mov eax,[rel es:0xffffffffcccccccc]
+ mov ebx,[rel es:0xffffffffcccccccc]
+ mov rax,[rel es:0xffffffffcccccccc]
+ mov rbx,[rel es:0xffffffffcccccccc]
+
+ mov al,[rel dword es:foo]
+ mov bl,[rel dword es:foo]
+ mov ax,[rel dword es:foo]
+ mov bx,[rel dword es:foo]
+ mov eax,[rel dword es:foo]
+ mov ebx,[rel dword es:foo]
+ mov rax,[rel dword es:foo]
+ mov rbx,[rel dword es:foo]
+ mov al,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel dword es:0xbbbbbbbb]
+ mov bl,[rel dword es:0xbbbbbbbb]
+ mov ax,[rel dword es:0xbbbbbbbb]
+ mov bx,[rel dword es:0xbbbbbbbb]
+ mov eax,[rel dword es:0xbbbbbbbb]
+ mov ebx,[rel dword es:0xbbbbbbbb]
+ mov rax,[rel dword es:0xbbbbbbbb]
+ mov rbx,[rel dword es:0xbbbbbbbb]
+ mov al,[rel dword es:0xffffffffcccccccc]
+ mov bl,[rel dword es:0xffffffffcccccccc]
+ mov ax,[rel dword es:0xffffffffcccccccc]
+ mov bx,[rel dword es:0xffffffffcccccccc]
+ mov eax,[rel dword es:0xffffffffcccccccc]
+ mov ebx,[rel dword es:0xffffffffcccccccc]
+ mov rax,[rel dword es:0xffffffffcccccccc]
+ mov rbx,[rel dword es:0xffffffffcccccccc]
+
+ mov al,[rel qword es:foo]
+ mov bl,[rel qword es:foo]
+ mov ax,[rel qword es:foo]
+ mov bx,[rel qword es:foo]
+ mov eax,[rel qword es:foo]
+ mov ebx,[rel qword es:foo]
+ mov rax,[rel qword es:foo]
+ mov rbx,[rel qword es:foo]
+ mov al,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[rel qword es:0xbbbbbbbb]
+ mov bl,[rel qword es:0xbbbbbbbb]
+ mov ax,[rel qword es:0xbbbbbbbb]
+ mov bx,[rel qword es:0xbbbbbbbb]
+ mov eax,[rel qword es:0xbbbbbbbb]
+ mov ebx,[rel qword es:0xbbbbbbbb]
+ mov rax,[rel qword es:0xbbbbbbbb]
+ mov rbx,[rel qword es:0xbbbbbbbb]
+ mov al,[rel qword es:0xffffffffcccccccc]
+ mov bl,[rel qword es:0xffffffffcccccccc]
+ mov ax,[rel qword es:0xffffffffcccccccc]
+ mov bx,[rel qword es:0xffffffffcccccccc]
+ mov eax,[rel qword es:0xffffffffcccccccc]
+ mov ebx,[rel qword es:0xffffffffcccccccc]
+ mov rax,[rel qword es:0xffffffffcccccccc]
+ mov rbx,[rel qword es:0xffffffffcccccccc]
+
+ mov al,[a64 rel es:foo]
+ mov bl,[a64 rel es:foo]
+ mov ax,[a64 rel es:foo]
+ mov bx,[a64 rel es:foo]
+ mov eax,[a64 rel es:foo]
+ mov ebx,[a64 rel es:foo]
+ mov rax,[a64 rel es:foo]
+ mov rbx,[a64 rel es:foo]
+ mov al,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel es:0xbbbbbbbb]
+ mov bl,[a64 rel es:0xbbbbbbbb]
+ mov ax,[a64 rel es:0xbbbbbbbb]
+ mov bx,[a64 rel es:0xbbbbbbbb]
+ mov eax,[a64 rel es:0xbbbbbbbb]
+ mov ebx,[a64 rel es:0xbbbbbbbb]
+ mov rax,[a64 rel es:0xbbbbbbbb]
+ mov rbx,[a64 rel es:0xbbbbbbbb]
+ mov al,[a64 rel es:0xffffffffcccccccc]
+ mov bl,[a64 rel es:0xffffffffcccccccc]
+ mov ax,[a64 rel es:0xffffffffcccccccc]
+ mov bx,[a64 rel es:0xffffffffcccccccc]
+ mov eax,[a64 rel es:0xffffffffcccccccc]
+ mov ebx,[a64 rel es:0xffffffffcccccccc]
+ mov rax,[a64 rel es:0xffffffffcccccccc]
+ mov rbx,[a64 rel es:0xffffffffcccccccc]
+
+ mov al,[a64 rel dword es:foo]
+ mov bl,[a64 rel dword es:foo]
+ mov ax,[a64 rel dword es:foo]
+ mov bx,[a64 rel dword es:foo]
+ mov eax,[a64 rel dword es:foo]
+ mov ebx,[a64 rel dword es:foo]
+ mov rax,[a64 rel dword es:foo]
+ mov rbx,[a64 rel dword es:foo]
+ mov al,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel dword es:0xbbbbbbbb]
+ mov bl,[a64 rel dword es:0xbbbbbbbb]
+ mov ax,[a64 rel dword es:0xbbbbbbbb]
+ mov bx,[a64 rel dword es:0xbbbbbbbb]
+ mov eax,[a64 rel dword es:0xbbbbbbbb]
+ mov ebx,[a64 rel dword es:0xbbbbbbbb]
+ mov rax,[a64 rel dword es:0xbbbbbbbb]
+ mov rbx,[a64 rel dword es:0xbbbbbbbb]
+ mov al,[a64 rel dword es:0xffffffffcccccccc]
+ mov bl,[a64 rel dword es:0xffffffffcccccccc]
+ mov ax,[a64 rel dword es:0xffffffffcccccccc]
+ mov bx,[a64 rel dword es:0xffffffffcccccccc]
+ mov eax,[a64 rel dword es:0xffffffffcccccccc]
+ mov ebx,[a64 rel dword es:0xffffffffcccccccc]
+ mov rax,[a64 rel dword es:0xffffffffcccccccc]
+ mov rbx,[a64 rel dword es:0xffffffffcccccccc]
+
+ mov al,[a64 rel qword es:foo]
+ mov bl,[a64 rel qword es:foo]
+ mov ax,[a64 rel qword es:foo]
+ mov bx,[a64 rel qword es:foo]
+ mov eax,[a64 rel qword es:foo]
+ mov ebx,[a64 rel qword es:foo]
+ mov rax,[a64 rel qword es:foo]
+ mov rbx,[a64 rel qword es:foo]
+ mov al,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a64 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a64 rel qword es:0xbbbbbbbb]
+ mov bl,[a64 rel qword es:0xbbbbbbbb]
+ mov ax,[a64 rel qword es:0xbbbbbbbb]
+ mov bx,[a64 rel qword es:0xbbbbbbbb]
+ mov eax,[a64 rel qword es:0xbbbbbbbb]
+ mov ebx,[a64 rel qword es:0xbbbbbbbb]
+ mov rax,[a64 rel qword es:0xbbbbbbbb]
+ mov rbx,[a64 rel qword es:0xbbbbbbbb]
+ mov al,[a64 rel qword es:0xffffffffcccccccc]
+ mov bl,[a64 rel qword es:0xffffffffcccccccc]
+ mov ax,[a64 rel qword es:0xffffffffcccccccc]
+ mov bx,[a64 rel qword es:0xffffffffcccccccc]
+ mov eax,[a64 rel qword es:0xffffffffcccccccc]
+ mov ebx,[a64 rel qword es:0xffffffffcccccccc]
+ mov rax,[a64 rel qword es:0xffffffffcccccccc]
+ mov rbx,[a64 rel qword es:0xffffffffcccccccc]
+
+ mov al,[a32 rel es:foo]
+ mov bl,[a32 rel es:foo]
+ mov ax,[a32 rel es:foo]
+ mov bx,[a32 rel es:foo]
+ mov eax,[a32 rel es:foo]
+ mov ebx,[a32 rel es:foo]
+ mov rax,[a32 rel es:foo]
+ mov rbx,[a32 rel es:foo]
+ mov al,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel es:0xbbbbbbbb]
+ mov bl,[a32 rel es:0xbbbbbbbb]
+ mov ax,[a32 rel es:0xbbbbbbbb]
+ mov bx,[a32 rel es:0xbbbbbbbb]
+ mov eax,[a32 rel es:0xbbbbbbbb]
+ mov ebx,[a32 rel es:0xbbbbbbbb]
+ mov rax,[a32 rel es:0xbbbbbbbb]
+ mov rbx,[a32 rel es:0xbbbbbbbb]
+ mov al,[a32 rel es:0xffffffffcccccccc]
+ mov bl,[a32 rel es:0xffffffffcccccccc]
+ mov ax,[a32 rel es:0xffffffffcccccccc]
+ mov bx,[a32 rel es:0xffffffffcccccccc]
+ mov eax,[a32 rel es:0xffffffffcccccccc]
+ mov ebx,[a32 rel es:0xffffffffcccccccc]
+ mov rax,[a32 rel es:0xffffffffcccccccc]
+ mov rbx,[a32 rel es:0xffffffffcccccccc]
+
+ mov al,[a32 rel dword es:foo]
+ mov bl,[a32 rel dword es:foo]
+ mov ax,[a32 rel dword es:foo]
+ mov bx,[a32 rel dword es:foo]
+ mov eax,[a32 rel dword es:foo]
+ mov ebx,[a32 rel dword es:foo]
+ mov rax,[a32 rel dword es:foo]
+ mov rbx,[a32 rel dword es:foo]
+ mov al,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel dword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel dword es:0xbbbbbbbb]
+ mov bl,[a32 rel dword es:0xbbbbbbbb]
+ mov ax,[a32 rel dword es:0xbbbbbbbb]
+ mov bx,[a32 rel dword es:0xbbbbbbbb]
+ mov eax,[a32 rel dword es:0xbbbbbbbb]
+ mov ebx,[a32 rel dword es:0xbbbbbbbb]
+ mov rax,[a32 rel dword es:0xbbbbbbbb]
+ mov rbx,[a32 rel dword es:0xbbbbbbbb]
+ mov al,[a32 rel dword es:0xffffffffcccccccc]
+ mov bl,[a32 rel dword es:0xffffffffcccccccc]
+ mov ax,[a32 rel dword es:0xffffffffcccccccc]
+ mov bx,[a32 rel dword es:0xffffffffcccccccc]
+ mov eax,[a32 rel dword es:0xffffffffcccccccc]
+ mov ebx,[a32 rel dword es:0xffffffffcccccccc]
+ mov rax,[a32 rel dword es:0xffffffffcccccccc]
+ mov rbx,[a32 rel dword es:0xffffffffcccccccc]
+
+ mov al,[a32 rel qword es:foo]
+ mov bl,[a32 rel qword es:foo]
+ mov ax,[a32 rel qword es:foo]
+ mov bx,[a32 rel qword es:foo]
+ mov eax,[a32 rel qword es:foo]
+ mov ebx,[a32 rel qword es:foo]
+ mov rax,[a32 rel qword es:foo]
+ mov rbx,[a32 rel qword es:foo]
+ mov al,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bl,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov bx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov eax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov ebx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rax,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov rbx,[a32 rel qword es:0xaaaaaaaaaaaaaaaa]
+ mov al,[a32 rel qword es:0xbbbbbbbb]
+ mov bl,[a32 rel qword es:0xbbbbbbbb]
+ mov ax,[a32 rel qword es:0xbbbbbbbb]
+ mov bx,[a32 rel qword es:0xbbbbbbbb]
+ mov eax,[a32 rel qword es:0xbbbbbbbb]
+ mov ebx,[a32 rel qword es:0xbbbbbbbb]
+ mov rax,[a32 rel qword es:0xbbbbbbbb]
+ mov rbx,[a32 rel qword es:0xbbbbbbbb]
+ mov al,[a32 rel qword es:0xffffffffcccccccc]
+ mov bl,[a32 rel qword es:0xffffffffcccccccc]
+ mov ax,[a32 rel qword es:0xffffffffcccccccc]
+ mov bx,[a32 rel qword es:0xffffffffcccccccc]
+ mov eax,[a32 rel qword es:0xffffffffcccccccc]
+ mov ebx,[a32 rel qword es:0xffffffffcccccccc]
+ mov rax,[a32 rel qword es:0xffffffffcccccccc]
+ mov rbx,[a32 rel qword es:0xffffffffcccccccc]
+
+
+foo:
diff --git a/test/riprel.pl b/test/riprel.pl
new file mode 100755
index 00000000..61af7239
--- /dev/null
+++ b/test/riprel.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+print ";Testname=unoptimized; Arguments=-fbin -oriprel.bin -O0; Files=stdout stderr riprel.bin\n";
+print ";Testname=optimized; Arguments=-fbin -oriprel.bin -Ox; Files=stdout stderr riprel.bin\n";
+
+
+print "\tbits 64\n";
+
+foreach $mode ('abs', 'rel') {
+ print "\n\tdefault $mode\n\n";
+
+ foreach $so ('', 'fs:', 'es:') {
+ foreach $rq ('', 'abs ', 'rel ') {
+ foreach $ao ('', 'a64 ', 'a32 ') {
+ foreach $sq ('', 'dword ', 'qword ') {
+ foreach $v ('foo', '0xaaaaaaaaaaaaaaaa', '0xbbbbbbbb',
+ '0xffffffffcccccccc') {
+ foreach $r ( 'al', 'bl', 'ax', 'bx', 'eax', 'ebx', 'rax', 'rbx') {
+ print "\tmov $r,[$ao$rq$sq$so$v]\n";
+ }
+ }
+ print "\n";
+ }
+ }
+ }
+ }
+}
+
+print "\nfoo:\n";
diff --git a/test/riprel2.asm b/test/riprel2.asm
new file mode 100644
index 00000000..2d13d3e4
--- /dev/null
+++ b/test/riprel2.asm
@@ -0,0 +1,11 @@
+;Testname=unoptimized; Arguments=-fbin -oriprel2.bin -O0; Files=stdout stderr riprel.bin
+;Testname=optimized; Arguments=-fbin -oriprel2.bin -Ox; Files=stdout stderr riprel.bin
+
+ bits 64
+
+ default rel
+ mov dword [foo],12345678h
+ mov qword [foo],12345678h
+ mov [foo],rax
+ mov dword [foo],12345678h
+foo:
diff --git a/test/sha-64.asm b/test/sha-64.asm
new file mode 100644
index 00000000..6cce663e
--- /dev/null
+++ b/test/sha-64.asm
@@ -0,0 +1,30 @@
+;Testname=sha-64; Arguments=-felf64 -osha-64.o -O0; Files=stdout stderr sha-64.o
+BITS 64
+ sha1rnds4 xmm1, xmm2, 9
+ sha1rnds4 xmm2, [rax], 7
+ sha1rnds4 xmm3, [rax+0x12], 5
+ sha1rnds4 xmm4, [rax+rbx*2], 1
+ sha1nexte xmm1, xmm2
+ sha1nexte xmm2, [rax]
+ sha1nexte xmm3, [rax+0x12]
+ sha1nexte xmm4, [rax+rbx*2]
+ sha1msg1 xmm1, xmm2
+ sha1msg1 xmm2, [rax]
+ sha1msg1 xmm3, [rax+0x12]
+ sha1msg1 xmm4, [rax+rbx*2]
+ sha1msg2 xmm1, xmm2
+ sha1msg2 xmm2, [rax]
+ sha1msg2 xmm3, [rax+0x12]
+ sha1msg2 xmm4, [rax+rbx*2]
+ sha256rnds2 xmm1, xmm2, xmm0
+ sha256rnds2 xmm2, [rax], xmm0
+ sha256rnds2 xmm3, [rax+0x12], xmm0
+ sha256rnds2 xmm4, [rax+rbx*2], xmm0
+ sha256msg1 xmm1, xmm2
+ sha256msg1 xmm2, [rax]
+ sha256msg1 xmm3, [rax+0x12]
+ sha256msg1 xmm4, [rax+rbx*2]
+ sha256msg2 xmm1, xmm2
+ sha256msg2 xmm2, [rax]
+ sha256msg2 xmm3, [rax+0x12]
+ sha256msg2 xmm4, [rax+rbx*2]
diff --git a/test/sha.asm b/test/sha.asm
new file mode 100644
index 00000000..684cadd5
--- /dev/null
+++ b/test/sha.asm
@@ -0,0 +1,31 @@
+;Testname=sha; Arguments=-felf -osha.o -O0; Files=stdout stderr sha.o
+BITS 32
+
+ sha1rnds4 xmm1, xmm2, 9
+ sha1rnds4 xmm2, [eax], 7
+ sha1rnds4 xmm3, [eax+0x12], 5
+ sha1rnds4 xmm4, [eax+ebx*2], 1
+ sha1nexte xmm1, xmm2
+ sha1nexte xmm2, [eax]
+ sha1nexte xmm3, [eax+0x12]
+ sha1nexte xmm4, [eax+ebx*2]
+ sha1msg1 xmm1, xmm2
+ sha1msg1 xmm2, [eax]
+ sha1msg1 xmm3, [eax+0x12]
+ sha1msg1 xmm4, [eax+ebx*2]
+ sha1msg2 xmm1, xmm2
+ sha1msg2 xmm2, [eax]
+ sha1msg2 xmm3, [eax+0x12]
+ sha1msg2 xmm4, [eax+ebx*2]
+ sha256rnds2 xmm1, xmm2, xmm0
+ sha256rnds2 xmm2, [eax], xmm0
+ sha256rnds2 xmm3, [eax+0x12], xmm0
+ sha256rnds2 xmm4, [eax+ebx*2], xmm0
+ sha256msg1 xmm1, xmm2
+ sha256msg1 xmm2, [eax]
+ sha256msg1 xmm3, [eax+0x12]
+ sha256msg1 xmm4, [eax+ebx*2]
+ sha256msg2 xmm1, xmm2
+ sha256msg2 xmm2, [eax]
+ sha256msg2 xmm3, [eax+0x12]
+ sha256msg2 xmm4, [eax+ebx*2]
diff --git a/test/smartalign16.asm b/test/smartalign16.asm
new file mode 100644
index 00000000..42915de6
--- /dev/null
+++ b/test/smartalign16.asm
@@ -0,0 +1,36 @@
+;Testname=test; Arguments=-fbin -osmartalign16.bin; Files=stdout stderr smartalign16.bin
+
+%use smartalign
+
+ bits 16
+
+ alignmode nop, 32
+ add ax,ax
+ align 32
+
+ alignmode generic, 32
+ add ax,ax
+ align 32
+
+ alignmode k7, 32
+ add ax,ax
+ align 32
+
+ alignmode k8, 32
+ add ax,ax
+ align 32
+
+ alignmode p6, 32
+ add ax,ax
+ align 32
+
+ add ecx,ecx
+ align 32
+ add edx,edx
+ align 128
+ add ebx,ebx
+ align 256
+ add esi,esi
+ align 512
+
+ add edi,edi
diff --git a/test/smartalign32.asm b/test/smartalign32.asm
new file mode 100644
index 00000000..64d65b0b
--- /dev/null
+++ b/test/smartalign32.asm
@@ -0,0 +1,36 @@
+;Testname=test; Arguments=-fbin -osmartalign32.bin; Files=stdout stderr smartalign32.bin
+
+%use smartalign
+
+ bits 32
+
+ alignmode nop, 32
+ add ax,ax
+ align 32
+
+ alignmode generic, 32
+ add ax,ax
+ align 32
+
+ alignmode k7, 32
+ add ax,ax
+ align 32
+
+ alignmode k8, 32
+ add ax,ax
+ align 32
+
+ alignmode p6, 32
+ add ax,ax
+ align 32
+
+ add ecx,ecx
+ align 32
+ add edx,edx
+ align 128
+ add ebx,ebx
+ align 256
+ add esi,esi
+ align 512
+
+ add edi,edi
diff --git a/test/smartalign64.asm b/test/smartalign64.asm
new file mode 100644
index 00000000..74454ca8
--- /dev/null
+++ b/test/smartalign64.asm
@@ -0,0 +1,36 @@
+;Testname=test; Arguments=-fbin -osmartalign64.bin; Files=stdout stderr smartalign64.bin
+
+%use smartalign
+
+ bits 64
+
+ alignmode nop, 32
+ add ax,ax
+ align 32
+
+ alignmode generic, 32
+ add ax,ax
+ align 32
+
+ alignmode k7, 32
+ add ax,ax
+ align 32
+
+ alignmode k8, 32
+ add ax,ax
+ align 32
+
+ alignmode p6, 32
+ add ax,ax
+ align 32
+
+ add ecx,ecx
+ align 32
+ add edx,edx
+ align 128
+ add ebx,ebx
+ align 256
+ add esi,esi
+ align 512
+
+ add edi,edi
diff --git a/test/splitea.asm b/test/splitea.asm
new file mode 100644
index 00000000..a2d980b2
--- /dev/null
+++ b/test/splitea.asm
@@ -0,0 +1,11 @@
+ bits 32
+
+ mov eax,[eax]
+ mov eax,[eax+ecx]
+ mov eax,[eax+ecx*4]
+ mov eax,[eax+ecx*4+8]
+
+ mov eax,[eax]
+ mov eax,[eax,ecx]
+ mov eax,[eax,ecx*4]
+ mov eax,[eax+8,ecx*4]
diff --git a/test/sreg.asm b/test/sreg.asm
new file mode 100644
index 00000000..11449a50
--- /dev/null
+++ b/test/sreg.asm
@@ -0,0 +1,65 @@
+ bits 64
+ mov es,rax
+ mov ss,rax
+ mov ds,rax
+ mov fs,rax
+ mov gs,rax
+ mov es,eax
+ mov ss,eax
+ mov ds,eax
+ mov fs,eax
+ mov gs,eax
+ mov es,ax
+ mov ss,ax
+ mov ds,ax
+ mov fs,ax
+ mov gs,ax
+ mov es,[rsi]
+ mov ss,[rsi]
+ mov ds,[rsi]
+ mov fs,[rsi]
+ mov gs,[rsi]
+ mov es,word [rsi]
+ mov ss,word [rsi]
+ mov ds,word [rsi]
+ mov fs,word [rsi]
+ mov gs,word [rsi]
+ mov es,qword [rsi]
+ mov ss,qword [rsi]
+ mov ds,qword [rsi]
+ mov fs,qword [rsi]
+ mov gs,qword [rsi]
+ mov rax,es
+ mov rax,cs
+ mov rax,ss
+ mov rax,ds
+ mov rax,fs
+ mov rax,gs
+ mov eax,es
+ mov eax,ss
+ mov eax,ds
+ mov eax,fs
+ mov eax,fs
+ mov ax,es
+ mov ax,ss
+ mov ax,ds
+ mov ax,fs
+ mov ax,gs
+ mov [rdi],es
+ mov [rdi],cs
+ mov [rdi],ss
+ mov [rdi],ds
+ mov [rdi],fs
+ mov [rdi],gs
+ mov word [rdi],es
+ mov word [rdi],cs
+ mov word [rdi],ss
+ mov word [rdi],ds
+ mov word [rdi],fs
+ mov word [rdi],gs
+ mov qword [rdi],es
+ mov qword [rdi],cs
+ mov qword [rdi],ss
+ mov qword [rdi],ds
+ mov qword [rdi],fs
+ mov qword [rdi],gs
diff --git a/test/strlen.asm b/test/strlen.asm
new file mode 100644
index 00000000..913014ce
--- /dev/null
+++ b/test/strlen.asm
@@ -0,0 +1,5 @@
+%macro strlen_test 1
+ %strlen len %2 ; not existing argument
+%endmacro
+
+strlen_test 'a'
diff --git a/test/struc.asm b/test/struc.asm
new file mode 100644
index 00000000..3c8c1b47
--- /dev/null
+++ b/test/struc.asm
@@ -0,0 +1,33 @@
+;Testname=test; Arguments=-fbin -ostruc.bin; Files=stdout stderr struc.bin
+
+bits 32
+
+; Simple struc example
+struc teststruc1
+ .long: resd 1
+ .word: resw 1
+ .byte: resb 1
+ .str: resb 32
+endstruc
+
+; Reference with offset
+mov [ebp - 40 + teststruc1.word], ax
+
+istruc teststruc1
+ at .word, db 5
+iend
+
+; Struc with base offset
+; should be the same as the previous stuc
+struc teststruc2, -40
+ .long: resd 1
+ .word: resw 1
+ .byte: resb 1
+ .str: resb 32
+endstruc
+
+mov [ebp + teststruc2.word], ax
+
+istruc teststruc2
+ at .word, db 5
+iend
diff --git a/test/subsection.asm b/test/subsection.asm
new file mode 100644
index 00000000..8ba61978
--- /dev/null
+++ b/test/subsection.asm
@@ -0,0 +1,38 @@
+;
+; subsection.asm
+;
+; Test of Mach-O subsection_by_symbol
+;
+
+%pragma macho subsections_via_symbols
+%pragma macho gprefix _
+%pragma macho lprefix L.
+
+ bits 32
+
+ global foo, bar
+ static quux
+
+foo:
+ jmp foo
+ jmp bar
+ jmp baz
+ jmp quux
+
+bar:
+ jmp foo
+ jmp bar
+ jmp baz
+ jmp quux
+
+baz:
+ jmp foo
+ jmp bar
+ jmp baz
+ jmp quux
+
+quux:
+ jmp foo
+ jmp bar
+ jmp baz
+ jmp quux
diff --git a/test/test67.asm b/test/test67.asm
new file mode 100644
index 00000000..7cf300d8
--- /dev/null
+++ b/test/test67.asm
@@ -0,0 +1,38 @@
+;Testname=unoptimized; Arguments=-fbin -otest67.bin -O0; Files=stdout stderr test67.bin
+;Testname=optimized; Arguments=-fbin -otest67.bin -Ox; Files=stdout stderr test67.bin
+
+ bits 16
+
+ mov ax,[bx]
+ mov ax,[foo]
+ mov ax,[word foo]
+ mov ax,[dword foo]
+ mov ax,[ebx]
+ rep movsb
+ a16 rep movsb
+ a32 rep movsb
+ a32 mov ax,bx
+
+ bits 32
+
+ mov ax,[bx]
+ mov ax,[foo]
+ mov ax,[word foo]
+ mov ax,[dword foo]
+ mov ax,[ebx]
+ rep movsb
+ a16 rep movsb
+ a32 rep movsb
+
+ bits 64
+
+ mov ax,[rbx]
+ mov ax,[foo]
+ mov ax,[qword foo]
+ mov ax,[dword foo]
+ mov ax,[ebx]
+ rep movsb
+ a32 rep movsb
+ a64 rep movsb
+
+foo:
diff --git a/test/testdos.asm b/test/testdos.asm
new file mode 100644
index 00000000..2f6bf916
--- /dev/null
+++ b/test/testdos.asm
@@ -0,0 +1,13 @@
+;Testname=test; Arguments=-fbin -otestdos.bin; Files=stdout stderr testdos.bin
+;
+; This file was known to miscompile with the 16-bit NASM built
+; under Borland C++ 3.1, so keep it around for testing...
+;
+; The proper output looks like:
+;
+; 00000000 A10300
+; 00000003 EA0000FFFF
+;
+ org 0100h
+ mov ax,[3]
+ jmp 0FFFFh:0000
diff --git a/test/testnos3.asm b/test/testnos3.asm
new file mode 100644
index 00000000..b243e159
--- /dev/null
+++ b/test/testnos3.asm
@@ -0,0 +1,973 @@
+;Testname=test; Arguments=-fbin -otestnos3.bin; Files=stdout stderr testnos3.bin
+;
+; Double-precision floating point tests, derived from Fred Tydeman's posting
+; of 26 February 1996 to comp.arch.arithmetic, via David M. Gay's gdtoa
+; package.
+;
+ bits 64
+
+ dq 9.e0306
+ dq 0x7fa9a2028368022e
+
+ dq 4.e-079
+ dq 0x2fa7b6d71d20b96c
+
+ dq 7.e-261
+ dq 0x09eb8d7e32be6396
+
+ dq 6.e-025
+ dq 0x3ae7361cb863de62
+
+ dq 7.e-161
+ dq 0x1eaf7e0db3799aa3
+
+ dq 7.e0289
+ dq 0x7c1cbb547777a285
+
+ dq 5.e0079
+ dq 0x507afcef51f0fb5f
+
+ dq 1.e0080
+ dq 0x508afcef51f0fb5f
+
+ dq 7.e-303
+ dq 0x0133339131c46f8b
+
+ dq 5.e0152
+ dq 0x5fa317e5ef3ab327
+
+ dq 5.e0125
+ dq 0x5a07a2ecc414a03f
+
+ dq 2.e0126
+ dq 0x5a27a2ecc414a03f
+
+ dq 7.e-141
+ dq 0x22d5570f59bd178c
+
+ dq 4.e-192
+ dq 0x18323ff06eea847a
+
+ dq 9.e0043
+ dq 0x49102498ea6df0c4
+
+ dq 1.e0303
+ dq 0x7ed754e31cd072da
+
+ dq 95.e-089
+ dq 0x2dde3cbc9907fdc8
+
+ dq 85.e0194
+ dq 0x689d1c26db7d0dae
+
+ dq 69.e0267
+ dq 0x77c0b7cb60c994da
+
+ dq 97.e-019
+ dq 0x3c665dde8e688ba6
+
+ dq 37.e0046
+ dq 0x49d033d7eca0adef
+
+ dq 74.e0046
+ dq 0x49e033d7eca0adef
+
+ dq 61.e-099
+ dq 0x2bc0ad836f269a17
+
+ dq 53.e-208
+ dq 0x151b39ae1909c31b
+
+ dq 93.e-234
+ dq 0x0fc27b2e4f210075
+
+ dq 79.e-095
+ dq 0x2c9a5db812948281
+
+ dq 87.e-274
+ dq 0x0772d36cf48e7abd
+
+ dq 83.e0025
+ dq 0x4585747ab143e353
+
+ dq 17.e-036
+ dq 0x38b698ccdc60015a
+
+ dq 53.e0033
+ dq 0x47246a3418629ef6
+
+ dq 51.e-074
+ dq 0x30ecd5bee57763e6
+
+ dq 63.e-022
+ dq 0x3bbdc03b8fd7016a
+
+ dq 839.e0143
+ dq 0x5e3ae03f245703e2
+
+ dq 749.e-182
+ dq 0x1abf14727744c63e
+
+ dq 999.e-026
+ dq 0x3b282782afe1869e
+
+ dq 345.e0266
+ dq 0x77b0b7cb60c994da
+
+ dq 914.e-102
+ dq 0x2b5ffc81bc29f02b
+
+ dq 829.e0102
+ dq 0x55b7221a79cdd1d9
+
+ dq 307.e0090
+ dq 0x5322d6b183fe4b55
+
+ dq 859.e0182
+ dq 0x6654374d8b87ac63
+
+ dq 283.e0085
+ dq 0x5216c309024bab4b
+
+ dq 589.e0187
+ dq 0x675526be9c22eb17
+
+ dq 302.e0176
+ dq 0x64fdcf7df8f573b7
+
+ dq 604.e0176
+ dq 0x650dcf7df8f573b7
+
+ dq 761.e-244
+ dq 0x0de03cea3586452e
+
+ dq 647.e0230
+ dq 0x7044d64d4079150c
+
+ dq 755.e0174
+ dq 0x64a7d93193f78fc6
+
+ dq 255.e-075
+ dq 0x30dcd5bee57763e6
+
+ dq 3391.e0055
+ dq 0x4c159bd3ad46e346
+
+ dq 4147.e-015
+ dq 0x3d923d1b5eb1d778
+
+ dq 3996.e-026
+ dq 0x3b482782afe1869e
+
+ dq 1998.e-026
+ dq 0x3b382782afe1869e
+
+ dq 3338.e-296
+ dq 0x0335519ac5142aab
+
+ dq 1669.e-296
+ dq 0x0325519ac5142aab
+
+ dq 8699.e-276
+ dq 0x0772d2df246ecd2d
+
+ dq 5311.e0243
+ dq 0x73284e91f4aa0fdb
+
+ dq 7903.e-096
+ dq 0x2cd07c2d27a5b989
+
+ dq 7611.e-226
+ dq 0x11d19b8744033457
+
+ dq 3257.e0058
+ dq 0x4cb444b34a6fb3eb
+
+ dq 6514.e0058
+ dq 0x4cc444b34a6fb3eb
+
+ dq 3571.e0263
+ dq 0x77462644c61d41aa
+
+ dq 7142.e0263
+ dq 0x77562644c61d41aa
+
+ dq 5311.e0242
+ dq 0x72f3720e5d54d97c
+
+ dq 1617.e-063
+ dq 0x3384c98fce16152e
+
+ dq 51881.e0037
+ dq 0x4897d2950dc76da4
+
+ dq 31441.e-118
+ dq 0x285ef890f5de4c86
+
+ dq 30179.e0079
+ dq 0x5143e272a77478e8
+
+ dq 60358.e0079
+ dq 0x5153e272a77478e8
+
+ dq 63876.e-020
+ dq 0x3cc703856844bdbf
+
+ dq 31938.e-020
+ dq 0x3cb703856844bdbf
+
+ dq 46073.e-032
+ dq 0x3a42405b773fbdf3
+
+ dq 32941.e0051
+ dq 0x4b757eb8ad52a5c9
+
+ dq 82081.e0041
+ dq 0x49770105df3d47cb
+
+ dq 38701.e-215
+ dq 0x1440492a4a8a37fd
+
+ dq 62745.e0047
+ dq 0x4ab0c52fe6dc6a1b
+
+ dq 12549.e0048
+ dq 0x4ac0c52fe6dc6a1b
+
+ dq 64009.e-183
+ dq 0x1af099b393b84832
+
+ dq 89275.e0261
+ dq 0x77262644c61d41aa
+
+ dq 75859.e0025
+ dq 0x46232645e1ba93f0
+
+ dq 57533.e0287
+ dq 0x7c8272ed2307f56a
+
+ dq 584169.e0229
+ dq 0x70ad657059dc79aa
+
+ dq 940189.e-112
+ dq 0x29eb99d6240c1a28
+
+ dq 416121.e0197
+ dq 0x6a00fd07ed297f80
+
+ dq 832242.e0197
+ dq 0x6a10fd07ed297f80
+
+ dq 584738.e0076
+ dq 0x50e8a85eb277e645
+
+ dq 933587.e-140
+ dq 0x241b248728b9c117
+
+ dq 252601.e0121
+ dq 0x5a2dda592e398dd7
+
+ dq 358423.e0274
+ dq 0x79f9463b59b8f2bd
+
+ dq 892771.e-213
+ dq 0x14f25818c7294f27
+
+ dq 410405.e0040
+ dq 0x49670105df3d47cb
+
+ dq 928609.e-261
+ dq 0x0afbe2dd66200bef
+
+ dq 302276.e-254
+ dq 0x0c55a462d91c6ab3
+
+ dq 920657.e-023
+ dq 0x3c653a9985dbde6c
+
+ dq 609019.e-025
+ dq 0x3bf1f99e11ea0a24
+
+ dq 252601.e0120
+ dq 0x59f7e1e0f1c7a4ac
+
+ dq 654839.e-060
+ dq 0x34b00e7db3b3f242
+
+ dq 8823691.e0130
+ dq 0x5c5e597c0b94b7ae
+
+ dq 2920845.e0228
+ dq 0x709d657059dc79aa
+
+ dq 9210917.e0080
+ dq 0x51fda232347e6032
+
+ dq 5800419.e-303
+ dq 0x026e58ffa48f4fce
+
+ dq 6119898.e-243
+ dq 0x0ee3ecf22ea07863
+
+ dq 3059949.e-243
+ dq 0x0ed3ecf22ea07863
+
+ dq 2572231.e0223
+ dq 0x6f90f73be1dff9ad
+
+ dq 5444097.e-021
+ dq 0x3cf8849dd33c95af
+
+ dq 5783893.e-127
+ dq 0x26f7e5902ce0e151
+
+ dq 3865421.e-225
+ dq 0x1295d4fe53afec65
+
+ dq 4590831.e0156
+ dq 0x61b4689b4a5fa201
+
+ dq 9181662.e0156
+ dq 0x61c4689b4a5fa201
+
+ dq 5906361.e-027
+ dq 0x3bbbe45a312d08a0
+
+ dq 7315057.e0235
+ dq 0x7225f0d408362a72
+
+ dq 9088115.e0106
+ dq 0x5762e51a84a3c6a0
+
+ dq 1817623.e0107
+ dq 0x5772e51a84a3c6a0
+
+ dq 44118455.e0129
+ dq 0x5c4e597c0b94b7ae
+
+ dq 35282041.e0293
+ dq 0x7e5512d5273e62e8
+
+ dq 31279898.e-291
+ dq 0x05129b01b6885d36
+
+ dq 15639949.e-291
+ dq 0x05029b01b6885d36
+
+ dq 27966061.e0145
+ dq 0x5f955bcf72fd10f9
+
+ dq 55932122.e0145
+ dq 0x5fa55bcf72fd10f9
+
+ dq 70176353.e-053
+ dq 0x36900683a21de855
+
+ dq 40277543.e-032
+ dq 0x3adf29ca0ff893b1
+
+ dq 50609263.e0157
+ dq 0x622193aff1f1c8e3
+
+ dq 66094077.e0077
+ dq 0x518b37c4b7928317
+
+ dq 84863171.e0114
+ dq 0x59406e98f5ec8f37
+
+ dq 89396333.e0264
+ dq 0x786526f061ca9053
+
+ dq 87575437.e-309
+ dq 0x016e07320602056c
+
+ dq 78693511.e-044
+ dq 0x3870bc7b7603a2ca
+
+ dq 90285923.e-206
+ dq 0x16d1470083f89d48
+
+ dq 30155207.e-030
+ dq 0x3b423a4ad20748a2
+
+ dq 245540327.e0121
+ dq 0x5acc569e968e0944
+
+ dq 263125459.e0287
+ dq 0x7d44997a298b2f2e
+
+ dq 566446538.e-257
+ dq 0x0c64472ba9550e86
+
+ dq 283223269.e-257
+ dq 0x0c54472ba9550e86
+
+ dq 245540327.e0122
+ dq 0x5b01b6231e18c5cb
+
+ dq 491080654.e0122
+ dq 0x5b11b6231e18c5cb
+
+ dq 971212611.e-126
+ dq 0x27a397d3c9745d2f
+
+ dq 229058583.e0052
+ dq 0x4c76ce94febdc7a5
+
+ dq 325270231.e0039
+ dq 0x49cc7ccf90c9f8ab
+
+ dq 989648089.e-035
+ dq 0x3a8880a3d515e849
+
+ dq 653777767.e0273
+ dq 0x7a720223f2b3a881
+
+ dq 923091487.e0209
+ dq 0x6d30bc60e6896717
+
+ dq 526250918.e0288
+ dq 0x7d89bfd8b3edfafa
+
+ dq 350301748.e-309
+ dq 0x018e07320602056c
+
+ dq 741111169.e-203
+ dq 0x17a14fe7daf8f3ae
+
+ dq 667284113.e-240
+ dq 0x0ff09355f8050c02
+
+ dq 1227701635.e0120
+ dq 0x5abc569e968e0944
+
+ dq 9981396317.e-182
+ dq 0x1c38afe10a2a66aa
+
+ dq 5232604057.e-298
+ dq 0x041465b896c24520
+
+ dq 5572170023.e-088
+ dq 0x2fb0847822f765b2
+
+ dq 1964322616.e0122
+ dq 0x5b31b6231e18c5cb
+
+ dq 3928645232.e0122
+ dq 0x5b41b6231e18c5cb
+
+ dq 8715380633.e-058
+ dq 0x35f4614c3219891f
+
+ dq 4856063055.e-127
+ dq 0x279397d3c9745d2f
+
+ dq 8336960483.e-153
+ dq 0x223a06a1024b95e1
+
+ dq 1007046393.e-155
+ dq 0x21a01891fc4717fd
+
+ dq 5378822089.e-176
+ dq 0x1d695fd4c88d4b1b
+
+ dq 5981342308.e-190
+ dq 0x1a83db11ac608107
+
+ dq 7214782613.e-086
+ dq 0x3020b552d2edcdea
+
+ dq 5458466829.e0142
+ dq 0x5f70acde6a98eb4c
+
+ dq 9078555839.e-109
+ dq 0x2b5fc575867314ee
+
+ dq 6418488827.e0079
+ dq 0x526021f14ed7b3fa
+
+ dq 65325840981.e0069
+ dq 0x5081a151ddbd3c4a
+
+ dq 49573485983.e0089
+ dq 0x54a221bd871d2cf4
+
+ dq 46275205733.e0074
+ dq 0x51830e6c7d4e3480
+
+ dq 92550411466.e0074
+ dq 0x51930e6c7d4e3480
+
+ dq 41129842097.e-202
+ dq 0x1832c3e72d179607
+
+ dq 93227267727.e-049
+ dq 0x380960fe08d5847f
+
+ dq 41297294357.e0185
+ dq 0x688c49437fccfadb
+
+ dq 41534892987.e-067
+ dq 0x343a12666477886d
+
+ dq 42333842451.e0201
+ dq 0x6be0189a26df575f
+
+ dq 78564021519.e-227
+ dq 0x131155515fd37265
+
+ dq 53587107423.e-061
+ dq 0x35800a19a3ffd981
+
+ dq 53827010643.e-200
+ dq 0x18a32fa69a69bd6d
+
+ dq 83356057653.e0193
+ dq 0x6a4544e6daee2a18
+
+ dq 45256834646.e-118
+ dq 0x29a541ecdfd48694
+
+ dq 45392779195.e-110
+ dq 0x2b4fc575867314ee
+
+ dq 23934638219.e0291
+ dq 0x7e81deaf40ead9a0
+
+ dq 995779191233.e0113
+ dq 0x59e2d44edcc51304
+
+ dq 997422852243.e-265
+ dq 0x0b676688faee99bc
+
+ dq 653532977297.e-123
+ dq 0x28d925a0aabcdc68
+
+ dq 938885684947.e0147
+ dq 0x60f11894b202e9f4
+
+ dq 619534293513.e0124
+ dq 0x5c210c20303fe0f1
+
+ dq 539879452414.e-042
+ dq 0x39a5e66dc3d6bdb5
+
+ dq 742522891517.e0259
+ dq 0x782c1c352fc3c309
+
+ dq 254901016865.e-022
+ dq 0x3dbc06d366394441
+
+ dq 685763015669.e0280
+ dq 0x7c85fd7aa44d9477
+
+ dq 384865004907.e-285
+ dq 0x072aa65b58639e69
+
+ dq 286556458711.e0081
+ dq 0x5321958b36c5102b
+
+ dq 573112917422.e0081
+ dq 0x5331958b36c5102b
+
+ dq 769525178383.e-150
+ dq 0x234253ec0e161420
+
+ dq 416780288265.e0192
+ dq 0x6a3544e6daee2a18
+
+ dq 226963895975.e-111
+ dq 0x2b3fc575867314ee
+
+ dq 665592809339.e0063
+ dq 0x4f778b6516c2b478
+
+ dq 3891901811465.e0217
+ dq 0x6f99ab8261990292
+
+ dq 4764593340755.e0069
+ dq 0x50e4177a9915fbf8
+
+ dq 6336156586177.e0269
+ dq 0x7a7173f76c63b792
+
+ dq 8233559360849.e0095
+ dq 0x56566fee05649a7a
+
+ dq 3662265515198.e-107
+ dq 0x2c538e6edd48f2a3
+
+ dq 1831132757599.e-107
+ dq 0x2c438e6edd48f2a3
+
+ dq 7812878489261.e-179
+ dq 0x1d726dae7bbeda75
+
+ dq 6363857920591.e0145
+ dq 0x60b28a61cf9483b7
+
+ dq 8811915538555.e0082
+ dq 0x53a51f508b287ae7
+
+ dq 9997878507563.e-195
+ dq 0x1a253db2fea1ea31
+
+ dq 9224786422069.e-291
+ dq 0x0634ee5d56b32957
+
+ dq 6284426329974.e-294
+ dq 0x058d3409dfbca26f
+
+ dq 9199302046091.e-062
+ dq 0x35c135972630774c
+
+ dq 6070482281213.e-122
+ dq 0x29423fa9e6fcf47e
+
+ dq 2780161250963.e-301
+ dq 0x0405acc2053064c2
+
+ dq 8233559360849.e0094
+ dq 0x5621f324d11d4862
+
+ dq 72027097041701.e0206
+ dq 0x6d94677812d3a606
+
+ dq 97297545286625.e0215
+ dq 0x6f79ab8261990292
+
+ dq 99021992302453.e-025
+ dq 0x3da5c6714def374c
+
+ dq 54104687080198.e-022
+ dq 0x3e373cdf8db7a7bc
+
+ dq 33519685743233.e0089
+ dq 0x5537f203339c9629
+
+ dq 67039371486466.e0089
+ dq 0x5547f203339c9629
+
+ dq 39064392446305.e-180
+ dq 0x1d626dae7bbeda75
+
+ dq 17796979903653.e0261
+ dq 0x78e072f3819c1321
+
+ dq 28921916763211.e0038
+ dq 0x4a9eebabe0957af3
+
+ dq 87605699161665.e0155
+ dq 0x6302920f96e7f9ef
+
+ dq 41921560615349.e-067
+ dq 0x34d9b2a5c4041e4b
+
+ dq 80527976643809.e0061
+ dq 0x4f7c7c5aea080a49
+
+ dq 72335858886654.e-159
+ dq 0x21cce77c2b3328fc
+
+ dq 52656615219377.e0102
+ dq 0x57f561def4a9ee32
+
+ dq 15400733123779.e-072
+ dq 0x33b8bf7e7fa6f02a
+
+ dq 77003665618895.e-073
+ dq 0x33a8bf7e7fa6f02a
+
+ dq 475603213226859.e-042
+ dq 0x3a42d73088f4050a
+
+ dq 972708181182949.e0116
+ dq 0x5b218a7f36172332
+
+ dq 246411729980464.e-071
+ dq 0x342eef5e1f90ac34
+
+ dq 123205864990232.e-071
+ dq 0x341eef5e1f90ac34
+
+ dq 609610927149051.e-255
+ dq 0x0e104273b18918b1
+
+ dq 475603213226859.e-041
+ dq 0x3a778cfcab31064d
+
+ dq 672574798934795.e0065
+ dq 0x508226c684c87261
+
+ dq 134514959786959.e0066
+ dq 0x509226c684c87261
+
+ dq 294897574603217.e-151
+ dq 0x2395f2df5e675a0f
+
+ dq 723047919080275.e0036
+ dq 0x4a7eebabe0957af3
+
+ dq 660191429952702.e-088
+ dq 0x30bddc7e975c5045
+
+ dq 330095714976351.e-088
+ dq 0x30addc7e975c5045
+
+ dq 578686871093232.e-159
+ dq 0x21fce77c2b3328fc
+
+ dq 144671717773308.e-159
+ dq 0x21dce77c2b3328fc
+
+ dq 385018328094475.e-074
+ dq 0x3398bf7e7fa6f02a
+
+ dq 330095714976351.e-089
+ dq 0x3077e3987916a69e
+
+ dq 2215901545757777.e-212
+ dq 0x171a80a6e566428c
+
+ dq 1702061899637397.e-276
+ dq 0x09cacc46749dccfe
+
+ dq 1864950924021923.e0213
+ dq 0x6f53ae60753af6ca
+
+ dq 3729901848043846.e0213
+ dq 0x6f63ae60753af6ca
+
+ dq 7487252720986826.e-165
+ dq 0x20f8823a57adbef9
+
+ dq 3743626360493413.e-165
+ dq 0x20e8823a57adbef9
+
+ dq 4988915232824583.e0119
+ dq 0x5be5f6de9d5d6b5b
+
+ dq 3771476185376383.e0277
+ dq 0x7cae3c14d6916ce9
+
+ dq 6182410494241627.e-119
+ dq 0x2a81b96458445d07
+
+ dq 2572981889477453.e0142
+ dq 0x609dfc11fbf46087
+
+ dq 7793560217139653.e0051
+ dq 0x4dd280461b856ec5
+
+ dq 9163942927285259.e-202
+ dq 0x194fe601457dce4d
+
+ dq 6353227084707473.e0155
+ dq 0x63650aff653ffe8a
+
+ dq 4431803091515554.e-211
+ dq 0x176090684f5fe998
+
+ dq 9324754620109615.e0211
+ dq 0x6f0f7d6721f7f144
+
+ dq 8870461176410409.e0263
+ dq 0x79d90529a37b7e22
+
+ dq 90372559027740405.e0143
+ dq 0x612491daad0ba280
+
+ dq 18074511805548081.e0146
+ dq 0x61a011f2d73116f4
+
+ dq 54897030182071313.e0029
+ dq 0x496ec55666d8f9ec
+
+ dq 76232626624829156.e-032
+ dq 0x3ccb7738011e75fe
+
+ dq 59898021767894608.e-165
+ dq 0x2128823a57adbef9
+
+ dq 29949010883947304.e-165
+ dq 0x2118823a57adbef9
+
+ dq 26153245263757307.e0049
+ dq 0x4d83de005bd620df
+
+ dq 27176258005319167.e-261
+ dq 0x0d27c0747bd76fa1
+
+ dq 18074511805548081.e0147
+ dq 0x61d4166f8cfd5cb1
+
+ dq 24691002732654881.e-115
+ dq 0x2b759a2783ce70ab
+
+ dq 58483921078398283.e0057
+ dq 0x4f408ce499519ce3
+
+ dq 64409240769861689.e-159
+ dq 0x22692238f7987779
+
+ dq 94080055902682397.e-242
+ dq 0x11364981e39e66ca
+
+ dq 31766135423537365.e0154
+ dq 0x63550aff653ffe8a
+
+ dq 68985865317742005.e0164
+ dq 0x657a999ddec72aca
+
+ dq 13797173063548401.e0165
+ dq 0x658a999ddec72aca
+
+ dq 902042358290366539.e-281
+ dq 0x09522dc01ca1cb8c
+
+ dq 238296178309629163.e0272
+ dq 0x7c038fd93f1f5342
+
+ dq 783308178698887621.e0226
+ dq 0x72925ae62cb346d8
+
+ dq 439176241456570504.e0029
+ dq 0x499ec55666d8f9ec
+
+ dq 899810892172646163.e0283
+ dq 0x7e6adf51fa055e03
+
+ dq 926145344610700019.e-225
+ dq 0x14f307a67f1f69ff
+
+ dq 653831131593932675.e0047
+ dq 0x4d63de005bd620df
+
+ dq 130766226318786535.e0048
+ dq 0x4d73de005bd620df
+
+ dq 557035730189854663.e-294
+ dq 0x0693bfac6bc4767b
+
+ dq 902042358290366539.e-280
+ dq 0x0986b93023ca3e6f
+
+ dq 272104041512242479.e0200
+ dq 0x6d13bbb4bf05f087
+
+ dq 544208083024484958.e0200
+ dq 0x6d23bbb4bf05f087
+
+ dq 680429695511221511.e0192
+ dq 0x6b808ebc116f8a20
+
+ dq 308975121073410857.e0236
+ dq 0x7490db75cc001072
+
+ dq 792644927852378159.e0078
+ dq 0x53d7bff336d8ff06
+
+ dq 783308178698887621.e0223
+ dq 0x71f2cbac35f71140
+
+ dq 8396094300569779681.e-252
+ dq 0x0f8ab223efcee35a
+
+ dq 3507665085003296281.e-074
+ dq 0x346b85c026a264e4
+
+ dq 7322325862592278999.e0074
+ dq 0x5336775b6caa5ae0
+
+ dq 6014546754280072926.e0209
+ dq 0x6f396397b06732a4
+
+ dq 7120190517612959703.e0120
+ dq 0x5cc3220dcd5899fd
+
+ dq 3507665085003296281.e-073
+ dq 0x34a1339818257f0f
+
+ dq 4345544743100783551.e-218
+ dq 0x168a9c42e5b6d89f
+
+ dq 9778613303868468131.e-090
+ dq 0x313146fe1075e1ef
+
+ dq 7539204280836061195.e-082
+ dq 0x32d3d969e3dbe723
+
+ dq 7862637540082247119.e-202
+ dq 0x19eaba3262ee707b
+
+ dq 2176832332097939832.e0200
+ dq 0x6d43bbb4bf05f087
+
+ dq 8643988913946659879.e0115
+ dq 0x5bbe71ec1ed0a4f9
+
+ dq 5529436763613147623.e0138
+ dq 0x6079c677be6f236e
+
+ dq 6764958008109694533.e-173
+ dq 0x1fed06692e6f5ef6
+
+ dq 6802601037806061975.e0197
+ dq 0x6cbf92bacb3cb40c
+
+ dq 1360520207561212395.e0198
+ dq 0x6ccf92bacb3cb40c
+
+ dq 62259110684423957791.e0047
+ dq 0x4dcd8f2cfc20d6e8
+
+ dq 88800290202542652011.e-226
+ dq 0x1526cec51a43f41a
+
+ dq 41010852717673354694.e-221
+ dq 0x162012954b6aabba
+
+ dq 20505426358836677347.e-221
+ dq 0x161012954b6aabba
+
+ dq 66102447903809911604.e0055
+ dq 0x4f7762068a24fd55
+
+ dq 35600952588064798515.e0119
+ dq 0x5cb3220dcd5899fd
+
+ dq 14371240869903838702.e0205
+ dq 0x6e78d92d2bcc7a81
+
+ dq 57500690832492901689.e0043
+ dq 0x4cf65d3e2acd616b
+
+ dq 23432630639573022093.e-107
+ dq 0x2dbdd54c40a2f25f
+
+ dq 62259110684423957791.e0048
+ dq 0x4e02797c1d948651
+
+ dq 35620497849450218807.e-306
+ dq 0x0475b22082529425
+
+ dq 69658634627134074624.e0200
+ dq 0x6d93bbb4bf05f087
+
+ dq 99440755792436956989.e-062
+ dq 0x37362d10462a26f4
+
+ dq 55277197169490210673.e0081
+ dq 0x54d945bfa911e32a
+
+ dq 36992084760177624177.e-318
+ dq 0x01f8c5f9551c2f9a
+
+ dq 30888265282878466443.e-111
+ dq 0x2cf01b8ef28251fc
+
+ dq 2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125e-324
+ dq 0x0000000000000000
+
+ dq 2.47032822920623272e-324
+ dq 0x0000000000000000
diff --git a/test/time.asm b/test/time.asm
new file mode 100644
index 00000000..ee4b9b76
--- /dev/null
+++ b/test/time.asm
@@ -0,0 +1,11 @@
+;Not automatically testable because it is not constant
+ db __DATE__, 13, 10
+ db __TIME__, 13, 10
+ db __UTC_DATE__, 13, 10
+ db __UTC_TIME__, 13, 10
+ align 4
+ dd __DATE_NUM__
+ dd __TIME_NUM__
+ dd __UTC_DATE_NUM__
+ dd __UTC_TIME_NUM__
+ dd __POSIX_TIME__
diff --git a/test/times.asm b/test/times.asm
new file mode 100644
index 00000000..b8f7ed08
--- /dev/null
+++ b/test/times.asm
@@ -0,0 +1,21 @@
+ bits 64
+
+; Broken per BR 3392278
+ times 4 paddd xmm8, xmm11
+
+; Broken per BR 3392279
+ bswap r12d
+ times 4 bswap r12d
+
+; Forward jump
+ times 128 jmp there
+
+there:
+ nop
+
+; Backwards jump
+ times 128 jmp there
+
+ section .bss
+ times 0x10 resb 0x20
+ resb 1
diff --git a/test/timesneg.asm b/test/timesneg.asm
new file mode 100644
index 00000000..9f16dbaa
--- /dev/null
+++ b/test/timesneg.asm
@@ -0,0 +1,3 @@
+ bits 32
+ times -1 db 0
+ times -1 incbin "timesneg.asm"
diff --git a/test/tmap.nas b/test/tmap.nas
new file mode 100644
index 00000000..51b477fd
--- /dev/null
+++ b/test/tmap.nas
@@ -0,0 +1,1447 @@
+;; NASM note: this file abuses the section flags in such a way that
+;; NASM 0.98.37 broke when this was compiled with:
+;; nasm -o tmap.o -f elf -DLINUX tmap.nas
+
+;;-----------------------------------------------------------------------------
+;;
+;; $Id$
+;;
+;; Copyright (C) 1998-2000 by DooM Legacy Team.
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation; either version 2
+;; of the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;;
+;; $Log$
+;; Revision 1.2 2003/09/10 23:33:38 hpa
+;; Use the version of tmap.nas that actually caused problems
+;;
+;; Revision 1.10 2001/02/24 13:35:21 bpereira
+;; no message
+;;
+;; Revision 1.9 2001/02/10 15:24:19 hurdler
+;; Apply Rob's patch for Linux version
+;;
+;; Revision 1.8 2000/11/12 09:48:15 bpereira
+;; no message
+;;
+;; Revision 1.7 2000/11/06 20:52:16 bpereira
+;; no message
+;;
+;; Revision 1.6 2000/11/03 11:48:40 hurdler
+;; Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!)
+;;
+;; Revision 1.5 2000/11/03 03:27:17 stroggonmeth
+;; Again with the bug fixing...
+;;
+;; Revision 1.4 2000/11/02 17:50:10 stroggonmeth
+;; Big 3Dfloors & FraggleScript commit!!
+;;
+;; Revision 1.3 2000/04/24 20:24:38 bpereira
+;; no message
+;;
+;; Revision 1.2 2000/02/27 00:42:11 hurdler
+;; fix CR+LF problem
+;;
+;; Revision 1.1.1.1 2000/02/22 20:32:32 hurdler
+;; Initial import into CVS (v1.29 pr3)
+;;
+;;
+;; DESCRIPTION:
+;; assembler optimised rendering code for software mode
+;; draw floor spans, and wall columns.
+;;
+;;-----------------------------------------------------------------------------
+
+
+[BITS 32]
+
+%ifdef LINUX
+%macro cextern 1
+[extern %1]
+%endmacro
+
+%macro cglobal 1
+[global %1]
+%endmacro
+
+%define CODE_SEG .data
+%else
+%macro cextern 1
+%define %1 _%1
+[extern %1]
+%endmacro
+
+%macro cglobal 1
+%define %1 _%1
+[global %1]
+%endmacro
+
+%define CODE_SEG .text
+%endif
+
+
+;; externs
+;; columns
+cextern dc_x
+cextern dc_yl
+cextern dc_yh
+cextern ylookup
+cextern columnofs
+cextern dc_source
+cextern dc_texturemid
+cextern dc_iscale
+cextern centery
+cextern dc_colormap
+cextern dc_transmap
+cextern colormaps
+
+;; spans
+cextern ds_x1
+cextern ds_x2
+cextern ds_y
+cextern ds_xfrac
+cextern ds_yfrac
+cextern ds_xstep
+cextern ds_ystep
+cextern ds_source
+cextern ds_colormap
+;cextern ds_textureheight
+
+; polygon edge rasterizer
+cextern prastertab
+
+
+;;----------------------------------------------------------------------
+;;
+;; R_DrawColumn
+;;
+;; New optimised version 10-01-1998 by D.Fabrice and P.Boris
+;; TO DO: optimise it much farther... should take at most 3 cycles/pix
+;; once it's fixed, add code to patch the offsets so that it
+;; works in every screen width.
+;;
+;;----------------------------------------------------------------------
+
+[SECTION .data]
+
+;;.align 4
+loopcount dd 0
+pixelcount dd 0
+tystep dd 0
+
+[SECTION CODE_SEG write]
+
+;----------------------------------------------------------------------------
+;fixed_t FixedMul (fixed_t a, fixed_t b)
+;----------------------------------------------------------------------------
+cglobal FixedMul
+; align 16
+FixedMul:
+ mov eax,[esp+4]
+ imul dword [esp+8]
+ shrd eax,edx,16
+ ret
+
+;----------------------------------------------------------------------------
+;fixed_t FixedDiv2 (fixed_t a, fixed_t b);
+;----------------------------------------------------------------------------
+cglobal FixedDiv2
+; align 16
+FixedDiv2:
+ mov eax,[esp+4]
+ mov edx,eax ;; these two instructions allow the next
+ sar edx,31 ;; two to pair, on the Pentium processor.
+ shld edx,eax,16
+ sal eax,16
+ idiv dword [esp+8]
+ ret
+
+;----------------------------------------------------------------------------
+; void ASM_PatchRowBytes (int rowbytes);
+;----------------------------------------------------------------------------
+cglobal ASM_PatchRowBytes
+; align 16
+ASM_PatchRowBytes:
+ mov eax,[esp+4]
+ mov [p1+2],eax
+ mov [p2+2],eax
+ mov [p3+2],eax
+ mov [p4+2],eax
+ mov [p5+2],eax
+ mov [p6+2],eax
+ mov [p7+2],eax
+ mov [p8+2],eax
+ mov [p9+2],eax
+ mov [pa+2],eax
+ mov [pb+2],eax
+ mov [pc+2],eax
+ mov [pd+2],eax
+ mov [pe+2],eax
+ mov [pf+2],eax
+ mov [pg+2],eax
+ mov [ph+2],eax
+ mov [pi+2],eax
+ mov [pj+2],eax
+ mov [pk+2],eax
+ mov [pl+2],eax
+ mov [pm+2],eax
+ mov [pn+2],eax
+ mov [po+2],eax
+ mov [pp+2],eax
+ mov [pq+2],eax
+ add eax,eax
+ mov [q1+2],eax
+ mov [q2+2],eax
+ mov [q3+2],eax
+ mov [q4+2],eax
+ mov [q5+2],eax
+ mov [q6+2],eax
+ mov [q7+2],eax
+ mov [q8+2],eax
+ ret
+
+
+;----------------------------------------------------------------------------
+; 8bpp column drawer
+;----------------------------------------------------------------------------
+
+cglobal R_DrawColumn_8
+; align 16
+R_DrawColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,2
+ mov ch,al ;; quad count
+ mov eax,[dc_colormap]
+ test dh,0x3
+ je near v4quadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je two_uneven
+
+ mov al,[esi+ebx] ;; prep un-even loops
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ and bl,0x7f ;; mask 0-127 texture index
+ mov [edi],dl ;; output pixel
+p1: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+two_uneven:
+ test dh,0x2
+ je f3
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ and bl,0x7f ;; mask 0-127 texture index
+ mov [edi],dl ;; output pixel
+ mov al,[esi+ebx]
+ add edx,ebp ;; fetch source texel
+ adc bl,cl ;; ypos f += ystep f
+ mov dl,[eax] ;; ypos i += ystep i
+ and bl,0x7f ;; colormap texel
+p2: add edi,0x12345678 ;; mask 0-127 texture index
+ mov [edi],dl
+p3: add edi,0x12345678 ;; output pixel
+;;
+;; test if there was at least 4 pixels
+;;
+f3:
+ test ch,0xff ;; test quad count
+ je near vdone
+;;
+;; ebp : ystep frac. upper 16 bits
+;; edx : y frac. upper 16 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+v4quadloop:
+ mov dh,0x7f ;; prep mask
+align 4
+vquadloop:
+ mov al,[esi+ebx] ;; prep loop
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+ and bl,0x7f ;; mask 0-127 texture index
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p4: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p5: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p6: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+p7: add edi,0x12345678
+
+ dec ch
+ jne vquadloop
+
+vdone:
+ pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+;;----------------------------------------------------------------------
+;;13-02-98:
+;; R_DrawSkyColumn : same as R_DrawColumn but:
+;;
+;; - wrap around 256 instead of 127.
+;; this is needed because we have a higher texture for mouselook,
+;; we need at least 200 lines for the sky.
+;;
+;; NOTE: the sky should never wrap, so it could use a faster method.
+;; for the moment, we'll still use a wrapping method...
+;;
+;; IT S JUST A QUICK CUT N PASTE, WAS NOT OPTIMISED AS IT SHOULD BE !!!
+;;
+;;----------------------------------------------------------------------
+
+cglobal R_DrawSkyColumn_8
+; align 16
+R_DrawSkyColumn_8:
+ push ebp
+ push esi
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vskydone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,0xff
+ shl edx,16 ;; y frac up
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,0x2
+ mov ch,al ;; quad count
+ mov eax,[dc_colormap]
+ test dh,0x3
+ je vskyquadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je f2
+ mov al,[esi+ebx] ;; prep un-even loops
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+p8: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+f2: test dh,0x2
+ je skyf3
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+p9: add edi,0x12345678
+ mov [edi],dl ;; output pixel
+
+pa: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+skyf3: test ch,0xff ;; test quad count
+ je vskydone
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+align 4
+vskyquadloop:
+ mov al,[esi+ebx] ;; prep loop
+ add edx,ebp ;; ypos f += ystep f
+ mov dl,[eax] ;; colormap texel
+ adc bl,cl ;; ypos i += ystep i
+ mov [edi],dl ;; output pixel
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pb: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pc: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pd: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+pe: add edi,0x12345678
+
+ dec ch
+ jne vskyquadloop
+vskydone:
+ pop ebx
+ pop edi
+ pop esi
+ pop ebp
+ ret
+
+
+;;----------------------------------------------------------------------
+;; R_DrawTranslucentColumn_8
+;;
+;; Vertical column texture drawer, with transparency. Replaces Doom2's
+;; 'fuzz' effect, which was not so beautiful.
+;; Transparency is always impressive in some way, don't know why...
+;;----------------------------------------------------------------------
+
+cglobal R_DrawTranslucentColumn_8
+R_DrawTranslucentColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vtdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+
+ shr ebx,16 ;; frac int.
+ and ebx,0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+ push cx
+ mov ecx,edx
+ pop cx
+ mov edx,[dc_colormap]
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ shr eax,0x2
+ test byte [pixelcount],0x3
+ mov ch,al ;; quad count
+ mov eax,[dc_transmap]
+ je vt4quadloop
+;;
+;; do un-even pixel
+;;
+ test byte [pixelcount],0x1
+ je trf2
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+pf: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+trf2: test byte [pixelcount],0x2
+ je trf3
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+pg: add edi,0x12345678
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+ph: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+trf3: test ch,0xff ;; test quad count
+ je near vtdone
+
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+vt4quadloop:
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [tystep],ebp
+pi: add edi,0x12345678
+ mov al,[edi] ;; fetch dest : index into colormap
+pj: sub edi,0x12345678
+ mov ebp,edi
+pk: sub edi,0x12345678
+ jmp short inloop
+align 4
+vtquadloop:
+ add ecx,[tystep]
+ adc bl,cl
+q1: add ebp,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+inloop:
+ add ecx,[tystep]
+ adc bl,cl
+q2: add edi,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [ebp+0x0],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ add ecx,[tystep]
+ adc bl,cl
+q3: add ebp,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+
+ add ecx,[tystep]
+ adc bl,cl
+q4: add edi,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ dec ch
+ jne vtquadloop
+vtdone:
+ pop ebx
+ pop edi
+ pop esi
+ pop ebp
+ ret
+
+
+;;----------------------------------------------------------------------
+;; R_DrawShadeColumn
+;;
+;; for smoke..etc.. test.
+;;----------------------------------------------------------------------
+cglobal R_DrawShadeColumn_8
+R_DrawShadeColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near shdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,byte +0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,2
+ mov ch,al ;; quad count
+ mov eax,[colormaps]
+ test dh,3
+ je sh4quadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je shf2
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pl: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+shf2:
+ test dh,0x2
+ je shf3
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pm: add edi,0x12345678
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pn: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+shf3:
+ test ch,0xff ;; test quad count
+ je near shdone
+
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+sh4quadloop:
+ mov dh,0x7f ;; prep mask
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [tystep],ebp
+po: add edi,0x12345678
+ mov al,[edi] ;; fetch dest : index into colormap
+pp: sub edi,0x12345678
+ mov ebp,edi
+pq: sub edi,0x12345678
+ jmp short shinloop
+
+align 4
+shquadloop:
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q5: add ebp,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+shinloop:
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q6: add edi,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q7: add ebp,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q8: add edi,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ dec ch
+ jne shquadloop
+
+shdone:
+ pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+
+;;----------------------------------------------------------------------
+;;
+;; R_DrawSpan
+;;
+;; Horizontal texture mapping
+;;
+;;----------------------------------------------------------------------
+
+
+[SECTION .data]
+
+oldcolormap dd 0
+
+[SECTION CODE_SEG write]
+
+cglobal R_DrawSpan_8
+R_DrawSpan_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; initilise registers
+;;
+
+ mov edx, [ds_xfrac]
+ mov eax, [ds_ystep]
+ ror edx, 14
+ ror eax, 15
+ mov bl, dl
+ mov ecx, [ds_xstep]
+ mov dh, al
+ mov ax, 1
+ mov [tystep], eax
+
+
+ mov eax, [ds_yfrac]
+ ror ecx, 13
+ ror eax, 16
+ mov dl, cl
+ mov bh, al
+ xor cx, cx
+ and ebx, 0x3fff
+ mov [pixelcount],ecx
+
+ mov ecx, [ds_x2]
+ mov edi, [ds_y]
+ mov esi, [ds_x1]
+ mov edi, [ylookup+edi*4]
+ mov ebp, ebx
+ add edi, [columnofs+esi*4]
+ sub esi, ecx ;; pixel count
+ shr ebp, 2
+ mov ecx, [ds_colormap]
+ mov ax, si
+ mov esi, [ds_source]
+ sar ax,1
+ jnc near .midloop ;; check parity
+
+; summary
+; edx = high16bit xfrac[0..13], ah=ystep[16..24] al=xtep[14..21]
+; ebx = high16bit =0, bh=yfrac[16..24], bl=xfrac[14..21]
+; ecx = colormap table cl=0 (colormap is aligned 8 bits)
+; eax = high16bit yfrac[0..15], dx = count
+; esi = flat texture source
+; edi = screeen buffer destination
+; ebp = work register
+; pixelcount = high16bit xstep[0..13] rest to 0
+; tystep = high16bit ystep[0..15] low 16 bit = 2 (increment of count)
+
+align 4
+.loop
+ add eax, [tystep]
+ mov cl, [esi+ebp]
+ adc bh, dh
+ mov cl, [ecx]
+ and bh, 0x3f
+ mov [edi], cl
+ mov ebp, ebx
+ inc edi
+ shr ebp, 2
+
+.midloop:
+ add edx, [pixelcount]
+ mov cl, [esi+ebp]
+ adc bl, dl
+ mov cl, [ecx]
+ mov ebp, ebx
+ mov [edi], cl
+ inc edi
+ shr ebp, 2
+
+ test eax, 0xffff
+ jnz near .loop
+
+.hdone: pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+[SECTION .data]
+
+obelix dd 0
+etaussi dd 0
+
+[SECTION CODE_SEG]
+
+cglobal R_DrawSpan_8_old
+R_DrawSpan_8_old:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; find loop count
+;;
+ mov eax,[ds_x2]
+ inc eax
+ sub eax,[ds_x1] ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ js near .hdone ;; nothing to scale
+ shr eax,0x1 ;; double pixel count
+ mov [loopcount],eax
+;;
+;; build composite position
+;;
+ mov ebp,[ds_xfrac]
+ shl ebp,10
+ and ebp,0xffff0000
+ mov eax,[ds_yfrac]
+ shr eax,6
+ and eax,0xffff
+ mov edi,[ds_y]
+ or ebp,eax
+
+ mov esi,[ds_source]
+;;
+;; calculate screen dest
+;;
+ mov edi,[ylookup+edi*4]
+ mov eax,[ds_x1]
+ add edi,[columnofs+eax*4]
+;;
+;; build composite step
+;;
+ mov ebx,[ds_xstep]
+ shl ebx,10
+ and ebx,0xffff0000
+ mov eax,[ds_ystep]
+ shr eax,6
+ and eax,0xffff
+ or ebx,eax
+
+ mov [obelix],ebx
+ mov [etaussi],esi
+
+;; %eax aligned colormap
+;; %ebx aligned colormap
+;; %ecx,%edx scratch
+;; %esi virtual source
+;; %edi moving destination pointer
+;; %ebp frac
+
+ mov eax,[ds_colormap]
+ mov ecx,ebp
+ add ebp,ebx ;; advance frac pointer
+ shr cx,10
+ rol ecx,6
+ and ecx,4095 ;; finish calculation for third pixel
+ mov edx,ebp
+ shr dx,10
+ rol edx,6
+ add ebp,ebx ;; advance frac pointer
+ and edx,4095 ;; finish calculation for fourth pixel
+ mov ebx,eax
+ mov al,[esi+ecx] ;; get first pixel
+ mov bl,[esi+edx] ;; get second pixel
+
+ test dword [pixelcount],0xfffffffe
+
+ mov dl,[eax] ;; color translate first pixel
+
+;; movw $0xf0f0,%dx ;;see visplanes start
+
+ je .hchecklast
+
+ mov dh,[ebx] ;; color translate second pixel
+ mov esi,[loopcount]
+align 4
+.hdoubleloop:
+ mov ecx,ebp
+ shr cx,10
+ rol ecx,6
+ add ebp,[obelix] ;; advance frac pointer
+ mov [edi],dx ;; write first pixel
+ and ecx,4095 ;; finish calculation for third pixel
+ mov edx,ebp
+ shr dx,10
+ rol edx,6
+ add ecx,[etaussi]
+ and edx,4095 ;; finish calculation for fourth pixel
+ mov al,[ecx] ;; get third pixel
+ add ebp,[obelix] ;; advance frac pointer
+ add edx,[etaussi]
+ mov bl,[edx] ;; get fourth pixel
+ mov dl,[eax] ;; color translate third pixel
+ add edi,byte +0x2 ;; advance to third pixel destination
+ dec esi ;; done with loop?
+ mov dh,[ebx] ;; color translate fourth pixel
+ jne .hdoubleloop
+;; check for final pixel
+.hchecklast:
+ test dword [pixelcount],0x1
+ je .hdone
+ mov [edi],dl ;; write final pixel
+.hdone: pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+;; ========================================================================
+;; Rasterization des segments d'un polyg“ne textur‚ de maniŠre LINEAIRE.
+;; Il s'agit donc d'interpoler les coordonn‚es aux bords de la texture en
+;; mˆme temps que les abscisses minx/maxx pour chaque ligne.
+;; L'argument 'dir' indique quels bords de la texture sont interpolés:
+;; 0 : segments associ‚s aux bord SUPERIEUR et INFERIEUR ( TY constant )
+;; 1 : segments associ‚s aux bord GAUCHE et DROITE ( TX constant )
+;; ========================================================================
+;;
+;; void rasterize_segment_tex( LONG x1, LONG y1, LONG x2, LONG y2, LONG tv1, LONG tv2, LONG tc, LONG dir );
+;; ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8
+;;
+;; Pour dir = 0, (tv1,tv2) = (tX1,tX2), tc = tY, en effet TY est constant.
+;;
+;; Pour dir = 1, (tv1,tv2) = (tY1,tY2), tc = tX, en effet TX est constant.
+;;
+;;
+;; Uses: extern struct rastery *_rastertab;
+;;
+
+[SECTION CODE_SEG write]
+
+MINX EQU 0
+MAXX EQU 4
+TX1 EQU 8
+TY1 EQU 12
+TX2 EQU 16
+TY2 EQU 20
+RASTERY_SIZEOF EQU 24
+
+cglobal rasterize_segment_tex
+rasterize_segment_tex:
+ push ebp
+ mov ebp,esp
+
+ sub esp,byte +0x8 ;; alloue les variables locales
+
+ push ebx
+ push esi
+ push edi
+ o16 mov ax,es
+ push eax
+
+;; #define DX [ebp-4]
+;; #define TD [ebp-8]
+
+ mov eax,[ebp+0xc] ;; y1
+ mov ebx,[ebp+0x14] ;; y2
+ cmp ebx,eax
+ je near .L_finished ;; special (y1==y2) segment horizontal, exit!
+
+ jg near .L_rasterize_right
+
+;;rasterize_left: ;; on rasterize un segment … la GAUCHE du polyg“ne
+
+ mov ecx,eax
+ sub ecx,ebx
+ inc ecx ;; y1-y2+1
+
+ mov eax,RASTERY_SIZEOF
+ mul ebx ;; * y2
+ mov esi,[prastertab]
+ add esi,eax ;; point into rastertab[y2]
+
+ mov eax,[ebp+0x8] ;; ARG1
+ sub eax,[ebp+0x10] ;; ARG3
+ shl eax,0x10 ;; ((x1-x2)<<PRE) ...
+ cdq
+ idiv ecx ;; dx = ... / (y1-y2+1)
+ mov [ebp-0x4],eax ;; DX
+
+ mov eax,[ebp+0x18] ;; ARG5
+ sub eax,[ebp+0x1c] ;; ARG6
+ shl eax,0x10
+ cdq
+ idiv ecx ;; tdx =((tx1-tx2)<<PRE) / (y1-y2+1)
+ mov [ebp-0x8],eax ;; idem tdy =((ty1-ty2)<<PRE) / (y1-y2+1)
+
+ mov eax,[ebp+0x10] ;; ARG3
+ shl eax,0x10 ;; x = x2<<PRE
+
+ mov ebx,[ebp+0x1c] ;; ARG6
+ shl ebx,0x10 ;; tx = tx2<<PRE d0
+ ;; ty = ty2<<PRE d1
+ mov edx,[ebp+0x20] ;; ARG7
+ shl edx,0x10 ;; ty = ty<<PRE d0
+ ;; tx = tx<<PRE d1
+ push ebp
+ mov edi,[ebp-0x4] ;; DX
+ cmp dword [ebp+0x24],byte +0x0 ;; ARG8 direction ?
+
+ mov ebp,[ebp-0x8] ;; TD
+ je .L_rleft_h_loop
+;;
+;; TY varie, TX est constant
+;;
+.L_rleft_v_loop:
+ mov [esi+MINX],eax ;; rastertab[y].minx = x
+ add ebx,ebp
+ mov [esi+TX1],edx ;; .tx1 = tx
+ add eax,edi
+ mov [esi+TY1],ebx ;; .ty1 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // ty += tdy
+
+ add esi,RASTERY_SIZEOF ;; next raster line into rastertab[]
+ dec ecx
+ jne .L_rleft_v_loop
+ pop ebp
+ jmp .L_finished
+;;
+;; TX varie, TY est constant
+;;
+.L_rleft_h_loop:
+ mov [esi+MINX],eax ;; rastertab[y].minx = x
+ add eax,edi
+ mov [esi+TX1],ebx ;; .tx1 = tx
+ add ebx,ebp
+ mov [esi+TY1],edx ;; .ty1 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // tx += tdx
+
+ add esi,RASTERY_SIZEOF ;; next raster line into rastertab[]
+ dec ecx
+ jne .L_rleft_h_loop
+ pop ebp
+ jmp .L_finished
+;;
+;; on rasterize un segment … la DROITE du polyg“ne
+;;
+.L_rasterize_right:
+ mov ecx,ebx
+ sub ecx,eax
+ inc ecx ;; y2-y1+1
+
+ mov ebx,RASTERY_SIZEOF
+ mul ebx ;; * y1
+ mov esi,[prastertab]
+ add esi,eax ;; point into rastertab[y1]
+
+ mov eax,[ebp+0x10] ;; ARG3
+ sub eax,[ebp+0x8] ;; ARG1
+ shl eax,0x10 ;; ((x2-x1)<<PRE) ...
+ cdq
+ idiv ecx ;; dx = ... / (y2-y1+1)
+ mov [ebp-0x4],eax ;; DX
+
+ mov eax,[ebp+0x1c] ;; ARG6
+ sub eax,[ebp+0x18] ;; ARG5
+ shl eax,0x10
+ cdq
+ idiv ecx ;; tdx =((tx2-tx1)<<PRE) / (y2-y1+1)
+ mov [ebp-0x8],eax ;; idem tdy =((ty2-ty1)<<PRE) / (y2-y1+1)
+
+ mov eax,[ebp+0x8] ;; ARG1
+ shl eax,0x10 ;; x = x1<<PRE
+
+ mov ebx,[ebp+0x18] ;; ARG5
+ shl ebx,0x10 ;; tx = tx1<<PRE d0
+ ;; ty = ty1<<PRE d1
+ mov edx,[ebp+0x20] ;; ARG7
+ shl edx,0x10 ;; ty = ty<<PRE d0
+ ;; tx = tx<<PRE d1
+ push ebp
+ mov edi,[ebp-0x4] ;; DX
+
+ cmp dword [ebp+0x24], 0 ;; direction ?
+
+ mov ebp,[ebp-0x8] ;; TD
+ je .L_rright_h_loop
+;;
+;; TY varie, TX est constant
+;;
+.L_rright_v_loop:
+
+ mov [esi+MAXX],eax ;; rastertab[y].maxx = x
+ add ebx,ebp
+ mov [esi+TX2],edx ;; .tx2 = tx
+ add eax,edi
+ mov [esi+TY2],ebx ;; .ty2 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // ty += tdy
+
+ add esi,RASTERY_SIZEOF
+ dec ecx
+ jne .L_rright_v_loop
+
+ pop ebp
+
+ jmp short .L_finished
+;;
+;; TX varie, TY est constant
+;;
+.L_rright_h_loop:
+ mov [esi+MAXX],eax ;; rastertab[y].maxx = x
+ add eax,edi
+ mov [esi+TX2],ebx ;; .tx2 = tx
+ add ebx,ebp
+ mov [esi+TY2],edx ;; .ty2 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // tx += tdx
+
+ add esi,RASTERY_SIZEOF
+ dec ecx
+ jne .L_rright_h_loop
+
+ pop ebp
+
+.L_finished:
+ pop eax
+ o16 mov es,ax
+ pop edi
+ pop esi
+ pop ebx
+
+ mov esp,ebp
+ pop ebp
+ ret
+
+
+;;; this version can draw 64x64 tiles, but they would have to be arranged 4 per row,
+;; so that the stride from one line to the next is 256
+;;
+;; .data
+;;xstep dd 0
+;;ystep dd 0
+;;texwidth dd 64 ;; texture width
+;; .text
+;; this code is kept in case we add high-detail floor textures for example (256x256)
+; align 16
+;_R_DrawSpan_8:
+; push ebp ;; preserve caller's stack frame pointer
+; push esi ;; preserve register variables
+; push edi
+; push ebx
+;;
+;; find loop count
+;;
+; mov eax,[ds_x2]
+; inc eax
+; sub eax,[ds_x1] ;; pixel count
+; mov [pixelcount],eax ;; save for final pixel
+; js near .hdone ;; nothing to scale
+;;
+;; calculate screen dest
+;;
+; mov edi,[ds_y]
+; mov edi,[ylookup+edi*4]
+; mov eax,[ds_x1]
+; add edi,[columnofs+eax*4]
+;;
+;; prepare registers for inner loop
+;;
+; xor eax,eax
+; mov edx,[ds_xfrac]
+; ror edx,16
+; mov al,dl
+; mov ecx,[ds_yfrac]
+; ror ecx,16
+; mov ah,cl
+;
+; mov ebx,[ds_xstep]
+; ror ebx,16
+; mov ch,bl
+; and ebx,0xffff0000
+; mov [xstep],ebx
+; mov ebx,[ds_ystep]
+; ror ebx,16
+; mov dh,bl
+; and ebx,0xffff0000
+; mov [ystep],ebx
+;
+; mov esi,[ds_source]
+;
+;;; %eax Yi,Xi in %ah,%al
+;;; %ebx aligned colormap
+;;; %ecx Yfrac upper, dXi in %ch, %cl is counter (upto 1024pels, =4x256)
+;;; %edx Xfrac upper, dYi in %dh, %dl receives mapped pixels from (ebx)
+;;; ystep dYfrac, add to %ecx, low word is 0
+;;; xstep dXfrac, add to %edx, low word is 0
+;;; %ebp temporary register serves as offset like %eax
+;;; %esi virtual source
+;;; %edi moving destination pointer
+;
+; mov ebx,[pixelcount]
+; shr ebx,0x2 ;; 4 pixels per loop
+; test bl,0xff
+; je near .hchecklast
+; mov cl,bl
+;
+; mov ebx,[dc_colormap]
+;;;
+;;; prepare loop with first pixel
+;;;
+; add ecx,[ystep] ;;pr‚a1
+; adc ah,dh
+; add edx,[xstep]
+; adc al,ch
+; and eax,0x3f3f
+; mov bl,[esi+eax] ;;pr‚b1
+; mov dl,[ebx] ;;pr‚c1
+;
+; add ecx,[ystep] ;;a2
+; adc ah,dh
+;
+;.hdoubleloop:
+; mov [edi+1],dl
+; add edx,[xstep]
+; adc al,ch
+; add edi,byte +0x2
+; mov ebp,eax
+; add ecx,[ystep]
+; adc ah,dh
+; and ebp,0x3f3f
+; add edx,[xstep]
+; mov bl,[esi+ebp]
+; adc al,ch
+; mov dl,[ebx]
+; and eax,0x3f3f
+; mov [edi],dl
+; mov bl,[esi+eax]
+; add ecx,[ystep]
+; adc ah,dh
+; add edx,[xstep]
+; adc al,ch
+; mov dl,[ebx]
+; mov ebp,eax
+; mov [edi+1],dl
+; and ebp,0x3f3f
+; add ecx,[ystep]
+; adc ah,dh
+; mov bl,[esi+ebp]
+; add edi,byte +0x2
+; add edx,[xstep]
+; adc al,ch
+; mov dl,[ebx]
+; and eax,0x3f3f
+; mov [edi],dl
+; mov bl,[esi+eax]
+; add ecx,[ystep]
+; adc ah,dh
+; mov dl,[ebx]
+; dec cl
+; jne near .hdoubleloop
+;;; check for final pixel
+;.hchecklast:
+;;; to do
+;.hdone:
+; pop ebx
+; pop edi
+; pop esi
+; pop ebp
+; ret
diff --git a/test/uscore.asm b/test/uscore.asm
new file mode 100644
index 00000000..ec614435
--- /dev/null
+++ b/test/uscore.asm
@@ -0,0 +1,15 @@
+;Testname=test; Arguments=-fbin -ouscore.bin; Files=stdout stderr uscore.bin
+ dd 0x1234_5678
+ dd 305_419_896 ; Same number as above it
+ dd 0x1e16 ; NOT a floating-point number!
+ dd 1e16h ; NOT a floating-point number!
+ dd 1e16_h ; NOT a floating-point number!
+ dd $1e16 ; NOT a floating-point number!
+ dd $1e+16 ; NOT a floating-point number!
+ dd 1e16 ; THIS is a floating-point number!
+ dd 1e+16
+ dd 1.e+16
+ dd 1e+1_6
+ dd 1e1_6
+ dd 1.0e16
+ dd 1_0e16 ; This is 1e17, not 1e16!
diff --git a/test/utf.asm b/test/utf.asm
new file mode 100644
index 00000000..00207dc6
--- /dev/null
+++ b/test/utf.asm
@@ -0,0 +1,82 @@
+;Testname=test; Arguments=-fbin -outf.bin; Files=stdout stderr utf.bin
+;Testname=error; Arguments=-fbin -outf.bin -DERROR; Files=stdout stderr utf.bin
+%define u(x) __utf16__(x)
+%define w(x) __utf32__(x)
+%define ul(x) __utf16le__(x)
+%define wl(x) __utf32le__(x)
+%define ub(x) __utf16be__(x)
+%define wb(x) __utf32be__(x)
+
+ db `Test \u306a\U0001abcd\n`
+ dw u(`Test \u306a\U0001abcd\n`)
+ dd w(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16__ "Hello, World!"
+
+ nop
+
+ mov ax,u(`a`)
+ mov bx,u(`\u306a`)
+ mov cx,u(`\xe3\x81\xaa`)
+ mov eax,u(`ab`)
+ mov ebx,u(`\U0001abcd`)
+ mov ecx,w(`\U0001abcd`)
+
+ db `Test \u306a\U0001abcd\n`
+ dw ul(`Test \u306a\U0001abcd\n`)
+ dd wl(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16le__ "Hello, World!"
+
+ nop
+
+ mov ax,ul(`a`)
+ mov bx,ul(`\u306a`)
+ mov cx,ul(`\xe3\x81\xaa`)
+ mov eax,ul(`ab`)
+ mov ebx,ul(`\U0001abcd`)
+ mov ecx,wl(`\U0001abcd`)
+
+ db `Test \u306a\U0001abcd\n`
+ dw ub(`Test \u306a\U0001abcd\n`)
+ dd wb(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16be__ "Hello, World!"
+
+ nop
+
+ mov ax,ub(`a`)
+ mov bx,ub(`\u306a`)
+ mov cx,ub(`\xe3\x81\xaa`)
+ mov eax,ub(`ab`)
+ mov ebx,ub(`\U0001abcd`)
+ mov ecx,wb(`\U0001abcd`)
+
+%ifdef ERROR
+ dw __utf16__ 33
+ dw __utf16__, 46
+ dw __utf16__("Hello, World!",16)
+ dw __utf16__("Hello, World!",16
+ dw u(`\xff`)
+
+ dw __utf16le__ 33
+ dw __utf16le__, 46
+ dw __utf16le__("Hello, World!",16)
+ dw __utf16le__("Hello, World!",16
+ dw ul(`\xff`)
+
+ dw __utf16be__ 33
+ dw __utf16be__, 46
+ dw __utf16be__("Hello, World!",16)
+ dw __utf16be__("Hello, World!",16
+ dw ub(`\xff`)
+%endif
diff --git a/test/v4.asm b/test/v4.asm
new file mode 100644
index 00000000..a64d3c66
--- /dev/null
+++ b/test/v4.asm
@@ -0,0 +1,12 @@
+ bits 64
+ v4fmaddps zmm0,zmm1+3,[rax]
+ v4fnmaddps zmm2,zmm3,[rax]
+ v4fmaddss zmm4,zmm5+3,[rax]
+ v4fnmaddss zmm6,zmm7+3,[rax]
+
+ v4dpwssds zmm8,zmm9,[rax]
+ v4dpwssd zmm10,zmm11+3,[rax]
+ v4dpwssd zmm10+0,zmm11+3,[rax]
+; v4dpwssd zmm10+1,zmm11+3,[rax]
+; v4dpwssd zmm10,zmm11+4,[rax]
+; v4dpwssd zmm10,zmm11+7,[rax]
diff --git a/test/vaesenc.asm b/test/vaesenc.asm
new file mode 100644
index 00000000..9edca705
--- /dev/null
+++ b/test/vaesenc.asm
@@ -0,0 +1,22 @@
+;; BR 3392454, 3392460
+
+ bits 64
+ aesenc xmm0,xmm4
+ vaesenc zmm0,zmm0,zmm4
+ vpclmullqlqdq zmm1,zmm1,zmm5
+ vpclmulqdq zmm0, zmm1, zmm2, 0
+ vaesenclast zmm0, zmm1, zmm2
+
+ bits 32
+ aesenc xmm0,xmm4
+ vaesenc zmm0,zmm0,zmm4
+ vpclmullqlqdq zmm1,zmm1,zmm5
+ vpclmulqdq zmm0, zmm1, zmm2, 0
+ vaesenclast zmm0, zmm1, zmm2
+
+ bits 16
+ aesenc xmm0,xmm4
+ vaesenc zmm0,zmm0,zmm4
+ vpclmullqlqdq zmm1,zmm1,zmm5
+ vpclmulqdq zmm0, zmm1, zmm2, 0
+ vaesenclast zmm0, zmm1, zmm2
diff --git a/test/vex.asm b/test/vex.asm
new file mode 100644
index 00000000..6772c7ce
--- /dev/null
+++ b/test/vex.asm
@@ -0,0 +1,9 @@
+ bits 64
+ vcomisd xmm0,xmm31
+ vcomisd xmm0,xmm1
+ {vex2} vcomisd xmm0,xmm1
+ {vex3} vcomisd xmm0,xmm1
+ {evex} vcomisd xmm0,xmm1
+%ifdef ERROR
+ {vex3} add eax,edx
+%endif
diff --git a/test/vgather.asm b/test/vgather.asm
new file mode 100644
index 00000000..4012bf28
--- /dev/null
+++ b/test/vgather.asm
@@ -0,0 +1,76 @@
+ bits 64
+
+ vgatherdpd xmm0,[rcx+xmm2],xmm3
+ vgatherqpd xmm0,[rcx+xmm2],xmm3
+ vgatherdpd ymm0,[rcx+xmm2],ymm3
+ vgatherqpd ymm0,[rcx+ymm2],ymm3
+
+ vgatherdpd xmm0,[rcx+xmm2*1],xmm3
+ vgatherqpd xmm0,[rcx+xmm2*1],xmm3
+ vgatherdpd ymm0,[rcx+xmm2*1],ymm3
+ vgatherqpd ymm0,[rcx+ymm2*1],ymm3
+
+ vgatherdpd xmm0,[rcx+xmm2*2],xmm3
+ vgatherqpd xmm0,[rcx+xmm2*2],xmm3
+ vgatherdpd ymm0,[rcx+xmm2*2],ymm3
+ vgatherqpd ymm0,[rcx+ymm2*2],ymm3
+
+ vgatherdpd xmm0,[rcx+xmm2*4],xmm3
+ vgatherqpd xmm0,[rcx+xmm2*4],xmm3
+ vgatherdpd ymm0,[rcx+xmm2*4],ymm3
+ vgatherqpd ymm0,[rcx+ymm2*4],ymm3
+
+ vgatherdpd xmm0,[rcx+xmm2*8],xmm3
+ vgatherqpd xmm0,[rcx+xmm2*8],xmm3
+ vgatherdpd ymm0,[rcx+xmm2*8],ymm3
+ vgatherqpd ymm0,[rcx+ymm2*8],ymm3
+
+ vgatherdpd xmm0,[xmm2],xmm3
+ vgatherqpd xmm0,[xmm2],xmm3
+ vgatherdpd ymm0,[xmm2],ymm3
+ vgatherqpd ymm0,[ymm2],ymm3
+
+ vgatherdpd xmm0,[xmm2*1],xmm3
+ vgatherqpd xmm0,[xmm2*1],xmm3
+ vgatherdpd ymm0,[xmm2*1],ymm3
+ vgatherqpd ymm0,[ymm2*1],ymm3
+
+ vgatherdpd xmm0,[xmm2*2],xmm3
+ vgatherqpd xmm0,[xmm2*2],xmm3
+ vgatherdpd ymm0,[xmm2*2],ymm3
+ vgatherqpd ymm0,[ymm2*2],ymm3
+
+ vgatherdpd xmm0,[xmm2*4],xmm3
+ vgatherqpd xmm0,[xmm2*4],xmm3
+ vgatherdpd ymm0,[xmm2*4],ymm3
+ vgatherqpd ymm0,[ymm2*4],ymm3
+
+ vgatherdpd xmm0,[xmm2*8],xmm3
+ vgatherqpd xmm0,[xmm2*8],xmm3
+ vgatherdpd ymm0,[xmm2*8],ymm3
+ vgatherqpd ymm0,[ymm2*8],ymm3
+
+ vgatherdpd xmm0,[xmm2+rcx],xmm3
+ vgatherqpd xmm0,[xmm2+rcx],xmm3
+ vgatherdpd ymm0,[xmm2+rcx],ymm3
+ vgatherqpd ymm0,[ymm2+rcx],ymm3
+
+ vgatherdpd xmm0,[xmm2*1+rcx],xmm3
+ vgatherqpd xmm0,[xmm2*1+rcx],xmm3
+ vgatherdpd ymm0,[xmm2*1+rcx],ymm3
+ vgatherqpd ymm0,[ymm2*1+rcx],ymm3
+
+ vgatherdpd xmm0,[xmm2*2+rcx],xmm3
+ vgatherqpd xmm0,[xmm2*2+rcx],xmm3
+ vgatherdpd ymm0,[xmm2*2+rcx],ymm3
+ vgatherqpd ymm0,[ymm2*2+rcx],ymm3
+
+ vgatherdpd xmm0,[xmm2*4+rcx],xmm3
+ vgatherqpd xmm0,[xmm2*4+rcx],xmm3
+ vgatherdpd ymm0,[xmm2*4+rcx],ymm3
+ vgatherqpd ymm0,[ymm2*4+rcx],ymm3
+
+ vgatherdpd xmm0,[xmm2*8+rcx],xmm3
+ vgatherqpd xmm0,[xmm2*8+rcx],xmm3
+ vgatherdpd ymm0,[xmm2*8+rcx],ymm3
+ vgatherqpd ymm0,[ymm2*8+rcx],ymm3
diff --git a/test/vmread.asm b/test/vmread.asm
new file mode 100644
index 00000000..551c71a1
--- /dev/null
+++ b/test/vmread.asm
@@ -0,0 +1,26 @@
+;Testname=test; Arguments=-fbin -ovmread.bin; Files=stdout stderr vmread.bin
+
+ bits 32
+ vmread dword [0], eax
+ vmwrite eax, dword [0]
+ vmread [0], eax
+ vmwrite eax, [0]
+
+ bits 64
+ vmread qword [0], rax
+ vmwrite rax, qword [0]
+ vmread [0], rax
+ vmwrite rax, [0]
+
+%ifdef ERROR
+ bits 32
+ vmread qword [0], eax
+ vmwrite eax, qword [0]
+
+ bits 64
+ vmread dword [0], eax
+ vmwrite eax, dword [0]
+
+ vmread qword [0], eax
+ vmwrite eax, qword [0]
+%endif \ No newline at end of file
diff --git a/test/weirdpaste.asm b/test/weirdpaste.asm
new file mode 100644
index 00000000..46bfa90a
--- /dev/null
+++ b/test/weirdpaste.asm
@@ -0,0 +1,29 @@
+;Testname=preproc; Arguments=-E; Files=stdout stderr
+;Testname=bin; Arguments=-fbin -oweirdpaste.bin; Files=stdout stderr weirdpaste.bin
+
+ %define foo xyzzy
+%define bar 1e+10
+
+%define xyzzy1e 15
+
+%macro dx 2
+%assign xx %1%2
+ dw xx
+%endmacro
+
+ dx foo, bar
+
+%macro df 2
+%assign xy __float32__(%1e+%2)
+ dd xy
+ dd %1e+%2
+%endmacro
+
+ df 1, 36
+ df 33, 20
+ df 0, 2
+ df 1.2, 5
+
+
+%define N 1e%++%+ 5
+ dd N, 1e+5
diff --git a/test/xchg.asm b/test/xchg.asm
new file mode 100644
index 00000000..9c826dd9
--- /dev/null
+++ b/test/xchg.asm
@@ -0,0 +1,96 @@
+;Testname=unoptimized; Arguments=-fbin -oxchg.bin -O0; Files=stdout stderr xchg.bin
+;Testname=optimized; Arguments=-fbin -oxchg.bin -Ox; Files=stdout stderr xchg.bin
+
+%macro x 2
+ xchg %1,%2
+ xchg %2,%1
+%endmacro
+
+ bits 16
+
+ x ax,ax
+ x ax,cx
+ x ax,dx
+ x ax,bx
+ x ax,sp
+ x ax,bp
+ x ax,si
+ x ax,di
+ x eax,eax
+ x eax,ecx
+ x eax,edx
+ x eax,ebx
+ x eax,esp
+ x eax,ebp
+ x eax,esi
+ x eax,edi
+
+ bits 32
+
+ x ax,ax
+ x ax,cx
+ x ax,dx
+ x ax,bx
+ x ax,sp
+ x ax,bp
+ x ax,si
+ x ax,di
+ x eax,eax
+ x eax,ecx
+ x eax,edx
+ x eax,ebx
+ x eax,esp
+ x eax,ebp
+ x eax,esi
+ x eax,edi
+
+ bits 64
+
+ x ax,ax
+ x ax,cx
+ x ax,dx
+ x ax,bx
+ x ax,sp
+ x ax,bp
+ x ax,si
+ x ax,di
+ x ax,r8w
+ x ax,r9w
+ x ax,r10w
+ x ax,r11w
+ x ax,r12w
+ x ax,r13w
+ x ax,r14w
+ x ax,r15w
+ x eax,eax
+ x eax,ecx
+ x eax,edx
+ x eax,ebx
+ x eax,esp
+ x eax,ebp
+ x eax,esi
+ x eax,edi
+ x eax,r8d
+ x eax,r9d
+ x eax,r10d
+ x eax,r11d
+ x eax,r12d
+ x eax,r13d
+ x eax,r14d
+ x eax,r15d
+ x rax,rax
+ x rax,rcx
+ x rax,rdx
+ x rax,rbx
+ x rax,rsp
+ x rax,rbp
+ x rax,rsi
+ x rax,rdi
+ x rax,r8
+ x rax,r9
+ x rax,r10
+ x rax,r11
+ x rax,r12
+ x rax,r13
+ x rax,r14
+ x rax,r15
diff --git a/test/xcrypt.asm b/test/xcrypt.asm
new file mode 100644
index 00000000..55a3f5de
--- /dev/null
+++ b/test/xcrypt.asm
@@ -0,0 +1,24 @@
+;Testname=test; Arguments=-fbin -oxcrypt.bin; Files=stdout stderr xcrypt.bin
+; BR 2029829
+
+ bits 32
+
+ rep xstore
+ rep xcryptecb
+ rep xcryptcbc
+ rep xcryptctr
+ rep xcryptcfb
+ rep xcryptofb
+ rep montmul
+ rep xsha1
+ rep xsha256
+
+ xstore
+ xcryptecb
+ xcryptcbc
+ xcryptctr
+ xcryptcfb
+ xcryptofb
+ montmul
+ xsha1
+ xsha256
diff --git a/test/xmm0.asm b/test/xmm0.asm
new file mode 100644
index 00000000..48231438
--- /dev/null
+++ b/test/xmm0.asm
@@ -0,0 +1,12 @@
+; BR 3392275: don't require xmm0 to be explicitly declared when implicit
+
+ bits 32
+
+ blendvpd xmm2,xmm1,xmm0
+ blendvpd xmm2,xmm1
+ blendvps xmm2,xmm1,xmm0
+ blendvps xmm2,xmm1
+ pblendvb xmm2,xmm1,xmm0
+ pblendvb xmm2,xmm1
+ sha256rnds2 xmm2,xmm1,xmm0
+ sha256rnds2 xmm2,xmm1
diff --git a/test/zerobyte.asm b/test/zerobyte.asm
new file mode 100644
index 00000000..c3a0441a
--- /dev/null
+++ b/test/zerobyte.asm
@@ -0,0 +1,22 @@
+;Testname=test; Arguments=-fbin -ozerobyte.bin; Files=stdout stderr zerobyte.bin
+ bits 64
+
+ mov eax,bar-foo
+
+foo:
+ add al,r10b
+bar:
+
+ lldt ax
+ lldt r8w
+ ltr [rax]
+ sldt eax
+ sldt r8d
+ str eax
+ str rax
+ str r8d
+ str r8
+ verr ax
+ verr r8w
+ verw ax
+ verw r8w
diff --git a/tools/cleanfile b/tools/cleanfile
new file mode 100755
index 00000000..cefd29e5
--- /dev/null
+++ b/tools/cleanfile
@@ -0,0 +1,176 @@
+#!/usr/bin/perl -w
+#
+# Clean a text file -- or directory of text files -- of stealth whitespace.
+# WARNING: this can be a highly destructive operation. Use with caution.
+#
+
+use bytes;
+use File::Basename;
+
+# Default options
+$max_width = 79;
+
+# Clean up space-tab sequences, either by removing spaces or
+# replacing them with tabs.
+sub clean_space_tabs($)
+{
+ no bytes; # Tab alignment depends on characters
+
+ my($li) = @_;
+ my($lo) = '';
+ my $pos = 0;
+ my $nsp = 0;
+ my($i, $c);
+
+ for ($i = 0; $i < length($li); $i++) {
+ $c = substr($li, $i, 1);
+ if ($c eq "\t") {
+ my $npos = ($pos+$nsp+8) & ~7;
+ my $ntab = ($npos >> 3) - ($pos >> 3);
+ $lo .= "\t" x $ntab;
+ $pos = $npos;
+ $nsp = 0;
+ } elsif ($c eq "\n" || $c eq "\r") {
+ $lo .= " " x $nsp;
+ $pos += $nsp;
+ $nsp = 0;
+ $lo .= $c;
+ $pos = 0;
+ } elsif ($c eq " ") {
+ $nsp++;
+ } else {
+ $lo .= " " x $nsp;
+ $pos += $nsp;
+ $nsp = 0;
+ $lo .= $c;
+ $pos++;
+ }
+ }
+ $lo .= " " x $nsp;
+ return $lo;
+}
+
+# Compute the visual width of a string
+sub strwidth($) {
+ no bytes; # Tab alignment depends on characters
+
+ my($li) = @_;
+ my($c, $i);
+ my $pos = 0;
+ my $mlen = 0;
+
+ for ($i = 0; $i < length($li); $i++) {
+ $c = substr($li,$i,1);
+ if ($c eq "\t") {
+ $pos = ($pos+8) & ~7;
+ } elsif ($c eq "\n") {
+ $mlen = $pos if ($pos > $mlen);
+ $pos = 0;
+ } else {
+ $pos++;
+ }
+ }
+
+ $mlen = $pos if ($pos > $mlen);
+ return $mlen;
+}
+
+$name = basename($0);
+
+@files = ();
+
+while (defined($a = shift(@ARGV))) {
+ if ($a =~ /^-/) {
+ if ($a eq '-width' || $a eq '-w') {
+ $max_width = shift(@ARGV)+0;
+ } else {
+ print STDERR "Usage: $name [-width #] files...\n";
+ exit 1;
+ }
+ } else {
+ push(@files, $a);
+ }
+}
+
+foreach $f ( @files ) {
+ print STDERR "$name: $f\n";
+
+ if (! -f $f) {
+ print STDERR "$f: not a file\n";
+ next;
+ }
+
+ if (!open(FILE, '+<', $f)) {
+ print STDERR "$name: Cannot open file: $f: $!\n";
+ next;
+ }
+
+ binmode FILE;
+
+ # First, verify that it is not a binary file; consider any file
+ # with a zero byte to be a binary file. Is there any better, or
+ # additional, heuristic that should be applied?
+ $is_binary = 0;
+
+ while (read(FILE, $data, 65536) > 0) {
+ if ($data =~ /\0/) {
+ $is_binary = 1;
+ last;
+ }
+ }
+
+ if ($is_binary) {
+ print STDERR "$name: $f: binary file\n";
+ next;
+ }
+
+ seek(FILE, 0, 0);
+
+ $in_bytes = 0;
+ $out_bytes = 0;
+ $blank_bytes = 0;
+
+ @blanks = ();
+ @lines = ();
+ $lineno = 0;
+
+ while ( defined($line = <FILE>) ) {
+ $lineno++;
+ $in_bytes += length($line);
+ $line =~ s/[ \t\r]*$//; # Remove trailing spaces
+ $line = clean_space_tabs($line);
+
+ if ( $line eq "\n" ) {
+ push(@blanks, $line);
+ $blank_bytes += length($line);
+ } else {
+ push(@lines, @blanks);
+ $out_bytes += $blank_bytes;
+ push(@lines, $line);
+ $out_bytes += length($line);
+ @blanks = ();
+ $blank_bytes = 0;
+ }
+
+ $l_width = strwidth($line);
+ if ($max_width && $l_width > $max_width) {
+ print STDERR
+ "$f:$lineno: line exceeds $max_width characters ($l_width)\n";
+ }
+ }
+
+ # Any blanks at the end of the file are discarded
+
+ if ($in_bytes != $out_bytes) {
+ # Only write to the file if changed
+ seek(FILE, 0, 0);
+ print FILE @lines;
+
+ if ( !defined($where = tell(FILE)) ||
+ !truncate(FILE, $where) ) {
+ die "$name: Failed to truncate modified file: $f: $!\n";
+ }
+ }
+
+ close(FILE);
+}
diff --git a/tools/cleanpatch b/tools/cleanpatch
new file mode 100755
index 00000000..9680d03a
--- /dev/null
+++ b/tools/cleanpatch
@@ -0,0 +1,258 @@
+#!/usr/bin/perl -w
+#
+# Clean a patch file -- or directory of patch files -- of stealth whitespace.
+# WARNING: this can be a highly destructive operation. Use with caution.
+#
+
+use bytes;
+use File::Basename;
+
+# Default options
+$max_width = 79;
+
+# Clean up space-tab sequences, either by removing spaces or
+# replacing them with tabs.
+sub clean_space_tabs($)
+{
+ no bytes; # Tab alignment depends on characters
+
+ my($li) = @_;
+ my($lo) = '';
+ my $pos = 0;
+ my $nsp = 0;
+ my($i, $c);
+
+ for ($i = 0; $i < length($li); $i++) {
+ $c = substr($li, $i, 1);
+ if ($c eq "\t") {
+ my $npos = ($pos+$nsp+8) & ~7;
+ my $ntab = ($npos >> 3) - ($pos >> 3);
+ $lo .= "\t" x $ntab;
+ $pos = $npos;
+ $nsp = 0;
+ } elsif ($c eq "\n" || $c eq "\r") {
+ $lo .= " " x $nsp;
+ $pos += $nsp;
+ $nsp = 0;
+ $lo .= $c;
+ $pos = 0;
+ } elsif ($c eq " ") {
+ $nsp++;
+ } else {
+ $lo .= " " x $nsp;
+ $pos += $nsp;
+ $nsp = 0;
+ $lo .= $c;
+ $pos++;
+ }
+ }
+ $lo .= " " x $nsp;
+ return $lo;
+}
+
+# Compute the visual width of a string
+sub strwidth($) {
+ no bytes; # Tab alignment depends on characters
+
+ my($li) = @_;
+ my($c, $i);
+ my $pos = 0;
+ my $mlen = 0;
+
+ for ($i = 0; $i < length($li); $i++) {
+ $c = substr($li,$i,1);
+ if ($c eq "\t") {
+ $pos = ($pos+8) & ~7;
+ } elsif ($c eq "\n") {
+ $mlen = $pos if ($pos > $mlen);
+ $pos = 0;
+ } else {
+ $pos++;
+ }
+ }
+
+ $mlen = $pos if ($pos > $mlen);
+ return $mlen;
+}
+
+$name = basename($0);
+
+@files = ();
+
+while (defined($a = shift(@ARGV))) {
+ if ($a =~ /^-/) {
+ if ($a eq '-width' || $a eq '-w') {
+ $max_width = shift(@ARGV)+0;
+ } else {
+ print STDERR "Usage: $name [-width #] files...\n";
+ exit 1;
+ }
+ } else {
+ push(@files, $a);
+ }
+}
+
+foreach $f ( @files ) {
+ print STDERR "$name: $f\n";
+
+ if (! -f $f) {
+ print STDERR "$f: not a file\n";
+ next;
+ }
+
+ if (!open(FILE, '+<', $f)) {
+ print STDERR "$name: Cannot open file: $f: $!\n";
+ next;
+ }
+
+ binmode FILE;
+
+ # First, verify that it is not a binary file; consider any file
+ # with a zero byte to be a binary file. Is there any better, or
+ # additional, heuristic that should be applied?
+ $is_binary = 0;
+
+ while (read(FILE, $data, 65536) > 0) {
+ if ($data =~ /\0/) {
+ $is_binary = 1;
+ last;
+ }
+ }
+
+ if ($is_binary) {
+ print STDERR "$name: $f: binary file\n";
+ next;
+ }
+
+ seek(FILE, 0, 0);
+
+ $in_bytes = 0;
+ $out_bytes = 0;
+ $lineno = 0;
+
+ @lines = ();
+
+ $in_hunk = 0;
+ $err = 0;
+
+ while ( defined($line = <FILE>) ) {
+ $lineno++;
+ $in_bytes += length($line);
+
+ if (!$in_hunk) {
+ if ($line =~
+ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
+ $minus_lines = $2;
+ $plus_lines = $4;
+ if ($minus_lines || $plus_lines) {
+ $in_hunk = 1;
+ @hunk_lines = ($line);
+ }
+ } else {
+ push(@lines, $line);
+ $out_bytes += length($line);
+ }
+ } else {
+ # We're in a hunk
+
+ if ($line =~ /^\+/) {
+ $plus_lines--;
+
+ $text = substr($line, 1);
+ $text =~ s/[ \t\r]*$//; # Remove trailing spaces
+ $text = clean_space_tabs($text);
+
+ $l_width = strwidth($text);
+ if ($max_width && $l_width > $max_width) {
+ print STDERR
+ "$f:$lineno: adds line exceeds $max_width ",
+ "characters ($l_width)\n";
+ }
+
+ push(@hunk_lines, '+'.$text);
+ } elsif ($line =~ /^\-/) {
+ $minus_lines--;
+ push(@hunk_lines, $line);
+ } elsif ($line =~ /^ /) {
+ $plus_lines--;
+ $minus_lines--;
+ push(@hunk_lines, $line);
+ } else {
+ print STDERR "$name: $f: malformed patch\n";
+ $err = 1;
+ last;
+ }
+
+ if ($plus_lines < 0 || $minus_lines < 0) {
+ print STDERR "$name: $f: malformed patch\n";
+ $err = 1;
+ last;
+ } elsif ($plus_lines == 0 && $minus_lines == 0) {
+ # End of a hunk. Process this hunk.
+ my $i;
+ my $l;
+ my @h = ();
+ my $adj = 0;
+ my $done = 0;
+
+ for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) {
+ $l = $hunk_lines[$i];
+ if (!$done && $l eq "+\n") {
+ $adj++; # Skip this line
+ } elsif ($l =~ /^[ +]/) {
+ $done = 1;
+ unshift(@h, $l);
+ } else {
+ unshift(@h, $l);
+ }
+ }
+
+ $l = $hunk_lines[0]; # Hunk header
+ undef @hunk_lines; # Free memory
+
+ if ($adj) {
+ die unless
+ ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/);
+ my $mstart = $1;
+ my $mlin = $2;
+ my $pstart = $3;
+ my $plin = $4;
+ my $tail = $5; # doesn't include the final newline
+
+ $l = sprintf("@@ -%d,%d +%d,%d @@%s\n",
+ $mstart, $mlin, $pstart, $plin-$adj,
+ $tail);
+ }
+ unshift(@h, $l);
+
+ # Transfer to the output array
+ foreach $l (@h) {
+ $out_bytes += length($l);
+ push(@lines, $l);
+ }
+
+ $in_hunk = 0;
+ }
+ }
+ }
+
+ if ($in_hunk) {
+ print STDERR "$name: $f: malformed patch\n";
+ $err = 1;
+ }
+
+ if (!$err) {
+ if ($in_bytes != $out_bytes) {
+ # Only write to the file if changed
+ seek(FILE, 0, 0);
+ print FILE @lines;
+
+ if ( !defined($where = tell(FILE)) ||
+ !truncate(FILE, $where) ) {
+ die "$name: Failed to truncate modified file: $f: $!\n";
+ }
+ }
+ }
+
+ close(FILE);
+}
diff --git a/tools/mkdep.pl b/tools/mkdep.pl
new file mode 100755
index 00000000..8c89f39a
--- /dev/null
+++ b/tools/mkdep.pl
@@ -0,0 +1,320 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Script to create Makefile-style dependencies.
+#
+# Usage:
+# perl mkdep.pl [-s path-separator][-o obj-ext] dir... > deps
+# perl mkdep.pl [-i][-e][-m makefile]...[-M makefile... --] dir...
+#
+
+use File::Spec;
+use File::Basename;
+use File::Copy;
+use File::Temp;
+use Fcntl;
+
+$barrier = "#-- Everything below is generated by mkdep.pl - do not edit --#\n";
+
+# This converts from filenames to full pathnames for our dependencies
+%dep_path = {};
+
+# List of files that cannot be found; these *must* be excluded
+@must_exclude = ();
+
+#
+# Scan files for dependencies
+#
+sub scandeps($) {
+ my($file) = @_;
+ my $line;
+ my %xdeps;
+ my %mdeps;
+
+ open(my $fh, '<', $file)
+ or return; # If not openable, assume generated
+
+ while ( defined($line = <$fh>) ) {
+ chomp $line;
+ $line =~ s:/\*.*\*/::g;
+ $line =~ s://.*$::;
+ if ( $line =~ /^\s*\#\s*include\s+\"(.*)\"\s*$/ ) {
+ my $nf = $1;
+ if (!defined($dep_path{$nf})) {
+ push(@must_exclude, $nf);
+ next;
+ }
+ $nf = $dep_path{$nf};
+ $mdeps{$nf}++;
+ $xdeps{$nf}++ unless ( defined($deps{$nf}) );
+ }
+ }
+ close($fh);
+ $deps{$file} = [keys(%mdeps)];
+
+ foreach my $xf ( keys(%xdeps) ) {
+ scandeps($xf);
+ }
+}
+
+# %deps contains direct dependencies. This subroutine resolves
+# indirect dependencies that result.
+sub alldeps($$) {
+ my($file, $level) = @_;
+ my %adeps;
+
+ foreach my $dep ( @{$deps{$file}} ) {
+ $adeps{$dep} = 1;
+ foreach my $idep ( alldeps($dep, $level+1) ) {
+ $adeps{$idep} = 1;
+ }
+ }
+ return sort(keys(%adeps));
+}
+
+# This converts a filename from host syntax to target syntax
+# This almost certainly works only on relative filenames...
+sub convert_file($$) {
+ my($file,$sep) = @_;
+
+ my @fspec = (basename($file));
+ while ( ($file = dirname($file)) ne File::Spec->curdir() &&
+ $file ne File::Spec->rootdir() ) {
+ unshift(@fspec, basename($file));
+ }
+
+ if ( $sep eq '' ) {
+ # This means kill path completely. Used with Makes who do
+ # path searches, but doesn't handle output files in subdirectories,
+ # like OpenWatcom WMAKE.
+ return $fspec[scalar(@fspec)-1];
+ } else {
+ return join($sep, @fspec);
+ }
+}
+
+#
+# Insert dependencies into a Makefile
+#
+sub _insert_deps($$) {
+ my($file, $out) = @_;
+
+ open(my $in, '<', $file)
+ or die "$0: Cannot open input: $file\n";
+
+ my $line, $parm, $val;
+ my $obj = '.o'; # Defaults
+ my $sep = '/';
+ my $cont = "\\";
+ my $include_command = undef;
+ my $selfrule = 0;
+ my $do_external = 0;
+ my $maxline = 78; # Seems like a reasonable default
+ my %exclude = (); # Don't exclude anything
+ my @genhdrs = ();
+ my $external = undef;
+ my $raw_output = 0;
+ my @outfile = ();
+ my $done = 0;
+
+ while ( defined($line = <$in>) && !$done ) {
+ if ( $line =~ /^([^\s\#\$\:]+\.h):/ ) {
+ # Note: we trust the first Makefile given best
+ my $fpath = $1;
+ my $fbase = basename($fpath);
+ if (!defined($dep_path{$fbase})) {
+ $dep_path{$fbase} = $fpath;
+ print STDERR "Makefile: $fbase -> $fpath\n";
+ }
+ } elsif ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) {
+ $parm = $1; $val = $2;
+ if ( $parm eq 'object-ending' ) {
+ $obj = $val;
+ } elsif ( $parm eq 'path-separator' ) {
+ $sep = $val;
+ } elsif ( $parm eq 'line-width' ) {
+ $maxline = $val+0;
+ } elsif ( $parm eq 'continuation' ) {
+ $cont = $val;
+ } elsif ( $parm eq 'exclude' ) {
+ $excludes{$val}++;
+ } elsif ( $parm eq 'include-command' ) {
+ $include_command = $val;
+ } elsif ( $parm eq 'external' ) {
+ # Keep dependencies in an external file
+ $external = $val;
+ } elsif ( $parm eq 'selfrule' ) {
+ $selfrule = !!$val;
+ }
+ } elsif ( $line =~ /^(\s*\#?\s*EXTERNAL_DEPENDENCIES\s*=\s*)([01])\s*$/ ) {
+ $is_external = $externalize ? 1 : $force_inline ? 0 : $2+0;
+ $line = $1.$is_external."\n";
+ } elsif ( $line eq $barrier ) {
+ $done = 1; # Stop reading input at barrier line
+ }
+
+ push @outfile, $line;
+ }
+ close($in);
+
+ $is_external = $is_external && defined($external);
+
+ if ( !$is_external || $externalize ) {
+ print $out @outfile;
+ } else {
+ print $out $barrier; # Start generated file with barrier
+ }
+
+ if ( $externalize ) {
+ if ( $is_external && defined($include_command) ) {
+ print $out "$include_command $external\n";
+ }
+ return undef;
+ }
+
+ my $e;
+
+ foreach my $dfile ($external, sort(keys(%deps)) ) {
+ my $ofile;
+ my @deps;
+
+ if ( $selfrule && $dfile eq $external ) {
+ $ofile = convert_file($dfile, $sep).':';
+ @deps = sort(keys(%deps));
+ } elsif ( $dfile =~ /^(.*)\.[Cc]$/ ) {
+ $ofile = convert_file($1, $sep).$obj.':';
+ @deps = ($dfile,alldeps($dfile,1));
+ }
+
+ if (defined($ofile)) {
+ my $len = length($ofile);
+ print $out $ofile;
+ foreach my $dep (@deps) {
+ unless ($excludes{$dep}) {
+ my $str = convert_file($dep, $sep);
+ my $sl = length($str)+1;
+ if ( $len+$sl > $maxline-2 ) {
+ print $out ' ', $cont, "\n ", $str;
+ $len = $sl;
+ } else {
+ print $out ' ', $str;
+ $len += $sl;
+ }
+ }
+ }
+ print $out "\n";
+ }
+ }
+
+ return $external;
+}
+
+sub insert_deps($)
+{
+ my($mkfile) = @_;
+ my $tmp = File::Temp->new(DIR => dirname($mkfile));
+ my $tmpname = $tmp->filename;
+
+ my $newname = _insert_deps($mkfile, $tmp);
+ close($tmp);
+
+ $newname = $mkfile unless(defined($newname));
+
+ move($tmpname, $newname);
+}
+
+#
+# Main program
+#
+
+my %deps = ();
+my @files = ();
+my @mkfiles = ();
+my $mkmode = 0;
+$force_inline = 0;
+$externalize = 0;
+$debug = 0;
+
+while ( defined(my $arg = shift(@ARGV)) ) {
+ if ( $arg eq '-m' ) {
+ $arg = shift(@ARGV);
+ push(@mkfiles, $arg);
+ } elsif ( $arg eq '-i' ) {
+ $force_inline = 1;
+ } elsif ( $arg eq '-e' ) {
+ $externalize = 1;
+ } elsif ( $arg eq '-d' ) {
+ $debug++;
+ } elsif ( $arg eq '-M' ) {
+ $mkmode = 1; # Futher filenames are output Makefile names
+ } elsif ( $arg eq '--' && $mkmode ) {
+ $mkmode = 0;
+ } elsif ( $arg =~ /^-/ ) {
+ die "Unknown option: $arg\n";
+ } else {
+ if ( $mkmode ) {
+ push(@mkfiles, $arg);
+ } else {
+ push(@files, $arg);
+ }
+ }
+}
+
+my @cfiles = ();
+
+foreach my $dir ( @files ) {
+ opendir(DIR, $dir) or die "$0: Cannot open directory: $dir";
+
+ while ( my $file = readdir(DIR) ) {
+ $path = ($dir eq File::Spec->curdir())
+ ? $file : File::Spec->catfile($dir,$file);
+ if ( $file =~ /\.[Cc]$/ ) {
+ push(@cfiles, $path);
+ } elsif ( $file =~ /\.[Hh]$/ ) {
+ print STDERR "Filesystem: $file -> $path\n" if ( $debug );
+ $dep_path{$file} = $path; # Allow the blank filename
+ $dep_path{$path} = $path; # Also allow the full pathname
+ }
+ }
+ closedir(DIR);
+}
+
+foreach my $cfile ( @cfiles ) {
+ scandeps($cfile);
+}
+
+foreach my $mkfile ( @mkfiles ) {
+ insert_deps($mkfile);
+}
diff --git a/tools/release b/tools/release
new file mode 100755
index 00000000..dd68ec7c
--- /dev/null
+++ b/tools/release
@@ -0,0 +1,105 @@
+#!/bin/bash -xe
+#
+# Generate a NASM release
+#
+# Usage: release version [destination]
+#
+
+version="$1"
+if [ -z "$1" ]; then
+ echo "Usage: $0 version [destination]" 1>&2
+ exit 1
+fi
+
+WHERE="$2"
+if [ -z "$WHERE" ]; then
+ WHERE=/var/tmp
+fi
+
+if [ -n "$GIT_DIR" ]; then
+ HERE="$GIT_DIR"
+else
+ HERE=`pwd`
+fi
+
+if [ x`cat version` != x"${version}" ]; then
+ echo "${version}" > version
+ git update-index version
+ git commit -m "Version ${version}" -- version
+fi
+git tag -m "NASM version ${version}" -f "nasm-${version}"
+
+cd "$WHERE"
+rm -rf nasm-release.*
+work=nasm-release.$$
+mkdir $work
+cd $work
+unset GIT_DIR
+git clone -s -l "$HERE" nasm
+rm -rf nasm/.git nasm/.gitignore
+
+# How to invoke make if makej is not set
+makej="${makej:-make}"
+
+# Create files which are in the release but automatically generated
+cd nasm
+./autogen.sh
+./configure --prefix=/usr/local
+$makej perlreq spec manpages
+$makej alldeps
+$makej distclean
+cd ..
+
+# Clean up any previous attempt
+rm -f ../nasm-"$version".tar.gz ../nasm-"$version"-xdoc.tar.gz
+rm -f ../nasm-"$version".tar.bz2 ../nasm-"$version"-xdoc.tar.bz2
+rm -f ../nasm-"$version".tar.xz ../nasm-"$version"-xdoc.tar.xz
+rm -f ../nasm-"$version".zip ../nasm-"$version"-xdoc.zip
+
+# Create tarfile (Unix convention: file includes prefix)
+mv nasm nasm-"$version"
+tar cvvf nasm-"$version".tar nasm-"$version"
+xz -9ek nasm-"$version".tar
+bzip2 -9k nasm-"$version".tar
+gzip -9 nasm-"$version".tar
+mv nasm-"$version".tar.gz nasm-"$version".tar.bz2 nasm-"$version".tar.xz ..
+
+# Create zipfile (DOS convention: no prefix, convert file endings)
+cd nasm-"$version"
+# Text files
+zip -9Dlr ../../nasm-"$version".zip * -x \*.jpg -x \*.zip -x \*.ico -x \*.png
+# Binary files
+zip -9Dgr ../../nasm-"$version".zip * -i \*.jpg -i \*.zip -i \*.ico -i \*.png
+cd ..
+
+# Record what we have already generated
+find nasm-"$version" -not -type d -print > main
+
+# Create documentation
+cd nasm-"$version"
+./configure --prefix=/usr/local
+$makej doc
+# Remove intermediate files.
+$makej cleaner
+cd ..
+
+# Remove non-documentation
+cat main | xargs rm -f
+# Delete empty subdirectories
+find nasm-"$version"/doc -type d -exec rmdir '{}' \; 2>/dev/null || true
+
+# Create doc tarfile
+tar cvvf nasm-"$version"-xdoc.tar nasm-"$version"/doc
+xz -9ek nasm-"$version"-xdoc.tar
+bzip2 -9k nasm-"$version"-xdoc.tar
+gzip -9 nasm-"$version"-xdoc.tar
+mv nasm-"$version"-xdoc.tar.gz nasm-"$version"-xdoc.tar.bz2 nasm-"$version"-xdoc.tar.xz ..
+
+# Create doc zipfile (DOS convention: no prefix, convert file endings)
+cd nasm-"$version"
+zip -9Dlr ../../nasm-"$version"-xdoc.zip doc -x \*.pdf -x \*.png
+zip -9Dgr ../../nasm-"$version"-xdoc.zip doc -i \*.pdf -i \*.png
+
+# Clean up
+cd ../..
+rm -rf "$work"
diff --git a/tools/syncfiles.pl b/tools/syncfiles.pl
new file mode 100755
index 00000000..38524a82
--- /dev/null
+++ b/tools/syncfiles.pl
@@ -0,0 +1,137 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Sync the output file list between Makefiles
+# Use the mkdep.pl parameters to get the filename syntax
+#
+# The first file is the source file; the other ones target.
+#
+%def_hints = ('object-ending' => '.o',
+ 'path-separator' => '/',
+ 'continuation' => "\\");
+
+sub do_transform($$) {
+ my($l, $h) = @_;
+ my($ps) = $$h{'path-separator'};
+
+ $l =~ s/\x01/$$h{'object-ending'}/g;
+ $l =~ s/\x03/$$h{'continuation'}/g;
+
+ if ($ps eq '') {
+ # Remove the path separator and the preceeding directory
+ $l =~ s/[^\s\=]*\x02//g;
+ } else {
+ # Convert the path separator
+ $l =~ s/\x02/$ps/g;
+ }
+
+ return $l;
+}
+
+undef %line_lists;
+
+$first = 1;
+$first_file = $ARGV[0];
+die unless (defined($first_file));
+
+foreach $file (@ARGV) {
+ open(FILE, '<', $file) or die;
+
+ # First, read the syntax hints
+ %hints = %def_hints;
+ while (defined($line = <FILE>)) {
+ if ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) {
+ $hints{$1} = $2;
+ }
+ }
+
+ # Read and process the file
+ seek(FILE,0,0);
+ @lines = ();
+ undef $processing;
+ while (defined($line = <FILE>)) {
+ chomp $line;
+ if (defined($processing)) {
+ if ($line =~ /^\#-- End ([^-\#]*[^-#\s]) --\#$/) {
+ if ($1 ne $processing) {
+ die "$0: $file: Mismatched Begin and End lines (\"$processing\" -> \"$1\"\n";
+ }
+ push(@lines, $line."\n");
+ undef $processing;
+ } elsif ($first) {
+ my $xl = $line;
+ my $oe = "\Q$hints{'object-ending'}";
+ my $ps = "\Q$hints{'path-separator'}";
+ my $cn = "\Q$hints{'continuation'}";
+
+ $xl =~ s/${oe}(\s|$)/\x01$1/g;
+ $xl =~ s/${ps}/\x02/g;
+ $xl =~ s/${cn}$/\x03/;
+ push(@{$line_lists{$processing}}, $xl);
+ push(@lines, $line);
+ }
+ } else {
+ push(@lines, $line."\n");
+ if ($line =~ '#-- Begin ([^-\#]*[^-#\s]) --#') {
+ $processing = $1;
+ if ($first) {
+ if (defined($line_lists{$processing})) {
+ die "$0: $file: Repeated Begin block: $processing\n";
+ }
+ $line_lists{$processing} = [];
+ } elsif (!$first) {
+ if (!defined($line_lists{$processing})) {
+ die "$0: $file: Begin block without template\n";
+ }
+ push(@lines, "# Edit in $first_file, not here!\n");
+ foreach $l (@{$line_lists{$processing}}) {
+ push(@lines, do_transform($l, \%hints)."\n");
+ }
+ }
+ }
+ }
+ }
+ close(FILE);
+
+ # Write the file back out
+ if (!$first) {
+ open(FILE, '>', $file) or die;
+ print FILE @lines;
+ close(FILE);
+ }
+
+ undef @lines;
+ $first = 0;
+}
diff --git a/tools/tag-release b/tools/tag-release
new file mode 100755
index 00000000..9e3a0bd0
--- /dev/null
+++ b/tools/tag-release
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+version=""
+repo=""
+branch=""
+push=0
+
+for opt; do
+ case "$opt" in
+ --ver=*)
+ version=`echo $opt | sed 's/[-a-zA-Z0-9]*=//'`
+ ;;
+ --repo=*)
+ repo=`echo $opt | sed 's/[-a-zA-Z0-9]*=//'`
+ ;;
+ --branch=*)
+ branch=`echo $opt | sed 's/[-a-zA-Z0-9]*=//'`
+ ;;
+ --push)
+ push=1
+ ;;
+ --no-push)
+ push=0
+ ;;
+ -*)
+ echo "Invalid option: $opt" 1>&2
+ exit 1
+ ;;
+ *)
+ version=$opt
+ ;;
+ esac
+done
+
+if [ -z "$version" ]; then
+ echo " Usage"
+ echo " $0 --ver=num [--repo=name --branch=name --push]" 1>&2
+ echo " Example"
+ echo " $0 --ver=2.10rc1 --repo=git+ssh://user@repo.or.cz/nasm.git --branch=master --no-push" 1>&2
+ echo " With --no-push the changes are not pushed out to remote repo"
+ exit 1
+fi
+
+tag="nasm-$version"
+
+echo "$version" > version
+git add version
+git commit -m "NASM $version"
+git tag -a -m "NASM $version" "$tag"
+
+if [ $push = 1 ]; then
+ set -x
+ git push $repo $branch
+ git push $repo $tag
+ git push --tags $repo
+ set +x
+fi
+
diff --git a/travis/README.md b/travis/README.md
new file mode 100644
index 00000000..d5aee054
--- /dev/null
+++ b/travis/README.md
@@ -0,0 +1,104 @@
+Testing NASM
+============
+We use [Travis CI](https://travis-ci.org/) service to execute NASM tests,
+which basically prepares the environment and runs our `nasm-t.py` script.
+
+The script scans a testing directory for `*.json` test descriptor files
+and runs test by descriptor content.
+
+Test engine
+-----------
+`nasm-t.py` script is a simple test engine written by Python3 language
+which allows either execute a single test or run them all in a sequence.
+
+A typical test case processed by the following steps:
+
+ - a test descriptor get parsed to figure out which arguments
+ are to be provided into the NASM command line;
+ - invoke the NASM with arguments;
+ - compare generated files with precompiled templates.
+
+`nasm-t.py` supports the following commands:
+
+ - `list`: to list all test cases
+ - `run`: to run test cases
+ - `update`: to update precompiled templates
+
+Use `nasm-t.py -h` command to get the detailed description of every option.
+
+Test descriptor file
+--------------------
+A descriptor file should provide enough information how to run the NASM
+itself and which output files or streams to compare with predefined ones.
+We use `JSON` format with the following fields:
+
+ - `description`: a short description of a test which is shown to
+ a user when tests are listed;
+ - `id`: descriptor internal name to use with `ref` field;
+ - `ref`: a reference to `id` from where settings should be
+ copied, it is convenient when say only `option` is different
+ while the rest of the fields are the same;
+ - `format`: NASM output format to use (`bin`,`elf` and etc);
+ - `source`: is a source file name to compile, this file must
+ be shipped together with descriptor file itself;
+ - `option`: an additional option passed to the command line;
+ - `update`: a trigger to skip updating targets when running
+ an update procedure;
+ - `target`: an array of targets which the test engine should
+ check once compilation finished:
+ - `stderr`: a file containing *stderr* stream output to check;
+ - `stdout`: a file containing *stdout* stream output to check;
+ - `output`: a file containing compiled result to check, in other
+ words it is a name passed as `-o` option to the compiler.
+
+Examples
+--------
+
+A simple test where no additional options are used, simply compile
+`absolute.asm` file with `bin` format for output, then compare
+produced `absolute.bin` file with precompiled `absolute.bin.dest`.
+
+```json
+{
+ "description": "Check absolute addressing",
+ "format": "bin",
+ "source": "absolute.asm",
+ "target": [
+ { "output": "absolute.bin" }
+ ]
+}
+```
+
+A slightly complex example: compile one source file with different optimization
+options and all results must be the same. To not write three descriptors
+we assign `id` to the first one and use `ref` term to copy settings.
+Also, it is expected that `stderr` stream will not be empty but carry some
+warnings to compare.
+
+```json
+[
+ {
+ "description": "Check 64-bit addressing (-Ox)",
+ "id": "addr64x",
+ "format": "bin",
+ "source": "addr64x.asm",
+ "option": "-Ox",
+ "target": [
+ { "output": "addr64x.bin" },
+ { "stderr": "addr64x.stderr" }
+ ]
+ },
+ {
+ "description": "Check 64-bit addressing (-O1)",
+ "ref": "addr64x",
+ "option": "-O1",
+ "update": "false"
+ },
+ {
+ "description": "Check 64-bit addressing (-O0)",
+ "ref": "addr64x",
+ "option": "-O0",
+ "update": "false"
+ }
+]
+```
diff --git a/travis/nasm-t.py b/travis/nasm-t.py
new file mode 100755
index 00000000..b7d85346
--- /dev/null
+++ b/travis/nasm-t.py
@@ -0,0 +1,407 @@
+#!/usr/bin/python3
+
+import subprocess
+import argparse
+import difflib
+import filecmp
+import fnmatch
+import json
+import sys
+import re
+import os
+
+fmtr_class = argparse.ArgumentDefaultsHelpFormatter
+parser = argparse.ArgumentParser(prog = 'nasm-t.py',
+ formatter_class=fmtr_class)
+
+parser.add_argument('-d', '--directory',
+ dest = 'dir', default = './travis/test',
+ help = 'Directory with tests')
+
+parser.add_argument('--nasm',
+ dest = 'nasm', default = './nasm',
+ help = 'Nasm executable to use')
+
+parser.add_argument('--hexdump',
+ dest = 'hexdump', default = '/usr/bin/hexdump',
+ help = 'Hexdump executable to use')
+
+sp = parser.add_subparsers(dest = 'cmd')
+for cmd in ['run']:
+ spp = sp.add_parser(cmd, help = 'Run test cases')
+ spp.add_argument('-t', '--test',
+ dest = 'test',
+ help = 'Run the selected test only',
+ required = False)
+
+for cmd in ['list']:
+ spp = sp.add_parser(cmd, help = 'List test cases')
+
+for cmd in ['update']:
+ spp = sp.add_parser(cmd, help = 'Update test cases with new compiler')
+ spp.add_argument('-t', '--test',
+ dest = 'test',
+ help = 'Update the selected test only',
+ required = False)
+
+args = parser.parse_args()
+
+if args.cmd == None:
+ parser.print_help()
+ sys.exit(1)
+
+def read_stdfile(path):
+ with open(path, "rb") as f:
+ data = f.read().decode("utf-8").strip("\n")
+ f.close()
+ return data
+
+#
+# Check if descriptor has mandatory fields
+def is_valid_desc(desc):
+ if desc == None:
+ return False
+ if 'description' not in desc:
+ return false
+ return True
+
+#
+# Expand ref/id in descriptors array
+def expand_templates(desc_array):
+ desc_ids = { }
+ for d in desc_array:
+ if 'id' in d:
+ desc_ids[d['id']] = d
+ for i, d in enumerate(desc_array):
+ if 'ref' in d and d['ref'] in desc_ids:
+ ref = desc_ids[d['ref']]
+ own = d.copy()
+ desc_array[i] = ref.copy()
+ for k, v in own.items():
+ desc_array[i][k] = v
+ del desc_array[i]['id']
+ return desc_array
+
+def prepare_desc(desc, basedir, name, path):
+ if not is_valid_desc(desc):
+ return False
+ #
+ # Put private fields
+ desc['_base-dir'] = basedir
+ desc['_json-file'] = name
+ desc['_json-path'] = path
+ desc['_test-name'] = basedir + os.sep + name[:-5]
+ #
+ # If no target provided never update
+ if 'target' not in desc:
+ desc['target'] = []
+ desc['update'] = 'false'
+ #
+ # Which code to expect when nasm finishes
+ desc['_wait'] = 0
+ if 'error' in desc:
+ if desc['error'] == 'expected':
+ desc['_wait'] = 1
+ #
+ # Walk over targets and generate match templates
+ # if were not provided yet
+ for d in desc['target']:
+ if 'output' in d and not 'match' in d:
+ d['match'] = d['output'] + ".t"
+ return True
+
+def read_json(path):
+ desc = None
+ try:
+ with open(path, "rb") as f:
+ try:
+ desc = json.loads(f.read().decode("utf-8").strip("\n"))
+ except:
+ desc = None
+ finally:
+ f.close()
+ except:
+ pass
+ return desc
+
+def read_desc(basedir, name):
+ path = basedir + os.sep + name
+ desc = read_json(path)
+ desc_array = []
+ if type(desc) == dict:
+ if prepare_desc(desc, basedir, name, path) == True:
+ desc_array += [desc]
+ elif type(desc) == list:
+ expand_templates(desc)
+ for de in desc:
+ if prepare_desc(de, basedir, name, path) == True:
+ desc_array += [de]
+ return desc_array
+
+def collect_test_desc_from_file(path):
+ if not fnmatch.fnmatch(path, '*.json'):
+ path += '.json'
+ basedir = os.path.dirname(path)
+ filename = os.path.basename(path)
+ return read_desc(basedir, filename)
+
+def collect_test_desc_from_dir(basedir):
+ desc_array = []
+ if os.path.isdir(basedir):
+ for filename in os.listdir(basedir):
+ if os.path.isdir(basedir + os.sep + filename):
+ desc_array += collect_test_desc_from_dir(basedir + os.sep + filename)
+ elif fnmatch.fnmatch(filename, '*.json'):
+ desc = read_desc(basedir, filename)
+ if desc == None:
+ continue
+ desc_array += desc
+ return desc_array
+
+if args.cmd == 'list':
+ fmt_entry = '%-32s %s'
+ desc_array = collect_test_desc_from_dir(args.dir)
+ print(fmt_entry % ('Name', 'Description'))
+ for desc in desc_array:
+ print(fmt_entry % (desc['_test-name'], desc['description']))
+
+def test_abort(test, message):
+ print("\t%s: %s" % (test, message))
+ print("=== Test %s ABORT ===" % (test))
+ sys.exit(1)
+ return False
+
+def test_fail(test, message):
+ print("\t%s: %s" % (test, message))
+ print("=== Test %s FAIL ===" % (test))
+ return False
+
+def test_skip(test, message):
+ print("\t%s: %s" % (test, message))
+ print("=== Test %s SKIP ===" % (test))
+ return True
+
+def test_over(test):
+ print("=== Test %s ERROR OVER ===" % (test))
+ return True
+
+def test_pass(test):
+ print("=== Test %s PASS ===" % (test))
+ return True
+
+def test_updated(test):
+ print("=== Test %s UPDATED ===" % (test))
+ return True
+
+def run_hexdump(path):
+ p = subprocess.Popen([args.hexdump, "-C", path],
+ stdout = subprocess.PIPE,
+ close_fds = True)
+ if p.wait() == 0:
+ return p
+ return None
+
+def show_std(stdname, data):
+ print("\t--- %s" % (stdname))
+ for i in data.split("\n"):
+ print("\t%s" % i)
+ print("\t---")
+
+def cmp_std(test, data_name, data, match):
+ match_data = read_stdfile(match)
+ if match_data == None:
+ return test_fail(test, "Can't read " + match)
+ if data != match_data:
+ print("\t--- %s" % (data_name))
+ for i in data.split("\n"):
+ print("\t%s" % i)
+ print("\t--- %s" % (match))
+ for i in match_data.split("\n"):
+ print("\t%s" % i)
+
+ diff = difflib.unified_diff(data.split("\n"), match_data.split("\n"),
+ fromfile = data_name, tofile = match)
+ for i in diff:
+ print("\t%s" % i.strip("\n"))
+ print("\t---")
+ return False
+ return True
+
+def show_diff(test, patha, pathb):
+ pa = run_hexdump(patha)
+ pb = run_hexdump(pathb)
+ if pa == None or pb == None:
+ return test_fail(test, "Can't create dumps")
+ sa = pa.stdout.read().decode("utf-8").strip("\n")
+ sb = pb.stdout.read().decode("utf-8").strip("\n")
+ print("\t--- hexdump %s" % (patha))
+ for i in sa.split("\n"):
+ print("\t%s" % i)
+ print("\t--- hexdump %s" % (pathb))
+ for i in sb.split("\n"):
+ print("\t%s" % i)
+ pa.stdout.close()
+ pb.stdout.close()
+
+ diff = difflib.unified_diff(sa.split("\n"), sb.split("\n"),
+ fromfile = patha, tofile = pathb)
+ for i in diff:
+ print("\t%s" % i.strip("\n"))
+ print("\t---")
+ return True
+
+def prepare_run_opts(desc):
+ opts = []
+
+ if 'format' in desc:
+ opts += ['-f', desc['format']]
+ if 'option' in desc:
+ opts += desc['option'].split(" ")
+ for t in desc['target']:
+ if 'output' in t:
+ if 'option' in t:
+ opts += t['option'].split(" ") + [desc['_base-dir'] + os.sep + t['output']]
+ else:
+ opts += ['-o', desc['_base-dir'] + os.sep + t['output']]
+ if 'stdout' in t or 'stderr' in t:
+ if 'option' in t:
+ opts += t['option'].split(" ")
+ if 'source' in desc:
+ opts += [desc['_base-dir'] + os.sep + desc['source']]
+ return opts
+
+def exec_nasm(desc):
+ print("\tProcessing %s" % (desc['_test-name']))
+ opts = [args.nasm] + prepare_run_opts(desc)
+
+ print("\tExecuting %s" % (" ".join(opts)))
+ pnasm = subprocess.Popen(opts,
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE,
+ close_fds = True)
+ if pnasm == None:
+ test_fail(desc['_test-name'], "Unable to execute test")
+ return None
+ wait_rc = pnasm.wait();
+
+ stdout = pnasm.stdout.read().decode("utf-8").strip("\n")
+ stderr = pnasm.stderr.read().decode("utf-8").strip("\n")
+ pnasm.stdout.close()
+ pnasm.stderr.close()
+
+ if desc['_wait'] != wait_rc:
+ if stdout != "":
+ show_std("stdout", stdout)
+ if stderr != "":
+ show_std("stderr", stderr)
+ test_fail(desc['_test-name'],
+ "Unexpected ret code: " + str(wait_rc))
+ return None, None, None
+ return pnasm, stdout, stderr
+
+def test_run(desc):
+ print("=== Running %s ===" % (desc['_test-name']))
+
+ pnasm, stdout, stderr = exec_nasm(desc)
+ if pnasm == None:
+ return False
+
+ for t in desc['target']:
+ if 'output' in t:
+ output = desc['_base-dir'] + os.sep + t['output']
+ match = desc['_base-dir'] + os.sep + t['match']
+ if desc['_wait'] == 1:
+ continue
+ print("\tComparing %s %s" % (output, match))
+ if filecmp.cmp(match, output) == False:
+ show_diff(desc['_test-name'], match, output)
+ return test_fail(desc['_test-name'], match + " and " + output + " files are different")
+ elif 'stdout' in t:
+ print("\tComparing stdout")
+ match = desc['_base-dir'] + os.sep + t['stdout']
+ if cmp_std(desc['_test-name'], 'stdout', stdout, match) == False:
+ return test_fail(desc['_test-name'], "Stdout mismatch")
+ else:
+ stdout = ""
+ elif 'stderr' in t:
+ print("\tComparing stderr")
+ match = desc['_base-dir'] + os.sep + t['stderr']
+ if cmp_std(desc['_test-name'], 'stderr', stderr, match) == False:
+ return test_fail(desc['_test-name'], "Stderr mismatch")
+ else:
+ stderr = ""
+
+ if stdout != "":
+ show_std("stdout", stdout)
+ return test_fail(desc['_test-name'], "Stdout is not empty")
+
+ if stderr != "":
+ show_std("stderr", stderr)
+ return test_fail(desc['_test-name'], "Stderr is not empty")
+
+ return test_pass(desc['_test-name'])
+
+#
+# Compile sources and generate new targets
+def test_update(desc):
+ print("=== Updating %s ===" % (desc['_test-name']))
+
+ if 'update' in desc and desc['update'] == 'false':
+ return test_skip(desc['_test-name'], "No output provided")
+
+ pnasm, stdout, stderr = exec_nasm(desc)
+ if pnasm == None:
+ return False
+
+ for t in desc['target']:
+ if 'output' in t:
+ output = desc['_base-dir'] + os.sep + t['output']
+ match = desc['_base-dir'] + os.sep + t['match']
+ print("\tMoving %s to %s" % (output, match))
+ os.rename(output, match)
+ if 'stdout' in t:
+ match = desc['_base-dir'] + os.sep + t['stdout']
+ print("\tMoving %s to %s" % ('stdout', match))
+ with open(match, "wb") as f:
+ f.write(stdout)
+ f.close()
+ if 'stderr' in t:
+ match = desc['_base-dir'] + os.sep + t['stderr']
+ print("\tMoving %s to %s" % ('stderr', match))
+ with open(match, "wb") as f:
+ f.write(stderr)
+ f.close()
+
+ return test_updated(desc['_test-name'])
+
+if args.cmd == 'run':
+ desc_array = []
+ if args.test == None:
+ desc_array = collect_test_desc_from_dir(args.dir)
+ else:
+ desc_array = collect_test_desc_from_file(args.test)
+ if len(desc_array) == 0:
+ test_abort(args.test, "Can't obtain test descriptors")
+
+ for desc in desc_array:
+ if test_run(desc) == False:
+ if 'error' in desc and desc['error'] == 'over':
+ test_over(desc['_test-name'])
+ else:
+ test_abort(desc['_test-name'], "Error detected")
+
+if args.cmd == 'update':
+ desc_array = []
+ if args.test == None:
+ desc_array = collect_test_desc_from_dir(args.dir)
+ else:
+ desc_array = collect_test_desc_from_file(args.test)
+ if len(desc_array) == 0:
+ test_abort(args.test, "Can't obtain a test descriptors")
+
+ for desc in desc_array:
+ if test_update(desc) == False:
+ if 'error' in desc and desc['error'] == 'over':
+ test_over(desc['_test-name'])
+ else:
+ test_abort(desc['_test-name'], "Error detected")
diff --git a/travis/test/_file_.asm b/travis/test/_file_.asm
new file mode 100644
index 00000000..e349e2c3
--- /dev/null
+++ b/travis/test/_file_.asm
@@ -0,0 +1,4 @@
+ db __FILE__, `\r\n`
+ db __FILE__, `\r\n`
+ dw __LINE__
+ dw __LINE__
diff --git a/travis/test/_file_.bin.t b/travis/test/_file_.bin.t
new file mode 100644
index 00000000..2ba4aa2d
--- /dev/null
+++ b/travis/test/_file_.bin.t
Binary files differ
diff --git a/travis/test/_file_.json b/travis/test/_file_.json
new file mode 100644
index 00000000..cf168220
--- /dev/null
+++ b/travis/test/_file_.json
@@ -0,0 +1,8 @@
+{
+ "description": "Check the __FILE__ preprocessor directive",
+ "format": "bin",
+ "source": "_file_.asm",
+ "target": [
+ { "output": "_file_.bin" }
+ ]
+}
diff --git a/travis/test/_version.json b/travis/test/_version.json
new file mode 100644
index 00000000..f84a8c8a
--- /dev/null
+++ b/travis/test/_version.json
@@ -0,0 +1,7 @@
+{
+ "description": "Check the NASM version",
+ "target": [
+ { "option": "-v", "stdout": "_version.stdout" }
+ ],
+ "error": "over"
+}
diff --git a/travis/test/_version.stdout b/travis/test/_version.stdout
new file mode 100644
index 00000000..935c7d04
--- /dev/null
+++ b/travis/test/_version.stdout
@@ -0,0 +1 @@
+NASM version 2.14rc0 compiled on Apr 25 2018
diff --git a/travis/test/a32offs.asm b/travis/test/a32offs.asm
new file mode 100644
index 00000000..82df66c6
--- /dev/null
+++ b/travis/test/a32offs.asm
@@ -0,0 +1,7 @@
+ bits 16
+foo: a32 loop foo
+bar: loop bar, ecx
+
+ bits 32
+baz: a16 loop baz
+qux: loop qux, cx
diff --git a/travis/test/a32offs.bin.t b/travis/test/a32offs.bin.t
new file mode 100644
index 00000000..44d38d29
--- /dev/null
+++ b/travis/test/a32offs.bin.t
@@ -0,0 +1 @@
+gâýgâýgâýgâý \ No newline at end of file
diff --git a/travis/test/a32offs.json b/travis/test/a32offs.json
new file mode 100644
index 00000000..cb8ac1f7
--- /dev/null
+++ b/travis/test/a32offs.json
@@ -0,0 +1,18 @@
+[
+ {
+ "description": "Check a16/a32 address prefix (-Ox)",
+ "id": "a32offs",
+ "format": "bin",
+ "source": "a32offs.asm",
+ "option": "-Ox",
+ "target": [
+ { "output": "a32offs.bin" }
+ ]
+ },
+ {
+ "description": "Check a16/a32 address prefix (-O0)",
+ "ref": "a32offs",
+ "option": "-O0",
+ "update": false
+ }
+]
diff --git a/travis/test/absolute.asm b/travis/test/absolute.asm
new file mode 100644
index 00000000..38532ec9
--- /dev/null
+++ b/travis/test/absolute.asm
@@ -0,0 +1,38 @@
+ org 7c00h
+init_foo:
+ jmp init_bar
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+
+init_bar:
+ mov [b1],dl
+ mov [b2],edx
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ ret
+
+ absolute init_bar+7
+b1: resb 1
+b2: resd 6
diff --git a/travis/test/absolute.bin.t b/travis/test/absolute.bin.t
new file mode 100644
index 00000000..b132e69c
--- /dev/null
+++ b/travis/test/absolute.bin.t
@@ -0,0 +1 @@
+ë ˆ|f‰|Ã \ No newline at end of file
diff --git a/travis/test/absolute.json b/travis/test/absolute.json
new file mode 100644
index 00000000..6a6a9468
--- /dev/null
+++ b/travis/test/absolute.json
@@ -0,0 +1,8 @@
+{
+ "description": "Check absolute addressing",
+ "format": "bin",
+ "source": "absolute.asm",
+ "target": [
+ { "output": "absolute.bin" }
+ ]
+}
diff --git a/travis/test/addr64x.asm b/travis/test/addr64x.asm
new file mode 100644
index 00000000..1fbec453
--- /dev/null
+++ b/travis/test/addr64x.asm
@@ -0,0 +1,15 @@
+ bits 64
+ mov rdx,[rax]
+ mov eax,[byte rsp+0x01]
+ mov eax,[byte rsp-0x01]
+ mov eax,[byte rsp+0xFF]
+ mov eax,[byte rsp-0xFF]
+ mov eax,[rsp+0x08]
+ mov eax,[rsp-0x01]
+ mov eax,[rsp+0xFF]
+ mov eax,[rsp-0xFF]
+ mov rax,[rsp+56]
+ mov [rsi],dl
+ mov byte [rsi],'-'
+ mov [rsi],al
+ mov byte [rsi],' '
diff --git a/travis/test/addr64x.bin.t b/travis/test/addr64x.bin.t
new file mode 100644
index 00000000..b9166a2d
--- /dev/null
+++ b/travis/test/addr64x.bin.t
Binary files differ
diff --git a/travis/test/addr64x.json b/travis/test/addr64x.json
new file mode 100644
index 00000000..e642ce66
--- /dev/null
+++ b/travis/test/addr64x.json
@@ -0,0 +1,25 @@
+[
+ {
+ "description": "Check 64-bit addressing (-Ox)",
+ "id": "addr64x",
+ "format": "bin",
+ "source": "addr64x.asm",
+ "option": "-Ox",
+ "target": [
+ { "output": "addr64x.bin" },
+ { "stderr": "addr64x.stderr" }
+ ]
+ },
+ {
+ "description": "Check 64-bit addressing (-O1)",
+ "ref": "addr64x",
+ "option": "-O1",
+ "update": "false"
+ },
+ {
+ "description": "Check 64-bit addressing (-O0)",
+ "ref": "addr64x",
+ "option": "-O0",
+ "update": "false"
+ }
+]
diff --git a/travis/test/addr64x.stderr b/travis/test/addr64x.stderr
new file mode 100644
index 00000000..5d1b3184
--- /dev/null
+++ b/travis/test/addr64x.stderr
@@ -0,0 +1,4 @@
+./travis/test/addr64x.asm:5: warning: byte data exceeds bounds [-w+number-overflow]
+./travis/test/addr64x.asm:5: warning: byte data exceeds bounds [-w+number-overflow]
+./travis/test/addr64x.asm:6: warning: byte data exceeds bounds [-w+number-overflow]
+./travis/test/addr64x.asm:6: warning: byte data exceeds bounds [-w+number-overflow]
diff --git a/travis/test/align13.asm b/travis/test/align13.asm
new file mode 100644
index 00000000..556373fc
--- /dev/null
+++ b/travis/test/align13.asm
@@ -0,0 +1,16 @@
+; Test of non-power-of-2 alignment
+
+ bits 32
+
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ inc eax
+ inc eax
+ align 13
+ align 13 ;should do nothing
+ inc eax
+ inc eax
diff --git a/travis/test/align13.json b/travis/test/align13.json
new file mode 100644
index 00000000..7375023a
--- /dev/null
+++ b/travis/test/align13.json
@@ -0,0 +1,25 @@
+[
+ {
+ "description": "Test of non-power-of-2 alignment (-Ox)",
+ "id": "align13",
+ "format": "bin",
+ "source": "align13.asm",
+ "option": "-Ox -o align13.bin",
+ "target": [
+ { "stderr": "align13.stderr" }
+ ],
+ "error": "expected"
+ },
+ {
+ "description": "Test of non-power-of-2 alignment (-O1)",
+ "ref": "align13",
+ "option": "-O1 -o align13.bin",
+ "update": "false"
+ },
+ {
+ "description": "Test of non-power-of-2 alignment (-O0)",
+ "ref": "align13",
+ "option": "-O0 -o align13.bin",
+ "update": "false"
+ }
+]
diff --git a/travis/test/align13.stderr b/travis/test/align13.stderr
new file mode 100644
index 00000000..31d6e310
--- /dev/null
+++ b/travis/test/align13.stderr
@@ -0,0 +1,4 @@
+./travis/test/align13.asm:7: error: segment alignment `13' is not power of two
+./travis/test/align13.asm:10: error: segment alignment `13' is not power of two
+./travis/test/align13.asm:13: error: segment alignment `13' is not power of two
+./travis/test/align13.asm:14: error: segment alignment `13' is not power of two
diff --git a/travis/test/alonesym-obj.asm b/travis/test/alonesym-obj.asm
new file mode 100644
index 00000000..6be4d5db
--- /dev/null
+++ b/travis/test/alonesym-obj.asm
@@ -0,0 +1,163 @@
+section DOS32DATA align=16 public use32 FLAT class=DOS32DATA
+
+ global sym0000
+ global sym0001
+ global sym0002
+ global sym0003
+ global sym0004
+ global sym0005
+ global sym0006
+ global sym0007
+ global sym0008
+ global sym0009
+ global sym0010
+ global sym0011
+ global sym0012
+ global sym0013
+ global sym0014
+ global sym0015
+ global sym0016
+ global sym0017
+ global sym0018
+ global sym0019
+ global sym0020
+ global sym0021
+ global sym0022
+ global sym0023
+ global sym0024
+ global sym0025
+ global sym0026
+ global sym0027
+ global sym0028
+ global sym0029
+ global sym0030
+ global sym0031
+ global sym0032
+ global sym0033
+ global sym0034
+ global sym0035
+ global sym0036
+ global sym0037
+ global sym0038
+ global sym0039
+ global sym0040
+ global sym0041
+ global sym0042
+ global sym0043
+ global sym0044
+ global sym0045
+ global sym0046
+ global sym0047
+ global sym0048
+ global sym0049
+ global sym0050
+ global sym0051
+ global sym0052
+ global sym0053
+ global sym0054
+ global sym0055
+ global sym0056
+ global sym0057
+ global sym0058
+ global sym0059
+ global sym0060
+ global sym0061
+ global sym0062
+ global sym0063
+ global sym0064
+ global sym0065
+ global sym0066
+ global sym0067
+ global sym0068
+ global sym0069
+ global sym0070
+ global sym0071
+ global sym0072
+ global sym0073
+ global sym0074
+ global sym0075
+ global sym0076
+ global sym0077
+ global s
+
+
+ resb 20000h
+sym0000 resd 1
+sym0001 resd 1
+sym0002 resd 1
+sym0003 resd 1
+sym0004 resd 1
+sym0005 resd 1
+sym0006 resd 1
+sym0007 resd 1
+sym0008 resd 1
+sym0009 resd 1
+sym0010 resd 1
+sym0011 resd 1
+sym0012 resd 1
+sym0013 resd 1
+sym0014 resd 1
+sym0015 resd 1
+sym0016 resd 1
+sym0017 resd 1
+sym0018 resd 1
+sym0019 resd 1
+sym0020 resd 1
+sym0021 resd 1
+sym0022 resd 1
+sym0023 resd 1
+sym0024 resd 1
+sym0025 resd 1
+sym0026 resd 1
+sym0027 resd 1
+sym0028 resd 1
+sym0029 resd 1
+sym0030 resd 1
+sym0031 resd 1
+sym0032 resd 1
+sym0033 resd 1
+sym0034 resd 1
+sym0035 resd 1
+sym0036 resd 1
+sym0037 resd 1
+sym0038 resd 1
+sym0039 resd 1
+sym0040 resd 1
+sym0041 resd 1
+sym0042 resd 1
+sym0043 resd 1
+sym0044 resd 1
+sym0045 resd 1
+sym0046 resd 1
+sym0047 resd 1
+sym0048 resd 1
+sym0049 resd 1
+sym0050 resd 1
+sym0051 resd 1
+sym0052 resd 1
+sym0053 resd 1
+sym0054 resd 1
+sym0055 resd 1
+sym0056 resd 1
+sym0057 resd 1
+sym0058 resd 1
+sym0059 resd 1
+sym0060 resd 1
+sym0061 resd 1
+sym0062 resd 1
+sym0063 resd 1
+sym0064 resd 1
+sym0065 resd 1
+sym0066 resd 1
+sym0067 resd 1
+sym0068 resd 1
+sym0069 resd 1
+sym0070 resd 1
+sym0071 resd 1
+sym0072 resd 1
+sym0073 resd 1
+sym0074 resd 1
+sym0075 resd 1
+sym0076 resd 1
+sym0077 resd 1
+s resd 1
diff --git a/travis/test/alonesym-obj.json b/travis/test/alonesym-obj.json
new file mode 100644
index 00000000..cdb2ea21
--- /dev/null
+++ b/travis/test/alonesym-obj.json
@@ -0,0 +1,18 @@
+[
+ {
+ "description": "Check global symbols in OBJ output (-Ox)",
+ "id": "alonesym-obj",
+ "format": "obj",
+ "source": "alonesym-obj.asm",
+ "option": "-Ox",
+ "target": [
+ { "output": "alonesym-obj.obj" }
+ ]
+ },
+ {
+ "description": "Check global symbols in OBJ output (-O0)",
+ "ref": "alonesym-obj",
+ "option": "-O0",
+ "update": false
+ }
+]
diff --git a/travis/test/alonesym-obj.obj.t b/travis/test/alonesym-obj.obj.t
new file mode 100644
index 00000000..480d5992
--- /dev/null
+++ b/travis/test/alonesym-obj.obj.t
Binary files differ
diff --git a/travis/test/tmap.asm b/travis/test/tmap.asm
new file mode 100644
index 00000000..a634e1b0
--- /dev/null
+++ b/travis/test/tmap.asm
@@ -0,0 +1,1448 @@
+;; NASM note: this file abuses the section flags in such a way that
+;; NASM 0.98.37 broke when this was compiled with:
+;; nasm -o tmap.o -f elf -DLINUX tmap.nas
+
+;;-----------------------------------------------------------------------------
+;;
+;; $Id$
+;;
+;; Copyright (C) 1998-2000 by DooM Legacy Team.
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation; either version 2
+;; of the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;;
+;; $Log$
+;; Revision 1.2 2003/09/10 23:33:38 hpa
+;; Use the version of tmap.nas that actually caused problems
+;;
+;; Revision 1.10 2001/02/24 13:35:21 bpereira
+;; no message
+;;
+;; Revision 1.9 2001/02/10 15:24:19 hurdler
+;; Apply Rob's patch for Linux version
+;;
+;; Revision 1.8 2000/11/12 09:48:15 bpereira
+;; no message
+;;
+;; Revision 1.7 2000/11/06 20:52:16 bpereira
+;; no message
+;;
+;; Revision 1.6 2000/11/03 11:48:40 hurdler
+;; Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!)
+;;
+;; Revision 1.5 2000/11/03 03:27:17 stroggonmeth
+;; Again with the bug fixing...
+;;
+;; Revision 1.4 2000/11/02 17:50:10 stroggonmeth
+;; Big 3Dfloors & FraggleScript commit!!
+;;
+;; Revision 1.3 2000/04/24 20:24:38 bpereira
+;; no message
+;;
+;; Revision 1.2 2000/02/27 00:42:11 hurdler
+;; fix CR+LF problem
+;;
+;; Revision 1.1.1.1 2000/02/22 20:32:32 hurdler
+;; Initial import into CVS (v1.29 pr3)
+;;
+;;
+;; DESCRIPTION:
+;; assembler optimised rendering code for software mode
+;; draw floor spans, and wall columns.
+;;
+;;-----------------------------------------------------------------------------
+
+
+[BITS 32]
+
+%ifdef LINUX
+%macro cextern 1
+[extern %1]
+%endmacro
+
+%macro cglobal 1
+[global %1]
+%endmacro
+
+%define CODE_SEG .data
+%else
+%macro cextern 1
+%define %1 _%1
+[extern %1]
+%endmacro
+
+%macro cglobal 1
+%define %1 _%1
+[global %1]
+%endmacro
+
+%define CODE_SEG .text
+%endif
+
+
+;; externs
+;; columns
+cextern dc_x
+cextern dc_yl
+cextern dc_yh
+cextern ylookup
+cextern columnofs
+cextern dc_source
+cextern dc_texturemid
+cextern dc_iscale
+cextern centery
+cextern dc_colormap
+cextern dc_transmap
+cextern colormaps
+
+;; spans
+cextern ds_x1
+cextern ds_x2
+cextern ds_y
+cextern ds_xfrac
+cextern ds_yfrac
+cextern ds_xstep
+cextern ds_ystep
+cextern ds_source
+cextern ds_colormap
+;cextern ds_textureheight
+
+; polygon edge rasterizer
+cextern prastertab
+
+
+;;----------------------------------------------------------------------
+;;
+;; R_DrawColumn
+;;
+;; New optimised version 10-01-1998 by D.Fabrice and P.Boris
+;; TO DO: optimise it much farther... should take at most 3 cycles/pix
+;; once it's fixed, add code to patch the offsets so that it
+;; works in every screen width.
+;;
+;;----------------------------------------------------------------------
+
+[SECTION .data]
+
+;;.align 4
+loopcount dd 0
+pixelcount dd 0
+tystep dd 0
+
+[SECTION CODE_SEG write]
+
+;----------------------------------------------------------------------------
+;fixed_t FixedMul (fixed_t a, fixed_t b)
+;----------------------------------------------------------------------------
+cglobal FixedMul
+; align 16
+FixedMul:
+ mov eax,[esp+4]
+ imul dword [esp+8]
+ shrd eax,edx,16
+ ret
+
+;----------------------------------------------------------------------------
+;fixed_t FixedDiv2 (fixed_t a, fixed_t b);
+;----------------------------------------------------------------------------
+cglobal FixedDiv2
+; align 16
+FixedDiv2:
+ mov eax,[esp+4]
+ mov edx,eax ;; these two instructions allow the next
+ sar edx,31 ;; two to pair, on the Pentium processor.
+ shld edx,eax,16
+ sal eax,16
+ idiv dword [esp+8]
+ ret
+
+;----------------------------------------------------------------------------
+; void ASM_PatchRowBytes (int rowbytes);
+;----------------------------------------------------------------------------
+cglobal ASM_PatchRowBytes
+; align 16
+ASM_PatchRowBytes:
+ mov eax,[esp+4]
+ mov [p1+2],eax
+ mov [p2+2],eax
+ mov [p3+2],eax
+ mov [p4+2],eax
+ mov [p5+2],eax
+ mov [p6+2],eax
+ mov [p7+2],eax
+ mov [p8+2],eax
+ mov [p9+2],eax
+ mov [pa+2],eax
+ mov [pb+2],eax
+ mov [pc+2],eax
+ mov [pd+2],eax
+ mov [pe+2],eax
+ mov [pf+2],eax
+ mov [pg+2],eax
+ mov [ph+2],eax
+ mov [pi+2],eax
+ mov [pj+2],eax
+ mov [pk+2],eax
+ mov [pl+2],eax
+ mov [pm+2],eax
+ mov [pn+2],eax
+ mov [po+2],eax
+ mov [pp+2],eax
+ mov [pq+2],eax
+ add eax,eax
+ mov [q1+2],eax
+ mov [q2+2],eax
+ mov [q3+2],eax
+ mov [q4+2],eax
+ mov [q5+2],eax
+ mov [q6+2],eax
+ mov [q7+2],eax
+ mov [q8+2],eax
+ ret
+
+
+;----------------------------------------------------------------------------
+; 8bpp column drawer
+;----------------------------------------------------------------------------
+
+cglobal R_DrawColumn_8
+; align 16
+R_DrawColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,2
+ mov ch,al ;; quad count
+ mov eax,[dc_colormap]
+ test dh,0x3
+ je near v4quadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je two_uneven
+
+ mov al,[esi+ebx] ;; prep un-even loops
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ and bl,0x7f ;; mask 0-127 texture index
+ mov [edi],dl ;; output pixel
+p1: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+two_uneven:
+ test dh,0x2
+ je f3
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ and bl,0x7f ;; mask 0-127 texture index
+ mov [edi],dl ;; output pixel
+ mov al,[esi+ebx]
+ add edx,ebp ;; fetch source texel
+ adc bl,cl ;; ypos f += ystep f
+ mov dl,[eax] ;; ypos i += ystep i
+ and bl,0x7f ;; colormap texel
+p2: add edi,0x12345678 ;; mask 0-127 texture index
+ mov [edi],dl
+p3: add edi,0x12345678 ;; output pixel
+;;
+;; test if there was at least 4 pixels
+;;
+f3:
+ test ch,0xff ;; test quad count
+ je near vdone
+;;
+;; ebp : ystep frac. upper 16 bits
+;; edx : y frac. upper 16 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+v4quadloop:
+ mov dh,0x7f ;; prep mask
+align 4
+vquadloop:
+ mov al,[esi+ebx] ;; prep loop
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+ and bl,0x7f ;; mask 0-127 texture index
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p4: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p5: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+p6: add edi,0x12345678
+ mov dl,[eax]
+ and bl,0x7f
+ mov [edi],dl
+
+p7: add edi,0x12345678
+
+ dec ch
+ jne vquadloop
+
+vdone:
+ pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+;;----------------------------------------------------------------------
+;;13-02-98:
+;; R_DrawSkyColumn : same as R_DrawColumn but:
+;;
+;; - wrap around 256 instead of 127.
+;; this is needed because we have a higher texture for mouselook,
+;; we need at least 200 lines for the sky.
+;;
+;; NOTE: the sky should never wrap, so it could use a faster method.
+;; for the moment, we'll still use a wrapping method...
+;;
+;; IT S JUST A QUICK CUT N PASTE, WAS NOT OPTIMISED AS IT SHOULD BE !!!
+;;
+;;----------------------------------------------------------------------
+
+cglobal R_DrawSkyColumn_8
+; align 16
+R_DrawSkyColumn_8:
+ push ebp
+ push esi
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vskydone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,0xff
+ shl edx,16 ;; y frac up
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,0x2
+ mov ch,al ;; quad count
+ mov eax,[dc_colormap]
+ test dh,0x3
+ je vskyquadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je f2
+ mov al,[esi+ebx] ;; prep un-even loops
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+p8: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+f2: test dh,0x2
+ je skyf3
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+ mov [edi],dl ;; output pixel
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp ;; ypos f += ystep f
+ adc bl,cl ;; ypos i += ystep i
+ mov dl,[eax] ;; colormap texel
+p9: add edi,0x12345678
+ mov [edi],dl ;; output pixel
+
+pa: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+skyf3: test ch,0xff ;; test quad count
+ je vskydone
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+align 4
+vskyquadloop:
+ mov al,[esi+ebx] ;; prep loop
+ add edx,ebp ;; ypos f += ystep f
+ mov dl,[eax] ;; colormap texel
+ adc bl,cl ;; ypos i += ystep i
+ mov [edi],dl ;; output pixel
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pb: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pc: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+ mov al,[esi+ebx] ;; fetch source texel
+ add edx,ebp
+ adc bl,cl
+pd: add edi,0x12345678
+ mov dl,[eax]
+ mov [edi],dl
+
+pe: add edi,0x12345678
+
+ dec ch
+ jne vskyquadloop
+vskydone:
+ pop ebx
+ pop edi
+ pop esi
+ pop ebp
+ ret
+
+
+;;----------------------------------------------------------------------
+;; R_DrawTranslucentColumn_8
+;;
+;; Vertical column texture drawer, with transparency. Replaces Doom2's
+;; 'fuzz' effect, which was not so beautiful.
+;; Transparency is always impressive in some way, don't know why...
+;;----------------------------------------------------------------------
+
+cglobal R_DrawTranslucentColumn_8
+R_DrawTranslucentColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near vtdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+
+ shr ebx,16 ;; frac int.
+ and ebx,0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+ push cx
+ mov ecx,edx
+ pop cx
+ mov edx,[dc_colormap]
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ shr eax,0x2
+ test byte [pixelcount],0x3
+ mov ch,al ;; quad count
+ mov eax,[dc_transmap]
+ je vt4quadloop
+;;
+;; do un-even pixel
+;;
+ test byte [pixelcount],0x1
+ je trf2
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+pf: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+trf2: test byte [pixelcount],0x2
+ je trf3
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+pg: add edi,0x12345678
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add ecx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov dl,[edx]
+ mov [edi],dl
+ph: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+trf3: test ch,0xff ;; test quad count
+ je near vtdone
+
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+vt4quadloop:
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [tystep],ebp
+pi: add edi,0x12345678
+ mov al,[edi] ;; fetch dest : index into colormap
+pj: sub edi,0x12345678
+ mov ebp,edi
+pk: sub edi,0x12345678
+ jmp short inloop
+align 4
+vtquadloop:
+ add ecx,[tystep]
+ adc bl,cl
+q1: add ebp,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+inloop:
+ add ecx,[tystep]
+ adc bl,cl
+q2: add edi,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [ebp+0x0],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ add ecx,[tystep]
+ adc bl,cl
+q3: add ebp,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+
+ add ecx,[tystep]
+ adc bl,cl
+q4: add edi,0x23456789
+ and bl,0x7f
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov dl,[edx]
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ dec ch
+ jne vtquadloop
+vtdone:
+ pop ebx
+ pop edi
+ pop esi
+ pop ebp
+ ret
+
+
+;;----------------------------------------------------------------------
+;; R_DrawShadeColumn
+;;
+;; for smoke..etc.. test.
+;;----------------------------------------------------------------------
+cglobal R_DrawShadeColumn_8
+R_DrawShadeColumn_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+
+;;
+;; dest = ylookup[dc_yl] + columnofs[dc_x];
+;;
+ mov ebp,[dc_yl]
+ mov ebx,ebp
+ mov edi,[ylookup+ebx*4]
+ mov ebx,[dc_x]
+ add edi,[columnofs+ebx*4] ;; edi = dest
+;;
+;; pixelcount = yh - yl + 1
+;;
+ mov eax,[dc_yh]
+ inc eax
+ sub eax,ebp ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ jle near shdone ;; nothing to scale
+;;
+;; frac = dc_texturemid - (centery-dc_yl)*fracstep;
+;;
+ mov ecx,[dc_iscale] ;; fracstep
+ mov eax,[centery]
+ sub eax,ebp
+ imul eax,ecx
+ mov edx,[dc_texturemid]
+ sub edx,eax
+ mov ebx,edx
+ shr ebx,16 ;; frac int.
+ and ebx,byte +0x7f
+ shl edx,16 ;; y frac up
+
+ mov ebp,ecx
+ shl ebp,16 ;; fracstep f. up
+ shr ecx,16 ;; fracstep i. ->cl
+ and cl,0x7f
+
+ mov esi,[dc_source]
+;;
+;; lets rock :) !
+;;
+ mov eax,[pixelcount]
+ mov dh,al
+ shr eax,2
+ mov ch,al ;; quad count
+ mov eax,[colormaps]
+ test dh,3
+ je sh4quadloop
+;;
+;; do un-even pixel
+;;
+ test dh,0x1
+ je shf2
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pl: add edi,0x12345678
+;;
+;; do two non-quad-aligned pixels
+;;
+shf2:
+ test dh,0x2
+ je shf3
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pm: add edi,0x12345678
+
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ add edx,ebp
+ adc bl,cl
+ mov al,[edi] ;; fetch dest : index into colormap
+ and bl,0x7f
+ mov dl,[eax]
+ mov [edi],dl
+pn: add edi,0x12345678
+;;
+;; test if there was at least 4 pixels
+;;
+shf3:
+ test ch,0xff ;; test quad count
+ je near shdone
+
+;;
+;; ebp : ystep frac. upper 24 bits
+;; edx : y frac. upper 24 bits
+;; ebx : y i. lower 7 bits, masked for index
+;; ecx : ch = counter, cl = y step i.
+;; eax : colormap aligned 256
+;; esi : source texture column
+;; edi : dest screen
+;;
+sh4quadloop:
+ mov dh,0x7f ;; prep mask
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [tystep],ebp
+po: add edi,0x12345678
+ mov al,[edi] ;; fetch dest : index into colormap
+pp: sub edi,0x12345678
+ mov ebp,edi
+pq: sub edi,0x12345678
+ jmp short shinloop
+
+align 4
+shquadloop:
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q5: add ebp,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+shinloop:
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q6: add edi,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q7: add ebp,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [edi],dl
+ mov al,[ebp] ;; fetch dest : index into colormap
+
+ add edx,[tystep]
+ adc bl,cl
+ and bl,dh
+q8: add edi,0x12345678
+ mov dl,[eax]
+ mov ah,[esi+ebx] ;; fetch texel : colormap number
+ mov [ebp],dl
+ mov al,[edi] ;; fetch dest : index into colormap
+
+ dec ch
+ jne shquadloop
+
+shdone:
+ pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+
+;;----------------------------------------------------------------------
+;;
+;; R_DrawSpan
+;;
+;; Horizontal texture mapping
+;;
+;;----------------------------------------------------------------------
+
+
+[SECTION .data]
+
+oldcolormap dd 0
+
+[SECTION CODE_SEG write]
+
+cglobal R_DrawSpan_8
+R_DrawSpan_8:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; initilise registers
+;;
+
+ mov edx, [ds_xfrac]
+ mov eax, [ds_ystep]
+ ror edx, 14
+ ror eax, 15
+ mov bl, dl
+ mov ecx, [ds_xstep]
+ mov dh, al
+ mov ax, 1
+ mov [tystep], eax
+
+
+ mov eax, [ds_yfrac]
+ ror ecx, 13
+ ror eax, 16
+ mov dl, cl
+ mov bh, al
+ xor cx, cx
+ and ebx, 0x3fff
+ mov [pixelcount],ecx
+
+ mov ecx, [ds_x2]
+ mov edi, [ds_y]
+ mov esi, [ds_x1]
+ mov edi, [ylookup+edi*4]
+ mov ebp, ebx
+ add edi, [columnofs+esi*4]
+ sub esi, ecx ;; pixel count
+ shr ebp, 2
+ mov ecx, [ds_colormap]
+ mov ax, si
+ mov esi, [ds_source]
+ sar ax,1
+ jnc near .midloop ;; check parity
+
+; summary
+; edx = high16bit xfrac[0..13], ah=ystep[16..24] al=xtep[14..21]
+; ebx = high16bit =0, bh=yfrac[16..24], bl=xfrac[14..21]
+; ecx = colormap table cl=0 (colormap is aligned 8 bits)
+; eax = high16bit yfrac[0..15], dx = count
+; esi = flat texture source
+; edi = screeen buffer destination
+; ebp = work register
+; pixelcount = high16bit xstep[0..13] rest to 0
+; tystep = high16bit ystep[0..15] low 16 bit = 2 (increment of count)
+
+align 4
+.loop
+ add eax, [tystep]
+ mov cl, [esi+ebp]
+ adc bh, dh
+ mov cl, [ecx]
+ and bh, 0x3f
+ mov [edi], cl
+ mov ebp, ebx
+ inc edi
+ shr ebp, 2
+
+.midloop:
+ add edx, [pixelcount]
+ mov cl, [esi+ebp]
+ adc bl, dl
+ mov cl, [ecx]
+ mov ebp, ebx
+ mov [edi], cl
+ inc edi
+ shr ebp, 2
+
+ test eax, 0xffff
+ jnz near .loop
+
+.hdone: pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+[SECTION .data]
+
+obelix dd 0
+etaussi dd 0
+
+[SECTION CODE_SEG]
+
+cglobal R_DrawSpan_8_old
+R_DrawSpan_8_old:
+ push ebp ;; preserve caller's stack frame pointer
+ push esi ;; preserve register variables
+ push edi
+ push ebx
+;;
+;; find loop count
+;;
+ mov eax,[ds_x2]
+ inc eax
+ sub eax,[ds_x1] ;; pixel count
+ mov [pixelcount],eax ;; save for final pixel
+ js near .hdone ;; nothing to scale
+ shr eax,0x1 ;; double pixel count
+ mov [loopcount],eax
+;;
+;; build composite position
+;;
+ mov ebp,[ds_xfrac]
+ shl ebp,10
+ and ebp,0xffff0000
+ mov eax,[ds_yfrac]
+ shr eax,6
+ and eax,0xffff
+ mov edi,[ds_y]
+ or ebp,eax
+
+ mov esi,[ds_source]
+;;
+;; calculate screen dest
+;;
+ mov edi,[ylookup+edi*4]
+ mov eax,[ds_x1]
+ add edi,[columnofs+eax*4]
+;;
+;; build composite step
+;;
+ mov ebx,[ds_xstep]
+ shl ebx,10
+ and ebx,0xffff0000
+ mov eax,[ds_ystep]
+ shr eax,6
+ and eax,0xffff
+ or ebx,eax
+
+ mov [obelix],ebx
+ mov [etaussi],esi
+
+;; %eax aligned colormap
+;; %ebx aligned colormap
+;; %ecx,%edx scratch
+;; %esi virtual source
+;; %edi moving destination pointer
+;; %ebp frac
+
+ mov eax,[ds_colormap]
+ mov ecx,ebp
+ add ebp,ebx ;; advance frac pointer
+ shr cx,10
+ rol ecx,6
+ and ecx,4095 ;; finish calculation for third pixel
+ mov edx,ebp
+ shr dx,10
+ rol edx,6
+ add ebp,ebx ;; advance frac pointer
+ and edx,4095 ;; finish calculation for fourth pixel
+ mov ebx,eax
+ mov al,[esi+ecx] ;; get first pixel
+ mov bl,[esi+edx] ;; get second pixel
+
+ test dword [pixelcount],0xfffffffe
+
+ mov dl,[eax] ;; color translate first pixel
+
+;; movw $0xf0f0,%dx ;;see visplanes start
+
+ je .hchecklast
+
+ mov dh,[ebx] ;; color translate second pixel
+ mov esi,[loopcount]
+align 4
+.hdoubleloop:
+ mov ecx,ebp
+ shr cx,10
+ rol ecx,6
+ add ebp,[obelix] ;; advance frac pointer
+ mov [edi],dx ;; write first pixel
+ and ecx,4095 ;; finish calculation for third pixel
+ mov edx,ebp
+ shr dx,10
+ rol edx,6
+ add ecx,[etaussi]
+ and edx,4095 ;; finish calculation for fourth pixel
+ mov al,[ecx] ;; get third pixel
+ add ebp,[obelix] ;; advance frac pointer
+ add edx,[etaussi]
+ mov bl,[edx] ;; get fourth pixel
+ mov dl,[eax] ;; color translate third pixel
+ add edi,byte +0x2 ;; advance to third pixel destination
+ dec esi ;; done with loop?
+ mov dh,[ebx] ;; color translate fourth pixel
+ jne .hdoubleloop
+;; check for final pixel
+.hchecklast:
+ test dword [pixelcount],0x1
+ je .hdone
+ mov [edi],dl ;; write final pixel
+.hdone: pop ebx ;; restore register variables
+ pop edi
+ pop esi
+ pop ebp ;; restore caller's stack frame pointer
+ ret
+
+
+;; ========================================================================
+;; Rasterization des segments d'un polyg“ne textur‚ de maniŠre LINEAIRE.
+;; Il s'agit donc d'interpoler les coordonn‚es aux bords de la texture en
+;; mˆme temps que les abscisses minx/maxx pour chaque ligne.
+;; L'argument 'dir' indique quels bords de la texture sont interpolés:
+;; 0 : segments associ‚s aux bord SUPERIEUR et INFERIEUR ( TY constant )
+;; 1 : segments associ‚s aux bord GAUCHE et DROITE ( TX constant )
+;; ========================================================================
+;;
+;; void rasterize_segment_tex( LONG x1, LONG y1, LONG x2, LONG y2, LONG tv1, LONG tv2, LONG tc, LONG dir );
+;; ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8
+;;
+;; Pour dir = 0, (tv1,tv2) = (tX1,tX2), tc = tY, en effet TY est constant.
+;;
+;; Pour dir = 1, (tv1,tv2) = (tY1,tY2), tc = tX, en effet TX est constant.
+;;
+;;
+;; Uses: extern struct rastery *_rastertab;
+;;
+
+[SECTION CODE_SEG write]
+
+MINX EQU 0
+MAXX EQU 4
+TX1 EQU 8
+TY1 EQU 12
+TX2 EQU 16
+TY2 EQU 20
+RASTERY_SIZEOF EQU 24
+
+cglobal rasterize_segment_tex
+rasterize_segment_tex:
+ push ebp
+ mov ebp,esp
+
+ sub esp,byte +0x8 ;; alloue les variables locales
+
+ push ebx
+ push esi
+ push edi
+ o16 mov ax,es
+ push eax
+
+;; #define DX [ebp-4]
+;; #define TD [ebp-8]
+
+ mov eax,[ebp+0xc] ;; y1
+ mov ebx,[ebp+0x14] ;; y2
+ cmp ebx,eax
+ je near .L_finished ;; special (y1==y2) segment horizontal, exit!
+
+ jg near .L_rasterize_right
+
+;;rasterize_left: ;; on rasterize un segment … la GAUCHE du polyg“ne
+
+ mov ecx,eax
+ sub ecx,ebx
+ inc ecx ;; y1-y2+1
+
+ mov eax,RASTERY_SIZEOF
+ mul ebx ;; * y2
+ mov esi,[prastertab]
+ add esi,eax ;; point into rastertab[y2]
+
+ mov eax,[ebp+0x8] ;; ARG1
+ sub eax,[ebp+0x10] ;; ARG3
+ shl eax,0x10 ;; ((x1-x2)<<PRE) ...
+ cdq
+ idiv ecx ;; dx = ... / (y1-y2+1)
+ mov [ebp-0x4],eax ;; DX
+
+ mov eax,[ebp+0x18] ;; ARG5
+ sub eax,[ebp+0x1c] ;; ARG6
+ shl eax,0x10
+ cdq
+ idiv ecx ;; tdx =((tx1-tx2)<<PRE) / (y1-y2+1)
+ mov [ebp-0x8],eax ;; idem tdy =((ty1-ty2)<<PRE) / (y1-y2+1)
+
+ mov eax,[ebp+0x10] ;; ARG3
+ shl eax,0x10 ;; x = x2<<PRE
+
+ mov ebx,[ebp+0x1c] ;; ARG6
+ shl ebx,0x10 ;; tx = tx2<<PRE d0
+ ;; ty = ty2<<PRE d1
+ mov edx,[ebp+0x20] ;; ARG7
+ shl edx,0x10 ;; ty = ty<<PRE d0
+ ;; tx = tx<<PRE d1
+ push ebp
+ mov edi,[ebp-0x4] ;; DX
+ cmp dword [ebp+0x24],byte +0x0 ;; ARG8 direction ?
+
+ mov ebp,[ebp-0x8] ;; TD
+ je .L_rleft_h_loop
+;;
+;; TY varie, TX est constant
+;;
+.L_rleft_v_loop:
+ mov [esi+MINX],eax ;; rastertab[y].minx = x
+ add ebx,ebp
+ mov [esi+TX1],edx ;; .tx1 = tx
+ add eax,edi
+ mov [esi+TY1],ebx ;; .ty1 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // ty += tdy
+
+ add esi,RASTERY_SIZEOF ;; next raster line into rastertab[]
+ dec ecx
+ jne .L_rleft_v_loop
+ pop ebp
+ jmp .L_finished
+;;
+;; TX varie, TY est constant
+;;
+.L_rleft_h_loop:
+ mov [esi+MINX],eax ;; rastertab[y].minx = x
+ add eax,edi
+ mov [esi+TX1],ebx ;; .tx1 = tx
+ add ebx,ebp
+ mov [esi+TY1],edx ;; .ty1 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // tx += tdx
+
+ add esi,RASTERY_SIZEOF ;; next raster line into rastertab[]
+ dec ecx
+ jne .L_rleft_h_loop
+ pop ebp
+ jmp .L_finished
+;;
+;; on rasterize un segment … la DROITE du polyg“ne
+;;
+.L_rasterize_right:
+ mov ecx,ebx
+ sub ecx,eax
+ inc ecx ;; y2-y1+1
+
+ mov ebx,RASTERY_SIZEOF
+ mul ebx ;; * y1
+ mov esi,[prastertab]
+ add esi,eax ;; point into rastertab[y1]
+
+ mov eax,[ebp+0x10] ;; ARG3
+ sub eax,[ebp+0x8] ;; ARG1
+ shl eax,0x10 ;; ((x2-x1)<<PRE) ...
+ cdq
+ idiv ecx ;; dx = ... / (y2-y1+1)
+ mov [ebp-0x4],eax ;; DX
+
+ mov eax,[ebp+0x1c] ;; ARG6
+ sub eax,[ebp+0x18] ;; ARG5
+ shl eax,0x10
+ cdq
+ idiv ecx ;; tdx =((tx2-tx1)<<PRE) / (y2-y1+1)
+ mov [ebp-0x8],eax ;; idem tdy =((ty2-ty1)<<PRE) / (y2-y1+1)
+
+ mov eax,[ebp+0x8] ;; ARG1
+ shl eax,0x10 ;; x = x1<<PRE
+
+ mov ebx,[ebp+0x18] ;; ARG5
+ shl ebx,0x10 ;; tx = tx1<<PRE d0
+ ;; ty = ty1<<PRE d1
+ mov edx,[ebp+0x20] ;; ARG7
+ shl edx,0x10 ;; ty = ty<<PRE d0
+ ;; tx = tx<<PRE d1
+ push ebp
+ mov edi,[ebp-0x4] ;; DX
+
+ cmp dword [ebp+0x24], 0 ;; direction ?
+
+ mov ebp,[ebp-0x8] ;; TD
+ je .L_rright_h_loop
+;;
+;; TY varie, TX est constant
+;;
+.L_rright_v_loop:
+
+ mov [esi+MAXX],eax ;; rastertab[y].maxx = x
+ add ebx,ebp
+ mov [esi+TX2],edx ;; .tx2 = tx
+ add eax,edi
+ mov [esi+TY2],ebx ;; .ty2 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // ty += tdy
+
+ add esi,RASTERY_SIZEOF
+ dec ecx
+ jne .L_rright_v_loop
+
+ pop ebp
+
+ jmp short .L_finished
+;;
+;; TX varie, TY est constant
+;;
+.L_rright_h_loop:
+ mov [esi+MAXX],eax ;; rastertab[y].maxx = x
+ add eax,edi
+ mov [esi+TX2],ebx ;; .tx2 = tx
+ add ebx,ebp
+ mov [esi+TY2],edx ;; .ty2 = ty
+
+ ;;addl DX, %eax // x += dx
+ ;;addl TD, %ebx // tx += tdx
+
+ add esi,RASTERY_SIZEOF
+ dec ecx
+ jne .L_rright_h_loop
+
+ pop ebp
+
+.L_finished:
+ pop eax
+ o16 mov es,ax
+ pop edi
+ pop esi
+ pop ebx
+
+ mov esp,ebp
+ pop ebp
+ ret
+
+
+;;; this version can draw 64x64 tiles, but they would have to be arranged 4 per row,
+;; so that the stride from one line to the next is 256
+;;
+;; .data
+;;xstep dd 0
+;;ystep dd 0
+;;texwidth dd 64 ;; texture width
+;; .text
+;; this code is kept in case we add high-detail floor textures for example (256x256)
+; align 16
+;_R_DrawSpan_8:
+; push ebp ;; preserve caller's stack frame pointer
+; push esi ;; preserve register variables
+; push edi
+; push ebx
+;;
+;; find loop count
+;;
+; mov eax,[ds_x2]
+; inc eax
+; sub eax,[ds_x1] ;; pixel count
+; mov [pixelcount],eax ;; save for final pixel
+; js near .hdone ;; nothing to scale
+;;
+;; calculate screen dest
+;;
+; mov edi,[ds_y]
+; mov edi,[ylookup+edi*4]
+; mov eax,[ds_x1]
+; add edi,[columnofs+eax*4]
+;;
+;; prepare registers for inner loop
+;;
+; xor eax,eax
+; mov edx,[ds_xfrac]
+; ror edx,16
+; mov al,dl
+; mov ecx,[ds_yfrac]
+; ror ecx,16
+; mov ah,cl
+;
+; mov ebx,[ds_xstep]
+; ror ebx,16
+; mov ch,bl
+; and ebx,0xffff0000
+; mov [xstep],ebx
+; mov ebx,[ds_ystep]
+; ror ebx,16
+; mov dh,bl
+; and ebx,0xffff0000
+; mov [ystep],ebx
+;
+; mov esi,[ds_source]
+;
+;;; %eax Yi,Xi in %ah,%al
+;;; %ebx aligned colormap
+;;; %ecx Yfrac upper, dXi in %ch, %cl is counter (upto 1024pels, =4x256)
+;;; %edx Xfrac upper, dYi in %dh, %dl receives mapped pixels from (ebx)
+;;; ystep dYfrac, add to %ecx, low word is 0
+;;; xstep dXfrac, add to %edx, low word is 0
+;;; %ebp temporary register serves as offset like %eax
+;;; %esi virtual source
+;;; %edi moving destination pointer
+;
+; mov ebx,[pixelcount]
+; shr ebx,0x2 ;; 4 pixels per loop
+; test bl,0xff
+; je near .hchecklast
+; mov cl,bl
+;
+; mov ebx,[dc_colormap]
+;;;
+;;; prepare loop with first pixel
+;;;
+; add ecx,[ystep] ;;pr‚a1
+; adc ah,dh
+; add edx,[xstep]
+; adc al,ch
+; and eax,0x3f3f
+; mov bl,[esi+eax] ;;pr‚b1
+; mov dl,[ebx] ;;pr‚c1
+;
+; add ecx,[ystep] ;;a2
+; adc ah,dh
+;
+;.hdoubleloop:
+; mov [edi+1],dl
+; add edx,[xstep]
+; adc al,ch
+; add edi,byte +0x2
+; mov ebp,eax
+; add ecx,[ystep]
+; adc ah,dh
+; and ebp,0x3f3f
+; add edx,[xstep]
+; mov bl,[esi+ebp]
+; adc al,ch
+; mov dl,[ebx]
+; and eax,0x3f3f
+; mov [edi],dl
+; mov bl,[esi+eax]
+; add ecx,[ystep]
+; adc ah,dh
+; add edx,[xstep]
+; adc al,ch
+; mov dl,[ebx]
+; mov ebp,eax
+; mov [edi+1],dl
+; and ebp,0x3f3f
+; add ecx,[ystep]
+; adc ah,dh
+; mov bl,[esi+ebp]
+; add edi,byte +0x2
+; add edx,[xstep]
+; adc al,ch
+; mov dl,[ebx]
+; and eax,0x3f3f
+; mov [edi],dl
+; mov bl,[esi+eax]
+; add ecx,[ystep]
+; adc ah,dh
+; mov dl,[ebx]
+; dec cl
+; jne near .hdoubleloop
+;;; check for final pixel
+;.hchecklast:
+;;; to do
+;.hdone:
+; pop ebx
+; pop edi
+; pop esi
+; pop ebp
+; ret
+
diff --git a/travis/test/tmap.json b/travis/test/tmap.json
new file mode 100644
index 00000000..3978d998
--- /dev/null
+++ b/travis/test/tmap.json
@@ -0,0 +1,10 @@
+{
+ "description": "Test abuse the section flags which breaks NASM 0.98.37",
+ "format": "elf",
+ "source": "tmap.asm",
+ "option": "-DLINUX",
+ "target": [
+ { "output": "tmap.o" },
+ { "stderr": "tmap.o.stderr" }
+ ]
+}
diff --git a/travis/test/tmap.o.stderr b/travis/test/tmap.o.stderr
new file mode 100644
index 00000000..da75c8fb
--- /dev/null
+++ b/travis/test/tmap.o.stderr
@@ -0,0 +1 @@
+./travis/test/tmap.asm:938: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
diff --git a/travis/test/tmap.o.t b/travis/test/tmap.o.t
new file mode 100644
index 00000000..8ac43ab5
--- /dev/null
+++ b/travis/test/tmap.o.t
Binary files differ
diff --git a/travis/test/utf-error.stderr b/travis/test/utf-error.stderr
new file mode 100644
index 00000000..3f420e3b
--- /dev/null
+++ b/travis/test/utf-error.stderr
@@ -0,0 +1,18 @@
+./travis/test/utf.asm:63: error: __utf16__ must be followed by a string constant
+./travis/test/utf.asm:64: error: __utf16__ must be followed by a string constant
+./travis/test/utf.asm:65: error: unterminated __utf16__ function
+./travis/test/utf.asm:65: error: comma expected after operand 2
+./travis/test/utf.asm:66: error: unterminated __utf16__ function
+./travis/test/utf.asm:67: error: invalid string for transform
+./travis/test/utf.asm:69: error: __utf16le__ must be followed by a string constant
+./travis/test/utf.asm:70: error: __utf16le__ must be followed by a string constant
+./travis/test/utf.asm:71: error: unterminated __utf16le__ function
+./travis/test/utf.asm:71: error: comma expected after operand 2
+./travis/test/utf.asm:72: error: unterminated __utf16le__ function
+./travis/test/utf.asm:73: error: invalid string for transform
+./travis/test/utf.asm:75: error: __utf16be__ must be followed by a string constant
+./travis/test/utf.asm:76: error: __utf16be__ must be followed by a string constant
+./travis/test/utf.asm:77: error: unterminated __utf16be__ function
+./travis/test/utf.asm:77: error: comma expected after operand 2
+./travis/test/utf.asm:78: error: unterminated __utf16be__ function
+./travis/test/utf.asm:79: error: invalid string for transform
diff --git a/travis/test/utf.asm b/travis/test/utf.asm
new file mode 100644
index 00000000..5ff1e559
--- /dev/null
+++ b/travis/test/utf.asm
@@ -0,0 +1,80 @@
+%define u(x) __utf16__(x)
+%define w(x) __utf32__(x)
+%define ul(x) __utf16le__(x)
+%define wl(x) __utf32le__(x)
+%define ub(x) __utf16be__(x)
+%define wb(x) __utf32be__(x)
+
+ db `Test \u306a\U0001abcd\n`
+ dw u(`Test \u306a\U0001abcd\n`)
+ dd w(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16__ "Hello, World!"
+
+ nop
+
+ mov ax,u(`a`)
+ mov bx,u(`\u306a`)
+ mov cx,u(`\xe3\x81\xaa`)
+ mov eax,u(`ab`)
+ mov ebx,u(`\U0001abcd`)
+ mov ecx,w(`\U0001abcd`)
+
+ db `Test \u306a\U0001abcd\n`
+ dw ul(`Test \u306a\U0001abcd\n`)
+ dd wl(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16le__ "Hello, World!"
+
+ nop
+
+ mov ax,ul(`a`)
+ mov bx,ul(`\u306a`)
+ mov cx,ul(`\xe3\x81\xaa`)
+ mov eax,ul(`ab`)
+ mov ebx,ul(`\U0001abcd`)
+ mov ecx,wl(`\U0001abcd`)
+
+ db `Test \u306a\U0001abcd\n`
+ dw ub(`Test \u306a\U0001abcd\n`)
+ dd wb(`Test \u306a\U0001abcd\n`)
+
+ db `\u306a`
+ db `\xe3\x81\xaa`
+
+ dw __utf16be__ "Hello, World!"
+
+ nop
+
+ mov ax,ub(`a`)
+ mov bx,ub(`\u306a`)
+ mov cx,ub(`\xe3\x81\xaa`)
+ mov eax,ub(`ab`)
+ mov ebx,ub(`\U0001abcd`)
+ mov ecx,wb(`\U0001abcd`)
+
+%ifdef ERROR
+ dw __utf16__ 33
+ dw __utf16__, 46
+ dw __utf16__("Hello, World!",16)
+ dw __utf16__("Hello, World!",16
+ dw u(`\xff`)
+
+ dw __utf16le__ 33
+ dw __utf16le__, 46
+ dw __utf16le__("Hello, World!",16)
+ dw __utf16le__("Hello, World!",16
+ dw ul(`\xff`)
+
+ dw __utf16be__ 33
+ dw __utf16be__, 46
+ dw __utf16be__("Hello, World!",16)
+ dw __utf16be__("Hello, World!",16
+ dw ub(`\xff`)
+%endif
diff --git a/travis/test/utf.bin.t b/travis/test/utf.bin.t
new file mode 100644
index 00000000..a6c34215
--- /dev/null
+++ b/travis/test/utf.bin.t
Binary files differ
diff --git a/travis/test/utf.json b/travis/test/utf.json
new file mode 100644
index 00000000..c1126d89
--- /dev/null
+++ b/travis/test/utf.json
@@ -0,0 +1,20 @@
+[
+ {
+ "description": "Test __utf__ helpers",
+ "id": "utf",
+ "format": "bin",
+ "source": "utf.asm",
+ "target": [
+ { "output": "utf.bin" }
+ ]
+ },
+ {
+ "description": "Test errors in __utf__ helpers",
+ "ref": "utf",
+ "option": "-DERROR",
+ "target": [
+ { "stderr": "utf-error.stderr" }
+ ],
+ "error": "expected"
+ }
+]
diff --git a/travis/test/weirdpaste.asm b/travis/test/weirdpaste.asm
new file mode 100644
index 00000000..353ef8a8
--- /dev/null
+++ b/travis/test/weirdpaste.asm
@@ -0,0 +1,26 @@
+ %define foo xyzzy
+%define bar 1e+10
+
+%define xyzzy1e 15
+
+%macro dx 2
+%assign xx %1%2
+ dw xx
+%endmacro
+
+ dx foo, bar
+
+%macro df 2
+%assign xy __float32__(%1e+%2)
+ dd xy
+ dd %1e+%2
+%endmacro
+
+ df 1, 36
+ df 33, 20
+ df 0, 2
+ df 1.2, 5
+
+
+%define N 1e%++%+ 5
+ dd N, 1e+5
diff --git a/travis/test/weirdpaste.bin.t b/travis/test/weirdpaste.bin.t
new file mode 100644
index 00000000..db0468ed
--- /dev/null
+++ b/travis/test/weirdpaste.bin.t
Binary files differ
diff --git a/travis/test/weirdpaste.i.t b/travis/test/weirdpaste.i.t
new file mode 100644
index 00000000..ac7ddf08
--- /dev/null
+++ b/travis/test/weirdpaste.i.t
@@ -0,0 +1,30 @@
+%line 3+1 ./travis/test/weirdpaste.asm
+
+
+
+%line 10+1 ./travis/test/weirdpaste.asm
+
+ dw 25
+
+%line 18+1 ./travis/test/weirdpaste.asm
+
+ dd 2067830734
+%line 19+0 ./travis/test/weirdpaste.asm
+ dd 1e+36
+%line 20+1 ./travis/test/weirdpaste.asm
+ dd 1664279731
+%line 20+0 ./travis/test/weirdpaste.asm
+ dd 33e+20
+%line 21+1 ./travis/test/weirdpaste.asm
+ dd 0
+%line 21+0 ./travis/test/weirdpaste.asm
+ dd 0e+2
+%line 22+1 ./travis/test/weirdpaste.asm
+ dd 1206542336
+%line 22+0 ./travis/test/weirdpaste.asm
+ dd 1.2e+5
+%line 23+1 ./travis/test/weirdpaste.asm
+
+
+
+ dd 1e+5, 1e+5
diff --git a/travis/test/weirdpaste.json b/travis/test/weirdpaste.json
new file mode 100644
index 00000000..566a567b
--- /dev/null
+++ b/travis/test/weirdpaste.json
@@ -0,0 +1,18 @@
+[
+ {
+ "description": "Check preprocessor paste operator (compile mode)",
+ "format": "bin",
+ "source": "weirdpaste.asm",
+ "target": [
+ { "output": "weirdpaste.bin" }
+ ]
+ },
+ {
+ "description": "Check preprocessor paste operator (preprocessor mode)",
+ "source": "weirdpaste.asm",
+ "option": "-E",
+ "target": [
+ { "output": "weirdpaste.i" }
+ ]
+ }
+]
diff --git a/version b/version
new file mode 100644
index 00000000..91d11b10
--- /dev/null
+++ b/version
@@ -0,0 +1 @@
+2.15rc0
diff --git a/version.h b/version.h
new file mode 100644
index 00000000..d917146a
--- /dev/null
+++ b/version.h
@@ -0,0 +1,9 @@
+#ifndef NASM_VERSION_H
+#define NASM_VERSION_H
+#define NASM_MAJOR_VER 2
+#define NASM_MINOR_VER 14
+#define NASM_SUBMINOR_VER 99
+#define NASM_PATCHLEVEL_VER 90
+#define NASM_VERSION_ID 0x020e635a
+#define NASM_VER "2.15rc0"
+#endif /* NASM_VERSION_H */
diff --git a/version.pl b/version.pl
new file mode 100755
index 00000000..579ba7b5
--- /dev/null
+++ b/version.pl
@@ -0,0 +1,189 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2016 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# version.pl
+#
+# Parse the NASM version file and produce appropriate macros
+#
+# The NASM version number is assumed to consist of:
+#
+# <major>.<minor>[.<subminor>][pl<patchlevel>]]<tail>
+#
+# ... where <tail> is not necessarily numeric, but if it is of the form
+# -<digits> it is assumed to be a snapshot release.
+#
+# This defines the following macros:
+#
+# version.h:
+# NASM_MAJOR_VER
+# NASM_MINOR_VER
+# NASM_SUBMINOR_VER -- this is zero if no subminor
+# NASM_PATCHLEVEL_VER -- this is zero is no patchlevel
+# NASM_SNAPSHOT -- if snapshot
+# NASM_VERSION_ID -- version number encoded
+# NASM_VER -- whole version number as a string
+#
+# version.mac:
+# __NASM_MAJOR__
+# __NASM_MINOR__
+# __NASM_SUBMINOR__
+# __NASM_PATCHLEVEL__
+# __NASM_SNAPSHOT__
+# __NASM_VERSION_ID__
+# __NASM_VER__
+#
+
+($what) = @ARGV;
+
+$line = <STDIN>;
+chomp $line;
+
+undef $man, $min, $smin, $plvl, $tail;
+$is_rc = 0;
+
+if ( $line =~ /^([0-9]+)\.([0-9]+)(.*)$/ ) {
+ $maj = $1;
+ $min = $2;
+ $tail = $3;
+ if ( $tail =~ /^\.([0-9]+)(.*)$/ ) {
+ $smin = $1;
+ $tail = $2;
+ }
+ if ( $tail =~ /^(pl|\.)([0-9]+)(.*)$/ ) {
+ $plvl = $2;
+ $tail = $3;
+ } elsif ( $tail =~ /^rc([0-9]+)(.*)$/ ) {
+ $is_rc = 1;
+ $plvl = $1;
+ $tail = $2;
+ }
+} else {
+ die "$0: Invalid input format\n";
+}
+
+if ($tail =~ /^\-([0-9]+)$/) {
+ $snapshot = $1;
+} else {
+ undef $snapshot;
+}
+
+$nmaj = $maj+0; $nmin = $min+0;
+$nsmin = $smin+0; $nplvl = $plvl+0;
+
+if ($is_rc) {
+ $nplvl += 90;
+ if ($nsmin > 0) {
+ $nsmin--;
+ } else {
+ $nsmin = 99;
+ if ($nmin > 0) {
+ $nmin--;
+ } else {
+ $nmin = 99;
+ $nmaj--;
+ }
+ }
+}
+
+$nasm_id = ($nmaj << 24)+($nmin << 16)+($nsmin << 8)+$nplvl;
+
+$mangled_ver = sprintf("%d.%02d", $nmaj, $nmin);
+if ($nsmin || $nplvl || defined($snapshot)) {
+ $mangled_ver .= sprintf(".%02d", $nsmin);
+ if ($nplvl || defined($snapshot)) {
+ $mangled_ver .= '.'.$nplvl;
+ }
+}
+($mtail = $tail) =~ tr/-/./;
+$mangled_ver .= $mtail;
+
+if ( $what eq 'h' ) {
+ print "#ifndef NASM_VERSION_H\n";
+ print "#define NASM_VERSION_H\n";
+ printf "#define NASM_MAJOR_VER %d\n", $nmaj;
+ printf "#define NASM_MINOR_VER %d\n", $nmin;
+ printf "#define NASM_SUBMINOR_VER %d\n", $nsmin;
+ printf "#define NASM_PATCHLEVEL_VER %d\n", $nplvl;
+ if (defined($snapshot)) {
+ printf "#define NASM_SNAPSHOT %d\n", $snapshot;
+ }
+ printf "#define NASM_VERSION_ID 0x%08x\n", $nasm_id;
+ printf "#define NASM_VER \"%s\"\n", $line;
+ print "#endif /* NASM_VERSION_H */\n";
+} elsif ( $what eq 'mac' ) {
+ print "STD: version\n";
+ printf "%%define __NASM_MAJOR__ %d\n", $nmaj;
+ printf "%%define __NASM_MINOR__ %d\n", $nmin;
+ printf "%%define __NASM_SUBMINOR__ %d\n", $nsmin;
+ printf "%%define __NASM_PATCHLEVEL__ %d\n", $nplvl;
+ if (defined($snapshot)) {
+ printf "%%define __NASM_SNAPSHOT__ %d\n", $snapshot;
+ }
+ printf "%%define __NASM_VERSION_ID__ 0%08Xh\n", $nasm_id;
+ printf "%%define __NASM_VER__ \"%s\"\n", $line;
+} elsif ( $what eq 'sed' ) {
+ printf "s/\@\@NASM_MAJOR\@\@/%d/g\n", $nmaj;
+ printf "s/\@\@NASM_MINOR\@\@/%d/g\n", $nmin;
+ printf "s/\@\@NASM_SUBMINOR\@\@/%d/g\n", $nsmin;
+ printf "s/\@\@NASM_PATCHLEVEL\@\@/%d/g\n", $nplvl;
+ printf "s/\@\@NASM_SNAPSHOT\@\@/%d/g\n", $snapshot; # Possibly empty
+ printf "s/\@\@NASM_VERSION_ID\@\@/%d/g\n", $nasm_id;
+ printf "s/\@\@NASM_VERSION_XID\@\@/0x%08x/g\n", $nasm_id;
+ printf "s/\@\@NASM_VER\@\@/%s/g\n", $line;
+ printf "s/\@\@NASM_MANGLED_VER\@\@/%s/g\n", $mangled_ver;
+} elsif ( $what eq 'make' ) {
+ printf "NASM_VER=%s\n", $line;
+ printf "NASM_MAJOR_VER=%d\n", $nmaj;
+ printf "NASM_MINOR_VER=%d\n", $nmin;
+ printf "NASM_SUBMINOR_VER=%d\n", $nsmin;
+ printf "NASM_PATCHLEVEL_VER=%d\n", $nplvl;
+} elsif ( $what eq 'nsis' ) {
+ printf "!define VERSION \"%s\"\n", $line;
+ printf "!define MAJOR_VER %d\n", $nmin;
+ printf "!define MINOR_VER %d\n", $nmin;
+ printf "!define SUBMINOR_VER %d\n", $nsmin;
+ printf "!define PATCHLEVEL_VER %d\n", $nplvl;
+} elsif ( $what eq 'id' ) {
+ print $nasm_id, "\n"; # Print ID in decimal
+} elsif ( $what eq 'xid' ) {
+ printf "0x%08x\n", $nasm_id; # Print ID in hexadecimal
+} elsif ( $what eq 'docsrc' ) {
+ printf "\\M{version}{%s}\n", $line;
+ printf "\\M{subtitle}{version %s}\n", $line;
+} else {
+ die "$0: Unknown output: $what\n";
+}
+
+exit 0;
diff --git a/x86/disp8.c b/x86/disp8.c
new file mode 100644
index 00000000..64c921b6
--- /dev/null
+++ b/x86/disp8.c
@@ -0,0 +1,131 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2013 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT OWNER 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * disp8.c : Contains a common logic for EVEX compressed displacement
+ */
+
+#include "disp8.h"
+
+/*
+ * Find N value for compressed displacement (disp8 * N)
+ */
+uint8_t get_disp8N(insn *ins)
+{
+ static const uint8_t fv_n[2][2][VLMAX] = {{{16, 32, 64}, {4, 4, 4}},
+ {{16, 32, 64}, {8, 8, 8}}};
+ static const uint8_t hv_n[2][VLMAX] = {{8, 16, 32}, {4, 4, 4}};
+ static const uint8_t dup_n[VLMAX] = {8, 32, 64};
+
+ bool evex_b = (ins->evex_p[2] & EVEX_P2B) >> 4;
+ enum ttypes tuple = ins->evex_tuple;
+ enum vectlens vectlen = (ins->evex_p[2] & EVEX_P2LL) >> 5;
+ bool evex_w = (ins->evex_p[1] & EVEX_P1W) >> 7;
+ uint8_t n = 0;
+
+ switch(tuple) {
+ case FV:
+ n = fv_n[evex_w][evex_b][vectlen];
+ break;
+ case HV:
+ n = hv_n[evex_b][vectlen];
+ break;
+
+ case FVM:
+ /* 16, 32, 64 for VL 128, 256, 512 respectively*/
+ n = 1 << (vectlen + 4);
+ break;
+ case T1S8: /* N = 1 */
+ case T1S16: /* N = 2 */
+ n = tuple - T1S8 + 1;
+ break;
+ case T1S:
+ /* N = 4 for 32bit, 8 for 64bit */
+ n = evex_w ? 8 : 4;
+ break;
+ case T1F32:
+ case T1F64:
+ /* N = 4 for 32bit, 8 for 64bit */
+ n = (tuple == T1F32 ? 4 : 8);
+ break;
+ case T2:
+ case T4:
+ case T8:
+ if (vectlen + 7 <= (evex_w + 5) + (tuple - T2 + 1))
+ n = 0;
+ else
+ n = 1 << (tuple - T2 + evex_w + 3);
+ break;
+ case HVM:
+ case QVM:
+ case OVM:
+ n = 1 << (OVM - tuple + vectlen + 1);
+ break;
+ case M128:
+ n = 16;
+ break;
+ case DUP:
+ n = dup_n[vectlen];
+ break;
+
+ default:
+ break;
+ }
+
+ return n;
+}
+
+/*
+ * Check if offset is a multiple of N with corresponding tuple type
+ * if Disp8*N is available, compressed displacement is stored in compdisp
+ */
+bool is_disp8n(operand *input, insn *ins, int8_t *compdisp)
+{
+ int32_t off = input->offset;
+ uint8_t n;
+ int32_t disp8;
+
+ n = get_disp8N(ins);
+
+ if (n && !(off & (n - 1))) {
+ disp8 = off / n;
+ /* if it fits in Disp8 */
+ if (disp8 >= -128 && disp8 <= 127) {
+ *compdisp = disp8;
+ return true;
+ }
+ }
+
+ *compdisp = 0;
+ return false;
+}
diff --git a/x86/iflag.c b/x86/iflag.c
new file mode 100644
index 00000000..a00581d8
--- /dev/null
+++ b/x86/iflag.c
@@ -0,0 +1,270 @@
+/* This file is auto-generated. Don't edit. */
+#include "iflag.h"
+
+/* Global flags referenced from instruction templates */
+const iflag_t insns_flags[263] = {
+ /* 0 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 1 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 2 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 3 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 4 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 5 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 6 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000028),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 7 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 8 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 9 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 10 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 11 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 12 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 13 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000028),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 14 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000018),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 15 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000014),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 16 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000014),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 17 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00400000),UINT32_C(0x00010020) }},
+ /* 18 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000002) }},
+ /* 19 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 20 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000010) }},
+ /* 21 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 22 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 23 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 24 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000028),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 25 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000100),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 26 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000110),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 27 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000110),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 28 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000120),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 29 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 30 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 31 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 32 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 33 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000208),UINT32_C(0x00400000),UINT32_C(0x00000010) }},
+ /* 34 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000010) }},
+ /* 35 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 36 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00010020) }},
+ /* 37 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00010040) }},
+ /* 38 */ {{ UINT32_C(0x00000000),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 39 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000002) }},
+ /* 40 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 41 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 42 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 43 */ {{ UINT32_C(0x00000000),UINT32_C(0x00002000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 44 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000a00),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 45 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000200) }},
+ /* 46 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 47 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000800),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 48 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 49 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000008) }},
+ /* 50 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000008) }},
+ /* 51 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000008) }},
+ /* 52 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000002) }},
+ /* 53 */ {{ UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 54 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000010) }},
+ /* 55 */ {{ UINT32_C(0x00000000),UINT32_C(0x40000011),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 56 */ {{ UINT32_C(0x00000000),UINT32_C(0x40000021),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 57 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00020400) }},
+ /* 58 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00020400) }},
+ /* 59 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00020400) }},
+ /* 60 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00008000) }},
+ /* 61 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 62 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 63 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 64 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000024),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 65 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000004),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 66 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000024),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 67 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000005),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 68 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000004) }},
+ /* 69 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000200) }},
+ /* 70 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000200) }},
+ /* 71 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00020000) }},
+ /* 72 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 73 */ {{ UINT32_C(0x00010000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 74 */ {{ UINT32_C(0x00010000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 75 */ {{ UINT32_C(0x00010000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 76 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000040),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 77 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000040),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 78 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000060),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 79 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000011),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 80 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000021),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 81 */ {{ UINT32_C(0x00010001),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 82 */ {{ UINT32_C(0x00000010),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 83 */ {{ UINT32_C(0x00000400),UINT32_C(0x00001020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 84 */ {{ UINT32_C(0x00000020),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 85 */ {{ UINT32_C(0x00000000),UINT32_C(0x00001020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 86 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 87 */ {{ UINT32_C(0x00000020),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00010020) }},
+ /* 88 */ {{ UINT32_C(0x00000020),UINT32_C(0x00002000),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 89 */ {{ UINT32_C(0x00000001),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00010020) }},
+ /* 90 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00000001) }},
+ /* 91 */ {{ UINT32_C(0x00000a00),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000002) }},
+ /* 92 */ {{ UINT32_C(0x00000a00),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 93 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 94 */ {{ UINT32_C(0x00000a00),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 95 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000002),UINT32_C(0x00000000),UINT32_C(0x00010040) }},
+ /* 96 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 97 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 98 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000100),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 99 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000110),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 100 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000120),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 101 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 102 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000002),UINT32_C(0x00000000),UINT32_C(0x00010010) }},
+ /* 103 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000002),UINT32_C(0x00000000),UINT32_C(0x00000020) }},
+ /* 104 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000001) }},
+ /* 105 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000004) }},
+ /* 106 */ {{ UINT32_C(0x00002006),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 107 */ {{ UINT32_C(0x00002006),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 108 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 109 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00400000),UINT32_C(0x00010010) }},
+ /* 110 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00020040) }},
+ /* 111 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 112 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00020040) }},
+ /* 113 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00400000),UINT32_C(0x00000002) }},
+ /* 114 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 115 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000010) }},
+ /* 116 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 117 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 118 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 119 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000100),UINT32_C(0x00000000),UINT32_C(0x00000008) }},
+ /* 120 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 121 */ {{ UINT32_C(0x00002004),UINT32_C(0x00004000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 122 */ {{ UINT32_C(0x00000000),UINT32_C(0x00005000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 123 */ {{ UINT32_C(0x00001010),UINT32_C(0x00004000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 124 */ {{ UINT32_C(0x00001020),UINT32_C(0x00004020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 125 */ {{ UINT32_C(0x00001010),UINT32_C(0x00004020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 126 */ {{ UINT32_C(0x00000020),UINT32_C(0x00005000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 127 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 128 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004800),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 129 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004820),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 130 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 131 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 132 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 133 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 134 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 135 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 136 */ {{ UINT32_C(0x00000000),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 137 */ {{ UINT32_C(0x00000020),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 138 */ {{ UINT32_C(0x00002004),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 139 */ {{ UINT32_C(0x00002006),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000080) }},
+ /* 140 */ {{ UINT32_C(0x00000000),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 141 */ {{ UINT32_C(0x00000040),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 142 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 143 */ {{ UINT32_C(0x00000020),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 144 */ {{ UINT32_C(0x00000010),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 145 */ {{ UINT32_C(0x00000020),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 146 */ {{ UINT32_C(0x00000000),UINT32_C(0x00008020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 147 */ {{ UINT32_C(0x00000020),UINT32_C(0x00001000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 148 */ {{ UINT32_C(0x00002004),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 149 */ {{ UINT32_C(0x00002004),UINT32_C(0x00008020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 150 */ {{ UINT32_C(0x00002006),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 151 */ {{ UINT32_C(0x00001004),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 152 */ {{ UINT32_C(0x00001020),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 153 */ {{ UINT32_C(0x00001020),UINT32_C(0x00008020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 154 */ {{ UINT32_C(0x00001010),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 155 */ {{ UINT32_C(0x00002005),UINT32_C(0x00008000),UINT32_C(0x00000000),UINT32_C(0x00000100) }},
+ /* 156 */ {{ UINT32_C(0x00000040),UINT32_C(0x00010000),UINT32_C(0x00000000),UINT32_C(0x00000200) }},
+ /* 157 */ {{ UINT32_C(0x00000000),UINT32_C(0x00010000),UINT32_C(0x00000000),UINT32_C(0x00000200) }},
+ /* 158 */ {{ UINT32_C(0x00000000),UINT32_C(0x00020000),UINT32_C(0x00000000),UINT32_C(0x00020000) }},
+ /* 159 */ {{ UINT32_C(0x00000000),UINT32_C(0x00020000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 160 */ {{ UINT32_C(0x00000010),UINT32_C(0x00020010),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 161 */ {{ UINT32_C(0x00000020),UINT32_C(0x00020020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 162 */ {{ UINT32_C(0x00000040),UINT32_C(0x00020010),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 163 */ {{ UINT32_C(0x00000040),UINT32_C(0x00020020),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 164 */ {{ UINT32_C(0x00000020),UINT32_C(0x00041000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 165 */ {{ UINT32_C(0x00000000),UINT32_C(0x00040000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 166 */ {{ UINT32_C(0x00000000),UINT32_C(0x00080000),UINT32_C(0x00000000),UINT32_C(0x00020000) }},
+ /* 167 */ {{ UINT32_C(0x00000020),UINT32_C(0x00080000),UINT32_C(0x00000000),UINT32_C(0x00020000) }},
+ /* 168 */ {{ UINT32_C(0x00000010),UINT32_C(0x00080000),UINT32_C(0x00000000),UINT32_C(0x00020000) }},
+ /* 169 */ {{ UINT32_C(0x00000000),UINT32_C(0x00100000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 170 */ {{ UINT32_C(0x00000000),UINT32_C(0x00100020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 171 */ {{ UINT32_C(0x00000010),UINT32_C(0x00100000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 172 */ {{ UINT32_C(0x00002004),UINT32_C(0x00100000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 173 */ {{ UINT32_C(0x00002004),UINT32_C(0x00100020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 174 */ {{ UINT32_C(0x00000020),UINT32_C(0x00100000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 175 */ {{ UINT32_C(0x00000008),UINT32_C(0x00100000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 176 */ {{ UINT32_C(0x00000000),UINT32_C(0x00200000),UINT32_C(0x00000000),UINT32_C(0x00000000) }},
+ /* 177 */ {{ UINT32_C(0x00000000),UINT32_C(0x00200020),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+ /* 178 */ {{ UINT32_C(0x00000008),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 179 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 180 */ {{ UINT32_C(0x00000020),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00000c00) }},
+ /* 181 */ {{ UINT32_C(0x00000020),UINT32_C(0x00002000),UINT32_C(0x00000000),UINT32_C(0x00010020) }},
+ /* 182 */ {{ UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000800) }},
+ /* 183 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004000),UINT32_C(0x00000000),UINT32_C(0x00001000) }},
+ /* 184 */ {{ UINT32_C(0x00000000),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 185 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00801000),UINT32_C(0x00004000) }},
+ /* 186 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01001040),UINT32_C(0x00004000) }},
+ /* 187 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01001000),UINT32_C(0x00004000) }},
+ /* 188 */ {{ UINT32_C(0x00000040),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 189 */ {{ UINT32_C(0x00000080),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 190 */ {{ UINT32_C(0x00000000),UINT32_C(0x00800020),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 191 */ {{ UINT32_C(0x00000010),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 192 */ {{ UINT32_C(0x00000020),UINT32_C(0x00800020),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 193 */ {{ UINT32_C(0x00000020),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00002000) }},
+ /* 194 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00802000),UINT32_C(0x00004000) }},
+ /* 195 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01002040),UINT32_C(0x00004000) }},
+ /* 196 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01002000),UINT32_C(0x00004000) }},
+ /* 197 */ {{ UINT32_C(0x00000000),UINT32_C(0x02000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 198 */ {{ UINT32_C(0x00000000),UINT32_C(0x00800000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 199 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000001),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 200 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00800000),UINT32_C(0x00020008) }},
+ /* 201 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00800000),UINT32_C(0x00020400) }},
+ /* 202 */ {{ UINT32_C(0x00000000),UINT32_C(0x00400000),UINT32_C(0x00800000),UINT32_C(0x00020000) }},
+ /* 203 */ {{ UINT32_C(0x00000000),UINT32_C(0x01000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 204 */ {{ UINT32_C(0x00000000),UINT32_C(0x20000000),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 205 */ {{ UINT32_C(0x00000000),UINT32_C(0x20000010),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 206 */ {{ UINT32_C(0x00000000),UINT32_C(0x20000020),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 207 */ {{ UINT32_C(0x00000000),UINT32_C(0x20000400),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 208 */ {{ UINT32_C(0x00000000),UINT32_C(0x04000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 209 */ {{ UINT32_C(0x00000000),UINT32_C(0x04000020),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 210 */ {{ UINT32_C(0x00000000),UINT32_C(0x10000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 211 */ {{ UINT32_C(0x00000000),UINT32_C(0x10000020),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 212 */ {{ UINT32_C(0x00000000),UINT32_C(0x08000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 213 */ {{ UINT32_C(0x00000000),UINT32_C(0x08000020),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 214 */ {{ UINT32_C(0x00000000),UINT32_C(0x04000000),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 215 */ {{ UINT32_C(0x00000000),UINT32_C(0x04000020),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 216 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00004000) }},
+ /* 217 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000080),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 218 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 219 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 220 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 221 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000090),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 222 */ {{ UINT32_C(0x00000000),UINT32_C(0x000000a0),UINT32_C(0x00000008),UINT32_C(0x00004000) }},
+ /* 223 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00004000) }},
+ /* 224 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00800000),UINT32_C(0x00004000) }},
+ /* 225 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01000040),UINT32_C(0x00004000) }},
+ /* 226 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01000000),UINT32_C(0x00004000) }},
+ /* 227 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x010000c0),UINT32_C(0x00004000) }},
+ /* 228 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000080),UINT32_C(0x00004000) }},
+ /* 229 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000140),UINT32_C(0x00004000) }},
+ /* 230 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000100),UINT32_C(0x00004000) }},
+ /* 231 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000002),UINT32_C(0x00004000) }},
+ /* 232 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000004),UINT32_C(0x00004000) }},
+ /* 233 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000041),UINT32_C(0x00004000) }},
+ /* 234 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000001),UINT32_C(0x00004000) }},
+ /* 235 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000440),UINT32_C(0x00004000) }},
+ /* 236 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000400),UINT32_C(0x00004000) }},
+ /* 237 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000240),UINT32_C(0x00004000) }},
+ /* 238 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01000200),UINT32_C(0x00004000) }},
+ /* 239 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00004400) }},
+ /* 240 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 241 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000220),UINT32_C(0x00000000),UINT32_C(0x00004400) }},
+ /* 242 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00400000),UINT32_C(0x00004000) }},
+ /* 243 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00024000) }},
+ /* 244 */ {{ UINT32_C(0x00000010),UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00004000) }},
+ /* 245 */ {{ UINT32_C(0x00000020),UINT32_C(0x00000020),UINT32_C(0x00000000),UINT32_C(0x00004400) }},
+ /* 246 */ {{ UINT32_C(0x00000000),UINT32_C(0x00004000),UINT32_C(0x00004000),UINT32_C(0x00004000) }},
+ /* 247 */ {{ UINT32_C(0x00000000),UINT32_C(0x00800000),UINT32_C(0x00804000),UINT32_C(0x00004000) }},
+ /* 248 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01004040),UINT32_C(0x00004000) }},
+ /* 249 */ {{ UINT32_C(0x00000000),UINT32_C(0x80000000),UINT32_C(0x01004000),UINT32_C(0x00004000) }},
+ /* 250 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01008040),UINT32_C(0x00004000) }},
+ /* 251 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01008000),UINT32_C(0x00004000) }},
+ /* 252 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01010040),UINT32_C(0x00004000) }},
+ /* 253 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01010000),UINT32_C(0x00004000) }},
+ /* 254 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01020040),UINT32_C(0x00004000) }},
+ /* 255 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01020000),UINT32_C(0x00004000) }},
+ /* 256 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01040040),UINT32_C(0x00004000) }},
+ /* 257 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x01040000),UINT32_C(0x00004000) }},
+ /* 258 */ {{ UINT32_C(0x00000040),UINT32_C(0x00000000),UINT32_C(0x01080000),UINT32_C(0x00004000) }},
+ /* 259 */ {{ UINT32_C(0x00000040),UINT32_C(0x00000000),UINT32_C(0x01100000),UINT32_C(0x00004000) }},
+ /* 260 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000000),UINT32_C(0x00200000),UINT32_C(0x00004000) }},
+ /* 261 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000200),UINT32_C(0x00000000),UINT32_C(0x00000040) }},
+ /* 262 */ {{ UINT32_C(0x00000000),UINT32_C(0x00000220),UINT32_C(0x00000000),UINT32_C(0x00000400) }},
+};
+
diff --git a/x86/iflaggen.h b/x86/iflaggen.h
new file mode 100644
index 00000000..2f2df77f
--- /dev/null
+++ b/x86/iflaggen.h
@@ -0,0 +1,107 @@
+/* This file is auto-generated. Don't edit. */
+#ifndef NASM_IFLAGGEN_H
+#define NASM_IFLAGGEN_H 1
+
+#define IF_SM 0 /* Size match */
+#define IF_SM2 1 /* Size match first two operands */
+#define IF_SB 2 /* Unsized operands can't be non-byte */
+#define IF_SW 3 /* Unsized operands can't be non-word */
+#define IF_SD 4 /* Unsized operands can't be non-dword */
+#define IF_SQ 5 /* Unsized operands can't be non-qword */
+#define IF_SO 6 /* Unsized operands can't be non-oword */
+#define IF_SY 7 /* Unsized operands can't be non-yword */
+#define IF_SZ 8 /* Unsized operands can't be non-zword */
+#define IF_SIZE 9 /* Unsized operands must match the bitsize */
+#define IF_SX 10 /* Unsized operands not allowed */
+#define IF_AR0 11 /* SB, SW, SD applies to argument 0 */
+#define IF_AR1 12 /* SB, SW, SD applies to argument 1 */
+#define IF_AR2 13 /* SB, SW, SD applies to argument 2 */
+#define IF_AR3 14 /* SB, SW, SD applies to argument 3 */
+#define IF_AR4 15 /* SB, SW, SD applies to argument 4 */
+#define IF_OPT 16 /* Optimizing assembly only */
+ /* 17...31 unused */
+#define IF_PRIV 32 /* Privileged instruction */
+#define IF_SMM 33 /* Only valid in SMM */
+#define IF_PROT 34 /* Protected mode only */
+#define IF_LOCK 35 /* Lockable if operand 0 is memory */
+#define IF_NOLONG 36 /* Not available in long mode */
+#define IF_LONG 37 /* Long mode */
+#define IF_NOHLE 38 /* HLE prefixes forbidden */
+#define IF_MIB 39 /* disassemble with split EA */
+#define IF_BND 40 /* BND (0xF2) prefix available */
+#define IF_UNDOC 41 /* Undocumented */
+#define IF_HLE 42 /* HLE prefixed */
+#define IF_FPU 43 /* FPU */
+#define IF_MMX 44 /* MMX */
+#define IF_3DNOW 45 /* 3DNow! */
+#define IF_SSE 46 /* SSE (KNI, MMX2) */
+#define IF_SSE2 47 /* SSE2 */
+#define IF_SSE3 48 /* SSE3 (PNI) */
+#define IF_VMX 49 /* VMX */
+#define IF_SSSE3 50 /* SSSE3 */
+#define IF_SSE4A 51 /* AMD SSE4a */
+#define IF_SSE41 52 /* SSE4.1 */
+#define IF_SSE42 53 /* SSE4.2 */
+#define IF_SSE5 54 /* SSE5 */
+#define IF_AVX 55 /* AVX (256-bit floating point) */
+#define IF_AVX2 56 /* AVX2 (256-bit integer) */
+#define IF_FMA 57 /* */
+#define IF_BMI1 58 /* */
+#define IF_BMI2 59 /* */
+#define IF_TBM 60 /* */
+#define IF_RTM 61 /* */
+#define IF_INVPCID 62 /* */
+#define IF_AVX512 63 /* AVX-512F (512-bit base architecture) */
+#define IF_AVX512CD 64 /* AVX-512 Conflict Detection */
+#define IF_AVX512ER 65 /* AVX-512 Exponential and Reciprocal */
+#define IF_AVX512PF 66 /* AVX-512 Prefetch */
+#define IF_MPX 67 /* MPX */
+#define IF_SHA 68 /* SHA */
+#define IF_PREFETCHWT1 69 /* PREFETCHWT1 */
+#define IF_AVX512VL 70 /* AVX-512 Vector Length Orthogonality */
+#define IF_AVX512DQ 71 /* AVX-512 Dword and Qword */
+#define IF_AVX512BW 72 /* AVX-512 Byte and Word */
+#define IF_AVX512IFMA 73 /* AVX-512 IFMA instructions */
+#define IF_AVX512VBMI 74 /* AVX-512 VBMI instructions */
+#define IF_AES 75 /* AES instructions */
+#define IF_VAES 76 /* AES AVX instructions */
+#define IF_VPCLMULQDQ 77 /* AVX Carryless Multiplication */
+#define IF_GFNI 78 /* Galois Field instructions */
+#define IF_AVX512VBMI2 79 /* AVX-512 VBMI2 instructions */
+#define IF_AVX512VNNI 80 /* AVX-512 VNNI instructions */
+#define IF_AVX512BITALG 81 /* AVX-512 Bit Algorithm instructions */
+#define IF_AVX512VPOPCNTDQ 82 /* AVX-512 VPOPCNTD/VPOPCNTQ */
+#define IF_AVX5124FMAPS 83 /* AVX-512 4-iteration multiply-add */
+#define IF_AVX5124VNNIW 84 /* AVX-512 4-iteration dot product */
+#define IF_SGX 85 /* Intel Software Guard Extensions (SGX) */
+#define IF_OBSOLETE 86 /* Instruction removed from architecture */
+#define IF_VEX 87 /* VEX or XOP encoded instruction */
+#define IF_EVEX 88 /* EVEX encoded instruction */
+ /* 89...95 unused */
+#define IF_8086 96 /* 8086 */
+#define IF_186 97 /* 186+ */
+#define IF_286 98 /* 286+ */
+#define IF_386 99 /* 386+ */
+#define IF_486 100 /* 486+ */
+#define IF_PENT 101 /* Pentium */
+#define IF_P6 102 /* P6 */
+#define IF_KATMAI 103 /* Katmai */
+#define IF_WILLAMETTE 104 /* Willamette */
+#define IF_PRESCOTT 105 /* Prescott */
+#define IF_X86_64 106 /* x86-64 (long or legacy mode) */
+#define IF_NEHALEM 107 /* Nehalem */
+#define IF_WESTMERE 108 /* Westmere */
+#define IF_SANDYBRIDGE 109 /* Sandy Bridge */
+#define IF_FUTURE 110 /* Future processor (not yet disclosed) */
+#define IF_IA64 111 /* IA64 (in x86 mode) */
+#define IF_CYRIX 112 /* Cyrix-specific */
+#define IF_AMD 113 /* AMD-specific */
+
+#define IF_FIELD_COUNT 4
+typedef struct {
+ uint32_t field[IF_FIELD_COUNT];
+} iflag_t;
+
+extern const iflag_t insns_flags[263];
+
+#endif /* NASM_IFLAGGEN_H */
diff --git a/x86/insns-iflags.ph b/x86/insns-iflags.ph
new file mode 100644
index 00000000..c5311c6c
--- /dev/null
+++ b/x86/insns-iflags.ph
@@ -0,0 +1,288 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2018 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Instruction template flags. These specify which processor
+# targets the instruction is eligible for, whether it is
+# privileged or undocumented, and also specify extra error
+# checking on the matching of the instruction.
+#
+# IF_SM stands for Size Match: any operand whose size is not
+# explicitly specified by the template is `really' intended to be
+# the same size as the first size-specified operand.
+# Non-specification is tolerated in the input instruction, but
+# _wrong_ specification is not.
+#
+# IF_SM2 invokes Size Match on only the first _two_ operands, for
+# three-operand instructions such as SHLD: it implies that the
+# first two operands must match in size, but that the third is
+# required to be _unspecified_.
+#
+# IF_SB invokes Size Byte: operands with unspecified size in the
+# template are really bytes, and so no non-byte specification in
+# the input instruction will be tolerated. IF_SW similarly invokes
+# Size Word, and IF_SD invokes Size Doubleword.
+#
+# (The default state if neither IF_SM nor IF_SM2 is specified is
+# that any operand with unspecified size in the template is
+# required to have unspecified size in the instruction too...)
+#
+# iflag_t is defined to store these flags.
+#
+# The order does matter here. We use some predefined masks to quick test
+# for a set of flags, so be careful moving bits (and
+# don't forget to update C code generation then).
+#
+sub dword_align($) {
+ my($n) = @_;
+
+ $$n = ($$n + 31) & ~31;
+ return $n;
+}
+
+my $f = 0;
+my %insns_flag_bit = (
+ #
+ # dword bound, index 0 - specific flags
+ #
+ "SM" => [$f++, "Size match"],
+ "SM2" => [$f++, "Size match first two operands"],
+ "SB" => [$f++, "Unsized operands can't be non-byte"],
+ "SW" => [$f++, "Unsized operands can't be non-word"],
+ "SD" => [$f++, "Unsized operands can't be non-dword"],
+ "SQ" => [$f++, "Unsized operands can't be non-qword"],
+ "SO" => [$f++, "Unsized operands can't be non-oword"],
+ "SY" => [$f++, "Unsized operands can't be non-yword"],
+ "SZ" => [$f++, "Unsized operands can't be non-zword"],
+ "SIZE" => [$f++, "Unsized operands must match the bitsize"],
+ "SX" => [$f++, "Unsized operands not allowed"],
+ "AR0" => [$f++, "SB, SW, SD applies to argument 0"],
+ "AR1" => [$f++, "SB, SW, SD applies to argument 1"],
+ "AR2" => [$f++, "SB, SW, SD applies to argument 2"],
+ "AR3" => [$f++, "SB, SW, SD applies to argument 3"],
+ "AR4" => [$f++, "SB, SW, SD applies to argument 4"],
+ "OPT" => [$f++, "Optimizing assembly only"],
+
+ #
+ # dword bound - instruction filtering flags
+ #
+ "PRIV" => [${dword_align(\$f)}++, "Privileged instruction"],
+ "SMM" => [$f++, "Only valid in SMM"],
+ "PROT" => [$f++, "Protected mode only"],
+ "LOCK" => [$f++, "Lockable if operand 0 is memory"],
+ "NOLONG" => [$f++, "Not available in long mode"],
+ "LONG" => [$f++, "Long mode"],
+ "NOHLE" => [$f++, "HLE prefixes forbidden"],
+ "MIB" => [$f++, "disassemble with split EA"],
+ "BND" => [$f++, "BND (0xF2) prefix available"],
+ "UNDOC" => [$f++, "Undocumented"],
+ "HLE" => [$f++, "HLE prefixed"],
+ "FPU" => [$f++, "FPU"],
+ "MMX" => [$f++, "MMX"],
+ "3DNOW" => [$f++, "3DNow!"],
+ "SSE" => [$f++, "SSE (KNI, MMX2)"],
+ "SSE2" => [$f++, "SSE2"],
+ "SSE3" => [$f++, "SSE3 (PNI)"],
+ "VMX" => [$f++, "VMX"],
+ "SSSE3" => [$f++, "SSSE3"],
+ "SSE4A" => [$f++, "AMD SSE4a"],
+ "SSE41" => [$f++, "SSE4.1"],
+ "SSE42" => [$f++, "SSE4.2"],
+ "SSE5" => [$f++, "SSE5"],
+ "AVX" => [$f++, "AVX (256-bit floating point)"],
+ "AVX2" => [$f++, "AVX2 (256-bit integer)"],
+ "FMA" => [$f++, ""],
+ "BMI1" => [$f++, ""],
+ "BMI2" => [$f++, ""],
+ "TBM" => [$f++, ""],
+ "RTM" => [$f++, ""],
+ "INVPCID" => [$f++, ""],
+ "AVX512" => [$f++, "AVX-512F (512-bit base architecture)"],
+ "AVX512CD" => [$f++, "AVX-512 Conflict Detection"],
+ "AVX512ER" => [$f++, "AVX-512 Exponential and Reciprocal"],
+ "AVX512PF" => [$f++, "AVX-512 Prefetch"],
+ "MPX" => [$f++, "MPX"],
+ "SHA" => [$f++, "SHA"],
+ "PREFETCHWT1" => [$f++, "PREFETCHWT1"],
+ "AVX512VL" => [$f++, "AVX-512 Vector Length Orthogonality"],
+ "AVX512DQ" => [$f++, "AVX-512 Dword and Qword"],
+ "AVX512BW" => [$f++, "AVX-512 Byte and Word"],
+ "AVX512IFMA" => [$f++, "AVX-512 IFMA instructions"],
+ "AVX512VBMI" => [$f++, "AVX-512 VBMI instructions"],
+ "AES" => [$f++, "AES instructions"],
+ "VAES" => [$f++, "AES AVX instructions"],
+ "VPCLMULQDQ" => [$f++, "AVX Carryless Multiplication"],
+ "GFNI" => [$f++, "Galois Field instructions"],
+ "AVX512VBMI2" => [$f++, "AVX-512 VBMI2 instructions"],
+ "AVX512VNNI" => [$f++, "AVX-512 VNNI instructions"],
+ "AVX512BITALG" => [$f++, "AVX-512 Bit Algorithm instructions"],
+ "AVX512VPOPCNTDQ" => [$f++, "AVX-512 VPOPCNTD/VPOPCNTQ"],
+ "AVX5124FMAPS" => [$f++, "AVX-512 4-iteration multiply-add"],
+ "AVX5124VNNIW" => [$f++, "AVX-512 4-iteration dot product"],
+ "SGX" => [$f++, "Intel Software Guard Extensions (SGX)"],
+
+ # Put these last
+ "OBSOLETE" => [$f++, "Instruction removed from architecture"],
+ "VEX" => [$f++, "VEX or XOP encoded instruction"],
+ "EVEX" => [$f++, "EVEX encoded instruction"],
+
+ #
+ # dword bound - cpu type flags
+ #
+ # The CYRIX and AMD flags should have the highest bit values; the
+ # disassembler selection algorithm depends on it.
+ #
+ "8086" => [${dword_align(\$f)}++, "8086"],
+ "186" => [$f++, "186+"],
+ "286" => [$f++, "286+"],
+ "386" => [$f++, "386+"],
+ "486" => [$f++, "486+"],
+ "PENT" => [$f++, "Pentium"],
+ "P6" => [$f++, "P6"],
+ "KATMAI" => [$f++, "Katmai"],
+ "WILLAMETTE" => [$f++, "Willamette"],
+ "PRESCOTT" => [$f++, "Prescott"],
+ "X86_64" => [$f++, "x86-64 (long or legacy mode)"],
+ "NEHALEM" => [$f++, "Nehalem"],
+ "WESTMERE" => [$f++, "Westmere"],
+ "SANDYBRIDGE" => [$f++, "Sandy Bridge"],
+ "FUTURE" => [$f++, "Future processor (not yet disclosed)"],
+ "IA64" => [$f++, "IA64 (in x86 mode)"],
+
+ # Put these last
+ "CYRIX" => [$f++, "Cyrix-specific"],
+ "AMD" => [$f++, "AMD-specific"],
+);
+
+my %insns_flag_hash = ();
+my @insns_flag_values = ();
+my $iflag_words;
+
+sub get_flag_words() {
+ my $max = -1;
+
+ foreach my $vp (values(%insns_flag_bit)) {
+ if ($vp->[0] > $max) {
+ $max = $vp->[0];
+ }
+ }
+
+ return int($max/32)+1;
+}
+
+sub insns_flag_index(@) {
+ return undef if $_[0] eq "ignore";
+
+ my @prekey = sort(@_);
+ my $key = join("", @prekey);
+
+ if (not defined($insns_flag_hash{$key})) {
+ my @newkey = (0) x $iflag_words;
+
+ for my $i (@prekey) {
+ die "No key for $i\n" if not defined($insns_flag_bit{$i});
+ $newkey[$insns_flag_bit{$i}[0]/32] |=
+ (1 << ($insns_flag_bit{$i}[0] % 32));
+ }
+
+ my $str = join(',', map { sprintf("UINT32_C(0x%08x)",$_) } @newkey);
+
+ push @insns_flag_values, $str;
+ $insns_flag_hash{$key} = $#insns_flag_values;
+ }
+
+ return $insns_flag_hash{$key};
+}
+
+sub write_iflaggen_h() {
+ print STDERR "Writing $oname...\n";
+
+ open(N, '>', $oname) or die "$0: $!\n";
+
+ print N "/* This file is auto-generated. Don't edit. */\n";
+ print N "#ifndef NASM_IFLAGGEN_H\n";
+ print N "#define NASM_IFLAGGEN_H 1\n\n";
+
+ my @flagnames = keys(%insns_flag_bit);
+ @flagnames = sort {
+ $insns_flag_bit{$a}->[0] <=> $insns_flag_bit{$b}->[0]
+ } @flagnames;
+ my $next = 0;
+ foreach my $key (@flagnames) {
+ my $v = $insns_flag_bit{$key};
+ if ($v->[0] > $next) {
+ printf N "%-31s /* %-64s */\n", '',
+ ($next != $v->[0]-1) ?
+ sprintf("%d...%d unused", $next, $v->[0]-1) :
+ sprintf("%d unused", $next);
+ }
+ print N sprintf("#define IF_%-16s %3d /* %-64s */\n",
+ $key, $v->[0], $v->[1]);
+ $next = $v->[0] + 1;
+ }
+
+ print N "\n";
+ printf N "#define IF_FIELD_COUNT %d\n", $iflag_words;
+ print N "typedef struct {\n";
+ print N " uint32_t field[IF_FIELD_COUNT];\n";
+ print N "} iflag_t;\n";
+
+ print N "\n";
+ printf N "extern const iflag_t insns_flags[%d];\n\n",
+ $#insns_flag_values + 1;
+
+ print N "#endif /* NASM_IFLAGGEN_H */\n";
+ close N;
+}
+
+sub write_iflag_c() {
+ print STDERR "Writing $oname...\n";
+
+ open(N, '>', $oname) or die "$0: $!\n";
+
+ print N "/* This file is auto-generated. Don't edit. */\n";
+ print N "#include \"iflag.h\"\n\n";
+ print N "/* Global flags referenced from instruction templates */\n";
+ printf N "const iflag_t insns_flags[%d] = {\n",
+ $#insns_flag_values + 1;
+ foreach my $i (0 .. $#insns_flag_values) {
+ print N sprintf(" /* %4d */ {{ %s }},\n", $i, $insns_flag_values[$i]);
+ }
+ print N "};\n\n";
+ close N;
+}
+
+$iflag_words = get_flag_words();
+
+1;
diff --git a/x86/insns.dat b/x86/insns.dat
new file mode 100644
index 00000000..e9e45567
--- /dev/null
+++ b/x86/insns.dat
@@ -0,0 +1,5543 @@
+;; --------------------------------------------------------------------------
+;;
+;; Copyright 1996-2018 The NASM Authors - All Rights Reserved
+;; See the file AUTHORS included with the NASM distribution for
+;; the specific copyright holders.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following
+;; conditions are met:
+;;
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * 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 COPYRIGHT OWNER 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.
+;;
+;; --------------------------------------------------------------------------
+
+;
+; insns.dat table of instructions for the Netwide Assembler
+;
+; Format of file: All four fields must be present on every functional
+; line. Hence `void' for no-operand instructions, and `\0' for such
+; as EQU. If the last three fields are all `ignore', no action is
+; taken except to register the opcode as being present.
+;
+; For a detailed description of the code string (third field), please
+; see insns.pl and the comment at the top of assemble.c. For a detailed
+; description of the flags (fourth field), please see insns-iflags.ph.
+;
+; Comments with a pound sign after the semicolon generate section
+; subheaders in the NASM documentation.
+;
+
+;# Special instructions (pseudo-ops)
+; These MUST be first in this file and must maintain the pattern of
+; Dx by size, RESx by size, and INCBIN in that order.
+DB ignore ignore ignore
+DW ignore ignore ignore
+DD ignore ignore ignore
+DQ ignore ignore ignore
+DT ignore ignore ignore
+DO ignore ignore ignore
+DY ignore ignore ignore
+DZ ignore ignore ignore
+RESB imm [ resb] 8086
+RESW ignore ignore ignore
+RESD ignore ignore ignore
+RESQ ignore ignore ignore
+REST ignore ignore ignore
+RESO ignore ignore ignore
+RESY ignore ignore ignore
+RESZ ignore ignore ignore
+INCBIN ignore ignore ignore
+
+;# Conventional instructions
+AAA void [ 37] 8086,NOLONG
+AAD void [ d5 0a] 8086,NOLONG
+AAD imm [i: d5 ib,u] 8086,SB,NOLONG
+AAM void [ d4 0a] 8086,NOLONG
+AAM imm [i: d4 ib,u] 8086,SB,NOLONG
+AAS void [ 3f] 8086,NOLONG
+ADC mem,reg8 [mr: hle 10 /r] 8086,SM,LOCK
+ADC reg8,reg8 [mr: 10 /r] 8086
+ADC mem,reg16 [mr: hle o16 11 /r] 8086,SM,LOCK
+ADC reg16,reg16 [mr: o16 11 /r] 8086
+ADC mem,reg32 [mr: hle o32 11 /r] 386,SM,LOCK
+ADC reg32,reg32 [mr: o32 11 /r] 386
+ADC mem,reg64 [mr: hle o64 11 /r] X64,SM,LOCK
+ADC reg64,reg64 [mr: o64 11 /r] X64
+ADC reg8,mem [rm: 12 /r] 8086,SM
+ADC reg8,reg8 [rm: 12 /r] 8086
+ADC reg16,mem [rm: o16 13 /r] 8086,SM
+ADC reg16,reg16 [rm: o16 13 /r] 8086
+ADC reg32,mem [rm: o32 13 /r] 386,SM
+ADC reg32,reg32 [rm: o32 13 /r] 386
+ADC reg64,mem [rm: o64 13 /r] X64,SM
+ADC reg64,reg64 [rm: o64 13 /r] X64
+ADC rm16,imm8 [mi: hle o16 83 /2 ib,s] 8086,LOCK
+ADC rm32,imm8 [mi: hle o32 83 /2 ib,s] 386,LOCK
+ADC rm64,imm8 [mi: hle o64 83 /2 ib,s] X64,LOCK
+ADC reg_al,imm [-i: 14 ib] 8086,SM
+ADC reg_ax,sbyteword [mi: o16 83 /2 ib,s] 8086,SM,ND
+ADC reg_ax,imm [-i: o16 15 iw] 8086,SM
+ADC reg_eax,sbytedword [mi: o32 83 /2 ib,s] 386,SM,ND
+ADC reg_eax,imm [-i: o32 15 id] 386,SM
+ADC reg_rax,sbytedword [mi: o64 83 /2 ib,s] X64,SM,ND
+ADC reg_rax,imm [-i: o64 15 id,s] X64,SM
+ADC rm8,imm [mi: hle 80 /2 ib] 8086,SM,LOCK
+ADC rm16,sbyteword [mi: hle o16 83 /2 ib,s] 8086,SM,LOCK,ND
+ADC rm16,imm [mi: hle o16 81 /2 iw] 8086,SM,LOCK
+ADC rm32,sbytedword [mi: hle o32 83 /2 ib,s] 386,SM,LOCK,ND
+ADC rm32,imm [mi: hle o32 81 /2 id] 386,SM,LOCK
+ADC rm64,sbytedword [mi: hle o64 83 /2 ib,s] X64,SM,LOCK,ND
+ADC rm64,imm [mi: hle o64 81 /2 id,s] X64,SM,LOCK
+ADC mem,imm8 [mi: hle 80 /2 ib] 8086,SM,LOCK,ND
+ADC mem,sbyteword16 [mi: hle o16 83 /2 ib,s] 8086,SM,LOCK,ND
+ADC mem,imm16 [mi: hle o16 81 /2 iw] 8086,SM,LOCK
+ADC mem,sbytedword32 [mi: hle o32 83 /2 ib,s] 386,SM,LOCK,ND
+ADC mem,imm32 [mi: hle o32 81 /2 id] 386,SM,LOCK
+ADC rm8,imm [mi: hle 82 /2 ib] 8086,SM,LOCK,ND,NOLONG
+ADD mem,reg8 [mr: hle 00 /r] 8086,SM,LOCK
+ADD reg8,reg8 [mr: 00 /r] 8086
+ADD mem,reg16 [mr: hle o16 01 /r] 8086,SM,LOCK
+ADD reg16,reg16 [mr: o16 01 /r] 8086
+ADD mem,reg32 [mr: hle o32 01 /r] 386,SM,LOCK
+ADD reg32,reg32 [mr: o32 01 /r] 386
+ADD mem,reg64 [mr: hle o64 01 /r] X64,SM,LOCK
+ADD reg64,reg64 [mr: o64 01 /r] X64
+ADD reg8,mem [rm: 02 /r] 8086,SM
+ADD reg8,reg8 [rm: 02 /r] 8086
+ADD reg16,mem [rm: o16 03 /r] 8086,SM
+ADD reg16,reg16 [rm: o16 03 /r] 8086
+ADD reg32,mem [rm: o32 03 /r] 386,SM
+ADD reg32,reg32 [rm: o32 03 /r] 386
+ADD reg64,mem [rm: o64 03 /r] X64,SM
+ADD reg64,reg64 [rm: o64 03 /r] X64
+ADD rm16,imm8 [mi: hle o16 83 /0 ib,s] 8086,LOCK
+ADD rm32,imm8 [mi: hle o32 83 /0 ib,s] 386,LOCK
+ADD rm64,imm8 [mi: hle o64 83 /0 ib,s] X64,LOCK
+ADD reg_al,imm [-i: 04 ib] 8086,SM
+ADD reg_ax,sbyteword [mi: o16 83 /0 ib,s] 8086,SM,ND
+ADD reg_ax,imm [-i: o16 05 iw] 8086,SM
+ADD reg_eax,sbytedword [mi: o32 83 /0 ib,s] 386,SM,ND
+ADD reg_eax,imm [-i: o32 05 id] 386,SM
+ADD reg_rax,sbytedword [mi: o64 83 /0 ib,s] X64,SM,ND
+ADD reg_rax,imm [-i: o64 05 id,s] X64,SM
+ADD rm8,imm [mi: hle 80 /0 ib] 8086,SM,LOCK
+ADD rm16,sbyteword [mi: hle o16 83 /0 ib,s] 8086,SM,LOCK,ND
+ADD rm16,imm [mi: hle o16 81 /0 iw] 8086,SM,LOCK
+ADD rm32,sbytedword [mi: hle o32 83 /0 ib,s] 386,SM,LOCK,ND
+ADD rm32,imm [mi: hle o32 81 /0 id] 386,SM,LOCK
+ADD rm64,sbytedword [mi: hle o64 83 /0 ib,s] X64,SM,LOCK,ND
+ADD rm64,imm [mi: hle o64 81 /0 id,s] X64,SM,LOCK
+ADD mem,imm8 [mi: hle 80 /0 ib] 8086,SM,LOCK
+ADD mem,sbyteword16 [mi: hle o16 83 /0 ib,s] 8086,SM,LOCK,ND
+ADD mem,imm16 [mi: hle o16 81 /0 iw] 8086,SM,LOCK
+ADD mem,sbytedword32 [mi: hle o32 83 /0 ib,s] 386,SM,LOCK,ND
+ADD mem,imm32 [mi: hle o32 81 /0 id] 386,SM,LOCK
+ADD rm8,imm [mi: hle 82 /0 ib] 8086,SM,LOCK,ND,NOLONG
+AND mem,reg8 [mr: hle 20 /r] 8086,SM,LOCK
+AND reg8,reg8 [mr: 20 /r] 8086
+AND mem,reg16 [mr: hle o16 21 /r] 8086,SM,LOCK
+AND reg16,reg16 [mr: o16 21 /r] 8086
+AND mem,reg32 [mr: hle o32 21 /r] 386,SM,LOCK
+AND reg32,reg32 [mr: o32 21 /r] 386
+AND mem,reg64 [mr: hle o64 21 /r] X64,SM,LOCK
+AND reg64,reg64 [mr: o64 21 /r] X64
+AND reg8,mem [rm: 22 /r] 8086,SM
+AND reg8,reg8 [rm: 22 /r] 8086
+AND reg16,mem [rm: o16 23 /r] 8086,SM
+AND reg16,reg16 [rm: o16 23 /r] 8086
+AND reg32,mem [rm: o32 23 /r] 386,SM
+AND reg32,reg32 [rm: o32 23 /r] 386
+AND reg64,mem [rm: o64 23 /r] X64,SM
+AND reg64,reg64 [rm: o64 23 /r] X64
+AND rm16,imm8 [mi: hle o16 83 /4 ib,s] 8086,LOCK
+AND rm32,imm8 [mi: hle o32 83 /4 ib,s] 386,LOCK
+AND rm64,imm8 [mi: hle o64 83 /4 ib,s] X64,LOCK
+AND reg_al,imm [-i: 24 ib] 8086,SM
+AND reg_ax,sbyteword [mi: o16 83 /4 ib,s] 8086,SM,ND
+AND reg_ax,imm [-i: o16 25 iw] 8086,SM
+AND reg_eax,sbytedword [mi: o32 83 /4 ib,s] 386,SM,ND
+AND reg_eax,imm [-i: o32 25 id] 386,SM
+AND reg_rax,sbytedword [mi: o64 83 /4 ib,s] X64,SM,ND
+AND reg_rax,imm [-i: o64 25 id,s] X64,SM
+AND rm8,imm [mi: hle 80 /4 ib] 8086,SM,LOCK
+AND rm16,sbyteword [mi: hle o16 83 /4 ib,s] 8086,SM,LOCK,ND
+AND rm16,imm [mi: hle o16 81 /4 iw] 8086,SM,LOCK
+AND rm32,sbytedword [mi: hle o32 83 /4 ib,s] 386,SM,LOCK,ND
+AND rm32,imm [mi: hle o32 81 /4 id] 386,SM,LOCK
+AND rm64,sbytedword [mi: hle o64 83 /4 ib,s] X64,SM,LOCK,ND
+AND rm64,imm [mi: hle o64 81 /4 id,s] X64,SM,LOCK
+AND mem,imm8 [mi: hle 80 /4 ib] 8086,SM,LOCK
+AND mem,sbyteword16 [mi: hle o16 83 /4 ib,s] 8086,SM,LOCK,ND
+AND mem,imm16 [mi: hle o16 81 /4 iw] 8086,SM,LOCK
+AND mem,sbytedword32 [mi: hle o32 83 /4 ib,s] 386,SM,LOCK,ND
+AND mem,imm32 [mi: hle o32 81 /4 id] 386,SM,LOCK
+AND rm8,imm [mi: hle 82 /4 ib] 8086,SM,LOCK,ND,NOLONG
+ARPL mem,reg16 [mr: 63 /r] 286,PROT,SM,NOLONG
+ARPL reg16,reg16 [mr: 63 /r] 286,PROT,NOLONG
+BB0_RESET void [ 0f 3a] PENT,CYRIX,ND,OBSOLETE
+BB1_RESET void [ 0f 3b] PENT,CYRIX,ND,OBSOLETE
+BOUND reg16,mem [rm: o16 62 /r] 186,NOLONG
+BOUND reg32,mem [rm: o32 62 /r] 386,NOLONG
+BSF reg16,mem [rm: o16 nof3 0f bc /r] 386,SM
+BSF reg16,reg16 [rm: o16 nof3 0f bc /r] 386
+BSF reg32,mem [rm: o32 nof3 0f bc /r] 386,SM
+BSF reg32,reg32 [rm: o32 nof3 0f bc /r] 386
+BSF reg64,mem [rm: o64 nof3 0f bc /r] X64,SM
+BSF reg64,reg64 [rm: o64 nof3 0f bc /r] X64
+BSR reg16,mem [rm: o16 nof3 0f bd /r] 386,SM
+BSR reg16,reg16 [rm: o16 nof3 0f bd /r] 386
+BSR reg32,mem [rm: o32 nof3 0f bd /r] 386,SM
+BSR reg32,reg32 [rm: o32 nof3 0f bd /r] 386
+BSR reg64,mem [rm: o64 nof3 0f bd /r] X64,SM
+BSR reg64,reg64 [rm: o64 nof3 0f bd /r] X64
+BSWAP reg32 [r: o32 0f c8+r] 486
+BSWAP reg64 [r: o64 0f c8+r] X64
+BT mem,reg16 [mr: o16 0f a3 /r] 386,SM
+BT reg16,reg16 [mr: o16 0f a3 /r] 386
+BT mem,reg32 [mr: o32 0f a3 /r] 386,SM
+BT reg32,reg32 [mr: o32 0f a3 /r] 386
+BT mem,reg64 [mr: o64 0f a3 /r] X64,SM
+BT reg64,reg64 [mr: o64 0f a3 /r] X64
+BT rm16,imm [mi: o16 0f ba /4 ib,u] 386,SB
+BT rm32,imm [mi: o32 0f ba /4 ib,u] 386,SB
+BT rm64,imm [mi: o64 0f ba /4 ib,u] X64,SB
+BTC mem,reg16 [mr: hle o16 0f bb /r] 386,SM,LOCK
+BTC reg16,reg16 [mr: o16 0f bb /r] 386
+BTC mem,reg32 [mr: hle o32 0f bb /r] 386,SM,LOCK
+BTC reg32,reg32 [mr: o32 0f bb /r] 386
+BTC mem,reg64 [mr: hle o64 0f bb /r] X64,SM,LOCK
+BTC reg64,reg64 [mr: o64 0f bb /r] X64
+BTC rm16,imm [mi: hle o16 0f ba /7 ib,u] 386,SB,LOCK
+BTC rm32,imm [mi: hle o32 0f ba /7 ib,u] 386,SB,LOCK
+BTC rm64,imm [mi: hle o64 0f ba /7 ib,u] X64,SB,LOCK
+BTR mem,reg16 [mr: hle o16 0f b3 /r] 386,SM,LOCK
+BTR reg16,reg16 [mr: o16 0f b3 /r] 386
+BTR mem,reg32 [mr: hle o32 0f b3 /r] 386,SM,LOCK
+BTR reg32,reg32 [mr: o32 0f b3 /r] 386
+BTR mem,reg64 [mr: hle o64 0f b3 /r] X64,SM,LOCK
+BTR reg64,reg64 [mr: o64 0f b3 /r] X64
+BTR rm16,imm [mi: hle o16 0f ba /6 ib,u] 386,SB,LOCK
+BTR rm32,imm [mi: hle o32 0f ba /6 ib,u] 386,SB,LOCK
+BTR rm64,imm [mi: hle o64 0f ba /6 ib,u] X64,SB,LOCK
+BTS mem,reg16 [mr: hle o16 0f ab /r] 386,SM,LOCK
+BTS reg16,reg16 [mr: o16 0f ab /r] 386
+BTS mem,reg32 [mr: hle o32 0f ab /r] 386,SM,LOCK
+BTS reg32,reg32 [mr: o32 0f ab /r] 386
+BTS mem,reg64 [mr: hle o64 0f ab /r] X64,SM,LOCK
+BTS reg64,reg64 [mr: o64 0f ab /r] X64
+BTS rm16,imm [mi: hle o16 0f ba /5 ib,u] 386,SB,LOCK
+BTS rm32,imm [mi: hle o32 0f ba /5 ib,u] 386,SB,LOCK
+BTS rm64,imm [mi: hle o64 0f ba /5 ib,u] X64,SB,LOCK
+CALL imm [i: odf e8 rel] 8086,BND
+CALL imm|near [i: odf e8 rel] 8086,ND,BND
+CALL imm|far [i: odf 9a iwd seg] 8086,ND,NOLONG
+; Call/jmp near imm/reg/mem is always 64-bit in long mode.
+CALL imm16 [i: o16 e8 rel] 8086,NOLONG,BND
+CALL imm16|near [i: o16 e8 rel] 8086,ND,NOLONG,BND
+CALL imm16|far [i: o16 9a iwd seg] 8086,ND,NOLONG
+CALL imm32 [i: o32 e8 rel] 386,NOLONG,BND
+CALL imm32|near [i: o32 e8 rel] 386,ND,NOLONG,BND
+CALL imm32|far [i: o32 9a iwd seg] 386,ND,NOLONG
+CALL imm64 [i: o64nw e8 rel] X64,BND
+CALL imm64|near [i: o64nw e8 rel] X64,ND,BND
+CALL imm:imm [ji: odf 9a iwd iw] 8086,NOLONG
+CALL imm16:imm [ji: o16 9a iw iw] 8086,NOLONG
+CALL imm:imm16 [ji: o16 9a iw iw] 8086,NOLONG
+CALL imm32:imm [ji: o32 9a id iw] 386,NOLONG
+CALL imm:imm32 [ji: o32 9a id iw] 386,NOLONG
+CALL mem|far [m: odf ff /3] 8086,NOLONG
+CALL mem|far [m: o64 ff /3] X64
+CALL mem16|far [m: o16 ff /3] 8086
+CALL mem32|far [m: o32 ff /3] 386
+CALL mem64|far [m: o64 ff /3] X64
+CALL mem|near [m: odf ff /2] 8086,ND,BND
+CALL rm16|near [m: o16 ff /2] 8086,NOLONG,ND,BND
+CALL rm32|near [m: o32 ff /2] 386,NOLONG,ND,BND
+CALL rm64|near [m: o64nw ff /2] X64,ND,BND
+CALL mem [m: odf ff /2] 8086,BND
+CALL rm16 [m: o16 ff /2] 8086,NOLONG,BND
+CALL rm32 [m: o32 ff /2] 386,NOLONG,BND
+CALL rm64 [m: o64nw ff /2] X64,BND
+
+CBW void [ o16 98] 8086
+CDQ void [ o32 99] 386
+CDQE void [ o64 98] X64
+CLC void [ f8] 8086
+CLD void [ fc] 8086
+CLI void [ fa] 8086
+CLTS void [ 0f 06] 286,PRIV
+CMC void [ f5] 8086
+CMP mem,reg8 [mr: 38 /r] 8086,SM
+CMP reg8,reg8 [mr: 38 /r] 8086
+CMP mem,reg16 [mr: o16 39 /r] 8086,SM
+CMP reg16,reg16 [mr: o16 39 /r] 8086
+CMP mem,reg32 [mr: o32 39 /r] 386,SM
+CMP reg32,reg32 [mr: o32 39 /r] 386
+CMP mem,reg64 [mr: o64 39 /r] X64,SM
+CMP reg64,reg64 [mr: o64 39 /r] X64
+CMP reg8,mem [rm: 3a /r] 8086,SM
+CMP reg8,reg8 [rm: 3a /r] 8086
+CMP reg16,mem [rm: o16 3b /r] 8086,SM
+CMP reg16,reg16 [rm: o16 3b /r] 8086
+CMP reg32,mem [rm: o32 3b /r] 386,SM
+CMP reg32,reg32 [rm: o32 3b /r] 386
+CMP reg64,mem [rm: o64 3b /r] X64,SM
+CMP reg64,reg64 [rm: o64 3b /r] X64
+CMP rm16,imm8 [mi: o16 83 /7 ib,s] 8086
+CMP rm32,imm8 [mi: o32 83 /7 ib,s] 386
+CMP rm64,imm8 [mi: o64 83 /7 ib,s] X64
+CMP reg_al,imm [-i: 3c ib] 8086,SM
+CMP reg_ax,sbyteword [mi: o16 83 /7 ib,s] 8086,SM,ND
+CMP reg_ax,imm [-i: o16 3d iw] 8086,SM
+CMP reg_eax,sbytedword [mi: o32 83 /7 ib,s] 386,SM,ND
+CMP reg_eax,imm [-i: o32 3d id] 386,SM
+CMP reg_rax,sbytedword [mi: o64 83 /7 ib,s] X64,SM,ND
+CMP reg_rax,imm [-i: o64 3d id,s] X64,SM
+CMP rm8,imm [mi: 80 /7 ib] 8086,SM
+CMP rm16,sbyteword [mi: o16 83 /7 ib,s] 8086,SM,ND
+CMP rm16,imm [mi: o16 81 /7 iw] 8086,SM
+CMP rm32,sbytedword [mi: o32 83 /7 ib,s] 386,SM,ND
+CMP rm32,imm [mi: o32 81 /7 id] 386,SM
+CMP rm64,sbytedword [mi: o64 83 /7 ib,s] X64,SM,ND
+CMP rm64,imm [mi: o64 81 /7 id,s] X64,SM
+CMP mem,imm8 [mi: 80 /7 ib] 8086,SM
+CMP mem,sbyteword16 [mi: o16 83 /7 ib,s] 8086,SM,ND
+CMP mem,imm16 [mi: o16 81 /7 iw] 8086,SM
+CMP mem,sbytedword32 [mi: o32 83 /7 ib,s] 386,SM,ND
+CMP mem,imm32 [mi: o32 81 /7 id] 386,SM
+CMP rm8,imm [mi: 82 /7 ib] 8086,SM,ND,NOLONG
+CMPSB void [ repe a6] 8086
+CMPSD void [ repe o32 a7] 386
+CMPSQ void [ repe o64 a7] X64
+CMPSW void [ repe o16 a7] 8086
+CMPXCHG mem,reg8 [mr: hle 0f b0 /r] PENT,SM,LOCK
+CMPXCHG reg8,reg8 [mr: 0f b0 /r] PENT
+CMPXCHG mem,reg16 [mr: hle o16 0f b1 /r] PENT,SM,LOCK
+CMPXCHG reg16,reg16 [mr: o16 0f b1 /r] PENT
+CMPXCHG mem,reg32 [mr: hle o32 0f b1 /r] PENT,SM,LOCK
+CMPXCHG reg32,reg32 [mr: o32 0f b1 /r] PENT
+CMPXCHG mem,reg64 [mr: hle o64 0f b1 /r] X64,SM,LOCK
+CMPXCHG reg64,reg64 [mr: o64 0f b1 /r] X64
+CMPXCHG486 mem,reg8 [mr: 0f a6 /r] 486,SM,UNDOC,ND,LOCK,OBSOLETE
+CMPXCHG486 reg8,reg8 [mr: 0f a6 /r] 486,UNDOC,ND,OBSOLETE
+CMPXCHG486 mem,reg16 [mr: o16 0f a7 /r] 486,SM,UNDOC,ND,LOCK,OBSOLETE
+CMPXCHG486 reg16,reg16 [mr: o16 0f a7 /r] 486,UNDOC,ND,OBSOLETE
+CMPXCHG486 mem,reg32 [mr: o32 0f a7 /r] 486,SM,UNDOC,ND,LOCK,OBSOLETE
+CMPXCHG486 reg32,reg32 [mr: o32 0f a7 /r] 486,UNDOC,ND,OBSOLETE
+CMPXCHG8B mem [m: hle norexw 0f c7 /1] PENT,LOCK
+CMPXCHG16B mem [m: o64 0f c7 /1] X64,LOCK
+CPUID void [ 0f a2] PENT
+CPU_READ void [ 0f 3d] PENT,CYRIX
+CPU_WRITE void [ 0f 3c] PENT,CYRIX
+CQO void [ o64 99] X64
+CWD void [ o16 99] 8086
+CWDE void [ o32 98] 386
+DAA void [ 27] 8086,NOLONG
+DAS void [ 2f] 8086,NOLONG
+DEC reg16 [r: o16 48+r] 8086,NOLONG
+DEC reg32 [r: o32 48+r] 386,NOLONG
+DEC rm8 [m: hle fe /1] 8086,LOCK
+DEC rm16 [m: hle o16 ff /1] 8086,LOCK
+DEC rm32 [m: hle o32 ff /1] 386,LOCK
+DEC rm64 [m: hle o64 ff /1] X64,LOCK
+DIV rm8 [m: f6 /6] 8086
+DIV rm16 [m: o16 f7 /6] 8086
+DIV rm32 [m: o32 f7 /6] 386
+DIV rm64 [m: o64 f7 /6] X64
+DMINT void [ 0f 39] P6,CYRIX
+EMMS void [ 0f 77] PENT,MMX
+ENTER imm,imm [ij: c8 iw ib,u] 186
+EQU imm ignore 8086
+EQU imm:imm ignore 8086
+F2XM1 void [ d9 f0] 8086,FPU
+FABS void [ d9 e1] 8086,FPU
+FADD mem32 [m: d8 /0] 8086,FPU
+FADD mem64 [m: dc /0] 8086,FPU
+FADD fpureg|to [r: dc c0+r] 8086,FPU
+FADD fpureg [r: d8 c0+r] 8086,FPU
+FADD fpureg,fpu0 [r-: dc c0+r] 8086,FPU
+FADD fpu0,fpureg [-r: d8 c0+r] 8086,FPU
+FADD void [ de c1] 8086,FPU,ND
+FADDP fpureg [r: de c0+r] 8086,FPU
+FADDP fpureg,fpu0 [r-: de c0+r] 8086,FPU
+FADDP void [ de c1] 8086,FPU,ND
+FBLD mem80 [m: df /4] 8086,FPU
+FBLD mem [m: df /4] 8086,FPU
+FBSTP mem80 [m: df /6] 8086,FPU
+FBSTP mem [m: df /6] 8086,FPU
+FCHS void [ d9 e0] 8086,FPU
+FCLEX void [ wait db e2] 8086,FPU
+FCMOVB fpureg [r: da c0+r] P6,FPU
+FCMOVB fpu0,fpureg [-r: da c0+r] P6,FPU
+FCMOVB void [ da c1] P6,FPU,ND
+FCMOVBE fpureg [r: da d0+r] P6,FPU
+FCMOVBE fpu0,fpureg [-r: da d0+r] P6,FPU
+FCMOVBE void [ da d1] P6,FPU,ND
+FCMOVE fpureg [r: da c8+r] P6,FPU
+FCMOVE fpu0,fpureg [-r: da c8+r] P6,FPU
+FCMOVE void [ da c9] P6,FPU,ND
+FCMOVNB fpureg [r: db c0+r] P6,FPU
+FCMOVNB fpu0,fpureg [-r: db c0+r] P6,FPU
+FCMOVNB void [ db c1] P6,FPU,ND
+FCMOVNBE fpureg [r: db d0+r] P6,FPU
+FCMOVNBE fpu0,fpureg [-r: db d0+r] P6,FPU
+FCMOVNBE void [ db d1] P6,FPU,ND
+FCMOVNE fpureg [r: db c8+r] P6,FPU
+FCMOVNE fpu0,fpureg [-r: db c8+r] P6,FPU
+FCMOVNE void [ db c9] P6,FPU,ND
+FCMOVNU fpureg [r: db d8+r] P6,FPU
+FCMOVNU fpu0,fpureg [-r: db d8+r] P6,FPU
+FCMOVNU void [ db d9] P6,FPU,ND
+FCMOVU fpureg [r: da d8+r] P6,FPU
+FCMOVU fpu0,fpureg [-r: da d8+r] P6,FPU
+FCMOVU void [ da d9] P6,FPU,ND
+FCOM mem32 [m: d8 /2] 8086,FPU
+FCOM mem64 [m: dc /2] 8086,FPU
+FCOM fpureg [r: d8 d0+r] 8086,FPU
+FCOM fpu0,fpureg [-r: d8 d0+r] 8086,FPU
+FCOM void [ d8 d1] 8086,FPU,ND
+FCOMI fpureg [r: db f0+r] P6,FPU
+FCOMI fpu0,fpureg [-r: db f0+r] P6,FPU
+FCOMI void [ db f1] P6,FPU,ND
+FCOMIP fpureg [r: df f0+r] P6,FPU
+FCOMIP fpu0,fpureg [-r: df f0+r] P6,FPU
+FCOMIP void [ df f1] P6,FPU,ND
+FCOMP mem32 [m: d8 /3] 8086,FPU
+FCOMP mem64 [m: dc /3] 8086,FPU
+FCOMP fpureg [r: d8 d8+r] 8086,FPU
+FCOMP fpu0,fpureg [-r: d8 d8+r] 8086,FPU
+FCOMP void [ d8 d9] 8086,FPU,ND
+FCOMPP void [ de d9] 8086,FPU
+FCOS void [ d9 ff] 386,FPU
+FDECSTP void [ d9 f6] 8086,FPU
+FDISI void [ wait db e1] 8086,FPU
+FDIV mem32 [m: d8 /6] 8086,FPU
+FDIV mem64 [m: dc /6] 8086,FPU
+FDIV fpureg|to [r: dc f8+r] 8086,FPU
+FDIV fpureg [r: d8 f0+r] 8086,FPU
+FDIV fpureg,fpu0 [r-: dc f8+r] 8086,FPU
+FDIV fpu0,fpureg [-r: d8 f0+r] 8086,FPU
+FDIV void [ de f9] 8086,FPU,ND
+FDIVP fpureg [r: de f8+r] 8086,FPU
+FDIVP fpureg,fpu0 [r-: de f8+r] 8086,FPU
+FDIVP void [ de f9] 8086,FPU,ND
+FDIVR mem32 [m: d8 /7] 8086,FPU
+FDIVR mem64 [m: dc /7] 8086,FPU
+FDIVR fpureg|to [r: dc f0+r] 8086,FPU
+FDIVR fpureg,fpu0 [r-: dc f0+r] 8086,FPU
+FDIVR fpureg [r: d8 f8+r] 8086,FPU
+FDIVR fpu0,fpureg [-r: d8 f8+r] 8086,FPU
+FDIVR void [ de f1] 8086,FPU,ND
+FDIVRP fpureg [r: de f0+r] 8086,FPU
+FDIVRP fpureg,fpu0 [r-: de f0+r] 8086,FPU
+FDIVRP void [ de f1] 8086,FPU,ND
+FEMMS void [ 0f 0e] PENT,3DNOW
+FENI void [ wait db e0] 8086,FPU
+FFREE fpureg [r: dd c0+r] 8086,FPU
+FFREE void [ dd c1] 8086,FPU
+FFREEP fpureg [r: df c0+r] 286,FPU,UNDOC
+FFREEP void [ df c1] 286,FPU,UNDOC
+FIADD mem32 [m: da /0] 8086,FPU
+FIADD mem16 [m: de /0] 8086,FPU
+FICOM mem32 [m: da /2] 8086,FPU
+FICOM mem16 [m: de /2] 8086,FPU
+FICOMP mem32 [m: da /3] 8086,FPU
+FICOMP mem16 [m: de /3] 8086,FPU
+FIDIV mem32 [m: da /6] 8086,FPU
+FIDIV mem16 [m: de /6] 8086,FPU
+FIDIVR mem32 [m: da /7] 8086,FPU
+FIDIVR mem16 [m: de /7] 8086,FPU
+FILD mem32 [m: db /0] 8086,FPU
+FILD mem16 [m: df /0] 8086,FPU
+FILD mem64 [m: df /5] 8086,FPU
+FIMUL mem32 [m: da /1] 8086,FPU
+FIMUL mem16 [m: de /1] 8086,FPU
+FINCSTP void [ d9 f7] 8086,FPU
+FINIT void [ wait db e3] 8086,FPU
+FIST mem32 [m: db /2] 8086,FPU
+FIST mem16 [m: df /2] 8086,FPU
+FISTP mem32 [m: db /3] 8086,FPU
+FISTP mem16 [m: df /3] 8086,FPU
+FISTP mem64 [m: df /7] 8086,FPU
+FISTTP mem16 [m: df /1] PRESCOTT,FPU
+FISTTP mem32 [m: db /1] PRESCOTT,FPU
+FISTTP mem64 [m: dd /1] PRESCOTT,FPU
+FISUB mem32 [m: da /4] 8086,FPU
+FISUB mem16 [m: de /4] 8086,FPU
+FISUBR mem32 [m: da /5] 8086,FPU
+FISUBR mem16 [m: de /5] 8086,FPU
+FLD mem32 [m: d9 /0] 8086,FPU
+FLD mem64 [m: dd /0] 8086,FPU
+FLD mem80 [m: db /5] 8086,FPU
+FLD fpureg [r: d9 c0+r] 8086,FPU
+FLD void [ d9 c1] 8086,FPU,ND
+FLD1 void [ d9 e8] 8086,FPU
+FLDCW mem [m: d9 /5] 8086,FPU,SW
+FLDENV mem [m: d9 /4] 8086,FPU
+FLDL2E void [ d9 ea] 8086,FPU
+FLDL2T void [ d9 e9] 8086,FPU
+FLDLG2 void [ d9 ec] 8086,FPU
+FLDLN2 void [ d9 ed] 8086,FPU
+FLDPI void [ d9 eb] 8086,FPU
+FLDZ void [ d9 ee] 8086,FPU
+FMUL mem32 [m: d8 /1] 8086,FPU
+FMUL mem64 [m: dc /1] 8086,FPU
+FMUL fpureg|to [r: dc c8+r] 8086,FPU
+FMUL fpureg,fpu0 [r-: dc c8+r] 8086,FPU
+FMUL fpureg [r: d8 c8+r] 8086,FPU
+FMUL fpu0,fpureg [-r: d8 c8+r] 8086,FPU
+FMUL void [ de c9] 8086,FPU,ND
+FMULP fpureg [r: de c8+r] 8086,FPU
+FMULP fpureg,fpu0 [r-: de c8+r] 8086,FPU
+FMULP void [ de c9] 8086,FPU,ND
+FNCLEX void [ db e2] 8086,FPU
+FNDISI void [ db e1] 8086,FPU
+FNENI void [ db e0] 8086,FPU
+FNINIT void [ db e3] 8086,FPU
+FNOP void [ d9 d0] 8086,FPU
+FNSAVE mem [m: dd /6] 8086,FPU
+FNSTCW mem [m: d9 /7] 8086,FPU,SW
+FNSTENV mem [m: d9 /6] 8086,FPU
+FNSTSW mem [m: dd /7] 8086,FPU,SW
+FNSTSW reg_ax [-: df e0] 286,FPU
+FPATAN void [ d9 f3] 8086,FPU
+FPREM void [ d9 f8] 8086,FPU
+FPREM1 void [ d9 f5] 386,FPU
+FPTAN void [ d9 f2] 8086,FPU
+FRNDINT void [ d9 fc] 8086,FPU
+FRSTOR mem [m: dd /4] 8086,FPU
+FSAVE mem [m: wait dd /6] 8086,FPU
+FSCALE void [ d9 fd] 8086,FPU
+FSETPM void [ db e4] 286,FPU
+FSIN void [ d9 fe] 386,FPU
+FSINCOS void [ d9 fb] 386,FPU
+FSQRT void [ d9 fa] 8086,FPU
+FST mem32 [m: d9 /2] 8086,FPU
+FST mem64 [m: dd /2] 8086,FPU
+FST fpureg [r: dd d0+r] 8086,FPU
+FST void [ dd d1] 8086,FPU,ND
+FSTCW mem [m: wait d9 /7] 8086,FPU,SW
+FSTENV mem [m: wait d9 /6] 8086,FPU
+FSTP mem32 [m: d9 /3] 8086,FPU
+FSTP mem64 [m: dd /3] 8086,FPU
+FSTP mem80 [m: db /7] 8086,FPU
+FSTP fpureg [r: dd d8+r] 8086,FPU
+FSTP void [ dd d9] 8086,FPU,ND
+FSTSW mem [m: wait dd /7] 8086,FPU,SW
+FSTSW reg_ax [-: wait df e0] 286,FPU
+FSUB mem32 [m: d8 /4] 8086,FPU
+FSUB mem64 [m: dc /4] 8086,FPU
+FSUB fpureg|to [r: dc e8+r] 8086,FPU
+FSUB fpureg,fpu0 [r-: dc e8+r] 8086,FPU
+FSUB fpureg [r: d8 e0+r] 8086,FPU
+FSUB fpu0,fpureg [-r: d8 e0+r] 8086,FPU
+FSUB void [ de e9] 8086,FPU,ND
+FSUBP fpureg [r: de e8+r] 8086,FPU
+FSUBP fpureg,fpu0 [r-: de e8+r] 8086,FPU
+FSUBP void [ de e9] 8086,FPU,ND
+FSUBR mem32 [m: d8 /5] 8086,FPU
+FSUBR mem64 [m: dc /5] 8086,FPU
+FSUBR fpureg|to [r: dc e0+r] 8086,FPU
+FSUBR fpureg,fpu0 [r-: dc e0+r] 8086,FPU
+FSUBR fpureg [r: d8 e8+r] 8086,FPU
+FSUBR fpu0,fpureg [-r: d8 e8+r] 8086,FPU
+FSUBR void [ de e1] 8086,FPU,ND
+FSUBRP fpureg [r: de e0+r] 8086,FPU
+FSUBRP fpureg,fpu0 [r-: de e0+r] 8086,FPU
+FSUBRP void [ de e1] 8086,FPU,ND
+FTST void [ d9 e4] 8086,FPU
+FUCOM fpureg [r: dd e0+r] 386,FPU
+FUCOM fpu0,fpureg [-r: dd e0+r] 386,FPU
+FUCOM void [ dd e1] 386,FPU,ND
+FUCOMI fpureg [r: db e8+r] P6,FPU
+FUCOMI fpu0,fpureg [-r: db e8+r] P6,FPU
+FUCOMI void [ db e9] P6,FPU,ND
+FUCOMIP fpureg [r: df e8+r] P6,FPU
+FUCOMIP fpu0,fpureg [-r: df e8+r] P6,FPU
+FUCOMIP void [ df e9] P6,FPU,ND
+FUCOMP fpureg [r: dd e8+r] 386,FPU
+FUCOMP fpu0,fpureg [-r: dd e8+r] 386,FPU
+FUCOMP void [ dd e9] 386,FPU,ND
+FUCOMPP void [ da e9] 386,FPU
+FXAM void [ d9 e5] 8086,FPU
+FXCH fpureg [r: d9 c8+r] 8086,FPU
+FXCH fpureg,fpu0 [r-: d9 c8+r] 8086,FPU
+FXCH fpu0,fpureg [-r: d9 c8+r] 8086,FPU
+FXCH void [ d9 c9] 8086,FPU,ND
+FXTRACT void [ d9 f4] 8086,FPU
+FYL2X void [ d9 f1] 8086,FPU
+FYL2XP1 void [ d9 f9] 8086,FPU
+HLT void [ f4] 8086,PRIV
+IBTS mem,reg16 [mr: o16 0f a7 /r] 386,SW,UNDOC,ND,OBSOLETE
+IBTS reg16,reg16 [mr: o16 0f a7 /r] 386,UNDOC,ND,OBSOLETE
+IBTS mem,reg32 [mr: o32 0f a7 /r] 386,SD,UNDOC,ND,OBSOLETE
+IBTS reg32,reg32 [mr: o32 0f a7 /r] 386,UNDOC,ND,OBSOLETE
+ICEBP void [ f1] 386,ND
+IDIV rm8 [m: f6 /7] 8086
+IDIV rm16 [m: o16 f7 /7] 8086
+IDIV rm32 [m: o32 f7 /7] 386
+IDIV rm64 [m: o64 f7 /7] X64
+IMUL rm8 [m: f6 /5] 8086
+IMUL rm16 [m: o16 f7 /5] 8086
+IMUL rm32 [m: o32 f7 /5] 386
+IMUL rm64 [m: o64 f7 /5] X64
+IMUL reg16,mem [rm: o16 0f af /r] 386,SM
+IMUL reg16,reg16 [rm: o16 0f af /r] 386
+IMUL reg32,mem [rm: o32 0f af /r] 386,SM
+IMUL reg32,reg32 [rm: o32 0f af /r] 386
+IMUL reg64,mem [rm: o64 0f af /r] X64,SM
+IMUL reg64,reg64 [rm: o64 0f af /r] X64
+IMUL reg16,mem,imm8 [rmi: o16 6b /r ib,s] 186,SM
+IMUL reg16,mem,sbyteword [rmi: o16 6b /r ib,s] 186,SM,ND
+IMUL reg16,mem,imm16 [rmi: o16 69 /r iw] 186,SM
+IMUL reg16,mem,imm [rmi: o16 69 /r iw] 186,SM,ND
+IMUL reg16,reg16,imm8 [rmi: o16 6b /r ib,s] 186
+IMUL reg16,reg16,sbyteword [rmi: o16 6b /r ib,s] 186,SM,ND
+IMUL reg16,reg16,imm16 [rmi: o16 69 /r iw] 186
+IMUL reg16,reg16,imm [rmi: o16 69 /r iw] 186,SM,ND
+IMUL reg32,mem,imm8 [rmi: o32 6b /r ib,s] 386,SM
+IMUL reg32,mem,sbytedword [rmi: o32 6b /r ib,s] 386,SM,ND
+IMUL reg32,mem,imm32 [rmi: o32 69 /r id] 386,SM
+IMUL reg32,mem,imm [rmi: o32 69 /r id] 386,SM,ND
+IMUL reg32,reg32,imm8 [rmi: o32 6b /r ib,s] 386
+IMUL reg32,reg32,sbytedword [rmi: o32 6b /r ib,s] 386,SM,ND
+IMUL reg32,reg32,imm32 [rmi: o32 69 /r id] 386
+IMUL reg32,reg32,imm [rmi: o32 69 /r id] 386,SM,ND
+IMUL reg64,mem,imm8 [rmi: o64 6b /r ib,s] X64,SM
+IMUL reg64,mem,sbytedword [rmi: o64 6b /r ib,s] X64,SM,ND
+IMUL reg64,mem,imm32 [rmi: o64 69 /r id] X64,SM
+IMUL reg64,mem,imm [rmi: o64 69 /r id,s] X64,SM,ND
+IMUL reg64,reg64,imm8 [rmi: o64 6b /r ib,s] X64
+IMUL reg64,reg64,sbytedword [rmi: o64 6b /r ib,s] X64,SM,ND
+IMUL reg64,reg64,imm32 [rmi: o64 69 /r id] X64
+IMUL reg64,reg64,imm [rmi: o64 69 /r id,s] X64,SM,ND
+IMUL reg16,imm8 [r+mi: o16 6b /r ib,s] 186
+IMUL reg16,sbyteword [r+mi: o16 6b /r ib,s] 186,SM,ND
+IMUL reg16,imm16 [r+mi: o16 69 /r iw] 186
+IMUL reg16,imm [r+mi: o16 69 /r iw] 186,SM,ND
+IMUL reg32,imm8 [r+mi: o32 6b /r ib,s] 386
+IMUL reg32,sbytedword [r+mi: o32 6b /r ib,s] 386,SM,ND
+IMUL reg32,imm32 [r+mi: o32 69 /r id] 386
+IMUL reg32,imm [r+mi: o32 69 /r id] 386,SM,ND
+IMUL reg64,imm8 [r+mi: o64 6b /r ib,s] X64
+IMUL reg64,sbytedword [r+mi: o64 6b /r ib,s] X64,SM,ND
+IMUL reg64,imm32 [r+mi: o64 69 /r id,s] X64
+IMUL reg64,imm [r+mi: o64 69 /r id,s] X64,SM,ND
+IN reg_al,imm [-i: e4 ib,u] 8086,SB
+IN reg_ax,imm [-i: o16 e5 ib,u] 8086,SB
+IN reg_eax,imm [-i: o32 e5 ib,u] 386,SB
+IN reg_al,reg_dx [--: ec] 8086
+IN reg_ax,reg_dx [--: o16 ed] 8086
+IN reg_eax,reg_dx [--: o32 ed] 386
+INC reg16 [r: o16 40+r] 8086,NOLONG
+INC reg32 [r: o32 40+r] 386,NOLONG
+INC rm8 [m: hle fe /0] 8086,LOCK
+INC rm16 [m: hle o16 ff /0] 8086,LOCK
+INC rm32 [m: hle o32 ff /0] 386,LOCK
+INC rm64 [m: hle o64 ff /0] X64,LOCK
+INSB void [ 6c] 186
+INSD void [ o32 6d] 386
+INSW void [ o16 6d] 186
+INT imm [i: cd ib,u] 8086,SB
+INT01 void [ f1] 386,ND
+INT1 void [ f1] 386
+INT03 void [ cc] 8086,ND
+INT3 void [ cc] 8086
+INTO void [ ce] 8086,NOLONG
+INVD void [ 0f 08] 486,PRIV
+INVPCID reg32,mem128 [rm: 66 0f 38 82 /r] FUTURE,INVPCID,PRIV,NOLONG
+INVPCID reg64,mem128 [rm: 66 0f 38 82 /r] FUTURE,INVPCID,PRIV,LONG
+INVLPG mem [m: 0f 01 /7] 486,PRIV
+INVLPGA reg_ax,reg_ecx [--: a16 0f 01 df] X86_64,AMD,NOLONG
+INVLPGA reg_eax,reg_ecx [--: a32 0f 01 df] X86_64,AMD
+INVLPGA reg_rax,reg_ecx [--: o64nw a64 0f 01 df] X64,AMD
+INVLPGA void [ 0f 01 df] X86_64,AMD
+IRET void [ odf cf] 8086
+IRETD void [ o32 cf] 386
+IRETQ void [ o64 cf] X64
+IRETW void [ o16 cf] 8086
+JCXZ imm [i: a16 e3 rel8] 8086,NOLONG
+JECXZ imm [i: a32 e3 rel8] 386
+JRCXZ imm [i: a64 e3 rel8] X64
+JMP imm|short [i: eb rel8] 8086
+JMP imm [i: jmp8 eb rel8] 8086,ND
+JMP imm [i: odf e9 rel] 8086,BND
+JMP imm|near [i: odf e9 rel] 8086,ND,BND
+JMP imm|far [i: odf ea iwd seg] 8086,ND,NOLONG
+; Call/jmp near imm/reg/mem is always 64-bit in long mode.
+JMP imm16 [i: o16 e9 rel] 8086,NOLONG,BND
+JMP imm16|near [i: o16 e9 rel] 8086,ND,NOLONG,BND
+JMP imm16|far [i: o16 ea iwd seg] 8086,ND,NOLONG
+JMP imm32 [i: o32 e9 rel] 386,NOLONG,BND
+JMP imm32|near [i: o32 e9 rel] 386,ND,NOLONG,BND
+JMP imm32|far [i: o32 ea iwd seg] 386,ND,NOLONG
+JMP imm64 [i: o64nw e9 rel] X64,BND
+JMP imm64|near [i: o64nw e9 rel] X64,ND,BND
+JMP imm:imm [ji: odf ea iwd iw] 8086,NOLONG
+JMP imm16:imm [ji: o16 ea iw iw] 8086,NOLONG
+JMP imm:imm16 [ji: o16 ea iw iw] 8086,NOLONG
+JMP imm32:imm [ji: o32 ea id iw] 386,NOLONG
+JMP imm:imm32 [ji: o32 ea id iw] 386,NOLONG
+JMP mem|far [m: odf ff /5] 8086,NOLONG
+JMP mem|far [m: o64 ff /5] X64
+JMP mem16|far [m: o16 ff /5] 8086
+JMP mem32|far [m: o32 ff /5] 386
+JMP mem64|far [m: o64 ff /5] X64
+JMP mem|near [m: odf ff /4] 8086,ND,BND
+JMP rm16|near [m: o16 ff /4] 8086,NOLONG,ND,BND
+JMP rm32|near [m: o32 ff /4] 386,NOLONG,ND,BND
+JMP rm64|near [m: o64nw ff /4] X64,ND,BND
+JMP mem [m: odf ff /4] 8086,BND
+JMP rm16 [m: o16 ff /4] 8086,NOLONG,BND
+JMP rm32 [m: o32 ff /4] 386,NOLONG,BND
+JMP rm64 [m: o64nw ff /4] X64,BND
+
+JMPE imm [i: odf 0f b8 rel] IA64
+JMPE imm16 [i: o16 0f b8 rel] IA64
+JMPE imm32 [i: o32 0f b8 rel] IA64
+JMPE rm16 [m: o16 0f 00 /6] IA64
+JMPE rm32 [m: o32 0f 00 /6] IA64
+LAHF void [ 9f] 8086
+LAR reg16,mem [rm: o16 0f 02 /r] 286,PROT,SW
+LAR reg16,reg16 [rm: o16 0f 02 /r] 286,PROT
+LAR reg16,reg32 [rm: o16 0f 02 /r] 386,PROT
+LAR reg16,reg64 [rm: o16 o64nw 0f 02 /r] X64,PROT,ND
+LAR reg32,mem [rm: o32 0f 02 /r] 386,PROT,SW
+LAR reg32,reg16 [rm: o32 0f 02 /r] 386,PROT
+LAR reg32,reg32 [rm: o32 0f 02 /r] 386,PROT
+LAR reg32,reg64 [rm: o32 o64nw 0f 02 /r] X64,PROT,ND
+LAR reg64,mem [rm: o64 0f 02 /r] X64,PROT,SW
+LAR reg64,reg16 [rm: o64 0f 02 /r] X64,PROT
+LAR reg64,reg32 [rm: o64 0f 02 /r] X64,PROT
+LAR reg64,reg64 [rm: o64 0f 02 /r] X64,PROT
+LDS reg16,mem [rm: o16 c5 /r] 8086,NOLONG
+LDS reg32,mem [rm: o32 c5 /r] 386,NOLONG
+LEA reg16,mem [rm: o16 8d /r] 8086
+LEA reg32,mem [rm: o32 8d /r] 386
+LEA reg64,mem [rm: o64 8d /r] X64
+LEAVE void [ c9] 186
+LES reg16,mem [rm: o16 c4 /r] 8086,NOLONG
+LES reg32,mem [rm: o32 c4 /r] 386,NOLONG
+LFENCE void [ np 0f ae e8] X64,AMD
+LFS reg16,mem [rm: o16 0f b4 /r] 386
+LFS reg32,mem [rm: o32 0f b4 /r] 386
+LFS reg64,mem [rm: o64 0f b4 /r] X64
+LGDT mem [m: 0f 01 /2] 286,PRIV
+LGS reg16,mem [rm: o16 0f b5 /r] 386
+LGS reg32,mem [rm: o32 0f b5 /r] 386
+LGS reg64,mem [rm: o64 0f b5 /r] X64
+LIDT mem [m: 0f 01 /3] 286,PRIV
+LLDT mem [m: 0f 00 /2] 286,PROT,PRIV
+LLDT mem16 [m: 0f 00 /2] 286,PROT,PRIV
+LLDT reg16 [m: 0f 00 /2] 286,PROT,PRIV
+LMSW mem [m: 0f 01 /6] 286,PRIV
+LMSW mem16 [m: 0f 01 /6] 286,PRIV
+LMSW reg16 [m: 0f 01 /6] 286,PRIV
+LOADALL void [ 0f 07] 386,UNDOC,ND,OBSOLETE
+LOADALL286 void [ 0f 05] 286,UNDOC,ND,OBSOLETE
+LODSB void [ ac] 8086
+LODSD void [ o32 ad] 386
+LODSQ void [ o64 ad] X64
+LODSW void [ o16 ad] 8086
+LOOP imm [i: adf e2 rel8] 8086
+LOOP imm,reg_cx [i-: a16 e2 rel8] 8086,NOLONG
+LOOP imm,reg_ecx [i-: a32 e2 rel8] 386
+LOOP imm,reg_rcx [i-: a64 e2 rel8] X64
+LOOPE imm [i: adf e1 rel8] 8086
+LOOPE imm,reg_cx [i-: a16 e1 rel8] 8086,NOLONG
+LOOPE imm,reg_ecx [i-: a32 e1 rel8] 386
+LOOPE imm,reg_rcx [i-: a64 e1 rel8] X64
+LOOPNE imm [i: adf e0 rel8] 8086
+LOOPNE imm,reg_cx [i-: a16 e0 rel8] 8086,NOLONG
+LOOPNE imm,reg_ecx [i-: a32 e0 rel8] 386
+LOOPNE imm,reg_rcx [i-: a64 e0 rel8] X64
+LOOPNZ imm [i: adf e0 rel8] 8086
+LOOPNZ imm,reg_cx [i-: a16 e0 rel8] 8086,NOLONG
+LOOPNZ imm,reg_ecx [i-: a32 e0 rel8] 386
+LOOPNZ imm,reg_rcx [i-: a64 e0 rel8] X64
+LOOPZ imm [i: adf e1 rel8] 8086
+LOOPZ imm,reg_cx [i-: a16 e1 rel8] 8086,NOLONG
+LOOPZ imm,reg_ecx [i-: a32 e1 rel8] 386
+LOOPZ imm,reg_rcx [i-: a64 e1 rel8] X64
+LSL reg16,mem [rm: o16 0f 03 /r] 286,PROT,SW
+LSL reg16,reg16 [rm: o16 0f 03 /r] 286,PROT
+LSL reg16,reg32 [rm: o16 0f 03 /r] 386,PROT
+LSL reg16,reg64 [rm: o16 o64nw 0f 03 /r] X64,PROT,ND
+LSL reg32,mem [rm: o32 0f 03 /r] 386,PROT,SW
+LSL reg32,reg16 [rm: o32 0f 03 /r] 386,PROT
+LSL reg32,reg32 [rm: o32 0f 03 /r] 386,PROT
+LSL reg32,reg64 [rm: o32 o64nw 0f 03 /r] X64,PROT,ND
+LSL reg64,mem [rm: o64 0f 03 /r] X64,PROT,SW
+LSL reg64,reg16 [rm: o64 0f 03 /r] X64,PROT
+LSL reg64,reg32 [rm: o64 0f 03 /r] X64,PROT
+LSL reg64,reg64 [rm: o64 0f 03 /r] X64,PROT
+LSS reg16,mem [rm: o16 0f b2 /r] 386
+LSS reg32,mem [rm: o32 0f b2 /r] 386
+LSS reg64,mem [rm: o64 0f b2 /r] X64
+LTR mem [m: 0f 00 /3] 286,PROT,PRIV
+LTR mem16 [m: 0f 00 /3] 286,PROT,PRIV
+LTR reg16 [m: 0f 00 /3] 286,PROT,PRIV
+MFENCE void [ np 0f ae f0] X64,AMD
+MONITOR void [ 0f 01 c8] PRESCOTT
+MONITOR reg_eax,reg_ecx,reg_edx [---: 0f 01 c8] PRESCOTT,NOLONG,ND
+MONITOR reg_rax,reg_ecx,reg_edx [---: 0f 01 c8] X64,ND
+MONITORX void [ 0f 01 fa] AMD
+MONITORX reg_rax,reg_ecx,reg_edx [---: 0f 01 fa] X64,AMD,ND
+MONITORX reg_eax,reg_ecx,reg_edx [---: 0f 01 fa] AMD,ND
+MONITORX reg_ax,reg_ecx,reg_edx [---: 0f 01 fa] AMD,ND
+MOV mem,reg_sreg [mr: 8c /r] 8086,SW
+MOV reg16,reg_sreg [mr: o16 8c /r] 8086
+MOV reg32,reg_sreg [mr: o32 8c /r] 386
+MOV reg64,reg_sreg [mr: o64nw 8c /r] X64,OPT,ND
+MOV rm64,reg_sreg [mr: o64 8c /r] X64
+MOV reg_sreg,mem [rm: 8e /r] 8086,SW
+MOV reg_sreg,reg16 [rm: 8e /r] 8086,OPT,ND
+MOV reg_sreg,reg32 [rm: 8e /r] 386,OPT,ND
+MOV reg_sreg,reg64 [rm: o64nw 8e /r] X64,OPT,ND
+MOV reg_sreg,reg16 [rm: o16 8e /r] 8086
+MOV reg_sreg,reg32 [rm: o32 8e /r] 386
+MOV reg_sreg,rm64 [rm: o64 8e /r] X64
+MOV reg_al,mem_offs [-i: a0 iwdq] 8086,SM
+MOV reg_ax,mem_offs [-i: o16 a1 iwdq] 8086,SM
+MOV reg_eax,mem_offs [-i: o32 a1 iwdq] 386,SM
+MOV reg_rax,mem_offs [-i: o64 a1 iwdq] X64,SM
+MOV mem_offs,reg_al [i-: a2 iwdq] 8086,SM,NOHLE
+MOV mem_offs,reg_ax [i-: o16 a3 iwdq] 8086,SM,NOHLE
+MOV mem_offs,reg_eax [i-: o32 a3 iwdq] 386,SM,NOHLE
+MOV mem_offs,reg_rax [i-: o64 a3 iwdq] X64,SM,NOHLE
+MOV reg32,reg_creg [mr: rex.l 0f 20 /r] 386,PRIV,NOLONG
+MOV reg64,reg_creg [mr: o64nw 0f 20 /r] X64,PRIV
+MOV reg_creg,reg32 [rm: rex.l 0f 22 /r] 386,PRIV,NOLONG
+MOV reg_creg,reg64 [rm: o64nw 0f 22 /r] X64,PRIV
+MOV reg32,reg_dreg [mr: 0f 21 /r] 386,PRIV,NOLONG
+MOV reg64,reg_dreg [mr: o64nw 0f 21 /r] X64,PRIV
+MOV reg_dreg,reg32 [rm: 0f 23 /r] 386,PRIV,NOLONG
+MOV reg_dreg,reg64 [rm: o64nw 0f 23 /r] X64,PRIV
+MOV reg32,reg_treg [mr: 0f 24 /r] 386,NOLONG,ND
+MOV reg_treg,reg32 [rm: 0f 26 /r] 386,NOLONG,ND
+MOV mem,reg8 [mr: hlexr 88 /r] 8086,SM
+MOV reg8,reg8 [mr: 88 /r] 8086
+MOV mem,reg16 [mr: hlexr o16 89 /r] 8086,SM
+MOV reg16,reg16 [mr: o16 89 /r] 8086
+MOV mem,reg32 [mr: hlexr o32 89 /r] 386,SM
+MOV reg32,reg32 [mr: o32 89 /r] 386
+MOV mem,reg64 [mr: hlexr o64 89 /r] X64,SM
+MOV reg64,reg64 [mr: o64 89 /r] X64
+MOV reg8,mem [rm: 8a /r] 8086,SM
+MOV reg8,reg8 [rm: 8a /r] 8086
+MOV reg16,mem [rm: o16 8b /r] 8086,SM
+MOV reg16,reg16 [rm: o16 8b /r] 8086
+MOV reg32,mem [rm: o32 8b /r] 386,SM
+MOV reg32,reg32 [rm: o32 8b /r] 386
+MOV reg64,mem [rm: o64 8b /r] X64,SM
+MOV reg64,reg64 [rm: o64 8b /r] X64
+MOV reg8,imm [ri: b0+r ib] 8086,SM
+MOV reg16,imm [ri: o16 b8+r iw] 8086,SM
+MOV reg32,imm [ri: o32 b8+r id] 386,SM
+MOV reg64,udword [ri: o64nw b8+r id] X64,SM,OPT,ND
+MOV reg64,sdword [mi: o64 c7 /0 id,s] X64,SM,OPT,ND
+MOV reg64,imm [ri: o64 b8+r iq] X64,SM
+MOV rm8,imm [mi: hlexr c6 /0 ib] 8086,SM
+MOV rm16,imm [mi: hlexr o16 c7 /0 iw] 8086,SM
+MOV rm32,imm [mi: hlexr o32 c7 /0 id] 386,SM
+MOV rm64,imm [mi: hlexr o64 c7 /0 id,s] X64,SM
+MOV rm64,imm32 [mi: hlexr o64 c7 /0 id,s] X64
+MOV mem,imm8 [mi: hlexr c6 /0 ib] 8086,SM
+MOV mem,imm16 [mi: hlexr o16 c7 /0 iw] 8086,SM
+MOV mem,imm32 [mi: hlexr o32 c7 /0 id] 386,SM
+MOVD mmxreg,rm32 [rm: np 0f 6e /r] PENT,MMX,SD
+MOVD rm32,mmxreg [mr: np 0f 7e /r] PENT,MMX,SD
+MOVD mmxreg,rm64 [rm: np o64 0f 6e /r] X64,MMX,SX,ND
+MOVD rm64,mmxreg [mr: np o64 0f 7e /r] X64,MMX,SX,ND
+MOVQ mmxreg,mmxrm [rm: np 0f 6f /r] PENT,MMX,SQ
+MOVQ mmxrm,mmxreg [mr: np 0f 7f /r] PENT,MMX,SQ
+MOVQ mmxreg,rm64 [rm: np o64 0f 6e /r] X64,MMX
+MOVQ rm64,mmxreg [mr: np o64 0f 7e /r] X64,MMX
+MOVSB void [ a4] 8086
+MOVSD void [ o32 a5] 386
+MOVSQ void [ o64 a5] X64
+MOVSW void [ o16 a5] 8086
+MOVSX reg16,mem [rm: o16 0f be /r] 386,SB
+MOVSX reg16,reg8 [rm: o16 0f be /r] 386
+MOVSX reg32,rm8 [rm: o32 0f be /r] 386
+MOVSX reg32,rm16 [rm: o32 0f bf /r] 386
+MOVSX reg64,rm8 [rm: o64 0f be /r] X64
+MOVSX reg64,rm16 [rm: o64 0f bf /r] X64
+MOVSXD reg64,rm32 [rm: o64 63 /r] X64
+MOVSX reg64,rm32 [rm: o64 63 /r] X64,ND
+MOVZX reg16,mem [rm: o16 0f b6 /r] 386,SB
+MOVZX reg16,reg8 [rm: o16 0f b6 /r] 386
+MOVZX reg32,rm8 [rm: o32 0f b6 /r] 386
+MOVZX reg32,rm16 [rm: o32 0f b7 /r] 386
+MOVZX reg64,rm8 [rm: o64 0f b6 /r] X64
+MOVZX reg64,rm16 [rm: o64 0f b7 /r] X64
+MUL rm8 [m: f6 /4] 8086
+MUL rm16 [m: o16 f7 /4] 8086
+MUL rm32 [m: o32 f7 /4] 386
+MUL rm64 [m: o64 f7 /4] X64
+MWAIT void [ 0f 01 c9] PRESCOTT
+MWAIT reg_eax,reg_ecx [--: 0f 01 c9] PRESCOTT,ND
+MWAITX void [ 0f 01 fb] AMD
+MWAITX reg_eax,reg_ecx [--: 0f 01 fb] AMD,ND
+NEG rm8 [m: hle f6 /3] 8086,LOCK
+NEG rm16 [m: hle o16 f7 /3] 8086,LOCK
+NEG rm32 [m: hle o32 f7 /3] 386,LOCK
+NEG rm64 [m: hle o64 f7 /3] X64,LOCK
+NOP void [ norexb nof3 90] 8086
+NOP rm16 [m: o16 0f 1f /0] P6
+NOP rm32 [m: o32 0f 1f /0] P6
+NOP rm64 [m: o64 0f 1f /0] X64
+NOT rm8 [m: hle f6 /2] 8086,LOCK
+NOT rm16 [m: hle o16 f7 /2] 8086,LOCK
+NOT rm32 [m: hle o32 f7 /2] 386,LOCK
+NOT rm64 [m: hle o64 f7 /2] X64,LOCK
+OR mem,reg8 [mr: hle 08 /r] 8086,SM,LOCK
+OR reg8,reg8 [mr: 08 /r] 8086
+OR mem,reg16 [mr: hle o16 09 /r] 8086,SM,LOCK
+OR reg16,reg16 [mr: o16 09 /r] 8086
+OR mem,reg32 [mr: hle o32 09 /r] 386,SM,LOCK
+OR reg32,reg32 [mr: o32 09 /r] 386
+OR mem,reg64 [mr: hle o64 09 /r] X64,SM,LOCK
+OR reg64,reg64 [mr: o64 09 /r] X64
+OR reg8,mem [rm: 0a /r] 8086,SM
+OR reg8,reg8 [rm: 0a /r] 8086
+OR reg16,mem [rm: o16 0b /r] 8086,SM
+OR reg16,reg16 [rm: o16 0b /r] 8086
+OR reg32,mem [rm: o32 0b /r] 386,SM
+OR reg32,reg32 [rm: o32 0b /r] 386
+OR reg64,mem [rm: o64 0b /r] X64,SM
+OR reg64,reg64 [rm: o64 0b /r] X64
+OR rm16,imm8 [mi: hle o16 83 /1 ib,s] 8086,LOCK
+OR rm32,imm8 [mi: hle o32 83 /1 ib,s] 386,LOCK
+OR rm64,imm8 [mi: hle o64 83 /1 ib,s] X64,LOCK
+OR reg_al,imm [-i: 0c ib] 8086,SM
+OR reg_ax,sbyteword [mi: o16 83 /1 ib,s] 8086,SM,ND
+OR reg_ax,imm [-i: o16 0d iw] 8086,SM
+OR reg_eax,sbytedword [mi: o32 83 /1 ib,s] 386,SM,ND
+OR reg_eax,imm [-i: o32 0d id] 386,SM
+OR reg_rax,sbytedword [mi: o64 83 /1 ib,s] X64,SM,ND
+OR reg_rax,imm [-i: o64 0d id,s] X64,SM
+OR rm8,imm [mi: hle 80 /1 ib] 8086,SM,LOCK
+OR rm16,sbyteword [mi: hle o16 83 /1 ib,s] 8086,SM,LOCK,ND
+OR rm16,imm [mi: hle o16 81 /1 iw] 8086,SM,LOCK
+OR rm32,sbytedword [mi: hle o32 83 /1 ib,s] 386,SM,LOCK,ND
+OR rm32,imm [mi: hle o32 81 /1 id] 386,SM,LOCK
+OR rm64,sbytedword [mi: hle o64 83 /1 ib,s] X64,SM,LOCK,ND
+OR rm64,imm [mi: hle o64 81 /1 id,s] X64,SM,LOCK
+OR mem,imm8 [mi: hle 80 /1 ib] 8086,SM,LOCK
+OR mem,sbyteword16 [mi: hle o16 83 /1 ib,s] 8086,SM,LOCK,ND
+OR mem,imm16 [mi: hle o16 81 /1 iw] 8086,SM,LOCK
+OR mem,sbytedword32 [mi: hle o32 83 /1 ib,s] 386,SM,LOCK,ND
+OR mem,imm32 [mi: hle o32 81 /1 id] 386,SM,LOCK
+OR rm8,imm [mi: hle 82 /1 ib] 8086,SM,LOCK,ND,NOLONG
+OUT imm,reg_al [i-: e6 ib,u] 8086,SB
+OUT imm,reg_ax [i-: o16 e7 ib,u] 8086,SB
+OUT imm,reg_eax [i-: o32 e7 ib,u] 386,SB
+OUT reg_dx,reg_al [--: ee] 8086
+OUT reg_dx,reg_ax [--: o16 ef] 8086
+OUT reg_dx,reg_eax [--: o32 ef] 386
+OUTSB void [ 6e] 186
+OUTSD void [ o32 6f] 386
+OUTSW void [ o16 6f] 186
+PACKSSDW mmxreg,mmxrm [rm: np o64nw 0f 6b /r] PENT,MMX,SQ
+PACKSSWB mmxreg,mmxrm [rm: np o64nw 0f 63 /r] PENT,MMX,SQ
+PACKUSWB mmxreg,mmxrm [rm: np o64nw 0f 67 /r] PENT,MMX,SQ
+PADDB mmxreg,mmxrm [rm: np o64nw 0f fc /r] PENT,MMX,SQ
+PADDD mmxreg,mmxrm [rm: np o64nw 0f fe /r] PENT,MMX,SQ
+PADDSB mmxreg,mmxrm [rm: np o64nw 0f ec /r] PENT,MMX,SQ
+PADDSIW mmxreg,mmxrm [rm: o64nw 0f 51 /r] PENT,MMX,SQ,CYRIX
+PADDSW mmxreg,mmxrm [rm: np o64nw 0f ed /r] PENT,MMX,SQ
+PADDUSB mmxreg,mmxrm [rm: np o64nw 0f dc /r] PENT,MMX,SQ
+PADDUSW mmxreg,mmxrm [rm: np o64nw 0f dd /r] PENT,MMX,SQ
+PADDW mmxreg,mmxrm [rm: np o64nw 0f fd /r] PENT,MMX,SQ
+PAND mmxreg,mmxrm [rm: np o64nw 0f db /r] PENT,MMX,SQ
+PANDN mmxreg,mmxrm [rm: np o64nw 0f df /r] PENT,MMX,SQ
+PAUSE void [ f3i 90] 8086
+PAVEB mmxreg,mmxrm [rm: o64nw 0f 50 /r] PENT,MMX,SQ,CYRIX
+PAVGUSB mmxreg,mmxrm [rm: o64nw 0f 0f /r bf] PENT,3DNOW,SQ
+PCMPEQB mmxreg,mmxrm [rm: np o64nw 0f 74 /r] PENT,MMX,SQ
+PCMPEQD mmxreg,mmxrm [rm: np o64nw 0f 76 /r] PENT,MMX,SQ
+PCMPEQW mmxreg,mmxrm [rm: np o64nw 0f 75 /r] PENT,MMX,SQ
+PCMPGTB mmxreg,mmxrm [rm: np o64nw 0f 64 /r] PENT,MMX,SQ
+PCMPGTD mmxreg,mmxrm [rm: np o64nw 0f 66 /r] PENT,MMX,SQ
+PCMPGTW mmxreg,mmxrm [rm: np o64nw 0f 65 /r] PENT,MMX,SQ
+PDISTIB mmxreg,mem [rm: 0f 54 /r] PENT,MMX,SM,CYRIX
+PF2ID mmxreg,mmxrm [rm: o64nw 0f 0f /r 1d] PENT,3DNOW,SQ
+PFACC mmxreg,mmxrm [rm: o64nw 0f 0f /r ae] PENT,3DNOW,SQ
+PFADD mmxreg,mmxrm [rm: o64nw 0f 0f /r 9e] PENT,3DNOW,SQ
+PFCMPEQ mmxreg,mmxrm [rm: o64nw 0f 0f /r b0] PENT,3DNOW,SQ
+PFCMPGE mmxreg,mmxrm [rm: o64nw 0f 0f /r 90] PENT,3DNOW,SQ
+PFCMPGT mmxreg,mmxrm [rm: o64nw 0f 0f /r a0] PENT,3DNOW,SQ
+PFMAX mmxreg,mmxrm [rm: o64nw 0f 0f /r a4] PENT,3DNOW,SQ
+PFMIN mmxreg,mmxrm [rm: o64nw 0f 0f /r 94] PENT,3DNOW,SQ
+PFMUL mmxreg,mmxrm [rm: o64nw 0f 0f /r b4] PENT,3DNOW,SQ
+PFRCP mmxreg,mmxrm [rm: o64nw 0f 0f /r 96] PENT,3DNOW,SQ
+PFRCPIT1 mmxreg,mmxrm [rm: o64nw 0f 0f /r a6] PENT,3DNOW,SQ
+PFRCPIT2 mmxreg,mmxrm [rm: o64nw 0f 0f /r b6] PENT,3DNOW,SQ
+PFRSQIT1 mmxreg,mmxrm [rm: o64nw 0f 0f /r a7] PENT,3DNOW,SQ
+PFRSQRT mmxreg,mmxrm [rm: o64nw 0f 0f /r 97] PENT,3DNOW,SQ
+PFSUB mmxreg,mmxrm [rm: o64nw 0f 0f /r 9a] PENT,3DNOW,SQ
+PFSUBR mmxreg,mmxrm [rm: o64nw 0f 0f /r aa] PENT,3DNOW,SQ
+PI2FD mmxreg,mmxrm [rm: o64nw 0f 0f /r 0d] PENT,3DNOW,SQ
+PMACHRIW mmxreg,mem [rm: 0f 5e /r] PENT,MMX,SM,CYRIX
+PMADDWD mmxreg,mmxrm [rm: np o64nw 0f f5 /r] PENT,MMX,SQ
+PMAGW mmxreg,mmxrm [rm: o64nw 0f 52 /r] PENT,MMX,SQ,CYRIX
+PMULHRIW mmxreg,mmxrm [rm: o64nw 0f 5d /r] PENT,MMX,SQ,CYRIX
+PMULHRWA mmxreg,mmxrm [rm: o64nw 0f 0f /r b7] PENT,3DNOW,SQ
+PMULHRWC mmxreg,mmxrm [rm: o64nw 0f 59 /r] PENT,MMX,SQ,CYRIX
+PMULHW mmxreg,mmxrm [rm: np o64nw 0f e5 /r] PENT,MMX,SQ
+PMULLW mmxreg,mmxrm [rm: np o64nw 0f d5 /r] PENT,MMX,SQ
+PMVGEZB mmxreg,mem [rm: 0f 5c /r] PENT,MMX,SQ,CYRIX
+PMVLZB mmxreg,mem [rm: 0f 5b /r] PENT,MMX,SQ,CYRIX
+PMVNZB mmxreg,mem [rm: 0f 5a /r] PENT,MMX,SQ,CYRIX
+PMVZB mmxreg,mem [rm: 0f 58 /r] PENT,MMX,SQ,CYRIX
+POP reg16 [r: o16 58+r] 8086
+POP reg32 [r: o32 58+r] 386,NOLONG
+POP reg64 [r: o64nw 58+r] X64
+POP rm16 [m: o16 8f /0] 8086
+POP rm32 [m: o32 8f /0] 386,NOLONG
+POP rm64 [m: o64nw 8f /0] X64
+POP reg_es [-: 07] 8086,NOLONG
+POP reg_cs [-: 0f] 8086,UNDOC,ND,OBSOLETE
+POP reg_ss [-: 17] 8086,NOLONG
+POP reg_ds [-: 1f] 8086,NOLONG
+POP reg_fs [-: 0f a1] 386
+POP reg_gs [-: 0f a9] 386
+POPA void [ odf 61] 186,NOLONG
+POPAD void [ o32 61] 386,NOLONG
+POPAW void [ o16 61] 186,NOLONG
+POPF void [ odf 9d] 8086
+POPFD void [ o32 9d] 386,NOLONG
+POPFQ void [ o32 9d] X64
+POPFW void [ o16 9d] 8086
+POR mmxreg,mmxrm [rm: np o64nw 0f eb /r] PENT,MMX,SQ
+PREFETCH mem [m: 0f 0d /0] PENT,3DNOW,SQ
+PREFETCHW mem [m: 0f 0d /1] PENT,3DNOW,SQ
+PSLLD mmxreg,mmxrm [rm: np o64nw 0f f2 /r] PENT,MMX,SQ
+PSLLD mmxreg,imm [mi: np 0f 72 /6 ib,u] PENT,MMX
+PSLLQ mmxreg,mmxrm [rm: np o64nw 0f f3 /r] PENT,MMX,SQ
+PSLLQ mmxreg,imm [mi: np 0f 73 /6 ib,u] PENT,MMX
+PSLLW mmxreg,mmxrm [rm: np o64nw 0f f1 /r] PENT,MMX,SQ
+PSLLW mmxreg,imm [mi: np 0f 71 /6 ib,u] PENT,MMX
+PSRAD mmxreg,mmxrm [rm: np o64nw 0f e2 /r] PENT,MMX,SQ
+PSRAD mmxreg,imm [mi: np 0f 72 /4 ib,u] PENT,MMX
+PSRAW mmxreg,mmxrm [rm: np o64nw 0f e1 /r] PENT,MMX,SQ
+PSRAW mmxreg,imm [mi: np 0f 71 /4 ib,u] PENT,MMX
+PSRLD mmxreg,mmxrm [rm: np o64nw 0f d2 /r] PENT,MMX,SQ
+PSRLD mmxreg,imm [mi: np 0f 72 /2 ib,u] PENT,MMX
+PSRLQ mmxreg,mmxrm [rm: np o64nw 0f d3 /r] PENT,MMX,SQ
+PSRLQ mmxreg,imm [mi: np 0f 73 /2 ib,u] PENT,MMX
+PSRLW mmxreg,mmxrm [rm: np o64nw 0f d1 /r] PENT,MMX,SQ
+PSRLW mmxreg,imm [mi: np 0f 71 /2 ib,u] PENT,MMX
+PSUBB mmxreg,mmxrm [rm: np o64nw 0f f8 /r] PENT,MMX,SQ
+PSUBD mmxreg,mmxrm [rm: np o64nw 0f fa /r] PENT,MMX,SQ
+PSUBSB mmxreg,mmxrm [rm: np o64nw 0f e8 /r] PENT,MMX,SQ
+PSUBSIW mmxreg,mmxrm [rm: o64nw 0f 55 /r] PENT,MMX,SQ,CYRIX
+PSUBSW mmxreg,mmxrm [rm: np o64nw 0f e9 /r] PENT,MMX,SQ
+PSUBUSB mmxreg,mmxrm [rm: np o64nw 0f d8 /r] PENT,MMX,SQ
+PSUBUSW mmxreg,mmxrm [rm: np o64nw 0f d9 /r] PENT,MMX,SQ
+PSUBW mmxreg,mmxrm [rm: np o64nw 0f f9 /r] PENT,MMX,SQ
+PUNPCKHBW mmxreg,mmxrm [rm: np o64nw 0f 68 /r] PENT,MMX,SQ
+PUNPCKHDQ mmxreg,mmxrm [rm: np o64nw 0f 6a /r] PENT,MMX,SQ
+PUNPCKHWD mmxreg,mmxrm [rm: np o64nw 0f 69 /r] PENT,MMX,SQ
+PUNPCKLBW mmxreg,mmxrm [rm: np o64nw 0f 60 /r] PENT,MMX,SQ
+PUNPCKLDQ mmxreg,mmxrm [rm: np o64nw 0f 62 /r] PENT,MMX,SQ
+PUNPCKLWD mmxreg,mmxrm [rm: np o64nw 0f 61 /r] PENT,MMX,SQ
+PUSH reg16 [r: o16 50+r] 8086
+PUSH reg32 [r: o32 50+r] 386,NOLONG
+PUSH reg64 [r: o64nw 50+r] X64
+PUSH rm16 [m: o16 ff /6] 8086
+PUSH rm32 [m: o32 ff /6] 386,NOLONG
+PUSH rm64 [m: o64nw ff /6] X64
+PUSH reg_es [-: 06] 8086,NOLONG
+PUSH reg_cs [-: 0e] 8086,NOLONG
+PUSH reg_ss [-: 16] 8086,NOLONG
+PUSH reg_ds [-: 1e] 8086,NOLONG
+PUSH reg_fs [-: 0f a0] 386
+PUSH reg_gs [-: 0f a8] 386
+PUSH imm8 [i: 6a ib,s] 186
+PUSH sbyteword16 [i: o16 6a ib,s] 186,AR0,SIZE,ND
+PUSH imm16 [i: o16 68 iw] 186,AR0,SIZE
+PUSH sbytedword32 [i: o32 6a ib,s] 386,NOLONG,AR0,SIZE,ND
+PUSH imm32 [i: o32 68 id] 386,NOLONG,AR0,SIZE
+PUSH sbytedword32 [i: o32 6a ib,s] 386,NOLONG,SD,ND
+PUSH imm32 [i: o32 68 id] 386,NOLONG,SD
+PUSH sbytedword64 [i: o64nw 6a ib,s] X64,AR0,SIZE,ND
+PUSH imm64 [i: o64nw 68 id,s] X64,AR0,SIZE
+PUSH sbytedword32 [i: o64nw 6a ib,s] X64,AR0,SIZE,ND
+PUSH imm32 [i: o64nw 68 id,s] X64,AR0,SIZE
+PUSHA void [ odf 60] 186,NOLONG
+PUSHAD void [ o32 60] 386,NOLONG
+PUSHAW void [ o16 60] 186,NOLONG
+PUSHF void [ odf 9c] 8086
+PUSHFD void [ o32 9c] 386,NOLONG
+PUSHFQ void [ o32 9c] X64
+PUSHFW void [ o16 9c] 8086
+PXOR mmxreg,mmxrm [rm: np o64nw 0f ef /r] PENT,MMX,SQ
+RCL rm8,unity [m-: d0 /2] 8086
+RCL rm8,reg_cl [m-: d2 /2] 8086
+RCL rm8,imm8 [mi: c0 /2 ib,u] 186
+RCL rm16,unity [m-: o16 d1 /2] 8086
+RCL rm16,reg_cl [m-: o16 d3 /2] 8086
+RCL rm16,imm8 [mi: o16 c1 /2 ib,u] 186
+RCL rm32,unity [m-: o32 d1 /2] 386
+RCL rm32,reg_cl [m-: o32 d3 /2] 386
+RCL rm32,imm8 [mi: o32 c1 /2 ib,u] 386
+RCL rm64,unity [m-: o64 d1 /2] X64
+RCL rm64,reg_cl [m-: o64 d3 /2] X64
+RCL rm64,imm8 [mi: o64 c1 /2 ib,u] X64
+RCR rm8,unity [m-: d0 /3] 8086
+RCR rm8,reg_cl [m-: d2 /3] 8086
+RCR rm8,imm8 [mi: c0 /3 ib,u] 186
+RCR rm16,unity [m-: o16 d1 /3] 8086
+RCR rm16,reg_cl [m-: o16 d3 /3] 8086
+RCR rm16,imm8 [mi: o16 c1 /3 ib,u] 186
+RCR rm32,unity [m-: o32 d1 /3] 386
+RCR rm32,reg_cl [m-: o32 d3 /3] 386
+RCR rm32,imm8 [mi: o32 c1 /3 ib,u] 386
+RCR rm64,unity [m-: o64 d1 /3] X64
+RCR rm64,reg_cl [m-: o64 d3 /3] X64
+RCR rm64,imm8 [mi: o64 c1 /3 ib,u] X64
+RDSHR rm32 [m: o32 0f 36 /0] P6,CYRIX,SMM
+RDMSR void [ 0f 32] PENT,PRIV
+RDPMC void [ 0f 33] P6
+RDTSC void [ 0f 31] PENT
+RDTSCP void [ 0f 01 f9] X86_64
+RET void [ c3] 8086,BND
+RET imm [i: c2 iw] 8086,SW,BND
+RETF void [ cb] 8086
+RETF imm [i: ca iw] 8086,SW
+RETN void [ c3] 8086,BND
+RETN imm [i: c2 iw] 8086,SW,BND
+RETW void [ o16 c3] 8086,BND
+RETW imm [i: c2 iw] 8086,SW,BND
+RETFW void [ o16 cb] 8086
+RETFW imm [i: o16 ca iw] 8086,SW
+RETNW void [ o16 c3] 8086,BND
+RETNW imm [i: o16 c2 iw] 8086,SW,BND
+RETD void [ o32 c3] 8086,BND,NOLONG
+RETD imm [i: o32 c2 iw] 8086,SW,BND,NOLONG
+RETFD void [ o32 cb] 8086
+RETFD imm [i: o32 ca iw] 8086,SW
+RETND void [ o32 c3] 8086,BND,NOLONG
+RETND imm [i: o32 c2 iw] 8086,SW,BND,NOLONG
+RETQ void [ o64nw c3] X64,BND
+RETQ imm [i: o64nw c2 iw] X64,SW,BND
+RETFQ void [ o64 cb] X64
+RETFQ imm [i: o64 ca iw] X64,SW
+RETNQ void [ o64nw c3] X64,BND
+RETNQ imm [i: o64nw c2 iw] X64,SW,BND
+
+ROL rm8,unity [m-: d0 /0] 8086
+ROL rm8,reg_cl [m-: d2 /0] 8086
+ROL rm8,imm8 [mi: c0 /0 ib,u] 186
+ROL rm16,unity [m-: o16 d1 /0] 8086
+ROL rm16,reg_cl [m-: o16 d3 /0] 8086
+ROL rm16,imm8 [mi: o16 c1 /0 ib,u] 186
+ROL rm32,unity [m-: o32 d1 /0] 386
+ROL rm32,reg_cl [m-: o32 d3 /0] 386
+ROL rm32,imm8 [mi: o32 c1 /0 ib,u] 386
+ROL rm64,unity [m-: o64 d1 /0] X64
+ROL rm64,reg_cl [m-: o64 d3 /0] X64
+ROL rm64,imm8 [mi: o64 c1 /0 ib,u] X64
+ROR rm8,unity [m-: d0 /1] 8086
+ROR rm8,reg_cl [m-: d2 /1] 8086
+ROR rm8,imm8 [mi: c0 /1 ib,u] 186
+ROR rm16,unity [m-: o16 d1 /1] 8086
+ROR rm16,reg_cl [m-: o16 d3 /1] 8086
+ROR rm16,imm8 [mi: o16 c1 /1 ib,u] 186
+ROR rm32,unity [m-: o32 d1 /1] 386
+ROR rm32,reg_cl [m-: o32 d3 /1] 386
+ROR rm32,imm8 [mi: o32 c1 /1 ib,u] 386
+ROR rm64,unity [m-: o64 d1 /1] X64
+ROR rm64,reg_cl [m-: o64 d3 /1] X64
+ROR rm64,imm8 [mi: o64 c1 /1 ib,u] X64
+RDM void [ 0f 3a] P6,CYRIX,ND
+RSDC reg_sreg,mem80 [rm: 0f 79 /r] 486,CYRIX,SMM
+RSLDT mem80 [m: 0f 7b /0] 486,CYRIX,SMM
+RSM void [ 0f aa] PENT,SMM
+RSTS mem80 [m: 0f 7d /0] 486,CYRIX,SMM
+SAHF void [ 9e] 8086
+SAL rm8,unity [m-: d0 /4] 8086,ND
+SAL rm8,reg_cl [m-: d2 /4] 8086,ND
+SAL rm8,imm8 [mi: c0 /4 ib,u] 186,ND
+SAL rm16,unity [m-: o16 d1 /4] 8086,ND
+SAL rm16,reg_cl [m-: o16 d3 /4] 8086,ND
+SAL rm16,imm8 [mi: o16 c1 /4 ib,u] 186,ND
+SAL rm32,unity [m-: o32 d1 /4] 386,ND
+SAL rm32,reg_cl [m-: o32 d3 /4] 386,ND
+SAL rm32,imm8 [mi: o32 c1 /4 ib,u] 386,ND
+SAL rm64,unity [m-: o64 d1 /4] X64,ND
+SAL rm64,reg_cl [m-: o64 d3 /4] X64,ND
+SAL rm64,imm8 [mi: o64 c1 /4 ib,u] X64,ND
+SALC void [ d6] 8086,UNDOC
+SAR rm8,unity [m-: d0 /7] 8086
+SAR rm8,reg_cl [m-: d2 /7] 8086
+SAR rm8,imm8 [mi: c0 /7 ib,u] 186
+SAR rm16,unity [m-: o16 d1 /7] 8086
+SAR rm16,reg_cl [m-: o16 d3 /7] 8086
+SAR rm16,imm8 [mi: o16 c1 /7 ib,u] 186
+SAR rm32,unity [m-: o32 d1 /7] 386
+SAR rm32,reg_cl [m-: o32 d3 /7] 386
+SAR rm32,imm8 [mi: o32 c1 /7 ib,u] 386
+SAR rm64,unity [m-: o64 d1 /7] X64
+SAR rm64,reg_cl [m-: o64 d3 /7] X64
+SAR rm64,imm8 [mi: o64 c1 /7 ib,u] X64
+SBB mem,reg8 [mr: hle 18 /r] 8086,SM,LOCK
+SBB reg8,reg8 [mr: 18 /r] 8086
+SBB mem,reg16 [mr: hle o16 19 /r] 8086,SM,LOCK
+SBB reg16,reg16 [mr: o16 19 /r] 8086
+SBB mem,reg32 [mr: hle o32 19 /r] 386,SM,LOCK
+SBB reg32,reg32 [mr: o32 19 /r] 386
+SBB mem,reg64 [mr: hle o64 19 /r] X64,SM,LOCK
+SBB reg64,reg64 [mr: o64 19 /r] X64
+SBB reg8,mem [rm: 1a /r] 8086,SM
+SBB reg8,reg8 [rm: 1a /r] 8086
+SBB reg16,mem [rm: o16 1b /r] 8086,SM
+SBB reg16,reg16 [rm: o16 1b /r] 8086
+SBB reg32,mem [rm: o32 1b /r] 386,SM
+SBB reg32,reg32 [rm: o32 1b /r] 386
+SBB reg64,mem [rm: o64 1b /r] X64,SM
+SBB reg64,reg64 [rm: o64 1b /r] X64
+SBB rm16,imm8 [mi: hle o16 83 /3 ib,s] 8086,LOCK
+SBB rm32,imm8 [mi: hle o32 83 /3 ib,s] 386,LOCK
+SBB rm64,imm8 [mi: hle o64 83 /3 ib,s] X64,LOCK
+SBB reg_al,imm [-i: 1c ib] 8086,SM
+SBB reg_ax,sbyteword [mi: o16 83 /3 ib,s] 8086,SM,ND
+SBB reg_ax,imm [-i: o16 1d iw] 8086,SM
+SBB reg_eax,sbytedword [mi: o32 83 /3 ib,s] 386,SM,ND
+SBB reg_eax,imm [-i: o32 1d id] 386,SM
+SBB reg_rax,sbytedword [mi: o64 83 /3 ib,s] X64,SM,ND
+SBB reg_rax,imm [-i: o64 1d id,s] X64,SM
+SBB rm8,imm [mi: hle 80 /3 ib] 8086,SM,LOCK
+SBB rm16,sbyteword [mi: hle o16 83 /3 ib,s] 8086,SM,LOCK,ND
+SBB rm16,imm [mi: hle o16 81 /3 iw] 8086,SM,LOCK
+SBB rm32,sbytedword [mi: hle o32 83 /3 ib,s] 386,SM,LOCK,ND
+SBB rm32,imm [mi: hle o32 81 /3 id] 386,SM,LOCK
+SBB rm64,sbytedword [mi: hle o64 83 /3 ib,s] X64,SM,LOCK,ND
+SBB rm64,imm [mi: hle o64 81 /3 id,s] X64,SM,LOCK
+SBB mem,imm8 [mi: hle 80 /3 ib] 8086,SM,LOCK
+SBB mem,sbyteword16 [mi: hle o16 83 /3 ib,s] 8086,SM,LOCK,ND
+SBB mem,imm16 [mi: hle o16 81 /3 iw] 8086,SM,LOCK
+SBB mem,sbytedword32 [mi: hle o32 83 /3 ib,s] 386,SM,LOCK,ND
+SBB mem,imm32 [mi: hle o32 81 /3 id] 386,SM,LOCK
+SBB rm8,imm [mi: hle 82 /3 ib] 8086,SM,LOCK,ND,NOLONG
+SCASB void [ repe ae] 8086
+SCASD void [ repe o32 af] 386
+SCASQ void [ repe o64 af] X64
+SCASW void [ repe o16 af] 8086
+SFENCE void [ np 0f ae f8] X64,AMD
+SGDT mem [m: 0f 01 /0] 286
+SHL rm8,unity [m-: d0 /4] 8086
+SHL rm8,reg_cl [m-: d2 /4] 8086
+SHL rm8,imm8 [mi: c0 /4 ib,u] 186
+SHL rm16,unity [m-: o16 d1 /4] 8086
+SHL rm16,reg_cl [m-: o16 d3 /4] 8086
+SHL rm16,imm8 [mi: o16 c1 /4 ib,u] 186
+SHL rm32,unity [m-: o32 d1 /4] 386
+SHL rm32,reg_cl [m-: o32 d3 /4] 386
+SHL rm32,imm8 [mi: o32 c1 /4 ib,u] 386
+SHL rm64,unity [m-: o64 d1 /4] X64
+SHL rm64,reg_cl [m-: o64 d3 /4] X64
+SHL rm64,imm8 [mi: o64 c1 /4 ib,u] X64
+SHLD mem,reg16,imm [mri: o16 0f a4 /r ib,u] 386,SM2,SB,AR2
+SHLD reg16,reg16,imm [mri: o16 0f a4 /r ib,u] 386,SM2,SB,AR2
+SHLD mem,reg32,imm [mri: o32 0f a4 /r ib,u] 386,SM2,SB,AR2
+SHLD reg32,reg32,imm [mri: o32 0f a4 /r ib,u] 386,SM2,SB,AR2
+SHLD mem,reg64,imm [mri: o64 0f a4 /r ib,u] X64,SM2,SB,AR2
+SHLD reg64,reg64,imm [mri: o64 0f a4 /r ib,u] X64,SM2,SB,AR2
+SHLD mem,reg16,reg_cl [mr-: o16 0f a5 /r] 386,SM
+SHLD reg16,reg16,reg_cl [mr-: o16 0f a5 /r] 386
+SHLD mem,reg32,reg_cl [mr-: o32 0f a5 /r] 386,SM
+SHLD reg32,reg32,reg_cl [mr-: o32 0f a5 /r] 386
+SHLD mem,reg64,reg_cl [mr-: o64 0f a5 /r] X64,SM
+SHLD reg64,reg64,reg_cl [mr-: o64 0f a5 /r] X64
+SHR rm8,unity [m-: d0 /5] 8086
+SHR rm8,reg_cl [m-: d2 /5] 8086
+SHR rm8,imm8 [mi: c0 /5 ib,u] 186
+SHR rm16,unity [m-: o16 d1 /5] 8086
+SHR rm16,reg_cl [m-: o16 d3 /5] 8086
+SHR rm16,imm8 [mi: o16 c1 /5 ib,u] 186
+SHR rm32,unity [m-: o32 d1 /5] 386
+SHR rm32,reg_cl [m-: o32 d3 /5] 386
+SHR rm32,imm8 [mi: o32 c1 /5 ib,u] 386
+SHR rm64,unity [m-: o64 d1 /5] X64
+SHR rm64,reg_cl [m-: o64 d3 /5] X64
+SHR rm64,imm8 [mi: o64 c1 /5 ib,u] X64
+SHRD mem,reg16,imm [mri: o16 0f ac /r ib,u] 386,SM2,SB,AR2
+SHRD reg16,reg16,imm [mri: o16 0f ac /r ib,u] 386,SM2,SB,AR2
+SHRD mem,reg32,imm [mri: o32 0f ac /r ib,u] 386,SM2,SB,AR2
+SHRD reg32,reg32,imm [mri: o32 0f ac /r ib,u] 386,SM2,SB,AR2
+SHRD mem,reg64,imm [mri: o64 0f ac /r ib,u] X64,SM2,SB,AR2
+SHRD reg64,reg64,imm [mri: o64 0f ac /r ib,u] X64,SM2,SB,AR2
+SHRD mem,reg16,reg_cl [mr-: o16 0f ad /r] 386,SM
+SHRD reg16,reg16,reg_cl [mr-: o16 0f ad /r] 386
+SHRD mem,reg32,reg_cl [mr-: o32 0f ad /r] 386,SM
+SHRD reg32,reg32,reg_cl [mr-: o32 0f ad /r] 386
+SHRD mem,reg64,reg_cl [mr-: o64 0f ad /r] X64,SM
+SHRD reg64,reg64,reg_cl [mr-: o64 0f ad /r] X64
+SIDT mem [m: 0f 01 /1] 286
+SLDT mem [m: 0f 00 /0] 286
+SLDT mem16 [m: 0f 00 /0] 286
+SLDT reg16 [m: o16 0f 00 /0] 286
+SLDT reg32 [m: o32 0f 00 /0] 386
+SLDT reg64 [m: o64nw 0f 00 /0] X64,ND
+SLDT reg64 [m: o64 0f 00 /0] X64
+SKINIT void [ 0f 01 de] X64
+SMI void [ f1] 386,UNDOC
+SMINT void [ 0f 38] P6,CYRIX,ND
+; Older Cyrix chips had this; they had to move due to conflict with MMX
+SMINTOLD void [ 0f 7e] 486,CYRIX,ND,OBSOLETE
+SMSW mem [m: 0f 01 /4] 286
+SMSW mem16 [m: 0f 01 /4] 286
+SMSW reg16 [m: o16 0f 01 /4] 286
+SMSW reg32 [m: o32 0f 01 /4] 386
+SMSW reg64 [m: o64 0f 01 /4] X64
+STC void [ f9] 8086
+STD void [ fd] 8086
+STI void [ fb] 8086
+STOSB void [ aa] 8086
+STOSD void [ o32 ab] 386
+STOSQ void [ o64 ab] X64
+STOSW void [ o16 ab] 8086
+STR mem [m: 0f 00 /1] 286,PROT
+STR mem16 [m: 0f 00 /1] 286,PROT
+STR reg16 [m: o16 0f 00 /1] 286,PROT
+STR reg32 [m: o32 0f 00 /1] 386,PROT
+STR reg64 [m: o64 0f 00 /1] X64
+SUB mem,reg8 [mr: hle 28 /r] 8086,SM,LOCK
+SUB reg8,reg8 [mr: 28 /r] 8086
+SUB mem,reg16 [mr: hle o16 29 /r] 8086,SM,LOCK
+SUB reg16,reg16 [mr: o16 29 /r] 8086
+SUB mem,reg32 [mr: hle o32 29 /r] 386,SM,LOCK
+SUB reg32,reg32 [mr: o32 29 /r] 386
+SUB mem,reg64 [mr: hle o64 29 /r] X64,SM,LOCK
+SUB reg64,reg64 [mr: o64 29 /r] X64
+SUB reg8,mem [rm: 2a /r] 8086,SM
+SUB reg8,reg8 [rm: 2a /r] 8086
+SUB reg16,mem [rm: o16 2b /r] 8086,SM
+SUB reg16,reg16 [rm: o16 2b /r] 8086
+SUB reg32,mem [rm: o32 2b /r] 386,SM
+SUB reg32,reg32 [rm: o32 2b /r] 386
+SUB reg64,mem [rm: o64 2b /r] X64,SM
+SUB reg64,reg64 [rm: o64 2b /r] X64
+SUB rm16,imm8 [mi: hle o16 83 /5 ib,s] 8086,LOCK
+SUB rm32,imm8 [mi: hle o32 83 /5 ib,s] 386,LOCK
+SUB rm64,imm8 [mi: hle o64 83 /5 ib,s] X64,LOCK
+SUB reg_al,imm [-i: 2c ib] 8086,SM
+SUB reg_ax,sbyteword [mi: o16 83 /5 ib,s] 8086,SM,ND
+SUB reg_ax,imm [-i: o16 2d iw] 8086,SM
+SUB reg_eax,sbytedword [mi: o32 83 /5 ib,s] 386,SM,ND
+SUB reg_eax,imm [-i: o32 2d id] 386,SM
+SUB reg_rax,sbytedword [mi: o64 83 /5 ib,s] X64,SM,ND
+SUB reg_rax,imm [-i: o64 2d id,s] X64,SM
+SUB rm8,imm [mi: hle 80 /5 ib] 8086,SM,LOCK
+SUB rm16,sbyteword [mi: hle o16 83 /5 ib,s] 8086,SM,LOCK,ND
+SUB rm16,imm [mi: hle o16 81 /5 iw] 8086,SM,LOCK
+SUB rm32,sbytedword [mi: hle o32 83 /5 ib,s] 386,SM,LOCK,ND
+SUB rm32,imm [mi: hle o32 81 /5 id] 386,SM,LOCK
+SUB rm64,sbytedword [mi: hle o64 83 /5 ib,s] X64,SM,LOCK,ND
+SUB rm64,imm [mi: hle o64 81 /5 id,s] X64,SM,LOCK
+SUB mem,imm8 [mi: hle 80 /5 ib] 8086,SM,LOCK
+SUB mem,sbyteword16 [mi: hle o16 83 /5 ib,s] 8086,SM,LOCK,ND
+SUB mem,imm16 [mi: hle o16 81 /5 iw] 8086,SM,LOCK
+SUB mem,sbytedword32 [mi: hle o32 83 /5 ib,s] 386,SM,LOCK,ND
+SUB mem,imm32 [mi: hle o32 81 /5 id] 386,SM,LOCK
+SUB rm8,imm [mi: hle 82 /5 ib] 8086,SM,LOCK,ND,NOLONG
+SVDC mem80,reg_sreg [mr: 0f 78 /r] 486,CYRIX,SMM
+SVLDT mem80 [m: 0f 7a /0] 486,CYRIX,SMM,ND
+SVTS mem80 [m: 0f 7c /0] 486,CYRIX,SMM
+SWAPGS void [ 0f 01 f8] X64
+SYSCALL void [ 0f 05] P6,AMD
+SYSENTER void [ 0f 34] P6
+SYSEXIT void [ 0f 35] P6,PRIV
+SYSRET void [ 0f 07] P6,PRIV,AMD
+TEST mem,reg8 [mr: 84 /r] 8086,SM
+TEST reg8,reg8 [mr: 84 /r] 8086
+TEST mem,reg16 [mr: o16 85 /r] 8086,SM
+TEST reg16,reg16 [mr: o16 85 /r] 8086
+TEST mem,reg32 [mr: o32 85 /r] 386,SM
+TEST reg32,reg32 [mr: o32 85 /r] 386
+TEST mem,reg64 [mr: o64 85 /r] X64,SM
+TEST reg64,reg64 [mr: o64 85 /r] X64
+TEST reg8,mem [rm: 84 /r] 8086,SM
+TEST reg16,mem [rm: o16 85 /r] 8086,SM
+TEST reg32,mem [rm: o32 85 /r] 386,SM
+TEST reg64,mem [rm: o64 85 /r] X64,SM
+TEST reg_al,imm [-i: a8 ib] 8086,SM
+TEST reg_ax,imm [-i: o16 a9 iw] 8086,SM
+TEST reg_eax,imm [-i: o32 a9 id] 386,SM
+TEST reg_rax,imm [-i: o64 a9 id,s] X64,SM
+TEST rm8,imm [mi: f6 /0 ib] 8086,SM
+TEST rm16,imm [mi: o16 f7 /0 iw] 8086,SM
+TEST rm32,imm [mi: o32 f7 /0 id] 386,SM
+TEST rm64,imm [mi: o64 f7 /0 id,s] X64,SM
+TEST mem,imm8 [mi: f6 /0 ib] 8086,SM
+TEST mem,imm16 [mi: o16 f7 /0 iw] 8086,SM
+TEST mem,imm32 [mi: o32 f7 /0 id] 386,SM
+UD0 void [ 0f ff] 186,OBSOLETE
+UD0 reg16,rm16 [rm: o16 0f ff /r] 186
+UD0 reg32,rm32 [rm: o32 0f ff /r] 186
+UD0 reg64,rm64 [rm: o64 0f ff /r] 186
+UD1 reg,rm16 [rm: o16 0f b9 /r] 186
+UD1 reg,rm32 [rm: o32 0f b9 /r] 186
+UD1 reg,rm64 [rm: o64 0f b9 /r] 186
+UD1 void [ 0f b9] 186,ND
+UD2B void [ 0f b9] 186,ND
+UD2B reg,rm16 [rm: o16 0f b9 /r] 186,ND
+UD2B reg,rm32 [rm: o32 0f b9 /r] 186,ND
+UD2B reg,rm64 [rm: o64 0f b9 /r] 186,ND
+UD2 void [ 0f 0b] 186
+UD2A void [ 0f 0b] 186,ND
+UMOV mem,reg8 [mr: np 0f 10 /r] 386,UNDOC,SM,ND
+UMOV reg8,reg8 [mr: np 0f 10 /r] 386,UNDOC,ND
+UMOV mem,reg16 [mr: np o16 0f 11 /r] 386,UNDOC,SM,ND
+UMOV reg16,reg16 [mr: np o16 0f 11 /r] 386,UNDOC,ND
+UMOV mem,reg32 [mr: np o32 0f 11 /r] 386,UNDOC,SM,ND
+UMOV reg32,reg32 [mr: np o32 0f 11 /r] 386,UNDOC,ND
+UMOV reg8,mem [rm: np 0f 12 /r] 386,UNDOC,SM,ND
+UMOV reg8,reg8 [rm: np 0f 12 /r] 386,UNDOC,ND
+UMOV reg16,mem [rm: np o16 0f 13 /r] 386,UNDOC,SM,ND
+UMOV reg16,reg16 [rm: np o16 0f 13 /r] 386,UNDOC,ND
+UMOV reg32,mem [rm: np o32 0f 13 /r] 386,UNDOC,SM,ND
+UMOV reg32,reg32 [rm: np o32 0f 13 /r] 386,UNDOC,ND
+VERR mem [m: 0f 00 /4] 286,PROT
+VERR mem16 [m: 0f 00 /4] 286,PROT
+VERR reg16 [m: 0f 00 /4] 286,PROT
+VERW mem [m: 0f 00 /5] 286,PROT
+VERW mem16 [m: 0f 00 /5] 286,PROT
+VERW reg16 [m: 0f 00 /5] 286,PROT
+FWAIT void [ wait] 8086
+WBINVD void [ 0f 09] 486,PRIV
+WRSHR rm32 [m: o32 0f 37 /0] P6,CYRIX,SMM
+WRMSR void [ 0f 30] PENT,PRIV
+XADD mem,reg8 [mr: hle 0f c0 /r] 486,SM,LOCK
+XADD reg8,reg8 [mr: 0f c0 /r] 486
+XADD mem,reg16 [mr: hle o16 0f c1 /r] 486,SM,LOCK
+XADD reg16,reg16 [mr: o16 0f c1 /r] 486
+XADD mem,reg32 [mr: hle o32 0f c1 /r] 486,SM,LOCK
+XADD reg32,reg32 [mr: o32 0f c1 /r] 486
+XADD mem,reg64 [mr: hle o64 0f c1 /r] X64,SM,LOCK
+XADD reg64,reg64 [mr: o64 0f c1 /r] X64
+XBTS reg16,mem [rm: o16 0f a6 /r] 386,SW,UNDOC,ND
+XBTS reg16,reg16 [rm: o16 0f a6 /r] 386,UNDOC,ND
+XBTS reg32,mem [rm: o32 0f a6 /r] 386,SD,UNDOC,ND
+XBTS reg32,reg32 [rm: o32 0f a6 /r] 386,UNDOC,ND
+XCHG reg_ax,reg16 [-r: o16 90+r] 8086
+XCHG reg_eax,reg32na [-r: o32 90+r] 386
+XCHG reg_rax,reg64 [-r: o64 90+r] X64
+XCHG reg16,reg_ax [r-: o16 90+r] 8086
+XCHG reg32na,reg_eax [r-: o32 90+r] 386
+XCHG reg64,reg_rax [r-: o64 90+r] X64
+; This must be NOLONG since opcode 90 is NOP, and in 64-bit mode
+; "xchg eax,eax" is *not* a NOP.
+XCHG reg_eax,reg_eax [--: o32 90] 386,NOLONG
+XCHG reg8,mem [rm: hlenl 86 /r] 8086,SM,LOCK
+XCHG reg8,reg8 [rm: 86 /r] 8086
+XCHG reg16,mem [rm: hlenl o16 87 /r] 8086,SM,LOCK
+XCHG reg16,reg16 [rm: o16 87 /r] 8086
+XCHG reg32,mem [rm: hlenl o32 87 /r] 386,SM,LOCK
+XCHG reg32,reg32 [rm: o32 87 /r] 386
+XCHG reg64,mem [rm: hlenl o64 87 /r] X64,SM,LOCK
+XCHG reg64,reg64 [rm: o64 87 /r] X64
+XCHG mem,reg8 [mr: hlenl 86 /r] 8086,SM,LOCK
+XCHG reg8,reg8 [mr: 86 /r] 8086
+XCHG mem,reg16 [mr: hlenl o16 87 /r] 8086,SM,LOCK
+XCHG reg16,reg16 [mr: o16 87 /r] 8086
+XCHG mem,reg32 [mr: hlenl o32 87 /r] 386,SM,LOCK
+XCHG reg32,reg32 [mr: o32 87 /r] 386
+XCHG mem,reg64 [mr: hlenl o64 87 /r] X64,SM,LOCK
+XCHG reg64,reg64 [mr: o64 87 /r] X64
+XLATB void [ d7] 8086
+XLAT void [ d7] 8086
+XOR mem,reg8 [mr: hle 30 /r] 8086,SM,LOCK
+XOR reg8,reg8 [mr: 30 /r] 8086
+XOR mem,reg16 [mr: hle o16 31 /r] 8086,SM,LOCK
+XOR reg16,reg16 [mr: o16 31 /r] 8086
+XOR mem,reg32 [mr: hle o32 31 /r] 386,SM,LOCK
+XOR reg32,reg32 [mr: o32 31 /r] 386
+XOR mem,reg64 [mr: hle o64 31 /r] X64,SM,LOCK
+XOR reg64,reg64 [mr: o64 31 /r] X64
+XOR reg8,mem [rm: 32 /r] 8086,SM
+XOR reg8,reg8 [rm: 32 /r] 8086
+XOR reg16,mem [rm: o16 33 /r] 8086,SM
+XOR reg16,reg16 [rm: o16 33 /r] 8086
+XOR reg32,mem [rm: o32 33 /r] 386,SM
+XOR reg32,reg32 [rm: o32 33 /r] 386
+XOR reg64,mem [rm: o64 33 /r] X64,SM
+XOR reg64,reg64 [rm: o64 33 /r] X64
+XOR rm16,imm8 [mi: hle o16 83 /6 ib,s] 8086,LOCK
+XOR rm32,imm8 [mi: hle o32 83 /6 ib,s] 386,LOCK
+XOR rm64,imm8 [mi: hle o64 83 /6 ib,s] X64,LOCK
+XOR reg_al,imm [-i: 34 ib] 8086,SM
+XOR reg_ax,sbyteword [mi: o16 83 /6 ib,s] 8086,SM,ND
+XOR reg_ax,imm [-i: o16 35 iw] 8086,SM
+XOR reg_eax,sbytedword [mi: o32 83 /6 ib,s] 386,SM,ND
+XOR reg_eax,imm [-i: o32 35 id] 386,SM
+XOR reg_rax,sbytedword [mi: o64 83 /6 ib,s] X64,SM,ND
+XOR reg_rax,imm [-i: o64 35 id,s] X64,SM
+XOR rm8,imm [mi: hle 80 /6 ib] 8086,SM,LOCK
+XOR rm16,sbyteword [mi: hle o16 83 /6 ib,s] 8086,SM,LOCK,ND
+XOR rm16,imm [mi: hle o16 81 /6 iw] 8086,SM,LOCK
+XOR rm32,sbytedword [mi: hle o32 83 /6 ib,s] 386,SM,LOCK,ND
+XOR rm32,imm [mi: hle o32 81 /6 id] 386,SM,LOCK
+XOR rm64,sbytedword [mi: hle o64 83 /6 ib,s] X64,SM,LOCK,ND
+XOR rm64,imm [mi: hle o64 81 /6 id,s] X64,SM,LOCK
+XOR mem,imm8 [mi: hle 80 /6 ib] 8086,SM,LOCK
+XOR mem,sbyteword16 [mi: hle o16 83 /6 ib,s] 8086,SM,LOCK,ND
+XOR mem,imm16 [mi: hle o16 81 /6 iw] 8086,SM,LOCK
+XOR mem,sbytedword32 [mi: hle o32 83 /6 ib,s] 386,SM,LOCK,ND
+XOR mem,imm32 [mi: hle o32 81 /6 id] 386,SM,LOCK
+XOR rm8,imm [mi: hle 82 /6 ib] 8086,SM,LOCK,ND,NOLONG
+CMOVcc reg16,mem [rm: o16 0f 40+c /r] P6,SM
+CMOVcc reg16,reg16 [rm: o16 0f 40+c /r] P6
+CMOVcc reg32,mem [rm: o32 0f 40+c /r] P6,SM
+CMOVcc reg32,reg32 [rm: o32 0f 40+c /r] P6
+CMOVcc reg64,mem [rm: o64 0f 40+c /r] X64,SM
+CMOVcc reg64,reg64 [rm: o64 0f 40+c /r] X64
+Jcc imm|near [i: odf 0f 80+c rel] 386,BND
+Jcc imm16|near [i: o16 0f 80+c rel] 386,NOLONG,BND
+Jcc imm32|near [i: o32 0f 80+c rel] 386,NOLONG,BND
+Jcc imm64|near [i: o64nw 0f 80+c rel] X64,BND
+Jcc imm|short [i: 70+c rel8] 8086,ND,BND
+Jcc imm [i: jcc8 70+c rel8] 8086,ND,BND
+Jcc imm [i: 0f 80+c rel] 386,ND,BND
+Jcc imm [i: 71+c jlen e9 rel] 8086,ND,BND
+Jcc imm [i: 70+c rel8] 8086,BND
+
+SETcc mem [m: 0f 90+c /0] 386,SB
+SETcc reg8 [m: 0f 90+c /0] 386
+
+;# Katmai Streaming SIMD instructions (SSE -- a.k.a. KNI, XMM, MMX2)
+ADDPS xmmreg,xmmrm128 [rm: np 0f 58 /r] KATMAI,SSE
+ADDSS xmmreg,xmmrm32 [rm: f3 0f 58 /r] KATMAI,SSE
+ANDNPS xmmreg,xmmrm128 [rm: np 0f 55 /r] KATMAI,SSE
+ANDPS xmmreg,xmmrm128 [rm: np 0f 54 /r] KATMAI,SSE
+CMPEQPS xmmreg,xmmrm128 [rm: np 0f c2 /r 00] KATMAI,SSE
+CMPEQSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 00] KATMAI,SSE
+CMPLEPS xmmreg,xmmrm128 [rm: np 0f c2 /r 02] KATMAI,SSE
+CMPLESS xmmreg,xmmrm32 [rm: f3 0f c2 /r 02] KATMAI,SSE
+CMPLTPS xmmreg,xmmrm128 [rm: np 0f c2 /r 01] KATMAI,SSE
+CMPLTSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 01] KATMAI,SSE
+CMPNEQPS xmmreg,xmmrm128 [rm: np 0f c2 /r 04] KATMAI,SSE
+CMPNEQSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 04] KATMAI,SSE
+CMPNLEPS xmmreg,xmmrm128 [rm: np 0f c2 /r 06] KATMAI,SSE
+CMPNLESS xmmreg,xmmrm32 [rm: f3 0f c2 /r 06] KATMAI,SSE
+CMPNLTPS xmmreg,xmmrm128 [rm: np 0f c2 /r 05] KATMAI,SSE
+CMPNLTSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 05] KATMAI,SSE
+CMPORDPS xmmreg,xmmrm128 [rm: np 0f c2 /r 07] KATMAI,SSE
+CMPORDSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 07] KATMAI,SSE
+CMPUNORDPS xmmreg,xmmrm128 [rm: np 0f c2 /r 03] KATMAI,SSE
+CMPUNORDSS xmmreg,xmmrm32 [rm: f3 0f c2 /r 03] KATMAI,SSE
+; CMPPS/CMPSS must come after the specific ops; that way the disassembler will find the
+; specific ops first and only disassemble illegal ones as cmpps/cmpss.
+CMPPS xmmreg,mem,imm [rmi: np 0f c2 /r ib,u] KATMAI,SSE,SB,AR2
+CMPPS xmmreg,xmmreg,imm [rmi: np 0f c2 /r ib,u] KATMAI,SSE,SB,AR2
+CMPSS xmmreg,mem,imm [rmi: f3 0f c2 /r ib,u] KATMAI,SSE,SB,AR2
+CMPSS xmmreg,xmmreg,imm [rmi: f3 0f c2 /r ib,u] KATMAI,SSE,SB,AR2
+COMISS xmmreg,xmmrm32 [rm: np 0f 2f /r] KATMAI,SSE
+CVTPI2PS xmmreg,mmxrm64 [rm: np 0f 2a /r] KATMAI,SSE,MMX
+CVTPS2PI mmxreg,xmmrm64 [rm: np 0f 2d /r] KATMAI,SSE,MMX
+CVTSI2SS xmmreg,mem [rm: f3 0f 2a /r] KATMAI,SSE,SD,AR1,ND
+CVTSI2SS xmmreg,rm32 [rm: f3 0f 2a /r] KATMAI,SSE,SD,AR1
+CVTSI2SS xmmreg,rm64 [rm: o64 f3 0f 2a /r] X64,SSE,SQ,AR1
+CVTSS2SI reg32,xmmreg [rm: f3 0f 2d /r] KATMAI,SSE,SD,AR1
+CVTSS2SI reg32,mem [rm: f3 0f 2d /r] KATMAI,SSE,SD,AR1
+CVTSS2SI reg64,xmmreg [rm: o64 f3 0f 2d /r] X64,SSE,SD,AR1
+CVTSS2SI reg64,mem [rm: o64 f3 0f 2d /r] X64,SSE,SD,AR1
+CVTTPS2PI mmxreg,xmmrm [rm: np 0f 2c /r] KATMAI,SSE,MMX,SQ
+CVTTSS2SI reg32,xmmrm [rm: f3 0f 2c /r] KATMAI,SSE,SD,AR1
+CVTTSS2SI reg64,xmmrm [rm: o64 f3 0f 2c /r] X64,SSE,SD,AR1
+DIVPS xmmreg,xmmrm128 [rm: np 0f 5e /r] KATMAI,SSE
+DIVSS xmmreg,xmmrm32 [rm: f3 0f 5e /r] KATMAI,SSE
+LDMXCSR mem32 [m: np 0f ae /2] KATMAI,SSE
+MAXPS xmmreg,xmmrm128 [rm: np 0f 5f /r] KATMAI,SSE
+MAXSS xmmreg,xmmrm32 [rm: f3 0f 5f /r] KATMAI,SSE
+MINPS xmmreg,xmmrm128 [rm: np 0f 5d /r] KATMAI,SSE
+MINSS xmmreg,xmmrm32 [rm: f3 0f 5d /r] KATMAI,SSE
+MOVAPS xmmreg,xmmrm128 [rm: np 0f 28 /r] KATMAI,SSE
+MOVAPS xmmrm128,xmmreg [mr: np 0f 29 /r] KATMAI,SSE
+MOVHPS xmmreg,mem64 [rm: np 0f 16 /r] KATMAI,SSE
+MOVHPS mem64,xmmreg [mr: np 0f 17 /r] KATMAI,SSE
+MOVLHPS xmmreg,xmmreg [rm: np 0f 16 /r] KATMAI,SSE
+MOVLPS xmmreg,mem64 [rm: np 0f 12 /r] KATMAI,SSE
+MOVLPS mem64,xmmreg [mr: np 0f 13 /r] KATMAI,SSE
+MOVHLPS xmmreg,xmmreg [rm: np 0f 12 /r] KATMAI,SSE
+MOVMSKPS reg32,xmmreg [rm: np 0f 50 /r] KATMAI,SSE
+MOVMSKPS reg64,xmmreg [rm: np o64 0f 50 /r] X64,SSE
+MOVNTPS mem128,xmmreg [mr: np 0f 2b /r] KATMAI,SSE
+MOVSS xmmreg,xmmrm32 [rm: f3 0f 10 /r] KATMAI,SSE
+MOVSS mem32,xmmreg [mr: f3 0f 11 /r] KATMAI,SSE
+MOVSS xmmreg,xmmreg [rm: f3 0f 10 /r] KATMAI,SSE
+MOVUPS xmmreg,xmmrm128 [rm: np 0f 10 /r] KATMAI,SSE
+MOVUPS xmmrm128,xmmreg [mr: np 0f 11 /r] KATMAI,SSE
+MULPS xmmreg,xmmrm128 [rm: np 0f 59 /r] KATMAI,SSE
+MULSS xmmreg,xmmrm32 [rm: f3 0f 59 /r] KATMAI,SSE
+ORPS xmmreg,xmmrm128 [rm: np 0f 56 /r] KATMAI,SSE
+RCPPS xmmreg,xmmrm128 [rm: np 0f 53 /r] KATMAI,SSE
+RCPSS xmmreg,xmmrm32 [rm: f3 0f 53 /r] KATMAI,SSE
+RSQRTPS xmmreg,xmmrm128 [rm: np 0f 52 /r] KATMAI,SSE
+RSQRTSS xmmreg,xmmrm32 [rm: f3 0f 52 /r] KATMAI,SSE
+SHUFPS xmmreg,xmmrm128,imm8 [rmi: np 0f c6 /r ib,u] KATMAI,SSE
+SQRTPS xmmreg,xmmrm128 [rm: np 0f 51 /r] KATMAI,SSE
+SQRTSS xmmreg,xmmrm32 [rm: f3 0f 51 /r] KATMAI,SSE
+STMXCSR mem32 [m: np 0f ae /3] KATMAI,SSE
+SUBPS xmmreg,xmmrm128 [rm: np 0f 5c /r] KATMAI,SSE
+SUBSS xmmreg,xmmrm32 [rm: f3 0f 5c /r] KATMAI,SSE
+UCOMISS xmmreg,xmmrm32 [rm: np 0f 2e /r] KATMAI,SSE
+UNPCKHPS xmmreg,xmmrm128 [rm: np 0f 15 /r] KATMAI,SSE
+UNPCKLPS xmmreg,xmmrm128 [rm: np 0f 14 /r] KATMAI,SSE
+XORPS xmmreg,xmmrm128 [rm: np 0f 57 /r] KATMAI,SSE
+
+;# Introduced in Deschutes but necessary for SSE support
+FXRSTOR mem [m: np 0f ae /1] P6,SSE,FPU
+FXRSTOR64 mem [m: o64 np 0f ae /1] X64,SSE,FPU
+FXSAVE mem [m: np 0f ae /0] P6,SSE,FPU
+FXSAVE64 mem [m: o64 np 0f ae /0] X64,SSE,FPU
+
+;# XSAVE group (AVX and extended state)
+; Introduced in late Penryn ... we really need to clean up the handling
+; of CPU feature bits.
+XGETBV void [ 0f 01 d0] NEHALEM
+XSETBV void [ 0f 01 d1] NEHALEM,PRIV
+XSAVE mem [m: np 0f ae /4] NEHALEM
+XSAVE64 mem [m: o64 np 0f ae /4] LONG,NEHALEM
+XSAVEC mem [m: np 0f c7 /4] FUTURE
+XSAVEC64 mem [m: o64 np 0f c7 /4] LONG,FUTURE
+XSAVEOPT mem [m: np 0f ae /6] FUTURE
+XSAVEOPT64 mem [m: o64 np 0f ae /6] LONG,FUTURE
+XSAVES mem [m: np 0f c7 /5] FUTURE
+XSAVES64 mem [m: o64 np 0f c7 /5] LONG,FUTURE
+XRSTOR mem [m: np 0f ae /5] NEHALEM
+XRSTOR64 mem [m: o64 np 0f ae /5] LONG,NEHALEM
+XRSTORS mem [m: np 0f c7 /3] FUTURE
+XRSTORS64 mem [m: o64 np 0f c7 /3] LONG,FUTURE
+
+; These instructions are not SSE-specific; they are
+;# Generic memory operations
+; and work even if CR4.OSFXFR == 0
+PREFETCHNTA mem8 [m: 0f 18 /0] KATMAI
+PREFETCHT0 mem8 [m: 0f 18 /1] KATMAI
+PREFETCHT1 mem8 [m: 0f 18 /2] KATMAI
+PREFETCHT2 mem8 [m: 0f 18 /3] KATMAI
+SFENCE void [ np 0f ae f8] KATMAI
+
+;# New MMX instructions introduced in Katmai
+MASKMOVQ mmxreg,mmxreg [rm: np 0f f7 /r] KATMAI,MMX
+MOVNTQ mem,mmxreg [mr: np 0f e7 /r] KATMAI,MMX,SQ
+PAVGB mmxreg,mmxrm [rm: np o64nw 0f e0 /r] KATMAI,MMX,SQ
+PAVGW mmxreg,mmxrm [rm: np o64nw 0f e3 /r] KATMAI,MMX,SQ
+PEXTRW reg32,mmxreg,imm [rmi: np 0f c5 /r ib,u] KATMAI,MMX,SB,AR2
+; PINSRW is documented as using a reg32, but it's really using only 16 bit
+; -- accept either, but be truthful in disassembly
+PINSRW mmxreg,mem,imm [rmi: np 0f c4 /r ib,u] KATMAI,MMX,SB,AR2
+PINSRW mmxreg,rm16,imm [rmi: np 0f c4 /r ib,u] KATMAI,MMX,SB,AR2
+PINSRW mmxreg,reg32,imm [rmi: np 0f c4 /r ib,u] KATMAI,MMX,SB,AR2
+PMAXSW mmxreg,mmxrm [rm: np o64nw 0f ee /r] KATMAI,MMX,SQ
+PMAXUB mmxreg,mmxrm [rm: np o64nw 0f de /r] KATMAI,MMX,SQ
+PMINSW mmxreg,mmxrm [rm: np o64nw 0f ea /r] KATMAI,MMX,SQ
+PMINUB mmxreg,mmxrm [rm: np o64nw 0f da /r] KATMAI,MMX,SQ
+PMOVMSKB reg32,mmxreg [rm: np 0f d7 /r] KATMAI,MMX
+PMULHUW mmxreg,mmxrm [rm: np o64nw 0f e4 /r] KATMAI,MMX,SQ
+PSADBW mmxreg,mmxrm [rm: np o64nw 0f f6 /r] KATMAI,MMX,SQ
+PSHUFW mmxreg,mmxrm,imm [rmi: np o64nw 0f 70 /r ib] KATMAI,MMX,SM2,SB,AR2
+
+;# AMD Enhanced 3DNow! (Athlon) instructions
+PF2IW mmxreg,mmxrm [rm: o64nw 0f 0f /r 1c] PENT,3DNOW,SQ
+PFNACC mmxreg,mmxrm [rm: o64nw 0f 0f /r 8a] PENT,3DNOW,SQ
+PFPNACC mmxreg,mmxrm [rm: o64nw 0f 0f /r 8e] PENT,3DNOW,SQ
+PI2FW mmxreg,mmxrm [rm: o64nw 0f 0f /r 0c] PENT,3DNOW,SQ
+PSWAPD mmxreg,mmxrm [rm: o64nw 0f 0f /r bb] PENT,3DNOW,SQ
+
+;# Willamette SSE2 Cacheability Instructions
+MASKMOVDQU xmmreg,xmmreg [rm: 66 0f f7 /r] WILLAMETTE,SSE2
+; CLFLUSH needs its own feature flag implemented one day
+CLFLUSH mem [m: np 0f ae /7] WILLAMETTE,SSE2
+MOVNTDQ mem,xmmreg [mr: 66 0f e7 /r] WILLAMETTE,SSE2,SO
+MOVNTI mem,reg32 [mr: np 0f c3 /r] WILLAMETTE,SD
+MOVNTI mem,reg64 [mr: o64 np 0f c3 /r] X64,SQ
+MOVNTPD mem,xmmreg [mr: 66 0f 2b /r] WILLAMETTE,SSE2,SO
+LFENCE void [ np 0f ae e8] WILLAMETTE,SSE2
+MFENCE void [ np 0f ae f0] WILLAMETTE,SSE2
+
+;# Willamette MMX instructions (SSE2 SIMD Integer Instructions)
+MOVD mem,xmmreg [mr: 66 norexw 0f 7e /r] WILLAMETTE,SSE2,SD
+MOVD xmmreg,mem [rm: 66 norexw 0f 6e /r] WILLAMETTE,SSE2,SD
+MOVD xmmreg,rm32 [rm: 66 norexw 0f 6e /r] WILLAMETTE,SSE2
+MOVD rm32,xmmreg [mr: 66 norexw 0f 7e /r] WILLAMETTE,SSE2
+MOVDQA xmmreg,xmmreg [rm: 66 0f 6f /r] WILLAMETTE,SSE2
+MOVDQA mem,xmmreg [mr: 66 0f 7f /r] WILLAMETTE,SSE2,SO
+MOVDQA xmmreg,mem [rm: 66 0f 6f /r] WILLAMETTE,SSE2,SO
+MOVDQA xmmreg,xmmreg [mr: 66 0f 7f /r] WILLAMETTE,SSE2
+MOVDQU xmmreg,xmmreg [rm: f3 0f 6f /r] WILLAMETTE,SSE2
+MOVDQU mem,xmmreg [mr: f3 0f 7f /r] WILLAMETTE,SSE2,SO
+MOVDQU xmmreg,mem [rm: f3 0f 6f /r] WILLAMETTE,SSE2,SO
+MOVDQU xmmreg,xmmreg [mr: f3 0f 7f /r] WILLAMETTE,SSE2
+MOVDQ2Q mmxreg,xmmreg [rm: f2 0f d6 /r] WILLAMETTE,SSE2
+MOVQ xmmreg,xmmreg [rm: f3 0f 7e /r] WILLAMETTE,SSE2
+MOVQ xmmreg,xmmreg [mr: 66 0f d6 /r] WILLAMETTE,SSE2
+MOVQ mem,xmmreg [mr: 66 0f d6 /r] WILLAMETTE,SSE2,SQ
+MOVQ xmmreg,mem [rm: f3 0f 7e /r] WILLAMETTE,SSE2,SQ
+MOVQ xmmreg,rm64 [rm: 66 o64 0f 6e /r] X64,SSE2
+MOVQ rm64,xmmreg [mr: 66 o64 0f 7e /r] X64,SSE2
+MOVQ2DQ xmmreg,mmxreg [rm: f3 0f d6 /r] WILLAMETTE,SSE2
+PACKSSWB xmmreg,xmmrm [rm: 66 0f 63 /r] WILLAMETTE,SSE2,SO
+PACKSSDW xmmreg,xmmrm [rm: 66 0f 6b /r] WILLAMETTE,SSE2,SO
+PACKUSWB xmmreg,xmmrm [rm: 66 0f 67 /r] WILLAMETTE,SSE2,SO
+PADDB xmmreg,xmmrm [rm: 66 0f fc /r] WILLAMETTE,SSE2,SO
+PADDW xmmreg,xmmrm [rm: 66 0f fd /r] WILLAMETTE,SSE2,SO
+PADDD xmmreg,xmmrm [rm: 66 0f fe /r] WILLAMETTE,SSE2,SO
+PADDQ mmxreg,mmxrm [rm: np 0f d4 /r] WILLAMETTE,MMX,SQ
+PADDQ xmmreg,xmmrm [rm: 66 0f d4 /r] WILLAMETTE,SSE2,SO
+PADDSB xmmreg,xmmrm [rm: 66 0f ec /r] WILLAMETTE,SSE2,SO
+PADDSW xmmreg,xmmrm [rm: 66 0f ed /r] WILLAMETTE,SSE2,SO
+PADDUSB xmmreg,xmmrm [rm: 66 0f dc /r] WILLAMETTE,SSE2,SO
+PADDUSW xmmreg,xmmrm [rm: 66 0f dd /r] WILLAMETTE,SSE2,SO
+PAND xmmreg,xmmrm [rm: 66 0f db /r] WILLAMETTE,SSE2,SO
+PANDN xmmreg,xmmrm [rm: 66 0f df /r] WILLAMETTE,SSE2,SO
+PAVGB xmmreg,xmmrm [rm: 66 0f e0 /r] WILLAMETTE,SSE2,SO
+PAVGW xmmreg,xmmrm [rm: 66 0f e3 /r] WILLAMETTE,SSE2,SO
+PCMPEQB xmmreg,xmmrm [rm: 66 0f 74 /r] WILLAMETTE,SSE2,SO
+PCMPEQW xmmreg,xmmrm [rm: 66 0f 75 /r] WILLAMETTE,SSE2,SO
+PCMPEQD xmmreg,xmmrm [rm: 66 0f 76 /r] WILLAMETTE,SSE2,SO
+PCMPGTB xmmreg,xmmrm [rm: 66 0f 64 /r] WILLAMETTE,SSE2,SO
+PCMPGTW xmmreg,xmmrm [rm: 66 0f 65 /r] WILLAMETTE,SSE2,SO
+PCMPGTD xmmreg,xmmrm [rm: 66 0f 66 /r] WILLAMETTE,SSE2,SO
+PEXTRW reg32,xmmreg,imm [rmi: 66 0f c5 /r ib,u] WILLAMETTE,SSE2,SB,AR2
+PEXTRW reg64,xmmreg,imm [rmi: 66 0f c5 /r ib,u] X64,SSE2,SB,AR2,ND
+PINSRW xmmreg,reg16,imm [rmi: 66 0f c4 /r ib,u] WILLAMETTE,SSE2,SB,AR2
+PINSRW xmmreg,reg32,imm [rmi: 66 0f c4 /r ib,u] WILLAMETTE,SSE2,SB,AR2,ND
+PINSRW xmmreg,reg64,imm [rmi: 66 0f c4 /r ib,u] X64,SSE2,SB,AR2,ND
+PINSRW xmmreg,mem,imm [rmi: 66 0f c4 /r ib,u] WILLAMETTE,SSE2,SB,AR2
+PINSRW xmmreg,mem16,imm [rmi: 66 0f c4 /r ib,u] WILLAMETTE,SSE2,SB,AR2
+PMADDWD xmmreg,xmmrm [rm: 66 0f f5 /r] WILLAMETTE,SSE2,SO
+PMAXSW xmmreg,xmmrm [rm: 66 0f ee /r] WILLAMETTE,SSE2,SO
+PMAXUB xmmreg,xmmrm [rm: 66 0f de /r] WILLAMETTE,SSE2,SO
+PMINSW xmmreg,xmmrm [rm: 66 0f ea /r] WILLAMETTE,SSE2,SO
+PMINUB xmmreg,xmmrm [rm: 66 0f da /r] WILLAMETTE,SSE2,SO
+PMOVMSKB reg32,xmmreg [rm: 66 0f d7 /r] WILLAMETTE,SSE2
+PMULHUW xmmreg,xmmrm [rm: 66 0f e4 /r] WILLAMETTE,SSE2,SO
+PMULHW xmmreg,xmmrm [rm: 66 0f e5 /r] WILLAMETTE,SSE2,SO
+PMULLW xmmreg,xmmrm [rm: 66 0f d5 /r] WILLAMETTE,SSE2,SO
+PMULUDQ mmxreg,mmxrm [rm: np o64nw 0f f4 /r] WILLAMETTE,SSE2,SO
+PMULUDQ xmmreg,xmmrm [rm: 66 0f f4 /r] WILLAMETTE,SSE2,SO
+POR xmmreg,xmmrm [rm: 66 0f eb /r] WILLAMETTE,SSE2,SO
+PSADBW xmmreg,xmmrm [rm: 66 0f f6 /r] WILLAMETTE,SSE2,SO
+PSHUFD xmmreg,xmmreg,imm [rmi: 66 0f 70 /r ib] WILLAMETTE,SSE2,SB,AR2
+PSHUFD xmmreg,mem,imm [rmi: 66 0f 70 /r ib] WILLAMETTE,SSE2,SM2,SB,AR2
+PSHUFHW xmmreg,xmmreg,imm [rmi: f3 0f 70 /r ib] WILLAMETTE,SSE2,SB,AR2
+PSHUFHW xmmreg,mem,imm [rmi: f3 0f 70 /r ib] WILLAMETTE,SSE2,SM2,SB,AR2
+PSHUFLW xmmreg,xmmreg,imm [rmi: f2 0f 70 /r ib] WILLAMETTE,SSE2,SB,AR2
+PSHUFLW xmmreg,mem,imm [rmi: f2 0f 70 /r ib] WILLAMETTE,SSE2,SM2,SB,AR2
+PSLLDQ xmmreg,imm [mi: 66 0f 73 /7 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSLLW xmmreg,xmmrm [rm: 66 0f f1 /r] WILLAMETTE,SSE2,SO
+PSLLW xmmreg,imm [mi: 66 0f 71 /6 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSLLD xmmreg,xmmrm [rm: 66 0f f2 /r] WILLAMETTE,SSE2,SO
+PSLLD xmmreg,imm [mi: 66 0f 72 /6 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSLLQ xmmreg,xmmrm [rm: 66 0f f3 /r] WILLAMETTE,SSE2,SO
+PSLLQ xmmreg,imm [mi: 66 0f 73 /6 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRAW xmmreg,xmmrm [rm: 66 0f e1 /r] WILLAMETTE,SSE2,SO
+PSRAW xmmreg,imm [mi: 66 0f 71 /4 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRAD xmmreg,xmmrm [rm: 66 0f e2 /r] WILLAMETTE,SSE2,SO
+PSRAD xmmreg,imm [mi: 66 0f 72 /4 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRLDQ xmmreg,imm [mi: 66 0f 73 /3 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRLW xmmreg,xmmrm [rm: 66 0f d1 /r] WILLAMETTE,SSE2,SO
+PSRLW xmmreg,imm [mi: 66 0f 71 /2 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRLD xmmreg,xmmrm [rm: 66 0f d2 /r] WILLAMETTE,SSE2,SO
+PSRLD xmmreg,imm [mi: 66 0f 72 /2 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSRLQ xmmreg,xmmrm [rm: 66 0f d3 /r] WILLAMETTE,SSE2,SO
+PSRLQ xmmreg,imm [mi: 66 0f 73 /2 ib,u] WILLAMETTE,SSE2,SB,AR1
+PSUBB xmmreg,xmmrm [rm: 66 0f f8 /r] WILLAMETTE,SSE2,SO
+PSUBW xmmreg,xmmrm [rm: 66 0f f9 /r] WILLAMETTE,SSE2,SO
+PSUBD xmmreg,xmmrm [rm: 66 0f fa /r] WILLAMETTE,SSE2,SO
+PSUBQ mmxreg,mmxrm [rm: np o64nw 0f fb /r] WILLAMETTE,SSE2,SO
+PSUBQ xmmreg,xmmrm [rm: 66 0f fb /r] WILLAMETTE,SSE2,SO
+PSUBSB xmmreg,xmmrm [rm: 66 0f e8 /r] WILLAMETTE,SSE2,SO
+PSUBSW xmmreg,xmmrm [rm: 66 0f e9 /r] WILLAMETTE,SSE2,SO
+PSUBUSB xmmreg,xmmrm [rm: 66 0f d8 /r] WILLAMETTE,SSE2,SO
+PSUBUSW xmmreg,xmmrm [rm: 66 0f d9 /r] WILLAMETTE,SSE2,SO
+PUNPCKHBW xmmreg,xmmrm [rm: 66 0f 68 /r] WILLAMETTE,SSE2,SO
+PUNPCKHWD xmmreg,xmmrm [rm: 66 0f 69 /r] WILLAMETTE,SSE2,SO
+PUNPCKHDQ xmmreg,xmmrm [rm: 66 0f 6a /r] WILLAMETTE,SSE2,SO
+PUNPCKHQDQ xmmreg,xmmrm [rm: 66 0f 6d /r] WILLAMETTE,SSE2,SO
+PUNPCKLBW xmmreg,xmmrm [rm: 66 0f 60 /r] WILLAMETTE,SSE2,SO
+PUNPCKLWD xmmreg,xmmrm [rm: 66 0f 61 /r] WILLAMETTE,SSE2,SO
+PUNPCKLDQ xmmreg,xmmrm [rm: 66 0f 62 /r] WILLAMETTE,SSE2,SO
+PUNPCKLQDQ xmmreg,xmmrm [rm: 66 0f 6c /r] WILLAMETTE,SSE2,SO
+PXOR xmmreg,xmmrm [rm: 66 0f ef /r] WILLAMETTE,SSE2,SO
+
+;# Willamette Streaming SIMD instructions (SSE2)
+ADDPD xmmreg,xmmrm [rm: 66 0f 58 /r] WILLAMETTE,SSE2,SO
+ADDSD xmmreg,xmmrm [rm: f2 0f 58 /r] WILLAMETTE,SSE2,SQ
+ANDNPD xmmreg,xmmrm [rm: 66 0f 55 /r] WILLAMETTE,SSE2,SO
+ANDPD xmmreg,xmmrm [rm: 66 0f 54 /r] WILLAMETTE,SSE2,SO
+CMPEQPD xmmreg,xmmrm [rm: 66 0f c2 /r 00] WILLAMETTE,SSE2,SO
+CMPEQSD xmmreg,xmmrm [rm: f2 0f c2 /r 00] WILLAMETTE,SSE2
+CMPLEPD xmmreg,xmmrm [rm: 66 0f c2 /r 02] WILLAMETTE,SSE2,SO
+CMPLESD xmmreg,xmmrm [rm: f2 0f c2 /r 02] WILLAMETTE,SSE2
+CMPLTPD xmmreg,xmmrm [rm: 66 0f c2 /r 01] WILLAMETTE,SSE2,SO
+CMPLTSD xmmreg,xmmrm [rm: f2 0f c2 /r 01] WILLAMETTE,SSE2
+CMPNEQPD xmmreg,xmmrm [rm: 66 0f c2 /r 04] WILLAMETTE,SSE2,SO
+CMPNEQSD xmmreg,xmmrm [rm: f2 0f c2 /r 04] WILLAMETTE,SSE2
+CMPNLEPD xmmreg,xmmrm [rm: 66 0f c2 /r 06] WILLAMETTE,SSE2,SO
+CMPNLESD xmmreg,xmmrm [rm: f2 0f c2 /r 06] WILLAMETTE,SSE2
+CMPNLTPD xmmreg,xmmrm [rm: 66 0f c2 /r 05] WILLAMETTE,SSE2,SO
+CMPNLTSD xmmreg,xmmrm [rm: f2 0f c2 /r 05] WILLAMETTE,SSE2
+CMPORDPD xmmreg,xmmrm [rm: 66 0f c2 /r 07] WILLAMETTE,SSE2,SO
+CMPORDSD xmmreg,xmmrm [rm: f2 0f c2 /r 07] WILLAMETTE,SSE2
+CMPUNORDPD xmmreg,xmmrm [rm: 66 0f c2 /r 03] WILLAMETTE,SSE2,SO
+CMPUNORDSD xmmreg,xmmrm [rm: f2 0f c2 /r 03] WILLAMETTE,SSE2
+; CMPPD/CMPSD must come after the specific ops; that way the disassembler will find the
+; specific ops first and only disassemble illegal ones as cmppd/cmpsd.
+CMPPD xmmreg,xmmrm128,imm8 [rmi: 66 0f c2 /r ib,u] WILLAMETTE,SSE2
+CMPSD xmmreg,xmmrm128,imm8 [rmi: f2 0f c2 /r ib,u] WILLAMETTE,SSE2
+COMISD xmmreg,xmmrm [rm: 66 0f 2f /r] WILLAMETTE,SSE2
+CVTDQ2PD xmmreg,xmmrm [rm: f3 0f e6 /r] WILLAMETTE,SSE2,SQ
+CVTDQ2PS xmmreg,xmmrm [rm: np 0f 5b /r] WILLAMETTE,SSE2,SO
+CVTPD2DQ xmmreg,xmmrm [rm: f2 0f e6 /r] WILLAMETTE,SSE2,SO
+CVTPD2PI mmxreg,xmmrm [rm: 66 0f 2d /r] WILLAMETTE,SSE2,SO
+CVTPD2PS xmmreg,xmmrm [rm: 66 0f 5a /r] WILLAMETTE,SSE2,SO
+CVTPI2PD xmmreg,mmxrm [rm: 66 0f 2a /r] WILLAMETTE,SSE2,SQ
+CVTPS2DQ xmmreg,xmmrm [rm: 66 0f 5b /r] WILLAMETTE,SSE2,SO
+CVTPS2PD xmmreg,xmmrm [rm: np 0f 5a /r] WILLAMETTE,SSE2,SQ
+CVTSD2SI reg32,xmmreg [rm: norexw f2 0f 2d /r] WILLAMETTE,SSE2,SQ,AR1
+CVTSD2SI reg32,mem [rm: norexw f2 0f 2d /r] WILLAMETTE,SSE2,SQ,AR1
+CVTSD2SI reg64,xmmreg [rm: o64 f2 0f 2d /r] X64,SSE2,SQ,AR1
+CVTSD2SI reg64,mem [rm: o64 f2 0f 2d /r] X64,SSE2,SQ,AR1
+CVTSD2SS xmmreg,xmmrm [rm: f2 0f 5a /r] WILLAMETTE,SSE2,SQ
+CVTSI2SD xmmreg,mem [rm: f2 0f 2a /r] WILLAMETTE,SSE2,SD,AR1,ND
+CVTSI2SD xmmreg,rm32 [rm: norexw f2 0f 2a /r] WILLAMETTE,SSE2,SD,AR1
+CVTSI2SD xmmreg,rm64 [rm: o64 f2 0f 2a /r] X64,SSE2,SQ,AR1
+CVTSS2SD xmmreg,xmmrm [rm: f3 0f 5a /r] WILLAMETTE,SSE2,SD
+CVTTPD2PI mmxreg,xmmrm [rm: 66 0f 2c /r] WILLAMETTE,SSE2,SO
+CVTTPD2DQ xmmreg,xmmrm [rm: 66 0f e6 /r] WILLAMETTE,SSE2,SO
+CVTTPS2DQ xmmreg,xmmrm [rm: f3 0f 5b /r] WILLAMETTE,SSE2,SO
+CVTTSD2SI reg32,xmmreg [rm: norexw f2 0f 2c /r] WILLAMETTE,SSE2,SQ,AR1
+CVTTSD2SI reg32,mem [rm: norexw f2 0f 2c /r] WILLAMETTE,SSE2,SQ,AR1
+CVTTSD2SI reg64,xmmreg [rm: o64 f2 0f 2c /r] X64,SSE2,SQ,AR1
+CVTTSD2SI reg64,mem [rm: o64 f2 0f 2c /r] X64,SSE2,SQ,AR1
+DIVPD xmmreg,xmmrm [rm: 66 0f 5e /r] WILLAMETTE,SSE2,SO
+DIVSD xmmreg,xmmrm [rm: f2 0f 5e /r] WILLAMETTE,SSE2
+MAXPD xmmreg,xmmrm [rm: 66 0f 5f /r] WILLAMETTE,SSE2,SO
+MAXSD xmmreg,xmmrm [rm: f2 0f 5f /r] WILLAMETTE,SSE2
+MINPD xmmreg,xmmrm [rm: 66 0f 5d /r] WILLAMETTE,SSE2,SO
+MINSD xmmreg,xmmrm [rm: f2 0f 5d /r] WILLAMETTE,SSE2
+MOVAPD xmmreg,xmmreg [rm: 66 0f 28 /r] WILLAMETTE,SSE2
+MOVAPD xmmreg,xmmreg [mr: 66 0f 29 /r] WILLAMETTE,SSE2
+MOVAPD mem,xmmreg [mr: 66 0f 29 /r] WILLAMETTE,SSE2,SO
+MOVAPD xmmreg,mem [rm: 66 0f 28 /r] WILLAMETTE,SSE2,SO
+MOVHPD mem,xmmreg [mr: 66 0f 17 /r] WILLAMETTE,SSE2
+MOVHPD xmmreg,mem [rm: 66 0f 16 /r] WILLAMETTE,SSE2
+MOVLPD mem64,xmmreg [mr: 66 0f 13 /r] WILLAMETTE,SSE2
+MOVLPD xmmreg,mem64 [rm: 66 0f 12 /r] WILLAMETTE,SSE2
+MOVMSKPD reg32,xmmreg [rm: 66 0f 50 /r] WILLAMETTE,SSE2
+MOVMSKPD reg64,xmmreg [rm: 66 o64 0f 50 /r] X64,SSE2
+MOVSD xmmreg,xmmreg [rm: f2 0f 10 /r] WILLAMETTE,SSE2
+MOVSD xmmreg,xmmreg [mr: f2 0f 11 /r] WILLAMETTE,SSE2
+MOVSD mem64,xmmreg [mr: f2 0f 11 /r] WILLAMETTE,SSE2
+MOVSD xmmreg,mem64 [rm: f2 0f 10 /r] WILLAMETTE,SSE2
+MOVUPD xmmreg,xmmreg [rm: 66 0f 10 /r] WILLAMETTE,SSE2
+MOVUPD xmmreg,xmmreg [mr: 66 0f 11 /r] WILLAMETTE,SSE2
+MOVUPD mem,xmmreg [mr: 66 0f 11 /r] WILLAMETTE,SSE2,SO
+MOVUPD xmmreg,mem [rm: 66 0f 10 /r] WILLAMETTE,SSE2,SO
+MULPD xmmreg,xmmrm [rm: 66 0f 59 /r] WILLAMETTE,SSE2,SO
+MULSD xmmreg,xmmrm [rm: f2 0f 59 /r] WILLAMETTE,SSE2
+ORPD xmmreg,xmmrm [rm: 66 0f 56 /r] WILLAMETTE,SSE2,SO
+SHUFPD xmmreg,xmmreg,imm [rmi: 66 0f c6 /r ib,u] WILLAMETTE,SSE2,SB,AR2
+SHUFPD xmmreg,mem,imm [rmi: 66 0f c6 /r ib,u] WILLAMETTE,SSE2,SM,SB,AR2
+SQRTPD xmmreg,xmmrm [rm: 66 0f 51 /r] WILLAMETTE,SSE2,SO
+SQRTSD xmmreg,xmmrm [rm: f2 0f 51 /r] WILLAMETTE,SSE2
+SUBPD xmmreg,xmmrm [rm: 66 0f 5c /r] WILLAMETTE,SSE2,SO
+SUBSD xmmreg,xmmrm [rm: f2 0f 5c /r] WILLAMETTE,SSE2
+UCOMISD xmmreg,xmmrm [rm: 66 0f 2e /r] WILLAMETTE,SSE2
+UNPCKHPD xmmreg,xmmrm128 [rm: 66 0f 15 /r] WILLAMETTE,SSE2
+UNPCKLPD xmmreg,xmmrm128 [rm: 66 0f 14 /r] WILLAMETTE,SSE2
+XORPD xmmreg,xmmrm128 [rm: 66 0f 57 /r] WILLAMETTE,SSE2
+
+;# Prescott New Instructions (SSE3)
+ADDSUBPD xmmreg,xmmrm [rm: 66 0f d0 /r] PRESCOTT,SSE3,SO
+ADDSUBPS xmmreg,xmmrm [rm: f2 0f d0 /r] PRESCOTT,SSE3,SO
+HADDPD xmmreg,xmmrm [rm: 66 0f 7c /r] PRESCOTT,SSE3,SO
+HADDPS xmmreg,xmmrm [rm: f2 0f 7c /r] PRESCOTT,SSE3,SO
+HSUBPD xmmreg,xmmrm [rm: 66 0f 7d /r] PRESCOTT,SSE3,SO
+HSUBPS xmmreg,xmmrm [rm: f2 0f 7d /r] PRESCOTT,SSE3,SO
+LDDQU xmmreg,mem [rm: f2 0f f0 /r] PRESCOTT,SSE3,SO
+MOVDDUP xmmreg,xmmrm [rm: f2 0f 12 /r] PRESCOTT,SSE3
+MOVSHDUP xmmreg,xmmrm [rm: f3 0f 16 /r] PRESCOTT,SSE3
+MOVSLDUP xmmreg,xmmrm [rm: f3 0f 12 /r] PRESCOTT,SSE3
+
+;# VMX/SVM Instructions
+CLGI void [ 0f 01 dd] VMX,AMD
+STGI void [ 0f 01 dc] VMX,AMD
+VMCALL void [ 0f 01 c1] VMX
+VMCLEAR mem [m: 66 0f c7 /6] VMX
+VMFUNC void [ 0f 01 d4] VMX
+VMLAUNCH void [ 0f 01 c2] VMX
+VMLOAD void [ 0f 01 da] VMX,AMD
+VMMCALL void [ 0f 01 d9] VMX,AMD
+VMPTRLD mem [m: np 0f c7 /6] VMX
+VMPTRST mem [m: np 0f c7 /7] VMX
+VMREAD rm32,reg32 [mr: np 0f 78 /r] VMX,NOLONG,SD
+VMREAD rm64,reg64 [mr: o64nw np 0f 78 /r] X64,VMX,SQ
+VMRESUME void [ 0f 01 c3] VMX
+VMRUN void [ 0f 01 d8] VMX,AMD
+VMSAVE void [ 0f 01 db] VMX,AMD
+VMWRITE reg32,rm32 [rm: np 0f 79 /r] VMX,NOLONG,SD
+VMWRITE reg64,rm64 [rm: o64nw np 0f 79 /r] X64,VMX,SQ
+VMXOFF void [ 0f 01 c4] VMX
+VMXON mem [m: f3 0f c7 /6] VMX
+;# Extended Page Tables VMX instructions
+INVEPT reg32,mem [rm: 66 0f 38 80 /r] VMX,SO,NOLONG
+INVEPT reg64,mem [rm: o64nw 66 0f 38 80 /r] VMX,SO,LONG
+INVVPID reg32,mem [rm: 66 0f 38 81 /r] VMX,SO,NOLONG
+INVVPID reg64,mem [rm: o64nw 66 0f 38 81 /r] VMX,SO,LONG
+
+;# Tejas New Instructions (SSSE3)
+PABSB mmxreg,mmxrm [rm: np 0f 38 1c /r] SSSE3,MMX,SQ
+PABSB xmmreg,xmmrm [rm: 66 0f 38 1c /r] SSSE3
+PABSW mmxreg,mmxrm [rm: np 0f 38 1d /r] SSSE3,MMX,SQ
+PABSW xmmreg,xmmrm [rm: 66 0f 38 1d /r] SSSE3
+PABSD mmxreg,mmxrm [rm: np 0f 38 1e /r] SSSE3,MMX,SQ
+PABSD xmmreg,xmmrm [rm: 66 0f 38 1e /r] SSSE3
+PALIGNR mmxreg,mmxrm,imm [rmi: np 0f 3a 0f /r ib,u] SSSE3,MMX,SQ
+PALIGNR xmmreg,xmmrm,imm [rmi: 66 0f 3a 0f /r ib,u] SSSE3
+PHADDW mmxreg,mmxrm [rm: np 0f 38 01 /r] SSSE3,MMX,SQ
+PHADDW xmmreg,xmmrm [rm: 66 0f 38 01 /r] SSSE3
+PHADDD mmxreg,mmxrm [rm: np 0f 38 02 /r] SSSE3,MMX,SQ
+PHADDD xmmreg,xmmrm [rm: 66 0f 38 02 /r] SSSE3
+PHADDSW mmxreg,mmxrm [rm: np 0f 38 03 /r] SSSE3,MMX,SQ
+PHADDSW xmmreg,xmmrm [rm: 66 0f 38 03 /r] SSSE3
+PHSUBW mmxreg,mmxrm [rm: np 0f 38 05 /r] SSSE3,MMX,SQ
+PHSUBW xmmreg,xmmrm [rm: 66 0f 38 05 /r] SSSE3
+PHSUBD mmxreg,mmxrm [rm: np 0f 38 06 /r] SSSE3,MMX,SQ
+PHSUBD xmmreg,xmmrm [rm: 66 0f 38 06 /r] SSSE3
+PHSUBSW mmxreg,mmxrm [rm: np 0f 38 07 /r] SSSE3,MMX,SQ
+PHSUBSW xmmreg,xmmrm [rm: 66 0f 38 07 /r] SSSE3
+PMADDUBSW mmxreg,mmxrm [rm: np 0f 38 04 /r] SSSE3,MMX,SQ
+PMADDUBSW xmmreg,xmmrm [rm: 66 0f 38 04 /r] SSSE3
+PMULHRSW mmxreg,mmxrm [rm: np 0f 38 0b /r] SSSE3,MMX,SQ
+PMULHRSW xmmreg,xmmrm [rm: 66 0f 38 0b /r] SSSE3
+PSHUFB mmxreg,mmxrm [rm: np 0f 38 00 /r] SSSE3,MMX,SQ
+PSHUFB xmmreg,xmmrm [rm: 66 0f 38 00 /r] SSSE3
+PSIGNB mmxreg,mmxrm [rm: np 0f 38 08 /r] SSSE3,MMX,SQ
+PSIGNB xmmreg,xmmrm [rm: 66 0f 38 08 /r] SSSE3
+PSIGNW mmxreg,mmxrm [rm: np 0f 38 09 /r] SSSE3,MMX,SQ
+PSIGNW xmmreg,xmmrm [rm: 66 0f 38 09 /r] SSSE3
+PSIGND mmxreg,mmxrm [rm: np 0f 38 0a /r] SSSE3,MMX,SQ
+PSIGND xmmreg,xmmrm [rm: 66 0f 38 0a /r] SSSE3
+
+;# AMD SSE4A
+EXTRQ xmmreg,imm,imm [mij: 66 0f 78 /0 ib,u ib,u] SSE4A,AMD
+EXTRQ xmmreg,xmmreg [rm: 66 0f 79 /r] SSE4A,AMD
+INSERTQ xmmreg,xmmreg,imm,imm [rmij: f2 0f 78 /r ib,u ib,u] SSE4A,AMD
+INSERTQ xmmreg,xmmreg [rm: f2 0f 79 /r] SSE4A,AMD
+MOVNTSD mem,xmmreg [mr: f2 0f 2b /r] SSE4A,AMD,SQ
+MOVNTSS mem,xmmreg [mr: f3 0f 2b /r] SSE4A,AMD,SD
+
+;# New instructions in Barcelona
+LZCNT reg16,rm16 [rm: o16 f3i 0f bd /r] P6,AMD
+LZCNT reg32,rm32 [rm: o32 f3i 0f bd /r] P6,AMD
+LZCNT reg64,rm64 [rm: o64 f3i 0f bd /r] X64,AMD
+
+;# Penryn New Instructions (SSE4.1)
+BLENDPD xmmreg,xmmrm,imm [rmi: 66 0f 3a 0d /r ib,u] SSE41
+BLENDPS xmmreg,xmmrm,imm [rmi: 66 0f 3a 0c /r ib,u] SSE41
+BLENDVPD xmmreg,xmmrm,xmm0 [rm-: 66 0f 38 15 /r] SSE41
+BLENDVPD xmmreg,xmmrm [rm: 66 0f 38 15 /r] SSE41
+BLENDVPS xmmreg,xmmrm,xmm0 [rm-: 66 0f 38 14 /r] SSE41
+BLENDVPS xmmreg,xmmrm [rm: 66 0f 38 14 /r] SSE41
+DPPD xmmreg,xmmrm,imm [rmi: 66 0f 3a 41 /r ib,u] SSE41
+DPPS xmmreg,xmmrm,imm [rmi: 66 0f 3a 40 /r ib,u] SSE41
+EXTRACTPS rm32,xmmreg,imm [mri: 66 0f 3a 17 /r ib,u] SSE41
+EXTRACTPS reg64,xmmreg,imm [mri: o64 66 0f 3a 17 /r ib,u] SSE41,X64
+INSERTPS xmmreg,xmmrm,imm [rmi: 66 0f 3a 21 /r ib,u] SSE41,SD
+MOVNTDQA xmmreg,mem128 [rm: 66 0f 38 2a /r] SSE41
+MPSADBW xmmreg,xmmrm,imm [rmi: 66 0f 3a 42 /r ib,u] SSE41
+PACKUSDW xmmreg,xmmrm [rm: 66 0f 38 2b /r] SSE41
+PBLENDVB xmmreg,xmmrm,xmm0 [rm-: 66 0f 38 10 /r] SSE41
+PBLENDVB xmmreg,xmmrm [rm: 66 0f 38 10 /r] SSE41
+PBLENDW xmmreg,xmmrm,imm [rmi: 66 0f 3a 0e /r ib,u] SSE41
+PCMPEQQ xmmreg,xmmrm [rm: 66 0f 38 29 /r] SSE41
+PEXTRB reg32,xmmreg,imm [mri: 66 0f 3a 14 /r ib,u] SSE41
+PEXTRB mem8,xmmreg,imm [mri: 66 0f 3a 14 /r ib,u] SSE41
+PEXTRB reg64,xmmreg,imm [mri: o64nw 66 0f 3a 14 /r ib,u] SSE41,X64
+PEXTRD rm32,xmmreg,imm [mri: norexw 66 0f 3a 16 /r ib,u] SSE41
+PEXTRQ rm64,xmmreg,imm [mri: o64 66 0f 3a 16 /r ib,u] SSE41,X64
+PEXTRW reg32,xmmreg,imm [mri: 66 0f 3a 15 /r ib,u] SSE41
+PEXTRW mem16,xmmreg,imm [mri: 66 0f 3a 15 /r ib,u] SSE41
+PEXTRW reg64,xmmreg,imm [mri: o64 66 0f 3a 15 /r ib,u] SSE41,X64
+PHMINPOSUW xmmreg,xmmrm [rm: 66 0f 38 41 /r] SSE41
+PINSRB xmmreg,mem,imm [rmi: 66 0f 3a 20 /r ib,u] SSE41,SB,AR2
+PINSRB xmmreg,rm8,imm [rmi: nohi 66 0f 3a 20 /r ib,u] SSE41,SB,AR2
+PINSRB xmmreg,reg32,imm [rmi: 66 0f 3a 20 /r ib,u] SSE41,SB,AR2
+PINSRD xmmreg,mem,imm [rmi: norexw 66 0f 3a 22 /r ib,u] SSE41,SB,AR2
+PINSRD xmmreg,rm32,imm [rmi: norexw 66 0f 3a 22 /r ib,u] SSE41,SB,AR2
+PINSRQ xmmreg,mem,imm [rmi: o64 66 0f 3a 22 /r ib,u] SSE41,X64,SB,AR2
+PINSRQ xmmreg,rm64,imm [rmi: o64 66 0f 3a 22 /r ib,u] SSE41,X64,SB,AR2
+PMAXSB xmmreg,xmmrm [rm: 66 0f 38 3c /r] SSE41
+PMAXSD xmmreg,xmmrm [rm: 66 0f 38 3d /r] SSE41
+PMAXUD xmmreg,xmmrm [rm: 66 0f 38 3f /r] SSE41
+PMAXUW xmmreg,xmmrm [rm: 66 0f 38 3e /r] SSE41
+PMINSB xmmreg,xmmrm [rm: 66 0f 38 38 /r] SSE41
+PMINSD xmmreg,xmmrm [rm: 66 0f 38 39 /r] SSE41
+PMINUD xmmreg,xmmrm [rm: 66 0f 38 3b /r] SSE41
+PMINUW xmmreg,xmmrm [rm: 66 0f 38 3a /r] SSE41
+PMOVSXBW xmmreg,xmmrm [rm: 66 0f 38 20 /r] SSE41,SQ
+PMOVSXBD xmmreg,xmmrm [rm: 66 0f 38 21 /r] SSE41,SD
+PMOVSXBQ xmmreg,xmmrm [rm: 66 0f 38 22 /r] SSE41,SW
+PMOVSXWD xmmreg,xmmrm [rm: 66 0f 38 23 /r] SSE41,SQ
+PMOVSXWQ xmmreg,xmmrm [rm: 66 0f 38 24 /r] SSE41,SD
+PMOVSXDQ xmmreg,xmmrm [rm: 66 0f 38 25 /r] SSE41,SQ
+PMOVZXBW xmmreg,xmmrm [rm: 66 0f 38 30 /r] SSE41,SQ
+PMOVZXBD xmmreg,xmmrm [rm: 66 0f 38 31 /r] SSE41,SD
+PMOVZXBQ xmmreg,xmmrm [rm: 66 0f 38 32 /r] SSE41,SW
+PMOVZXWD xmmreg,xmmrm [rm: 66 0f 38 33 /r] SSE41,SQ
+PMOVZXWQ xmmreg,xmmrm [rm: 66 0f 38 34 /r] SSE41,SD
+PMOVZXDQ xmmreg,xmmrm [rm: 66 0f 38 35 /r] SSE41,SQ
+PMULDQ xmmreg,xmmrm [rm: 66 0f 38 28 /r] SSE41
+PMULLD xmmreg,xmmrm [rm: 66 0f 38 40 /r] SSE41
+PTEST xmmreg,xmmrm [rm: 66 0f 38 17 /r] SSE41
+ROUNDPD xmmreg,xmmrm,imm [rmi: 66 0f 3a 09 /r ib,u] SSE41
+ROUNDPS xmmreg,xmmrm,imm [rmi: 66 0f 3a 08 /r ib,u] SSE41
+ROUNDSD xmmreg,xmmrm,imm [rmi: 66 0f 3a 0b /r ib,u] SSE41
+ROUNDSS xmmreg,xmmrm,imm [rmi: 66 0f 3a 0a /r ib,u] SSE41
+
+;# Nehalem New Instructions (SSE4.2)
+CRC32 reg32,rm8 [rm: f2i 0f 38 f0 /r] SSE42
+CRC32 reg32,rm16 [rm: o16 f2i 0f 38 f1 /r] SSE42
+CRC32 reg32,rm32 [rm: o32 f2i 0f 38 f1 /r] SSE42
+CRC32 reg64,rm8 [rm: o64 f2i 0f 38 f0 /r] SSE42,X64
+CRC32 reg64,rm64 [rm: o64 f2i 0f 38 f1 /r] SSE42,X64
+PCMPESTRI xmmreg,xmmrm,imm [rmi: 66 0f 3a 61 /r ib,u] SSE42
+PCMPESTRM xmmreg,xmmrm,imm [rmi: 66 0f 3a 60 /r ib,u] SSE42
+PCMPISTRI xmmreg,xmmrm,imm [rmi: 66 0f 3a 63 /r ib,u] SSE42
+PCMPISTRM xmmreg,xmmrm,imm [rmi: 66 0f 3a 62 /r ib,u] SSE42
+PCMPGTQ xmmreg,xmmrm [rm: 66 0f 38 37 /r] SSE42
+POPCNT reg16,rm16 [rm: o16 f3i 0f b8 /r] NEHALEM,SW
+POPCNT reg32,rm32 [rm: o32 f3i 0f b8 /r] NEHALEM,SD
+POPCNT reg64,rm64 [rm: o64 f3i 0f b8 /r] NEHALEM,SQ,X64
+
+;# Intel SMX
+GETSEC void [ 0f 37] KATMAI
+
+;# Geode (Cyrix) 3DNow! additions
+PFRCPV mmxreg,mmxrm [rm: o64nw 0f 0f /r 86] PENT,3DNOW,SQ,CYRIX
+PFRSQRTV mmxreg,mmxrm [rm: o64nw 0f 0f /r 87] PENT,3DNOW,SQ,CYRIX
+
+;# Intel new instructions in ???
+; Is NEHALEM right here?
+MOVBE reg16,mem16 [rm: o16 norep 0f 38 f0 /r] NEHALEM,SM
+MOVBE reg32,mem32 [rm: o32 norep 0f 38 f0 /r] NEHALEM,SM
+MOVBE reg64,mem64 [rm: o64 norep 0f 38 f0 /r] NEHALEM,SM
+MOVBE mem16,reg16 [mr: o16 norep 0f 38 f1 /r] NEHALEM,SM
+MOVBE mem32,reg32 [mr: o32 norep 0f 38 f1 /r] NEHALEM,SM
+MOVBE mem64,reg64 [mr: o64 norep 0f 38 f1 /r] NEHALEM,SM
+
+;# Intel AES instructions
+AESENC xmmreg,xmmrm128 [rm: 66 0f 38 dc /r] SSE,WESTMERE
+AESENCLAST xmmreg,xmmrm128 [rm: 66 0f 38 dd /r] SSE,WESTMERE
+AESDEC xmmreg,xmmrm128 [rm: 66 0f 38 de /r] SSE,WESTMERE
+AESDECLAST xmmreg,xmmrm128 [rm: 66 0f 38 df /r] SSE,WESTMERE
+AESIMC xmmreg,xmmrm128 [rm: 66 0f 38 db /r] SSE,WESTMERE
+AESKEYGENASSIST xmmreg,xmmrm128,imm8 [rmi: 66 0f 3a df /r ib] SSE,WESTMERE
+
+;# Intel AVX AES instructions
+VAESENC xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 dc /r] AVX,SANDYBRIDGE
+VAESENCLAST xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 dd /r] AVX,SANDYBRIDGE
+VAESDEC xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 de /r] AVX,SANDYBRIDGE
+VAESDECLAST xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 df /r] AVX,SANDYBRIDGE
+VAESIMC xmmreg,xmmrm128 [rm: vex.128.66.0f38 db /r] AVX,SANDYBRIDGE
+VAESKEYGENASSIST xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a df /r ib] AVX,SANDYBRIDGE
+
+;# Intel instruction extension based on pub number 319433-030 dated October 2017
+
+; Intel VAES instructions
+VAESENC ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.wig dc /r] VAES,FUTURE
+VAESENCLAST ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.wig dd /r] VAES,FUTURE
+VAESDEC ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.wig de /r] VAES,FUTURE
+VAESDECLAST ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.wig df /r] VAES,FUTURE
+
+; Intel VAES + AVX512VL instructions
+VAESENC xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f38.wig dc /r] AVX512VL,AVX512,VAES,FUTURE
+VAESENC ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f38.wig dc /r] AVX512VL,AVX512,VAES,FUTURE
+VAESENCLAST xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f38.wig dd /r] AVX512VL,AVX512,VAES,FUTURE
+VAESENCLAST ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f38.wig dd /r] AVX512VL,AVX512,VAES,FUTURE
+VAESDEC xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f38.wig de /r] AVX512VL,AVX512,VAES,FUTURE
+VAESDEC ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f38.wig de /r] AVX512VL,AVX512,VAES,FUTURE
+VAESDECLAST xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f38.wig df /r] AVX512VL,AVX512,VAES,FUTURE
+VAESDECLAST ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f38.wig df /r] AVX512VL,AVX512,VAES,FUTURE
+
+; Intel VAES + AVX512F instructions
+VAESENC zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f38.wig dc /r] AVX512,VAES,FUTURE
+VAESENCLAST zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f38.wig dd /r] AVX512,VAES,FUTURE
+VAESDEC zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f38.wig de /r] AVX512,VAES,FUTURE
+VAESDECLAST zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f38.wig df /r] AVX512,VAES,FUTURE
+
+;# Intel AVX instructions
+VADDPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 58 /r] AVX,SANDYBRIDGE
+VADDPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 58 /r] AVX,SANDYBRIDGE
+VADDPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 58 /r] AVX,SANDYBRIDGE
+VADDPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 58 /r] AVX,SANDYBRIDGE
+VADDSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 58 /r] AVX,SANDYBRIDGE
+VADDSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 58 /r] AVX,SANDYBRIDGE
+VADDSUBPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d0 /r] AVX,SANDYBRIDGE
+VADDSUBPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f d0 /r] AVX,SANDYBRIDGE
+VADDSUBPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.f2.0f d0 /r] AVX,SANDYBRIDGE
+VADDSUBPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.f2.0f d0 /r] AVX,SANDYBRIDGE
+VANDPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 54 /r] AVX,SANDYBRIDGE
+VANDPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 54 /r] AVX,SANDYBRIDGE
+VANDPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 54 /r] AVX,SANDYBRIDGE
+VANDPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 54 /r] AVX,SANDYBRIDGE
+VANDNPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 55 /r] AVX,SANDYBRIDGE
+VANDNPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 55 /r] AVX,SANDYBRIDGE
+VANDNPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 55 /r] AVX,SANDYBRIDGE
+VANDNPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 55 /r] AVX,SANDYBRIDGE
+VBLENDPD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 0d /r ib] AVX,SANDYBRIDGE
+VBLENDPD ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 0d /r ib] AVX,SANDYBRIDGE
+VBLENDPS xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 0c /r ib] AVX,SANDYBRIDGE
+VBLENDPS ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 0c /r ib] AVX,SANDYBRIDGE
+VBLENDVPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.nds.128.66.0f3a.w0 4b /r /is4] AVX,SANDYBRIDGE
+VBLENDVPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.nds.256.66.0f3a.w0 4b /r /is4] AVX,SANDYBRIDGE
+VBLENDVPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.nds.128.66.0f3a.w0 4a /r /is4] AVX,SANDYBRIDGE
+VBLENDVPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.nds.256.66.0f3a.w0 4a /r /is4] AVX,SANDYBRIDGE
+VBROADCASTSS xmmreg,mem32 [rm: vex.128.66.0f38.w0 18 /r] AVX,SANDYBRIDGE
+VBROADCASTSS ymmreg,mem32 [rm: vex.256.66.0f38.w0 18 /r] AVX,SANDYBRIDGE
+VBROADCASTSD ymmreg,mem64 [rm: vex.256.66.0f38.w0 19 /r] AVX,SANDYBRIDGE
+VBROADCASTF128 ymmreg,mem128 [rm: vex.256.66.0f38.w0 1a /r] AVX,SANDYBRIDGE
+; Specific aliases first, then the generic version, to keep the disassembler happy...
+VCMPEQ_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQ_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPEQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPLT_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLT_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLE_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLE_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPUNORD_QPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORD_QPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPNEQ_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQ_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNLT_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLT_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLE_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLE_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPORD_QPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORD_QPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPEQ_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPEQ_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPNGE_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGE_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGT_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGT_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPFALSE_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSE_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPNEQ_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPNEQ_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPGE_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGE_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGT_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGT_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPTRUE_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUE_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUEPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUEPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPEQ_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQ_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPLT_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLT_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLE_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPLE_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPUNORD_SPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPUNORD_SPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPNEQ_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNEQ_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNLT_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLT_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLE_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPNLE_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPORD_SPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPORD_SPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPEQ_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPEQ_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPNGE_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGE_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGT_UQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPNGT_UQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPFALSE_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPFALSE_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPNEQ_OSPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPNEQ_OSPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPGE_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGE_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGT_OQPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPGT_OQPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPTRUE_USPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPTRUE_USPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPPD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f c2 /r ib] AVX,SANDYBRIDGE
+VCMPPD ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f c2 /r ib] AVX,SANDYBRIDGE
+; Specific aliases first, then the generic version, to keep the disassembler happy...
+VCMPEQ_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQ_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPEQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPLT_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLT_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLE_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLE_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPUNORD_QPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORD_QPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPNEQ_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQ_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNLT_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLT_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLE_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLE_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPORD_QPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORD_QPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPEQ_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPEQ_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPNGE_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGE_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGT_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGT_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPFALSE_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSE_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPNEQ_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPNEQ_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPGE_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGE_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGT_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGT_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPTRUE_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUE_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUEPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUEPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPEQ_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQ_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPLT_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLT_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLE_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPLE_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPUNORD_SPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPUNORD_SPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPNEQ_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNEQ_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNLT_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLT_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLE_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPNLE_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPORD_SPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPORD_SPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPEQ_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPEQ_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPNGE_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGE_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGT_UQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPNGT_UQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPFALSE_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPFALSE_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPNEQ_OSPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPNEQ_OSPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPGE_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGE_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGT_OQPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPGT_OQPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPTRUE_USPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPTRUE_USPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPPS xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.0f c2 /r ib] AVX,SANDYBRIDGE
+VCMPPS ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.0f c2 /r ib] AVX,SANDYBRIDGE
+; Specific aliases first, then the generic version, to keep the disassembler happy...
+VCMPEQ_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPLT_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLE_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPUNORD_QSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPNEQ_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNLT_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLE_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPORD_QSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPEQ_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPNGE_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGT_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPFALSE_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPNEQ_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPGE_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGT_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPTRUE_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUESD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPEQ_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPLT_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLE_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPUNORD_SSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPNEQ_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNLT_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLE_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPORD_SSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPEQ_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPNGE_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGT_UQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPFALSE_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPNEQ_OSSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPGE_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGT_OQSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPTRUE_USSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPSD xmmreg,xmmreg*,xmmrm64,imm8 [rvmi: vex.nds.lig.f2.0f c2 /r ib] AVX,SANDYBRIDGE
+; Specific aliases first, then the generic version, to keep the disassembler happy...
+VCMPEQ_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPEQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 00] AVX,SANDYBRIDGE
+VCMPLT_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLTSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 01] AVX,SANDYBRIDGE
+VCMPLE_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPLESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 02] AVX,SANDYBRIDGE
+VCMPUNORD_QSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPUNORDSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 03] AVX,SANDYBRIDGE
+VCMPNEQ_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNEQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 04] AVX,SANDYBRIDGE
+VCMPNLT_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLTSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 05] AVX,SANDYBRIDGE
+VCMPNLE_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPNLESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 06] AVX,SANDYBRIDGE
+VCMPORD_QSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPORDSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 07] AVX,SANDYBRIDGE
+VCMPEQ_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 08] AVX,SANDYBRIDGE
+VCMPNGE_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 09] AVX,SANDYBRIDGE
+VCMPNGT_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPNGTSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0a] AVX,SANDYBRIDGE
+VCMPFALSE_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPFALSESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0b] AVX,SANDYBRIDGE
+VCMPNEQ_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0c] AVX,SANDYBRIDGE
+VCMPGE_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0d] AVX,SANDYBRIDGE
+VCMPGT_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPGTSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0e] AVX,SANDYBRIDGE
+VCMPTRUE_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPTRUESS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 0f] AVX,SANDYBRIDGE
+VCMPEQ_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 10] AVX,SANDYBRIDGE
+VCMPLT_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 11] AVX,SANDYBRIDGE
+VCMPLE_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 12] AVX,SANDYBRIDGE
+VCMPUNORD_SSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 13] AVX,SANDYBRIDGE
+VCMPNEQ_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 14] AVX,SANDYBRIDGE
+VCMPNLT_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 15] AVX,SANDYBRIDGE
+VCMPNLE_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 16] AVX,SANDYBRIDGE
+VCMPORD_SSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 17] AVX,SANDYBRIDGE
+VCMPEQ_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 18] AVX,SANDYBRIDGE
+VCMPNGE_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 19] AVX,SANDYBRIDGE
+VCMPNGT_UQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1a] AVX,SANDYBRIDGE
+VCMPFALSE_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1b] AVX,SANDYBRIDGE
+VCMPNEQ_OSSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1c] AVX,SANDYBRIDGE
+VCMPGE_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1d] AVX,SANDYBRIDGE
+VCMPGT_OQSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1e] AVX,SANDYBRIDGE
+VCMPTRUE_USSS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f3.0f c2 /r 1f] AVX,SANDYBRIDGE
+VCMPSS xmmreg,xmmreg*,xmmrm64,imm8 [rvmi: vex.nds.lig.f3.0f c2 /r ib] AVX,SANDYBRIDGE
+VCOMISD xmmreg,xmmrm64 [rm: vex.lig.66.0f 2f /r] AVX,SANDYBRIDGE
+VCOMISS xmmreg,xmmrm32 [rm: vex.lig.0f 2f /r] AVX,SANDYBRIDGE
+VCVTDQ2PD xmmreg,xmmrm64 [rm: vex.128.f3.0f e6 /r] AVX,SANDYBRIDGE
+VCVTDQ2PD ymmreg,xmmrm128 [rm: vex.256.f3.0f e6 /r] AVX,SANDYBRIDGE
+VCVTDQ2PS xmmreg,xmmrm128 [rm: vex.128.0f 5b /r] AVX,SANDYBRIDGE
+VCVTDQ2PS ymmreg,ymmrm256 [rm: vex.256.0f 5b /r] AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,xmmreg [rm: vex.128.f2.0f e6 /r] AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,mem128 [rm: vex.128.f2.0f e6 /r] AVX,SANDYBRIDGE,SO
+VCVTPD2DQ xmmreg,ymmreg [rm: vex.256.f2.0f e6 /r] AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,mem256 [rm: vex.256.f2.0f e6 /r] AVX,SANDYBRIDGE,SY
+VCVTPD2PS xmmreg,xmmreg [rm: vex.128.66.0f 5a /r] AVX,SANDYBRIDGE
+VCVTPD2PS xmmreg,mem128 [rm: vex.128.66.0f 5a /r] AVX,SANDYBRIDGE,SO
+VCVTPD2PS xmmreg,ymmreg [rm: vex.256.66.0f 5a /r] AVX,SANDYBRIDGE
+VCVTPD2PS xmmreg,mem256 [rm: vex.256.66.0f 5a /r] AVX,SANDYBRIDGE,SY
+VCVTPS2DQ xmmreg,xmmrm128 [rm: vex.128.66.0f 5b /r] AVX,SANDYBRIDGE
+VCVTPS2DQ ymmreg,ymmrm256 [rm: vex.256.66.0f 5b /r] AVX,SANDYBRIDGE
+VCVTPS2PD xmmreg,xmmrm64 [rm: vex.128.0f 5a /r] AVX,SANDYBRIDGE
+VCVTPS2PD ymmreg,xmmrm128 [rm: vex.256.0f 5a /r] AVX,SANDYBRIDGE
+VCVTSD2SI reg32,xmmrm64 [rm: vex.lig.f2.0f.w0 2d /r] AVX,SANDYBRIDGE
+VCVTSD2SI reg64,xmmrm64 [rm: vex.lig.f2.0f.w1 2d /r] AVX,SANDYBRIDGE,LONG
+VCVTSD2SS xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 5a /r] AVX,SANDYBRIDGE
+VCVTSI2SD xmmreg,xmmreg*,rm32 [rvm: vex.nds.lig.f2.0f.w0 2a /r] AVX,SANDYBRIDGE,SD
+VCVTSI2SD xmmreg,xmmreg*,mem32 [rvm: vex.nds.lig.f2.0f.w0 2a /r] AVX,SANDYBRIDGE,ND,SD
+VCVTSI2SD xmmreg,xmmreg*,rm64 [rvm: vex.nds.lig.f2.0f.w1 2a /r] AVX,SANDYBRIDGE,LONG,SQ
+VCVTSI2SS xmmreg,xmmreg*,rm32 [rvm: vex.nds.lig.f3.0f.w0 2a /r] AVX,SANDYBRIDGE,SD
+VCVTSI2SS xmmreg,xmmreg*,mem32 [rvm: vex.nds.lig.f3.0f.w0 2a /r] AVX,SANDYBRIDGE,ND,SD
+VCVTSI2SS xmmreg,xmmreg*,rm64 [rvm: vex.nds.lig.f3.0f.w1 2a /r] AVX,SANDYBRIDGE,LONG,SQ
+VCVTSS2SD xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 5a /r] AVX,SANDYBRIDGE
+VCVTSS2SI reg32,xmmrm32 [rm: vex.lig.f3.0f.w0 2d /r] AVX,SANDYBRIDGE
+VCVTSS2SI reg64,xmmrm32 [rm: vex.lig.f3.0f.w1 2d /r] AVX,SANDYBRIDGE,LONG
+VCVTTPD2DQ xmmreg,xmmreg [rm: vex.128.66.0f e6 /r] AVX,SANDYBRIDGE
+VCVTTPD2DQ xmmreg,mem128 [rm: vex.128.66.0f e6 /r] AVX,SANDYBRIDGE,SO
+VCVTTPD2DQ xmmreg,ymmreg [rm: vex.256.66.0f e6 /r] AVX,SANDYBRIDGE
+VCVTTPD2DQ xmmreg,mem256 [rm: vex.256.66.0f e6 /r] AVX,SANDYBRIDGE,SY
+VCVTTPS2DQ xmmreg,xmmrm128 [rm: vex.128.f3.0f 5b /r] AVX,SANDYBRIDGE
+VCVTTPS2DQ ymmreg,ymmrm256 [rm: vex.256.f3.0f 5b /r] AVX,SANDYBRIDGE
+VCVTTSD2SI reg32,xmmrm64 [rm: vex.lig.f2.0f.w0 2c /r] AVX,SANDYBRIDGE
+VCVTTSD2SI reg64,xmmrm64 [rm: vex.lig.f2.0f.w1 2c /r] AVX,SANDYBRIDGE,LONG
+VCVTTSS2SI reg32,xmmrm32 [rm: vex.lig.f3.0f.w0 2c /r] AVX,SANDYBRIDGE
+VCVTTSS2SI reg64,xmmrm32 [rm: vex.lig.f3.0f.w1 2c /r] AVX,SANDYBRIDGE,LONG
+VDIVPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 5e /r] AVX,SANDYBRIDGE
+VDIVPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 5e /r] AVX,SANDYBRIDGE
+VDIVPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 5e /r] AVX,SANDYBRIDGE
+VDIVPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 5e /r] AVX,SANDYBRIDGE
+VDIVSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 5e /r] AVX,SANDYBRIDGE
+VDIVSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 5e /r] AVX,SANDYBRIDGE
+VDPPD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 41 /r ib] AVX,SANDYBRIDGE
+VDPPS xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 40 /r ib] AVX,SANDYBRIDGE
+VDPPS ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 40 /r ib] AVX,SANDYBRIDGE
+VEXTRACTF128 xmmrm128,ymmreg,imm8 [mri: vex.256.66.0f3a.w0 19 /r ib] AVX,SANDYBRIDGE
+VEXTRACTPS rm32,xmmreg,imm8 [mri: vex.128.66.0f3a 17 /r ib] AVX,SANDYBRIDGE
+VHADDPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 7c /r] AVX,SANDYBRIDGE
+VHADDPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 7c /r] AVX,SANDYBRIDGE
+VHADDPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.f2.0f 7c /r] AVX,SANDYBRIDGE
+VHADDPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.f2.0f 7c /r] AVX,SANDYBRIDGE
+VHSUBPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 7d /r] AVX,SANDYBRIDGE
+VHSUBPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 7d /r] AVX,SANDYBRIDGE
+VHSUBPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.f2.0f 7d /r] AVX,SANDYBRIDGE
+VHSUBPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.f2.0f 7d /r] AVX,SANDYBRIDGE
+VINSERTF128 ymmreg,ymmreg*,xmmrm128,imm8 [rvmi: vex.nds.256.66.0f3a.w0 18 /r ib] AVX,SANDYBRIDGE
+VINSERTPS xmmreg,xmmreg*,xmmrm32,imm8 [rvmi: vex.nds.128.66.0f3a 21 /r ib] AVX,SANDYBRIDGE
+VLDDQU xmmreg,mem128 [rm: vex.128.f2.0f f0 /r] AVX,SANDYBRIDGE
+VLDQQU ymmreg,mem256 [rm: vex.256.f2.0f f0 /r] AVX,SANDYBRIDGE
+VLDDQU ymmreg,mem256 [rm: vex.256.f2.0f f0 /r] AVX,SANDYBRIDGE
+VLDMXCSR mem32 [m: vex.lz.0f ae /2] AVX,SANDYBRIDGE
+VMASKMOVDQU xmmreg,xmmreg [rm: vex.128.66.0f f7 /r] AVX,SANDYBRIDGE
+VMASKMOVPS xmmreg,xmmreg,mem128 [rvm: vex.nds.128.66.0f38.w0 2c /r] AVX,SANDYBRIDGE
+VMASKMOVPS ymmreg,ymmreg,mem256 [rvm: vex.nds.256.66.0f38.w0 2c /r] AVX,SANDYBRIDGE
+VMASKMOVPS mem128,xmmreg,xmmreg [mvr: vex.nds.128.66.0f38.w0 2e /r] AVX,SANDYBRIDGE,SO
+VMASKMOVPS mem256,ymmreg,ymmreg [mvr: vex.nds.256.66.0f38.w0 2e /r] AVX,SANDYBRIDGE,SY
+VMASKMOVPD xmmreg,xmmreg,mem128 [rvm: vex.nds.128.66.0f38.w0 2d /r] AVX,SANDYBRIDGE
+VMASKMOVPD ymmreg,ymmreg,mem256 [rvm: vex.nds.256.66.0f38.w0 2d /r] AVX,SANDYBRIDGE
+VMASKMOVPD mem128,xmmreg,xmmreg [mvr: vex.nds.128.66.0f38.w0 2f /r] AVX,SANDYBRIDGE
+VMASKMOVPD mem256,ymmreg,ymmreg [mvr: vex.nds.256.66.0f38.w0 2f /r] AVX,SANDYBRIDGE
+VMAXPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 5f /r] AVX,SANDYBRIDGE
+VMAXPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 5f /r] AVX,SANDYBRIDGE
+VMAXPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 5f /r] AVX,SANDYBRIDGE
+VMAXPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 5f /r] AVX,SANDYBRIDGE
+VMAXSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 5f /r] AVX,SANDYBRIDGE
+VMAXSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 5f /r] AVX,SANDYBRIDGE
+VMINPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 5d /r] AVX,SANDYBRIDGE
+VMINPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 5d /r] AVX,SANDYBRIDGE
+VMINPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 5d /r] AVX,SANDYBRIDGE
+VMINPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 5d /r] AVX,SANDYBRIDGE
+VMINSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 5d /r] AVX,SANDYBRIDGE
+VMINSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 5d /r] AVX,SANDYBRIDGE
+VMOVAPD xmmreg,xmmrm128 [rm: vex.128.66.0f 28 /r] AVX,SANDYBRIDGE
+VMOVAPD xmmrm128,xmmreg [mr: vex.128.66.0f 29 /r] AVX,SANDYBRIDGE
+VMOVAPD ymmreg,ymmrm256 [rm: vex.256.66.0f 28 /r] AVX,SANDYBRIDGE
+VMOVAPD ymmrm256,ymmreg [mr: vex.256.66.0f 29 /r] AVX,SANDYBRIDGE
+VMOVAPS xmmreg,xmmrm128 [rm: vex.128.0f 28 /r] AVX,SANDYBRIDGE
+VMOVAPS xmmrm128,xmmreg [mr: vex.128.0f 29 /r] AVX,SANDYBRIDGE
+VMOVAPS ymmreg,ymmrm256 [rm: vex.256.0f 28 /r] AVX,SANDYBRIDGE
+VMOVAPS ymmrm256,ymmreg [mr: vex.256.0f 29 /r] AVX,SANDYBRIDGE
+VMOVD xmmreg,rm32 [rm: vex.128.66.0f.w0 6e /r] AVX,SANDYBRIDGE
+VMOVD rm32,xmmreg [mr: vex.128.66.0f.w0 7e /r] AVX,SANDYBRIDGE
+VMOVQ xmmreg,xmmrm64 [rm: vex.128.f3.0f 7e /r] AVX,SANDYBRIDGE,SQ
+VMOVQ xmmrm64,xmmreg [mr: vex.128.66.0f d6 /r] AVX,SANDYBRIDGE,SQ
+VMOVQ xmmreg,rm64 [rm: vex.128.66.0f.w1 6e /r] AVX,SANDYBRIDGE,LONG,SQ
+VMOVQ rm64,xmmreg [mr: vex.128.66.0f.w1 7e /r] AVX,SANDYBRIDGE,LONG,SQ
+VMOVDDUP xmmreg,xmmrm64 [rm: vex.128.f2.0f 12 /r] AVX,SANDYBRIDGE
+VMOVDDUP ymmreg,ymmrm256 [rm: vex.256.f2.0f 12 /r] AVX,SANDYBRIDGE
+VMOVDQA xmmreg,xmmrm128 [rm: vex.128.66.0f 6f /r] AVX,SANDYBRIDGE
+VMOVDQA xmmrm128,xmmreg [mr: vex.128.66.0f 7f /r] AVX,SANDYBRIDGE
+; These are officially documented as VMOVDQA, but VMOVQQA seems more logical to me...
+VMOVQQA ymmreg,ymmrm256 [rm: vex.256.66.0f 6f /r] AVX,SANDYBRIDGE
+VMOVQQA ymmrm256,ymmreg [mr: vex.256.66.0f 7f /r] AVX,SANDYBRIDGE
+VMOVDQA ymmreg,ymmrm256 [rm: vex.256.66.0f 6f /r] AVX,SANDYBRIDGE
+VMOVDQA ymmrm256,ymmreg [mr: vex.256.66.0f 7f /r] AVX,SANDYBRIDGE
+VMOVDQU xmmreg,xmmrm128 [rm: vex.128.f3.0f 6f /r] AVX,SANDYBRIDGE
+VMOVDQU xmmrm128,xmmreg [mr: vex.128.f3.0f 7f /r] AVX,SANDYBRIDGE
+; These are officially documented as VMOVDQU, but VMOVQQU seems more logical to me...
+VMOVQQU ymmreg,ymmrm256 [rm: vex.256.f3.0f 6f /r] AVX,SANDYBRIDGE
+VMOVQQU ymmrm256,ymmreg [mr: vex.256.f3.0f 7f /r] AVX,SANDYBRIDGE
+VMOVDQU ymmreg,ymmrm256 [rm: vex.256.f3.0f 6f /r] AVX,SANDYBRIDGE
+VMOVDQU ymmrm256,ymmreg [mr: vex.256.f3.0f 7f /r] AVX,SANDYBRIDGE
+VMOVHLPS xmmreg,xmmreg*,xmmreg [rvm: vex.nds.128.0f 12 /r] AVX,SANDYBRIDGE
+VMOVHPD xmmreg,xmmreg*,mem64 [rvm: vex.nds.128.66.0f 16 /r] AVX,SANDYBRIDGE
+VMOVHPD mem64,xmmreg [mr: vex.128.66.0f 17 /r] AVX,SANDYBRIDGE
+VMOVHPS xmmreg,xmmreg*,mem64 [rvm: vex.nds.128.0f 16 /r] AVX,SANDYBRIDGE
+VMOVHPS mem64,xmmreg [mr: vex.128.0f 17 /r] AVX,SANDYBRIDGE
+VMOVLHPS xmmreg,xmmreg*,xmmreg [rvm: vex.nds.128.0f 16 /r] AVX,SANDYBRIDGE
+VMOVLPD xmmreg,xmmreg*,mem64 [rvm: vex.nds.128.66.0f 12 /r] AVX,SANDYBRIDGE
+VMOVLPD mem64,xmmreg [mr: vex.128.66.0f 13 /r] AVX,SANDYBRIDGE
+VMOVLPS xmmreg,xmmreg*,mem64 [rvm: vex.nds.128.0f 12 /r] AVX,SANDYBRIDGE
+VMOVLPS mem64,xmmreg [mr: vex.128.0f 13 /r] AVX,SANDYBRIDGE
+VMOVMSKPD reg64,xmmreg [rm: vex.128.66.0f 50 /r] AVX,SANDYBRIDGE,LONG
+VMOVMSKPD reg32,xmmreg [rm: vex.128.66.0f 50 /r] AVX,SANDYBRIDGE
+VMOVMSKPD reg64,ymmreg [rm: vex.256.66.0f 50 /r] AVX,SANDYBRIDGE,LONG
+VMOVMSKPD reg32,ymmreg [rm: vex.256.66.0f 50 /r] AVX,SANDYBRIDGE
+VMOVMSKPS reg64,xmmreg [rm: vex.128.0f 50 /r] AVX,SANDYBRIDGE,LONG
+VMOVMSKPS reg32,xmmreg [rm: vex.128.0f 50 /r] AVX,SANDYBRIDGE
+VMOVMSKPS reg64,ymmreg [rm: vex.256.0f 50 /r] AVX,SANDYBRIDGE,LONG
+VMOVMSKPS reg32,ymmreg [rm: vex.256.0f 50 /r] AVX,SANDYBRIDGE
+VMOVNTDQ mem128,xmmreg [mr: vex.128.66.0f e7 /r] AVX,SANDYBRIDGE
+; Officially VMOVNTDQ, but VMOVNTQQ seems more logical to me...
+VMOVNTQQ mem256,ymmreg [mr: vex.256.66.0f e7 /r] AVX,SANDYBRIDGE
+VMOVNTDQ mem256,ymmreg [mr: vex.256.66.0f e7 /r] AVX,SANDYBRIDGE
+VMOVNTDQA xmmreg,mem128 [rm: vex.128.66.0f38 2a /r] AVX,SANDYBRIDGE
+VMOVNTPD mem128,xmmreg [mr: vex.128.66.0f 2b /r] AVX,SANDYBRIDGE
+VMOVNTPD mem256,ymmreg [mr: vex.256.66.0f 2b /r] AVX,SANDYBRIDGE
+VMOVNTPS mem128,xmmreg [mr: vex.128.0f 2b /r] AVX,SANDYBRIDGE
+VMOVNTPS mem256,ymmreg [mr: vex.256.0f 2b /r] AVX,SANDYBRIDGE
+VMOVSD xmmreg,xmmreg*,xmmreg [rvm: vex.nds.lig.f2.0f 10 /r] AVX,SANDYBRIDGE
+VMOVSD xmmreg,mem64 [rm: vex.lig.f2.0f 10 /r] AVX,SANDYBRIDGE
+VMOVSD xmmreg,xmmreg*,xmmreg [mvr: vex.nds.lig.f2.0f 11 /r] AVX,SANDYBRIDGE
+VMOVSD mem64,xmmreg [mr: vex.lig.f2.0f 11 /r] AVX,SANDYBRIDGE
+VMOVSHDUP xmmreg,xmmrm128 [rm: vex.128.f3.0f 16 /r] AVX,SANDYBRIDGE
+VMOVSHDUP ymmreg,ymmrm256 [rm: vex.256.f3.0f 16 /r] AVX,SANDYBRIDGE
+VMOVSLDUP xmmreg,xmmrm128 [rm: vex.128.f3.0f 12 /r] AVX,SANDYBRIDGE
+VMOVSLDUP ymmreg,ymmrm256 [rm: vex.256.f3.0f 12 /r] AVX,SANDYBRIDGE
+VMOVSS xmmreg,xmmreg*,xmmreg [rvm: vex.nds.lig.f3.0f 10 /r] AVX,SANDYBRIDGE
+VMOVSS xmmreg,mem32 [rm: vex.lig.f3.0f 10 /r] AVX,SANDYBRIDGE
+VMOVSS xmmreg,xmmreg*,xmmreg [mvr: vex.nds.lig.f3.0f 11 /r] AVX,SANDYBRIDGE
+VMOVSS mem32,xmmreg [mr: vex.lig.f3.0f 11 /r] AVX,SANDYBRIDGE
+VMOVUPD xmmreg,xmmrm128 [rm: vex.128.66.0f 10 /r] AVX,SANDYBRIDGE
+VMOVUPD xmmrm128,xmmreg [mr: vex.128.66.0f 11 /r] AVX,SANDYBRIDGE
+VMOVUPD ymmreg,ymmrm256 [rm: vex.256.66.0f 10 /r] AVX,SANDYBRIDGE
+VMOVUPD ymmrm256,ymmreg [mr: vex.256.66.0f 11 /r] AVX,SANDYBRIDGE
+VMOVUPS xmmreg,xmmrm128 [rm: vex.128.0f 10 /r] AVX,SANDYBRIDGE
+VMOVUPS xmmrm128,xmmreg [mr: vex.128.0f 11 /r] AVX,SANDYBRIDGE
+VMOVUPS ymmreg,ymmrm256 [rm: vex.256.0f 10 /r] AVX,SANDYBRIDGE
+VMOVUPS ymmrm256,ymmreg [mr: vex.256.0f 11 /r] AVX,SANDYBRIDGE
+VMPSADBW xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 42 /r ib] AVX,SANDYBRIDGE
+VMULPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 59 /r] AVX,SANDYBRIDGE
+VMULPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 59 /r] AVX,SANDYBRIDGE
+VMULPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 59 /r] AVX,SANDYBRIDGE
+VMULPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 59 /r] AVX,SANDYBRIDGE
+VMULSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 59 /r] AVX,SANDYBRIDGE
+VMULSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 59 /r] AVX,SANDYBRIDGE
+VORPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 56 /r] AVX,SANDYBRIDGE
+VORPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 56 /r] AVX,SANDYBRIDGE
+VORPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 56 /r] AVX,SANDYBRIDGE
+VORPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 56 /r] AVX,SANDYBRIDGE
+VPABSB xmmreg,xmmrm128 [rm: vex.128.66.0f38 1c /r] AVX,SANDYBRIDGE
+VPABSW xmmreg,xmmrm128 [rm: vex.128.66.0f38 1d /r] AVX,SANDYBRIDGE
+VPABSD xmmreg,xmmrm128 [rm: vex.128.66.0f38 1e /r] AVX,SANDYBRIDGE
+VPACKSSWB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 63 /r] AVX,SANDYBRIDGE
+VPACKSSDW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 6b /r] AVX,SANDYBRIDGE
+VPACKUSWB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 67 /r] AVX,SANDYBRIDGE
+VPACKUSDW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 2b /r] AVX,SANDYBRIDGE
+VPADDB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f fc /r] AVX,SANDYBRIDGE
+VPADDW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f fd /r] AVX,SANDYBRIDGE
+VPADDD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f fe /r] AVX,SANDYBRIDGE
+VPADDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d4 /r] AVX,SANDYBRIDGE
+VPADDSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f ec /r] AVX,SANDYBRIDGE
+VPADDSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f ed /r] AVX,SANDYBRIDGE
+VPADDUSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f dc /r] AVX,SANDYBRIDGE
+VPADDUSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f dd /r] AVX,SANDYBRIDGE
+VPALIGNR xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 0f /r ib] AVX,SANDYBRIDGE
+VPAND xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f db /r] AVX,SANDYBRIDGE
+VPANDN xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f df /r] AVX,SANDYBRIDGE
+VPAVGB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e0 /r] AVX,SANDYBRIDGE
+VPAVGW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e3 /r] AVX,SANDYBRIDGE
+VPBLENDVB xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.nds.128.66.0f3a.w0 4c /r /is4] AVX,SANDYBRIDGE
+VPBLENDW xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 0e /r ib] AVX,SANDYBRIDGE
+VPCMPESTRI xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 61 /r ib] AVX,SANDYBRIDGE
+VPCMPESTRM xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 60 /r ib] AVX,SANDYBRIDGE
+VPCMPISTRI xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 63 /r ib] AVX,SANDYBRIDGE
+VPCMPISTRM xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 62 /r ib] AVX,SANDYBRIDGE
+VPCMPEQB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 74 /r] AVX,SANDYBRIDGE
+VPCMPEQW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 75 /r] AVX,SANDYBRIDGE
+VPCMPEQD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 76 /r] AVX,SANDYBRIDGE
+VPCMPEQQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 29 /r] AVX,SANDYBRIDGE
+VPCMPGTB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 64 /r] AVX,SANDYBRIDGE
+VPCMPGTW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 65 /r] AVX,SANDYBRIDGE
+VPCMPGTD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 66 /r] AVX,SANDYBRIDGE
+VPCMPGTQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 37 /r] AVX,SANDYBRIDGE
+VPERMILPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 0d /r] AVX,SANDYBRIDGE
+VPERMILPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 0d /r] AVX,SANDYBRIDGE
+VPERMILPD xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a.w0 05 /r ib] AVX,SANDYBRIDGE
+VPERMILPD ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a.w0 05 /r ib] AVX,SANDYBRIDGE
+VPERMILPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 0c /r] AVX,SANDYBRIDGE
+VPERMILPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 0c /r] AVX,SANDYBRIDGE
+VPERMILPS xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a.w0 04 /r ib] AVX,SANDYBRIDGE
+VPERMILPS ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a.w0 04 /r ib] AVX,SANDYBRIDGE
+VPERM2F128 ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a.w0 06 /r ib] AVX,SANDYBRIDGE
+VPEXTRB reg64,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 14 /r ib] AVX,SANDYBRIDGE,LONG
+VPEXTRB reg32,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 14 /r ib] AVX,SANDYBRIDGE
+VPEXTRB mem8,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 14 /r ib] AVX,SANDYBRIDGE
+VPEXTRW reg64,xmmreg,imm8 [rmi: vex.128.66.0f.w0 c5 /r ib] AVX,SANDYBRIDGE,LONG
+VPEXTRW reg32,xmmreg,imm8 [rmi: vex.128.66.0f.w0 c5 /r ib] AVX,SANDYBRIDGE
+VPEXTRW reg64,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 15 /r ib] AVX,SANDYBRIDGE,LONG
+VPEXTRW reg32,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 15 /r ib] AVX,SANDYBRIDGE
+VPEXTRW mem16,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 15 /r ib] AVX,SANDYBRIDGE
+VPEXTRD reg64,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 16 /r ib] AVX,SANDYBRIDGE,LONG
+VPEXTRD rm32,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 16 /r ib] AVX,SANDYBRIDGE
+VPEXTRQ rm64,xmmreg,imm8 [mri: vex.128.66.0f3a.w1 16 /r ib] AVX,SANDYBRIDGE,LONG
+VPHADDW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 01 /r] AVX,SANDYBRIDGE
+VPHADDD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 02 /r] AVX,SANDYBRIDGE
+VPHADDSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 03 /r] AVX,SANDYBRIDGE
+VPHMINPOSUW xmmreg,xmmrm128 [rm: vex.128.66.0f38 41 /r] AVX,SANDYBRIDGE
+VPHSUBW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 05 /r] AVX,SANDYBRIDGE
+VPHSUBD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 06 /r] AVX,SANDYBRIDGE
+VPHSUBSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 07 /r] AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,mem8,imm8 [rvmi: vex.nds.128.66.0f3a 20 /r ib] AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,rm8,imm8 [rvmi: vex.nds.128.66.0f3a 20 /r ib] AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,reg32,imm8 [rvmi: vex.nds.128.66.0f3a 20 /r ib] AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,mem16,imm8 [rvmi: vex.nds.128.66.0f c4 /r ib] AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,rm16,imm8 [rvmi: vex.nds.128.66.0f c4 /r ib] AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,reg32,imm8 [rvmi: vex.nds.128.66.0f c4 /r ib] AVX,SANDYBRIDGE
+VPINSRD xmmreg,xmmreg*,mem32,imm8 [rvmi: vex.nds.128.66.0f3a.w0 22 /r ib] AVX,SANDYBRIDGE
+VPINSRD xmmreg,xmmreg*,rm32,imm8 [rvmi: vex.nds.128.66.0f3a.w0 22 /r ib] AVX,SANDYBRIDGE
+VPINSRQ xmmreg,xmmreg*,mem64,imm8 [rvmi: vex.nds.128.66.0f3a.w1 22 /r ib] AVX,SANDYBRIDGE,LONG
+VPINSRQ xmmreg,xmmreg*,rm64,imm8 [rvmi: vex.nds.128.66.0f3a.w1 22 /r ib] AVX,SANDYBRIDGE,LONG
+VPMADDWD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f5 /r] AVX,SANDYBRIDGE
+VPMADDUBSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 04 /r] AVX,SANDYBRIDGE
+VPMAXSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3c /r] AVX,SANDYBRIDGE
+VPMAXSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f ee /r] AVX,SANDYBRIDGE
+VPMAXSD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3d /r] AVX,SANDYBRIDGE
+VPMAXUB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f de /r] AVX,SANDYBRIDGE
+VPMAXUW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3e /r] AVX,SANDYBRIDGE
+VPMAXUD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3f /r] AVX,SANDYBRIDGE
+VPMINSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 38 /r] AVX,SANDYBRIDGE
+VPMINSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f ea /r] AVX,SANDYBRIDGE
+VPMINSD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 39 /r] AVX,SANDYBRIDGE
+VPMINUB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f da /r] AVX,SANDYBRIDGE
+VPMINUW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3a /r] AVX,SANDYBRIDGE
+VPMINUD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 3b /r] AVX,SANDYBRIDGE
+VPMOVMSKB reg64,xmmreg [rm: vex.128.66.0f d7 /r] AVX,SANDYBRIDGE,LONG
+VPMOVMSKB reg32,xmmreg [rm: vex.128.66.0f d7 /r] AVX,SANDYBRIDGE
+VPMOVSXBW xmmreg,xmmrm64 [rm: vex.128.66.0f38 20 /r] AVX,SANDYBRIDGE
+VPMOVSXBD xmmreg,xmmrm32 [rm: vex.128.66.0f38 21 /r] AVX,SANDYBRIDGE
+VPMOVSXBQ xmmreg,xmmrm16 [rm: vex.128.66.0f38 22 /r] AVX,SANDYBRIDGE
+VPMOVSXWD xmmreg,xmmrm64 [rm: vex.128.66.0f38 23 /r] AVX,SANDYBRIDGE
+VPMOVSXWQ xmmreg,xmmrm32 [rm: vex.128.66.0f38 24 /r] AVX,SANDYBRIDGE
+VPMOVSXDQ xmmreg,xmmrm64 [rm: vex.128.66.0f38 25 /r] AVX,SANDYBRIDGE
+VPMOVZXBW xmmreg,xmmrm64 [rm: vex.128.66.0f38 30 /r] AVX,SANDYBRIDGE
+VPMOVZXBD xmmreg,xmmrm32 [rm: vex.128.66.0f38 31 /r] AVX,SANDYBRIDGE
+VPMOVZXBQ xmmreg,xmmrm16 [rm: vex.128.66.0f38 32 /r] AVX,SANDYBRIDGE
+VPMOVZXWD xmmreg,xmmrm64 [rm: vex.128.66.0f38 33 /r] AVX,SANDYBRIDGE
+VPMOVZXWQ xmmreg,xmmrm32 [rm: vex.128.66.0f38 34 /r] AVX,SANDYBRIDGE
+VPMOVZXDQ xmmreg,xmmrm64 [rm: vex.128.66.0f38 35 /r] AVX,SANDYBRIDGE
+VPMULHUW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e4 /r] AVX,SANDYBRIDGE
+VPMULHRSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 0b /r] AVX,SANDYBRIDGE
+VPMULHW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e5 /r] AVX,SANDYBRIDGE
+VPMULLW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d5 /r] AVX,SANDYBRIDGE
+VPMULLD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 40 /r] AVX,SANDYBRIDGE
+VPMULUDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f4 /r] AVX,SANDYBRIDGE
+VPMULDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 28 /r] AVX,SANDYBRIDGE
+VPOR xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f eb /r] AVX,SANDYBRIDGE
+VPSADBW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f6 /r] AVX,SANDYBRIDGE
+VPSHUFB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 00 /r] AVX,SANDYBRIDGE
+VPSHUFD xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f 70 /r ib] AVX,SANDYBRIDGE
+VPSHUFHW xmmreg,xmmrm128,imm8 [rmi: vex.128.f3.0f 70 /r ib] AVX,SANDYBRIDGE
+VPSHUFLW xmmreg,xmmrm128,imm8 [rmi: vex.128.f2.0f 70 /r ib] AVX,SANDYBRIDGE
+VPSIGNB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 08 /r] AVX,SANDYBRIDGE
+VPSIGNW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 09 /r] AVX,SANDYBRIDGE
+VPSIGND xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38 0a /r] AVX,SANDYBRIDGE
+VPSLLDQ xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 73 /7 ib] AVX,SANDYBRIDGE
+VPSRLDQ xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 73 /3 ib] AVX,SANDYBRIDGE
+VPSLLW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f1 /r] AVX,SANDYBRIDGE
+VPSLLW xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 71 /6 ib] AVX,SANDYBRIDGE
+VPSLLD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f2 /r] AVX,SANDYBRIDGE
+VPSLLD xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 72 /6 ib] AVX,SANDYBRIDGE
+VPSLLQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f3 /r] AVX,SANDYBRIDGE
+VPSLLQ xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 73 /6 ib] AVX,SANDYBRIDGE
+VPSRAW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e1 /r] AVX,SANDYBRIDGE
+VPSRAW xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 71 /4 ib] AVX,SANDYBRIDGE
+VPSRAD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e2 /r] AVX,SANDYBRIDGE
+VPSRAD xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 72 /4 ib] AVX,SANDYBRIDGE
+VPSRLW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d1 /r] AVX,SANDYBRIDGE
+VPSRLW xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 71 /2 ib] AVX,SANDYBRIDGE
+VPSRLD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d2 /r] AVX,SANDYBRIDGE
+VPSRLD xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 72 /2 ib] AVX,SANDYBRIDGE
+VPSRLQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d3 /r] AVX,SANDYBRIDGE
+VPSRLQ xmmreg,xmmreg*,imm8 [vmi: vex.ndd.128.66.0f 73 /2 ib] AVX,SANDYBRIDGE
+VPTEST xmmreg,xmmrm128 [rm: vex.128.66.0f38 17 /r] AVX,SANDYBRIDGE
+VPTEST ymmreg,ymmrm256 [rm: vex.256.66.0f38 17 /r] AVX,SANDYBRIDGE
+VPSUBB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f8 /r] AVX,SANDYBRIDGE
+VPSUBW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f f9 /r] AVX,SANDYBRIDGE
+VPSUBD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f fa /r] AVX,SANDYBRIDGE
+VPSUBQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f fb /r] AVX,SANDYBRIDGE
+VPSUBSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e8 /r] AVX,SANDYBRIDGE
+VPSUBSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f e9 /r] AVX,SANDYBRIDGE
+VPSUBUSB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d8 /r] AVX,SANDYBRIDGE
+VPSUBUSW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f d9 /r] AVX,SANDYBRIDGE
+VPUNPCKHBW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 68 /r] AVX,SANDYBRIDGE
+VPUNPCKHWD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 69 /r] AVX,SANDYBRIDGE
+VPUNPCKHDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 6a /r] AVX,SANDYBRIDGE
+VPUNPCKHQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 6d /r] AVX,SANDYBRIDGE
+VPUNPCKLBW xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 60 /r] AVX,SANDYBRIDGE
+VPUNPCKLWD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 61 /r] AVX,SANDYBRIDGE
+VPUNPCKLDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 62 /r] AVX,SANDYBRIDGE
+VPUNPCKLQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 6c /r] AVX,SANDYBRIDGE
+VPXOR xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f ef /r] AVX,SANDYBRIDGE
+VRCPPS xmmreg,xmmrm128 [rm: vex.128.0f 53 /r] AVX,SANDYBRIDGE
+VRCPPS ymmreg,ymmrm256 [rm: vex.256.0f 53 /r] AVX,SANDYBRIDGE
+VRCPSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 53 /r] AVX,SANDYBRIDGE
+VRSQRTPS xmmreg,xmmrm128 [rm: vex.128.0f 52 /r] AVX,SANDYBRIDGE
+VRSQRTPS ymmreg,ymmrm256 [rm: vex.256.0f 52 /r] AVX,SANDYBRIDGE
+VRSQRTSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 52 /r] AVX,SANDYBRIDGE
+VROUNDPD xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 09 /r ib] AVX,SANDYBRIDGE
+VROUNDPD ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a 09 /r ib] AVX,SANDYBRIDGE
+VROUNDPS xmmreg,xmmrm128,imm8 [rmi: vex.128.66.0f3a 08 /r ib] AVX,SANDYBRIDGE
+VROUNDPS ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a 08 /r ib] AVX,SANDYBRIDGE
+VROUNDSD xmmreg,xmmreg*,xmmrm64,imm8 [rvmi: vex.nds.128.66.0f3a 0b /r ib] AVX,SANDYBRIDGE
+VROUNDSS xmmreg,xmmreg*,xmmrm32,imm8 [rvmi: vex.nds.128.66.0f3a 0a /r ib] AVX,SANDYBRIDGE
+VSHUFPD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f c6 /r ib] AVX,SANDYBRIDGE
+VSHUFPD ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f c6 /r ib] AVX,SANDYBRIDGE
+VSHUFPS xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.0f c6 /r ib] AVX,SANDYBRIDGE
+VSHUFPS ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.0f c6 /r ib] AVX,SANDYBRIDGE
+VSQRTPD xmmreg,xmmrm128 [rm: vex.128.66.0f 51 /r] AVX,SANDYBRIDGE
+VSQRTPD ymmreg,ymmrm256 [rm: vex.256.66.0f 51 /r] AVX,SANDYBRIDGE
+VSQRTPS xmmreg,xmmrm128 [rm: vex.128.0f 51 /r] AVX,SANDYBRIDGE
+VSQRTPS ymmreg,ymmrm256 [rm: vex.256.0f 51 /r] AVX,SANDYBRIDGE
+VSQRTSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 51 /r] AVX,SANDYBRIDGE
+VSQRTSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 51 /r] AVX,SANDYBRIDGE
+VSTMXCSR mem32 [m: vex.128.0f ae /3] AVX,SANDYBRIDGE
+VSUBPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 5c /r] AVX,SANDYBRIDGE
+VSUBPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 5c /r] AVX,SANDYBRIDGE
+VSUBPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 5c /r] AVX,SANDYBRIDGE
+VSUBPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 5c /r] AVX,SANDYBRIDGE
+VSUBSD xmmreg,xmmreg*,xmmrm64 [rvm: vex.nds.lig.f2.0f 5c /r] AVX,SANDYBRIDGE
+VSUBSS xmmreg,xmmreg*,xmmrm32 [rvm: vex.nds.lig.f3.0f 5c /r] AVX,SANDYBRIDGE
+VTESTPS xmmreg,xmmrm128 [rm: vex.128.66.0f38.w0 0e /r] AVX,SANDYBRIDGE
+VTESTPS ymmreg,ymmrm256 [rm: vex.256.66.0f38.w0 0e /r] AVX,SANDYBRIDGE
+VTESTPD xmmreg,xmmrm128 [rm: vex.128.66.0f38.w0 0f /r] AVX,SANDYBRIDGE
+VTESTPD ymmreg,ymmrm256 [rm: vex.256.66.0f38.w0 0f /r] AVX,SANDYBRIDGE
+VUCOMISD xmmreg,xmmrm64 [rm: vex.lig.66.0f 2e /r] AVX,SANDYBRIDGE
+VUCOMISS xmmreg,xmmrm32 [rm: vex.lig.0f 2e /r] AVX,SANDYBRIDGE
+VUNPCKHPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 15 /r] AVX,SANDYBRIDGE
+VUNPCKHPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 15 /r] AVX,SANDYBRIDGE
+VUNPCKHPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 15 /r] AVX,SANDYBRIDGE
+VUNPCKHPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 15 /r] AVX,SANDYBRIDGE
+VUNPCKLPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 14 /r] AVX,SANDYBRIDGE
+VUNPCKLPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 14 /r] AVX,SANDYBRIDGE
+VUNPCKLPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 14 /r] AVX,SANDYBRIDGE
+VUNPCKLPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 14 /r] AVX,SANDYBRIDGE
+VXORPD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f 57 /r] AVX,SANDYBRIDGE
+VXORPD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 57 /r] AVX,SANDYBRIDGE
+VXORPS xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.0f 57 /r] AVX,SANDYBRIDGE
+VXORPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.0f 57 /r] AVX,SANDYBRIDGE
+VZEROALL void [ vex.256.0f.w0 77] AVX,SANDYBRIDGE
+VZEROUPPER void [ vex.128.0f.w0 77] AVX,SANDYBRIDGE
+
+;# Intel Carry-Less Multiplication instructions (CLMUL)
+PCLMULLQLQDQ xmmreg,xmmrm128 [rm: 66 0f 3a 44 /r 00] SSE,WESTMERE
+PCLMULHQLQDQ xmmreg,xmmrm128 [rm: 66 0f 3a 44 /r 01] SSE,WESTMERE
+PCLMULLQHQDQ xmmreg,xmmrm128 [rm: 66 0f 3a 44 /r 10] SSE,WESTMERE
+PCLMULHQHQDQ xmmreg,xmmrm128 [rm: 66 0f 3a 44 /r 11] SSE,WESTMERE
+PCLMULQDQ xmmreg,xmmrm128,imm8 [rmi: 66 0f 3a 44 /r ib] SSE,WESTMERE
+
+;# Intel AVX Carry-Less Multiplication instructions (CLMUL)
+VPCLMULLQLQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f3a 44 /r 00] AVX,SANDYBRIDGE
+VPCLMULHQLQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f3a 44 /r 01] AVX,SANDYBRIDGE
+VPCLMULLQHQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f3a 44 /r 10] AVX,SANDYBRIDGE
+VPCLMULHQHQDQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f3a 44 /r 11] AVX,SANDYBRIDGE
+VPCLMULQDQ xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a 44 /r ib] AVX,SANDYBRIDGE
+
+; Intel VPCLMULQDQ instructions
+VPCLMULLQLQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: vex.nds.256.66.0f3a.wig 44 /r 00] VPCLMULQDQ,FUTURE
+VPCLMULHQLQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: vex.nds.256.66.0f3a.wig 44 /r 01] VPCLMULQDQ,FUTURE
+VPCLMULLQHQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: vex.nds.256.66.0f3a.wig 44 /r 10] VPCLMULQDQ,FUTURE
+VPCLMULHQHQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: vex.nds.256.66.0f3a.wig 44 /r 11] VPCLMULQDQ,FUTURE
+VPCLMULQDQ ymmreg,ymmreg*,ymmrm256,imm8 [rvmi:fv: vex.nds.256.66.0f3a.wig 44 /r ib] VPCLMULQDQ,FUTURE
+
+; Intel VPCLMULQDQ + AVX512VL instructions
+VPCLMULLQLQDQ xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f3a.wig 44 /r 00] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULHQLQDQ xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f3a.wig 44 /r 01] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULLQHQDQ xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f3a.wig 44 /r 10] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULHQHQDQ xmmreg,xmmreg*,xmmrm128 [rvm:fv: evex.nds.128.66.0f3a.wig 44 /r 11] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULQDQ xmmreg,xmmreg*,xmmrm128,imm8 [rvmi:fv: evex.nds.128.66.0f3a.wig 44 /r ib] AVX512VL,VPCLMULQDQ,FUTURE
+
+VPCLMULLQLQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f3a.wig 44 /r 00] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULHQLQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f3a.wig 44 /r 01] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULLQHQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f3a.wig 44 /r 10] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULHQHQDQ ymmreg,ymmreg*,ymmrm256 [rvm:fv: evex.nds.256.66.0f3a.wig 44 /r 11] AVX512VL,VPCLMULQDQ,FUTURE
+VPCLMULQDQ ymmreg,ymmreg*,ymmrm256,imm8 [rvmi:fv: evex.nds.256.66.0f3a.wig 44 /r ib] AVX512VL,VPCLMULQDQ,FUTURE
+
+; Intel VPCLMULQDQ + AVX512F instructions
+VPCLMULLQLQDQ zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f3a.wig 44 /r 00] AVX512,VPCLMULQDQ,FUTURE
+VPCLMULHQLQDQ zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f3a.wig 44 /r 01] AVX512,VPCLMULQDQ,FUTURE
+VPCLMULLQHQDQ zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f3a.wig 44 /r 10] AVX512,VPCLMULQDQ,FUTURE
+VPCLMULHQHQDQ zmmreg,zmmreg*,zmmrm512 [rvm:fv: evex.nds.512.66.0f3a.wig 44 /r 11] AVX512,VPCLMULQDQ,FUTURE
+VPCLMULQDQ zmmreg,zmmreg*,zmmrm512,imm8 [rvmi:fv: evex.nds.512.66.0f3a.wig 44 /r ib] AVX512,VPCLMULQDQ,FUTURE
+
+;# Intel Fused Multiply-Add instructions (FMA)
+VFMADD132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 98 /r] FMA,FUTURE
+VFMADD132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 98 /r] FMA,FUTURE
+VFMADD132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 98 /r] FMA,FUTURE
+VFMADD132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 98 /r] FMA,FUTURE
+VFMADD312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 98 /r] FMA,FUTURE
+VFMADD312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 98 /r] FMA,FUTURE
+VFMADD312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 98 /r] FMA,FUTURE
+VFMADD312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 98 /r] FMA,FUTURE
+VFMADD213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a8 /r] FMA,FUTURE
+VFMADD213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a8 /r] FMA,FUTURE
+VFMADD213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a8 /r] FMA,FUTURE
+VFMADD213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a8 /r] FMA,FUTURE
+VFMADD123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a8 /r] FMA,FUTURE
+VFMADD123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a8 /r] FMA,FUTURE
+VFMADD123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a8 /r] FMA,FUTURE
+VFMADD123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a8 /r] FMA,FUTURE
+VFMADD231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b8 /r] FMA,FUTURE
+VFMADD231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b8 /r] FMA,FUTURE
+VFMADD231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b8 /r] FMA,FUTURE
+VFMADD231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b8 /r] FMA,FUTURE
+VFMADD321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b8 /r] FMA,FUTURE
+VFMADD321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b8 /r] FMA,FUTURE
+VFMADD321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b8 /r] FMA,FUTURE
+VFMADD321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b8 /r] FMA,FUTURE
+VFMADDSUB132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 96 /r] FMA,FUTURE
+VFMADDSUB132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 96 /r] FMA,FUTURE
+VFMADDSUB132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 96 /r] FMA,FUTURE
+VFMADDSUB132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 96 /r] FMA,FUTURE
+VFMADDSUB312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 96 /r] FMA,FUTURE
+VFMADDSUB312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 96 /r] FMA,FUTURE
+VFMADDSUB312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 96 /r] FMA,FUTURE
+VFMADDSUB312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 96 /r] FMA,FUTURE
+VFMADDSUB213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a6 /r] FMA,FUTURE
+VFMADDSUB213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a6 /r] FMA,FUTURE
+VFMADDSUB213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a6 /r] FMA,FUTURE
+VFMADDSUB213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a6 /r] FMA,FUTURE
+VFMADDSUB123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a6 /r] FMA,FUTURE
+VFMADDSUB123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a6 /r] FMA,FUTURE
+VFMADDSUB123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a6 /r] FMA,FUTURE
+VFMADDSUB123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a6 /r] FMA,FUTURE
+VFMADDSUB231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b6 /r] FMA,FUTURE
+VFMADDSUB231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b6 /r] FMA,FUTURE
+VFMADDSUB231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b6 /r] FMA,FUTURE
+VFMADDSUB231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b6 /r] FMA,FUTURE
+VFMADDSUB321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b6 /r] FMA,FUTURE
+VFMADDSUB321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b6 /r] FMA,FUTURE
+VFMADDSUB321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b6 /r] FMA,FUTURE
+VFMADDSUB321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b6 /r] FMA,FUTURE
+VFMSUB132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9a /r] FMA,FUTURE
+VFMSUB132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9a /r] FMA,FUTURE
+VFMSUB132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9a /r] FMA,FUTURE
+VFMSUB132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9a /r] FMA,FUTURE
+VFMSUB312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9a /r] FMA,FUTURE
+VFMSUB312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9a /r] FMA,FUTURE
+VFMSUB312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9a /r] FMA,FUTURE
+VFMSUB312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9a /r] FMA,FUTURE
+VFMSUB213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 aa /r] FMA,FUTURE
+VFMSUB213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 aa /r] FMA,FUTURE
+VFMSUB213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 aa /r] FMA,FUTURE
+VFMSUB213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 aa /r] FMA,FUTURE
+VFMSUB123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 aa /r] FMA,FUTURE
+VFMSUB123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 aa /r] FMA,FUTURE
+VFMSUB123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 aa /r] FMA,FUTURE
+VFMSUB123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 aa /r] FMA,FUTURE
+VFMSUB231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ba /r] FMA,FUTURE
+VFMSUB231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ba /r] FMA,FUTURE
+VFMSUB231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ba /r] FMA,FUTURE
+VFMSUB231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ba /r] FMA,FUTURE
+VFMSUB321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ba /r] FMA,FUTURE
+VFMSUB321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ba /r] FMA,FUTURE
+VFMSUB321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ba /r] FMA,FUTURE
+VFMSUB321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ba /r] FMA,FUTURE
+VFMSUBADD132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 97 /r] FMA,FUTURE
+VFMSUBADD132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 97 /r] FMA,FUTURE
+VFMSUBADD132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 97 /r] FMA,FUTURE
+VFMSUBADD132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 97 /r] FMA,FUTURE
+VFMSUBADD312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 97 /r] FMA,FUTURE
+VFMSUBADD312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 97 /r] FMA,FUTURE
+VFMSUBADD312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 97 /r] FMA,FUTURE
+VFMSUBADD312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 97 /r] FMA,FUTURE
+VFMSUBADD213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a7 /r] FMA,FUTURE
+VFMSUBADD213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a7 /r] FMA,FUTURE
+VFMSUBADD213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a7 /r] FMA,FUTURE
+VFMSUBADD213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a7 /r] FMA,FUTURE
+VFMSUBADD123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 a7 /r] FMA,FUTURE
+VFMSUBADD123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 a7 /r] FMA,FUTURE
+VFMSUBADD123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 a7 /r] FMA,FUTURE
+VFMSUBADD123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 a7 /r] FMA,FUTURE
+VFMSUBADD231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b7 /r] FMA,FUTURE
+VFMSUBADD231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b7 /r] FMA,FUTURE
+VFMSUBADD231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b7 /r] FMA,FUTURE
+VFMSUBADD231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b7 /r] FMA,FUTURE
+VFMSUBADD321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 b7 /r] FMA,FUTURE
+VFMSUBADD321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 b7 /r] FMA,FUTURE
+VFMSUBADD321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 b7 /r] FMA,FUTURE
+VFMSUBADD321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 b7 /r] FMA,FUTURE
+VFNMADD132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9c /r] FMA,FUTURE
+VFNMADD132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9c /r] FMA,FUTURE
+VFNMADD132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9c /r] FMA,FUTURE
+VFNMADD132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9c /r] FMA,FUTURE
+VFNMADD312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9c /r] FMA,FUTURE
+VFNMADD312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9c /r] FMA,FUTURE
+VFNMADD312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9c /r] FMA,FUTURE
+VFNMADD312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9c /r] FMA,FUTURE
+VFNMADD213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ac /r] FMA,FUTURE
+VFNMADD213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ac /r] FMA,FUTURE
+VFNMADD213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ac /r] FMA,FUTURE
+VFNMADD213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ac /r] FMA,FUTURE
+VFNMADD123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ac /r] FMA,FUTURE
+VFNMADD123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ac /r] FMA,FUTURE
+VFNMADD123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ac /r] FMA,FUTURE
+VFNMADD123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ac /r] FMA,FUTURE
+VFNMADD231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 bc /r] FMA,FUTURE
+VFNMADD231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 bc /r] FMA,FUTURE
+VFNMADD231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 bc /r] FMA,FUTURE
+VFNMADD231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 bc /r] FMA,FUTURE
+VFNMADD321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 bc /r] FMA,FUTURE
+VFNMADD321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 bc /r] FMA,FUTURE
+VFNMADD321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 bc /r] FMA,FUTURE
+VFNMADD321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 bc /r] FMA,FUTURE
+VFNMSUB132PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9e /r] FMA,FUTURE
+VFNMSUB132PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9e /r] FMA,FUTURE
+VFNMSUB132PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9e /r] FMA,FUTURE
+VFNMSUB132PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9e /r] FMA,FUTURE
+VFNMSUB312PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 9e /r] FMA,FUTURE
+VFNMSUB312PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 9e /r] FMA,FUTURE
+VFNMSUB312PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 9e /r] FMA,FUTURE
+VFNMSUB312PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 9e /r] FMA,FUTURE
+VFNMSUB213PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ae /r] FMA,FUTURE
+VFNMSUB213PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ae /r] FMA,FUTURE
+VFNMSUB213PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ae /r] FMA,FUTURE
+VFNMSUB213PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ae /r] FMA,FUTURE
+VFNMSUB123PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 ae /r] FMA,FUTURE
+VFNMSUB123PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 ae /r] FMA,FUTURE
+VFNMSUB123PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 ae /r] FMA,FUTURE
+VFNMSUB123PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 ae /r] FMA,FUTURE
+VFNMSUB231PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 be /r] FMA,FUTURE
+VFNMSUB231PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 be /r] FMA,FUTURE
+VFNMSUB231PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 be /r] FMA,FUTURE
+VFNMSUB231PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 be /r] FMA,FUTURE
+VFNMSUB321PS xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w0 be /r] FMA,FUTURE
+VFNMSUB321PS ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w0 be /r] FMA,FUTURE
+VFNMSUB321PD xmmreg,xmmreg,xmmrm128 [rvm: vex.dds.128.66.0f38.w1 be /r] FMA,FUTURE
+VFNMSUB321PD ymmreg,ymmreg,ymmrm256 [rvm: vex.dds.256.66.0f38.w1 be /r] FMA,FUTURE
+VFMADD132SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 99 /r] FMA,FUTURE
+VFMADD132SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 99 /r] FMA,FUTURE
+VFMADD312SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 99 /r] FMA,FUTURE
+VFMADD312SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 99 /r] FMA,FUTURE
+VFMADD213SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 a9 /r] FMA,FUTURE
+VFMADD213SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 a9 /r] FMA,FUTURE
+VFMADD123SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 a9 /r] FMA,FUTURE
+VFMADD123SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 a9 /r] FMA,FUTURE
+VFMADD231SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 b9 /r] FMA,FUTURE
+VFMADD231SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 b9 /r] FMA,FUTURE
+VFMADD321SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 b9 /r] FMA,FUTURE
+VFMADD321SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 b9 /r] FMA,FUTURE
+VFMSUB132SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9b /r] FMA,FUTURE
+VFMSUB132SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9b /r] FMA,FUTURE
+VFMSUB312SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9b /r] FMA,FUTURE
+VFMSUB312SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9b /r] FMA,FUTURE
+VFMSUB213SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 ab /r] FMA,FUTURE
+VFMSUB213SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 ab /r] FMA,FUTURE
+VFMSUB123SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 ab /r] FMA,FUTURE
+VFMSUB123SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 ab /r] FMA,FUTURE
+VFMSUB231SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bb /r] FMA,FUTURE
+VFMSUB231SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bb /r] FMA,FUTURE
+VFMSUB321SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bb /r] FMA,FUTURE
+VFMSUB321SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bb /r] FMA,FUTURE
+VFNMADD132SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9d /r] FMA,FUTURE
+VFNMADD132SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9d /r] FMA,FUTURE
+VFNMADD312SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9d /r] FMA,FUTURE
+VFNMADD312SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9d /r] FMA,FUTURE
+VFNMADD213SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 ad /r] FMA,FUTURE
+VFNMADD213SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 ad /r] FMA,FUTURE
+VFNMADD123SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 ad /r] FMA,FUTURE
+VFNMADD123SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 ad /r] FMA,FUTURE
+VFNMADD231SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bd /r] FMA,FUTURE
+VFNMADD231SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bd /r] FMA,FUTURE
+VFNMADD321SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bd /r] FMA,FUTURE
+VFNMADD321SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bd /r] FMA,FUTURE
+VFNMSUB132SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9f /r] FMA,FUTURE
+VFNMSUB132SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9f /r] FMA,FUTURE
+VFNMSUB312SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 9f /r] FMA,FUTURE
+VFNMSUB312SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 9f /r] FMA,FUTURE
+VFNMSUB213SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 af /r] FMA,FUTURE
+VFNMSUB213SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 af /r] FMA,FUTURE
+VFNMSUB123SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 af /r] FMA,FUTURE
+VFNMSUB123SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 af /r] FMA,FUTURE
+VFNMSUB231SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bf /r] FMA,FUTURE
+VFNMSUB231SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bf /r] FMA,FUTURE
+VFNMSUB321SS xmmreg,xmmreg,xmmrm32 [rvm: vex.dds.128.66.0f38.w0 bf /r] FMA,FUTURE
+VFNMSUB321SD xmmreg,xmmreg,xmmrm64 [rvm: vex.dds.128.66.0f38.w1 bf /r] FMA,FUTURE
+
+;# Intel post-32 nm processor instructions
+;
+; Per AVX spec revision 7, document 319433-007
+RDFSBASE reg32 [m: norexw f3 0f ae /0] LONG,FUTURE
+RDFSBASE reg64 [m: o64 f3 0f ae /0] LONG,FUTURE
+RDGSBASE reg32 [m: norexw f3 0f ae /1] LONG,FUTURE
+RDGSBASE reg64 [m: o64 f3 0f ae /1] LONG,FUTURE
+RDRAND reg16 [m: o16 0f c7 /6] FUTURE
+RDRAND reg32 [m: o32 0f c7 /6] FUTURE
+RDRAND reg64 [m: o64 0f c7 /6] LONG,FUTURE
+WRFSBASE reg32 [m: norexw f3 0f ae /2] LONG,FUTURE
+WRFSBASE reg64 [m: o64 f3 0f ae /2] LONG,FUTURE
+WRGSBASE reg32 [m: norexw f3 0f ae /3] LONG,FUTURE
+WRGSBASE reg64 [m: o64 f3 0f ae /3] LONG,FUTURE
+VCVTPH2PS ymmreg,xmmrm128 [rm: vex.256.66.0f38.w0 13 /r] AVX,FUTURE
+VCVTPH2PS xmmreg,xmmrm64 [rm: vex.128.66.0f38.w0 13 /r] AVX,FUTURE
+VCVTPS2PH xmmrm128,ymmreg,imm8 [mri: vex.256.66.0f3a.w0 1d /r ib] AVX,FUTURE
+VCVTPS2PH xmmrm64,xmmreg,imm8 [mri: vex.128.66.0f3a.w0 1d /r ib] AVX,FUTURE
+
+; Per AVX spec revision 13, document 319433-013
+ADCX reg32,rm32 [rm: norexw 66 0f 38 f6 /r] FUTURE
+ADCX reg64,rm64 [rm: o64 66 0f 38 f6 /r] LONG,FUTURE
+ADOX reg32,rm32 [rm: norexw f3 0f 38 f6 /r] FUTURE
+ADOX reg64,rm64 [rm: o64 f3 0f 38 f6 /r] LONG,FUTURE
+RDSEED reg16 [m: o16 0f c7 /7] FUTURE
+RDSEED reg32 [m: o32 0f c7 /7] FUTURE
+RDSEED reg64 [m: o64 0f c7 /7] LONG,FUTURE
+
+; Per AVX spec revision 14, document 319433-014
+CLAC void [ 0f 01 ca] PRIV,FUTURE
+STAC void [ 0f 01 cb] PRIV,FUTURE
+
+;# VIA (Centaur) security instructions
+XSTORE void [ 0f a7 c0] PENT,CYRIX
+XCRYPTECB void [ mustrep 0f a7 c8] PENT,CYRIX
+XCRYPTCBC void [ mustrep 0f a7 d0] PENT,CYRIX
+XCRYPTCTR void [ mustrep 0f a7 d8] PENT,CYRIX
+XCRYPTCFB void [ mustrep 0f a7 e0] PENT,CYRIX
+XCRYPTOFB void [ mustrep 0f a7 e8] PENT,CYRIX
+MONTMUL void [ mustrep 0f a6 c0] PENT,CYRIX
+XSHA1 void [ mustrep 0f a6 c8] PENT,CYRIX
+XSHA256 void [ mustrep 0f a6 d0] PENT,CYRIX
+
+;# AMD Lightweight Profiling (LWP) instructions
+;
+; based on pub number 43724 revision 3.04 date August 2009
+;
+; updated to match draft from AMD developer (patch has been
+; sent to binutils
+; 2010-03-22 Quentin Neill <quentin.neill@amd.com>
+; Sebastian Pop <sebastian.pop@amd.com>
+;
+LLWPCB reg32 [m: xop.m9.w0.l0.p0 12 /0] AMD,386
+LLWPCB reg64 [m: xop.m9.w1.l0.p0 12 /0] AMD,X64
+
+SLWPCB reg32 [m: xop.m9.w0.l0.p0 12 /1] AMD,386
+SLWPCB reg64 [m: xop.m9.w1.l0.p0 12 /1] AMD,X64
+
+LWPVAL reg32,rm32,imm32 [vmi: xop.m10.w0.ndd.l0.p0 12 /1 id] AMD,386
+LWPVAL reg64,rm32,imm32 [vmi: xop.m10.w1.ndd.l0.p0 12 /1 id] AMD,X64
+
+LWPINS reg32,rm32,imm32 [vmi: xop.m10.w0.ndd.l0.p0 12 /0 id] AMD,386
+LWPINS reg64,rm32,imm32 [vmi: xop.m10.w1.ndd.l0.p0 12 /0 id] AMD,X64
+
+;# AMD XOP and FMA4 instructions (SSE5)
+;
+; based on pub number 43479 revision 3.04 dated November 2009
+;
+VFMADDPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 69 /r /is4] AMD,SSE5
+VFMADDPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 69 /r /is4] AMD,SSE5
+VFMADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 69 /r /is4] AMD,SSE5
+VFMADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 69 /r /is4] AMD,SSE5
+
+VFMADDPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 68 /r /is4] AMD,SSE5
+VFMADDPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 68 /r /is4] AMD,SSE5
+VFMADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 68 /r /is4] AMD,SSE5
+VFMADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 68 /r /is4] AMD,SSE5
+
+VFMADDSD xmmreg,xmmreg*,xmmrm64,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6b /r /is4] AMD,SSE5
+VFMADDSD xmmreg,xmmreg*,xmmreg,xmmrm64 [rvsm: vex.m3.w1.nds.l0.p1 6b /r /is4] AMD,SSE5
+
+VFMADDSS xmmreg,xmmreg*,xmmrm32,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6a /r /is4] AMD,SSE5
+VFMADDSS xmmreg,xmmreg*,xmmreg,xmmrm32 [rvsm: vex.m3.w1.nds.l0.p1 6a /r /is4] AMD,SSE5
+
+VFMADDSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 5d /r /is4] AMD,SSE5
+VFMADDSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 5d /r /is4] AMD,SSE5
+VFMADDSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 5d /r /is4] AMD,SSE5
+VFMADDSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 5d /r /is4] AMD,SSE5
+
+VFMADDSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 5c /r /is4] AMD,SSE5
+VFMADDSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 5c /r /is4] AMD,SSE5
+VFMADDSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 5c /r /is4] AMD,SSE5
+VFMADDSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 5c /r /is4] AMD,SSE5
+
+VFMSUBADDPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 5f /r /is4] AMD,SSE5
+VFMSUBADDPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 5f /r /is4] AMD,SSE5
+VFMSUBADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 5f /r /is4] AMD,SSE5
+VFMSUBADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 5f /r /is4] AMD,SSE5
+
+VFMSUBADDPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 5e /r /is4] AMD,SSE5
+VFMSUBADDPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 5e /r /is4] AMD,SSE5
+VFMSUBADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 5e /r /is4] AMD,SSE5
+VFMSUBADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 5e /r /is4] AMD,SSE5
+
+VFMSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6d /r /is4] AMD,SSE5
+VFMSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 6d /r /is4] AMD,SSE5
+VFMSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 6d /r /is4] AMD,SSE5
+VFMSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 6d /r /is4] AMD,SSE5
+
+VFMSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6c /r /is4] AMD,SSE5
+VFMSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 6c /r /is4] AMD,SSE5
+VFMSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 6c /r /is4] AMD,SSE5
+VFMSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 6c /r /is4] AMD,SSE5
+
+VFMSUBSD xmmreg,xmmreg*,xmmrm64,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6f /r /is4] AMD,SSE5
+VFMSUBSD xmmreg,xmmreg*,xmmreg,xmmrm64 [rvsm: vex.m3.w1.nds.l0.p1 6f /r /is4] AMD,SSE5
+
+VFMSUBSS xmmreg,xmmreg*,xmmrm32,xmmreg [rvms: vex.m3.w0.nds.l0.p1 6e /r /is4] AMD,SSE5
+VFMSUBSS xmmreg,xmmreg*,xmmreg,xmmrm32 [rvsm: vex.m3.w1.nds.l0.p1 6e /r /is4] AMD,SSE5
+
+VFNMADDPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 79 /r /is4] AMD,SSE5
+VFNMADDPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 79 /r /is4] AMD,SSE5
+VFNMADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 79 /r /is4] AMD,SSE5
+VFNMADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 79 /r /is4] AMD,SSE5
+
+VFNMADDPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 78 /r /is4] AMD,SSE5
+VFNMADDPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 78 /r /is4] AMD,SSE5
+VFNMADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 78 /r /is4] AMD,SSE5
+VFNMADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 78 /r /is4] AMD,SSE5
+
+VFNMADDSD xmmreg,xmmreg*,xmmrm64,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7b /r /is4] AMD,SSE5
+VFNMADDSD xmmreg,xmmreg*,xmmreg,xmmrm64 [rvsm: vex.m3.w1.nds.l0.p1 7b /r /is4] AMD,SSE5
+
+VFNMADDSS xmmreg,xmmreg*,xmmrm32,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7a /r /is4] AMD,SSE5
+VFNMADDSS xmmreg,xmmreg*,xmmreg,xmmrm32 [rvsm: vex.m3.w1.nds.l0.p1 7a /r /is4] AMD,SSE5
+
+VFNMSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7d /r /is4] AMD,SSE5
+VFNMSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 7d /r /is4] AMD,SSE5
+VFNMSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 7d /r /is4] AMD,SSE5
+VFNMSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 7d /r /is4] AMD,SSE5
+
+VFNMSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7c /r /is4] AMD,SSE5
+VFNMSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.m3.w0.nds.l1.p1 7c /r /is4] AMD,SSE5
+VFNMSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: vex.m3.w1.nds.l0.p1 7c /r /is4] AMD,SSE5
+VFNMSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: vex.m3.w1.nds.l1.p1 7c /r /is4] AMD,SSE5
+
+VFNMSUBSD xmmreg,xmmreg*,xmmrm64,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7f /r /is4] AMD,SSE5
+VFNMSUBSD xmmreg,xmmreg*,xmmreg,xmmrm64 [rvsm: vex.m3.w1.nds.l0.p1 7f /r /is4] AMD,SSE5
+
+VFNMSUBSS xmmreg,xmmreg*,xmmrm32,xmmreg [rvms: vex.m3.w0.nds.l0.p1 7e /r /is4] AMD,SSE5
+VFNMSUBSS xmmreg,xmmreg*,xmmreg,xmmrm32 [rvsm: vex.m3.w1.nds.l0.p1 7e /r /is4] AMD,SSE5
+
+VFRCZPD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 81 /r] AMD,SSE5
+VFRCZPD ymmreg,ymmrm256* [rm: xop.m9.w0.l1.p0 81 /r] AMD,SSE5
+
+VFRCZPS xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 80 /r] AMD,SSE5
+VFRCZPS ymmreg,ymmrm256* [rm: xop.m9.w0.l1.p0 80 /r] AMD,SSE5
+
+VFRCZSD xmmreg,xmmrm64* [rm: xop.m9.w0.l0.p0 83 /r] AMD,SSE5
+
+VFRCZSS xmmreg,xmmrm32* [rm: xop.m9.w0.l0.p0 82 /r] AMD,SSE5
+;
+; fixed: spec mention imm[7:4] though it should be /is4 even in spec
+VPCMOV xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 a2 /r /is4] AMD,SSE5
+VPCMOV ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: xop.m8.w0.nds.l1.p0 a2 /r /is4] AMD,SSE5
+VPCMOV xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: xop.m8.w1.nds.l0.p0 a2 /r /is4] AMD,SSE5
+VPCMOV ymmreg,ymmreg*,ymmreg,ymmrm256 [rvsm: xop.m8.w1.nds.l1.p0 a2 /r /is4] AMD,SSE5
+
+VPCOMB xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 cc /r ib] AMD,SSE5
+VPCOMD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 ce /r ib] AMD,SSE5
+VPCOMQ xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 cf /r ib] AMD,SSE5
+;
+; fixed: spec mention only 3 operands in mnemonics
+VPCOMUB xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 ec /r ib] AMD,SSE5
+VPCOMUD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 ee /r ib] AMD,SSE5
+VPCOMUQ xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 ef /r ib] AMD,SSE5
+;
+; fixed: spec point wrong VPCOMB in mnemonic
+VPCOMUW xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 ed /r ib] AMD,SSE5
+VPCOMW xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: xop.m8.w0.nds.l0.p0 cd /r ib] AMD,SSE5
+
+VPHADDBD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 c2 /r] AMD,SSE5
+VPHADDBQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 c3 /r] AMD,SSE5
+VPHADDBW xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 c1 /r] AMD,SSE5
+VPHADDDQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 cb /r] AMD,SSE5
+;
+; fixed: spec has ymmreg for l0
+VPHADDUBD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 d2 /r] AMD,SSE5
+VPHADDUBQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 d3 /r] AMD,SSE5
+;
+; fixed: spec has VPHADDUBWD
+VPHADDUBW xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 d1 /r] AMD,SSE5
+;
+; fixed: opcode db
+VPHADDUDQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 db /r] AMD,SSE5
+VPHADDUWD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 d6 /r] AMD,SSE5
+VPHADDUWQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 d7 /r] AMD,SSE5
+;
+; fixed: spec has ymmreg for l0
+VPHADDWD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 c6 /r] AMD,SSE5
+;
+; fixed: spec has d7 opcode
+VPHADDWQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 c7 /r] AMD,SSE5
+
+VPHSUBBW xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 e1 /r] AMD,SSE5
+VPHSUBDQ xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 e3 /r] AMD,SSE5
+VPHSUBWD xmmreg,xmmrm128* [rm: xop.m9.w0.l0.p0 e2 /r] AMD,SSE5
+
+VPMACSDD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 9e /r /is4] AMD,SSE5
+;
+; fixed: spec has 97,9f opcodes here
+VPMACSDQH xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 9f /r /is4] AMD,SSE5
+VPMACSDQL xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 97 /r /is4] AMD,SSE5
+VPMACSSDD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 8e /r /is4] AMD,SSE5
+VPMACSSDQH xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 8f /r /is4] AMD,SSE5
+VPMACSSDQL xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 87 /r /is4] AMD,SSE5
+VPMACSSWD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 86 /r /is4] AMD,SSE5
+VPMACSSWW xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 85 /r /is4] AMD,SSE5
+VPMACSWD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 96 /r /is4] AMD,SSE5
+VPMACSWW xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 95 /r /is4] AMD,SSE5
+VPMADCSSWD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 a6 /r /is4] AMD,SSE5
+VPMADCSWD xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 b6 /r /is4] AMD,SSE5
+
+VPPERM xmmreg,xmmreg*,xmmreg,xmmrm128 [rvsm: xop.m8.w1.nds.l0.p0 a3 /r /is4] AMD,SSE5
+VPPERM xmmreg,xmmreg*,xmmrm128,xmmreg [rvms: xop.m8.w0.nds.l0.p0 a3 /r /is4] AMD,SSE5
+
+VPROTB xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 90 /r] AMD,SSE5
+VPROTB xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 90 /r] AMD,SSE5
+;
+; fixed: spec point xmmreg instead of reg/mem
+VPROTB xmmreg,xmmrm128*,imm8 [rmi: xop.m8.w0.l0.p0 c0 /r ib] AMD,SSE5
+
+VPROTD xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 92 /r] AMD,SSE5
+VPROTD xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 92 /r] AMD,SSE5
+;
+; fixed: spec error /r is needed
+VPROTD xmmreg,xmmrm128*,imm8 [rmi: xop.m8.w0.l0.p0 c2 /r ib] AMD,SSE5
+VPROTQ xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 93 /r] AMD,SSE5
+VPROTQ xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 93 /r] AMD,SSE5
+;
+; fixed: spec error /r is needed
+VPROTQ xmmreg,xmmrm128*,imm8 [rmi: xop.m8.w0.l0.p0 c3 /r ib] AMD,SSE5
+VPROTW xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 91 /r] AMD,SSE5
+VPROTW xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 91 /r] AMD,SSE5
+VPROTW xmmreg,xmmrm128*,imm8 [rmi: xop.m8.w0.l0.p0 c1 /r ib] AMD,SSE5
+
+VPSHAB xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 98 /r] AMD,SSE5
+VPSHAB xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 98 /r] AMD,SSE5
+
+VPSHAD xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 9a /r] AMD,SSE5
+VPSHAD xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 9a /r] AMD,SSE5
+
+VPSHAQ xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 9b /r] AMD,SSE5
+VPSHAQ xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 9b /r] AMD,SSE5
+
+VPSHAW xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 99 /r] AMD,SSE5
+VPSHAW xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 99 /r] AMD,SSE5
+
+VPSHLB xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 94 /r] AMD,SSE5
+VPSHLB xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 94 /r] AMD,SSE5
+
+;
+; fixed: spec has ymmreg for l0
+VPSHLD xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 96 /r] AMD,SSE5
+VPSHLD xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 96 /r] AMD,SSE5
+
+VPSHLQ xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 97 /r] AMD,SSE5
+VPSHLQ xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 97 /r] AMD,SSE5
+
+VPSHLW xmmreg,xmmrm128*,xmmreg [rmv: xop.m9.w0.nds.l0.p0 95 /r] AMD,SSE5
+VPSHLW xmmreg,xmmreg*,xmmrm128 [rvm: xop.m9.w1.nds.l0.p0 95 /r] AMD,SSE5
+
+;# Intel AVX2 instructions
+;
+; based on pub number 319433-011 dated July 2011
+;
+VMPSADBW ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 42 /r ib] FUTURE,AVX2
+VPABSB ymmreg,ymmrm256 [rm: vex.256.66.0f38 1c /r] FUTURE,AVX2
+VPABSW ymmreg,ymmrm256 [rm: vex.256.66.0f38 1d /r] FUTURE,AVX2
+VPABSD ymmreg,ymmrm256 [rm: vex.256.66.0f38 1e /r] FUTURE,AVX2
+VPACKSSWB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 63 /r] FUTURE,AVX2
+VPACKSSDW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 6b /r] FUTURE,AVX2
+VPACKUSDW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 2b /r] FUTURE,AVX2
+VPACKUSWB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 67 /r] FUTURE,AVX2
+VPADDB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f fc /r] FUTURE,AVX2
+VPADDW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f fd /r] FUTURE,AVX2
+VPADDD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f fe /r] FUTURE,AVX2
+VPADDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f d4 /r] FUTURE,AVX2
+VPADDSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f ec /r] FUTURE,AVX2
+VPADDSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f ed /r] FUTURE,AVX2
+VPADDUSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f dc /r] FUTURE,AVX2
+VPADDUSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f dd /r] FUTURE,AVX2
+VPALIGNR ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 0f /r ib] FUTURE,AVX2
+VPAND ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f db /r] FUTURE,AVX2
+VPANDN ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f df /r] FUTURE,AVX2
+VPAVGB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e0 /r] FUTURE,AVX2
+VPAVGW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e3 /r] FUTURE,AVX2
+VPBLENDVB ymmreg,ymmreg*,ymmrm256,ymmreg [rvms: vex.nds.256.66.0f3a 4c /r /is4] FUTURE,AVX2
+VPBLENDW ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a 0e /r ib] FUTURE,AVX2
+VPCMPEQB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 74 /r] FUTURE,AVX2
+VPCMPEQW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 75 /r] FUTURE,AVX2
+VPCMPEQD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 76 /r] FUTURE,AVX2
+VPCMPEQQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 29 /r] FUTURE,AVX2
+VPCMPGTB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 64 /r] FUTURE,AVX2
+VPCMPGTW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 65 /r] FUTURE,AVX2
+VPCMPGTD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 66 /r] FUTURE,AVX2
+VPCMPGTQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 37 /r] FUTURE,AVX2
+VPHADDW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 01 /r] FUTURE,AVX2
+VPHADDD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 02 /r] FUTURE,AVX2
+VPHADDSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 03 /r] FUTURE,AVX2
+VPHSUBW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 05 /r] FUTURE,AVX2
+VPHSUBD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 06 /r] FUTURE,AVX2
+VPHSUBSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 07 /r] FUTURE,AVX2
+VPMADDUBSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 04 /r] FUTURE,AVX2
+VPMADDWD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f f5 /r] FUTURE,AVX2
+VPMAXSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3c /r] FUTURE,AVX2
+VPMAXSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f ee /r] FUTURE,AVX2
+VPMAXSD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3d /r] FUTURE,AVX2
+VPMAXUB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f de /r] FUTURE,AVX2
+VPMAXUW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3e /r] FUTURE,AVX2
+VPMAXUD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3f /r] FUTURE,AVX2
+VPMINSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 38 /r] FUTURE,AVX2
+VPMINSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f ea /r] FUTURE,AVX2
+VPMINSD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 39 /r] FUTURE,AVX2
+VPMINUB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f da /r] FUTURE,AVX2
+VPMINUW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3a /r] FUTURE,AVX2
+VPMINUD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 3b /r] FUTURE,AVX2
+VPMOVMSKB reg32,ymmreg [rm: vex.256.66.0f d7 /r] FUTURE,AVX2
+VPMOVMSKB reg64,ymmreg [rm: vex.256.66.0f d7 /r] FUTURE,AVX2
+VPMOVSXBW ymmreg,xmmrm128 [rm: vex.256.66.0f38 20 /r] FUTURE,AVX2
+VPMOVSXBD ymmreg,mem64 [rm: vex.256.66.0f38 21 /r] FUTURE,AVX2
+VPMOVSXBD ymmreg,xmmreg [rm: vex.256.66.0f38 21 /r] FUTURE,AVX2
+VPMOVSXBQ ymmreg,mem32 [rm: vex.256.66.0f38 22 /r] FUTURE,AVX2
+VPMOVSXBQ ymmreg,xmmreg [rm: vex.256.66.0f38 22 /r] FUTURE,AVX2
+VPMOVSXWD ymmreg,xmmrm128 [rm: vex.256.66.0f38 23 /r] FUTURE,AVX2
+VPMOVSXWQ ymmreg,mem64 [rm: vex.256.66.0f38 24 /r] FUTURE,AVX2
+VPMOVSXWQ ymmreg,xmmreg [rm: vex.256.66.0f38 24 /r] FUTURE,AVX2
+VPMOVSXDQ ymmreg,xmmrm128 [rm: vex.256.66.0f38 25 /r] FUTURE,AVX2
+VPMOVZXBW ymmreg,xmmrm128 [rm: vex.256.66.0f38 30 /r] FUTURE,AVX2
+VPMOVZXBD ymmreg,mem64 [rm: vex.256.66.0f38 31 /r] FUTURE,AVX2
+VPMOVZXBD ymmreg,xmmreg [rm: vex.256.66.0f38 31 /r] FUTURE,AVX2
+VPMOVZXBQ ymmreg,mem32 [rm: vex.256.66.0f38 32 /r] FUTURE,AVX2
+VPMOVZXBQ ymmreg,xmmreg [rm: vex.256.66.0f38 32 /r] FUTURE,AVX2
+VPMOVZXWD ymmreg,xmmrm128 [rm: vex.256.66.0f38 33 /r] FUTURE,AVX2
+VPMOVZXWQ ymmreg,mem64 [rm: vex.256.66.0f38 34 /r] FUTURE,AVX2
+VPMOVZXWQ ymmreg,xmmreg [rm: vex.256.66.0f38 34 /r] FUTURE,AVX2
+VPMOVZXDQ ymmreg,xmmrm128 [rm: vex.256.66.0f38 35 /r] FUTURE,AVX2
+VPMULDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 28 /r] FUTURE,AVX2
+VPMULHRSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 0b /r] FUTURE,AVX2
+VPMULHUW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e4 /r] FUTURE,AVX2
+VPMULHW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e5 /r] FUTURE,AVX2
+VPMULLW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f d5 /r] FUTURE,AVX2
+VPMULLD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 40 /r] FUTURE,AVX2
+VPMULUDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f f4 /r] FUTURE,AVX2
+VPOR ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f eb /r] FUTURE,AVX2
+VPSADBW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f f6 /r] FUTURE,AVX2
+VPSHUFB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 00 /r] FUTURE,AVX2
+VPSHUFD ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f 70 /r ib] FUTURE,AVX2
+VPSHUFHW ymmreg,ymmrm256,imm8 [rmi: vex.256.f3.0f 70 /r ib] FUTURE,AVX2
+VPSHUFLW ymmreg,ymmrm256,imm8 [rmi: vex.256.f2.0f 70 /r ib] FUTURE,AVX2
+VPSIGNB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 08 /r] FUTURE,AVX2
+VPSIGNW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 09 /r] FUTURE,AVX2
+VPSIGND ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38 0a /r] FUTURE,AVX2
+VPSLLDQ ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 73 /7 ib] FUTURE,AVX2
+VPSLLW ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f f1 /r] FUTURE,AVX2
+VPSLLW ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 71 /6 ib] FUTURE,AVX2
+VPSLLD ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f f2 /r] FUTURE,AVX2
+VPSLLD ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 72 /6 ib] FUTURE,AVX2
+VPSLLQ ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f f3 /r] FUTURE,AVX2
+VPSLLQ ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 73 /6 ib] FUTURE,AVX2
+VPSRAW ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f e1 /r] FUTURE,AVX2
+VPSRAW ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 71 /4 ib] FUTURE,AVX2
+VPSRAD ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f e2 /r] FUTURE,AVX2
+VPSRAD ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 72 /4 ib] FUTURE,AVX2
+VPSRLDQ ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 73 /3 ib] FUTURE,AVX2
+VPSRLW ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f d1 /r] FUTURE,AVX2
+VPSRLW ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 71 /2 ib] FUTURE,AVX2
+VPSRLD ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f d2 /r] FUTURE,AVX2
+VPSRLD ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f 72 /2 ib] FUTURE,AVX2
+VPSRLQ ymmreg,ymmreg*,xmmrm128 [rvm: vex.nds.256.66.0f d3 /r] FUTURE,AVX2
+VPSRLQ ymmreg,ymmreg*,imm8 [vmi: vex.ndd.256.66.0f.wig 73 /2 ib] FUTURE,AVX2
+VPSUBB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f f8 /r] FUTURE,AVX2
+VPSUBW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f f9 /r] FUTURE,AVX2
+VPSUBD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f fa /r] FUTURE,AVX2
+VPSUBQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f fb /r] FUTURE,AVX2
+VPSUBSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e8 /r] FUTURE,AVX2
+VPSUBSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f e9 /r] FUTURE,AVX2
+VPSUBUSB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f d8 /r] FUTURE,AVX2
+VPSUBUSW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f d9 /r] FUTURE,AVX2
+VPUNPCKHBW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 68 /r] FUTURE,AVX2
+VPUNPCKHWD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 69 /r] FUTURE,AVX2
+VPUNPCKHDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 6a /r] FUTURE,AVX2
+VPUNPCKHQDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 6d /r] FUTURE,AVX2
+VPUNPCKLBW ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 60 /r] FUTURE,AVX2
+VPUNPCKLWD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 61 /r] FUTURE,AVX2
+VPUNPCKLDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 62 /r] FUTURE,AVX2
+VPUNPCKLQDQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f 6c /r] FUTURE,AVX2
+VPXOR ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f ef /r] FUTURE,AVX2
+VMOVNTDQA ymmreg,mem256 [rm: vex.256.66.0f38 2a /r] FUTURE,AVX2
+VBROADCASTSS xmmreg,xmmreg [rm: vex.128.66.0f38.w0 18 /r] FUTURE,AVX2
+VBROADCASTSS ymmreg,xmmreg [rm: vex.256.66.0f38.w0 18 /r] FUTURE,AVX2
+VBROADCASTSD ymmreg,xmmreg [rm: vex.256.66.0f38.w0 19 /r] FUTURE,AVX2
+VBROADCASTI128 ymmreg,mem128 [rm: vex.256.66.0f38.w0 5a /r] FUTURE,AVX2
+VPBLENDD xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a.w0 02 /r ib] FUTURE,AVX2
+VPBLENDD ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a.w0 02 /r ib] FUTURE,AVX2
+VPBROADCASTB xmmreg,mem8 [rm: vex.128.66.0f38.w0 78 /r] FUTURE,AVX2
+VPBROADCASTB xmmreg,xmmreg [rm: vex.128.66.0f38.w0 78 /r] FUTURE,AVX2
+VPBROADCASTB ymmreg,mem8 [rm: vex.256.66.0f38.w0 78 /r] FUTURE,AVX2
+VPBROADCASTB ymmreg,xmmreg [rm: vex.256.66.0f38.w0 78 /r] FUTURE,AVX2
+VPBROADCASTW xmmreg,mem16 [rm: vex.128.66.0f38.w0 79 /r] FUTURE,AVX2
+VPBROADCASTW xmmreg,xmmreg [rm: vex.128.66.0f38.w0 79 /r] FUTURE,AVX2
+VPBROADCASTW ymmreg,mem16 [rm: vex.256.66.0f38.w0 79 /r] FUTURE,AVX2
+VPBROADCASTW ymmreg,xmmreg [rm: vex.256.66.0f38.w0 79 /r] FUTURE,AVX2
+VPBROADCASTD xmmreg,mem32 [rm: vex.128.66.0f38.w0 58 /r] FUTURE,AVX2
+VPBROADCASTD xmmreg,xmmreg [rm: vex.128.66.0f38.w0 58 /r] FUTURE,AVX2
+VPBROADCASTD ymmreg,mem32 [rm: vex.256.66.0f38.w0 58 /r] FUTURE,AVX2
+VPBROADCASTD ymmreg,xmmreg [rm: vex.256.66.0f38.w0 58 /r] FUTURE,AVX2
+VPBROADCASTQ xmmreg,mem64 [rm: vex.128.66.0f38.w0 59 /r] FUTURE,AVX2
+VPBROADCASTQ xmmreg,xmmreg [rm: vex.128.66.0f38.w0 59 /r] FUTURE,AVX2
+VPBROADCASTQ ymmreg,mem64 [rm: vex.256.66.0f38.w0 59 /r] FUTURE,AVX2
+VPBROADCASTQ ymmreg,xmmreg [rm: vex.256.66.0f38.w0 59 /r] FUTURE,AVX2
+
+VPERMD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 36 /r] FUTURE,AVX2
+VPERMPD ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a.w1 01 /r ib] FUTURE,AVX2
+VPERMPS ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 16 /r] FUTURE,AVX2
+VPERMQ ymmreg,ymmrm256,imm8 [rmi: vex.256.66.0f3a.w1 00 /r ib] FUTURE,AVX2
+VPERM2I128 ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a.w0 46 /r ib] FUTURE,AVX2
+VEXTRACTI128 xmmrm128,ymmreg,imm8 [mri: vex.256.66.0f3a.w0 39 /r ib] FUTURE,AVX2
+
+VINSERTI128 ymmreg,ymmreg*,xmmrm128,imm8 [rvmi: vex.nds.256.66.0f3a.w0 38 /r ib] FUTURE,AVX2
+VPMASKMOVD xmmreg,xmmreg*,mem128 [rvm: vex.nds.128.66.0f38.w0 8c /r] FUTURE,AVX2
+VPMASKMOVD ymmreg,ymmreg*,mem256 [rvm: vex.nds.256.66.0f38.w0 8c /r] FUTURE,AVX2
+VPMASKMOVQ xmmreg,xmmreg*,mem128 [rvm: vex.nds.128.66.0f38.w1 8c /r] FUTURE,AVX2
+VPMASKMOVQ ymmreg,ymmreg*,mem256 [rvm: vex.nds.256.66.0f38.w1 8c /r] FUTURE,AVX2
+
+VPMASKMOVD mem128,xmmreg*,xmmreg [mvr: vex.nds.128.66.0f38.w0 8e /r] FUTURE,AVX2
+VPMASKMOVD mem256,ymmreg*,ymmreg [mvr: vex.nds.256.66.0f38.w0 8e /r] FUTURE,AVX2
+VPMASKMOVQ mem128,xmmreg*,xmmreg [mvr: vex.nds.128.66.0f38.w1 8e /r] FUTURE,AVX2
+VPMASKMOVQ mem256,ymmreg*,ymmreg [mvr: vex.nds.256.66.0f38.w1 8e /r] FUTURE,AVX2
+
+VPSLLVD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 47 /r] FUTURE,AVX2
+VPSLLVQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w1 47 /r] FUTURE,AVX2
+VPSLLVD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 47 /r] FUTURE,AVX2
+VPSLLVQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w1 47 /r] FUTURE,AVX2
+
+VPSRAVD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 46 /r] FUTURE,AVX2
+VPSRAVD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 46 /r] FUTURE,AVX2
+
+VPSRLVD xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 45 /r] FUTURE,AVX2
+VPSRLVQ xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w1 45 /r] FUTURE,AVX2
+VPSRLVD ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 45 /r] FUTURE,AVX2
+VPSRLVQ ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w1 45 /r] FUTURE,AVX2
+
+VGATHERDPD xmmreg,xmem64,xmmreg [rmv: vm32x vex.dds.128.66.0f38.w1 92 /r] FUTURE,AVX2
+VGATHERQPD xmmreg,xmem64,xmmreg [rmv: vm64x vex.dds.128.66.0f38.w1 93 /r] FUTURE,AVX2
+VGATHERDPD ymmreg,xmem64,ymmreg [rmv: vm32x vex.dds.256.66.0f38.w1 92 /r] FUTURE,AVX2
+VGATHERQPD ymmreg,ymem64,ymmreg [rmv: vm64y vex.dds.256.66.0f38.w1 93 /r] FUTURE,AVX2
+
+VGATHERDPS xmmreg,xmem32,xmmreg [rmv: vm32x vex.dds.128.66.0f38.w0 92 /r] FUTURE,AVX2
+VGATHERQPS xmmreg,xmem32,xmmreg [rmv: vm64x vex.dds.128.66.0f38.w0 93 /r] FUTURE,AVX2
+VGATHERDPS ymmreg,ymem32,ymmreg [rmv: vm32y vex.dds.256.66.0f38.w0 92 /r] FUTURE,AVX2
+VGATHERQPS xmmreg,ymem32,xmmreg [rmv: vm64y vex.dds.256.66.0f38.w0 93 /r] FUTURE,AVX2
+
+VPGATHERDD xmmreg,xmem32,xmmreg [rmv: vm32x vex.dds.128.66.0f38.w0 90 /r] FUTURE,AVX2
+VPGATHERQD xmmreg,xmem32,xmmreg [rmv: vm64x vex.dds.128.66.0f38.w0 91 /r] FUTURE,AVX2
+VPGATHERDD ymmreg,ymem32,ymmreg [rmv: vm32y vex.dds.256.66.0f38.w0 90 /r] FUTURE,AVX2
+VPGATHERQD xmmreg,ymem32,xmmreg [rmv: vm64y vex.dds.256.66.0f38.w0 91 /r] FUTURE,AVX2
+
+VPGATHERDQ xmmreg,xmem64,xmmreg [rmv: vm32x vex.dds.128.66.0f38.w1 90 /r] FUTURE,AVX2
+VPGATHERQQ xmmreg,xmem64,xmmreg [rmv: vm64x vex.dds.128.66.0f38.w1 91 /r] FUTURE,AVX2
+VPGATHERDQ ymmreg,xmem64,ymmreg [rmv: vm32x vex.dds.256.66.0f38.w1 90 /r] FUTURE,AVX2
+VPGATHERQQ ymmreg,ymem64,ymmreg [rmv: vm64y vex.dds.256.66.0f38.w1 91 /r] FUTURE,AVX2
+
+;# Intel Transactional Synchronization Extensions (TSX)
+XABORT imm [i: c6 f8 ib] FUTURE,RTM
+XABORT imm8 [i: c6 f8 ib] FUTURE,RTM
+XBEGIN imm [i: odf c7 f8 rel] FUTURE,RTM
+XBEGIN imm|near [i: odf c7 f8 rel] FUTURE,RTM,ND
+XBEGIN imm16 [i: o16 c7 f8 rel] FUTURE,RTM,NOLONG
+XBEGIN imm16|near [i: o16 c7 f8 rel] FUTURE,RTM,NOLONG,ND
+XBEGIN imm32 [i: o32 c7 f8 rel] FUTURE,RTM,NOLONG
+XBEGIN imm32|near [i: o32 c7 f8 rel] FUTURE,RTM,NOLONG,ND
+XBEGIN imm64 [i: o64nw c7 f8 rel] FUTURE,RTM,LONG
+XBEGIN imm64|near [i: o64nw c7 f8 rel] FUTURE,RTM,LONG,ND
+XEND void [ 0f 01 d5] FUTURE,RTM
+XTEST void [ 0f 01 d6] FUTURE,HLE,RTM
+
+;# Intel BMI1 and BMI2 instructions, AMD TBM instructions
+;
+; based on pub number 319433-011 dated July 2011
+;
+ANDN reg32,reg32,rm32 [rvm: vex.nds.lz.0f38.w0 f2 /r] FUTURE,BMI1
+ANDN reg64,reg64,rm64 [rvm: vex.nds.lz.0f38.w1 f2 /r] LONG,FUTURE,BMI1
+BEXTR reg32,rm32,reg32 [rmv: vex.nds.lz.0f38.w0 f7 /r] FUTURE,BMI1
+BEXTR reg64,rm64,reg64 [rmv: vex.nds.lz.0f38.w1 f7 /r] LONG,FUTURE,BMI1
+BEXTR reg32,rm32,imm32 [rmi: xop.m10.lz.w0 10 /r id] FUTURE,TBM
+BEXTR reg64,rm64,imm32 [rmi: xop.m10.lz.w1 10 /r id] LONG,FUTURE,TBM
+BLCI reg32,rm32 [vm: xop.ndd.lz.m9.w0 02 /6] FUTURE,TBM
+BLCI reg64,rm64 [vm: xop.ndd.lz.m9.w1 02 /6] LONG,FUTURE,TBM
+BLCIC reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /5] FUTURE,TBM
+BLCIC reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /5] LONG,FUTURE,TBM
+BLSI reg32,rm32 [vm: vex.ndd.lz.0f38.w0 f3 /3] FUTURE,BMI1
+BLSI reg64,rm64 [vm: vex.ndd.lz.0f38.w1 f3 /3] LONG,FUTURE,BMI1
+BLSIC reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /6] FUTURE,TBM
+BLSIC reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /6] LONG,FUTURE,TBM
+BLCFILL reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /1] FUTURE,TBM
+BLCFILL reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /1] LONG,FUTURE,TBM
+BLSFILL reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /2] FUTURE,TBM
+BLSFILL reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /2] LONG,FUTURE,TBM
+BLCMSK reg32,rm32 [vm: xop.ndd.lz.m9.w0 02 /1] FUTURE,TBM
+BLCMSK reg64,rm64 [vm: xop.ndd.lz.m9.w1 02 /1] LONG,FUTURE,TBM
+BLSMSK reg32,rm32 [vm: vex.ndd.lz.0f38.w0 f3 /2] FUTURE,BMI1
+BLSMSK reg64,rm64 [vm: vex.ndd.lz.0f38.w1 f3 /2] LONG,FUTURE,BMI1
+BLSR reg32,rm32 [vm: vex.ndd.lz.0f38.w0 f3 /1] FUTURE,BMI1
+BLSR reg64,rm64 [vm: vex.ndd.lz.0f38.w1 f3 /1] LONG,FUTURE,BMI1
+BLCS reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /3] FUTURE,TBM
+BLCS reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /3] LONG,FUTURE,TBM
+BZHI reg32,rm32,reg32 [rmv: vex.nds.lz.0f38.w0 f5 /r] FUTURE,BMI2
+BZHI reg64,rm64,reg64 [rmv: vex.nds.lz.0f38.w1 f5 /r] LONG,FUTURE,BMI2
+MULX reg32,reg32,rm32 [rvm: vex.ndd.lz.f2.0f38.w0 f6 /r] FUTURE,BMI2
+MULX reg64,reg64,rm64 [rvm: vex.ndd.lz.f2.0f38.w1 f6 /r] LONG,FUTURE,BMI2
+PDEP reg32,reg32,rm32 [rvm: vex.nds.lz.f2.0f38.w0 f5 /r] FUTURE,BMI2
+PDEP reg64,reg64,rm64 [rvm: vex.nds.lz.f2.0f38.w1 f5 /r] LONG,FUTURE,BMI2
+PEXT reg32,reg32,rm32 [rvm: vex.nds.lz.f3.0f38.w0 f5 /r] FUTURE,BMI2
+PEXT reg64,reg64,rm64 [rvm: vex.nds.lz.f3.0f38.w1 f5 /r] LONG,FUTURE,BMI2
+RORX reg32,rm32,imm8 [rmi: vex.lz.f2.0f3a.w0 f0 /r ib] FUTURE,BMI2
+RORX reg64,rm64,imm8 [rmi: vex.lz.f2.0f3a.w1 f0 /r ib] LONG,FUTURE,BMI2
+SARX reg32,rm32,reg32 [rmv: vex.nds.lz.f3.0f38.w0 f7 /r] FUTURE,BMI2
+SARX reg64,rm64,reg64 [rmv: vex.nds.lz.f3.0f38.w1 f7 /r] LONG,FUTURE,BMI2
+SHLX reg32,rm32,reg32 [rmv: vex.nds.lz.66.0f38.w0 f7 /r] FUTURE,BMI2
+SHLX reg64,rm64,reg64 [rmv: vex.nds.lz.66.0f38.w1 f7 /r] LONG,FUTURE,BMI2
+SHRX reg32,rm32,reg32 [rmv: vex.nds.lz.f2.0f38.w0 f7 /r] FUTURE,BMI2
+SHRX reg64,rm64,reg64 [rmv: vex.nds.lz.f2.0f38.w1 f7 /r] LONG,FUTURE,BMI2
+TZCNT reg16,rm16 [rm: o16 f3i 0f bc /r] FUTURE,BMI1
+TZCNT reg32,rm32 [rm: o32 f3i 0f bc /r] FUTURE,BMI1
+TZCNT reg64,rm64 [rm: o64 f3i 0f bc /r] LONG,FUTURE,BMI1
+TZMSK reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /4] FUTURE,TBM
+TZMSK reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /4] LONG,FUTURE,TBM
+T1MSKC reg32,rm32 [vm: xop.ndd.lz.m9.w0 01 /7] FUTURE,TBM
+T1MSKC reg64,rm64 [vm: xop.ndd.lz.m9.w1 01 /7] LONG,FUTURE,TBM
+
+PREFETCHWT1 mem8 [m: 0f 0d /2 ] PREFETCHWT1,FUTURE
+
+;# Intel Memory Protection Extensions (MPX)
+BNDMK bndreg,mem [rm: f3 0f 1b /r ] MPX,MIB,FUTURE
+BNDCL bndreg,mem [rm: f3 0f 1a /r ] MPX,FUTURE
+BNDCL bndreg,reg32 [rm: f3 0f 1a /r ] MPX,NOLONG,FUTURE
+BNDCL bndreg,reg64 [rm: o64nw f3 0f 1a /r ] MPX,LONG,FUTURE
+BNDCU bndreg,mem [rm: f2 0f 1a /r ] MPX,FUTURE
+BNDCU bndreg,reg32 [rm: f2 0f 1a /r ] MPX,NOLONG,FUTURE
+BNDCU bndreg,reg64 [rm: o64nw f2 0f 1a /r ] MPX,LONG,FUTURE
+BNDCN bndreg,mem [rm: f2 0f 1b /r ] MPX,FUTURE
+BNDCN bndreg,reg32 [rm: f2 0f 1b /r ] MPX,NOLONG,FUTURE
+BNDCN bndreg,reg64 [rm: o64nw f2 0f 1b /r ] MPX,LONG,FUTURE
+BNDMOV bndreg,bndreg [rm: 66 0f 1a /r ] MPX,FUTURE
+BNDMOV bndreg,mem [rm: 66 0f 1a /r ] MPX,FUTURE
+BNDMOV bndreg,bndreg [mr: 66 0f 1b /r ] MPX,FUTURE
+BNDMOV mem,bndreg [mr: 66 0f 1b /r ] MPX,FUTURE
+BNDLDX bndreg,mem [rm: 0f 1a /r ] MPX,MIB,FUTURE
+BNDLDX bndreg,mem,reg32 [rmx: 0f 1a /r ] MPX,MIB,NOLONG,FUTURE
+BNDLDX bndreg,mem,reg64 [rmx: 0f 1a /r ] MPX,MIB,LONG,FUTURE
+BNDSTX mem,bndreg [mr: 0f 1b /r ] MPX,MIB,FUTURE
+BNDSTX mem,reg32,bndreg [mxr: 0f 1b /r ] MPX,MIB,NOLONG,FUTURE
+BNDSTX mem,reg64,bndreg [mxr: 0f 1b /r ] MPX,MIB,LONG,FUTURE
+BNDSTX mem,bndreg,reg32 [mrx: 0f 1b /r ] MPX,MIB,NOLONG,FUTURE
+BNDSTX mem,bndreg,reg64 [mrx: 0f 1b /r ] MPX,MIB,LONG,FUTURE
+
+;# Intel SHA acceleration instructions
+SHA1MSG1 xmmreg,xmmrm128 [rm: 0f 38 c9 /r ] SHA,FUTURE
+SHA1MSG2 xmmreg,xmmrm128 [rm: 0f 38 ca /r ] SHA,FUTURE
+SHA1NEXTE xmmreg,xmmrm128 [rm: 0f 38 c8 /r ] SHA,FUTURE
+SHA1RNDS4 xmmreg,xmmrm128,imm8 [rmi: 0f 3a cc /r ib ] SHA,FUTURE
+SHA256MSG1 xmmreg,xmmrm128 [rm: 0f 38 cc /r ] SHA,FUTURE
+SHA256MSG2 xmmreg,xmmrm128 [rm: 0f 38 cd /r ] SHA,FUTURE
+SHA256RNDS2 xmmreg,xmmrm128,xmm0 [rm-: 0f 38 cb /r ] SHA,FUTURE
+SHA256RNDS2 xmmreg,xmmrm128 [rm: 0f 38 cb /r ] SHA,FUTURE
+
+;# AVX-512 mask register instructions
+KADDB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 4a /r ] FUTURE
+KADDD kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 4a /r ] FUTURE
+KADDQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 4a /r ] FUTURE
+KADDW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 4a /r ] FUTURE
+KANDB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 41 /r ] FUTURE
+KANDD kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 41 /r ] FUTURE
+KANDNB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 42 /r ] FUTURE
+KANDND kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 42 /r ] FUTURE
+KANDNQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 42 /r ] FUTURE
+KANDNW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 42 /r ] FUTURE
+KANDQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 41 /r ] FUTURE
+KANDW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 41 /r ] FUTURE
+KMOVB kreg,krm8 [rm: vex.l0.66.0f.w0 90 /r ] FUTURE
+KMOVB mem8,kreg [mr: vex.l0.66.0f.w0 91 /r ] FUTURE
+KMOVB kreg,reg32 [rm: vex.l0.66.0f.w0 92 /r ] FUTURE
+KMOVB reg32,kreg [rm: vex.l0.66.0f.w0 93 /r ] FUTURE
+KMOVD kreg,krm32 [rm: vex.l0.66.0f.w1 90 /r ] FUTURE
+KMOVD mem32,kreg [mr: vex.l0.66.0f.w1 91 /r ] FUTURE
+KMOVD kreg,reg32 [rm: vex.l0.f2.0f.w0 92 /r ] FUTURE
+KMOVD reg32,kreg [rm: vex.l0.f2.0f.w0 93 /r ] FUTURE
+KMOVQ kreg,krm64 [rm: vex.l0.0f.w1 90 /r ] FUTURE
+KMOVQ mem64,kreg [mr: vex.l0.0f.w1 91 /r ] FUTURE
+KMOVQ kreg,reg64 [rm: vex.l0.f2.0f.w1 92 /r ] FUTURE
+KMOVQ reg64,kreg [rm: vex.l0.f2.0f.w1 93 /r ] FUTURE
+KMOVW kreg,krm16 [rm: vex.l0.0f.w0 90 /r ] FUTURE
+KMOVW mem16,kreg [mr: vex.l0.0f.w0 91 /r ] FUTURE
+KMOVW kreg,reg32 [rm: vex.l0.0f.w0 92 /r ] FUTURE
+KMOVW reg32,kreg [rm: vex.l0.0f.w0 93 /r ] FUTURE
+KNOTB kreg,kreg [rm: vex.l0.66.0f.w0 44 /r ] FUTURE
+KNOTD kreg,kreg [rm: vex.l0.66.0f.w1 44 /r ] FUTURE
+KNOTQ kreg,kreg [rm: vex.l0.0f.w1 44 /r ] FUTURE
+KNOTW kreg,kreg [rm: vex.l0.0f.w0 44 /r ] FUTURE
+KORB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 45 /r ] FUTURE
+KORD kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 45 /r ] FUTURE
+KORQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 45 /r ] FUTURE
+KORTESTB kreg,kreg [rm: vex.l0.66.0f.w0 98 /r ] FUTURE
+KORTESTD kreg,kreg [rm: vex.l0.66.0f.w1 98 /r ] FUTURE
+KORTESTQ kreg,kreg [rm: vex.l0.0f.w1 98 /r ] FUTURE
+KORTESTW kreg,kreg [rm: vex.l0.0f.w0 98 /r ] FUTURE
+KORW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 45 /r ] FUTURE
+KSHIFTLB kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w0 32 /r ib ] FUTURE
+KSHIFTLD kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w0 33 /r ib ] FUTURE
+KSHIFTLQ kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w1 33 /r ib ] FUTURE
+KSHIFTLW kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w1 32 /r ib ] FUTURE
+KSHIFTRB kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w0 30 /r ib ] FUTURE
+KSHIFTRD kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w0 31 /r ib ] FUTURE
+KSHIFTRQ kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w1 31 /r ib ] FUTURE
+KSHIFTRW kreg,kreg,imm8 [rmi: vex.l0.66.0f3a.w1 30 /r ib ] FUTURE
+KTESTB kreg,kreg [rm: vex.l0.66.0f.w0 99 /r ] FUTURE
+KTESTD kreg,kreg [rm: vex.l0.66.0f.w1 99 /r ] FUTURE
+KTESTQ kreg,kreg [rm: vex.l0.0f.w1 99 /r ] FUTURE
+KTESTW kreg,kreg [rm: vex.l0.0f.w0 99 /r ] FUTURE
+KUNPCKBW kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 4b /r ] FUTURE
+KUNPCKDQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 4b /r ] FUTURE
+KUNPCKWD kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 4b /r ] FUTURE
+KXNORB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 46 /r ] FUTURE
+KXNORD kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 46 /r ] FUTURE
+KXNORQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 46 /r ] FUTURE
+KXNORW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 46 /r ] FUTURE
+KXORB kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w0 47 /r ] FUTURE
+KXORD kreg,kreg,kreg [rvm: vex.nds.l1.66.0f.w1 47 /r ] FUTURE
+KXORQ kreg,kreg,kreg [rvm: vex.nds.l1.0f.w1 47 /r ] FUTURE
+KXORW kreg,kreg,kreg [rvm: vex.nds.l1.0f.w0 47 /r ] FUTURE
+
+;# AVX-512 instructions
+VADDPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 58 /r ] AVX512VL,AVX512,FUTURE
+VADDPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 58 /r ] AVX512VL,AVX512,FUTURE
+VADDPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f.w1 58 /r ] AVX512,FUTURE
+VADDPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VADDPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VADDPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|er [rvm:fv: evex.nds.512.0f.w0 58 /r ] AVX512,FUTURE
+VADDSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 58 /r ] AVX512,FUTURE
+VADDSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.f3.0f.w0 58 /r ] AVX512,FUTURE
+VALIGND xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 03 /r ib ] AVX512VL,AVX512,FUTURE
+VALIGND ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 03 /r ib ] AVX512VL,AVX512,FUTURE
+VALIGND zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 03 /r ib ] AVX512,FUTURE
+VALIGNQ xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 03 /r ib ] AVX512VL,AVX512,FUTURE
+VALIGNQ ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 03 /r ib ] AVX512VL,AVX512,FUTURE
+VALIGNQ zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 03 /r ib ] AVX512,FUTURE
+VANDNPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 55 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDNPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 55 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDNPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 55 /r ] AVX512DQ,FUTURE
+VANDNPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 55 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDNPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 55 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDNPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 55 /r ] AVX512DQ,FUTURE
+VANDPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 54 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 54 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 54 /r ] AVX512DQ,FUTURE
+VANDPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 54 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 54 /r ] AVX512VL,AVX512DQ,FUTURE
+VANDPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 54 /r ] AVX512DQ,FUTURE
+VBLENDMPD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 65 /r ] AVX512VL,AVX512,FUTURE
+VBLENDMPD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 65 /r ] AVX512VL,AVX512,FUTURE
+VBLENDMPD zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 65 /r ] AVX512,FUTURE
+VBLENDMPS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 65 /r ] AVX512VL,AVX512,FUTURE
+VBLENDMPS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 65 /r ] AVX512VL,AVX512,FUTURE
+VBLENDMPS zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 65 /r ] AVX512,FUTURE
+VBROADCASTF32X2 ymmreg|mask|z,xmmrm64 [rm:t2: evex.256.66.0f38.w0 19 /r ] AVX512VL,AVX512DQ,FUTURE
+VBROADCASTF32X2 zmmreg|mask|z,xmmrm64 [rm:t2: evex.512.66.0f38.w0 19 /r ] AVX512DQ,FUTURE
+VBROADCASTF32X4 ymmreg|mask|z,mem128 [rm:t4: evex.256.66.0f38.w0 1a /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTF32X4 zmmreg|mask|z,mem128 [rm:t4: evex.512.66.0f38.w0 1a /r ] AVX512,FUTURE
+VBROADCASTF32X8 zmmreg|mask|z,mem256 [rm:t8: evex.512.66.0f38.w0 1b /r ] AVX512DQ,FUTURE
+VBROADCASTF64X2 ymmreg|mask|z,mem128 [rm:t2: evex.256.66.0f38.w1 1a /r ] AVX512VL,AVX512DQ,FUTURE
+VBROADCASTF64X2 zmmreg|mask|z,mem128 [rm:t2: evex.512.66.0f38.w1 1a /r ] AVX512DQ,FUTURE
+VBROADCASTF64X4 zmmreg|mask|z,mem256 [rm:t4: evex.512.66.0f38.w1 1b /r ] AVX512,FUTURE
+VBROADCASTI32X2 xmmreg|mask|z,xmmrm64 [rm:t2: evex.128.66.0f38.w0 59 /r ] AVX512VL,AVX512DQ,FUTURE
+VBROADCASTI32X2 ymmreg|mask|z,xmmrm64 [rm:t2: evex.256.66.0f38.w0 59 /r ] AVX512VL,AVX512DQ,FUTURE
+VBROADCASTI32X2 zmmreg|mask|z,xmmrm64 [rm:t2: evex.512.66.0f38.w0 59 /r ] AVX512DQ,FUTURE
+VBROADCASTI32X4 ymmreg|mask|z,mem128 [rm:t4: evex.256.66.0f38.w0 5a /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTI32X4 zmmreg|mask|z,mem128 [rm:t4: evex.512.66.0f38.w0 5a /r ] AVX512,FUTURE
+VBROADCASTI32X8 zmmreg|mask|z,mem256 [rm:t8: evex.512.66.0f38.w0 5b /r ] AVX512DQ,FUTURE
+VBROADCASTI64X2 ymmreg|mask|z,mem128 [rm:t2: evex.256.66.0f38.w1 5a /r ] AVX512VL,AVX512DQ,FUTURE
+VBROADCASTI64X2 zmmreg|mask|z,mem128 [rm:t2: evex.512.66.0f38.w1 5a /r ] AVX512DQ,FUTURE
+VBROADCASTI64X4 zmmreg|mask|z,mem256 [rm:t4: evex.512.66.0f38.w1 5b /r ] AVX512,FUTURE
+VBROADCASTSD ymmreg|mask|z,mem64 [rm:t1s: evex.256.66.0f38.w1 19 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSD zmmreg|mask|z,mem64 [rm:t1s: evex.512.66.0f38.w1 19 /r ] AVX512,FUTURE
+VBROADCASTSD ymmreg|mask|z,xmmreg [rm: evex.256.66.0f38.w1 19 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSD zmmreg|mask|z,xmmreg [rm: evex.512.66.0f38.w1 19 /r ] AVX512,FUTURE
+VBROADCASTSS xmmreg|mask|z,mem32 [rm:t1s: evex.128.66.0f38.w0 18 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSS ymmreg|mask|z,mem32 [rm:t1s: evex.256.66.0f38.w0 18 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSS zmmreg|mask|z,mem32 [rm:t1s: evex.512.66.0f38.w0 18 /r ] AVX512,FUTURE
+VBROADCASTSS xmmreg|mask|z,xmmreg [rm: evex.128.66.0f38.w0 18 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSS ymmreg|mask|z,xmmreg [rm: evex.256.66.0f38.w0 18 /r ] AVX512VL,AVX512,FUTURE
+VBROADCASTSS zmmreg|mask|z,xmmreg [rm: evex.512.66.0f38.w0 18 /r ] AVX512,FUTURE
+VCMPPD kreg|mask,xmmreg,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f.w1 c2 /r ib ] AVX512VL,AVX512,FUTURE
+VCMPPD kreg|mask,ymmreg,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f.w1 c2 /r ib ] AVX512VL,AVX512,FUTURE
+VCMPPD kreg|mask,zmmreg,zmmrm512|b64|sae,imm8 [rvmi:fv: evex.nds.512.66.0f.w1 c2 /r ib ] AVX512,FUTURE
+VCMPPS kreg|mask,xmmreg,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.0f.w0 c2 /r ib ] AVX512VL,AVX512,FUTURE
+VCMPPS kreg|mask,ymmreg,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.0f.w0 c2 /r ib ] AVX512VL,AVX512,FUTURE
+VCMPPS kreg|mask,zmmreg,zmmrm512|b32|sae,imm8 [rvmi:fv: evex.nds.512.0f.w0 c2 /r ib ] AVX512,FUTURE
+VCMPSD kreg|mask,xmmreg,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.f2.0f.w1 c2 /r ib ] AVX512,FUTURE
+VCMPSS kreg|mask,xmmreg,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.f3.0f.w0 c2 /r ib ] AVX512,FUTURE
+VCOMISD xmmreg,xmmrm64|sae [rm:t1s: evex.128.66.0f.w1 2f /r ] AVX512,FUTURE
+VCOMISS xmmreg,xmmrm32|sae [rm:t1s: evex.128.0f.w0 2f /r ] AVX512,FUTURE
+VCOMPRESSPD mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w1 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPD mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w1 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPD mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w1 8a /r ] AVX512,FUTURE
+VCOMPRESSPD xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w1 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPD ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w1 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPD zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w1 8a /r ] AVX512,FUTURE
+VCOMPRESSPS mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w0 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPS mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w0 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPS mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w0 8a /r ] AVX512,FUTURE
+VCOMPRESSPS xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w0 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPS ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w0 8a /r ] AVX512VL,AVX512,FUTURE
+VCOMPRESSPS zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w0 8a /r ] AVX512,FUTURE
+VCVTDQ2PD xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.f3.0f.w0 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTDQ2PD ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.f3.0f.w0 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTDQ2PD zmmreg|mask|z,ymmrm256|b32|er [rm:hv: evex.512.f3.0f.w0 e6 /r ] AVX512,FUTURE
+VCVTDQ2PS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTDQ2PS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTDQ2PS zmmreg|mask|z,zmmrm512|b32|er [rm:fv: evex.512.0f.w0 5b /r ] AVX512,FUTURE
+VCVTPD2DQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.f2.0f.w1 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2DQ xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.f2.0f.w1 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2DQ ymmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.f2.0f.w1 e6 /r ] AVX512,FUTURE
+VCVTPD2PS xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 5a /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2PS xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 5a /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2PS ymmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.66.0f.w1 5a /r ] AVX512,FUTURE
+VCVTPD2QQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 7b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPD2QQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 7b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPD2QQ zmmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.66.0f.w1 7b /r ] AVX512DQ,FUTURE
+VCVTPD2UDQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.0f.w1 79 /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2UDQ xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.0f.w1 79 /r ] AVX512VL,AVX512,FUTURE
+VCVTPD2UDQ ymmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.0f.w1 79 /r ] AVX512,FUTURE
+VCVTPD2UQQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 79 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPD2UQQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 79 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPD2UQQ zmmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.66.0f.w1 79 /r ] AVX512DQ,FUTURE
+VCVTPH2PS xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VCVTPH2PS ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VCVTPH2PS zmmreg|mask|z,ymmrm256|sae [rm:hvm: evex.512.66.0f38.w0 13 /r ] AVX512,FUTURE
+VCVTPS2DQ xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2DQ ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2DQ zmmreg|mask|z,zmmrm512|b32|er [rm:fv: evex.512.66.0f.w0 5b /r ] AVX512,FUTURE
+VCVTPS2PD xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.0f.w0 5a /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2PD ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.0f.w0 5a /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2PD zmmreg|mask|z,ymmrm256|b32|sae [rm:hv: evex.512.0f.w0 5a /r ] AVX512,FUTURE
+VCVTPS2PH xmmreg|mask|z,xmmreg,imm8 [mri:hvm: evex.128.66.0f3a.w0 1d /r ib ] AVX512VL,AVX512,FUTURE
+VCVTPS2PH xmmreg|mask|z,ymmreg,imm8 [mri:hvm: evex.256.66.0f3a.w0 1d /r ib ] AVX512VL,AVX512,FUTURE
+VCVTPS2PH ymmreg|mask|z,zmmreg|sae,imm8 [mri:hvm: evex.512.66.0f3a.w0 1d /r ib ] AVX512,FUTURE
+VCVTPS2PH mem64|mask,xmmreg,imm8 [mri:hvm: evex.128.66.0f3a.w0 1d /r ib ] AVX512VL,AVX512,FUTURE
+VCVTPS2PH mem128|mask,ymmreg,imm8 [mri:hvm: evex.256.66.0f3a.w0 1d /r ib ] AVX512VL,AVX512,FUTURE
+VCVTPS2PH mem256|mask,zmmreg|sae,imm8 [mri:hvm: evex.512.66.0f3a.w0 1d /r ib ] AVX512,FUTURE
+VCVTPS2QQ xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.66.0f.w0 7b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPS2QQ ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.66.0f.w0 7b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPS2QQ zmmreg|mask|z,ymmrm256|b32|er [rm:hv: evex.512.66.0f.w0 7b /r ] AVX512DQ,FUTURE
+VCVTPS2UDQ xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.0f.w0 79 /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2UDQ ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.0f.w0 79 /r ] AVX512VL,AVX512,FUTURE
+VCVTPS2UDQ zmmreg|mask|z,zmmrm512|b32|er [rm:fv: evex.512.0f.w0 79 /r ] AVX512,FUTURE
+VCVTPS2UQQ xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.66.0f.w0 79 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPS2UQQ ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.66.0f.w0 79 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTPS2UQQ zmmreg|mask|z,ymmrm256|b32|er [rm:hv: evex.512.66.0f.w0 79 /r ] AVX512DQ,FUTURE
+VCVTQQ2PD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.f3.0f.w1 e6 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTQQ2PD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.f3.0f.w1 e6 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTQQ2PD zmmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.f3.0f.w1 e6 /r ] AVX512DQ,FUTURE
+VCVTQQ2PS xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.0f.w1 5b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTQQ2PS xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.0f.w1 5b /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTQQ2PS ymmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.0f.w1 5b /r ] AVX512DQ,FUTURE
+VCVTSD2SI reg32,xmmrm64|er [rm:t1f64: evex.128.f2.0f.w0 2d /r ] AVX512,FUTURE
+VCVTSD2SI reg64,xmmrm64|er [rm:t1f64: evex.128.f2.0f.w1 2d /r ] AVX512,FUTURE
+VCVTSD2SS xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 5a /r ] AVX512,FUTURE
+VCVTSD2USI reg32,xmmrm64|er [rm:t1f64: evex.128.f2.0f.w0 79 /r ] AVX512,FUTURE
+VCVTSD2USI reg64,xmmrm64|er [rm:t1f64: evex.128.f2.0f.w1 79 /r ] AVX512,FUTURE
+VCVTSI2SD xmmreg,xmmreg|er,rm32 [rvm:t1s: evex.nds.128.f2.0f.w0 2a /r ] AVX512,FUTURE
+VCVTSI2SD xmmreg,xmmreg|er,rm64 [rvm:t1s: evex.nds.128.f2.0f.w1 2a /r ] AVX512,FUTURE
+VCVTSI2SS xmmreg,xmmreg|er,rm32 [rvm:t1s: evex.nds.128.f3.0f.w0 2a /r ] AVX512,FUTURE
+VCVTSI2SS xmmreg,xmmreg|er,rm64 [rvm:t1s: evex.nds.128.f3.0f.w1 2a /r ] AVX512,FUTURE
+VCVTSS2SD xmmreg|mask|z,xmmreg,xmmrm32|sae [rvm:t1s: evex.nds.128.f3.0f.w0 5a /r ] AVX512,FUTURE
+VCVTSS2SI reg32,xmmrm32|er [rm:t1f32: evex.128.f3.0f.w0 2d /r ] AVX512,FUTURE
+VCVTSS2SI reg64,xmmrm32|er [rm:t1f32: evex.128.f3.0f.w1 2d /r ] AVX512,FUTURE
+VCVTSS2USI reg32,xmmrm32|er [rm:t1f32: evex.128.f3.0f.w0 79 /r ] AVX512,FUTURE
+VCVTSS2USI reg64,xmmrm32|er [rm:t1f32: evex.128.f3.0f.w1 79 /r ] AVX512,FUTURE
+VCVTTPD2DQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPD2DQ xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 e6 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPD2DQ ymmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f.w1 e6 /r ] AVX512,FUTURE
+VCVTTPD2QQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPD2QQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPD2QQ zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f.w1 7a /r ] AVX512DQ,FUTURE
+VCVTTPD2UDQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.0f.w1 78 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPD2UDQ xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.0f.w1 78 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPD2UDQ ymmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.0f.w1 78 /r ] AVX512,FUTURE
+VCVTTPD2UQQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 78 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPD2UQQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 78 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPD2UQQ zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f.w1 78 /r ] AVX512DQ,FUTURE
+VCVTTPS2DQ xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.f3.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTTPS2DQ ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.f3.0f.w0 5b /r ] AVX512VL,AVX512,FUTURE
+VCVTTPS2DQ zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.f3.0f.w0 5b /r ] AVX512,FUTURE
+VCVTTPS2QQ xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.66.0f.w0 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPS2QQ ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.66.0f.w0 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPS2QQ zmmreg|mask|z,ymmrm256|b32|sae [rm:hv: evex.512.66.0f.w0 7a /r ] AVX512DQ,FUTURE
+VCVTTPS2UDQ xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.0f.w0 78 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPS2UDQ ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.0f.w0 78 /r ] AVX512VL,AVX512,FUTURE
+VCVTTPS2UDQ zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.0f.w0 78 /r ] AVX512,FUTURE
+VCVTTPS2UQQ xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.66.0f.w0 78 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPS2UQQ ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.66.0f.w0 78 /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTTPS2UQQ zmmreg|mask|z,ymmrm256|b32|sae [rm:hv: evex.512.66.0f.w0 78 /r ] AVX512DQ,FUTURE
+VCVTTSD2SI reg32,xmmrm64|sae [rm:t1f64: evex.128.f2.0f.w0 2c /r ] AVX512,FUTURE
+VCVTTSD2SI reg64,xmmrm64|sae [rm:t1f64: evex.128.f2.0f.w1 2c /r ] AVX512,FUTURE
+VCVTTSD2USI reg32,xmmrm64|sae [rm:t1f64: evex.128.f2.0f.w0 78 /r ] AVX512,FUTURE
+VCVTTSD2USI reg64,xmmrm64|sae [rm:t1f64: evex.128.f2.0f.w1 78 /r ] AVX512,FUTURE
+VCVTTSS2SI reg32,xmmrm32|sae [rm:t1f32: evex.128.f3.0f.w0 2c /r ] AVX512,FUTURE
+VCVTTSS2SI reg64,xmmrm32|sae [rm:t1f32: evex.128.f3.0f.w1 2c /r ] AVX512,FUTURE
+VCVTTSS2USI reg32,xmmrm32|sae [rm:t1f32: evex.128.f3.0f.w0 78 /r ] AVX512,FUTURE
+VCVTTSS2USI reg64,xmmrm32|sae [rm:t1f32: evex.128.f3.0f.w1 78 /r ] AVX512,FUTURE
+VCVTUDQ2PD xmmreg|mask|z,xmmrm64|b32 [rm:hv: evex.128.f3.0f.w0 7a /r ] AVX512VL,AVX512,FUTURE
+VCVTUDQ2PD ymmreg|mask|z,xmmrm128|b32 [rm:hv: evex.256.f3.0f.w0 7a /r ] AVX512VL,AVX512,FUTURE
+VCVTUDQ2PD zmmreg|mask|z,ymmrm256|b32|er [rm:hv: evex.512.f3.0f.w0 7a /r ] AVX512,FUTURE
+VCVTUDQ2PS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.f2.0f.w0 7a /r ] AVX512VL,AVX512,FUTURE
+VCVTUDQ2PS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.f2.0f.w0 7a /r ] AVX512VL,AVX512,FUTURE
+VCVTUDQ2PS zmmreg|mask|z,zmmrm512|b32|er [rm:fv: evex.512.f2.0f.w0 7a /r ] AVX512,FUTURE
+VCVTUQQ2PD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.f3.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTUQQ2PD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.f3.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTUQQ2PD zmmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.f3.0f.w1 7a /r ] AVX512DQ,FUTURE
+VCVTUQQ2PS xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.f2.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTUQQ2PS xmmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.f2.0f.w1 7a /r ] AVX512VL,AVX512DQ,FUTURE
+VCVTUQQ2PS ymmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.f2.0f.w1 7a /r ] AVX512DQ,FUTURE
+VCVTUSI2SD xmmreg,xmmreg|er,rm32 [rvm:t1s: evex.nds.128.f2.0f.w0 7b /r ] AVX512,FUTURE
+VCVTUSI2SD xmmreg,xmmreg|er,rm64 [rvm:t1s: evex.nds.128.f2.0f.w1 7b /r ] AVX512,FUTURE
+VCVTUSI2SS xmmreg,xmmreg|er,rm32 [rvm:t1s: evex.nds.128.f3.0f.w0 7b /r ] AVX512,FUTURE
+VCVTUSI2SS xmmreg,xmmreg|er,rm64 [rvm:t1s: evex.nds.128.f3.0f.w1 7b /r ] AVX512,FUTURE
+VDBPSADBW xmmreg|mask|z,xmmreg*,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w0 42 /r ib ] AVX512VL,AVX512BW,FUTURE
+VDBPSADBW ymmreg|mask|z,ymmreg*,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w0 42 /r ib ] AVX512VL,AVX512BW,FUTURE
+VDBPSADBW zmmreg|mask|z,zmmreg*,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w0 42 /r ib ] AVX512BW,FUTURE
+VDIVPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 5e /r ] AVX512VL,AVX512,FUTURE
+VDIVPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 5e /r ] AVX512VL,AVX512,FUTURE
+VDIVPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f.w1 5e /r ] AVX512,FUTURE
+VDIVPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 5e /r ] AVX512VL,AVX512,FUTURE
+VDIVPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 5e /r ] AVX512VL,AVX512,FUTURE
+VDIVPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|er [rvm:fv: evex.nds.512.0f.w0 5e /r ] AVX512,FUTURE
+VDIVSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 5e /r ] AVX512,FUTURE
+VDIVSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.f3.0f.w0 5e /r ] AVX512,FUTURE
+VEXP2PD zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f38.w1 c8 /r ] AVX512ER,FUTURE
+VEXP2PS zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.66.0f38.w0 c8 /r ] AVX512ER,FUTURE
+VEXPANDPD xmmreg|mask|z,mem128 [rm:t1s: evex.128.66.0f38.w1 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPD ymmreg|mask|z,mem256 [rm:t1s: evex.256.66.0f38.w1 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPD zmmreg|mask|z,mem512 [rm:t1s: evex.512.66.0f38.w1 88 /r ] AVX512,FUTURE
+VEXPANDPD xmmreg|mask|z,xmmreg [rm:t1s: evex.128.66.0f38.w1 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPD ymmreg|mask|z,ymmreg [rm:t1s: evex.256.66.0f38.w1 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPD zmmreg|mask|z,zmmreg [rm:t1s: evex.512.66.0f38.w1 88 /r ] AVX512,FUTURE
+VEXPANDPS xmmreg|mask|z,mem128 [rm:t1s: evex.128.66.0f38.w0 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPS ymmreg|mask|z,mem256 [rm:t1s: evex.256.66.0f38.w0 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPS zmmreg|mask|z,mem512 [rm:t1s: evex.512.66.0f38.w0 88 /r ] AVX512,FUTURE
+VEXPANDPS xmmreg|mask|z,xmmreg [rm:t1s: evex.128.66.0f38.w0 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPS ymmreg|mask|z,ymmreg [rm:t1s: evex.256.66.0f38.w0 88 /r ] AVX512VL,AVX512,FUTURE
+VEXPANDPS zmmreg|mask|z,zmmreg [rm:t1s: evex.512.66.0f38.w0 88 /r ] AVX512,FUTURE
+VEXTRACTF32X4 xmmreg|mask|z,ymmreg,imm8 [mri: evex.256.66.0f3a.w0 19 /r ib ] AVX512VL,AVX512,FUTURE
+VEXTRACTF32X4 xmmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w0 19 /r ib ] AVX512,FUTURE
+VEXTRACTF32X4 mem128|mask,ymmreg,imm8 [mri:t4: evex.256.66.0f3a.w0 19 /r ib ] AVX512VL,AVX512,FUTURE
+VEXTRACTF32X4 mem128|mask,zmmreg,imm8 [mri:t4: evex.512.66.0f3a.w0 19 /r ib ] AVX512,FUTURE
+VEXTRACTF32X8 ymmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w0 1b /r ib ] AVX512DQ,FUTURE
+VEXTRACTF32X8 mem256|mask,zmmreg,imm8 [mri:t8: evex.512.66.0f3a.w0 1b /r ib ] AVX512DQ,FUTURE
+VEXTRACTF64X2 xmmreg|mask|z,ymmreg,imm8 [mri: evex.256.66.0f3a.w1 19 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VEXTRACTF64X2 xmmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w1 19 /r ib ] AVX512DQ,FUTURE
+VEXTRACTF64X2 mem128|mask,ymmreg,imm8 [mri:t2: evex.256.66.0f3a.w1 19 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VEXTRACTF64X2 mem128|mask,zmmreg,imm8 [mri:t2: evex.512.66.0f3a.w1 19 /r ib ] AVX512DQ,FUTURE
+VEXTRACTF64X4 ymmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w1 1b /r ib ] AVX512,FUTURE
+VEXTRACTF64X4 mem256|mask,zmmreg,imm8 [mri:t4: evex.512.66.0f3a.w1 1b /r ib ] AVX512,FUTURE
+VEXTRACTI32X4 xmmreg|mask|z,ymmreg,imm8 [mri: evex.256.66.0f3a.w0 39 /r ib ] AVX512VL,AVX512,FUTURE
+VEXTRACTI32X4 xmmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w0 39 /r ib ] AVX512,FUTURE
+VEXTRACTI32X4 mem128|mask,ymmreg,imm8 [mri:t4: evex.256.66.0f3a.w0 39 /r ib ] AVX512VL,AVX512,FUTURE
+VEXTRACTI32X4 mem128|mask,zmmreg,imm8 [mri:t4: evex.512.66.0f3a.w0 39 /r ib ] AVX512,FUTURE
+VEXTRACTI32X8 ymmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w0 3b /r ib ] AVX512DQ,FUTURE
+VEXTRACTI32X8 mem256|mask,zmmreg,imm8 [mri:t8: evex.512.66.0f3a.w0 3b /r ib ] AVX512DQ,FUTURE
+VEXTRACTI64X2 xmmreg|mask|z,ymmreg,imm8 [mri: evex.256.66.0f3a.w1 39 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VEXTRACTI64X2 xmmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w1 39 /r ib ] AVX512DQ,FUTURE
+VEXTRACTI64X2 mem128|mask,ymmreg,imm8 [mri:t2: evex.256.66.0f3a.w1 39 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VEXTRACTI64X2 mem128|mask,zmmreg,imm8 [mri:t2: evex.512.66.0f3a.w1 39 /r ib ] AVX512DQ,FUTURE
+VEXTRACTI64X4 ymmreg|mask|z,zmmreg,imm8 [mri: evex.512.66.0f3a.w1 3b /r ib ] AVX512,FUTURE
+VEXTRACTI64X4 mem256|mask,zmmreg,imm8 [mri:t4: evex.512.66.0f3a.w1 3b /r ib ] AVX512,FUTURE
+VEXTRACTPS reg32,xmmreg,imm8 [mri:t1s: evex.128.66.0f3a.wig 17 /r ib ] AVX512,FUTURE
+VEXTRACTPS reg64,xmmreg,imm8 [mri:t1s: evex.128.66.0f3a.wig 17 /r ib ] AVX512,FUTURE
+VEXTRACTPS mem32,xmmreg,imm8 [mri:t1s: evex.128.66.0f3a.wig 17 /r ib ] AVX512,FUTURE
+VFIXUPIMMPD xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 54 /r ib ] AVX512VL,AVX512,FUTURE
+VFIXUPIMMPD ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 54 /r ib ] AVX512VL,AVX512,FUTURE
+VFIXUPIMMPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|sae,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 54 /r ib ] AVX512,FUTURE
+VFIXUPIMMPS xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 54 /r ib ] AVX512VL,AVX512,FUTURE
+VFIXUPIMMPS ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 54 /r ib ] AVX512VL,AVX512,FUTURE
+VFIXUPIMMPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|sae,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 54 /r ib ] AVX512,FUTURE
+VFIXUPIMMSD xmmreg|mask|z,xmmreg*,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 55 /r ib ] AVX512,FUTURE
+VFIXUPIMMSS xmmreg|mask|z,xmmreg*,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 55 /r ib ] AVX512,FUTURE
+VFMADD132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 98 /r ] AVX512VL,AVX512,FUTURE
+VFMADD132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 98 /r ] AVX512VL,AVX512,FUTURE
+VFMADD132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 98 /r ] AVX512,FUTURE
+VFMADD132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 98 /r ] AVX512VL,AVX512,FUTURE
+VFMADD132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 98 /r ] AVX512VL,AVX512,FUTURE
+VFMADD132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 98 /r ] AVX512,FUTURE
+VFMADD132SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 99 /r ] AVX512,FUTURE
+VFMADD132SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 99 /r ] AVX512,FUTURE
+VFMADD213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 a8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 a8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 a8 /r ] AVX512,FUTURE
+VFMADD213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 a8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 a8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 a8 /r ] AVX512,FUTURE
+VFMADD213SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 a9 /r ] AVX512,FUTURE
+VFMADD213SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 a9 /r ] AVX512,FUTURE
+VFMADD231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 b8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 b8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 b8 /r ] AVX512,FUTURE
+VFMADD231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 b8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 b8 /r ] AVX512VL,AVX512,FUTURE
+VFMADD231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 b8 /r ] AVX512,FUTURE
+VFMADD231SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 b9 /r ] AVX512,FUTURE
+VFMADD231SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 b9 /r ] AVX512,FUTURE
+VFMADDSUB132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 96 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 96 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 96 /r ] AVX512,FUTURE
+VFMADDSUB132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 96 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 96 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 96 /r ] AVX512,FUTURE
+VFMADDSUB213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 a6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 a6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 a6 /r ] AVX512,FUTURE
+VFMADDSUB213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 a6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 a6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 a6 /r ] AVX512,FUTURE
+VFMADDSUB231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 b6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 b6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 b6 /r ] AVX512,FUTURE
+VFMADDSUB231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 b6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 b6 /r ] AVX512VL,AVX512,FUTURE
+VFMADDSUB231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 b6 /r ] AVX512,FUTURE
+VFMSUB132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 9a /r ] AVX512VL,AVX512,FUTURE
+VFMSUB132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 9a /r ] AVX512VL,AVX512,FUTURE
+VFMSUB132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 9a /r ] AVX512,FUTURE
+VFMSUB132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 9a /r ] AVX512VL,AVX512,FUTURE
+VFMSUB132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 9a /r ] AVX512VL,AVX512,FUTURE
+VFMSUB132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 9a /r ] AVX512,FUTURE
+VFMSUB132SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 9b /r ] AVX512,FUTURE
+VFMSUB132SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 9b /r ] AVX512,FUTURE
+VFMSUB213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 aa /r ] AVX512VL,AVX512,FUTURE
+VFMSUB213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 aa /r ] AVX512VL,AVX512,FUTURE
+VFMSUB213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 aa /r ] AVX512,FUTURE
+VFMSUB213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 aa /r ] AVX512VL,AVX512,FUTURE
+VFMSUB213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 aa /r ] AVX512VL,AVX512,FUTURE
+VFMSUB213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 aa /r ] AVX512,FUTURE
+VFMSUB213SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 ab /r ] AVX512,FUTURE
+VFMSUB213SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 ab /r ] AVX512,FUTURE
+VFMSUB231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 ba /r ] AVX512VL,AVX512,FUTURE
+VFMSUB231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 ba /r ] AVX512VL,AVX512,FUTURE
+VFMSUB231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 ba /r ] AVX512,FUTURE
+VFMSUB231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 ba /r ] AVX512VL,AVX512,FUTURE
+VFMSUB231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 ba /r ] AVX512VL,AVX512,FUTURE
+VFMSUB231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 ba /r ] AVX512,FUTURE
+VFMSUB231SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 bb /r ] AVX512,FUTURE
+VFMSUB231SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 bb /r ] AVX512,FUTURE
+VFMSUBADD132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 97 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 97 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 97 /r ] AVX512,FUTURE
+VFMSUBADD132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 97 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 97 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 97 /r ] AVX512,FUTURE
+VFMSUBADD213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 a7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 a7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 a7 /r ] AVX512,FUTURE
+VFMSUBADD213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 a7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 a7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 a7 /r ] AVX512,FUTURE
+VFMSUBADD231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 b7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 b7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 b7 /r ] AVX512,FUTURE
+VFMSUBADD231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 b7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 b7 /r ] AVX512VL,AVX512,FUTURE
+VFMSUBADD231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 b7 /r ] AVX512,FUTURE
+VFNMADD132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 9c /r ] AVX512VL,AVX512,FUTURE
+VFNMADD132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 9c /r ] AVX512VL,AVX512,FUTURE
+VFNMADD132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 9c /r ] AVX512,FUTURE
+VFNMADD132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 9c /r ] AVX512VL,AVX512,FUTURE
+VFNMADD132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 9c /r ] AVX512VL,AVX512,FUTURE
+VFNMADD132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 9c /r ] AVX512,FUTURE
+VFNMADD132SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 9d /r ] AVX512,FUTURE
+VFNMADD132SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 9d /r ] AVX512,FUTURE
+VFNMADD213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 ac /r ] AVX512VL,AVX512,FUTURE
+VFNMADD213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 ac /r ] AVX512VL,AVX512,FUTURE
+VFNMADD213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 ac /r ] AVX512,FUTURE
+VFNMADD213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 ac /r ] AVX512VL,AVX512,FUTURE
+VFNMADD213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 ac /r ] AVX512VL,AVX512,FUTURE
+VFNMADD213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 ac /r ] AVX512,FUTURE
+VFNMADD213SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 ad /r ] AVX512,FUTURE
+VFNMADD213SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 ad /r ] AVX512,FUTURE
+VFNMADD231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 bc /r ] AVX512VL,AVX512,FUTURE
+VFNMADD231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 bc /r ] AVX512VL,AVX512,FUTURE
+VFNMADD231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 bc /r ] AVX512,FUTURE
+VFNMADD231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 bc /r ] AVX512VL,AVX512,FUTURE
+VFNMADD231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 bc /r ] AVX512VL,AVX512,FUTURE
+VFNMADD231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 bc /r ] AVX512,FUTURE
+VFNMADD231SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 bd /r ] AVX512,FUTURE
+VFNMADD231SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 bd /r ] AVX512,FUTURE
+VFNMSUB132PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 9e /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB132PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 9e /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB132PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 9e /r ] AVX512,FUTURE
+VFNMSUB132PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 9e /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB132PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 9e /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB132PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 9e /r ] AVX512,FUTURE
+VFNMSUB132SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 9f /r ] AVX512,FUTURE
+VFNMSUB132SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 9f /r ] AVX512,FUTURE
+VFNMSUB213PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 ae /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB213PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 ae /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB213PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 ae /r ] AVX512,FUTURE
+VFNMSUB213PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 ae /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB213PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 ae /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB213PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 ae /r ] AVX512,FUTURE
+VFNMSUB213SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 af /r ] AVX512,FUTURE
+VFNMSUB213SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 af /r ] AVX512,FUTURE
+VFNMSUB231PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 be /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB231PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 be /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB231PD zmmreg|mask|z,zmmreg,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 be /r ] AVX512,FUTURE
+VFNMSUB231PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 be /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB231PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 be /r ] AVX512VL,AVX512,FUTURE
+VFNMSUB231PS zmmreg|mask|z,zmmreg,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 be /r ] AVX512,FUTURE
+VFNMSUB231SD xmmreg|mask|z,xmmreg,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 bf /r ] AVX512,FUTURE
+VFNMSUB231SS xmmreg|mask|z,xmmreg,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 bf /r ] AVX512,FUTURE
+VFPCLASSPD kreg|mask,xmmrm128|b64,imm8 [rmi:fv: evex.128.66.0f3a.w1 66 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VFPCLASSPD kreg|mask,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 66 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VFPCLASSPD kreg|mask,zmmrm512|b64,imm8 [rmi:fv: evex.512.66.0f3a.w1 66 /r ib ] AVX512DQ,FUTURE
+VFPCLASSPS kreg|mask,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f3a.w0 66 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VFPCLASSPS kreg|mask,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f3a.w0 66 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VFPCLASSPS kreg|mask,zmmrm512|b32,imm8 [rmi:fv: evex.512.66.0f3a.w0 66 /r ib ] AVX512DQ,FUTURE
+VFPCLASSSD kreg|mask,xmmrm64,imm8 [rmi:t1s: evex.128.66.0f3a.w1 67 /r ib ] AVX512DQ,FUTURE
+VFPCLASSSS kreg|mask,xmmrm32,imm8 [rmi:t1s: evex.128.66.0f3a.w0 67 /r ib ] AVX512DQ,FUTURE
+VGATHERDPD xmmreg|mask,xmem64 [rm:t1s: vsibx evex.128.66.0f38.w1 92 /r ] AVX512VL,AVX512,FUTURE
+VGATHERDPD ymmreg|mask,xmem64 [rm:t1s: vsibx evex.256.66.0f38.w1 92 /r ] AVX512VL,AVX512,FUTURE
+VGATHERDPD zmmreg|mask,ymem64 [rm:t1s: vsiby evex.512.66.0f38.w1 92 /r ] AVX512,FUTURE
+VGATHERDPS xmmreg|mask,xmem32 [rm:t1s: vsibx evex.128.66.0f38.w0 92 /r ] AVX512VL,AVX512,FUTURE
+VGATHERDPS ymmreg|mask,ymem32 [rm:t1s: vsiby evex.256.66.0f38.w0 92 /r ] AVX512VL,AVX512,FUTURE
+VGATHERDPS zmmreg|mask,zmem32 [rm:t1s: vsibz evex.512.66.0f38.w0 92 /r ] AVX512,FUTURE
+VGATHERPF0DPD ymem64|mask [m:t1s: vsiby evex.512.66.0f38.w1 c6 /1 ] AVX512PF,FUTURE
+VGATHERPF0DPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c6 /1 ] AVX512PF,FUTURE
+VGATHERPF0QPD zmem64|mask [m:t1s: vsibz evex.512.66.0f38.w1 c7 /1 ] AVX512PF,FUTURE
+VGATHERPF0QPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c7 /1 ] AVX512PF,FUTURE
+VGATHERPF1DPD ymem64|mask [m:t1s: vsiby evex.512.66.0f38.w1 c6 /2 ] AVX512PF,FUTURE
+VGATHERPF1DPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c6 /2 ] AVX512PF,FUTURE
+VGATHERPF1QPD zmem64|mask [m:t1s: vsibz evex.512.66.0f38.w1 c7 /2 ] AVX512PF,FUTURE
+VGATHERPF1QPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c7 /2 ] AVX512PF,FUTURE
+VGATHERQPD xmmreg|mask,xmem64 [rm:t1s: vsibx evex.128.66.0f38.w1 93 /r ] AVX512VL,AVX512,FUTURE
+VGATHERQPD ymmreg|mask,ymem64 [rm:t1s: vsiby evex.256.66.0f38.w1 93 /r ] AVX512VL,AVX512,FUTURE
+VGATHERQPD zmmreg|mask,zmem64 [rm:t1s: vsibz evex.512.66.0f38.w1 93 /r ] AVX512,FUTURE
+VGATHERQPS xmmreg|mask,xmem32 [rm:t1s: vsibx evex.128.66.0f38.w0 93 /r ] AVX512VL,AVX512,FUTURE
+VGATHERQPS xmmreg|mask,ymem32 [rm:t1s: vsiby evex.256.66.0f38.w0 93 /r ] AVX512VL,AVX512,FUTURE
+VGATHERQPS ymmreg|mask,zmem32 [rm:t1s: vsibz evex.512.66.0f38.w0 93 /r ] AVX512,FUTURE
+VGETEXPPD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 42 /r ] AVX512VL,AVX512,FUTURE
+VGETEXPPD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 42 /r ] AVX512VL,AVX512,FUTURE
+VGETEXPPD zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f38.w1 42 /r ] AVX512,FUTURE
+VGETEXPPS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 42 /r ] AVX512VL,AVX512,FUTURE
+VGETEXPPS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 42 /r ] AVX512VL,AVX512,FUTURE
+VGETEXPPS zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.66.0f38.w0 42 /r ] AVX512,FUTURE
+VGETEXPSD xmmreg|mask|z,xmmreg,xmmrm64|sae [rvm:t1s: evex.nds.128.66.0f38.w1 43 /r ] AVX512,FUTURE
+VGETEXPSS xmmreg|mask|z,xmmreg,xmmrm32|sae [rvm:t1s: evex.nds.128.66.0f38.w0 43 /r ] AVX512,FUTURE
+VGETMANTPD xmmreg|mask|z,xmmrm128|b64,imm8 [rmi:fv: evex.128.66.0f3a.w1 26 /r ib ] AVX512VL,AVX512,FUTURE
+VGETMANTPD ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 26 /r ib ] AVX512VL,AVX512,FUTURE
+VGETMANTPD zmmreg|mask|z,zmmrm512|b64|sae,imm8 [rmi:fv: evex.512.66.0f3a.w1 26 /r ib ] AVX512,FUTURE
+VGETMANTPS xmmreg|mask|z,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f3a.w0 26 /r ib ] AVX512VL,AVX512,FUTURE
+VGETMANTPS ymmreg|mask|z,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f3a.w0 26 /r ib ] AVX512VL,AVX512,FUTURE
+VGETMANTPS zmmreg|mask|z,zmmrm512|b32|sae,imm8 [rmi:fv: evex.512.66.0f3a.w0 26 /r ib ] AVX512,FUTURE
+VGETMANTSD xmmreg|mask|z,xmmreg,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 27 /r ib ] AVX512,FUTURE
+VGETMANTSS xmmreg|mask|z,xmmreg,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 27 /r ib ] AVX512,FUTURE
+VINSERTF32X4 ymmreg|mask|z,ymmreg*,xmmrm128,imm8 [rvmi:t4: evex.nds.256.66.0f3a.w0 18 /r ib ] AVX512VL,AVX512,FUTURE
+VINSERTF32X4 zmmreg|mask|z,zmmreg*,xmmrm128,imm8 [rvmi:t4: evex.nds.512.66.0f3a.w0 18 /r ib ] AVX512,FUTURE
+VINSERTF32X8 zmmreg|mask|z,zmmreg*,ymmrm256,imm8 [rvmi:t8: evex.nds.512.66.0f3a.w0 1a /r ib ] AVX512DQ,FUTURE
+VINSERTF64X2 ymmreg|mask|z,ymmreg*,xmmrm128,imm8 [rvmi:t2: evex.nds.256.66.0f3a.w1 18 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VINSERTF64X2 zmmreg|mask|z,zmmreg*,xmmrm128,imm8 [rvmi:t2: evex.nds.512.66.0f3a.w1 18 /r ib ] AVX512DQ,FUTURE
+VINSERTF64X4 zmmreg|mask|z,zmmreg*,ymmrm256,imm8 [rvmi:t4: evex.nds.512.66.0f3a.w1 1a /r ib ] AVX512,FUTURE
+VINSERTI32X4 ymmreg|mask|z,ymmreg*,xmmrm128,imm8 [rvmi:t4: evex.nds.256.66.0f3a.w0 38 /r ib ] AVX512VL,AVX512,FUTURE
+VINSERTI32X4 zmmreg|mask|z,zmmreg*,xmmrm128,imm8 [rvmi:t4: evex.nds.512.66.0f3a.w0 38 /r ib ] AVX512,FUTURE
+VINSERTI32X8 zmmreg|mask|z,zmmreg*,ymmrm256,imm8 [rvmi:t8: evex.nds.512.66.0f3a.w0 3a /r ib ] AVX512DQ,FUTURE
+VINSERTI64X2 ymmreg|mask|z,ymmreg*,xmmrm128,imm8 [rvmi:t2: evex.nds.256.66.0f3a.w1 38 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VINSERTI64X2 zmmreg|mask|z,zmmreg*,xmmrm128,imm8 [rvmi:t2: evex.nds.512.66.0f3a.w1 38 /r ib ] AVX512DQ,FUTURE
+VINSERTI64X4 zmmreg|mask|z,zmmreg*,ymmrm256,imm8 [rvmi:t4: evex.nds.512.66.0f3a.w1 3a /r ib ] AVX512,FUTURE
+VINSERTPS xmmreg,xmmreg*,xmmrm32,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 21 /r ib ] AVX512,FUTURE
+VMAXPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 5f /r ] AVX512VL,AVX512,FUTURE
+VMAXPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 5f /r ] AVX512VL,AVX512,FUTURE
+VMAXPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|sae [rvm:fv: evex.nds.512.66.0f.w1 5f /r ] AVX512,FUTURE
+VMAXPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 5f /r ] AVX512VL,AVX512,FUTURE
+VMAXPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 5f /r ] AVX512VL,AVX512,FUTURE
+VMAXPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|sae [rvm:fv: evex.nds.512.0f.w0 5f /r ] AVX512,FUTURE
+VMAXSD xmmreg|mask|z,xmmreg*,xmmrm64|sae [rvm:t1s: evex.nds.128.f2.0f.w1 5f /r ] AVX512,FUTURE
+VMAXSS xmmreg|mask|z,xmmreg*,xmmrm32|sae [rvm:t1s: evex.nds.128.f3.0f.w0 5f /r ] AVX512,FUTURE
+VMINPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 5d /r ] AVX512VL,AVX512,FUTURE
+VMINPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 5d /r ] AVX512VL,AVX512,FUTURE
+VMINPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|sae [rvm:fv: evex.nds.512.66.0f.w1 5d /r ] AVX512,FUTURE
+VMINPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 5d /r ] AVX512VL,AVX512,FUTURE
+VMINPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 5d /r ] AVX512VL,AVX512,FUTURE
+VMINPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|sae [rvm:fv: evex.nds.512.0f.w0 5d /r ] AVX512,FUTURE
+VMINSD xmmreg|mask|z,xmmreg*,xmmrm64|sae [rvm:t1s: evex.nds.128.f2.0f.w1 5d /r ] AVX512,FUTURE
+VMINSS xmmreg|mask|z,xmmreg*,xmmrm32|sae [rvm:t1s: evex.nds.128.f3.0f.w0 5d /r ] AVX512,FUTURE
+VMOVAPD xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f.w1 28 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f.w1 28 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f.w1 28 /r ] AVX512,FUTURE
+VMOVAPD xmmreg|mask|z,xmmreg [mr: evex.128.66.0f.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD ymmreg|mask|z,ymmreg [mr: evex.256.66.0f.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD zmmreg|mask|z,zmmreg [mr: evex.512.66.0f.w1 29 /r ] AVX512,FUTURE
+VMOVAPD mem128|mask,xmmreg [mr:fvm: evex.128.66.0f.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD mem256|mask,ymmreg [mr:fvm: evex.256.66.0f.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPD mem512|mask,zmmreg [mr:fvm: evex.512.66.0f.w1 29 /r ] AVX512,FUTURE
+VMOVAPS xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.0f.w0 28 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.0f.w0 28 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.0f.w0 28 /r ] AVX512,FUTURE
+VMOVAPS xmmreg|mask|z,xmmreg [mr: evex.128.0f.w0 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS ymmreg|mask|z,ymmreg [mr: evex.256.0f.w0 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS zmmreg|mask|z,zmmreg [mr: evex.512.0f.w0 29 /r ] AVX512,FUTURE
+VMOVAPS mem128|mask,xmmreg [mr:fvm: evex.128.0f.w0 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS mem256|mask,ymmreg [mr:fvm: evex.256.0f.w0 29 /r ] AVX512VL,AVX512,FUTURE
+VMOVAPS mem512|mask,zmmreg [mr:fvm: evex.512.0f.w0 29 /r ] AVX512,FUTURE
+VMOVD xmmreg,rm32 [rm:t1s: evex.128.66.0f.w0 6e /r ] AVX512,FUTURE
+VMOVD rm32,xmmreg [mr:t1s: evex.128.66.0f.w0 7e /r ] AVX512,FUTURE
+VMOVDDUP xmmreg|mask|z,xmmrm64 [rm:dup: evex.128.f2.0f.w1 12 /r ] AVX512VL,AVX512,FUTURE
+VMOVDDUP ymmreg|mask|z,ymmrm256 [rm:dup: evex.256.f2.0f.w1 12 /r ] AVX512VL,AVX512,FUTURE
+VMOVDDUP zmmreg|mask|z,zmmrm512 [rm:dup: evex.512.f2.0f.w1 12 /r ] AVX512,FUTURE
+VMOVDQA32 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f.w0 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA32 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f.w0 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA32 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f.w0 6f /r ] AVX512,FUTURE
+VMOVDQA32 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.66.0f.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA32 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.66.0f.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA32 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.66.0f.w0 7f /r ] AVX512,FUTURE
+VMOVDQA64 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f.w1 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA64 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f.w1 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA64 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f.w1 6f /r ] AVX512,FUTURE
+VMOVDQA64 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.66.0f.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA64 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.66.0f.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQA64 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.66.0f.w1 7f /r ] AVX512,FUTURE
+VMOVDQU16 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f2.0f.w1 6f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU16 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f2.0f.w1 6f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU16 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f2.0f.w1 6f /r ] AVX512BW,FUTURE
+VMOVDQU16 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.f2.0f.w1 7f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU16 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.f2.0f.w1 7f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU16 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.f2.0f.w1 7f /r ] AVX512BW,FUTURE
+VMOVDQU32 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f3.0f.w0 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU32 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f3.0f.w0 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU32 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f3.0f.w0 6f /r ] AVX512,FUTURE
+VMOVDQU32 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.f3.0f.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU32 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.f3.0f.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU32 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.f3.0f.w0 7f /r ] AVX512,FUTURE
+VMOVDQU64 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f3.0f.w1 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU64 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f3.0f.w1 6f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU64 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f3.0f.w1 6f /r ] AVX512,FUTURE
+VMOVDQU64 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.f3.0f.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU64 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.f3.0f.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VMOVDQU64 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.f3.0f.w1 7f /r ] AVX512,FUTURE
+VMOVDQU8 xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f2.0f.w0 6f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU8 ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f2.0f.w0 6f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU8 zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f2.0f.w0 6f /r ] AVX512BW,FUTURE
+VMOVDQU8 xmmrm128|mask|z,xmmreg [mr:fvm: evex.128.f2.0f.w0 7f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU8 ymmrm256|mask|z,ymmreg [mr:fvm: evex.256.f2.0f.w0 7f /r ] AVX512VL,AVX512BW,FUTURE
+VMOVDQU8 zmmrm512|mask|z,zmmreg [mr:fvm: evex.512.f2.0f.w0 7f /r ] AVX512BW,FUTURE
+VMOVHLPS xmmreg,xmmreg*,xmmreg [rvm: evex.nds.128.0f.w0 12 /r ] AVX512,FUTURE
+VMOVHPD xmmreg,xmmreg*,mem64 [rvm:t1s: evex.nds.128.66.0f.w1 16 /r ] AVX512,FUTURE
+VMOVHPD mem64,xmmreg [mr:t1s: evex.128.66.0f.w1 17 /r ] AVX512,FUTURE
+VMOVHPS xmmreg,xmmreg*,mem64 [rvm:t2: evex.nds.128.0f.w0 16 /r ] AVX512,FUTURE
+VMOVHPS mem64,xmmreg [mr:t2: evex.128.0f.w0 17 /r ] AVX512,FUTURE
+VMOVLHPS xmmreg,xmmreg*,xmmreg [rvm: evex.nds.128.0f.w0 16 /r ] AVX512,FUTURE
+VMOVLPD xmmreg,xmmreg*,mem64 [rvm:t1s: evex.nds.128.66.0f.w1 12 /r ] AVX512,FUTURE
+VMOVLPD mem64,xmmreg [mr:t1s: evex.128.66.0f.w1 13 /r ] AVX512,FUTURE
+VMOVLPS xmmreg,xmmreg*,mem64 [rvm:t2: evex.nds.128.0f.w0 12 /r ] AVX512,FUTURE
+VMOVLPS mem64,xmmreg [mr:t2: evex.128.0f.w0 13 /r ] AVX512,FUTURE
+VMOVNTDQ mem128,xmmreg [mr:fvm: evex.128.66.0f.w0 e7 /r ] AVX512VL,AVX512,FUTURE
+VMOVNTDQ mem256,ymmreg [mr:fvm: evex.256.66.0f.w0 e7 /r ] AVX512VL,AVX512,FUTURE
+VMOVNTDQ mem512,zmmreg [mr:fvm: evex.512.66.0f.w0 e7 /r ] AVX512,FUTURE
+VMOVNTDQA xmmreg,mem128 [rm:fvm: evex.128.66.0f38.w0 2a /r ] AVX512VL,AVX512,FUTURE
+VMOVNTDQA ymmreg,mem256 [rm:fvm: evex.256.66.0f38.w0 2a /r ] AVX512VL,AVX512,FUTURE
+VMOVNTDQA zmmreg,mem512 [rm:fvm: evex.512.66.0f38.w0 2a /r ] AVX512,FUTURE
+VMOVNTPD mem128,xmmreg [mr:fvm: evex.128.66.0f.w1 2b /r ] AVX512VL,AVX512,FUTURE
+VMOVNTPD mem256,ymmreg [mr:fvm: evex.256.66.0f.w1 2b /r ] AVX512VL,AVX512,FUTURE
+VMOVNTPD mem512,zmmreg [mr:fvm: evex.512.66.0f.w1 2b /r ] AVX512,FUTURE
+VMOVNTPS mem128,xmmreg [mr:fvm: evex.128.0f.w0 2b /r ] AVX512VL,AVX512,FUTURE
+VMOVNTPS mem256,ymmreg [mr:fvm: evex.256.0f.w0 2b /r ] AVX512VL,AVX512,FUTURE
+VMOVNTPS mem512,zmmreg [mr:fvm: evex.512.0f.w0 2b /r ] AVX512,FUTURE
+VMOVQ xmmreg,rm64 [rm:t1s: evex.128.66.0f.w1 6e /r ] AVX512,FUTURE
+VMOVQ rm64,xmmreg [mr:t1s: evex.128.66.0f.w1 7e /r ] AVX512,FUTURE
+VMOVQ xmmreg,xmmrm64 [rm:t1s: evex.128.f3.0f.w1 7e /r ] AVX512,FUTURE
+VMOVQ xmmrm64,xmmreg [mr:t1s: evex.128.66.0f.w1 d6 /r ] AVX512,FUTURE
+VMOVSD xmmreg|mask|z,mem64 [rm:t1s: evex.128.f2.0f.w1 10 /r ] AVX512,FUTURE
+VMOVSD mem64|mask,xmmreg [mr:t1s: evex.128.f2.0f.w1 11 /r ] AVX512,FUTURE
+VMOVSD xmmreg|mask|z,xmmreg*,xmmreg [rvm: evex.nds.128.f2.0f.w1 10 /r ] AVX512,FUTURE
+VMOVSD xmmreg|mask|z,xmmreg*,xmmreg [mvr: evex.nds.128.f2.0f.w1 11 /r ] AVX512,FUTURE
+VMOVSHDUP xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f3.0f.w0 16 /r ] AVX512VL,AVX512,FUTURE
+VMOVSHDUP ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f3.0f.w0 16 /r ] AVX512VL,AVX512,FUTURE
+VMOVSHDUP zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f3.0f.w0 16 /r ] AVX512,FUTURE
+VMOVSLDUP xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.f3.0f.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VMOVSLDUP ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.f3.0f.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VMOVSLDUP zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.f3.0f.w0 12 /r ] AVX512,FUTURE
+VMOVSS xmmreg|mask|z,mem32 [rm:t1s: evex.128.f3.0f.w0 10 /r ] AVX512,FUTURE
+VMOVSS mem32|mask,xmmreg [mr:t1s: evex.128.f3.0f.w0 11 /r ] AVX512,FUTURE
+VMOVSS xmmreg|mask|z,xmmreg*,xmmreg [rvm: evex.nds.128.f3.0f.w0 10 /r ] AVX512,FUTURE
+VMOVSS xmmreg|mask|z,xmmreg*,xmmreg [mvr: evex.nds.128.f3.0f.w0 11 /r ] AVX512,FUTURE
+VMOVUPD xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f.w1 10 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f.w1 10 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f.w1 10 /r ] AVX512,FUTURE
+VMOVUPD xmmreg|mask|z,xmmreg [mr: evex.128.66.0f.w1 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD ymmreg|mask|z,ymmreg [mr: evex.256.66.0f.w1 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD zmmreg|mask|z,zmmreg [mr: evex.512.66.0f.w1 11 /r ] AVX512,FUTURE
+VMOVUPD mem128|mask,xmmreg [mr:fvm: evex.128.66.0f.w1 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD mem256|mask,ymmreg [mr:fvm: evex.256.66.0f.w1 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPD mem512|mask,zmmreg [mr:fvm: evex.512.66.0f.w1 11 /r ] AVX512,FUTURE
+VMOVUPS xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.0f.w0 10 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.0f.w0 10 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.0f.w0 10 /r ] AVX512,FUTURE
+VMOVUPS xmmreg|mask|z,xmmreg [mr: evex.128.0f.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS ymmreg|mask|z,ymmreg [mr: evex.256.0f.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS zmmreg|mask|z,zmmreg [mr: evex.512.0f.w0 11 /r ] AVX512,FUTURE
+VMOVUPS mem128|mask,xmmreg [mr:fvm: evex.128.0f.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS mem256|mask,ymmreg [mr:fvm: evex.256.0f.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VMOVUPS mem512|mask,zmmreg [mr:fvm: evex.512.0f.w0 11 /r ] AVX512,FUTURE
+VMULPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VMULPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VMULPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f.w1 59 /r ] AVX512,FUTURE
+VMULPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 59 /r ] AVX512VL,AVX512,FUTURE
+VMULPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 59 /r ] AVX512VL,AVX512,FUTURE
+VMULPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|er [rvm:fv: evex.nds.512.0f.w0 59 /r ] AVX512,FUTURE
+VMULSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 59 /r ] AVX512,FUTURE
+VMULSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.f3.0f.w0 59 /r ] AVX512,FUTURE
+VORPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 56 /r ] AVX512VL,AVX512DQ,FUTURE
+VORPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 56 /r ] AVX512VL,AVX512DQ,FUTURE
+VORPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 56 /r ] AVX512DQ,FUTURE
+VORPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 56 /r ] AVX512VL,AVX512DQ,FUTURE
+VORPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 56 /r ] AVX512VL,AVX512DQ,FUTURE
+VORPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 56 /r ] AVX512DQ,FUTURE
+VPABSB xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f38.wig 1c /r ] AVX512VL,AVX512BW,FUTURE
+VPABSB ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f38.wig 1c /r ] AVX512VL,AVX512BW,FUTURE
+VPABSB zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f38.wig 1c /r ] AVX512BW,FUTURE
+VPABSD xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 1e /r ] AVX512VL,AVX512,FUTURE
+VPABSD ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 1e /r ] AVX512VL,AVX512,FUTURE
+VPABSD zmmreg|mask|z,zmmrm512|b32 [rm:fv: evex.512.66.0f38.w0 1e /r ] AVX512,FUTURE
+VPABSQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 1f /r ] AVX512VL,AVX512,FUTURE
+VPABSQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 1f /r ] AVX512VL,AVX512,FUTURE
+VPABSQ zmmreg|mask|z,zmmrm512|b64 [rm:fv: evex.512.66.0f38.w1 1f /r ] AVX512,FUTURE
+VPABSW xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f38.wig 1d /r ] AVX512VL,AVX512BW,FUTURE
+VPABSW ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f38.wig 1d /r ] AVX512VL,AVX512BW,FUTURE
+VPABSW zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f38.wig 1d /r ] AVX512BW,FUTURE
+VPACKSSDW xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 6b /r ] AVX512VL,AVX512BW,FUTURE
+VPACKSSDW ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 6b /r ] AVX512VL,AVX512BW,FUTURE
+VPACKSSDW zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 6b /r ] AVX512BW,FUTURE
+VPACKSSWB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 63 /r ] AVX512VL,AVX512BW,FUTURE
+VPACKSSWB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 63 /r ] AVX512VL,AVX512BW,FUTURE
+VPACKSSWB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 63 /r ] AVX512BW,FUTURE
+VPACKUSDW xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 2b /r ] AVX512VL,AVX512BW,FUTURE
+VPACKUSDW ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 2b /r ] AVX512VL,AVX512BW,FUTURE
+VPACKUSDW zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 2b /r ] AVX512BW,FUTURE
+VPACKUSWB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 67 /r ] AVX512VL,AVX512BW,FUTURE
+VPACKUSWB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 67 /r ] AVX512VL,AVX512BW,FUTURE
+VPACKUSWB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 67 /r ] AVX512BW,FUTURE
+VPADDB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig fc /r ] AVX512VL,AVX512BW,FUTURE
+VPADDB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig fc /r ] AVX512VL,AVX512BW,FUTURE
+VPADDB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig fc /r ] AVX512BW,FUTURE
+VPADDD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 fe /r ] AVX512VL,AVX512,FUTURE
+VPADDD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 fe /r ] AVX512VL,AVX512,FUTURE
+VPADDD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 fe /r ] AVX512,FUTURE
+VPADDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 d4 /r ] AVX512VL,AVX512,FUTURE
+VPADDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 d4 /r ] AVX512VL,AVX512,FUTURE
+VPADDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 d4 /r ] AVX512,FUTURE
+VPADDSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig ec /r ] AVX512VL,AVX512BW,FUTURE
+VPADDSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig ec /r ] AVX512VL,AVX512BW,FUTURE
+VPADDSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig ec /r ] AVX512BW,FUTURE
+VPADDSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig ed /r ] AVX512VL,AVX512BW,FUTURE
+VPADDSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig ed /r ] AVX512VL,AVX512BW,FUTURE
+VPADDSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig ed /r ] AVX512BW,FUTURE
+VPADDUSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig dc /r ] AVX512VL,AVX512BW,FUTURE
+VPADDUSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig dc /r ] AVX512VL,AVX512BW,FUTURE
+VPADDUSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig dc /r ] AVX512BW,FUTURE
+VPADDUSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig dd /r ] AVX512VL,AVX512BW,FUTURE
+VPADDUSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig dd /r ] AVX512VL,AVX512BW,FUTURE
+VPADDUSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig dd /r ] AVX512BW,FUTURE
+VPADDW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig fd /r ] AVX512VL,AVX512BW,FUTURE
+VPADDW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig fd /r ] AVX512VL,AVX512BW,FUTURE
+VPADDW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig fd /r ] AVX512BW,FUTURE
+VPALIGNR xmmreg|mask|z,xmmreg*,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.wig 0f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPALIGNR ymmreg|mask|z,ymmreg*,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.wig 0f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPALIGNR zmmreg|mask|z,zmmreg*,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.wig 0f /r ib ] AVX512BW,FUTURE
+VPANDD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 db /r ] AVX512VL,AVX512,FUTURE
+VPANDD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 db /r ] AVX512VL,AVX512,FUTURE
+VPANDD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 db /r ] AVX512,FUTURE
+VPANDND xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 df /r ] AVX512VL,AVX512,FUTURE
+VPANDND ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 df /r ] AVX512VL,AVX512,FUTURE
+VPANDND zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 df /r ] AVX512,FUTURE
+VPANDNQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 df /r ] AVX512VL,AVX512,FUTURE
+VPANDNQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 df /r ] AVX512VL,AVX512,FUTURE
+VPANDNQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 df /r ] AVX512,FUTURE
+VPANDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 db /r ] AVX512VL,AVX512,FUTURE
+VPANDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 db /r ] AVX512VL,AVX512,FUTURE
+VPANDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 db /r ] AVX512,FUTURE
+VPAVGB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e0 /r ] AVX512VL,AVX512BW,FUTURE
+VPAVGB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e0 /r ] AVX512VL,AVX512BW,FUTURE
+VPAVGB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e0 /r ] AVX512BW,FUTURE
+VPAVGW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e3 /r ] AVX512VL,AVX512BW,FUTURE
+VPAVGW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e3 /r ] AVX512VL,AVX512BW,FUTURE
+VPAVGW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e3 /r ] AVX512BW,FUTURE
+VPBLENDMB xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 66 /r ] AVX512VL,AVX512BW,FUTURE
+VPBLENDMB ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 66 /r ] AVX512VL,AVX512BW,FUTURE
+VPBLENDMB zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 66 /r ] AVX512BW,FUTURE
+VPBLENDMD xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 64 /r ] AVX512VL,AVX512,FUTURE
+VPBLENDMD ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 64 /r ] AVX512VL,AVX512,FUTURE
+VPBLENDMD zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 64 /r ] AVX512,FUTURE
+VPBLENDMQ xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 64 /r ] AVX512VL,AVX512,FUTURE
+VPBLENDMQ ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 64 /r ] AVX512VL,AVX512,FUTURE
+VPBLENDMQ zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 64 /r ] AVX512,FUTURE
+VPBLENDMW xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 66 /r ] AVX512VL,AVX512BW,FUTURE
+VPBLENDMW ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 66 /r ] AVX512VL,AVX512BW,FUTURE
+VPBLENDMW zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 66 /r ] AVX512BW,FUTURE
+VPBROADCASTB xmmreg|mask|z,xmmrm8 [rm:t1s8: evex.128.66.0f38.w0 78 /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB ymmreg|mask|z,xmmrm8 [rm:t1s8: evex.256.66.0f38.w0 78 /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB zmmreg|mask|z,xmmrm8 [rm:t1s8: evex.512.66.0f38.w0 78 /r ] AVX512BW,FUTURE
+VPBROADCASTB xmmreg|mask|z,reg8 [rm: evex.128.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB xmmreg|mask|z,reg16 [rm: evex.128.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB xmmreg|mask|z,reg32 [rm: evex.128.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB xmmreg|mask|z,reg64 [rm: evex.128.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB ymmreg|mask|z,reg8 [rm: evex.256.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB ymmreg|mask|z,reg16 [rm: evex.256.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB ymmreg|mask|z,reg32 [rm: evex.256.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB ymmreg|mask|z,reg64 [rm: evex.256.66.0f38.w0 7a /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTB zmmreg|mask|z,reg8 [rm: evex.512.66.0f38.w0 7a /r ] AVX512BW,FUTURE
+VPBROADCASTB zmmreg|mask|z,reg16 [rm: evex.512.66.0f38.w0 7a /r ] AVX512BW,FUTURE
+VPBROADCASTB zmmreg|mask|z,reg32 [rm: evex.512.66.0f38.w0 7a /r ] AVX512BW,FUTURE
+VPBROADCASTB zmmreg|mask|z,reg64 [rm: evex.512.66.0f38.w0 7a /r ] AVX512BW,FUTURE
+VPBROADCASTD xmmreg|mask|z,mem32 [rm:t1s: evex.128.66.0f38.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD ymmreg|mask|z,mem32 [rm:t1s: evex.256.66.0f38.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD zmmreg|mask|z,mem32 [rm:t1s: evex.512.66.0f38.w0 58 /r ] AVX512,FUTURE
+VPBROADCASTD xmmreg|mask|z,xmmreg [rm: evex.128.66.0f38.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD ymmreg|mask|z,xmmreg [rm: evex.256.66.0f38.w0 58 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD zmmreg|mask|z,xmmreg [rm: evex.512.66.0f38.w0 58 /r ] AVX512,FUTURE
+VPBROADCASTD xmmreg|mask|z,reg32 [rm: evex.128.66.0f38.w0 7c /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD ymmreg|mask|z,reg32 [rm: evex.256.66.0f38.w0 7c /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTD zmmreg|mask|z,reg32 [rm: evex.512.66.0f38.w0 7c /r ] AVX512,FUTURE
+VPBROADCASTMB2Q xmmreg,kreg [rm: evex.128.f3.0f38.w1 2a /r ] AVX512VL,AVX512CD,FUTURE
+VPBROADCASTMB2Q ymmreg,kreg [rm: evex.256.f3.0f38.w1 2a /r ] AVX512VL,AVX512CD,FUTURE
+VPBROADCASTMB2Q zmmreg,kreg [rm: evex.512.f3.0f38.w1 2a /r ] AVX512CD,FUTURE
+VPBROADCASTMW2D xmmreg,kreg [rm: evex.128.f3.0f38.w0 3a /r ] AVX512VL,AVX512CD,FUTURE
+VPBROADCASTMW2D ymmreg,kreg [rm: evex.256.f3.0f38.w0 3a /r ] AVX512VL,AVX512CD,FUTURE
+VPBROADCASTMW2D zmmreg,kreg [rm: evex.512.f3.0f38.w0 3a /r ] AVX512CD,FUTURE
+VPBROADCASTQ xmmreg|mask|z,mem64 [rm:t1s: evex.128.66.0f38.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ ymmreg|mask|z,mem64 [rm:t1s: evex.256.66.0f38.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ zmmreg|mask|z,mem64 [rm:t1s: evex.512.66.0f38.w1 59 /r ] AVX512,FUTURE
+VPBROADCASTQ xmmreg|mask|z,xmmreg [rm: evex.128.66.0f38.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ ymmreg|mask|z,xmmreg [rm: evex.256.66.0f38.w1 59 /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ zmmreg|mask|z,xmmreg [rm: evex.512.66.0f38.w1 59 /r ] AVX512,FUTURE
+VPBROADCASTQ xmmreg|mask|z,reg64 [rm: evex.128.66.0f38.w1 7c /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ ymmreg|mask|z,reg64 [rm: evex.256.66.0f38.w1 7c /r ] AVX512VL,AVX512,FUTURE
+VPBROADCASTQ zmmreg|mask|z,reg64 [rm: evex.512.66.0f38.w1 7c /r ] AVX512,FUTURE
+VPBROADCASTW xmmreg|mask|z,xmmrm16 [rm:t1s16: evex.128.66.0f38.w0 79 /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW ymmreg|mask|z,xmmrm16 [rm:t1s16: evex.256.66.0f38.w0 79 /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW zmmreg|mask|z,xmmrm16 [rm:t1s16: evex.512.66.0f38.w0 79 /r ] AVX512BW,FUTURE
+VPBROADCASTW xmmreg|mask|z,reg16 [rm: evex.128.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW xmmreg|mask|z,reg32 [rm: evex.128.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW xmmreg|mask|z,reg64 [rm: evex.128.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW ymmreg|mask|z,reg16 [rm: evex.256.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW ymmreg|mask|z,reg32 [rm: evex.256.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW ymmreg|mask|z,reg64 [rm: evex.256.66.0f38.w0 7b /r ] AVX512VL,AVX512BW,FUTURE
+VPBROADCASTW zmmreg|mask|z,reg16 [rm: evex.512.66.0f38.w0 7b /r ] AVX512BW,FUTURE
+VPBROADCASTW zmmreg|mask|z,reg32 [rm: evex.512.66.0f38.w0 7b /r ] AVX512BW,FUTURE
+VPBROADCASTW zmmreg|mask|z,reg64 [rm: evex.512.66.0f38.w0 7b /r ] AVX512BW,FUTURE
+VPCMPB kreg|mask,xmmreg,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w0 3f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPB kreg|mask,ymmreg,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w0 3f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPB kreg|mask,zmmreg,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w0 3f /r ib ] AVX512BW,FUTURE
+VPCMPD kreg|mask,xmmreg,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 1f /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPD kreg|mask,ymmreg,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 1f /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPD kreg|mask,zmmreg,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 1f /r ib ] AVX512,FUTURE
+VPCMPEQB kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 74 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPEQB kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 74 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPEQB kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 74 /r ] AVX512BW,FUTURE
+VPCMPEQD kreg|mask,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 76 /r ] AVX512VL,AVX512,FUTURE
+VPCMPEQD kreg|mask,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 76 /r ] AVX512VL,AVX512,FUTURE
+VPCMPEQD kreg|mask,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 76 /r ] AVX512,FUTURE
+VPCMPEQQ kreg|mask,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VPCMPEQQ kreg|mask,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 29 /r ] AVX512VL,AVX512,FUTURE
+VPCMPEQQ kreg|mask,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 29 /r ] AVX512,FUTURE
+VPCMPEQW kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 75 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPEQW kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 75 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPEQW kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 75 /r ] AVX512BW,FUTURE
+VPCMPGTB kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 64 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPGTB kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 64 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPGTB kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 64 /r ] AVX512BW,FUTURE
+VPCMPGTD kreg|mask,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 66 /r ] AVX512VL,AVX512,FUTURE
+VPCMPGTD kreg|mask,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 66 /r ] AVX512VL,AVX512,FUTURE
+VPCMPGTD kreg|mask,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 66 /r ] AVX512,FUTURE
+VPCMPGTQ kreg|mask,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 37 /r ] AVX512VL,AVX512,FUTURE
+VPCMPGTQ kreg|mask,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 37 /r ] AVX512VL,AVX512,FUTURE
+VPCMPGTQ kreg|mask,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 37 /r ] AVX512,FUTURE
+VPCMPGTW kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 65 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPGTW kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 65 /r ] AVX512VL,AVX512BW,FUTURE
+VPCMPGTW kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 65 /r ] AVX512BW,FUTURE
+VPCMPQ kreg|mask,xmmreg,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 1f /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPQ kreg|mask,ymmreg,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 1f /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPQ kreg|mask,zmmreg,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 1f /r ib ] AVX512,FUTURE
+VPCMPUB kreg|mask,xmmreg,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w0 3e /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPUB kreg|mask,ymmreg,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w0 3e /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPUB kreg|mask,zmmreg,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w0 3e /r ib ] AVX512BW,FUTURE
+VPCMPUD kreg|mask,xmmreg,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 1e /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPUD kreg|mask,ymmreg,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 1e /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPUD kreg|mask,zmmreg,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 1e /r ib ] AVX512,FUTURE
+VPCMPUQ kreg|mask,xmmreg,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 1e /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPUQ kreg|mask,ymmreg,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 1e /r ib ] AVX512VL,AVX512,FUTURE
+VPCMPUQ kreg|mask,zmmreg,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 1e /r ib ] AVX512,FUTURE
+VPCMPUW kreg|mask,xmmreg,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w1 3e /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPUW kreg|mask,ymmreg,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w1 3e /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPUW kreg|mask,zmmreg,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w1 3e /r ib ] AVX512BW,FUTURE
+VPCMPW kreg|mask,xmmreg,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w1 3f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPW kreg|mask,ymmreg,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w1 3f /r ib ] AVX512VL,AVX512BW,FUTURE
+VPCMPW kreg|mask,zmmreg,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w1 3f /r ib ] AVX512BW,FUTURE
+VPCOMPRESSD mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w0 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSD mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w0 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSD mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w0 8b /r ] AVX512,FUTURE
+VPCOMPRESSD xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w0 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSD ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w0 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSD zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w0 8b /r ] AVX512,FUTURE
+VPCOMPRESSQ mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w1 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSQ mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w1 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSQ mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w1 8b /r ] AVX512,FUTURE
+VPCOMPRESSQ xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w1 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSQ ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w1 8b /r ] AVX512VL,AVX512,FUTURE
+VPCOMPRESSQ zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w1 8b /r ] AVX512,FUTURE
+VPCONFLICTD xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 c4 /r ] AVX512VL,AVX512CD,FUTURE
+VPCONFLICTD ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 c4 /r ] AVX512VL,AVX512CD,FUTURE
+VPCONFLICTD zmmreg|mask|z,zmmrm512|b32 [rm:fv: evex.512.66.0f38.w0 c4 /r ] AVX512CD,FUTURE
+VPCONFLICTQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 c4 /r ] AVX512VL,AVX512CD,FUTURE
+VPCONFLICTQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 c4 /r ] AVX512VL,AVX512CD,FUTURE
+VPCONFLICTQ zmmreg|mask|z,zmmrm512|b64 [rm:fv: evex.512.66.0f38.w1 c4 /r ] AVX512CD,FUTURE
+VPERMB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 8d /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 8d /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 8d /r ] AVX512VBMI,FUTURE
+VPERMD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 36 /r ] AVX512VL,AVX512,FUTURE
+VPERMD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 36 /r ] AVX512,FUTURE
+VPERMI2B xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 75 /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMI2B ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 75 /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMI2B zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 75 /r ] AVX512VBMI,FUTURE
+VPERMI2D xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 76 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2D ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 76 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2D zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 76 /r ] AVX512,FUTURE
+VPERMI2PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 77 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 77 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2PD zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 77 /r ] AVX512,FUTURE
+VPERMI2PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 77 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 77 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2PS zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 77 /r ] AVX512,FUTURE
+VPERMI2Q xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 76 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2Q ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 76 /r ] AVX512VL,AVX512,FUTURE
+VPERMI2Q zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 76 /r ] AVX512,FUTURE
+VPERMI2W xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 75 /r ] AVX512VL,AVX512BW,FUTURE
+VPERMI2W ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 75 /r ] AVX512VL,AVX512BW,FUTURE
+VPERMI2W zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 75 /r ] AVX512BW,FUTURE
+VPERMILPD xmmreg|mask|z,xmmrm128|b64,imm8 [rmi:fv: evex.128.66.0f3a.w1 05 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMILPD ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 05 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMILPD zmmreg|mask|z,zmmrm512|b64,imm8 [rmi:fv: evex.512.66.0f3a.w1 05 /r ib ] AVX512,FUTURE
+VPERMILPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 0d /r ] AVX512VL,AVX512,FUTURE
+VPERMILPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 0d /r ] AVX512VL,AVX512,FUTURE
+VPERMILPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 0d /r ] AVX512,FUTURE
+VPERMILPS xmmreg|mask|z,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f3a.w0 04 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMILPS ymmreg|mask|z,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f3a.w0 04 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMILPS zmmreg|mask|z,zmmrm512|b32,imm8 [rmi:fv: evex.512.66.0f3a.w0 04 /r ib ] AVX512,FUTURE
+VPERMILPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 0c /r ] AVX512VL,AVX512,FUTURE
+VPERMILPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 0c /r ] AVX512VL,AVX512,FUTURE
+VPERMILPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 0c /r ] AVX512,FUTURE
+VPERMPD ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 01 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMPD zmmreg|mask|z,zmmrm512|b64,imm8 [rmi:fv: evex.512.66.0f3a.w1 01 /r ib ] AVX512,FUTURE
+VPERMPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 16 /r ] AVX512VL,AVX512,FUTURE
+VPERMPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 16 /r ] AVX512,FUTURE
+VPERMPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 16 /r ] AVX512VL,AVX512,FUTURE
+VPERMPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 16 /r ] AVX512,FUTURE
+VPERMQ ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 00 /r ib ] AVX512VL,AVX512,FUTURE
+VPERMQ zmmreg|mask|z,zmmrm512|b64,imm8 [rmi:fv: evex.512.66.0f3a.w1 00 /r ib ] AVX512,FUTURE
+VPERMQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 36 /r ] AVX512VL,AVX512,FUTURE
+VPERMQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 36 /r ] AVX512,FUTURE
+VPERMT2B xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 7d /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMT2B ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 7d /r ] AVX512VL,AVX512VBMI,FUTURE
+VPERMT2B zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 7d /r ] AVX512VBMI,FUTURE
+VPERMT2D xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 7e /r ] AVX512VL,AVX512,FUTURE
+VPERMT2D ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 7e /r ] AVX512VL,AVX512,FUTURE
+VPERMT2D zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 7e /r ] AVX512,FUTURE
+VPERMT2PD xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VPERMT2PD ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 7f /r ] AVX512VL,AVX512,FUTURE
+VPERMT2PD zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 7f /r ] AVX512,FUTURE
+VPERMT2PS xmmreg|mask|z,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VPERMT2PS ymmreg|mask|z,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 7f /r ] AVX512VL,AVX512,FUTURE
+VPERMT2PS zmmreg|mask|z,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 7f /r ] AVX512,FUTURE
+VPERMT2Q xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 7e /r ] AVX512VL,AVX512,FUTURE
+VPERMT2Q ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 7e /r ] AVX512VL,AVX512,FUTURE
+VPERMT2Q zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 7e /r ] AVX512,FUTURE
+VPERMT2W xmmreg|mask|z,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 7d /r ] AVX512VL,AVX512BW,FUTURE
+VPERMT2W ymmreg|mask|z,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 7d /r ] AVX512VL,AVX512BW,FUTURE
+VPERMT2W zmmreg|mask|z,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 7d /r ] AVX512BW,FUTURE
+VPERMW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 8d /r ] AVX512VL,AVX512BW,FUTURE
+VPERMW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 8d /r ] AVX512VL,AVX512BW,FUTURE
+VPERMW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 8d /r ] AVX512BW,FUTURE
+VPEXPANDD xmmreg|mask|z,mem128 [rm:t1s: evex.128.66.0f38.w0 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDD ymmreg|mask|z,mem256 [rm:t1s: evex.256.66.0f38.w0 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDD zmmreg|mask|z,mem512 [rm:t1s: evex.512.66.0f38.w0 89 /r ] AVX512,FUTURE
+VPEXPANDD xmmreg|mask|z,xmmreg [rm:t1s: evex.128.66.0f38.w0 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDD ymmreg|mask|z,ymmreg [rm:t1s: evex.256.66.0f38.w0 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDD zmmreg|mask|z,zmmreg [rm:t1s: evex.512.66.0f38.w0 89 /r ] AVX512,FUTURE
+VPEXPANDQ xmmreg|mask|z,mem128 [rm:t1s: evex.128.66.0f38.w1 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDQ ymmreg|mask|z,mem256 [rm:t1s: evex.256.66.0f38.w1 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDQ zmmreg|mask|z,mem512 [rm:t1s: evex.512.66.0f38.w1 89 /r ] AVX512,FUTURE
+VPEXPANDQ xmmreg|mask|z,xmmreg [rm:t1s: evex.128.66.0f38.w1 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDQ ymmreg|mask|z,ymmreg [rm:t1s: evex.256.66.0f38.w1 89 /r ] AVX512VL,AVX512,FUTURE
+VPEXPANDQ zmmreg|mask|z,zmmreg [rm:t1s: evex.512.66.0f38.w1 89 /r ] AVX512,FUTURE
+VPEXTRB reg8,xmmreg,imm8 [mri:t1s8: evex.128.66.0f3a.wig 14 /r ib ] AVX512BW,FUTURE
+VPEXTRB reg16,xmmreg,imm8 [mri:t1s8: evex.128.66.0f3a.wig 14 /r ib ] AVX512BW,FUTURE
+VPEXTRB reg32,xmmreg,imm8 [mri:t1s8: evex.128.66.0f3a.wig 14 /r ib ] AVX512BW,FUTURE
+VPEXTRB reg64,xmmreg,imm8 [mri:t1s8: evex.128.66.0f3a.wig 14 /r ib ] AVX512BW,FUTURE
+VPEXTRB mem8,xmmreg,imm8 [mri:t1s8: evex.128.66.0f3a.wig 14 /r ib ] AVX512BW,FUTURE
+VPEXTRD rm32,xmmreg,imm8 [mri:t1s: evex.128.66.0f3a.w0 16 /r ib ] AVX512DQ,FUTURE
+VPEXTRQ rm64,xmmreg,imm8 [mri:t1s: evex.128.66.0f3a.w1 16 /r ib ] AVX512DQ,FUTURE
+VPEXTRW reg16,xmmreg,imm8 [mri:t1s16: evex.128.66.0f3a.wig 15 /r ib ] AVX512BW,FUTURE
+VPEXTRW reg32,xmmreg,imm8 [mri:t1s16: evex.128.66.0f3a.wig 15 /r ib ] AVX512BW,FUTURE
+VPEXTRW reg64,xmmreg,imm8 [mri:t1s16: evex.128.66.0f3a.wig 15 /r ib ] AVX512BW,FUTURE
+VPEXTRW mem16,xmmreg,imm8 [mri:t1s16: evex.128.66.0f3a.wig 15 /r ib ] AVX512BW,FUTURE
+VPEXTRW reg16,xmmreg,imm8 [rmi: evex.128.66.0f.wig c5 /r ib ] AVX512BW,FUTURE
+VPEXTRW reg32,xmmreg,imm8 [rmi: evex.128.66.0f.wig c5 /r ib ] AVX512BW,FUTURE
+VPEXTRW reg64,xmmreg,imm8 [rmi: evex.128.66.0f.wig c5 /r ib ] AVX512BW,FUTURE
+VPGATHERDD xmmreg|mask,xmem32 [rm:t1s: vsibx evex.128.66.0f38.w0 90 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERDD ymmreg|mask,ymem32 [rm:t1s: vsiby evex.256.66.0f38.w0 90 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERDD zmmreg|mask,zmem32 [rm:t1s: vsibz evex.512.66.0f38.w0 90 /r ] AVX512,FUTURE
+VPGATHERDQ xmmreg|mask,xmem64 [rm:t1s: vsibx evex.128.66.0f38.w1 90 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERDQ ymmreg|mask,xmem64 [rm:t1s: vsibx evex.256.66.0f38.w1 90 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERDQ zmmreg|mask,ymem64 [rm:t1s: vsiby evex.512.66.0f38.w1 90 /r ] AVX512,FUTURE
+VPGATHERQD xmmreg|mask,xmem32 [rm:t1s: vsibx evex.128.66.0f38.w0 91 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERQD xmmreg|mask,ymem32 [rm:t1s: vsiby evex.256.66.0f38.w0 91 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERQD ymmreg|mask,zmem32 [rm:t1s: vsibz evex.512.66.0f38.w0 91 /r ] AVX512,FUTURE
+VPGATHERQQ xmmreg|mask,xmem64 [rm:t1s: vsibx evex.128.66.0f38.w1 91 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERQQ ymmreg|mask,ymem64 [rm:t1s: vsiby evex.256.66.0f38.w1 91 /r ] AVX512VL,AVX512,FUTURE
+VPGATHERQQ zmmreg|mask,zmem64 [rm:t1s: vsibz evex.512.66.0f38.w1 91 /r ] AVX512,FUTURE
+VPINSRB xmmreg,xmmreg*,reg32,imm8 [rvmi:t1s8: evex.nds.128.66.0f3a.wig 20 /r ib ] AVX512BW,FUTURE
+VPINSRB xmmreg,xmmreg*,mem8,imm8 [rvmi:t1s8: evex.nds.128.66.0f3a.wig 20 /r ib ] AVX512BW,FUTURE
+VPINSRD xmmreg,xmmreg*,rm32,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 22 /r ib ] AVX512DQ,FUTURE
+VPINSRQ xmmreg,xmmreg*,rm64,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 22 /r ib ] AVX512DQ,FUTURE
+VPINSRW xmmreg,xmmreg*,reg32,imm8 [rvmi:t1s16: evex.nds.128.66.0f.wig c4 /r ib ] AVX512BW,FUTURE
+VPINSRW xmmreg,xmmreg*,mem16,imm8 [rvmi:t1s16: evex.nds.128.66.0f.wig c4 /r ib ] AVX512BW,FUTURE
+VPLZCNTD xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 44 /r ] AVX512VL,AVX512CD,FUTURE
+VPLZCNTD ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 44 /r ] AVX512VL,AVX512CD,FUTURE
+VPLZCNTD zmmreg|mask|z,zmmrm512|b32 [rm:fv: evex.512.66.0f38.w0 44 /r ] AVX512CD,FUTURE
+VPLZCNTQ xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 44 /r ] AVX512VL,AVX512CD,FUTURE
+VPLZCNTQ ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 44 /r ] AVX512VL,AVX512CD,FUTURE
+VPLZCNTQ zmmreg|mask|z,zmmrm512|b64 [rm:fv: evex.512.66.0f38.w1 44 /r ] AVX512CD,FUTURE
+VPMADD52HUQ xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 b5 /r ] AVX512VL,AVX512IFMA,FUTURE
+VPMADD52HUQ ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 b5 /r ] AVX512VL,AVX512IFMA,FUTURE
+VPMADD52HUQ zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 b5 /r ] AVX512IFMA,FUTURE
+VPMADD52LUQ xmmreg|mask|z,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 b4 /r ] AVX512VL,AVX512IFMA,FUTURE
+VPMADD52LUQ ymmreg|mask|z,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 b4 /r ] AVX512VL,AVX512IFMA,FUTURE
+VPMADD52LUQ zmmreg|mask|z,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 b4 /r ] AVX512IFMA,FUTURE
+VPMADDUBSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 04 /r ] AVX512VL,AVX512BW,FUTURE
+VPMADDUBSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 04 /r ] AVX512VL,AVX512BW,FUTURE
+VPMADDUBSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 04 /r ] AVX512BW,FUTURE
+VPMADDWD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig f5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMADDWD ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig f5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMADDWD zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig f5 /r ] AVX512BW,FUTURE
+VPMAXSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 3c /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 3c /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 3c /r ] AVX512BW,FUTURE
+VPMAXSD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 3d /r ] AVX512VL,AVX512,FUTURE
+VPMAXSD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 3d /r ] AVX512VL,AVX512,FUTURE
+VPMAXSD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 3d /r ] AVX512,FUTURE
+VPMAXSQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 3d /r ] AVX512VL,AVX512,FUTURE
+VPMAXSQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 3d /r ] AVX512VL,AVX512,FUTURE
+VPMAXSQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 3d /r ] AVX512,FUTURE
+VPMAXSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig ee /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig ee /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig ee /r ] AVX512BW,FUTURE
+VPMAXUB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig de /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXUB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig de /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXUB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig de /r ] AVX512BW,FUTURE
+VPMAXUD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 3f /r ] AVX512VL,AVX512,FUTURE
+VPMAXUD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 3f /r ] AVX512VL,AVX512,FUTURE
+VPMAXUD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 3f /r ] AVX512,FUTURE
+VPMAXUQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 3f /r ] AVX512VL,AVX512,FUTURE
+VPMAXUQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 3f /r ] AVX512VL,AVX512,FUTURE
+VPMAXUQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 3f /r ] AVX512,FUTURE
+VPMAXUW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 3e /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXUW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 3e /r ] AVX512VL,AVX512BW,FUTURE
+VPMAXUW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 3e /r ] AVX512BW,FUTURE
+VPMINSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 38 /r ] AVX512VL,AVX512BW,FUTURE
+VPMINSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 38 /r ] AVX512VL,AVX512BW,FUTURE
+VPMINSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 38 /r ] AVX512BW,FUTURE
+VPMINSD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 39 /r ] AVX512VL,AVX512,FUTURE
+VPMINSD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 39 /r ] AVX512VL,AVX512,FUTURE
+VPMINSD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 39 /r ] AVX512,FUTURE
+VPMINSQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 39 /r ] AVX512VL,AVX512,FUTURE
+VPMINSQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 39 /r ] AVX512VL,AVX512,FUTURE
+VPMINSQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 39 /r ] AVX512,FUTURE
+VPMINSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig ea /r ] AVX512VL,AVX512BW,FUTURE
+VPMINSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig ea /r ] AVX512VL,AVX512BW,FUTURE
+VPMINSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig ea /r ] AVX512BW,FUTURE
+VPMINUB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig da /r ] AVX512VL,AVX512BW,FUTURE
+VPMINUB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig da /r ] AVX512VL,AVX512BW,FUTURE
+VPMINUB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig da /r ] AVX512BW,FUTURE
+VPMINUD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 3b /r ] AVX512VL,AVX512,FUTURE
+VPMINUD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 3b /r ] AVX512VL,AVX512,FUTURE
+VPMINUD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 3b /r ] AVX512,FUTURE
+VPMINUQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 3b /r ] AVX512VL,AVX512,FUTURE
+VPMINUQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 3b /r ] AVX512VL,AVX512,FUTURE
+VPMINUQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 3b /r ] AVX512,FUTURE
+VPMINUW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 3a /r ] AVX512VL,AVX512BW,FUTURE
+VPMINUW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 3a /r ] AVX512VL,AVX512BW,FUTURE
+VPMINUW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 3a /r ] AVX512BW,FUTURE
+VPMOVB2M kreg,xmmreg [rm: evex.128.f3.0f38.w0 29 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVB2M kreg,ymmreg [rm: evex.256.f3.0f38.w0 29 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVB2M kreg,zmmreg [rm: evex.512.f3.0f38.w0 29 /r ] AVX512BW,FUTURE
+VPMOVD2M kreg,xmmreg [rm: evex.128.f3.0f38.w0 39 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVD2M kreg,ymmreg [rm: evex.256.f3.0f38.w0 39 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVD2M kreg,zmmreg [rm: evex.512.f3.0f38.w0 39 /r ] AVX512DQ,FUTURE
+VPMOVDB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 31 /r ] AVX512,FUTURE
+VPMOVDB mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDB mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDB mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 31 /r ] AVX512,FUTURE
+VPMOVDW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDW ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 33 /r ] AVX512,FUTURE
+VPMOVDW mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDW mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVDW mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 33 /r ] AVX512,FUTURE
+VPMOVM2B xmmreg,kreg [rm: evex.128.f3.0f38.w0 28 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVM2B ymmreg,kreg [rm: evex.256.f3.0f38.w0 28 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVM2B zmmreg,kreg [rm: evex.512.f3.0f38.w0 28 /r ] AVX512BW,FUTURE
+VPMOVM2D xmmreg,kreg [rm: evex.128.f3.0f38.w0 38 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVM2D ymmreg,kreg [rm: evex.256.f3.0f38.w0 38 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVM2D zmmreg,kreg [rm: evex.512.f3.0f38.w0 38 /r ] AVX512DQ,FUTURE
+VPMOVM2Q xmmreg,kreg [rm: evex.128.f3.0f38.w1 38 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVM2Q ymmreg,kreg [rm: evex.256.f3.0f38.w1 38 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVM2Q zmmreg,kreg [rm: evex.512.f3.0f38.w1 38 /r ] AVX512DQ,FUTURE
+VPMOVM2W xmmreg,kreg [rm: evex.128.f3.0f38.w1 28 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVM2W ymmreg,kreg [rm: evex.256.f3.0f38.w1 28 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVM2W zmmreg,kreg [rm: evex.512.f3.0f38.w1 28 /r ] AVX512BW,FUTURE
+VPMOVQ2M kreg,xmmreg [rm: evex.128.f3.0f38.w1 39 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVQ2M kreg,ymmreg [rm: evex.256.f3.0f38.w1 39 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMOVQ2M kreg,zmmreg [rm: evex.512.f3.0f38.w1 39 /r ] AVX512DQ,FUTURE
+VPMOVQB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 32 /r ] AVX512,FUTURE
+VPMOVQB mem16|mask,xmmreg [mr:ovm: evex.128.f3.0f38.w0 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQB mem32|mask,ymmreg [mr:ovm: evex.256.f3.0f38.w0 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQB mem64|mask,zmmreg [mr:ovm: evex.512.f3.0f38.w0 32 /r ] AVX512,FUTURE
+VPMOVQD xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQD xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQD ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 35 /r ] AVX512,FUTURE
+VPMOVQD mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQD mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQD mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 35 /r ] AVX512,FUTURE
+VPMOVQW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQW xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 34 /r ] AVX512,FUTURE
+VPMOVQW mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQW mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVQW mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 34 /r ] AVX512,FUTURE
+VPMOVSDB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 21 /r ] AVX512,FUTURE
+VPMOVSDB mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDB mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDB mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 21 /r ] AVX512,FUTURE
+VPMOVSDW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDW ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 23 /r ] AVX512,FUTURE
+VPMOVSDW mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDW mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSDW mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 23 /r ] AVX512,FUTURE
+VPMOVSQB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 22 /r ] AVX512,FUTURE
+VPMOVSQB mem16|mask,xmmreg [mr:ovm: evex.128.f3.0f38.w0 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQB mem32|mask,ymmreg [mr:ovm: evex.256.f3.0f38.w0 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQB mem64|mask,zmmreg [mr:ovm: evex.512.f3.0f38.w0 22 /r ] AVX512,FUTURE
+VPMOVSQD xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQD xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQD ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 25 /r ] AVX512,FUTURE
+VPMOVSQD mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQD mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQD mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 25 /r ] AVX512,FUTURE
+VPMOVSQW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQW xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 24 /r ] AVX512,FUTURE
+VPMOVSQW mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQW mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSQW mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 24 /r ] AVX512,FUTURE
+VPMOVSWB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSWB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSWB ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 20 /r ] AVX512BW,FUTURE
+VPMOVSWB mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSWB mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSWB mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 20 /r ] AVX512BW,FUTURE
+VPMOVSXBD xmmreg|mask|z,xmmrm32 [rm:qvm: evex.128.66.0f38.wig 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXBD ymmreg|mask|z,xmmrm64 [rm:qvm: evex.256.66.0f38.wig 21 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXBD zmmreg|mask|z,xmmrm128 [rm:qvm: evex.512.66.0f38.wig 21 /r ] AVX512,FUTURE
+VPMOVSXBQ xmmreg|mask|z,xmmrm16 [rm:ovm: evex.128.66.0f38.wig 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXBQ ymmreg|mask|z,xmmrm32 [rm:ovm: evex.256.66.0f38.wig 22 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXBQ zmmreg|mask|z,xmmrm64 [rm:ovm: evex.512.66.0f38.wig 22 /r ] AVX512,FUTURE
+VPMOVSXBW xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.wig 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSXBW ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.wig 20 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVSXBW zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.wig 20 /r ] AVX512BW,FUTURE
+VPMOVSXDQ xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXDQ ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.w0 25 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXDQ zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.w0 25 /r ] AVX512,FUTURE
+VPMOVSXWD xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.wig 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXWD ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.wig 23 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXWD zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.wig 23 /r ] AVX512,FUTURE
+VPMOVSXWQ xmmreg|mask|z,xmmrm32 [rm:qvm: evex.128.66.0f38.wig 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXWQ ymmreg|mask|z,xmmrm64 [rm:qvm: evex.256.66.0f38.wig 24 /r ] AVX512VL,AVX512,FUTURE
+VPMOVSXWQ zmmreg|mask|z,xmmrm128 [rm:qvm: evex.512.66.0f38.wig 24 /r ] AVX512,FUTURE
+VPMOVUSDB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 11 /r ] AVX512,FUTURE
+VPMOVUSDB mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDB mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 11 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDB mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 11 /r ] AVX512,FUTURE
+VPMOVUSDW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDW ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 13 /r ] AVX512,FUTURE
+VPMOVUSDW mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDW mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 13 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSDW mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 13 /r ] AVX512,FUTURE
+VPMOVUSQB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQB xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 12 /r ] AVX512,FUTURE
+VPMOVUSQB mem16|mask,xmmreg [mr:ovm: evex.128.f3.0f38.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQB mem32|mask,ymmreg [mr:ovm: evex.256.f3.0f38.w0 12 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQB mem64|mask,zmmreg [mr:ovm: evex.512.f3.0f38.w0 12 /r ] AVX512,FUTURE
+VPMOVUSQD xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQD xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQD ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 15 /r ] AVX512,FUTURE
+VPMOVUSQD mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQD mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQD mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 15 /r ] AVX512,FUTURE
+VPMOVUSQW xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQW xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQW xmmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 14 /r ] AVX512,FUTURE
+VPMOVUSQW mem32|mask,xmmreg [mr:qvm: evex.128.f3.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQW mem64|mask,ymmreg [mr:qvm: evex.256.f3.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPMOVUSQW mem128|mask,zmmreg [mr:qvm: evex.512.f3.0f38.w0 14 /r ] AVX512,FUTURE
+VPMOVUSWB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVUSWB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVUSWB ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 10 /r ] AVX512BW,FUTURE
+VPMOVUSWB mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVUSWB mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVUSWB mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 10 /r ] AVX512BW,FUTURE
+VPMOVW2M kreg,xmmreg [rm: evex.128.f3.0f38.w1 29 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVW2M kreg,ymmreg [rm: evex.256.f3.0f38.w1 29 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVW2M kreg,zmmreg [rm: evex.512.f3.0f38.w1 29 /r ] AVX512BW,FUTURE
+VPMOVWB xmmreg|mask|z,xmmreg [mr: evex.128.f3.0f38.w0 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVWB xmmreg|mask|z,ymmreg [mr: evex.256.f3.0f38.w0 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVWB ymmreg|mask|z,zmmreg [mr: evex.512.f3.0f38.w0 30 /r ] AVX512BW,FUTURE
+VPMOVWB mem64|mask,xmmreg [mr:hvm: evex.128.f3.0f38.w0 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVWB mem128|mask,ymmreg [mr:hvm: evex.256.f3.0f38.w0 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVWB mem256|mask,zmmreg [mr:hvm: evex.512.f3.0f38.w0 30 /r ] AVX512BW,FUTURE
+VPMOVZXBD xmmreg|mask|z,xmmrm32 [rm:qvm: evex.128.66.0f38.wig 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXBD ymmreg|mask|z,xmmrm64 [rm:qvm: evex.256.66.0f38.wig 31 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXBD zmmreg|mask|z,xmmrm128 [rm:qvm: evex.512.66.0f38.wig 31 /r ] AVX512,FUTURE
+VPMOVZXBQ xmmreg|mask|z,xmmrm16 [rm:ovm: evex.128.66.0f38.wig 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXBQ ymmreg|mask|z,xmmrm32 [rm:ovm: evex.256.66.0f38.wig 32 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXBQ zmmreg|mask|z,xmmrm64 [rm:ovm: evex.512.66.0f38.wig 32 /r ] AVX512,FUTURE
+VPMOVZXBW xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.wig 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVZXBW ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.wig 30 /r ] AVX512VL,AVX512BW,FUTURE
+VPMOVZXBW zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.wig 30 /r ] AVX512BW,FUTURE
+VPMOVZXDQ xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXDQ ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.w0 35 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXDQ zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.w0 35 /r ] AVX512,FUTURE
+VPMOVZXWD xmmreg|mask|z,xmmrm64 [rm:hvm: evex.128.66.0f38.wig 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXWD ymmreg|mask|z,xmmrm128 [rm:hvm: evex.256.66.0f38.wig 33 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXWD zmmreg|mask|z,ymmrm256 [rm:hvm: evex.512.66.0f38.wig 33 /r ] AVX512,FUTURE
+VPMOVZXWQ xmmreg|mask|z,xmmrm32 [rm:qvm: evex.128.66.0f38.wig 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXWQ ymmreg|mask|z,xmmrm64 [rm:qvm: evex.256.66.0f38.wig 34 /r ] AVX512VL,AVX512,FUTURE
+VPMOVZXWQ zmmreg|mask|z,xmmrm128 [rm:qvm: evex.512.66.0f38.wig 34 /r ] AVX512,FUTURE
+VPMULDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 28 /r ] AVX512VL,AVX512,FUTURE
+VPMULDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 28 /r ] AVX512VL,AVX512,FUTURE
+VPMULDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 28 /r ] AVX512,FUTURE
+VPMULHRSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 0b /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHRSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 0b /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHRSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 0b /r ] AVX512BW,FUTURE
+VPMULHUW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e4 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHUW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e4 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHUW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e4 /r ] AVX512BW,FUTURE
+VPMULHW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULHW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e5 /r ] AVX512BW,FUTURE
+VPMULLD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 40 /r ] AVX512VL,AVX512,FUTURE
+VPMULLD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 40 /r ] AVX512VL,AVX512,FUTURE
+VPMULLD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 40 /r ] AVX512,FUTURE
+VPMULLQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 40 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMULLQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 40 /r ] AVX512VL,AVX512DQ,FUTURE
+VPMULLQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 40 /r ] AVX512DQ,FUTURE
+VPMULLW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig d5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULLW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig d5 /r ] AVX512VL,AVX512BW,FUTURE
+VPMULLW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig d5 /r ] AVX512BW,FUTURE
+VPMULTISHIFTQB xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 83 /r ] AVX512VL,AVX512VBMI,FUTURE
+VPMULTISHIFTQB ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 83 /r ] AVX512VL,AVX512VBMI,FUTURE
+VPMULTISHIFTQB zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 83 /r ] AVX512VBMI,FUTURE
+VPMULUDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 f4 /r ] AVX512VL,AVX512,FUTURE
+VPMULUDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 f4 /r ] AVX512VL,AVX512,FUTURE
+VPMULUDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 f4 /r ] AVX512,FUTURE
+VPORD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 eb /r ] AVX512VL,AVX512,FUTURE
+VPORD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 eb /r ] AVX512VL,AVX512,FUTURE
+VPORD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 eb /r ] AVX512,FUTURE
+VPORQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 eb /r ] AVX512VL,AVX512,FUTURE
+VPORQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 eb /r ] AVX512VL,AVX512,FUTURE
+VPORQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 eb /r ] AVX512,FUTURE
+VPROLD xmmreg|mask|z,xmmrm128|b32*,imm8 [vmi:fv: evex.nds.128.66.0f.w0 72 /1 ib ] AVX512VL,AVX512,FUTURE
+VPROLD ymmreg|mask|z,ymmrm256|b32*,imm8 [vmi:fv: evex.nds.256.66.0f.w0 72 /1 ib ] AVX512VL,AVX512,FUTURE
+VPROLD zmmreg|mask|z,zmmrm512|b32*,imm8 [vmi:fv: evex.nds.512.66.0f.w0 72 /1 ib ] AVX512,FUTURE
+VPROLQ xmmreg|mask|z,xmmrm128|b64*,imm8 [vmi:fv: evex.nds.128.66.0f.w1 72 /1 ib ] AVX512VL,AVX512,FUTURE
+VPROLQ ymmreg|mask|z,ymmrm256|b64*,imm8 [vmi:fv: evex.nds.256.66.0f.w1 72 /1 ib ] AVX512VL,AVX512,FUTURE
+VPROLQ zmmreg|mask|z,zmmrm512|b64*,imm8 [vmi:fv: evex.nds.512.66.0f.w1 72 /1 ib ] AVX512,FUTURE
+VPROLVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPROLVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VPROLVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 15 /r ] AVX512,FUTURE
+VPROLVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 15 /r ] AVX512VL,AVX512,FUTURE
+VPROLVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 15 /r ] AVX512VL,AVX512,FUTURE
+VPROLVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 15 /r ] AVX512,FUTURE
+VPRORD xmmreg|mask|z,xmmrm128|b32*,imm8 [vmi:fv: evex.nds.128.66.0f.w0 72 /0 ib ] AVX512VL,AVX512,FUTURE
+VPRORD ymmreg|mask|z,ymmrm256|b32*,imm8 [vmi:fv: evex.nds.256.66.0f.w0 72 /0 ib ] AVX512VL,AVX512,FUTURE
+VPRORD zmmreg|mask|z,zmmrm512|b32*,imm8 [vmi:fv: evex.nds.512.66.0f.w0 72 /0 ib ] AVX512,FUTURE
+VPRORQ xmmreg|mask|z,xmmrm128|b64*,imm8 [vmi:fv: evex.nds.128.66.0f.w1 72 /0 ib ] AVX512VL,AVX512,FUTURE
+VPRORQ ymmreg|mask|z,ymmrm256|b64*,imm8 [vmi:fv: evex.nds.256.66.0f.w1 72 /0 ib ] AVX512VL,AVX512,FUTURE
+VPRORQ zmmreg|mask|z,zmmrm512|b64*,imm8 [vmi:fv: evex.nds.512.66.0f.w1 72 /0 ib ] AVX512,FUTURE
+VPRORVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPRORVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VPRORVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 14 /r ] AVX512,FUTURE
+VPRORVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 14 /r ] AVX512VL,AVX512,FUTURE
+VPRORVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 14 /r ] AVX512VL,AVX512,FUTURE
+VPRORVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 14 /r ] AVX512,FUTURE
+VPSADBW xmmreg,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig f6 /r ] AVX512VL,AVX512BW,FUTURE
+VPSADBW ymmreg,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig f6 /r ] AVX512VL,AVX512BW,FUTURE
+VPSADBW zmmreg,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig f6 /r ] AVX512BW,FUTURE
+VPSCATTERDD xmem32|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w0 a0 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERDD ymem32|mask,ymmreg [mr:t1s: vsiby evex.256.66.0f38.w0 a0 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERDD zmem32|mask,zmmreg [mr:t1s: vsibz evex.512.66.0f38.w0 a0 /r ] AVX512,FUTURE
+VPSCATTERDQ xmem64|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w1 a0 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERDQ xmem64|mask,ymmreg [mr:t1s: vsibx evex.256.66.0f38.w1 a0 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERDQ ymem64|mask,zmmreg [mr:t1s: vsiby evex.512.66.0f38.w1 a0 /r ] AVX512,FUTURE
+VPSCATTERQD xmem32|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w0 a1 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERQD ymem32|mask,xmmreg [mr:t1s: vsiby evex.256.66.0f38.w0 a1 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERQD zmem32|mask,ymmreg [mr:t1s: vsibz evex.512.66.0f38.w0 a1 /r ] AVX512,FUTURE
+VPSCATTERQQ xmem64|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w1 a1 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERQQ ymem64|mask,ymmreg [mr:t1s: vsiby evex.256.66.0f38.w1 a1 /r ] AVX512VL,AVX512,FUTURE
+VPSCATTERQQ zmem64|mask,zmmreg [mr:t1s: vsibz evex.512.66.0f38.w1 a1 /r ] AVX512,FUTURE
+VPSHUFB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.wig 00 /r ] AVX512VL,AVX512BW,FUTURE
+VPSHUFB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.wig 00 /r ] AVX512VL,AVX512BW,FUTURE
+VPSHUFB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.wig 00 /r ] AVX512BW,FUTURE
+VPSHUFD xmmreg|mask|z,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f.w0 70 /r ib ] AVX512VL,AVX512,FUTURE
+VPSHUFD ymmreg|mask|z,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f.w0 70 /r ib ] AVX512VL,AVX512,FUTURE
+VPSHUFD zmmreg|mask|z,zmmrm512|b32,imm8 [rmi:fv: evex.512.66.0f.w0 70 /r ib ] AVX512,FUTURE
+VPSHUFHW xmmreg|mask|z,xmmrm128,imm8 [rmi:fvm: evex.128.f3.0f.wig 70 /r ib ] AVX512VL,AVX512BW,FUTURE
+VPSHUFHW ymmreg|mask|z,ymmrm256,imm8 [rmi:fvm: evex.256.f3.0f.wig 70 /r ib ] AVX512VL,AVX512BW,FUTURE
+VPSHUFHW zmmreg|mask|z,zmmrm512,imm8 [rmi:fvm: evex.512.f3.0f.wig 70 /r ib ] AVX512BW,FUTURE
+VPSHUFLW xmmreg|mask|z,xmmrm128,imm8 [rmi:fvm: evex.128.f2.0f.wig 70 /r ib ] AVX512VL,AVX512BW,FUTURE
+VPSHUFLW ymmreg|mask|z,ymmrm256,imm8 [rmi:fvm: evex.256.f2.0f.wig 70 /r ib ] AVX512VL,AVX512BW,FUTURE
+VPSHUFLW zmmreg|mask|z,zmmrm512,imm8 [rmi:fvm: evex.512.f2.0f.wig 70 /r ib ] AVX512BW,FUTURE
+VPSLLD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w0 f2 /r ] AVX512VL,AVX512,FUTURE
+VPSLLD ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w0 f2 /r ] AVX512VL,AVX512,FUTURE
+VPSLLD zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w0 f2 /r ] AVX512,FUTURE
+VPSLLD xmmreg|mask|z,xmmrm128|b32*,imm8 [vmi:fv: evex.nds.128.66.0f.w0 72 /6 ib ] AVX512VL,AVX512,FUTURE
+VPSLLD ymmreg|mask|z,ymmrm256|b32*,imm8 [vmi:fv: evex.nds.256.66.0f.w0 72 /6 ib ] AVX512VL,AVX512,FUTURE
+VPSLLD zmmreg|mask|z,zmmrm512|b32*,imm8 [vmi:fv: evex.nds.512.66.0f.w0 72 /6 ib ] AVX512,FUTURE
+VPSLLDQ xmmreg,xmmrm128*,imm8 [vmi:fvm: evex.nds.128.66.0f.wig 73 /7 ib ] AVX512VL,AVX512BW,FUTURE
+VPSLLDQ ymmreg,ymmrm256*,imm8 [vmi:fvm: evex.nds.256.66.0f.wig 73 /7 ib ] AVX512VL,AVX512BW,FUTURE
+VPSLLDQ zmmreg,zmmrm512*,imm8 [vmi:fvm: evex.nds.512.66.0f.wig 73 /7 ib ] AVX512BW,FUTURE
+VPSLLQ xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w1 f3 /r ] AVX512VL,AVX512,FUTURE
+VPSLLQ ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w1 f3 /r ] AVX512VL,AVX512,FUTURE
+VPSLLQ zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w1 f3 /r ] AVX512,FUTURE
+VPSLLQ xmmreg|mask|z,xmmrm128|b64*,imm8 [vmi:fv: evex.nds.128.66.0f.w1 73 /6 ib ] AVX512VL,AVX512,FUTURE
+VPSLLQ ymmreg|mask|z,ymmrm256|b64*,imm8 [vmi:fv: evex.nds.256.66.0f.w1 73 /6 ib ] AVX512VL,AVX512,FUTURE
+VPSLLQ zmmreg|mask|z,zmmrm512|b64*,imm8 [vmi:fv: evex.nds.512.66.0f.w1 73 /6 ib ] AVX512,FUTURE
+VPSLLVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 47 /r ] AVX512VL,AVX512,FUTURE
+VPSLLVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 47 /r ] AVX512VL,AVX512,FUTURE
+VPSLLVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 47 /r ] AVX512,FUTURE
+VPSLLVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 47 /r ] AVX512VL,AVX512,FUTURE
+VPSLLVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 47 /r ] AVX512VL,AVX512,FUTURE
+VPSLLVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 47 /r ] AVX512,FUTURE
+VPSLLVW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 12 /r ] AVX512VL,AVX512BW,FUTURE
+VPSLLVW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 12 /r ] AVX512VL,AVX512BW,FUTURE
+VPSLLVW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 12 /r ] AVX512BW,FUTURE
+VPSLLW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.wig f1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSLLW ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.wig f1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSLLW zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.wig f1 /r ] AVX512BW,FUTURE
+VPSLLW xmmreg|mask|z,xmmrm128*,imm8 [vmi:fvm: evex.nds.128.66.0f.wig 71 /6 ib ] AVX512VL,AVX512BW,FUTURE
+VPSLLW ymmreg|mask|z,ymmrm256*,imm8 [vmi:fvm: evex.nds.256.66.0f.wig 71 /6 ib ] AVX512VL,AVX512BW,FUTURE
+VPSLLW zmmreg|mask|z,zmmrm512*,imm8 [vmi:fvm: evex.nds.512.66.0f.wig 71 /6 ib ] AVX512BW,FUTURE
+VPSRAD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w0 e2 /r ] AVX512VL,AVX512,FUTURE
+VPSRAD ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w0 e2 /r ] AVX512VL,AVX512,FUTURE
+VPSRAD zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w0 e2 /r ] AVX512,FUTURE
+VPSRAD xmmreg|mask|z,xmmrm128|b32*,imm8 [vmi:fv: evex.nds.128.66.0f.w0 72 /4 ib ] AVX512VL,AVX512,FUTURE
+VPSRAD ymmreg|mask|z,ymmrm256|b32*,imm8 [vmi:fv: evex.nds.256.66.0f.w0 72 /4 ib ] AVX512VL,AVX512,FUTURE
+VPSRAD zmmreg|mask|z,zmmrm512|b32*,imm8 [vmi:fv: evex.nds.512.66.0f.w0 72 /4 ib ] AVX512,FUTURE
+VPSRAQ xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w1 e2 /r ] AVX512VL,AVX512,FUTURE
+VPSRAQ ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w1 e2 /r ] AVX512VL,AVX512,FUTURE
+VPSRAQ zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w1 e2 /r ] AVX512,FUTURE
+VPSRAQ xmmreg|mask|z,xmmrm128|b64*,imm8 [vmi:fv: evex.nds.128.66.0f.w1 72 /4 ib ] AVX512VL,AVX512,FUTURE
+VPSRAQ ymmreg|mask|z,ymmrm256|b64*,imm8 [vmi:fv: evex.nds.256.66.0f.w1 72 /4 ib ] AVX512VL,AVX512,FUTURE
+VPSRAQ zmmreg|mask|z,zmmrm512|b64*,imm8 [vmi:fv: evex.nds.512.66.0f.w1 72 /4 ib ] AVX512,FUTURE
+VPSRAVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 46 /r ] AVX512VL,AVX512,FUTURE
+VPSRAVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 46 /r ] AVX512VL,AVX512,FUTURE
+VPSRAVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 46 /r ] AVX512,FUTURE
+VPSRAVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 46 /r ] AVX512VL,AVX512,FUTURE
+VPSRAVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 46 /r ] AVX512VL,AVX512,FUTURE
+VPSRAVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 46 /r ] AVX512,FUTURE
+VPSRAVW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 11 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRAVW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 11 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRAVW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 11 /r ] AVX512BW,FUTURE
+VPSRAW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.wig e1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRAW ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.wig e1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRAW zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.wig e1 /r ] AVX512BW,FUTURE
+VPSRAW xmmreg|mask|z,xmmrm128*,imm8 [vmi:fvm: evex.nds.128.66.0f.wig 71 /4 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRAW ymmreg|mask|z,ymmrm256*,imm8 [vmi:fvm: evex.nds.256.66.0f.wig 71 /4 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRAW zmmreg|mask|z,zmmrm512*,imm8 [vmi:fvm: evex.nds.512.66.0f.wig 71 /4 ib ] AVX512BW,FUTURE
+VPSRLD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w0 d2 /r ] AVX512VL,AVX512,FUTURE
+VPSRLD ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w0 d2 /r ] AVX512VL,AVX512,FUTURE
+VPSRLD zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w0 d2 /r ] AVX512,FUTURE
+VPSRLD xmmreg|mask|z,xmmrm128|b32*,imm8 [vmi:fv: evex.nds.128.66.0f.w0 72 /2 ib ] AVX512VL,AVX512,FUTURE
+VPSRLD ymmreg|mask|z,ymmrm256|b32*,imm8 [vmi:fv: evex.nds.256.66.0f.w0 72 /2 ib ] AVX512VL,AVX512,FUTURE
+VPSRLD zmmreg|mask|z,zmmrm512|b32*,imm8 [vmi:fv: evex.nds.512.66.0f.w0 72 /2 ib ] AVX512,FUTURE
+VPSRLDQ xmmreg,xmmrm128*,imm8 [vmi:fvm: evex.nds.128.66.0f.wig 73 /3 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRLDQ ymmreg,ymmrm256*,imm8 [vmi:fvm: evex.nds.256.66.0f.wig 73 /3 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRLDQ zmmreg,zmmrm512*,imm8 [vmi:fvm: evex.nds.512.66.0f.wig 73 /3 ib ] AVX512BW,FUTURE
+VPSRLQ xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.w1 d3 /r ] AVX512VL,AVX512,FUTURE
+VPSRLQ ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.w1 d3 /r ] AVX512VL,AVX512,FUTURE
+VPSRLQ zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.w1 d3 /r ] AVX512,FUTURE
+VPSRLQ xmmreg|mask|z,xmmrm128|b64*,imm8 [vmi:fv: evex.nds.128.66.0f.w1 73 /2 ib ] AVX512VL,AVX512,FUTURE
+VPSRLQ ymmreg|mask|z,ymmrm256|b64*,imm8 [vmi:fv: evex.nds.256.66.0f.w1 73 /2 ib ] AVX512VL,AVX512,FUTURE
+VPSRLQ zmmreg|mask|z,zmmrm512|b64*,imm8 [vmi:fv: evex.nds.512.66.0f.w1 73 /2 ib ] AVX512,FUTURE
+VPSRLVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 45 /r ] AVX512VL,AVX512,FUTURE
+VPSRLVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 45 /r ] AVX512VL,AVX512,FUTURE
+VPSRLVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 45 /r ] AVX512,FUTURE
+VPSRLVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 45 /r ] AVX512VL,AVX512,FUTURE
+VPSRLVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 45 /r ] AVX512VL,AVX512,FUTURE
+VPSRLVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 45 /r ] AVX512,FUTURE
+VPSRLVW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRLVW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 10 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRLVW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 10 /r ] AVX512BW,FUTURE
+VPSRLW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:m128: evex.nds.128.66.0f.wig d1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRLW ymmreg|mask|z,ymmreg*,xmmrm128 [rvm:m128: evex.nds.256.66.0f.wig d1 /r ] AVX512VL,AVX512BW,FUTURE
+VPSRLW zmmreg|mask|z,zmmreg*,xmmrm128 [rvm:m128: evex.nds.512.66.0f.wig d1 /r ] AVX512BW,FUTURE
+VPSRLW xmmreg|mask|z,xmmrm128*,imm8 [vmi:fvm: evex.nds.128.66.0f.wig 71 /2 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRLW ymmreg|mask|z,ymmrm256*,imm8 [vmi:fvm: evex.nds.256.66.0f.wig 71 /2 ib ] AVX512VL,AVX512BW,FUTURE
+VPSRLW zmmreg|mask|z,zmmrm512*,imm8 [vmi:fvm: evex.nds.512.66.0f.wig 71 /2 ib ] AVX512BW,FUTURE
+VPSUBB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig f8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig f8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig f8 /r ] AVX512BW,FUTURE
+VPSUBD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 fa /r ] AVX512VL,AVX512,FUTURE
+VPSUBD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 fa /r ] AVX512VL,AVX512,FUTURE
+VPSUBD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 fa /r ] AVX512,FUTURE
+VPSUBQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 fb /r ] AVX512VL,AVX512,FUTURE
+VPSUBQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 fb /r ] AVX512VL,AVX512,FUTURE
+VPSUBQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 fb /r ] AVX512,FUTURE
+VPSUBSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e8 /r ] AVX512BW,FUTURE
+VPSUBSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig e9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig e9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig e9 /r ] AVX512BW,FUTURE
+VPSUBUSB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig d8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBUSB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig d8 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBUSB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig d8 /r ] AVX512BW,FUTURE
+VPSUBUSW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig d9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBUSW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig d9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBUSW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig d9 /r ] AVX512BW,FUTURE
+VPSUBW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig f9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig f9 /r ] AVX512VL,AVX512BW,FUTURE
+VPSUBW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig f9 /r ] AVX512BW,FUTURE
+VPTERNLOGD xmmreg|mask|z,xmmreg,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 25 /r ib ] AVX512VL,AVX512,FUTURE
+VPTERNLOGD ymmreg|mask|z,ymmreg,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 25 /r ib ] AVX512VL,AVX512,FUTURE
+VPTERNLOGD zmmreg|mask|z,zmmreg,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 25 /r ib ] AVX512,FUTURE
+VPTERNLOGQ xmmreg|mask|z,xmmreg,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 25 /r ib ] AVX512VL,AVX512,FUTURE
+VPTERNLOGQ ymmreg|mask|z,ymmreg,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 25 /r ib ] AVX512VL,AVX512,FUTURE
+VPTERNLOGQ zmmreg|mask|z,zmmreg,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 25 /r ib ] AVX512,FUTURE
+VPTESTMB kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTMB kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTMB kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 26 /r ] AVX512BW,FUTURE
+VPTESTMD kreg|mask,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTMD kreg|mask,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTMD kreg|mask,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f38.w0 27 /r ] AVX512,FUTURE
+VPTESTMQ kreg|mask,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTMQ kreg|mask,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTMQ kreg|mask,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f38.w1 27 /r ] AVX512,FUTURE
+VPTESTMW kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w1 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTMW kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w1 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTMW kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w1 26 /r ] AVX512BW,FUTURE
+VPTESTNMB kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.f3.0f38.w0 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTNMB kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.f3.0f38.w0 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTNMB kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.f3.0f38.w0 26 /r ] AVX512BW,FUTURE
+VPTESTNMD kreg|mask,xmmreg,xmmrm128|b32 [rvm:fv: evex.nds.128.f3.0f38.w0 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTNMD kreg|mask,ymmreg,ymmrm256|b32 [rvm:fv: evex.nds.256.f3.0f38.w0 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTNMD kreg|mask,zmmreg,zmmrm512|b32 [rvm:fv: evex.nds.512.f3.0f38.w0 27 /r ] AVX512,FUTURE
+VPTESTNMQ kreg|mask,xmmreg,xmmrm128|b64 [rvm:fv: evex.nds.128.f3.0f38.w1 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTNMQ kreg|mask,ymmreg,ymmrm256|b64 [rvm:fv: evex.nds.256.f3.0f38.w1 27 /r ] AVX512VL,AVX512,FUTURE
+VPTESTNMQ kreg|mask,zmmreg,zmmrm512|b64 [rvm:fv: evex.nds.512.f3.0f38.w1 27 /r ] AVX512,FUTURE
+VPTESTNMW kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.f3.0f38.w1 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTNMW kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.f3.0f38.w1 26 /r ] AVX512VL,AVX512BW,FUTURE
+VPTESTNMW kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.f3.0f38.w1 26 /r ] AVX512BW,FUTURE
+VPUNPCKHBW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 68 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKHBW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 68 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKHBW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 68 /r ] AVX512BW,FUTURE
+VPUNPCKHDQ xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 6a /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKHDQ ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 6a /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKHDQ zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 6a /r ] AVX512,FUTURE
+VPUNPCKHQDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 6d /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKHQDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 6d /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKHQDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 6d /r ] AVX512,FUTURE
+VPUNPCKHWD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 69 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKHWD ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 69 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKHWD zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 69 /r ] AVX512BW,FUTURE
+VPUNPCKLBW xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 60 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKLBW ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 60 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKLBW zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 60 /r ] AVX512BW,FUTURE
+VPUNPCKLDQ xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 62 /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKLDQ ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 62 /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKLDQ zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 62 /r ] AVX512,FUTURE
+VPUNPCKLQDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 6c /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKLQDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 6c /r ] AVX512VL,AVX512,FUTURE
+VPUNPCKLQDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 6c /r ] AVX512,FUTURE
+VPUNPCKLWD xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f.wig 61 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKLWD ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f.wig 61 /r ] AVX512VL,AVX512BW,FUTURE
+VPUNPCKLWD zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f.wig 61 /r ] AVX512BW,FUTURE
+VPXORD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f.w0 ef /r ] AVX512VL,AVX512,FUTURE
+VPXORD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f.w0 ef /r ] AVX512VL,AVX512,FUTURE
+VPXORD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.66.0f.w0 ef /r ] AVX512,FUTURE
+VPXORQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 ef /r ] AVX512VL,AVX512,FUTURE
+VPXORQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 ef /r ] AVX512VL,AVX512,FUTURE
+VPXORQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 ef /r ] AVX512,FUTURE
+VRANGEPD xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 50 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VRANGEPD ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 50 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VRANGEPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|sae,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 50 /r ib ] AVX512DQ,FUTURE
+VRANGEPS xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 50 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VRANGEPS ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 50 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VRANGEPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|sae,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 50 /r ib ] AVX512DQ,FUTURE
+VRANGESD xmmreg|mask|z,xmmreg*,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 51 /r ib ] AVX512DQ,FUTURE
+VRANGESS xmmreg|mask|z,xmmreg*,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 51 /r ib ] AVX512DQ,FUTURE
+VRCP14PD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 4c /r ] AVX512VL,AVX512,FUTURE
+VRCP14PD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 4c /r ] AVX512VL,AVX512,FUTURE
+VRCP14PD zmmreg|mask|z,zmmrm512|b64 [rm:fv: evex.512.66.0f38.w1 4c /r ] AVX512,FUTURE
+VRCP14PS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 4c /r ] AVX512VL,AVX512,FUTURE
+VRCP14PS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 4c /r ] AVX512VL,AVX512,FUTURE
+VRCP14PS zmmreg|mask|z,zmmrm512|b32 [rm:fv: evex.512.66.0f38.w0 4c /r ] AVX512,FUTURE
+VRCP14SD xmmreg|mask|z,xmmreg*,xmmrm64 [rvm:t1s: evex.nds.128.66.0f38.w1 4d /r ] AVX512,FUTURE
+VRCP14SS xmmreg|mask|z,xmmreg*,xmmrm32 [rvm:t1s: evex.nds.128.66.0f38.w0 4d /r ] AVX512,FUTURE
+VRCP28PD zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f38.w1 ca /r ] AVX512ER,FUTURE
+VRCP28PS zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.66.0f38.w0 ca /r ] AVX512ER,FUTURE
+VRCP28SD xmmreg|mask|z,xmmreg*,xmmrm64|sae [rvm:t1s: evex.nds.128.66.0f38.w1 cb /r ] AVX512ER,FUTURE
+VRCP28SS xmmreg|mask|z,xmmreg*,xmmrm32|sae [rvm:t1s: evex.nds.128.66.0f38.w0 cb /r ] AVX512ER,FUTURE
+VREDUCEPD xmmreg|mask|z,xmmrm128|b64,imm8 [rmi:fv: evex.128.66.0f3a.w1 56 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VREDUCEPD ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 56 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VREDUCEPD zmmreg|mask|z,zmmrm512|b64|sae,imm8 [rmi:fv: evex.512.66.0f3a.w1 56 /r ib ] AVX512DQ,FUTURE
+VREDUCEPS xmmreg|mask|z,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f3a.w0 56 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VREDUCEPS ymmreg|mask|z,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f3a.w0 56 /r ib ] AVX512VL,AVX512DQ,FUTURE
+VREDUCEPS zmmreg|mask|z,zmmrm512|b32|sae,imm8 [rmi:fv: evex.512.66.0f3a.w0 56 /r ib ] AVX512DQ,FUTURE
+VREDUCESD xmmreg|mask|z,xmmreg*,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 57 /r ib ] AVX512DQ,FUTURE
+VREDUCESS xmmreg|mask|z,xmmreg*,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 57 /r ib ] AVX512DQ,FUTURE
+VRNDSCALEPD xmmreg|mask|z,xmmrm128|b64,imm8 [rmi:fv: evex.128.66.0f3a.w1 09 /r ib ] AVX512VL,AVX512,FUTURE
+VRNDSCALEPD ymmreg|mask|z,ymmrm256|b64,imm8 [rmi:fv: evex.256.66.0f3a.w1 09 /r ib ] AVX512VL,AVX512,FUTURE
+VRNDSCALEPD zmmreg|mask|z,zmmrm512|b64|sae,imm8 [rmi:fv: evex.512.66.0f3a.w1 09 /r ib ] AVX512,FUTURE
+VRNDSCALEPS xmmreg|mask|z,xmmrm128|b32,imm8 [rmi:fv: evex.128.66.0f3a.w0 08 /r ib ] AVX512VL,AVX512,FUTURE
+VRNDSCALEPS ymmreg|mask|z,ymmrm256|b32,imm8 [rmi:fv: evex.256.66.0f3a.w0 08 /r ib ] AVX512VL,AVX512,FUTURE
+VRNDSCALEPS zmmreg|mask|z,zmmrm512|b32|sae,imm8 [rmi:fv: evex.512.66.0f3a.w0 08 /r ib ] AVX512,FUTURE
+VRNDSCALESD xmmreg|mask|z,xmmreg*,xmmrm64|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w1 0b /r ib ] AVX512,FUTURE
+VRNDSCALESS xmmreg|mask|z,xmmreg*,xmmrm32|sae,imm8 [rvmi:t1s: evex.nds.128.66.0f3a.w0 0a /r ib ] AVX512,FUTURE
+VRSQRT14PD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f38.w1 4e /r ] AVX512VL,AVX512,FUTURE
+VRSQRT14PD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f38.w1 4e /r ] AVX512VL,AVX512,FUTURE
+VRSQRT14PD zmmreg|mask|z,zmmrm512|b64 [rm:fv: evex.512.66.0f38.w1 4e /r ] AVX512,FUTURE
+VRSQRT14PS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.66.0f38.w0 4e /r ] AVX512VL,AVX512,FUTURE
+VRSQRT14PS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.66.0f38.w0 4e /r ] AVX512VL,AVX512,FUTURE
+VRSQRT14PS zmmreg|mask|z,zmmrm512|b32 [rm:fv: evex.512.66.0f38.w0 4e /r ] AVX512,FUTURE
+VRSQRT14SD xmmreg|mask|z,xmmreg*,xmmrm64 [rvm:t1s: evex.nds.128.66.0f38.w1 4f /r ] AVX512,FUTURE
+VRSQRT14SS xmmreg|mask|z,xmmreg*,xmmrm32 [rvm:t1s: evex.nds.128.66.0f38.w0 4f /r ] AVX512,FUTURE
+VRSQRT28PD zmmreg|mask|z,zmmrm512|b64|sae [rm:fv: evex.512.66.0f38.w1 cc /r ] AVX512ER,FUTURE
+VRSQRT28PS zmmreg|mask|z,zmmrm512|b32|sae [rm:fv: evex.512.66.0f38.w0 cc /r ] AVX512ER,FUTURE
+VRSQRT28SD xmmreg|mask|z,xmmreg*,xmmrm64|sae [rvm:t1s: evex.nds.128.66.0f38.w1 cd /r ] AVX512ER,FUTURE
+VRSQRT28SS xmmreg|mask|z,xmmreg*,xmmrm32|sae [rvm:t1s: evex.nds.128.66.0f38.w0 cd /r ] AVX512ER,FUTURE
+VSCALEFPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f38.w1 2c /r ] AVX512VL,AVX512,FUTURE
+VSCALEFPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f38.w1 2c /r ] AVX512VL,AVX512,FUTURE
+VSCALEFPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f38.w1 2c /r ] AVX512,FUTURE
+VSCALEFPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.66.0f38.w0 2c /r ] AVX512VL,AVX512,FUTURE
+VSCALEFPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.66.0f38.w0 2c /r ] AVX512VL,AVX512,FUTURE
+VSCALEFPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|er [rvm:fv: evex.nds.512.66.0f38.w0 2c /r ] AVX512,FUTURE
+VSCALEFSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.66.0f38.w1 2d /r ] AVX512,FUTURE
+VSCALEFSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.66.0f38.w0 2d /r ] AVX512,FUTURE
+VSCATTERDPD xmem64|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w1 a2 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERDPD xmem64|mask,ymmreg [mr:t1s: vsibx evex.256.66.0f38.w1 a2 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERDPD ymem64|mask,zmmreg [mr:t1s: vsiby evex.512.66.0f38.w1 a2 /r ] AVX512,FUTURE
+VSCATTERDPS xmem32|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w0 a2 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERDPS ymem32|mask,ymmreg [mr:t1s: vsiby evex.256.66.0f38.w0 a2 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERDPS zmem32|mask,zmmreg [mr:t1s: vsibz evex.512.66.0f38.w0 a2 /r ] AVX512,FUTURE
+VSCATTERPF0DPD ymem64|mask [m:t1s: vsiby evex.512.66.0f38.w1 c6 /5 ] AVX512PF,FUTURE
+VSCATTERPF0DPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c6 /5 ] AVX512PF,FUTURE
+VSCATTERPF0QPD zmem64|mask [m:t1s: vsibz evex.512.66.0f38.w1 c7 /5 ] AVX512PF,FUTURE
+VSCATTERPF0QPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c7 /5 ] AVX512PF,FUTURE
+VSCATTERPF1DPD ymem64|mask [m:t1s: vsiby evex.512.66.0f38.w1 c6 /6 ] AVX512PF,FUTURE
+VSCATTERPF1DPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c6 /6 ] AVX512PF,FUTURE
+VSCATTERPF1QPD zmem64|mask [m:t1s: vsibz evex.512.66.0f38.w1 c7 /6 ] AVX512PF,FUTURE
+VSCATTERPF1QPS zmem32|mask [m:t1s: vsibz evex.512.66.0f38.w0 c7 /6 ] AVX512PF,FUTURE
+VSCATTERQPD xmem64|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w1 a3 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERQPD ymem64|mask,ymmreg [mr:t1s: vsiby evex.256.66.0f38.w1 a3 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERQPD zmem64|mask,zmmreg [mr:t1s: vsibz evex.512.66.0f38.w1 a3 /r ] AVX512,FUTURE
+VSCATTERQPS xmem32|mask,xmmreg [mr:t1s: vsibx evex.128.66.0f38.w0 a3 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERQPS ymem32|mask,xmmreg [mr:t1s: vsiby evex.256.66.0f38.w0 a3 /r ] AVX512VL,AVX512,FUTURE
+VSCATTERQPS zmem32|mask,ymmreg [mr:t1s: vsibz evex.512.66.0f38.w0 a3 /r ] AVX512,FUTURE
+VSHUFF32X4 ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 23 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFF32X4 zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 23 /r ib ] AVX512,FUTURE
+VSHUFF64X2 ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 23 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFF64X2 zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 23 /r ib ] AVX512,FUTURE
+VSHUFI32X4 ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 43 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFI32X4 zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 43 /r ib ] AVX512,FUTURE
+VSHUFI64X2 ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 43 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFI64X2 zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 43 /r ib ] AVX512,FUTURE
+VSHUFPD xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f.w1 c6 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFPD ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f.w1 c6 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFPD zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f.w1 c6 /r ib ] AVX512,FUTURE
+VSHUFPS xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.0f.w0 c6 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFPS ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.0f.w0 c6 /r ib ] AVX512VL,AVX512,FUTURE
+VSHUFPS zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.0f.w0 c6 /r ib ] AVX512,FUTURE
+VSQRTPD xmmreg|mask|z,xmmrm128|b64 [rm:fv: evex.128.66.0f.w1 51 /r ] AVX512VL,AVX512,FUTURE
+VSQRTPD ymmreg|mask|z,ymmrm256|b64 [rm:fv: evex.256.66.0f.w1 51 /r ] AVX512VL,AVX512,FUTURE
+VSQRTPD zmmreg|mask|z,zmmrm512|b64|er [rm:fv: evex.512.66.0f.w1 51 /r ] AVX512,FUTURE
+VSQRTPS xmmreg|mask|z,xmmrm128|b32 [rm:fv: evex.128.0f.w0 51 /r ] AVX512VL,AVX512,FUTURE
+VSQRTPS ymmreg|mask|z,ymmrm256|b32 [rm:fv: evex.256.0f.w0 51 /r ] AVX512VL,AVX512,FUTURE
+VSQRTPS zmmreg|mask|z,zmmrm512|b32|er [rm:fv: evex.512.0f.w0 51 /r ] AVX512,FUTURE
+VSQRTSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 51 /r ] AVX512,FUTURE
+VSQRTSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.f3.0f.w0 51 /r ] AVX512,FUTURE
+VSUBPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 5c /r ] AVX512VL,AVX512,FUTURE
+VSUBPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 5c /r ] AVX512VL,AVX512,FUTURE
+VSUBPD zmmreg|mask|z,zmmreg*,zmmrm512|b64|er [rvm:fv: evex.nds.512.66.0f.w1 5c /r ] AVX512,FUTURE
+VSUBPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 5c /r ] AVX512VL,AVX512,FUTURE
+VSUBPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 5c /r ] AVX512VL,AVX512,FUTURE
+VSUBPS zmmreg|mask|z,zmmreg*,zmmrm512|b32|er [rvm:fv: evex.nds.512.0f.w0 5c /r ] AVX512,FUTURE
+VSUBSD xmmreg|mask|z,xmmreg*,xmmrm64|er [rvm:t1s: evex.nds.128.f2.0f.w1 5c /r ] AVX512,FUTURE
+VSUBSS xmmreg|mask|z,xmmreg*,xmmrm32|er [rvm:t1s: evex.nds.128.f3.0f.w0 5c /r ] AVX512,FUTURE
+VUCOMISD xmmreg,xmmrm64|sae [rm:t1s: evex.128.66.0f.w1 2e /r ] AVX512,FUTURE
+VUCOMISS xmmreg,xmmrm32|sae [rm:t1s: evex.128.0f.w0 2e /r ] AVX512,FUTURE
+VUNPCKHPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 15 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKHPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 15 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKHPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 15 /r ] AVX512,FUTURE
+VUNPCKHPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKHPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 15 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKHPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 15 /r ] AVX512,FUTURE
+VUNPCKLPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 14 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKLPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 14 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKLPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 14 /r ] AVX512,FUTURE
+VUNPCKLPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKLPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 14 /r ] AVX512VL,AVX512,FUTURE
+VUNPCKLPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 14 /r ] AVX512,FUTURE
+VXORPD xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvm:fv: evex.nds.128.66.0f.w1 57 /r ] AVX512VL,AVX512DQ,FUTURE
+VXORPD ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvm:fv: evex.nds.256.66.0f.w1 57 /r ] AVX512VL,AVX512DQ,FUTURE
+VXORPD zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvm:fv: evex.nds.512.66.0f.w1 57 /r ] AVX512DQ,FUTURE
+VXORPS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.nds.128.0f.w0 57 /r ] AVX512VL,AVX512DQ,FUTURE
+VXORPS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.nds.256.0f.w0 57 /r ] AVX512VL,AVX512DQ,FUTURE
+VXORPS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.nds.512.0f.w0 57 /r ] AVX512DQ,FUTURE
+; MJC PUBLIC END
+
+;# Intel memory protection keys for userspace (PKU aka PKEYs)
+RDPKRU void [ 0f 01 ee] X64,FUTURE
+WRPKRU void [ 0f 01 ef] X64,FUTURE
+
+;# Read Processor ID
+RDPID reg32 [m: f3 0f c7 /7] NOLONG,FUTURE
+RDPID reg64 [m: o64nw f3 0f c7 /7] X64,FUTURE
+RDPID reg32 [m: f3 0f c7 /7] X64,UNDOC,FUTURE
+
+;# New memory instructions
+CLFLUSHOPT mem [m: 66 0f ae /7] FUTURE
+CLWB mem [m: 66 0f ae /6] FUTURE
+; This one was killed before it saw the light of day
+PCOMMIT void [ 66 0f ae f8] FUTURE,UNDOC,OBSOLETE
+
+; AMD Zen v1
+CLZERO void [ 0f 01 fc] FUTURE,AMD
+
+;# Processor trace write
+PTWRITE rm32 [m: np 0f ae /4] FUTURE
+PTWRITE rm64 [m: o64 np 0f ae /4] X64,FUTURE
+
+;# Instructions from the Intel Instruction Set Extensions,
+;# doc 319433-034 May 2018
+CLDEMOTE mem [m: np 0f 1c /0] FUTURE
+MOVDIRI mem32,reg32 [mr: np 0f 38 f9 /r] FUTURE,SD
+MOVDIRI mem64,reg64 [mr: o64 0f 38 f9 /r] FUTURE,X64,SQ
+MOVDIR64B reg16,mem512 [rm: a16 66 0f 38 f8 /r] FUTURE,NOLONG
+MOVDIR64B reg32,mem512 [rm: a32 66 0f 38 f8 /r] FUTURE
+MOVDIR64B reg64,mem512 [rm: a64 66 0f 38 f8 /r] FUTURE,X64
+PCONFIG void [ np 0f 01 c5] FUTURE
+TPAUSE reg32 [m: 66 0f ae /6] FUTURE
+TPAUSE reg32,reg_edx,reg_eax [m--: 66 0f ae /6] FUTURE,ND
+UMONITOR reg16 [m: a16 f3 0f ae /6] FUTURE,NOLONG
+UMONITOR reg32 [m: a32 f3 0f ae /6] FUTURE
+UMONITOR reg64 [m: a64 f3 0f ae /6] FUTURE,X64
+UMWAIT reg32 [m: f2 0f ae /6] FUTURE
+UMWAIT reg32,reg_edx,reg_eax [m--: f2 0f ae /6] FUTURE,ND
+WBNOINVD void [ f3 0f 09] FUTURE
+
+;# Galois field operations (GFNI)
+GF2P8AFFINEINVQB xmmreg,xmmrm128,imm8 [rmi: 66 0f 3a cf /r ib] GFNI,SSE,FUTURE
+VGF2P8AFFINEINVQB xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a.w1 cf /r ib] GFNI,AVX,FUTURE
+VGF2P8AFFINEINVQB ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a.w1 cf /r ib] GFNI,AVX,FUTURE
+VGF2P8AFFINEINVQB xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 cf /r ib] GFNI,AVX512VL,FUTURE
+VGF2P8AFFINEINVQB ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 cf /r ib] GFNI,AVX512VL,FUTURE
+VGF2P8AFFINEINVQB zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 cf /r ib] GFNI,AVX512,FUTURE
+GF2P8AFFINEQB xmmreg,xmmrm128,imm8 [rmi: 66 0f 3a ce /r ib] GFNI,SSE,FUTURE
+VGF2P8AFFINEQB xmmreg,xmmreg*,xmmrm128,imm8 [rvmi: vex.nds.128.66.0f3a.w1 ce /r ib] GFNI,AVX,FUTURE
+VGF2P8AFFINEQB ymmreg,ymmreg*,ymmrm256,imm8 [rvmi: vex.nds.256.66.0f3a.w1 ce /r ib] GFNI,AVX,FUTURE
+VGF2P8AFFINEQB xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 ce /r ib] GFNI,AVX512VL,FUTURE
+VGF2P8AFFINEQB ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 ce /r ib] GFNI,AVX512VL,FUTURE
+VGF2P8AFFINEQB zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 ce /r ib] GFNI,AVX512,FUTURE
+GF2P8MULB xmmreg,xmmrm128 [rm: 66 0f 38 cf /r] GFNI,SSE,FUTURE
+VGF2P8MULB xmmreg,xmmreg*,xmmrm128 [rvm: vex.nds.128.66.0f38.w0 cf /r] GFNI,AVX,FUTURE
+VGF2P8MULB ymmreg,ymmreg*,ymmrm256 [rvm: vex.nds.256.66.0f38.w0 cf /r] GFNI,AVX,FUTURE
+VGF2P8MULB xmmreg|mask|z,xmmreg*,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 cf /r] GFNI,AVX512VL,FUTURE
+VGF2P8MULB ymmreg|mask|z,ymmreg*,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 cf /r] GFNI,AVX512VL,FUTURE
+VGF2P8MULB zmmreg|mask|z,zmmreg*,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 cf /r] GFNI,AVX512,FUTURE
+
+;# AVX512 Vector Bit Manipulation Instructions 2
+VPCOMPRESSB mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w0 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSB mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w0 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSB mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w0 63 /r] AVX512VBMI2,FUTURE
+VPCOMPRESSB xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w0 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSB ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w0 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSB zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w0 63 /r] AVX512VBMI2,FUTURE
+VPCOMPRESSW mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w1 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSW mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w1 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSW mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w1 63 /r] AVX512VBMI2,FUTURE
+VPCOMPRESSW xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w1 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSW ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w1 63 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPCOMPRESSW zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w1 63 /r] AVX512VBMI2,FUTURE
+VPEXPANDB mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w0 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDB mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w0 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDB mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w0 62 /r] AVX512VBMI2,FUTURE
+VPEXPANDB xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w0 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDB ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w0 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDB zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w0 62 /r] AVX512VBMI2,FUTURE
+VPEXPANDW mem128|mask,xmmreg [mr:t1s: evex.128.66.0f38.w1 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDW mem256|mask,ymmreg [mr:t1s: evex.256.66.0f38.w1 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDW mem512|mask,zmmreg [mr:t1s: evex.512.66.0f38.w1 62 /r] AVX512VBMI2,FUTURE
+VPEXPANDW xmmreg|mask|z,xmmreg [mr: evex.128.66.0f38.w1 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDW ymmreg|mask|z,ymmreg [mr: evex.256.66.0f38.w1 62 /r] AVX512VBMI2,AVX512VL,FUTURE
+VPEXPANDW zmmreg|mask|z,zmmreg [mr: evex.512.66.0f38.w1 62 /r] AVX512VBMI2,FUTURE
+VPSHLDW xmmreg|mask|z,xmmreg*,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w1 70 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDW ymmreg|mask|z,ymmreg*,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w1 70 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDW zmmreg|mask|z,zmmreg*,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w1 70 /r ib] AVX512VBMI2,FUTURE
+VPSHLDD xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDD ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDD zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 71 /r ib] AVX512VBMI2,FUTURE
+VPSHLDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 71 /r ib] AVX512VBMI2,FUTURE
+VPSHLDVW xmmreg|mask|z,xmmreg*,xmmrm128 [rvmi:fvm: evex.dds.128.66.0f38.w1 70 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVW ymmreg|mask|z,ymmreg*,ymmrm256 [rvmi:fvm: evex.dds.256.66.0f38.w1 70 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVW zmmreg|mask|z,zmmreg*,zmmrm512 [rvmi:fvm: evex.dds.512.66.0f38.w1 70 /r ib] AVX512VBMI2,FUTURE
+VPSHLDVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvmi:fv: evex.dds.128.66.0f38.w0 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvmi:fv: evex.dds.256.66.0f38.w0 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvmi:fv: evex.dds.512.66.0f38.w0 71 /r ib] AVX512VBMI2,FUTURE
+VPSHLDVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvmi:fv: evex.dds.128.66.0f38.w1 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvmi:fv: evex.dds.256.66.0f38.w1 71 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHLDVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvmi:fv: evex.dds.512.66.0f38.w1 71 /r ib] AVX512VBMI2,FUTURE
+VPSHRDW xmmreg|mask|z,xmmreg*,xmmrm128,imm8 [rvmi:fvm: evex.nds.128.66.0f3a.w1 72 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDW ymmreg|mask|z,ymmreg*,ymmrm256,imm8 [rvmi:fvm: evex.nds.256.66.0f3a.w1 72 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDW zmmreg|mask|z,zmmreg*,zmmrm512,imm8 [rvmi:fvm: evex.nds.512.66.0f3a.w1 72 /r ib] AVX512VBMI2,FUTURE
+VPSHRDD xmmreg|mask|z,xmmreg*,xmmrm128|b32,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w0 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDD ymmreg|mask|z,ymmreg*,ymmrm256|b32,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w0 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDD zmmreg|mask|z,zmmreg*,zmmrm512|b32,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w0 73 /r ib] AVX512VBMI2,FUTURE
+VPSHRDQ xmmreg|mask|z,xmmreg*,xmmrm128|b64,imm8 [rvmi:fv: evex.nds.128.66.0f3a.w1 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDQ ymmreg|mask|z,ymmreg*,ymmrm256|b64,imm8 [rvmi:fv: evex.nds.256.66.0f3a.w1 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDQ zmmreg|mask|z,zmmreg*,zmmrm512|b64,imm8 [rvmi:fv: evex.nds.512.66.0f3a.w1 73 /r ib] AVX512VBMI2,FUTURE
+VPSHRDVW xmmreg|mask|z,xmmreg*,xmmrm128 [rvmi:fvm: evex.dds.128.66.0f38.w1 72 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVW ymmreg|mask|z,ymmreg*,ymmrm256 [rvmi:fvm: evex.dds.256.66.0f38.w1 72 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVW zmmreg|mask|z,zmmreg*,zmmrm512 [rvmi:fvm: evex.dds.512.66.0f38.w1 72 /r ib] AVX512VBMI2,FUTURE
+VPSHRDVD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvmi:fv: evex.dds.128.66.0f38.w0 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvmi:fv: evex.dds.256.66.0f38.w0 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvmi:fv: evex.dds.512.66.0f38.w0 73 /r ib] AVX512VBMI2,FUTURE
+VPSHRDVQ xmmreg|mask|z,xmmreg*,xmmrm128|b64 [rvmi:fv: evex.dds.128.66.0f38.w1 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVQ ymmreg|mask|z,ymmreg*,ymmrm256|b64 [rvmi:fv: evex.dds.256.66.0f38.w1 73 /r ib] AVX512VBMI2,AVX512VL,FUTURE
+VPSHRDVQ zmmreg|mask|z,zmmreg*,zmmrm512|b64 [rvmi:fv: evex.dds.512.66.0f38.w1 73 /r ib] AVX512VBMI2,FUTURE
+
+;# AVX512 VNNI
+VPDPBUSD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.dds.128.66.0f38.w0 50 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPBUSD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.dds.256.66.0f38.w0 50 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPBUSD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.dds.512.66.0f38.w0 50 /r] AVX512VNNI,FUTURE
+VPDPBUSDS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.dds.128.66.0f38.w0 51 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPBUSDS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.dds.256.66.0f38.w0 51 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPBUSDS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.dds.512.66.0f38.w0 51 /r] AVX512VNNI,FUTURE
+VPDPWSSD xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.dds.128.66.0f38.w0 52 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPWSSD ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.dds.256.66.0f38.w0 52 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPWSSD zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.dds.512.66.0f38.w0 52 /r] AVX512VNNI,FUTURE
+VPDPWSSDS xmmreg|mask|z,xmmreg*,xmmrm128|b32 [rvm:fv: evex.dds.128.66.0f38.w0 53 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPWSSDS ymmreg|mask|z,ymmreg*,ymmrm256|b32 [rvm:fv: evex.dds.256.66.0f38.w0 53 /r] AVX512VNNI,AVX512VL,FUTURE
+VPDPWSSDS zmmreg|mask|z,zmmreg*,zmmrm512|b32 [rvm:fv: evex.dds.512.66.0f38.w0 53 /r] AVX512VNNI,FUTURE
+
+;# AVX512 Bit Algorithms
+VPOPCNTB xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f38.w0 54 /r] AVX512BITALG,AVX512VL,FUTURE
+VPOPCNTB ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f38.w0 54 /r] AVX512BITALG,AVX512VL,FUTURE
+VPOPCNTB zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f38.w0 54 /r] AVX512BITALG,FUTURE
+VPOPCNTW xmmreg|mask|z,xmmrm128 [rm:fvm: evex.128.66.0f38.w1 54 /r] AVX512BITALG,AVX512VL,FUTURE
+VPOPCNTW ymmreg|mask|z,ymmrm256 [rm:fvm: evex.256.66.0f38.w1 54 /r] AVX512BITALG,AVX512VL,FUTURE
+VPOPCNTW zmmreg|mask|z,zmmrm512 [rm:fvm: evex.512.66.0f38.w1 54 /r] AVX512BITALG,FUTURE
+VPOPCNTD xmmreg|mask|z,xmmrm128 [rm:fv: evex.128.66.0f38.w0 55 /r] AVX512VPOPCNTDQ,AVX512VL,FUTURE
+VPOPCNTD ymmreg|mask|z,ymmrm256 [rm:fv: evex.256.66.0f38.w0 55 /r] AVX512VPOPCNTDQ,AVX512VL,FUTURE
+VPOPCNTD zmmreg|mask|z,zmmrm512 [rm:fv: evex.512.66.0f38.w0 55 /r] AVX512VPOPCNTDQ,FUTURE
+VPOPCNTQ xmmreg|mask|z,xmmrm128 [rm:fv: evex.128.66.0f38.w1 55 /r] AVX512VPOPCNTDQ,AVX512VL,FUTURE
+VPOPCNTQ ymmreg|mask|z,ymmrm256 [rm:fv: evex.256.66.0f38.w1 55 /r] AVX512VPOPCNTDQ,AVX512VL,FUTURE
+VPOPCNTQ zmmreg|mask|z,zmmrm512 [rm:fv: evex.512.66.0f38.w1 55 /r] AVX512VPOPCNTDQ,FUTURE
+VPSHUFBITQMB kreg|mask,xmmreg,xmmrm128 [rvm:fvm: evex.nds.128.66.0f38.w0 8f /r] AVX512BITALG,AVX512VL,FUTURE
+VPSHUFBITQMB kreg|mask,ymmreg,ymmrm256 [rvm:fvm: evex.nds.256.66.0f38.w0 8f /r] AVX512BITALG,AVX512VL,FUTURE
+VPSHUFBITQMB kreg|mask,zmmreg,zmmrm512 [rvm:fvm: evex.nds.512.66.0f38.w0 8f /r] AVX512BITALG,FUTURE
+
+;# AVX512 4-iteration Multiply-Add
+V4FMADDPS zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.512.f2.0f38.w0 9a /r] AVX5124FMAPS,FUTURE,SO
+V4FNMADDPS zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.512.f2.0f38.w0 aa /r] AVX5124FMAPS,FUTURE,SO
+V4FMADDSS zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.lig.f2.0f38.w0 9b /r] AVX5124FMAPS,FUTURE,SO
+V4FNMADDSS zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.lig.f2.0f38.w0 ab /r] AVX5124FMAPS,FUTURE,SO
+
+;# AVX512 4-iteration Dot Product
+V4DPWSSDS zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.512.f2.0f38.w0 53 /r] AVX5124VNNIW,FUTURE,SO
+V4DPWSSD zmmreg|mask|z,zmmreg|rs4,mem [rvm:m128:evex.dds.512.f2.0f38.w0 52 /r] AVX5124VNNIW,FUTURE,SO
+
+;# Intel Software Guard Extensions (SGX)
+ENCLS void [ np 0f 01 cf] SGX,FUTURE
+ENCLU void [ np 0f 01 d7] SGX,FUTURE
+ENCLV void [ np 0f 01 c0] SGX,FUTURE
+
+;# Systematic names for the hinting nop instructions
+; These should be last in the file
+HINT_NOP0 rm16 [m: o16 0f 18 /0] P6,UNDOC
+HINT_NOP0 rm32 [m: o32 0f 18 /0] P6,UNDOC
+HINT_NOP0 rm64 [m: o64 0f 18 /0] X64,UNDOC
+HINT_NOP1 rm16 [m: o16 0f 18 /1] P6,UNDOC
+HINT_NOP1 rm32 [m: o32 0f 18 /1] P6,UNDOC
+HINT_NOP1 rm64 [m: o64 0f 18 /1] X64,UNDOC
+HINT_NOP2 rm16 [m: o16 0f 18 /2] P6,UNDOC
+HINT_NOP2 rm32 [m: o32 0f 18 /2] P6,UNDOC
+HINT_NOP2 rm64 [m: o64 0f 18 /2] X64,UNDOC
+HINT_NOP3 rm16 [m: o16 0f 18 /3] P6,UNDOC
+HINT_NOP3 rm32 [m: o32 0f 18 /3] P6,UNDOC
+HINT_NOP3 rm64 [m: o64 0f 18 /3] X64,UNDOC
+HINT_NOP4 rm16 [m: o16 0f 18 /4] P6,UNDOC
+HINT_NOP4 rm32 [m: o32 0f 18 /4] P6,UNDOC
+HINT_NOP4 rm64 [m: o64 0f 18 /4] X64,UNDOC
+HINT_NOP5 rm16 [m: o16 0f 18 /5] P6,UNDOC
+HINT_NOP5 rm32 [m: o32 0f 18 /5] P6,UNDOC
+HINT_NOP5 rm64 [m: o64 0f 18 /5] X64,UNDOC
+HINT_NOP6 rm16 [m: o16 0f 18 /6] P6,UNDOC
+HINT_NOP6 rm32 [m: o32 0f 18 /6] P6,UNDOC
+HINT_NOP6 rm64 [m: o64 0f 18 /6] X64,UNDOC
+HINT_NOP7 rm16 [m: o16 0f 18 /7] P6,UNDOC
+HINT_NOP7 rm32 [m: o32 0f 18 /7] P6,UNDOC
+HINT_NOP7 rm64 [m: o64 0f 18 /7] X64,UNDOC
+HINT_NOP8 rm16 [m: o16 0f 19 /0] P6,UNDOC
+HINT_NOP8 rm32 [m: o32 0f 19 /0] P6,UNDOC
+HINT_NOP8 rm64 [m: o64 0f 19 /0] X64,UNDOC
+HINT_NOP9 rm16 [m: o16 0f 19 /1] P6,UNDOC
+HINT_NOP9 rm32 [m: o32 0f 19 /1] P6,UNDOC
+HINT_NOP9 rm64 [m: o64 0f 19 /1] X64,UNDOC
+HINT_NOP10 rm16 [m: o16 0f 19 /2] P6,UNDOC
+HINT_NOP10 rm32 [m: o32 0f 19 /2] P6,UNDOC
+HINT_NOP10 rm64 [m: o64 0f 19 /2] X64,UNDOC
+HINT_NOP11 rm16 [m: o16 0f 19 /3] P6,UNDOC
+HINT_NOP11 rm32 [m: o32 0f 19 /3] P6,UNDOC
+HINT_NOP11 rm64 [m: o64 0f 19 /3] X64,UNDOC
+HINT_NOP12 rm16 [m: o16 0f 19 /4] P6,UNDOC
+HINT_NOP12 rm32 [m: o32 0f 19 /4] P6,UNDOC
+HINT_NOP12 rm64 [m: o64 0f 19 /4] X64,UNDOC
+HINT_NOP13 rm16 [m: o16 0f 19 /5] P6,UNDOC
+HINT_NOP13 rm32 [m: o32 0f 19 /5] P6,UNDOC
+HINT_NOP13 rm64 [m: o64 0f 19 /5] X64,UNDOC
+HINT_NOP14 rm16 [m: o16 0f 19 /6] P6,UNDOC
+HINT_NOP14 rm32 [m: o32 0f 19 /6] P6,UNDOC
+HINT_NOP14 rm64 [m: o64 0f 19 /6] X64,UNDOC
+HINT_NOP15 rm16 [m: o16 0f 19 /7] P6,UNDOC
+HINT_NOP15 rm32 [m: o32 0f 19 /7] P6,UNDOC
+HINT_NOP15 rm64 [m: o64 0f 19 /7] X64,UNDOC
+HINT_NOP16 rm16 [m: o16 0f 1a /0] P6,UNDOC
+HINT_NOP16 rm32 [m: o32 0f 1a /0] P6,UNDOC
+HINT_NOP16 rm64 [m: o64 0f 1a /0] X64,UNDOC
+HINT_NOP17 rm16 [m: o16 0f 1a /1] P6,UNDOC
+HINT_NOP17 rm32 [m: o32 0f 1a /1] P6,UNDOC
+HINT_NOP17 rm64 [m: o64 0f 1a /1] X64,UNDOC
+HINT_NOP18 rm16 [m: o16 0f 1a /2] P6,UNDOC
+HINT_NOP18 rm32 [m: o32 0f 1a /2] P6,UNDOC
+HINT_NOP18 rm64 [m: o64 0f 1a /2] X64,UNDOC
+HINT_NOP19 rm16 [m: o16 0f 1a /3] P6,UNDOC
+HINT_NOP19 rm32 [m: o32 0f 1a /3] P6,UNDOC
+HINT_NOP19 rm64 [m: o64 0f 1a /3] X64,UNDOC
+HINT_NOP20 rm16 [m: o16 0f 1a /4] P6,UNDOC
+HINT_NOP20 rm32 [m: o32 0f 1a /4] P6,UNDOC
+HINT_NOP20 rm64 [m: o64 0f 1a /4] X64,UNDOC
+HINT_NOP21 rm16 [m: o16 0f 1a /5] P6,UNDOC
+HINT_NOP21 rm32 [m: o32 0f 1a /5] P6,UNDOC
+HINT_NOP21 rm64 [m: o64 0f 1a /5] X64,UNDOC
+HINT_NOP22 rm16 [m: o16 0f 1a /6] P6,UNDOC
+HINT_NOP22 rm32 [m: o32 0f 1a /6] P6,UNDOC
+HINT_NOP22 rm64 [m: o64 0f 1a /6] X64,UNDOC
+HINT_NOP23 rm16 [m: o16 0f 1a /7] P6,UNDOC
+HINT_NOP23 rm32 [m: o32 0f 1a /7] P6,UNDOC
+HINT_NOP23 rm64 [m: o64 0f 1a /7] X64,UNDOC
+HINT_NOP24 rm16 [m: o16 0f 1b /0] P6,UNDOC
+HINT_NOP24 rm32 [m: o32 0f 1b /0] P6,UNDOC
+HINT_NOP24 rm64 [m: o64 0f 1b /0] X64,UNDOC
+HINT_NOP25 rm16 [m: o16 0f 1b /1] P6,UNDOC
+HINT_NOP25 rm32 [m: o32 0f 1b /1] P6,UNDOC
+HINT_NOP25 rm64 [m: o64 0f 1b /1] X64,UNDOC
+HINT_NOP26 rm16 [m: o16 0f 1b /2] P6,UNDOC
+HINT_NOP26 rm32 [m: o32 0f 1b /2] P6,UNDOC
+HINT_NOP26 rm64 [m: o64 0f 1b /2] X64,UNDOC
+HINT_NOP27 rm16 [m: o16 0f 1b /3] P6,UNDOC
+HINT_NOP27 rm32 [m: o32 0f 1b /3] P6,UNDOC
+HINT_NOP27 rm64 [m: o64 0f 1b /3] X64,UNDOC
+HINT_NOP28 rm16 [m: o16 0f 1b /4] P6,UNDOC
+HINT_NOP28 rm32 [m: o32 0f 1b /4] P6,UNDOC
+HINT_NOP28 rm64 [m: o64 0f 1b /4] X64,UNDOC
+HINT_NOP29 rm16 [m: o16 0f 1b /5] P6,UNDOC
+HINT_NOP29 rm32 [m: o32 0f 1b /5] P6,UNDOC
+HINT_NOP29 rm64 [m: o64 0f 1b /5] X64,UNDOC
+HINT_NOP30 rm16 [m: o16 0f 1b /6] P6,UNDOC
+HINT_NOP30 rm32 [m: o32 0f 1b /6] P6,UNDOC
+HINT_NOP30 rm64 [m: o64 0f 1b /6] X64,UNDOC
+HINT_NOP31 rm16 [m: o16 0f 1b /7] P6,UNDOC
+HINT_NOP31 rm32 [m: o32 0f 1b /7] P6,UNDOC
+HINT_NOP31 rm64 [m: o64 0f 1b /7] X64,UNDOC
+HINT_NOP32 rm16 [m: o16 0f 1c /0] P6,UNDOC
+HINT_NOP32 rm32 [m: o32 0f 1c /0] P6,UNDOC
+HINT_NOP32 rm64 [m: o64 0f 1c /0] X64,UNDOC
+HINT_NOP33 rm16 [m: o16 0f 1c /1] P6,UNDOC
+HINT_NOP33 rm32 [m: o32 0f 1c /1] P6,UNDOC
+HINT_NOP33 rm64 [m: o64 0f 1c /1] X64,UNDOC
+HINT_NOP34 rm16 [m: o16 0f 1c /2] P6,UNDOC
+HINT_NOP34 rm32 [m: o32 0f 1c /2] P6,UNDOC
+HINT_NOP34 rm64 [m: o64 0f 1c /2] X64,UNDOC
+HINT_NOP35 rm16 [m: o16 0f 1c /3] P6,UNDOC
+HINT_NOP35 rm32 [m: o32 0f 1c /3] P6,UNDOC
+HINT_NOP35 rm64 [m: o64 0f 1c /3] X64,UNDOC
+HINT_NOP36 rm16 [m: o16 0f 1c /4] P6,UNDOC
+HINT_NOP36 rm32 [m: o32 0f 1c /4] P6,UNDOC
+HINT_NOP36 rm64 [m: o64 0f 1c /4] X64,UNDOC
+HINT_NOP37 rm16 [m: o16 0f 1c /5] P6,UNDOC
+HINT_NOP37 rm32 [m: o32 0f 1c /5] P6,UNDOC
+HINT_NOP37 rm64 [m: o64 0f 1c /5] X64,UNDOC
+HINT_NOP38 rm16 [m: o16 0f 1c /6] P6,UNDOC
+HINT_NOP38 rm32 [m: o32 0f 1c /6] P6,UNDOC
+HINT_NOP38 rm64 [m: o64 0f 1c /6] X64,UNDOC
+HINT_NOP39 rm16 [m: o16 0f 1c /7] P6,UNDOC
+HINT_NOP39 rm32 [m: o32 0f 1c /7] P6,UNDOC
+HINT_NOP39 rm64 [m: o64 0f 1c /7] X64,UNDOC
+HINT_NOP40 rm16 [m: o16 0f 1d /0] P6,UNDOC
+HINT_NOP40 rm32 [m: o32 0f 1d /0] P6,UNDOC
+HINT_NOP40 rm64 [m: o64 0f 1d /0] X64,UNDOC
+HINT_NOP41 rm16 [m: o16 0f 1d /1] P6,UNDOC
+HINT_NOP41 rm32 [m: o32 0f 1d /1] P6,UNDOC
+HINT_NOP41 rm64 [m: o64 0f 1d /1] X64,UNDOC
+HINT_NOP42 rm16 [m: o16 0f 1d /2] P6,UNDOC
+HINT_NOP42 rm32 [m: o32 0f 1d /2] P6,UNDOC
+HINT_NOP42 rm64 [m: o64 0f 1d /2] X64,UNDOC
+HINT_NOP43 rm16 [m: o16 0f 1d /3] P6,UNDOC
+HINT_NOP43 rm32 [m: o32 0f 1d /3] P6,UNDOC
+HINT_NOP43 rm64 [m: o64 0f 1d /3] X64,UNDOC
+HINT_NOP44 rm16 [m: o16 0f 1d /4] P6,UNDOC
+HINT_NOP44 rm32 [m: o32 0f 1d /4] P6,UNDOC
+HINT_NOP44 rm64 [m: o64 0f 1d /4] X64,UNDOC
+HINT_NOP45 rm16 [m: o16 0f 1d /5] P6,UNDOC
+HINT_NOP45 rm32 [m: o32 0f 1d /5] P6,UNDOC
+HINT_NOP45 rm64 [m: o64 0f 1d /5] X64,UNDOC
+HINT_NOP46 rm16 [m: o16 0f 1d /6] P6,UNDOC
+HINT_NOP46 rm32 [m: o32 0f 1d /6] P6,UNDOC
+HINT_NOP46 rm64 [m: o64 0f 1d /6] X64,UNDOC
+HINT_NOP47 rm16 [m: o16 0f 1d /7] P6,UNDOC
+HINT_NOP47 rm32 [m: o32 0f 1d /7] P6,UNDOC
+HINT_NOP47 rm64 [m: o64 0f 1d /7] X64,UNDOC
+HINT_NOP48 rm16 [m: o16 0f 1e /0] P6,UNDOC
+HINT_NOP48 rm32 [m: o32 0f 1e /0] P6,UNDOC
+HINT_NOP48 rm64 [m: o64 0f 1e /0] X64,UNDOC
+HINT_NOP49 rm16 [m: o16 0f 1e /1] P6,UNDOC
+HINT_NOP49 rm32 [m: o32 0f 1e /1] P6,UNDOC
+HINT_NOP49 rm64 [m: o64 0f 1e /1] X64,UNDOC
+HINT_NOP50 rm16 [m: o16 0f 1e /2] P6,UNDOC
+HINT_NOP50 rm32 [m: o32 0f 1e /2] P6,UNDOC
+HINT_NOP50 rm64 [m: o64 0f 1e /2] X64,UNDOC
+HINT_NOP51 rm16 [m: o16 0f 1e /3] P6,UNDOC
+HINT_NOP51 rm32 [m: o32 0f 1e /3] P6,UNDOC
+HINT_NOP51 rm64 [m: o64 0f 1e /3] X64,UNDOC
+HINT_NOP52 rm16 [m: o16 0f 1e /4] P6,UNDOC
+HINT_NOP52 rm32 [m: o32 0f 1e /4] P6,UNDOC
+HINT_NOP52 rm64 [m: o64 0f 1e /4] X64,UNDOC
+HINT_NOP53 rm16 [m: o16 0f 1e /5] P6,UNDOC
+HINT_NOP53 rm32 [m: o32 0f 1e /5] P6,UNDOC
+HINT_NOP53 rm64 [m: o64 0f 1e /5] X64,UNDOC
+HINT_NOP54 rm16 [m: o16 0f 1e /6] P6,UNDOC
+HINT_NOP54 rm32 [m: o32 0f 1e /6] P6,UNDOC
+HINT_NOP54 rm64 [m: o64 0f 1e /6] X64,UNDOC
+HINT_NOP55 rm16 [m: o16 0f 1e /7] P6,UNDOC
+HINT_NOP55 rm32 [m: o32 0f 1e /7] P6,UNDOC
+HINT_NOP55 rm64 [m: o64 0f 1e /7] X64,UNDOC
+HINT_NOP56 rm16 [m: o16 0f 1f /0] P6,UNDOC
+HINT_NOP56 rm32 [m: o32 0f 1f /0] P6,UNDOC
+HINT_NOP56 rm64 [m: o64 0f 1f /0] X64,UNDOC
+HINT_NOP57 rm16 [m: o16 0f 1f /1] P6,UNDOC
+HINT_NOP57 rm32 [m: o32 0f 1f /1] P6,UNDOC
+HINT_NOP57 rm64 [m: o64 0f 1f /1] X64,UNDOC
+HINT_NOP58 rm16 [m: o16 0f 1f /2] P6,UNDOC
+HINT_NOP58 rm32 [m: o32 0f 1f /2] P6,UNDOC
+HINT_NOP58 rm64 [m: o64 0f 1f /2] X64,UNDOC
+HINT_NOP59 rm16 [m: o16 0f 1f /3] P6,UNDOC
+HINT_NOP59 rm32 [m: o32 0f 1f /3] P6,UNDOC
+HINT_NOP59 rm64 [m: o64 0f 1f /3] X64,UNDOC
+HINT_NOP60 rm16 [m: o16 0f 1f /4] P6,UNDOC
+HINT_NOP60 rm32 [m: o32 0f 1f /4] P6,UNDOC
+HINT_NOP60 rm64 [m: o64 0f 1f /4] X64,UNDOC
+HINT_NOP61 rm16 [m: o16 0f 1f /5] P6,UNDOC
+HINT_NOP61 rm32 [m: o32 0f 1f /5] P6,UNDOC
+HINT_NOP61 rm64 [m: o64 0f 1f /5] X64,UNDOC
+HINT_NOP62 rm16 [m: o16 0f 1f /6] P6,UNDOC
+HINT_NOP62 rm32 [m: o32 0f 1f /6] P6,UNDOC
+HINT_NOP62 rm64 [m: o64 0f 1f /6] X64,UNDOC
+HINT_NOP63 rm16 [m: o16 0f 1f /7] P6,UNDOC
+HINT_NOP63 rm32 [m: o32 0f 1f /7] P6,UNDOC
+HINT_NOP63 rm64 [m: o64 0f 1f /7] X64,UNDOC
diff --git a/x86/insns.pl b/x86/insns.pl
new file mode 100755
index 00000000..5845ed89
--- /dev/null
+++ b/x86/insns.pl
@@ -0,0 +1,1048 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2017 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# insns.pl
+#
+# Parse insns.dat and produce generated source code files
+
+require 'x86/insns-iflags.ph';
+
+# Opcode prefixes which need their own opcode tables
+# LONGER PREFIXES FIRST!
+@disasm_prefixes = qw(0F24 0F25 0F38 0F3A 0F7A 0FA6 0FA7 0F);
+
+# This should match MAX_OPERANDS from nasm.h
+$MAX_OPERANDS = 5;
+
+# Add VEX/XOP prefixes
+@vex_class = ( 'vex', 'xop', 'evex' );
+$vex_classes = scalar(@vex_class);
+@vexlist = ();
+%vexmap = ();
+for ($c = 0; $c < $vex_classes; $c++) {
+ $vexmap{$vex_class[$c]} = $c;
+ for ($m = 0; $m < 32; $m++) {
+ for ($p = 0; $p < 4; $p++) {
+ push(@vexlist, sprintf("%s%02X%01X", $vex_class[$c], $m, $p));
+ }
+ }
+}
+@disasm_prefixes = (@vexlist, @disasm_prefixes);
+
+@bytecode_count = (0) x 256;
+
+print STDERR "Reading insns.dat...\n";
+
+@args = ();
+undef $output;
+foreach $arg ( @ARGV ) {
+ if ( $arg =~ /^\-/ ) {
+ if ( $arg =~ /^\-([abdin]|f[hc])$/ ) {
+ $output = $1;
+ } else {
+ die "$0: Unknown option: ${arg}\n";
+ }
+ } else {
+ push (@args, $arg);
+ }
+}
+
+die if (scalar(@args) != 2); # input output
+($fname, $oname) = @args;
+
+open(F, '<', $fname) || die "unable to open $fname";
+
+%dinstables = ();
+@bytecode_list = ();
+
+$line = 0;
+$insns = 0;
+$n_opcodes = $n_opcodes_cc = 0;
+while (<F>) {
+ $line++;
+ chomp;
+ next if ( /^\s*(\;.*|)$/ ); # comments or blank lines
+
+ unless (/^\s*(\S+)\s+(\S+)\s+(\S+|\[.*\])\s+(\S+)\s*$/) {
+ warn "line $line does not contain four fields\n";
+ next;
+ }
+ @fields = ($1, $2, $3, $4);
+ @field_list = ([@fields, 0]);
+
+ if ($fields[1] =~ /\*/) {
+ # This instruction has relaxed form(s)
+ if ($fields[2] !~ /^\[/) {
+ warn "line $line has an * operand but uses raw bytecodes\n";
+ next;
+ }
+
+ $opmask = 0;
+ @ops = split(/,/, $fields[1]);
+ for ($oi = 0; $oi < scalar @ops; $oi++) {
+ if ($ops[$oi] =~ /\*$/) {
+ if ($oi == 0) {
+ warn "line $line has a first operand with a *\n";
+ next;
+ }
+ $opmask |= 1 << $oi;
+ }
+ }
+
+ for ($oi = 1; $oi < (1 << scalar @ops); $oi++) {
+ if (($oi & ~$opmask) == 0) {
+ my @xops = ();
+ my $omask = ~$oi;
+ for ($oj = 0; $oj < scalar(@ops); $oj++) {
+ if ($omask & 1) {
+ push(@xops, $ops[$oj]);
+ }
+ $omask >>= 1;
+ }
+ push(@field_list, [$fields[0], join(',', @xops),
+ $fields[2], $fields[3], $oi]);
+ }
+ }
+ }
+
+ foreach $fptr (@field_list) {
+ @fields = @$fptr;
+ ($formatted, $nd) = format_insn(@fields);
+ if ($formatted) {
+ $insns++;
+ $aname = "aa_$fields[0]";
+ push @$aname, $formatted;
+ }
+ if ( $fields[0] =~ /cc$/ ) {
+ # Conditional instruction
+ if (!defined($k_opcodes_cc{$fields[0]})) {
+ $k_opcodes_cc{$fields[0]} = $n_opcodes_cc++;
+ }
+ } else {
+ # Unconditional instruction
+ if (!defined($k_opcodes{$fields[0]})) {
+ $k_opcodes{$fields[0]} = $n_opcodes++;
+ }
+ }
+ if ($formatted && !$nd) {
+ push @big, $formatted;
+ my @sseq = startseq($fields[2], $fields[4]);
+ foreach $i (@sseq) {
+ if (!defined($dinstables{$i})) {
+ $dinstables{$i} = [];
+ }
+ push(@{$dinstables{$i}}, $#big);
+ }
+ }
+ }
+}
+
+close F;
+
+#
+# Generate the bytecode array. At this point, @bytecode_list contains
+# the full set of bytecodes.
+#
+
+# Sort by descending length
+@bytecode_list = sort { scalar(@$b) <=> scalar(@$a) } @bytecode_list;
+@bytecode_array = ();
+%bytecode_pos = ();
+$bytecode_next = 0;
+foreach $bl (@bytecode_list) {
+ my $h = hexstr(@$bl);
+ next if (defined($bytecode_pos{$h}));
+
+ push(@bytecode_array, $bl);
+ while ($h ne '') {
+ $bytecode_pos{$h} = $bytecode_next;
+ $h = substr($h, 2);
+ $bytecode_next++;
+ }
+}
+undef @bytecode_list;
+
+@opcodes = sort { $k_opcodes{$a} <=> $k_opcodes{$b} } keys(%k_opcodes);
+@opcodes_cc = sort { $k_opcodes_cc{$a} <=> $k_opcodes_cc{$b} } keys(%k_opcodes_cc);
+
+if ( $output eq 'b') {
+ print STDERR "Writing $oname...\n";
+
+ open(B, '>', $oname);
+
+ print B "/* This file auto-generated from insns.dat by insns.pl" .
+ " - don't edit it */\n\n";
+
+ print B "#include \"nasm.h\"\n";
+ print B "#include \"insns.h\"\n\n";
+
+ print B "const uint8_t nasm_bytecodes[$bytecode_next] = {\n";
+
+ $p = 0;
+ foreach $bl (@bytecode_array) {
+ printf B " /* %5d */ ", $p;
+ foreach $d (@$bl) {
+ printf B "%#o,", $d;
+ $p++;
+ }
+ printf B "\n";
+ }
+ print B "};\n";
+
+ print B "\n";
+ print B "/*\n";
+ print B " * Bytecode frequencies (including reuse):\n";
+ print B " *\n";
+ for ($i = 0; $i < 32; $i++) {
+ print B " *";
+ for ($j = 0; $j < 256; $j += 32) {
+ print B " |" if ($j);
+ printf B " %3o:%4d", $i+$j, $bytecode_count[$i+$j];
+ }
+ print B "\n";
+ }
+ print B " */\n";
+
+ close B;
+}
+
+if ( $output eq 'a' ) {
+ print STDERR "Writing $oname...\n";
+
+ open(A, '>', $oname);
+
+ print A "/* This file auto-generated from insns.dat by insns.pl" .
+ " - don't edit it */\n\n";
+
+ print A "#include \"nasm.h\"\n";
+ print A "#include \"insns.h\"\n\n";
+
+ foreach $i (@opcodes, @opcodes_cc) {
+ print A "static const struct itemplate instrux_${i}[] = {\n";
+ $aname = "aa_$i";
+ foreach $j (@$aname) {
+ print A " ", codesubst($j), "\n";
+ }
+ print A " ITEMPLATE_END\n};\n\n";
+ }
+ print A "const struct itemplate * const nasm_instructions[] = {\n";
+ foreach $i (@opcodes, @opcodes_cc) {
+ print A " instrux_${i},\n";
+ }
+ print A "};\n";
+
+ close A;
+}
+
+if ( $output eq 'd' ) {
+ print STDERR "Writing $oname...\n";
+
+ open(D, '>', $oname);
+
+ print D "/* This file auto-generated from insns.dat by insns.pl" .
+ " - don't edit it */\n\n";
+
+ print D "#include \"nasm.h\"\n";
+ print D "#include \"insns.h\"\n\n";
+
+ print D "static const struct itemplate instrux[] = {\n";
+ $n = 0;
+ foreach $j (@big) {
+ printf D " /* %4d */ %s\n", $n++, codesubst($j);
+ }
+ print D "};\n";
+
+ foreach $h (sort(keys(%dinstables))) {
+ next if ($h eq ''); # Skip pseudo-instructions
+ print D "\nstatic const struct itemplate * const itable_${h}[] = {\n";
+ foreach $j (@{$dinstables{$h}}) {
+ print D " instrux + $j,\n";
+ }
+ print D "};\n";
+ }
+
+ @prefix_list = ();
+ foreach $h (@disasm_prefixes, '') {
+ for ($c = 0; $c < 256; $c++) {
+ $nn = sprintf("%s%02X", $h, $c);
+ if ($is_prefix{$nn} || defined($dinstables{$nn})) {
+ # At least one entry in this prefix table
+ push(@prefix_list, $h);
+ $is_prefix{$h} = 1;
+ last;
+ }
+ }
+ }
+
+ foreach $h (@prefix_list) {
+ print D "\n";
+ print D "static " unless ($h eq '');
+ print D "const struct disasm_index ";
+ print D ($h eq '') ? 'itable' : "itable_$h";
+ print D "[256] = {\n";
+ for ($c = 0; $c < 256; $c++) {
+ $nn = sprintf("%s%02X", $h, $c);
+ if ($is_prefix{$nn}) {
+ die "$fname: ambiguous decoding of $nn\n"
+ if (defined($dinstables{$nn}));
+ printf D " /* 0x%02x */ { itable_%s, -1 },\n", $c, $nn;
+ } elsif (defined($dinstables{$nn})) {
+ printf D " /* 0x%02x */ { itable_%s, %u },\n", $c,
+ $nn, scalar(@{$dinstables{$nn}});
+ } else {
+ printf D " /* 0x%02x */ { NULL, 0 },\n", $c;
+ }
+ }
+ print D "};\n";
+ }
+
+ printf D "\nconst struct disasm_index * const itable_vex[NASM_VEX_CLASSES][32][4] =\n";
+ print D "{\n";
+ for ($c = 0; $c < $vex_classes; $c++) {
+ print D " {\n";
+ for ($m = 0; $m < 32; $m++) {
+ print D " { ";
+ for ($p = 0; $p < 4; $p++) {
+ $vp = sprintf("%s%02X%01X", $vex_class[$c], $m, $p);
+ printf D "%-15s",
+ ($is_prefix{$vp} ? sprintf("itable_%s,", $vp) : 'NULL,');
+ }
+ print D "},\n";
+ }
+ print D " },\n";
+ }
+ print D "};\n";
+
+ close D;
+}
+
+if ( $output eq 'i' ) {
+ print STDERR "Writing $oname...\n";
+
+ open(I, '>', $oname);
+
+ print I "/* This file is auto-generated from insns.dat by insns.pl" .
+ " - don't edit it */\n\n";
+ print I "/* This file in included by nasm.h */\n\n";
+
+ print I "/* Instruction names */\n\n";
+ print I "#ifndef NASM_INSNSI_H\n";
+ print I "#define NASM_INSNSI_H 1\n\n";
+ print I "enum opcode {\n";
+ $maxlen = 0;
+ foreach $i (@opcodes, @opcodes_cc) {
+ print I "\tI_${i},\n";
+ $len = length($i);
+ $len++ if ( $i =~ /cc$/ ); # Condition codes can be 3 characters long
+ $maxlen = $len if ( $len > $maxlen );
+ }
+ print I "\tI_none = -1\n";
+ print I "};\n\n";
+ print I "#define MAX_INSLEN ", $maxlen, "\n";
+ print I "#define NASM_VEX_CLASSES ", $vex_classes, "\n";
+ print I "#define NO_DECORATOR\t{", join(',',(0) x $MAX_OPERANDS), "}\n";
+ print I "#define FIRST_COND_OPCODE I_", $opcodes_cc[0], "\n\n";
+ print I "#endif /* NASM_INSNSI_H */\n";
+
+ close I;
+}
+
+if ( $output eq 'n' ) {
+ print STDERR "Writing $oname...\n";
+
+ open(N, '>', $oname);
+
+ print N "/* This file is auto-generated from insns.dat by insns.pl" .
+ " - don't edit it */\n\n";
+ print N "#include \"tables.h\"\n\n";
+
+ print N "const char * const nasm_insn_names[] = {";
+ $first = 1;
+ foreach $i (@opcodes, @opcodes_cc) {
+ print N "," if ( !$first );
+ $first = 0;
+ $ilower = $i;
+ $ilower =~ s/cc$//; # Remove conditional cc suffix
+ $ilower =~ tr/A-Z/a-z/; # Change to lower case (Perl 4 compatible)
+ print N "\n\t\"${ilower}\"";
+ }
+ print N "\n};\n";
+ close N;
+}
+
+if ( $output eq 'fh') {
+ write_iflaggen_h();
+}
+
+if ( $output eq 'fc') {
+ write_iflag_c();
+}
+
+printf STDERR "Done: %d instructions\n", $insns;
+
+# Count primary bytecodes, for statistics
+sub count_bytecodes(@) {
+ my $skip = 0;
+ foreach my $bc (@_) {
+ if ($skip) {
+ $skip--;
+ next;
+ }
+ $bytecode_count[$bc]++;
+ if ($bc >= 01 && $bc <= 04) {
+ $skip = $bc;
+ } elsif (($bc & ~03) == 010) {
+ $skip = 1;
+ } elsif (($bc & ~013) == 0144) {
+ $skip = 1;
+ } elsif ($bc == 0172 || $bc == 0173) {
+ $skip = 1;
+ } elsif (($bc & ~3) == 0260 || $bc == 0270) { # VEX
+ $skip = 2;
+ } elsif (($bc & ~3) == 0240 || $bc == 0250) { # EVEX
+ $skip = 3;
+ } elsif ($bc == 0330) {
+ $skip = 1;
+ }
+ }
+}
+
+sub format_insn($$$$$) {
+ my ($opcode, $operands, $codes, $flags, $relax) = @_;
+ my $num, $nd = 0, $rawflags, $flagsindex;
+ my @bytecode;
+ my $op, @ops, $opp, @opx, @oppx, @decos, @opevex;
+
+ return (undef, undef) if $operands eq "ignore";
+
+ # format the operands
+ $operands =~ s/\*//g;
+ $operands =~ s/:/|colon,/g;
+ @ops = ();
+ @decos = ();
+ if ($operands ne 'void') {
+ foreach $op (split(/,/, $operands)) {
+ @opx = ();
+ @opevex = ();
+ foreach $opp (split(/\|/, $op)) {
+ @oppx = ();
+ if ($opp =~ s/^(b(32|64)|mask|z|er|sae)$//) {
+ push(@opevex, $1);
+ }
+
+ if ($opp =~ s/(?<!\d)(8|16|32|64|80|128|256|512)$//) {
+ push(@oppx, "bits$1");
+ }
+ $opp =~ s/^mem$/memory/;
+ $opp =~ s/^memory_offs$/mem_offs/;
+ $opp =~ s/^imm$/immediate/;
+ $opp =~ s/^([a-z]+)rm$/rm_$1/;
+ $opp =~ s/^rm$/rm_gpr/;
+ $opp =~ s/^reg$/reg_gpr/;
+ # only for evex insns, high-16 regs are allowed
+ if ($codes !~ /(^|\s)evex\./) {
+ $opp =~ s/^(rm_[xyz]mm)$/$1_l16/;
+ $opp =~ s/^([xyz]mm)reg$/$1_l16/;
+ }
+ push(@opx, $opp, @oppx) if $opp;
+ }
+ $op = join('|', @opx);
+ push(@ops, $op);
+ push(@decos, (@opevex ? join('|', @opevex) : '0'));
+ }
+ }
+
+ $num = scalar(@ops);
+ while (scalar(@ops) < $MAX_OPERANDS) {
+ push(@ops, '0');
+ push(@decos, '0');
+ }
+ $operands = join(',', @ops);
+ $operands =~ tr/a-z/A-Z/;
+
+ $decorators = "{" . join(',', @decos) . "}";
+ if ($decorators =~ /^{(0,)+0}$/) {
+ $decorators = "NO_DECORATOR";
+ }
+ $decorators =~ tr/a-z/A-Z/;
+
+ # format the flags
+ $nd = 1 if $flags =~ /(^|\,)ND($|\,)/;
+ $flags =~ s/(^|\,)ND($|\,)/\1/g;
+ $flags =~ s/(^|\,)X64($|\,)/\1LONG,X86_64\2/g;
+ if ($codes =~ /evex\./) {
+ $flags .= ",EVEX";
+ } elsif ($codes =~ /(vex|xop)\./) {
+ $flags .= ",VEX";
+ }
+ $rawflags = $flags;
+ $flagsindex = insns_flag_index(split(',',$flags));
+
+ die "Error in flags $rawflags" if not defined($flagsindex);
+
+ @bytecode = (decodify($codes, $relax), 0);
+ push(@bytecode_list, [@bytecode]);
+ $codes = hexstr(@bytecode);
+ count_bytecodes(@bytecode);
+
+ ("{I_$opcode, $num, {$operands}, $decorators, \@\@CODES-$codes\@\@, $flagsindex},", $nd);
+}
+
+#
+# Look for @@CODES-xxx@@ sequences and replace them with the appropriate
+# offset into nasm_bytecodes
+#
+sub codesubst($) {
+ my($s) = @_;
+ my $n;
+
+ while ($s =~ /\@\@CODES-([0-9A-F]+)\@\@/) {
+ my $pos = $bytecode_pos{$1};
+ if (!defined($pos)) {
+ die "$fname: no position assigned to byte code $1\n";
+ }
+ $s = $` . "nasm_bytecodes+${pos}" . "$'";
+ }
+ return $s;
+}
+
+sub addprefix ($@) {
+ my ($prefix, @list) = @_;
+ my $x;
+ my @l = ();
+
+ foreach $x (@list) {
+ push(@l, sprintf("%s%02X", $prefix, $x));
+ }
+
+ return @l;
+}
+
+#
+# Turn a code string into a sequence of bytes
+#
+sub decodify($$) {
+ # Although these are C-syntax strings, by convention they should have
+ # only octal escapes (for directives) and hexadecimal escapes
+ # (for verbatim bytes)
+ my($codestr, $relax) = @_;
+
+ if ($codestr =~ /^\s*\[([^\]]*)\]\s*$/) {
+ return byte_code_compile($1, $relax);
+ }
+
+ my $c = $codestr;
+ my @codes = ();
+
+ unless ($codestr eq 'ignore') {
+ while ($c ne '') {
+ if ($c =~ /^\\x([0-9a-f]+)(.*)$/i) {
+ push(@codes, hex $1);
+ $c = $2;
+ next;
+ } elsif ($c =~ /^\\([0-7]{1,3})(.*)$/) {
+ push(@codes, oct $1);
+ $c = $2;
+ next;
+ } else {
+ die "$fname: unknown code format in \"$codestr\"\n";
+ }
+ }
+ }
+
+ return @codes;
+}
+
+# Turn a numeric list into a hex string
+sub hexstr(@) {
+ my $s = '';
+ my $c;
+
+ foreach $c (@_) {
+ $s .= sprintf("%02X", $c);
+ }
+ return $s;
+}
+
+# Here we determine the range of possible starting bytes for a given
+# instruction. We need only consider the codes:
+# \[1234] mean literal bytes, of course
+# \1[0123] mean byte plus register value
+# \330 means byte plus condition code
+# \0 or \340 mean give up and return empty set
+# \34[4567] mean PUSH/POP of segment registers: special case
+# \17[234] skip is4 control byte
+# \26x \270 skip VEX control bytes
+# \24x \250 skip EVEX control bytes
+sub startseq($$) {
+ my ($codestr, $relax) = @_;
+ my $word, @range;
+ my @codes = ();
+ my $c = $codestr;
+ my $c0, $c1, $i;
+ my $prefix = '';
+
+ @codes = decodify($codestr, $relax);
+
+ while ($c0 = shift(@codes)) {
+ $c1 = $codes[0];
+ if ($c0 >= 01 && $c0 <= 04) {
+ # Fixed byte string
+ my $fbs = $prefix;
+ while (1) {
+ if ($c0 >= 01 && $c0 <= 04) {
+ while ($c0--) {
+ $fbs .= sprintf("%02X", shift(@codes));
+ }
+ } else {
+ last;
+ }
+ $c0 = shift(@codes);
+ }
+
+ foreach $pfx (@disasm_prefixes) {
+ if (substr($fbs, 0, length($pfx)) eq $pfx) {
+ $prefix = $pfx;
+ $fbs = substr($fbs, length($pfx));
+ last;
+ }
+ }
+
+ if ($fbs ne '') {
+ return ($prefix.substr($fbs,0,2));
+ }
+
+ unshift(@codes, $c0);
+ } elsif ($c0 >= 010 && $c0 <= 013) {
+ return addprefix($prefix, $c1..($c1+7));
+ } elsif (($c0 & ~013) == 0144) {
+ return addprefix($prefix, $c1, $c1|2);
+ } elsif ($c0 == 0330) {
+ return addprefix($prefix, $c1..($c1+15));
+ } elsif ($c0 == 0 || $c0 == 0340) {
+ return $prefix;
+ } elsif (($c0 & ~3) == 0260 || $c0 == 0270 ||
+ ($c0 & ~3) == 0240 || $c0 == 0250) {
+ my $c,$m,$wlp;
+ $m = shift(@codes);
+ $wlp = shift(@codes);
+ $c = ($m >> 6);
+ $m = $m & 31;
+ $prefix .= sprintf('%s%02X%01X', $vex_class[$c], $m, $wlp & 3);
+ if ($c0 < 0260) {
+ my $tuple = shift(@codes);
+ }
+ } elsif ($c0 >= 0172 && $c0 <= 173) {
+ shift(@codes); # Skip is4 control byte
+ } else {
+ # We really need to be able to distinguish "forbidden"
+ # and "ignorable" codes here
+ }
+ }
+ return $prefix;
+}
+
+# EVEX tuple types offset is 0300. e.g. 0301 is for full vector(fv).
+sub tupletype($) {
+ my ($tuplestr) = @_;
+ my %tuple_codes = (
+ '' => 000,
+ 'fv' => 001,
+ 'hv' => 002,
+ 'fvm' => 003,
+ 't1s8' => 004,
+ 't1s16' => 005,
+ 't1s' => 006,
+ 't1f32' => 007,
+ 't1f64' => 010,
+ 't2' => 011,
+ 't4' => 012,
+ 't8' => 013,
+ 'hvm' => 014,
+ 'qvm' => 015,
+ 'ovm' => 016,
+ 'm128' => 017,
+ 'dup' => 020,
+ );
+
+ if (defined $tuple_codes{$tuplestr}) {
+ return 0300 + $tuple_codes{$tuplestr};
+ } else {
+ die "Undefined tuple type : $tuplestr\n";
+ }
+}
+
+#
+# This function takes a series of byte codes in a format which is more
+# typical of the Intel documentation, and encode it.
+#
+# The format looks like:
+#
+# [operands: opcodes]
+#
+# The operands word lists the order of the operands:
+#
+# r = register field in the modr/m
+# m = modr/m
+# v = VEX "v" field
+# i = immediate
+# s = register field of is4/imz2 field
+# - = implicit (unencoded) operand
+# x = indeX register of mib. 014..017 bytecodes are used.
+#
+# For an operand that should be filled into more than one field,
+# enter it as e.g. "r+v".
+#
+sub byte_code_compile($$) {
+ my($str, $relax) = @_;
+ my $opr;
+ my $opc;
+ my @codes = ();
+ my $litix = undef;
+ my %oppos = ();
+ my $i;
+ my $op, $oq;
+ my $opex;
+
+ my %imm_codes = (
+ 'ib' => 020, # imm8
+ 'ib,u' => 024, # Unsigned imm8
+ 'iw' => 030, # imm16
+ 'ib,s' => 0274, # imm8 sign-extended to opsize or bits
+ 'iwd' => 034, # imm16 or imm32, depending on opsize
+ 'id' => 040, # imm32
+ 'id,s' => 0254, # imm32 sign-extended to 64 bits
+ 'iwdq' => 044, # imm16/32/64, depending on addrsize
+ 'rel8' => 050,
+ 'iq' => 054,
+ 'rel16' => 060,
+ 'rel' => 064, # 16 or 32 bit relative operand
+ 'rel32' => 070,
+ 'seg' => 074,
+ );
+ my %plain_codes = (
+ 'o16' => 0320, # 16-bit operand size
+ 'o32' => 0321, # 32-bit operand size
+ 'odf' => 0322, # Operand size is default
+ 'o64' => 0324, # 64-bit operand size requiring REX.W
+ 'o64nw' => 0323, # Implied 64-bit operand size (no REX.W)
+ 'a16' => 0310,
+ 'a32' => 0311,
+ 'adf' => 0312, # Address size is default
+ 'a64' => 0313,
+ '!osp' => 0364,
+ '!asp' => 0365,
+ 'f2i' => 0332, # F2 prefix, but 66 for operand size is OK
+ 'f3i' => 0333, # F3 prefix, but 66 for operand size is OK
+ 'mustrep' => 0336,
+ 'mustrepne' => 0337,
+ 'rex.l' => 0334,
+ 'norexb' => 0314,
+ 'norexx' => 0315,
+ 'norexr' => 0316,
+ 'norexw' => 0317,
+ 'repe' => 0335,
+ 'nohi' => 0325, # Use spl/bpl/sil/dil even without REX
+ 'nof3' => 0326, # No REP 0xF3 prefix permitted
+ 'norep' => 0331, # No REP prefix permitted
+ 'wait' => 0341, # Needs a wait prefix
+ 'resb' => 0340,
+ 'np' => 0360, # No prefix
+ 'jcc8' => 0370, # Match only if Jcc possible with single byte
+ 'jmp8' => 0371, # Match only if JMP possible with single byte
+ 'jlen' => 0373, # Length of jump
+ 'hlexr' => 0271,
+ 'hlenl' => 0272,
+ 'hle' => 0273,
+
+ # This instruction takes XMM VSIB
+ 'vsibx' => 0374,
+ 'vm32x' => 0374,
+ 'vm64x' => 0374,
+
+ # This instruction takes YMM VSIB
+ 'vsiby' => 0375,
+ 'vm32y' => 0375,
+ 'vm64y' => 0375,
+
+ # This instruction takes ZMM VSIB
+ 'vsibz' => 0376,
+ 'vm32z' => 0376,
+ 'vm64z' => 0376,
+ );
+
+ unless ($str =~ /^(([^\s:]*)\:*([^\s:]*)\:|)\s*(.*\S)\s*$/) {
+ die "$fname: $line: cannot parse: [$str]\n";
+ }
+ $opr = "\L$2";
+ $tuple = "\L$3"; # Tuple type for AVX512
+ $opc = "\L$4";
+
+ my $op = 0;
+ for ($i = 0; $i < length($opr); $i++) {
+ my $c = substr($opr,$i,1);
+ if ($c eq '+') {
+ $op--;
+ } else {
+ if ($relax & 1) {
+ $op--;
+ }
+ $relax >>= 1;
+ $oppos{$c} = $op++;
+ }
+ }
+ $tup = tupletype($tuple);
+
+ my $last_imm = 'h';
+ my $prefix_ok = 1;
+ foreach $op (split(/\s*(?:\s|(?=[\/\\]))/, $opc)) {
+ my $pc = $plain_codes{$op};
+
+ if (defined $pc) {
+ # Plain code
+ push(@codes, $pc);
+ } elsif ($prefix_ok && $op =~ /^(66|f2|f3)$/) {
+ # 66/F2/F3 prefix used as an opcode extension
+ if ($op eq '66') {
+ push(@codes, 0361);
+ } elsif ($op eq 'f2') {
+ push(@codes, 0332);
+ } else {
+ push(@codes, 0333);
+ }
+ } elsif ($op =~ /^[0-9a-f]{2}$/) {
+ if (defined($litix) && $litix+$codes[$litix]+1 == scalar @codes &&
+ $codes[$litix] < 4) {
+ $codes[$litix]++;
+ push(@codes, hex $op);
+ } else {
+ $litix = scalar(@codes);
+ push(@codes, 01, hex $op);
+ }
+ $prefix_ok = 0;
+ } elsif ($op eq '/r') {
+ if (!defined($oppos{'r'}) || !defined($oppos{'m'})) {
+ die "$fname: $line: $op requires r and m operands\n";
+ }
+ $opex = (($oppos{'m'} & 4) ? 06 : 0) |
+ (($oppos{'r'} & 4) ? 05 : 0);
+ push(@codes, $opex) if ($opex);
+ # if mib is composed with two separate operands - ICC style
+ push(@codes, 014 + ($oppos{'x'} & 3)) if (defined($oppos{'x'}));
+ push(@codes, 0100 + (($oppos{'m'} & 3) << 3) + ($oppos{'r'} & 3));
+ $prefix_ok = 0;
+ } elsif ($op =~ m:^/([0-7])$:) {
+ if (!defined($oppos{'m'})) {
+ die "$fname: $line: $op requires m operand\n";
+ }
+ push(@codes, 06) if ($oppos{'m'} & 4);
+ push(@codes, 0200 + (($oppos{'m'} & 3) << 3) + $1);
+ $prefix_ok = 0;
+ } elsif ($op =~ /^(vex|xop)(|\..*)$/) {
+ my $vexname = $1;
+ my $c = $vexmap{$vexname};
+ my ($m,$w,$l,$p) = (undef,2,undef,0);
+ my $has_nds = 0;
+ my @subops = split(/\./, $op);
+ shift @subops; # Drop prefix
+ foreach $oq (@subops) {
+ if ($oq eq '128' || $oq eq 'l0' || $oq eq 'lz') {
+ $l = 0;
+ } elsif ($oq eq '256' || $oq eq 'l1') {
+ $l = 1;
+ } elsif ($oq eq 'lig') {
+ $l = 2;
+ } elsif ($oq eq 'w0') {
+ $w = 0;
+ } elsif ($oq eq 'w1') {
+ $w = 1;
+ } elsif ($oq eq 'wig') {
+ $w = 2;
+ } elsif ($oq eq 'ww') {
+ $w = 3;
+ } elsif ($oq eq 'p0') {
+ $p = 0;
+ } elsif ($oq eq '66' || $oq eq 'p1') {
+ $p = 1;
+ } elsif ($oq eq 'f3' || $oq eq 'p2') {
+ $p = 2;
+ } elsif ($oq eq 'f2' || $oq eq 'p3') {
+ $p = 3;
+ } elsif ($oq eq '0f') {
+ $m = 1;
+ } elsif ($oq eq '0f38') {
+ $m = 2;
+ } elsif ($oq eq '0f3a') {
+ $m = 3;
+ } elsif ($oq =~ /^m([0-9]+)$/) {
+ $m = $1+0;
+ } elsif ($oq eq 'nds' || $oq eq 'ndd' || $oq eq 'dds') {
+ if (!defined($oppos{'v'})) {
+ die "$fname: $line: $vexname.$oq without 'v' operand\n";
+ }
+ $has_nds = 1;
+ } else {
+ die "$fname: $line: undefined \U$vexname\E subcode: $oq\n";
+ }
+ }
+ if (!defined($m) || !defined($w) || !defined($l) || !defined($p)) {
+ die "$fname: $line: missing fields in \U$vexname\E specification\n";
+ }
+ if (defined($oppos{'v'}) && !$has_nds) {
+ die "$fname: $line: 'v' operand without ${vexname}.nds or ${vexname}.ndd\n";
+ }
+ my $minmap = ($c == 1) ? 8 : 0; # 0-31 for VEX, 8-31 for XOP
+ if ($m < $minmap || $m > 31) {
+ die "$fname: $line: Only maps ${minmap}-31 are valid for \U${vexname}\n";
+ }
+ push(@codes, defined($oppos{'v'}) ? 0260+($oppos{'v'} & 3) : 0270,
+ ($c << 6)+$m, ($w << 4)+($l << 2)+$p);
+ $prefix_ok = 0;
+ } elsif ($op =~ /^(evex)(|\..*)$/) {
+ my $c = $vexmap{$1};
+ my ($m,$w,$l,$p) = (undef,2,undef,0);
+ my $has_nds = 0;
+ my @subops = split(/\./, $op);
+ shift @subops; # Drop prefix
+ foreach $oq (@subops) {
+ if ($oq eq '128' || $oq eq 'l0' || $oq eq 'lz' || $oq eq 'lig') {
+ $l = 0;
+ } elsif ($oq eq '256' || $oq eq 'l1') {
+ $l = 1;
+ } elsif ($oq eq '512' || $oq eq 'l2') {
+ $l = 2;
+ } elsif ($oq eq 'w0') {
+ $w = 0;
+ } elsif ($oq eq 'w1') {
+ $w = 1;
+ } elsif ($oq eq 'wig') {
+ $w = 2;
+ } elsif ($oq eq 'ww') {
+ $w = 3;
+ } elsif ($oq eq 'p0') {
+ $p = 0;
+ } elsif ($oq eq '66' || $oq eq 'p1') {
+ $p = 1;
+ } elsif ($oq eq 'f3' || $oq eq 'p2') {
+ $p = 2;
+ } elsif ($oq eq 'f2' || $oq eq 'p3') {
+ $p = 3;
+ } elsif ($oq eq '0f') {
+ $m = 1;
+ } elsif ($oq eq '0f38') {
+ $m = 2;
+ } elsif ($oq eq '0f3a') {
+ $m = 3;
+ } elsif ($oq =~ /^m([0-9]+)$/) {
+ $m = $1+0;
+ } elsif ($oq eq 'nds' || $oq eq 'ndd' || $oq eq 'dds') {
+ if (!defined($oppos{'v'})) {
+ die "$fname: $line: evex.$oq without 'v' operand\n";
+ }
+ $has_nds = 1;
+ } else {
+ die "$fname: $line: undefined EVEX subcode: $oq\n";
+ }
+ }
+ if (!defined($m) || !defined($w) || !defined($l) || !defined($p)) {
+ die "$fname: $line: missing fields in EVEX specification\n";
+ }
+ if (defined($oppos{'v'}) && !$has_nds) {
+ die "$fname: $line: 'v' operand without evex.nds or evex.ndd\n";
+ }
+ if ($m > 15) {
+ die "$fname: $line: Only maps 0-15 are valid for EVEX\n";
+ }
+ push(@codes, defined($oppos{'v'}) ? 0240+($oppos{'v'} & 3) : 0250,
+ ($c << 6)+$m, ($w << 4)+($l << 2)+$p, $tup);
+ $prefix_ok = 0;
+ } elsif (defined $imm_codes{$op}) {
+ if ($op eq 'seg') {
+ if ($last_imm lt 'i') {
+ die "$fname: $line: seg without an immediate operand\n";
+ }
+ } else {
+ $last_imm++;
+ if ($last_imm gt 'j') {
+ die "$fname: $line: too many immediate operands\n";
+ }
+ }
+ if (!defined($oppos{$last_imm})) {
+ die "$fname: $line: $op without '$last_imm' operand\n";
+ }
+ push(@codes, 05) if ($oppos{$last_imm} & 4);
+ push(@codes, $imm_codes{$op} + ($oppos{$last_imm} & 3));
+ $prefix_ok = 0;
+ } elsif ($op eq '/is4') {
+ if (!defined($oppos{'s'})) {
+ die "$fname: $line: $op without 's' operand\n";
+ }
+ if (defined($oppos{'i'})) {
+ push(@codes, 0172, ($oppos{'s'} << 3)+$oppos{'i'});
+ } else {
+ push(@codes, 05) if ($oppos{'s'} & 4);
+ push(@codes, 0174+($oppos{'s'} & 3));
+ }
+ $prefix_ok = 0;
+ } elsif ($op =~ /^\/is4\=([0-9]+)$/) {
+ my $imm = $1;
+ if (!defined($oppos{'s'})) {
+ die "$fname: $line: $op without 's' operand\n";
+ }
+ if ($imm < 0 || $imm > 15) {
+ die "$fname: $line: invalid imm4 value for $op: $imm\n";
+ }
+ push(@codes, 0173, ($oppos{'s'} << 4) + $imm);
+ $prefix_ok = 0;
+ } elsif ($op =~ /^([0-9a-f]{2})\+c$/) {
+ push(@codes, 0330, hex $1);
+ $prefix_ok = 0;
+ } elsif ($op =~ /^([0-9a-f]{2})\+r$/) {
+ if (!defined($oppos{'r'})) {
+ die "$fname: $line: $op without 'r' operand\n";
+ }
+ push(@codes, 05) if ($oppos{'r'} & 4);
+ push(@codes, 010 + ($oppos{'r'} & 3), hex $1);
+ $prefix_ok = 0;
+ } elsif ($op =~ /^\\([0-7]+|x[0-9a-f]{2})$/) {
+ # Escape to enter literal bytecodes
+ push(@codes, oct $1);
+ } else {
+ die "$fname: $line: unknown operation: $op\n";
+ }
+ }
+
+ return @codes;
+}
diff --git a/x86/insnsa.c b/x86/insnsa.c
new file mode 100644
index 00000000..f7bb8a77
--- /dev/null
+++ b/x86/insnsa.c
@@ -0,0 +1,16018 @@
+/* This file auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include "nasm.h"
+#include "insns.h"
+
+static const struct itemplate instrux_DB[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DW[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DD[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DQ[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DT[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DO[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DY[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DZ[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESB[] = {
+ {I_RESB, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40664, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESW[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESD[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESQ[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_REST[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESO[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESY[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RESZ[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INCBIN[] = {
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AAA[] = {
+ {I_AAA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41526, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AAD[] = {
+ {I_AAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40526, 1},
+ {I_AAD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40530, 2},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AAM[] = {
+ {I_AAM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40534, 1},
+ {I_AAM, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40538, 2},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AAS[] = {
+ {I_AAS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41529, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADC[] = {
+ {I_ADC, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38716, 3},
+ {I_ADC, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38717, 0},
+ {I_ADC, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35008, 3},
+ {I_ADC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35009, 0},
+ {I_ADC, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35014, 4},
+ {I_ADC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35015, 5},
+ {I_ADC, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35020, 6},
+ {I_ADC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35021, 7},
+ {I_ADC, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+29201, 8},
+ {I_ADC, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+29201, 0},
+ {I_ADC, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38721, 8},
+ {I_ADC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38721, 0},
+ {I_ADC, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38726, 9},
+ {I_ADC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38726, 5},
+ {I_ADC, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38731, 10},
+ {I_ADC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38731, 7},
+ {I_ADC, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25740, 11},
+ {I_ADC, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25747, 12},
+ {I_ADC, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25754, 13},
+ {I_ADC, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40542, 8},
+ {I_ADC, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25741, 8},
+ {I_ADC, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38736, 8},
+ {I_ADC, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25748, 9},
+ {I_ADC, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38741, 9},
+ {I_ADC, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25755, 10},
+ {I_ADC, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38746, 10},
+ {I_ADC, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35026, 3},
+ {I_ADC, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25740, 3},
+ {I_ADC, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25761, 3},
+ {I_ADC, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25747, 4},
+ {I_ADC, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25768, 4},
+ {I_ADC, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25754, 6},
+ {I_ADC, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25775, 6},
+ {I_ADC, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35026, 3},
+ {I_ADC, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25740, 3},
+ {I_ADC, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25761, 3},
+ {I_ADC, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25747, 4},
+ {I_ADC, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25768, 4},
+ {I_ADC, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35032, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADD[] = {
+ {I_ADD, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38751, 3},
+ {I_ADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38752, 0},
+ {I_ADD, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35038, 3},
+ {I_ADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35039, 0},
+ {I_ADD, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35044, 4},
+ {I_ADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35045, 5},
+ {I_ADD, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35050, 6},
+ {I_ADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35051, 7},
+ {I_ADD, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+32974, 8},
+ {I_ADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+32974, 0},
+ {I_ADD, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38756, 8},
+ {I_ADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38756, 0},
+ {I_ADD, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38761, 9},
+ {I_ADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38761, 5},
+ {I_ADD, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38766, 10},
+ {I_ADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38766, 7},
+ {I_ADD, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25782, 11},
+ {I_ADD, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25789, 12},
+ {I_ADD, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25796, 13},
+ {I_ADD, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40546, 8},
+ {I_ADD, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25783, 8},
+ {I_ADD, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38771, 8},
+ {I_ADD, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25790, 9},
+ {I_ADD, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38776, 9},
+ {I_ADD, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25797, 10},
+ {I_ADD, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38781, 10},
+ {I_ADD, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35056, 3},
+ {I_ADD, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25782, 3},
+ {I_ADD, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25803, 3},
+ {I_ADD, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25789, 4},
+ {I_ADD, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25810, 4},
+ {I_ADD, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25796, 6},
+ {I_ADD, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25817, 6},
+ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35056, 3},
+ {I_ADD, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25782, 3},
+ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25803, 3},
+ {I_ADD, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25789, 4},
+ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25810, 4},
+ {I_ADD, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35062, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AND[] = {
+ {I_AND, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38786, 3},
+ {I_AND, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38787, 0},
+ {I_AND, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35068, 3},
+ {I_AND, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35069, 0},
+ {I_AND, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35074, 4},
+ {I_AND, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35075, 5},
+ {I_AND, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35080, 6},
+ {I_AND, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35081, 7},
+ {I_AND, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33254, 8},
+ {I_AND, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33254, 0},
+ {I_AND, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38791, 8},
+ {I_AND, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38791, 0},
+ {I_AND, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38796, 9},
+ {I_AND, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38796, 5},
+ {I_AND, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38801, 10},
+ {I_AND, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38801, 7},
+ {I_AND, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25824, 11},
+ {I_AND, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25831, 12},
+ {I_AND, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25838, 13},
+ {I_AND, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40550, 8},
+ {I_AND, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25825, 8},
+ {I_AND, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38806, 8},
+ {I_AND, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25832, 9},
+ {I_AND, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38811, 9},
+ {I_AND, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25839, 10},
+ {I_AND, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38816, 10},
+ {I_AND, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35086, 3},
+ {I_AND, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25824, 3},
+ {I_AND, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25845, 3},
+ {I_AND, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25831, 4},
+ {I_AND, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25852, 4},
+ {I_AND, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+25838, 6},
+ {I_AND, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25859, 6},
+ {I_AND, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35086, 3},
+ {I_AND, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25824, 3},
+ {I_AND, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25845, 3},
+ {I_AND, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25831, 4},
+ {I_AND, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25852, 4},
+ {I_AND, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35092, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ARPL[] = {
+ {I_ARPL, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25280, 15},
+ {I_ARPL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25280, 16},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BB0_RESET[] = {
+ {I_BB0_RESET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40554, 17},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BB1_RESET[] = {
+ {I_BB1_RESET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40558, 17},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BOUND[] = {
+ {I_BOUND, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38821, 18},
+ {I_BOUND, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38826, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BSF[] = {
+ {I_BSF, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25866, 9},
+ {I_BSF, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25866, 5},
+ {I_BSF, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25873, 9},
+ {I_BSF, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25873, 5},
+ {I_BSF, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25880, 10},
+ {I_BSF, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25880, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BSR[] = {
+ {I_BSR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25887, 9},
+ {I_BSR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25887, 5},
+ {I_BSR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25894, 9},
+ {I_BSR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25894, 5},
+ {I_BSR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25901, 10},
+ {I_BSR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25901, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BSWAP[] = {
+ {I_BSWAP, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35098, 20},
+ {I_BSWAP, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35104, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BT[] = {
+ {I_BT, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35110, 9},
+ {I_BT, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35110, 5},
+ {I_BT, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35116, 9},
+ {I_BT, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35116, 5},
+ {I_BT, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35122, 10},
+ {I_BT, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35122, 7},
+ {I_BT, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25908, 21},
+ {I_BT, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25915, 21},
+ {I_BT, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25922, 22},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BTC[] = {
+ {I_BTC, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25929, 4},
+ {I_BTC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25930, 5},
+ {I_BTC, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25936, 4},
+ {I_BTC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25937, 5},
+ {I_BTC, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25943, 6},
+ {I_BTC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25944, 7},
+ {I_BTC, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8340, 23},
+ {I_BTC, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8348, 23},
+ {I_BTC, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8356, 24},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BTR[] = {
+ {I_BTR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25950, 4},
+ {I_BTR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25951, 5},
+ {I_BTR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25957, 4},
+ {I_BTR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25958, 5},
+ {I_BTR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25964, 6},
+ {I_BTR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25965, 7},
+ {I_BTR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8364, 23},
+ {I_BTR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8372, 23},
+ {I_BTR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8380, 24},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BTS[] = {
+ {I_BTS, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25971, 4},
+ {I_BTS, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25972, 5},
+ {I_BTS, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25978, 4},
+ {I_BTS, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25979, 5},
+ {I_BTS, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25985, 6},
+ {I_BTS, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25986, 7},
+ {I_BTS, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8388, 23},
+ {I_BTS, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8396, 23},
+ {I_BTS, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8404, 24},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CALL[] = {
+ {I_CALL, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38831, 25},
+ {I_CALL, 1, {IMMEDIATE|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38831, 25},
+ {I_CALL, 1, {IMMEDIATE|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35128, 1},
+ {I_CALL, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38836, 26},
+ {I_CALL, 1, {IMMEDIATE|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38836, 26},
+ {I_CALL, 1, {IMMEDIATE|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35134, 1},
+ {I_CALL, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38841, 27},
+ {I_CALL, 1, {IMMEDIATE|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38841, 27},
+ {I_CALL, 1, {IMMEDIATE|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35140, 19},
+ {I_CALL, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38846, 28},
+ {I_CALL, 1, {IMMEDIATE|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38846, 28},
+ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35146, 1},
+ {I_CALL, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35152, 1},
+ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35152, 1},
+ {I_CALL, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35158, 19},
+ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35158, 19},
+ {I_CALL, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38851, 1},
+ {I_CALL, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38856, 7},
+ {I_CALL, 1, {MEMORY|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38861, 0},
+ {I_CALL, 1, {MEMORY|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38866, 5},
+ {I_CALL, 1, {MEMORY|BITS64|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38856, 7},
+ {I_CALL, 1, {MEMORY|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38871, 25},
+ {I_CALL, 1, {RM_GPR|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38876, 26},
+ {I_CALL, 1, {RM_GPR|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38881, 27},
+ {I_CALL, 1, {RM_GPR|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38886, 28},
+ {I_CALL, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38871, 25},
+ {I_CALL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38876, 26},
+ {I_CALL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38881, 27},
+ {I_CALL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38886, 28},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CBW[] = {
+ {I_CBW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40562, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CDQ[] = {
+ {I_CDQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40566, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CDQE[] = {
+ {I_CDQE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40570, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLC[] = {
+ {I_CLC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40293, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLD[] = {
+ {I_CLD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40518, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLI[] = {
+ {I_CLI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39608, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLTS[] = {
+ {I_CLTS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40574, 29},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMC[] = {
+ {I_CMC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41532, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMP[] = {
+ {I_CMP, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40578, 8},
+ {I_CMP, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40578, 0},
+ {I_CMP, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38891, 8},
+ {I_CMP, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38891, 0},
+ {I_CMP, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38896, 9},
+ {I_CMP, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38896, 5},
+ {I_CMP, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38901, 10},
+ {I_CMP, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38901, 7},
+ {I_CMP, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33212, 8},
+ {I_CMP, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33212, 0},
+ {I_CMP, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38906, 8},
+ {I_CMP, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38906, 0},
+ {I_CMP, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38911, 9},
+ {I_CMP, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38911, 5},
+ {I_CMP, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38916, 10},
+ {I_CMP, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38916, 7},
+ {I_CMP, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35164, 0},
+ {I_CMP, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35170, 5},
+ {I_CMP, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35176, 7},
+ {I_CMP, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40582, 8},
+ {I_CMP, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35164, 8},
+ {I_CMP, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38921, 8},
+ {I_CMP, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35170, 9},
+ {I_CMP, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38926, 9},
+ {I_CMP, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35176, 10},
+ {I_CMP, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38931, 10},
+ {I_CMP, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38936, 8},
+ {I_CMP, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35164, 8},
+ {I_CMP, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35182, 8},
+ {I_CMP, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35170, 9},
+ {I_CMP, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35188, 9},
+ {I_CMP, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35176, 10},
+ {I_CMP, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35194, 10},
+ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38936, 8},
+ {I_CMP, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35164, 8},
+ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35182, 8},
+ {I_CMP, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35170, 9},
+ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35188, 9},
+ {I_CMP, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38941, 30},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPSB[] = {
+ {I_CMPSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40586, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPSD[] = {
+ {I_CMPSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38946, 5},
+ {I_CMPSD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+27112, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPSQ[] = {
+ {I_CMPSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38951, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPSW[] = {
+ {I_CMPSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38956, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPXCHG[] = {
+ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35200, 31},
+ {I_CMPXCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35201, 32},
+ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25992, 31},
+ {I_CMPXCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25993, 32},
+ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25999, 31},
+ {I_CMPXCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26000, 32},
+ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26006, 6},
+ {I_CMPXCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26007, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPXCHG486[] = {
+ {I_CMPXCHG486, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38961, 33},
+ {I_CMPXCHG486, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38961, 34},
+ {I_CMPXCHG486, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35206, 33},
+ {I_CMPXCHG486, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35206, 34},
+ {I_CMPXCHG486, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35212, 33},
+ {I_CMPXCHG486, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35212, 34},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPXCHG8B[] = {
+ {I_CMPXCHG8B, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26013, 35},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPXCHG16B[] = {
+ {I_CMPXCHG16B, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35218, 13},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CPUID[] = {
+ {I_CPUID, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40590, 32},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CPU_READ[] = {
+ {I_CPU_READ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40594, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CPU_WRITE[] = {
+ {I_CPU_WRITE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40598, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CQO[] = {
+ {I_CQO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40602, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CWD[] = {
+ {I_CWD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40606, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CWDE[] = {
+ {I_CWDE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40610, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DAA[] = {
+ {I_DAA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41535, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DAS[] = {
+ {I_DAS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41538, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DEC[] = {
+ {I_DEC, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40614, 1},
+ {I_DEC, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40618, 19},
+ {I_DEC, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38966, 11},
+ {I_DEC, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35224, 11},
+ {I_DEC, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35230, 12},
+ {I_DEC, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35236, 13},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DIV[] = {
+ {I_DIV, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40622, 0},
+ {I_DIV, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38971, 0},
+ {I_DIV, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38976, 5},
+ {I_DIV, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38981, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DMINT[] = {
+ {I_DMINT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40626, 37},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_EMMS[] = {
+ {I_EMMS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40630, 38},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ENTER[] = {
+ {I_ENTER, 2, {IMMEDIATE,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38986, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_EQU[] = {
+ {I_EQU, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41570, 0},
+ {I_EQU, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41570, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_F2XM1[] = {
+ {I_F2XM1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40634, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FABS[] = {
+ {I_FABS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40638, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FADD[] = {
+ {I_FADD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40642, 40},
+ {I_FADD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40646, 40},
+ {I_FADD, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38991, 40},
+ {I_FADD, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38996, 40},
+ {I_FADD, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38991, 40},
+ {I_FADD, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39001, 40},
+ {I_FADD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40650, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FADDP[] = {
+ {I_FADDP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39006, 40},
+ {I_FADDP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39006, 40},
+ {I_FADDP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40650, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FBLD[] = {
+ {I_FBLD, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40654, 40},
+ {I_FBLD, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40654, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FBSTP[] = {
+ {I_FBSTP, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40658, 40},
+ {I_FBSTP, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40658, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCHS[] = {
+ {I_FCHS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40662, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCLEX[] = {
+ {I_FCLEX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39011, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVB[] = {
+ {I_FCMOVB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39016, 41},
+ {I_FCMOVB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39021, 41},
+ {I_FCMOVB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40666, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVBE[] = {
+ {I_FCMOVBE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39026, 41},
+ {I_FCMOVBE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39031, 41},
+ {I_FCMOVBE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40670, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVE[] = {
+ {I_FCMOVE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39036, 41},
+ {I_FCMOVE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39041, 41},
+ {I_FCMOVE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40674, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVNB[] = {
+ {I_FCMOVNB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39046, 41},
+ {I_FCMOVNB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39051, 41},
+ {I_FCMOVNB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40678, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVNBE[] = {
+ {I_FCMOVNBE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39056, 41},
+ {I_FCMOVNBE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39061, 41},
+ {I_FCMOVNBE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40682, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVNE[] = {
+ {I_FCMOVNE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39066, 41},
+ {I_FCMOVNE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39071, 41},
+ {I_FCMOVNE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40686, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVNU[] = {
+ {I_FCMOVNU, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39076, 41},
+ {I_FCMOVNU, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39081, 41},
+ {I_FCMOVNU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40690, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCMOVU[] = {
+ {I_FCMOVU, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39086, 41},
+ {I_FCMOVU, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39091, 41},
+ {I_FCMOVU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40694, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOM[] = {
+ {I_FCOM, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40698, 40},
+ {I_FCOM, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40702, 40},
+ {I_FCOM, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39096, 40},
+ {I_FCOM, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39101, 40},
+ {I_FCOM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40706, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOMI[] = {
+ {I_FCOMI, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39106, 41},
+ {I_FCOMI, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39111, 41},
+ {I_FCOMI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40710, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOMIP[] = {
+ {I_FCOMIP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39116, 41},
+ {I_FCOMIP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39121, 41},
+ {I_FCOMIP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40714, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOMP[] = {
+ {I_FCOMP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40718, 40},
+ {I_FCOMP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40722, 40},
+ {I_FCOMP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39126, 40},
+ {I_FCOMP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39131, 40},
+ {I_FCOMP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40726, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOMPP[] = {
+ {I_FCOMPP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40730, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FCOS[] = {
+ {I_FCOS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40734, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDECSTP[] = {
+ {I_FDECSTP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40738, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDISI[] = {
+ {I_FDISI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39136, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDIV[] = {
+ {I_FDIV, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40742, 40},
+ {I_FDIV, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40746, 40},
+ {I_FDIV, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39141, 40},
+ {I_FDIV, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39146, 40},
+ {I_FDIV, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39141, 40},
+ {I_FDIV, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39151, 40},
+ {I_FDIV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40750, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDIVP[] = {
+ {I_FDIVP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39156, 40},
+ {I_FDIVP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39156, 40},
+ {I_FDIVP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40750, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDIVR[] = {
+ {I_FDIVR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40754, 40},
+ {I_FDIVR, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40758, 40},
+ {I_FDIVR, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39161, 40},
+ {I_FDIVR, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39161, 40},
+ {I_FDIVR, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39166, 40},
+ {I_FDIVR, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39171, 40},
+ {I_FDIVR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40762, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FDIVRP[] = {
+ {I_FDIVRP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39176, 40},
+ {I_FDIVRP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39176, 40},
+ {I_FDIVRP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40762, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FEMMS[] = {
+ {I_FEMMS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40766, 43},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FENI[] = {
+ {I_FENI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39181, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FFREE[] = {
+ {I_FFREE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39186, 40},
+ {I_FFREE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40770, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FFREEP[] = {
+ {I_FFREEP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39191, 44},
+ {I_FFREEP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40774, 44},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FIADD[] = {
+ {I_FIADD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40778, 40},
+ {I_FIADD, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40782, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FICOM[] = {
+ {I_FICOM, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40786, 40},
+ {I_FICOM, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40790, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FICOMP[] = {
+ {I_FICOMP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40794, 40},
+ {I_FICOMP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40798, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FIDIV[] = {
+ {I_FIDIV, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40802, 40},
+ {I_FIDIV, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40806, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FIDIVR[] = {
+ {I_FIDIVR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40810, 40},
+ {I_FIDIVR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40814, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FILD[] = {
+ {I_FILD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40818, 40},
+ {I_FILD, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40822, 40},
+ {I_FILD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40826, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FIMUL[] = {
+ {I_FIMUL, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40830, 40},
+ {I_FIMUL, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40834, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FINCSTP[] = {
+ {I_FINCSTP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40838, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FINIT[] = {
+ {I_FINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39196, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FIST[] = {
+ {I_FIST, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40842, 40},
+ {I_FIST, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40846, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FISTP[] = {
+ {I_FISTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40850, 40},
+ {I_FISTP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40854, 40},
+ {I_FISTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40858, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FISTTP[] = {
+ {I_FISTTP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40862, 45},
+ {I_FISTTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40866, 45},
+ {I_FISTTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40870, 45},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FISUB[] = {
+ {I_FISUB, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40874, 40},
+ {I_FISUB, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40878, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FISUBR[] = {
+ {I_FISUBR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40882, 40},
+ {I_FISUBR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40886, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLD[] = {
+ {I_FLD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40890, 40},
+ {I_FLD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40894, 40},
+ {I_FLD, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40898, 40},
+ {I_FLD, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39201, 40},
+ {I_FLD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40902, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLD1[] = {
+ {I_FLD1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40906, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDCW[] = {
+ {I_FLDCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40910, 46},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDENV[] = {
+ {I_FLDENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40914, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDL2E[] = {
+ {I_FLDL2E, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40918, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDL2T[] = {
+ {I_FLDL2T, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40922, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDLG2[] = {
+ {I_FLDLG2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40926, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDLN2[] = {
+ {I_FLDLN2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40930, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDPI[] = {
+ {I_FLDPI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40934, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FLDZ[] = {
+ {I_FLDZ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40938, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FMUL[] = {
+ {I_FMUL, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40942, 40},
+ {I_FMUL, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40946, 40},
+ {I_FMUL, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39206, 40},
+ {I_FMUL, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39206, 40},
+ {I_FMUL, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39211, 40},
+ {I_FMUL, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39216, 40},
+ {I_FMUL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40950, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FMULP[] = {
+ {I_FMULP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39221, 40},
+ {I_FMULP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39221, 40},
+ {I_FMULP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40950, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNCLEX[] = {
+ {I_FNCLEX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39012, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNDISI[] = {
+ {I_FNDISI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39137, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNENI[] = {
+ {I_FNENI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39182, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNINIT[] = {
+ {I_FNINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39197, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNOP[] = {
+ {I_FNOP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40954, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNSAVE[] = {
+ {I_FNSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39227, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNSTCW[] = {
+ {I_FNSTCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39237, 46},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNSTENV[] = {
+ {I_FNSTENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39242, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FNSTSW[] = {
+ {I_FNSTSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39252, 46},
+ {I_FNSTSW, 1, {REG_AX,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39257, 47},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FPATAN[] = {
+ {I_FPATAN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40958, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FPREM[] = {
+ {I_FPREM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40962, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FPREM1[] = {
+ {I_FPREM1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40966, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FPTAN[] = {
+ {I_FPTAN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40970, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FRNDINT[] = {
+ {I_FRNDINT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40974, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FRSTOR[] = {
+ {I_FRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40978, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSAVE[] = {
+ {I_FSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39226, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSCALE[] = {
+ {I_FSCALE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40982, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSETPM[] = {
+ {I_FSETPM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40986, 47},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSIN[] = {
+ {I_FSIN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40990, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSINCOS[] = {
+ {I_FSINCOS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40994, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSQRT[] = {
+ {I_FSQRT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40998, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FST[] = {
+ {I_FST, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41002, 40},
+ {I_FST, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41006, 40},
+ {I_FST, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39231, 40},
+ {I_FST, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41010, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSTCW[] = {
+ {I_FSTCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39236, 46},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSTENV[] = {
+ {I_FSTENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39241, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSTP[] = {
+ {I_FSTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41014, 40},
+ {I_FSTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41018, 40},
+ {I_FSTP, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41022, 40},
+ {I_FSTP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39246, 40},
+ {I_FSTP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41026, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSTSW[] = {
+ {I_FSTSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39251, 46},
+ {I_FSTSW, 1, {REG_AX,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39256, 47},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSUB[] = {
+ {I_FSUB, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41030, 40},
+ {I_FSUB, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41034, 40},
+ {I_FSUB, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39261, 40},
+ {I_FSUB, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39261, 40},
+ {I_FSUB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39266, 40},
+ {I_FSUB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39271, 40},
+ {I_FSUB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41038, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSUBP[] = {
+ {I_FSUBP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39276, 40},
+ {I_FSUBP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39276, 40},
+ {I_FSUBP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41038, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSUBR[] = {
+ {I_FSUBR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41042, 40},
+ {I_FSUBR, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41046, 40},
+ {I_FSUBR, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39281, 40},
+ {I_FSUBR, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39281, 40},
+ {I_FSUBR, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39286, 40},
+ {I_FSUBR, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39291, 40},
+ {I_FSUBR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41050, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FSUBRP[] = {
+ {I_FSUBRP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39296, 40},
+ {I_FSUBRP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39296, 40},
+ {I_FSUBRP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41050, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FTST[] = {
+ {I_FTST, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41054, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FUCOM[] = {
+ {I_FUCOM, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39301, 42},
+ {I_FUCOM, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39306, 42},
+ {I_FUCOM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41058, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FUCOMI[] = {
+ {I_FUCOMI, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39311, 41},
+ {I_FUCOMI, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39316, 41},
+ {I_FUCOMI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41062, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FUCOMIP[] = {
+ {I_FUCOMIP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39321, 41},
+ {I_FUCOMIP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39326, 41},
+ {I_FUCOMIP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41066, 41},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FUCOMP[] = {
+ {I_FUCOMP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39331, 42},
+ {I_FUCOMP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39336, 42},
+ {I_FUCOMP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41070, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FUCOMPP[] = {
+ {I_FUCOMPP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41074, 42},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXAM[] = {
+ {I_FXAM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41078, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXCH[] = {
+ {I_FXCH, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39341, 40},
+ {I_FXCH, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39341, 40},
+ {I_FXCH, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39346, 40},
+ {I_FXCH, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41082, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXTRACT[] = {
+ {I_FXTRACT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41086, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FYL2X[] = {
+ {I_FYL2X, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41090, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FYL2XP1[] = {
+ {I_FYL2XP1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41094, 40},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HLT[] = {
+ {I_HLT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41541, 48},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IBTS[] = {
+ {I_IBTS, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35206, 49},
+ {I_IBTS, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35206, 50},
+ {I_IBTS, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35212, 51},
+ {I_IBTS, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35212, 50},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ICEBP[] = {
+ {I_ICEBP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IDIV[] = {
+ {I_IDIV, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41098, 0},
+ {I_IDIV, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39351, 0},
+ {I_IDIV, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39356, 5},
+ {I_IDIV, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39361, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IMUL[] = {
+ {I_IMUL, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41102, 0},
+ {I_IMUL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39366, 0},
+ {I_IMUL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39371, 5},
+ {I_IMUL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39376, 7},
+ {I_IMUL, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35242, 9},
+ {I_IMUL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35242, 5},
+ {I_IMUL, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35248, 9},
+ {I_IMUL, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35248, 5},
+ {I_IMUL, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35254, 10},
+ {I_IMUL, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35254, 7},
+ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 52},
+ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,SBYTEWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 52},
+ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,IMMEDIATE|BITS16,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 52},
+ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 52},
+ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 39},
+ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,SBYTEWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 52},
+ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE|BITS16,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 39},
+ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 52},
+ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 9},
+ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,SBYTEDWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 9},
+ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 9},
+ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 9},
+ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 5},
+ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,SBYTEDWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 9},
+ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 5},
+ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 9},
+ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 10},
+ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,SBYTEDWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 10},
+ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35290, 10},
+ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35296, 10},
+ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 7},
+ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,SBYTEDWORD,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 10},
+ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35290, 7},
+ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+35296, 10},
+ {I_IMUL, 2, {REG_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35302, 39},
+ {I_IMUL, 2, {REG_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35302, 52},
+ {I_IMUL, 2, {REG_GPR|BITS16,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35308, 39},
+ {I_IMUL, 2, {REG_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35308, 52},
+ {I_IMUL, 2, {REG_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35314, 5},
+ {I_IMUL, 2, {REG_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35314, 9},
+ {I_IMUL, 2, {REG_GPR|BITS32,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35320, 5},
+ {I_IMUL, 2, {REG_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35320, 9},
+ {I_IMUL, 2, {REG_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35326, 7},
+ {I_IMUL, 2, {REG_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+35326, 10},
+ {I_IMUL, 2, {REG_GPR|BITS64,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35332, 7},
+ {I_IMUL, 2, {REG_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35332, 10},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IN[] = {
+ {I_IN, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41106, 53},
+ {I_IN, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39381, 53},
+ {I_IN, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39386, 21},
+ {I_IN, 2, {REG_AL,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41547, 0},
+ {I_IN, 2, {REG_AX,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41110, 0},
+ {I_IN, 2, {REG_EAX,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41114, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INC[] = {
+ {I_INC, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41118, 1},
+ {I_INC, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41122, 19},
+ {I_INC, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39391, 11},
+ {I_INC, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35338, 11},
+ {I_INC, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35344, 12},
+ {I_INC, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35350, 13},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INSB[] = {
+ {I_INSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41550, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INSD[] = {
+ {I_INSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41126, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INSW[] = {
+ {I_INSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41130, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INT[] = {
+ {I_INT, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41134, 53},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INT01[] = {
+ {I_INT01, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INT1[] = {
+ {I_INT1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INT03[] = {
+ {I_INT03, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41553, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INT3[] = {
+ {I_INT3, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41553, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INTO[] = {
+ {I_INTO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41556, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVD[] = {
+ {I_INVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41138, 54},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVPCID[] = {
+ {I_INVPCID, 2, {REG_GPR|BITS32,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+26020, 55},
+ {I_INVPCID, 2, {REG_GPR|BITS64,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+26020, 56},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVLPG[] = {
+ {I_INVLPG, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39396, 54},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVLPGA[] = {
+ {I_INVLPGA, 2, {REG_AX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35356, 57},
+ {I_INVLPGA, 2, {REG_EAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35362, 58},
+ {I_INVLPGA, 2, {REG_RAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26027, 59},
+ {I_INVLPGA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35363, 58},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IRET[] = {
+ {I_IRET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41142, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IRETD[] = {
+ {I_IRETD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41146, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IRETQ[] = {
+ {I_IRETQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41150, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_IRETW[] = {
+ {I_IRETW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41154, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_JCXZ[] = {
+ {I_JCXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39401, 1},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_JECXZ[] = {
+ {I_JECXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39406, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_JRCXZ[] = {
+ {I_JRCXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39411, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_JMP[] = {
+ {I_JMP, 1, {IMMEDIATE|SHORT,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39417, 0},
+ {I_JMP, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39416, 0},
+ {I_JMP, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39421, 25},
+ {I_JMP, 1, {IMMEDIATE|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39421, 25},
+ {I_JMP, 1, {IMMEDIATE|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35368, 1},
+ {I_JMP, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39426, 26},
+ {I_JMP, 1, {IMMEDIATE|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39426, 26},
+ {I_JMP, 1, {IMMEDIATE|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35374, 1},
+ {I_JMP, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39431, 27},
+ {I_JMP, 1, {IMMEDIATE|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39431, 27},
+ {I_JMP, 1, {IMMEDIATE|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35380, 19},
+ {I_JMP, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39436, 28},
+ {I_JMP, 1, {IMMEDIATE|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39436, 28},
+ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35386, 1},
+ {I_JMP, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35392, 1},
+ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35392, 1},
+ {I_JMP, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35398, 19},
+ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35398, 19},
+ {I_JMP, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39441, 1},
+ {I_JMP, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39446, 7},
+ {I_JMP, 1, {MEMORY|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39451, 0},
+ {I_JMP, 1, {MEMORY|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39456, 5},
+ {I_JMP, 1, {MEMORY|BITS64|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39446, 7},
+ {I_JMP, 1, {MEMORY|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39461, 25},
+ {I_JMP, 1, {RM_GPR|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39466, 26},
+ {I_JMP, 1, {RM_GPR|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39471, 27},
+ {I_JMP, 1, {RM_GPR|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39476, 28},
+ {I_JMP, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39461, 25},
+ {I_JMP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39466, 26},
+ {I_JMP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39471, 27},
+ {I_JMP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39476, 28},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_JMPE[] = {
+ {I_JMPE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35404, 60},
+ {I_JMPE, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35410, 60},
+ {I_JMPE, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35416, 60},
+ {I_JMPE, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35422, 60},
+ {I_JMPE, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35428, 60},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LAHF[] = {
+ {I_LAHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41559, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LAR[] = {
+ {I_LAR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 61},
+ {I_LAR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 62},
+ {I_LAR, 2, {REG_GPR|BITS16,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 63},
+ {I_LAR, 2, {REG_GPR|BITS16,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26034, 64},
+ {I_LAR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 65},
+ {I_LAR, 2, {REG_GPR|BITS32,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 63},
+ {I_LAR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 63},
+ {I_LAR, 2, {REG_GPR|BITS32,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26041, 64},
+ {I_LAR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 66},
+ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LDS[] = {
+ {I_LDS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39481, 1},
+ {I_LDS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39486, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LEA[] = {
+ {I_LEA, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39491, 0},
+ {I_LEA, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39496, 5},
+ {I_LEA, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39501, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LEAVE[] = {
+ {I_LEAVE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39753, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LES[] = {
+ {I_LES, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39506, 1},
+ {I_LES, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39511, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LFENCE[] = {
+ {I_LFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35452, 59},
+ {I_LFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35452, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LFS[] = {
+ {I_LFS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35458, 5},
+ {I_LFS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35464, 5},
+ {I_LFS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35470, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LGDT[] = {
+ {I_LGDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39516, 29},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LGS[] = {
+ {I_LGS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35476, 5},
+ {I_LGS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35482, 5},
+ {I_LGS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35488, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LIDT[] = {
+ {I_LIDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39521, 29},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LLDT[] = {
+ {I_LLDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ {I_LLDT, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ {I_LLDT, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LMSW[] = {
+ {I_LMSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ {I_LMSW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ {I_LMSW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOADALL[] = {
+ {I_LOADALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41158, 50},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOADALL286[] = {
+ {I_LOADALL286, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41162, 68},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LODSB[] = {
+ {I_LODSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41562, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LODSD[] = {
+ {I_LODSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41166, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LODSQ[] = {
+ {I_LODSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41170, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LODSW[] = {
+ {I_LODSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41174, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOOP[] = {
+ {I_LOOP, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39536, 0},
+ {I_LOOP, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39541, 1},
+ {I_LOOP, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39546, 5},
+ {I_LOOP, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39551, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOOPE[] = {
+ {I_LOOPE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39556, 0},
+ {I_LOOPE, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39561, 1},
+ {I_LOOPE, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39566, 5},
+ {I_LOOPE, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39571, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOOPNE[] = {
+ {I_LOOPNE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39576, 0},
+ {I_LOOPNE, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39581, 1},
+ {I_LOOPNE, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39586, 5},
+ {I_LOOPNE, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39591, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOOPNZ[] = {
+ {I_LOOPNZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39576, 0},
+ {I_LOOPNZ, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39581, 1},
+ {I_LOOPNZ, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39586, 5},
+ {I_LOOPNZ, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39591, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LOOPZ[] = {
+ {I_LOOPZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39556, 0},
+ {I_LOOPZ, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39561, 1},
+ {I_LOOPZ, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39566, 5},
+ {I_LOOPZ, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39571, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LSL[] = {
+ {I_LSL, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 61},
+ {I_LSL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 62},
+ {I_LSL, 2, {REG_GPR|BITS16,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 63},
+ {I_LSL, 2, {REG_GPR|BITS16,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26048, 64},
+ {I_LSL, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 65},
+ {I_LSL, 2, {REG_GPR|BITS32,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 63},
+ {I_LSL, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 63},
+ {I_LSL, 2, {REG_GPR|BITS32,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26055, 64},
+ {I_LSL, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 66},
+ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LSS[] = {
+ {I_LSS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35512, 5},
+ {I_LSS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35518, 5},
+ {I_LSS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35524, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LTR[] = {
+ {I_LTR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ {I_LTR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ {I_LTR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MFENCE[] = {
+ {I_MFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35530, 59},
+ {I_MFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35530, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MONITOR[] = {
+ {I_MONITOR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39601, 69},
+ {I_MONITOR, 3, {REG_EAX,REG_ECX,REG_EDX,0,0}, NO_DECORATOR, nasm_bytecodes+39601, 70},
+ {I_MONITOR, 3, {REG_RAX,REG_ECX,REG_EDX,0,0}, NO_DECORATOR, nasm_bytecodes+39601, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MONITORX[] = {
+ {I_MONITORX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39606, 71},
+ {I_MONITORX, 3, {REG_RAX,REG_ECX,REG_EDX,0,0}, NO_DECORATOR, nasm_bytecodes+39606, 59},
+ {I_MONITORX, 3, {REG_EAX,REG_ECX,REG_EDX,0,0}, NO_DECORATOR, nasm_bytecodes+39606, 71},
+ {I_MONITORX, 3, {REG_AX,REG_ECX,REG_EDX,0,0}, NO_DECORATOR, nasm_bytecodes+39606, 71},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOV[] = {
+ {I_MOV, 2, {MEMORY,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39627, 72},
+ {I_MOV, 2, {REG_GPR|BITS16,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39611, 0},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39616, 5},
+ {I_MOV, 2, {REG_GPR|BITS64,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39621, 73},
+ {I_MOV, 2, {RM_GPR|BITS64,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39626, 7},
+ {I_MOV, 2, {REG_SREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39647, 72},
+ {I_MOV, 2, {REG_SREG,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39647, 74},
+ {I_MOV, 2, {REG_SREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39647, 75},
+ {I_MOV, 2, {REG_SREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39631, 73},
+ {I_MOV, 2, {REG_SREG,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39636, 0},
+ {I_MOV, 2, {REG_SREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39641, 5},
+ {I_MOV, 2, {REG_SREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39646, 7},
+ {I_MOV, 2, {REG_AL,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+41178, 8},
+ {I_MOV, 2, {REG_AX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39651, 8},
+ {I_MOV, 2, {REG_EAX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39656, 9},
+ {I_MOV, 2, {REG_RAX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39661, 10},
+ {I_MOV, 2, {MEM_OFFS,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41182, 76},
+ {I_MOV, 2, {MEM_OFFS,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39666, 76},
+ {I_MOV, 2, {MEM_OFFS,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39671, 77},
+ {I_MOV, 2, {MEM_OFFS,REG_RAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39676, 78},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_CREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35536, 79},
+ {I_MOV, 2, {REG_GPR|BITS64,REG_CREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35542, 80},
+ {I_MOV, 2, {REG_CREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35548, 79},
+ {I_MOV, 2, {REG_CREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35554, 80},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_DREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35561, 79},
+ {I_MOV, 2, {REG_GPR|BITS64,REG_DREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35560, 80},
+ {I_MOV, 2, {REG_DREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35567, 79},
+ {I_MOV, 2, {REG_DREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35566, 80},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_TREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39681, 19},
+ {I_MOV, 2, {REG_TREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39686, 19},
+ {I_MOV, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39691, 8},
+ {I_MOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39692, 0},
+ {I_MOV, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35572, 8},
+ {I_MOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35573, 0},
+ {I_MOV, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35578, 9},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35579, 5},
+ {I_MOV, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35584, 10},
+ {I_MOV, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35585, 7},
+ {I_MOV, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41186, 8},
+ {I_MOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41186, 0},
+ {I_MOV, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39696, 8},
+ {I_MOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39696, 0},
+ {I_MOV, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39701, 9},
+ {I_MOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39701, 5},
+ {I_MOV, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39706, 10},
+ {I_MOV, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39706, 7},
+ {I_MOV, 2, {REG_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41190, 8},
+ {I_MOV, 2, {REG_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39711, 8},
+ {I_MOV, 2, {REG_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39716, 9},
+ {I_MOV, 2, {REG_GPR|BITS64,UDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+39721, 81},
+ {I_MOV, 2, {REG_GPR|BITS64,SDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26077, 81},
+ {I_MOV, 2, {REG_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39726, 10},
+ {I_MOV, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35590, 8},
+ {I_MOV, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26062, 8},
+ {I_MOV, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26069, 9},
+ {I_MOV, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26076, 10},
+ {I_MOV, 2, {RM_GPR|BITS64,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26076, 7},
+ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35590, 8},
+ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26062, 8},
+ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26069, 9},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVD[] = {
+ {I_MOVD, 2, {MMXREG,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35596, 82},
+ {I_MOVD, 2, {RM_GPR|BITS32,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35602, 82},
+ {I_MOVD, 2, {MMXREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26083, 83},
+ {I_MOVD, 2, {RM_GPR|BITS64,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+26090, 83},
+ {I_MOVD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26958, 144},
+ {I_MOVD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26965, 144},
+ {I_MOVD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26965, 140},
+ {I_MOVD, 2, {RM_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26958, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVQ[] = {
+ {I_MOVQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35608, 84},
+ {I_MOVQ, 2, {RM_MMX,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35614, 84},
+ {I_MOVQ, 2, {MMXREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26083, 85},
+ {I_MOVQ, 2, {RM_GPR|BITS64,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+26090, 85},
+ {I_MOVQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36580, 140},
+ {I_MOVQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36586, 140},
+ {I_MOVQ, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36586, 145},
+ {I_MOVQ, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36580, 145},
+ {I_MOVQ, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26972, 146},
+ {I_MOVQ, 2, {RM_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26979, 146},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSB[] = {
+ {I_MOVSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8473, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSD[] = {
+ {I_MOVSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41194, 5},
+ {I_MOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37138, 140},
+ {I_MOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37144, 140},
+ {I_MOVSD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37144, 140},
+ {I_MOVSD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+37138, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSQ[] = {
+ {I_MOVSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41198, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSW[] = {
+ {I_MOVSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41202, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSX[] = {
+ {I_MOVSX, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35620, 21},
+ {I_MOVSX, 2, {REG_GPR|BITS16,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35620, 5},
+ {I_MOVSX, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35626, 5},
+ {I_MOVSX, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35632, 5},
+ {I_MOVSX, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35638, 7},
+ {I_MOVSX, 2, {REG_GPR|BITS64,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35644, 7},
+ {I_MOVSX, 2, {REG_GPR|BITS64,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39731, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSXD[] = {
+ {I_MOVSXD, 2, {REG_GPR|BITS64,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39731, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVZX[] = {
+ {I_MOVZX, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35650, 21},
+ {I_MOVZX, 2, {REG_GPR|BITS16,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35650, 5},
+ {I_MOVZX, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35656, 5},
+ {I_MOVZX, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35662, 5},
+ {I_MOVZX, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35668, 7},
+ {I_MOVZX, 2, {REG_GPR|BITS64,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35674, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MUL[] = {
+ {I_MUL, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41206, 0},
+ {I_MUL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39736, 0},
+ {I_MUL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39741, 5},
+ {I_MUL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39746, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MWAIT[] = {
+ {I_MWAIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39751, 69},
+ {I_MWAIT, 2, {REG_EAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39751, 69},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MWAITX[] = {
+ {I_MWAITX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39756, 71},
+ {I_MWAITX, 2, {REG_EAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39756, 71},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_NEG[] = {
+ {I_NEG, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39761, 11},
+ {I_NEG, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35680, 11},
+ {I_NEG, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35686, 12},
+ {I_NEG, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35692, 13},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_NOP[] = {
+ {I_NOP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39766, 0},
+ {I_NOP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35698, 86},
+ {I_NOP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35704, 86},
+ {I_NOP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35710, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_NOT[] = {
+ {I_NOT, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39771, 11},
+ {I_NOT, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35716, 11},
+ {I_NOT, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35722, 12},
+ {I_NOT, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35728, 13},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_OR[] = {
+ {I_OR, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39776, 3},
+ {I_OR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39777, 0},
+ {I_OR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35734, 3},
+ {I_OR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35735, 0},
+ {I_OR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35740, 4},
+ {I_OR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35741, 5},
+ {I_OR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35746, 6},
+ {I_OR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35747, 7},
+ {I_OR, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33499, 8},
+ {I_OR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33499, 0},
+ {I_OR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39781, 8},
+ {I_OR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39781, 0},
+ {I_OR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39786, 9},
+ {I_OR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39786, 5},
+ {I_OR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39791, 10},
+ {I_OR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39791, 7},
+ {I_OR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26097, 11},
+ {I_OR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26104, 12},
+ {I_OR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26111, 13},
+ {I_OR, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41210, 8},
+ {I_OR, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26098, 8},
+ {I_OR, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39796, 8},
+ {I_OR, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26105, 9},
+ {I_OR, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39801, 9},
+ {I_OR, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26112, 10},
+ {I_OR, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39806, 10},
+ {I_OR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35752, 3},
+ {I_OR, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26097, 3},
+ {I_OR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26118, 3},
+ {I_OR, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26104, 4},
+ {I_OR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26125, 4},
+ {I_OR, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26111, 6},
+ {I_OR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26132, 6},
+ {I_OR, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35752, 3},
+ {I_OR, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26097, 3},
+ {I_OR, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26118, 3},
+ {I_OR, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26104, 4},
+ {I_OR, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26125, 4},
+ {I_OR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35758, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_OUT[] = {
+ {I_OUT, 2, {IMMEDIATE,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41214, 53},
+ {I_OUT, 2, {IMMEDIATE,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39811, 53},
+ {I_OUT, 2, {IMMEDIATE,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39816, 21},
+ {I_OUT, 2, {REG_DX,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40508, 0},
+ {I_OUT, 2, {REG_DX,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41218, 0},
+ {I_OUT, 2, {REG_DX,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41222, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_OUTSB[] = {
+ {I_OUTSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41565, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_OUTSD[] = {
+ {I_OUTSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41226, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_OUTSW[] = {
+ {I_OUTSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41230, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PACKSSDW[] = {
+ {I_PACKSSDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26139, 84},
+ {I_PACKSSDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36604, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PACKSSWB[] = {
+ {I_PACKSSWB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26146, 84},
+ {I_PACKSSWB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36598, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PACKUSWB[] = {
+ {I_PACKUSWB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26153, 84},
+ {I_PACKUSWB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36610, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDB[] = {
+ {I_PADDB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26160, 84},
+ {I_PADDB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36616, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDD[] = {
+ {I_PADDD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26167, 84},
+ {I_PADDD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36628, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDSB[] = {
+ {I_PADDSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26174, 84},
+ {I_PADDSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36646, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDSIW[] = {
+ {I_PADDSIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35764, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDSW[] = {
+ {I_PADDSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26181, 84},
+ {I_PADDSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36652, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDUSB[] = {
+ {I_PADDUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26188, 84},
+ {I_PADDUSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36658, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDUSW[] = {
+ {I_PADDUSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26195, 84},
+ {I_PADDUSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36664, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDW[] = {
+ {I_PADDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26202, 84},
+ {I_PADDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36622, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAND[] = {
+ {I_PAND, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26209, 84},
+ {I_PAND, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36670, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PANDN[] = {
+ {I_PANDN, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26216, 84},
+ {I_PANDN, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36676, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAUSE[] = {
+ {I_PAUSE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41234, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAVEB[] = {
+ {I_PAVEB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35770, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAVGUSB[] = {
+ {I_PAVGUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8412, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPEQB[] = {
+ {I_PCMPEQB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26223, 84},
+ {I_PCMPEQB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36694, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPEQD[] = {
+ {I_PCMPEQD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26230, 84},
+ {I_PCMPEQD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36706, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPEQW[] = {
+ {I_PCMPEQW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26237, 84},
+ {I_PCMPEQW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36700, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPGTB[] = {
+ {I_PCMPGTB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26244, 84},
+ {I_PCMPGTB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36712, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPGTD[] = {
+ {I_PCMPGTD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26251, 84},
+ {I_PCMPGTD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36724, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPGTW[] = {
+ {I_PCMPGTW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26258, 84},
+ {I_PCMPGTW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36718, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PDISTIB[] = {
+ {I_PDISTIB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36971, 89},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PF2ID[] = {
+ {I_PF2ID, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8420, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFACC[] = {
+ {I_PFACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8428, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFADD[] = {
+ {I_PFADD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8436, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFCMPEQ[] = {
+ {I_PFCMPEQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8444, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFCMPGE[] = {
+ {I_PFCMPGE, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8452, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFCMPGT[] = {
+ {I_PFCMPGT, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8460, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFMAX[] = {
+ {I_PFMAX, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8468, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFMIN[] = {
+ {I_PFMIN, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8476, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFMUL[] = {
+ {I_PFMUL, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8484, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRCP[] = {
+ {I_PFRCP, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8492, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRCPIT1[] = {
+ {I_PFRCPIT1, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8500, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRCPIT2[] = {
+ {I_PFRCPIT2, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8508, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRSQIT1[] = {
+ {I_PFRSQIT1, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8516, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRSQRT[] = {
+ {I_PFRSQRT, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8524, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFSUB[] = {
+ {I_PFSUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8532, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFSUBR[] = {
+ {I_PFSUBR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8540, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PI2FD[] = {
+ {I_PI2FD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8548, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMACHRIW[] = {
+ {I_PMACHRIW, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37067, 89},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMADDWD[] = {
+ {I_PMADDWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26265, 84},
+ {I_PMADDWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36730, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAGW[] = {
+ {I_PMAGW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35776, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHRIW[] = {
+ {I_PMULHRIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35782, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHRWA[] = {
+ {I_PMULHRWA, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8556, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHRWC[] = {
+ {I_PMULHRWC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35788, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHW[] = {
+ {I_PMULHW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26272, 84},
+ {I_PMULHW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36772, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULLW[] = {
+ {I_PMULLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26279, 84},
+ {I_PMULLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36778, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMVGEZB[] = {
+ {I_PMVGEZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37199, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMVLZB[] = {
+ {I_PMVLZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37055, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMVNZB[] = {
+ {I_PMVNZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37037, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMVZB[] = {
+ {I_PMVZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36959, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POP[] = {
+ {I_POP, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41238, 0},
+ {I_POP, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41242, 19},
+ {I_POP, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41246, 7},
+ {I_POP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39821, 0},
+ {I_POP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39826, 19},
+ {I_POP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39831, 7},
+ {I_POP, 1, {REG_ES,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8849, 1},
+ {I_POP, 1, {REG_CS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3495, 90},
+ {I_POP, 1, {REG_SS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3621, 1},
+ {I_POP, 1, {REG_DS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3765, 1},
+ {I_POP, 1, {REG_FS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41250, 5},
+ {I_POP, 1, {REG_GS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41254, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPA[] = {
+ {I_POPA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41258, 18},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPAD[] = {
+ {I_POPAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41262, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPAW[] = {
+ {I_POPAW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41266, 18},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPF[] = {
+ {I_POPF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41270, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPFD[] = {
+ {I_POPFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41274, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPFQ[] = {
+ {I_POPFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41274, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPFW[] = {
+ {I_POPFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41278, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POR[] = {
+ {I_POR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26286, 84},
+ {I_POR, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36790, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCH[] = {
+ {I_PREFETCH, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39836, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHW[] = {
+ {I_PREFETCHW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39841, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSLLD[] = {
+ {I_PSLLD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26293, 84},
+ {I_PSLLD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26300, 38},
+ {I_PSLLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36808, 141},
+ {I_PSLLD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27042, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSLLQ[] = {
+ {I_PSLLQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26307, 84},
+ {I_PSLLQ, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26314, 38},
+ {I_PSLLQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36814, 141},
+ {I_PSLLQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27049, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSLLW[] = {
+ {I_PSLLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26321, 84},
+ {I_PSLLW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26328, 38},
+ {I_PSLLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36802, 141},
+ {I_PSLLW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27035, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRAD[] = {
+ {I_PSRAD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26335, 84},
+ {I_PSRAD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26342, 38},
+ {I_PSRAD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36826, 141},
+ {I_PSRAD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27063, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRAW[] = {
+ {I_PSRAW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26349, 84},
+ {I_PSRAW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26356, 38},
+ {I_PSRAW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36820, 141},
+ {I_PSRAW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27056, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRLD[] = {
+ {I_PSRLD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26363, 84},
+ {I_PSRLD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26370, 38},
+ {I_PSRLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36838, 141},
+ {I_PSRLD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27084, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRLQ[] = {
+ {I_PSRLQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26377, 84},
+ {I_PSRLQ, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26384, 38},
+ {I_PSRLQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36844, 141},
+ {I_PSRLQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27091, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRLW[] = {
+ {I_PSRLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26391, 84},
+ {I_PSRLW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26398, 38},
+ {I_PSRLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36832, 141},
+ {I_PSRLW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27077, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBB[] = {
+ {I_PSUBB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26405, 84},
+ {I_PSUBB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36850, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBD[] = {
+ {I_PSUBD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26412, 84},
+ {I_PSUBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36862, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBSB[] = {
+ {I_PSUBSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26419, 84},
+ {I_PSUBSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36874, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBSIW[] = {
+ {I_PSUBSIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35794, 87},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBSW[] = {
+ {I_PSUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26426, 84},
+ {I_PSUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36880, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBUSB[] = {
+ {I_PSUBUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26433, 84},
+ {I_PSUBUSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36886, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBUSW[] = {
+ {I_PSUBUSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26440, 84},
+ {I_PSUBUSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36892, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBW[] = {
+ {I_PSUBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26447, 84},
+ {I_PSUBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36856, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKHBW[] = {
+ {I_PUNPCKHBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26454, 84},
+ {I_PUNPCKHBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36898, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKHDQ[] = {
+ {I_PUNPCKHDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26461, 84},
+ {I_PUNPCKHDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36910, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKHWD[] = {
+ {I_PUNPCKHWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26468, 84},
+ {I_PUNPCKHWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36904, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKLBW[] = {
+ {I_PUNPCKLBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26475, 84},
+ {I_PUNPCKLBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36922, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKLDQ[] = {
+ {I_PUNPCKLDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26482, 84},
+ {I_PUNPCKLDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36934, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKLWD[] = {
+ {I_PUNPCKLWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26489, 84},
+ {I_PUNPCKLWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36928, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSH[] = {
+ {I_PUSH, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41282, 0},
+ {I_PUSH, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41286, 19},
+ {I_PUSH, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41290, 7},
+ {I_PUSH, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39846, 0},
+ {I_PUSH, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39851, 19},
+ {I_PUSH, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39856, 7},
+ {I_PUSH, 1, {REG_ES,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8817, 1},
+ {I_PUSH, 1, {REG_CS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3477, 1},
+ {I_PUSH, 1, {REG_SS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3603, 1},
+ {I_PUSH, 1, {REG_DS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3747, 1},
+ {I_PUSH, 1, {REG_FS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41294, 5},
+ {I_PUSH, 1, {REG_GS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41298, 5},
+ {I_PUSH, 1, {IMMEDIATE|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39882, 39},
+ {I_PUSH, 1, {SBYTEWORD|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39861, 91},
+ {I_PUSH, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39866, 91},
+ {I_PUSH, 1, {SBYTEDWORD|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39871, 92},
+ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39876, 92},
+ {I_PUSH, 1, {SBYTEDWORD|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39871, 93},
+ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39876, 93},
+ {I_PUSH, 1, {SBYTEDWORD|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39881, 94},
+ {I_PUSH, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39886, 94},
+ {I_PUSH, 1, {SBYTEDWORD|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39881, 94},
+ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39886, 94},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHA[] = {
+ {I_PUSHA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41302, 18},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHAD[] = {
+ {I_PUSHAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41306, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHAW[] = {
+ {I_PUSHAW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41310, 18},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHF[] = {
+ {I_PUSHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41314, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHFD[] = {
+ {I_PUSHFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41318, 19},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHFQ[] = {
+ {I_PUSHFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41318, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUSHFW[] = {
+ {I_PUSHFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41322, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PXOR[] = {
+ {I_PXOR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26496, 84},
+ {I_PXOR, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36946, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RCL[] = {
+ {I_RCL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41326, 0},
+ {I_RCL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41330, 0},
+ {I_RCL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39891, 39},
+ {I_RCL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39896, 0},
+ {I_RCL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39901, 0},
+ {I_RCL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35800, 39},
+ {I_RCL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39906, 5},
+ {I_RCL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39911, 5},
+ {I_RCL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35806, 5},
+ {I_RCL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39916, 7},
+ {I_RCL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39921, 7},
+ {I_RCL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35812, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RCR[] = {
+ {I_RCR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41334, 0},
+ {I_RCR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41338, 0},
+ {I_RCR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39926, 39},
+ {I_RCR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39931, 0},
+ {I_RCR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39936, 0},
+ {I_RCR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35818, 39},
+ {I_RCR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39941, 5},
+ {I_RCR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39946, 5},
+ {I_RCR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35824, 5},
+ {I_RCR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39951, 7},
+ {I_RCR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39956, 7},
+ {I_RCR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35830, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDSHR[] = {
+ {I_RDSHR, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35836, 95},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDMSR[] = {
+ {I_RDMSR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41342, 96},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDPMC[] = {
+ {I_RDPMC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41346, 86},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDTSC[] = {
+ {I_RDTSC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41350, 32},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDTSCP[] = {
+ {I_RDTSCP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39961, 97},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RET[] = {
+ {I_RET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41371, 25},
+ {I_RET, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETF[] = {
+ {I_RETF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41375, 0},
+ {I_RETF, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39992, 72},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETN[] = {
+ {I_RETN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41371, 25},
+ {I_RETN, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETW[] = {
+ {I_RETW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41354, 25},
+ {I_RETW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETFW[] = {
+ {I_RETFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41358, 0},
+ {I_RETFW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39966, 72},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETNW[] = {
+ {I_RETNW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41354, 25},
+ {I_RETNW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39971, 98},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETD[] = {
+ {I_RETD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41362, 26},
+ {I_RETD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39976, 99},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETFD[] = {
+ {I_RETFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41366, 0},
+ {I_RETFD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39981, 72},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETND[] = {
+ {I_RETND, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41362, 26},
+ {I_RETND, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39976, 99},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETQ[] = {
+ {I_RETQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41370, 28},
+ {I_RETQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39986, 100},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETFQ[] = {
+ {I_RETFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41374, 7},
+ {I_RETFQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39991, 101},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RETNQ[] = {
+ {I_RETNQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41370, 28},
+ {I_RETNQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39986, 100},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROL[] = {
+ {I_ROL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41378, 0},
+ {I_ROL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41382, 0},
+ {I_ROL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39996, 39},
+ {I_ROL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40001, 0},
+ {I_ROL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40006, 0},
+ {I_ROL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35842, 39},
+ {I_ROL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40011, 5},
+ {I_ROL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40016, 5},
+ {I_ROL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35848, 5},
+ {I_ROL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40021, 7},
+ {I_ROL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40026, 7},
+ {I_ROL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35854, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROR[] = {
+ {I_ROR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41386, 0},
+ {I_ROR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41390, 0},
+ {I_ROR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40031, 39},
+ {I_ROR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40036, 0},
+ {I_ROR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40041, 0},
+ {I_ROR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35860, 39},
+ {I_ROR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40046, 5},
+ {I_ROR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40051, 5},
+ {I_ROR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35866, 5},
+ {I_ROR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40056, 7},
+ {I_ROR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40061, 7},
+ {I_ROR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35872, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDM[] = {
+ {I_RDM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40554, 37},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSDC[] = {
+ {I_RSDC, 2, {REG_SREG,MEMORY|BITS80,0,0,0}, NO_DECORATOR, nasm_bytecodes+37319, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSLDT[] = {
+ {I_RSLDT, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40066, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSM[] = {
+ {I_RSM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41394, 103},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSTS[] = {
+ {I_RSTS, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40071, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SAHF[] = {
+ {I_SAHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8441, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SAL[] = {
+ {I_SAL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41398, 0},
+ {I_SAL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41402, 0},
+ {I_SAL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40076, 39},
+ {I_SAL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40081, 0},
+ {I_SAL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40086, 0},
+ {I_SAL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35878, 39},
+ {I_SAL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40091, 5},
+ {I_SAL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40096, 5},
+ {I_SAL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35884, 5},
+ {I_SAL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40101, 7},
+ {I_SAL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40106, 7},
+ {I_SAL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35890, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SALC[] = {
+ {I_SALC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40498, 104},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SAR[] = {
+ {I_SAR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41406, 0},
+ {I_SAR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41410, 0},
+ {I_SAR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40111, 39},
+ {I_SAR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40116, 0},
+ {I_SAR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40121, 0},
+ {I_SAR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35896, 39},
+ {I_SAR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40126, 5},
+ {I_SAR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40131, 5},
+ {I_SAR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35902, 5},
+ {I_SAR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40136, 7},
+ {I_SAR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40141, 7},
+ {I_SAR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35908, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SBB[] = {
+ {I_SBB, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40146, 3},
+ {I_SBB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40147, 0},
+ {I_SBB, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35914, 3},
+ {I_SBB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35915, 0},
+ {I_SBB, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35920, 4},
+ {I_SBB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35921, 5},
+ {I_SBB, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35926, 6},
+ {I_SBB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35927, 7},
+ {I_SBB, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+28088, 8},
+ {I_SBB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+28088, 0},
+ {I_SBB, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40151, 8},
+ {I_SBB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40151, 0},
+ {I_SBB, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40156, 9},
+ {I_SBB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40156, 5},
+ {I_SBB, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40161, 10},
+ {I_SBB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40161, 7},
+ {I_SBB, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26503, 11},
+ {I_SBB, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26510, 12},
+ {I_SBB, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26517, 13},
+ {I_SBB, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41414, 8},
+ {I_SBB, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26504, 8},
+ {I_SBB, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40166, 8},
+ {I_SBB, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26511, 9},
+ {I_SBB, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40171, 9},
+ {I_SBB, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26518, 10},
+ {I_SBB, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40176, 10},
+ {I_SBB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35932, 3},
+ {I_SBB, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26503, 3},
+ {I_SBB, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26524, 3},
+ {I_SBB, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26510, 4},
+ {I_SBB, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26531, 4},
+ {I_SBB, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26517, 6},
+ {I_SBB, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26538, 6},
+ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35932, 3},
+ {I_SBB, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26503, 3},
+ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26524, 3},
+ {I_SBB, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26510, 4},
+ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26531, 4},
+ {I_SBB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35938, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SCASB[] = {
+ {I_SCASB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41418, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SCASD[] = {
+ {I_SCASD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40181, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SCASQ[] = {
+ {I_SCASQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40186, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SCASW[] = {
+ {I_SCASW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40191, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SFENCE[] = {
+ {I_SFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35944, 59},
+ {I_SFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35944, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SGDT[] = {
+ {I_SGDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40196, 105},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHL[] = {
+ {I_SHL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41398, 0},
+ {I_SHL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41402, 0},
+ {I_SHL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40076, 39},
+ {I_SHL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40081, 0},
+ {I_SHL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40086, 0},
+ {I_SHL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35878, 39},
+ {I_SHL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40091, 5},
+ {I_SHL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40096, 5},
+ {I_SHL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35884, 5},
+ {I_SHL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40101, 7},
+ {I_SHL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40106, 7},
+ {I_SHL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35890, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHLD[] = {
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26545, 106},
+ {I_SHLD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26545, 106},
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26552, 106},
+ {I_SHLD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26552, 106},
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26559, 107},
+ {I_SHLD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26559, 107},
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35950, 9},
+ {I_SHLD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35950, 5},
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35956, 9},
+ {I_SHLD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35956, 5},
+ {I_SHLD, 3, {MEMORY,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35962, 10},
+ {I_SHLD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35962, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHR[] = {
+ {I_SHR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41422, 0},
+ {I_SHR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41426, 0},
+ {I_SHR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40201, 39},
+ {I_SHR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40206, 0},
+ {I_SHR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40211, 0},
+ {I_SHR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35968, 39},
+ {I_SHR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40216, 5},
+ {I_SHR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40221, 5},
+ {I_SHR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35974, 5},
+ {I_SHR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40226, 7},
+ {I_SHR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40231, 7},
+ {I_SHR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35980, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHRD[] = {
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26566, 106},
+ {I_SHRD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26566, 106},
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26573, 106},
+ {I_SHRD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26573, 106},
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26580, 107},
+ {I_SHRD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26580, 107},
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35986, 9},
+ {I_SHRD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35986, 5},
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35992, 9},
+ {I_SHRD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35992, 5},
+ {I_SHRD, 3, {MEMORY,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35998, 10},
+ {I_SHRD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35998, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SIDT[] = {
+ {I_SIDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40236, 105},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SLDT[] = {
+ {I_SLDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36023, 105},
+ {I_SLDT, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36023, 105},
+ {I_SLDT, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36004, 105},
+ {I_SLDT, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36010, 5},
+ {I_SLDT, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36016, 7},
+ {I_SLDT, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36022, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SKINIT[] = {
+ {I_SKINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40241, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SMI[] = {
+ {I_SMI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 108},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SMINT[] = {
+ {I_SMINT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41430, 37},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SMINTOLD[] = {
+ {I_SMINTOLD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41434, 109},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SMSW[] = {
+ {I_SMSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36041, 105},
+ {I_SMSW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36041, 105},
+ {I_SMSW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36028, 105},
+ {I_SMSW, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36034, 5},
+ {I_SMSW, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36040, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STC[] = {
+ {I_STC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39963, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STD[] = {
+ {I_STD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41568, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STI[] = {
+ {I_STI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39758, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STOSB[] = {
+ {I_STOSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8545, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STOSD[] = {
+ {I_STOSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41438, 5},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STOSQ[] = {
+ {I_STOSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41442, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STOSW[] = {
+ {I_STOSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41446, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STR[] = {
+ {I_STR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36059, 62},
+ {I_STR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36059, 62},
+ {I_STR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36046, 62},
+ {I_STR, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36052, 63},
+ {I_STR, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36058, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SUB[] = {
+ {I_SUB, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40246, 3},
+ {I_SUB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40247, 0},
+ {I_SUB, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36064, 3},
+ {I_SUB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36065, 0},
+ {I_SUB, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36070, 4},
+ {I_SUB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36071, 5},
+ {I_SUB, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36076, 6},
+ {I_SUB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36077, 7},
+ {I_SUB, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33856, 8},
+ {I_SUB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33856, 0},
+ {I_SUB, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40251, 8},
+ {I_SUB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40251, 0},
+ {I_SUB, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40256, 9},
+ {I_SUB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40256, 5},
+ {I_SUB, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40261, 10},
+ {I_SUB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40261, 7},
+ {I_SUB, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26587, 11},
+ {I_SUB, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26594, 12},
+ {I_SUB, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26601, 13},
+ {I_SUB, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41450, 8},
+ {I_SUB, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26588, 8},
+ {I_SUB, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40266, 8},
+ {I_SUB, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26595, 9},
+ {I_SUB, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40271, 9},
+ {I_SUB, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26602, 10},
+ {I_SUB, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40276, 10},
+ {I_SUB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36082, 3},
+ {I_SUB, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26587, 3},
+ {I_SUB, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26608, 3},
+ {I_SUB, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26594, 4},
+ {I_SUB, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26615, 4},
+ {I_SUB, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26601, 6},
+ {I_SUB, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26622, 6},
+ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36082, 3},
+ {I_SUB, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26587, 3},
+ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26608, 3},
+ {I_SUB, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26594, 4},
+ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26615, 4},
+ {I_SUB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36088, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SVDC[] = {
+ {I_SVDC, 2, {MEMORY|BITS80,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+27177, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SVLDT[] = {
+ {I_SVLDT, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40281, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SVTS[] = {
+ {I_SVTS, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40286, 102},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SWAPGS[] = {
+ {I_SWAPGS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40291, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SYSCALL[] = {
+ {I_SYSCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41162, 110},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SYSENTER[] = {
+ {I_SYSENTER, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41454, 86},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SYSEXIT[] = {
+ {I_SYSEXIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41458, 111},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SYSRET[] = {
+ {I_SYSRET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41158, 112},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_TEST[] = {
+ {I_TEST, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41462, 8},
+ {I_TEST, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41462, 0},
+ {I_TEST, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40296, 8},
+ {I_TEST, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40296, 0},
+ {I_TEST, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40301, 9},
+ {I_TEST, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40301, 5},
+ {I_TEST, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40306, 10},
+ {I_TEST, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40306, 7},
+ {I_TEST, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41466, 8},
+ {I_TEST, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40311, 8},
+ {I_TEST, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40316, 9},
+ {I_TEST, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40321, 10},
+ {I_TEST, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41470, 8},
+ {I_TEST, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40326, 8},
+ {I_TEST, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40331, 9},
+ {I_TEST, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40336, 10},
+ {I_TEST, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40341, 8},
+ {I_TEST, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36094, 8},
+ {I_TEST, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36100, 9},
+ {I_TEST, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36106, 10},
+ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40341, 8},
+ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36094, 8},
+ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36100, 9},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UD0[] = {
+ {I_UD0, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41474, 113},
+ {I_UD0, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36112, 39},
+ {I_UD0, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36118, 39},
+ {I_UD0, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36124, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UD1[] = {
+ {I_UD1, 2, {REG_GPR,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36130, 39},
+ {I_UD1, 2, {REG_GPR,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36136, 39},
+ {I_UD1, 2, {REG_GPR,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36142, 39},
+ {I_UD1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41478, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UD2B[] = {
+ {I_UD2B, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41478, 39},
+ {I_UD2B, 2, {REG_GPR,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36130, 39},
+ {I_UD2B, 2, {REG_GPR,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36136, 39},
+ {I_UD2B, 2, {REG_GPR,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36142, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UD2[] = {
+ {I_UD2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41482, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UD2A[] = {
+ {I_UD2A, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41482, 39},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UMOV[] = {
+ {I_UMOV, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36148, 114},
+ {I_UMOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36148, 108},
+ {I_UMOV, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26629, 114},
+ {I_UMOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26629, 108},
+ {I_UMOV, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26636, 114},
+ {I_UMOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26636, 108},
+ {I_UMOV, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 114},
+ {I_UMOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 108},
+ {I_UMOV, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26643, 114},
+ {I_UMOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26643, 108},
+ {I_UMOV, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26650, 114},
+ {I_UMOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26650, 108},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VERR[] = {
+ {I_VERR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ {I_VERR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ {I_VERR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VERW[] = {
+ {I_VERW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ {I_VERW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ {I_VERW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FWAIT[] = {
+ {I_FWAIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41060, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WBINVD[] = {
+ {I_WBINVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40522, 54},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WRSHR[] = {
+ {I_WRSHR, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36160, 95},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WRMSR[] = {
+ {I_WRMSR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41486, 96},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XADD[] = {
+ {I_XADD, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36166, 115},
+ {I_XADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36167, 20},
+ {I_XADD, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26657, 115},
+ {I_XADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26658, 20},
+ {I_XADD, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26664, 115},
+ {I_XADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26665, 20},
+ {I_XADD, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26671, 6},
+ {I_XADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26672, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XBTS[] = {
+ {I_XBTS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36172, 116},
+ {I_XBTS, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36172, 108},
+ {I_XBTS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36178, 117},
+ {I_XBTS, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36178, 108},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCHG[] = {
+ {I_XCHG, 2, {REG_AX,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+41490, 0},
+ {I_XCHG, 2, {REG_EAX,REG32NA,0,0,0}, NO_DECORATOR, nasm_bytecodes+41494, 5},
+ {I_XCHG, 2, {REG_RAX,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+41498, 7},
+ {I_XCHG, 2, {REG_GPR|BITS16,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41502, 0},
+ {I_XCHG, 2, {REG32NA,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41506, 5},
+ {I_XCHG, 2, {REG_GPR|BITS64,REG_RAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41510, 7},
+ {I_XCHG, 2, {REG_EAX,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41514, 19},
+ {I_XCHG, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40356, 3},
+ {I_XCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40357, 0},
+ {I_XCHG, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36184, 3},
+ {I_XCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36185, 0},
+ {I_XCHG, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36190, 4},
+ {I_XCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36191, 5},
+ {I_XCHG, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36196, 6},
+ {I_XCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36197, 7},
+ {I_XCHG, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40361, 3},
+ {I_XCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40362, 0},
+ {I_XCHG, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36202, 3},
+ {I_XCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36203, 0},
+ {I_XCHG, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36208, 4},
+ {I_XCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36209, 5},
+ {I_XCHG, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36214, 6},
+ {I_XCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36215, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XLATB[] = {
+ {I_XLATB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37573, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XLAT[] = {
+ {I_XLAT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37573, 0},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XOR[] = {
+ {I_XOR, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40366, 3},
+ {I_XOR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40367, 0},
+ {I_XOR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36220, 3},
+ {I_XOR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36221, 0},
+ {I_XOR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36226, 4},
+ {I_XOR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36227, 5},
+ {I_XOR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36232, 6},
+ {I_XOR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36233, 7},
+ {I_XOR, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33296, 8},
+ {I_XOR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33296, 0},
+ {I_XOR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40371, 8},
+ {I_XOR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40371, 0},
+ {I_XOR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40376, 9},
+ {I_XOR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40376, 5},
+ {I_XOR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40381, 10},
+ {I_XOR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40381, 7},
+ {I_XOR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26678, 11},
+ {I_XOR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26685, 12},
+ {I_XOR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26692, 13},
+ {I_XOR, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41518, 8},
+ {I_XOR, 2, {REG_AX,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26679, 8},
+ {I_XOR, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40386, 8},
+ {I_XOR, 2, {REG_EAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26686, 9},
+ {I_XOR, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40391, 9},
+ {I_XOR, 2, {REG_RAX,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26693, 10},
+ {I_XOR, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40396, 10},
+ {I_XOR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36238, 3},
+ {I_XOR, 2, {RM_GPR|BITS16,SBYTEWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26678, 3},
+ {I_XOR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26699, 3},
+ {I_XOR, 2, {RM_GPR|BITS32,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26685, 4},
+ {I_XOR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26706, 4},
+ {I_XOR, 2, {RM_GPR|BITS64,SBYTEDWORD,0,0,0}, NO_DECORATOR, nasm_bytecodes+26692, 6},
+ {I_XOR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26713, 6},
+ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36238, 3},
+ {I_XOR, 2, {MEMORY,SBYTEWORD|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26678, 3},
+ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26699, 3},
+ {I_XOR, 2, {MEMORY,SBYTEDWORD|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26685, 4},
+ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26706, 4},
+ {I_XOR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36244, 14},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDPS[] = {
+ {I_ADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36256, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDSS[] = {
+ {I_ADDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36262, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ANDNPS[] = {
+ {I_ANDNPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36268, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ANDPS[] = {
+ {I_ANDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36274, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPEQPS[] = {
+ {I_CMPEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8564, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPEQSS[] = {
+ {I_CMPEQSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8572, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLEPS[] = {
+ {I_CMPLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8580, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLESS[] = {
+ {I_CMPLESS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8588, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLTPS[] = {
+ {I_CMPLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8596, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLTSS[] = {
+ {I_CMPLTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8604, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNEQPS[] = {
+ {I_CMPNEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8612, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNEQSS[] = {
+ {I_CMPNEQSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8620, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLEPS[] = {
+ {I_CMPNLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8628, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLESS[] = {
+ {I_CMPNLESS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8636, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLTPS[] = {
+ {I_CMPNLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8644, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLTSS[] = {
+ {I_CMPNLTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8652, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPORDPS[] = {
+ {I_CMPORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8660, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPORDSS[] = {
+ {I_CMPORDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8668, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPUNORDPS[] = {
+ {I_CMPUNORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8676, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPUNORDSS[] = {
+ {I_CMPUNORDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8684, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPPS[] = {
+ {I_CMPPS, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26776, 121},
+ {I_CMPPS, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26776, 121},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPSS[] = {
+ {I_CMPSS, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26783, 121},
+ {I_CMPSS, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26783, 121},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_COMISS[] = {
+ {I_COMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36280, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPI2PS[] = {
+ {I_CVTPI2PS, 2, {XMM_L16,RM_MMX|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36286, 122},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPS2PI[] = {
+ {I_CVTPS2PI, 2, {MMXREG,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36292, 122},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSI2SS[] = {
+ {I_CVTSI2SS, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26791, 123},
+ {I_CVTSI2SS, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26791, 123},
+ {I_CVTSI2SS, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26790, 124},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSS2SI[] = {
+ {I_CVTSS2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26798, 123},
+ {I_CVTSS2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26798, 123},
+ {I_CVTSS2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26797, 125},
+ {I_CVTSS2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26797, 125},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTPS2PI[] = {
+ {I_CVTTPS2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36298, 126},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTSS2SI[] = {
+ {I_CVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26805, 123},
+ {I_CVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26804, 125},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DIVPS[] = {
+ {I_DIVPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36304, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DIVSS[] = {
+ {I_DIVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36310, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LDMXCSR[] = {
+ {I_LDMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36316, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MAXPS[] = {
+ {I_MAXPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36322, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MAXSS[] = {
+ {I_MAXSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36328, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MINPS[] = {
+ {I_MINPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36334, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MINSS[] = {
+ {I_MINSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36340, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVAPS[] = {
+ {I_MOVAPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36346, 120},
+ {I_MOVAPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36352, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVHPS[] = {
+ {I_MOVHPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36358, 120},
+ {I_MOVHPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36364, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVLHPS[] = {
+ {I_MOVLHPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36358, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVLPS[] = {
+ {I_MOVLPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 120},
+ {I_MOVLPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36370, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVHLPS[] = {
+ {I_MOVHLPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVMSKPS[] = {
+ {I_MOVMSKPS, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36376, 120},
+ {I_MOVMSKPS, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26811, 127},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTPS[] = {
+ {I_MOVNTPS, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36382, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSS[] = {
+ {I_MOVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36388, 120},
+ {I_MOVSS, 2, {MEMORY|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36394, 120},
+ {I_MOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36388, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVUPS[] = {
+ {I_MOVUPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36400, 120},
+ {I_MOVUPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36406, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MULPS[] = {
+ {I_MULPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36412, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MULSS[] = {
+ {I_MULSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36418, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ORPS[] = {
+ {I_ORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36424, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RCPPS[] = {
+ {I_RCPPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36430, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RCPSS[] = {
+ {I_RCPSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36436, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSQRTPS[] = {
+ {I_RSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36442, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RSQRTSS[] = {
+ {I_RSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36448, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHUFPS[] = {
+ {I_SHUFPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+26818, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SQRTPS[] = {
+ {I_SQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36454, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SQRTSS[] = {
+ {I_SQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36460, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STMXCSR[] = {
+ {I_STMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36466, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SUBPS[] = {
+ {I_SUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36472, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SUBSS[] = {
+ {I_SUBSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36478, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UCOMISS[] = {
+ {I_UCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36484, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UNPCKHPS[] = {
+ {I_UNPCKHPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36490, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UNPCKLPS[] = {
+ {I_UNPCKLPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36496, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XORPS[] = {
+ {I_XORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36502, 120},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXRSTOR[] = {
+ {I_FXRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26826, 128},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXRSTOR64[] = {
+ {I_FXRSTOR64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26825, 129},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXSAVE[] = {
+ {I_FXSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26833, 128},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_FXSAVE64[] = {
+ {I_FXSAVE64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26832, 129},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XGETBV[] = {
+ {I_XGETBV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40406, 130},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSETBV[] = {
+ {I_XSETBV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40411, 131},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVE[] = {
+ {I_XSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26840, 130},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVE64[] = {
+ {I_XSAVE64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26839, 132},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVEC[] = {
+ {I_XSAVEC, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26847, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVEC64[] = {
+ {I_XSAVEC64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26846, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVEOPT[] = {
+ {I_XSAVEOPT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26854, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVEOPT64[] = {
+ {I_XSAVEOPT64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26853, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVES[] = {
+ {I_XSAVES, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26861, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSAVES64[] = {
+ {I_XSAVES64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26860, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XRSTOR[] = {
+ {I_XRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26868, 130},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XRSTOR64[] = {
+ {I_XRSTOR64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26867, 132},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XRSTORS[] = {
+ {I_XRSTORS, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26875, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XRSTORS64[] = {
+ {I_XRSTORS64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26874, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHNTA[] = {
+ {I_PREFETCHNTA, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37595, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHT0[] = {
+ {I_PREFETCHT0, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37613, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHT1[] = {
+ {I_PREFETCHT1, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37631, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHT2[] = {
+ {I_PREFETCHT2, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37649, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MASKMOVQ[] = {
+ {I_MASKMOVQ, 2, {MMXREG,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36508, 136},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTQ[] = {
+ {I_MOVNTQ, 2, {MEMORY,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36514, 137},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAVGB[] = {
+ {I_PAVGB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26881, 137},
+ {I_PAVGB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36682, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PAVGW[] = {
+ {I_PAVGW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26888, 137},
+ {I_PAVGW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36688, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PEXTRW[] = {
+ {I_PEXTRW, 3, {REG_GPR|BITS32,MMXREG,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26895, 138},
+ {I_PEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26986, 148},
+ {I_PEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26986, 149},
+ {I_PEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+277, 169},
+ {I_PEXTRW, 3, {MEMORY|BITS16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+277, 169},
+ {I_PEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+276, 170},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PINSRW[] = {
+ {I_PINSRW, 3, {MMXREG,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ {I_PINSRW, 3, {MMXREG,RM_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ {I_PINSRW, 3, {MMXREG,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ {I_PINSRW, 3, {XMM_L16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ {I_PINSRW, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ {I_PINSRW, 3, {XMM_L16,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 149},
+ {I_PINSRW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ {I_PINSRW, 3, {XMM_L16,MEMORY|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXSW[] = {
+ {I_PMAXSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26909, 137},
+ {I_PMAXSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36736, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXUB[] = {
+ {I_PMAXUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26916, 137},
+ {I_PMAXUB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36742, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINSW[] = {
+ {I_PMINSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26923, 137},
+ {I_PMINSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36748, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINUB[] = {
+ {I_PMINUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26930, 137},
+ {I_PMINUB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36754, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVMSKB[] = {
+ {I_PMOVMSKB, 2, {REG_GPR|BITS32,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36520, 136},
+ {I_PMOVMSKB, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36760, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHUW[] = {
+ {I_PMULHUW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26937, 137},
+ {I_PMULHUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36766, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSADBW[] = {
+ {I_PSADBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26944, 137},
+ {I_PSADBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36796, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSHUFW[] = {
+ {I_PSHUFW, 3, {MMXREG,RM_MMX,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8692, 139},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PF2IW[] = {
+ {I_PF2IW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8700, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFNACC[] = {
+ {I_PFNACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8708, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFPNACC[] = {
+ {I_PFPNACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8716, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PI2FW[] = {
+ {I_PI2FW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8724, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSWAPD[] = {
+ {I_PSWAPD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8732, 88},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MASKMOVDQU[] = {
+ {I_MASKMOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36526, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLFLUSH[] = {
+ {I_CLFLUSH, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36532, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTDQ[] = {
+ {I_MOVNTDQ, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36538, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTI[] = {
+ {I_MOVNTI, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26952, 142},
+ {I_MOVNTI, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26951, 143},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTPD[] = {
+ {I_MOVNTPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36544, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDQA[] = {
+ {I_MOVDQA, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36550, 140},
+ {I_MOVDQA, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36556, 141},
+ {I_MOVDQA, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36550, 141},
+ {I_MOVDQA, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36556, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDQU[] = {
+ {I_MOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36562, 140},
+ {I_MOVDQU, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36568, 141},
+ {I_MOVDQU, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36562, 141},
+ {I_MOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36568, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDQ2Q[] = {
+ {I_MOVDQ2Q, 2, {MMXREG,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36574, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVQ2DQ[] = {
+ {I_MOVQ2DQ, 2, {XMM_L16,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36592, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PADDQ[] = {
+ {I_PADDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+36634, 147},
+ {I_PADDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36640, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULUDQ[] = {
+ {I_PMULUDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27000, 141},
+ {I_PMULUDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36784, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSHUFD[] = {
+ {I_PSHUFD, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27007, 148},
+ {I_PSHUFD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27007, 150},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSHUFHW[] = {
+ {I_PSHUFHW, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27014, 148},
+ {I_PSHUFHW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27014, 150},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSHUFLW[] = {
+ {I_PSHUFLW, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27021, 148},
+ {I_PSHUFLW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27021, 150},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSLLDQ[] = {
+ {I_PSLLDQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27028, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSRLDQ[] = {
+ {I_PSRLDQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27070, 151},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSUBQ[] = {
+ {I_PSUBQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27098, 141},
+ {I_PSUBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36868, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKHQDQ[] = {
+ {I_PUNPCKHQDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36916, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PUNPCKLQDQ[] = {
+ {I_PUNPCKLQDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36940, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDPD[] = {
+ {I_ADDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36952, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDSD[] = {
+ {I_ADDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36958, 145},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ANDNPD[] = {
+ {I_ANDNPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36964, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ANDPD[] = {
+ {I_ANDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36970, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPEQPD[] = {
+ {I_CMPEQPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8740, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPEQSD[] = {
+ {I_CMPEQSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8748, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLEPD[] = {
+ {I_CMPLEPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8756, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLESD[] = {
+ {I_CMPLESD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8764, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLTPD[] = {
+ {I_CMPLTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8772, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPLTSD[] = {
+ {I_CMPLTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8780, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNEQPD[] = {
+ {I_CMPNEQPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8788, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNEQSD[] = {
+ {I_CMPNEQSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8796, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLEPD[] = {
+ {I_CMPNLEPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8804, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLESD[] = {
+ {I_CMPNLESD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8812, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLTPD[] = {
+ {I_CMPNLTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8820, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPNLTSD[] = {
+ {I_CMPNLTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8828, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPORDPD[] = {
+ {I_CMPORDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8836, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPORDSD[] = {
+ {I_CMPORDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8844, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPUNORDPD[] = {
+ {I_CMPUNORDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8852, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPUNORDSD[] = {
+ {I_CMPUNORDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8860, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMPPD[] = {
+ {I_CMPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+27105, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_COMISD[] = {
+ {I_COMISD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36976, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTDQ2PD[] = {
+ {I_CVTDQ2PD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36982, 145},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTDQ2PS[] = {
+ {I_CVTDQ2PS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36988, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPD2DQ[] = {
+ {I_CVTPD2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36994, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPD2PI[] = {
+ {I_CVTPD2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37000, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPD2PS[] = {
+ {I_CVTPD2PS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37006, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPI2PD[] = {
+ {I_CVTPI2PD, 2, {XMM_L16,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+37012, 145},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPS2DQ[] = {
+ {I_CVTPS2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37018, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTPS2PD[] = {
+ {I_CVTPS2PD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37024, 145},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSD2SI[] = {
+ {I_CVTSD2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27119, 152},
+ {I_CVTSD2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27119, 152},
+ {I_CVTSD2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27126, 153},
+ {I_CVTSD2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27126, 153},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSD2SS[] = {
+ {I_CVTSD2SS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37030, 145},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSI2SD[] = {
+ {I_CVTSI2SD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27141, 154},
+ {I_CVTSI2SD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27133, 154},
+ {I_CVTSI2SD, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27140, 153},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTSS2SD[] = {
+ {I_CVTSS2SD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37036, 144},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTPD2PI[] = {
+ {I_CVTTPD2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37042, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTPD2DQ[] = {
+ {I_CVTTPD2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37048, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTPS2DQ[] = {
+ {I_CVTTPS2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37054, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CVTTSD2SI[] = {
+ {I_CVTTSD2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27147, 152},
+ {I_CVTTSD2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27147, 152},
+ {I_CVTTSD2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27154, 153},
+ {I_CVTTSD2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27154, 153},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DIVPD[] = {
+ {I_DIVPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37060, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DIVSD[] = {
+ {I_DIVSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37066, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MAXPD[] = {
+ {I_MAXPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37072, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MAXSD[] = {
+ {I_MAXSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37078, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MINPD[] = {
+ {I_MINPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37084, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MINSD[] = {
+ {I_MINSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37090, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVAPD[] = {
+ {I_MOVAPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37096, 140},
+ {I_MOVAPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37102, 140},
+ {I_MOVAPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37102, 141},
+ {I_MOVAPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37096, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVHPD[] = {
+ {I_MOVHPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37108, 140},
+ {I_MOVHPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37114, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVLPD[] = {
+ {I_MOVLPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37120, 140},
+ {I_MOVLPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+37126, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVMSKPD[] = {
+ {I_MOVMSKPD, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37132, 140},
+ {I_MOVMSKPD, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27161, 146},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVUPD[] = {
+ {I_MOVUPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37150, 140},
+ {I_MOVUPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37156, 140},
+ {I_MOVUPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37156, 141},
+ {I_MOVUPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37150, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MULPD[] = {
+ {I_MULPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37162, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MULSD[] = {
+ {I_MULSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37168, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ORPD[] = {
+ {I_ORPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37174, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHUFPD[] = {
+ {I_SHUFPD, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27168, 148},
+ {I_SHUFPD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27168, 155},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SQRTPD[] = {
+ {I_SQRTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37180, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SQRTSD[] = {
+ {I_SQRTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37186, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SUBPD[] = {
+ {I_SUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37192, 141},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SUBSD[] = {
+ {I_SUBSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37198, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UCOMISD[] = {
+ {I_UCOMISD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37204, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UNPCKHPD[] = {
+ {I_UNPCKHPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37210, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UNPCKLPD[] = {
+ {I_UNPCKLPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37216, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XORPD[] = {
+ {I_XORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37222, 140},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDSUBPD[] = {
+ {I_ADDSUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37228, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADDSUBPS[] = {
+ {I_ADDSUBPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37234, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HADDPD[] = {
+ {I_HADDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37240, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HADDPS[] = {
+ {I_HADDPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37246, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HSUBPD[] = {
+ {I_HSUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37252, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HSUBPS[] = {
+ {I_HSUBPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37258, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LDDQU[] = {
+ {I_LDDQU, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37264, 156},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDDUP[] = {
+ {I_MOVDDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37270, 157},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSHDUP[] = {
+ {I_MOVSHDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37276, 157},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVSLDUP[] = {
+ {I_MOVSLDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37282, 157},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLGI[] = {
+ {I_CLGI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40416, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STGI[] = {
+ {I_STGI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40421, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMCALL[] = {
+ {I_VMCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40426, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMCLEAR[] = {
+ {I_VMCLEAR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37288, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMFUNC[] = {
+ {I_VMFUNC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40431, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMLAUNCH[] = {
+ {I_VMLAUNCH, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40436, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMLOAD[] = {
+ {I_VMLOAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40441, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMMCALL[] = {
+ {I_VMMCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40446, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMPTRLD[] = {
+ {I_VMPTRLD, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37294, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMPTRST[] = {
+ {I_VMPTRST, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37300, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMREAD[] = {
+ {I_VMREAD, 2, {RM_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27176, 160},
+ {I_VMREAD, 2, {RM_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27175, 161},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMRESUME[] = {
+ {I_VMRESUME, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40451, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMRUN[] = {
+ {I_VMRUN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40456, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMSAVE[] = {
+ {I_VMSAVE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40461, 158},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMWRITE[] = {
+ {I_VMWRITE, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27183, 160},
+ {I_VMWRITE, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27182, 161},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMXOFF[] = {
+ {I_VMXOFF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40466, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMXON[] = {
+ {I_VMXON, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37306, 159},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVEPT[] = {
+ {I_INVEPT, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8869, 162},
+ {I_INVEPT, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8868, 163},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INVVPID[] = {
+ {I_INVVPID, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8877, 162},
+ {I_INVVPID, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8876, 163},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PABSB[] = {
+ {I_PABSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27189, 164},
+ {I_PABSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27196, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PABSW[] = {
+ {I_PABSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27203, 164},
+ {I_PABSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27210, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PABSD[] = {
+ {I_PABSD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27217, 164},
+ {I_PABSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27224, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PALIGNR[] = {
+ {I_PALIGNR, 3, {MMXREG,RM_MMX,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8884, 164},
+ {I_PALIGNR, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8892, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHADDW[] = {
+ {I_PHADDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27231, 164},
+ {I_PHADDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27238, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHADDD[] = {
+ {I_PHADDD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27245, 164},
+ {I_PHADDD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27252, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHADDSW[] = {
+ {I_PHADDSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27259, 164},
+ {I_PHADDSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27266, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHSUBW[] = {
+ {I_PHSUBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27273, 164},
+ {I_PHSUBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27280, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHSUBD[] = {
+ {I_PHSUBD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27287, 164},
+ {I_PHSUBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27294, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHSUBSW[] = {
+ {I_PHSUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27301, 164},
+ {I_PHSUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27308, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMADDUBSW[] = {
+ {I_PMADDUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27315, 164},
+ {I_PMADDUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27322, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULHRSW[] = {
+ {I_PMULHRSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27329, 164},
+ {I_PMULHRSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27336, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSHUFB[] = {
+ {I_PSHUFB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27343, 164},
+ {I_PSHUFB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27350, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSIGNB[] = {
+ {I_PSIGNB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27357, 164},
+ {I_PSIGNB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27364, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSIGNW[] = {
+ {I_PSIGNW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27371, 164},
+ {I_PSIGNW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27378, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PSIGND[] = {
+ {I_PSIGND, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27385, 164},
+ {I_PSIGND, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27392, 165},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_EXTRQ[] = {
+ {I_EXTRQ, 3, {XMM_L16,IMMEDIATE,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8900, 166},
+ {I_EXTRQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37312, 166},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INSERTQ[] = {
+ {I_INSERTQ, 4, {XMM_L16,XMM_L16,IMMEDIATE,IMMEDIATE,0}, NO_DECORATOR, nasm_bytecodes+8908, 166},
+ {I_INSERTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37318, 166},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTSD[] = {
+ {I_MOVNTSD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37324, 167},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTSS[] = {
+ {I_MOVNTSS, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37330, 168},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LZCNT[] = {
+ {I_LZCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27399, 110},
+ {I_LZCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27406, 110},
+ {I_LZCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27413, 59},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLENDPD[] = {
+ {I_BLENDPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8916, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLENDPS[] = {
+ {I_BLENDPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8924, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLENDVPD[] = {
+ {I_BLENDVPD, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27420, 169},
+ {I_BLENDVPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27420, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLENDVPS[] = {
+ {I_BLENDVPS, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27427, 169},
+ {I_BLENDVPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27427, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DPPD[] = {
+ {I_DPPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8932, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_DPPS[] = {
+ {I_DPPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8940, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_EXTRACTPS[] = {
+ {I_EXTRACTPS, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+241, 169},
+ {I_EXTRACTPS, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+240, 170},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_INSERTPS[] = {
+ {I_INSERTPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8948, 171},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVNTDQA[] = {
+ {I_MOVNTDQA, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27434, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MPSADBW[] = {
+ {I_MPSADBW, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8956, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PACKUSDW[] = {
+ {I_PACKUSDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27441, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PBLENDVB[] = {
+ {I_PBLENDVB, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27448, 169},
+ {I_PBLENDVB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27448, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PBLENDW[] = {
+ {I_PBLENDW, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8964, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPEQQ[] = {
+ {I_PCMPEQQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27455, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PEXTRB[] = {
+ {I_PEXTRB, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+250, 169},
+ {I_PEXTRB, 3, {MEMORY|BITS8,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+250, 169},
+ {I_PEXTRB, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+249, 170},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PEXTRD[] = {
+ {I_PEXTRD, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+258, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PEXTRQ[] = {
+ {I_PEXTRQ, 3, {RM_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+267, 170},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PHMINPOSUW[] = {
+ {I_PHMINPOSUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27462, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PINSRB[] = {
+ {I_PINSRB, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+286, 172},
+ {I_PINSRB, 3, {XMM_L16,RM_GPR|BITS8,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+285, 172},
+ {I_PINSRB, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+286, 172},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PINSRD[] = {
+ {I_PINSRD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+294, 172},
+ {I_PINSRD, 3, {XMM_L16,RM_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+294, 172},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PINSRQ[] = {
+ {I_PINSRQ, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+303, 173},
+ {I_PINSRQ, 3, {XMM_L16,RM_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+303, 173},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXSB[] = {
+ {I_PMAXSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27469, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXSD[] = {
+ {I_PMAXSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27476, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXUD[] = {
+ {I_PMAXUD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27483, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMAXUW[] = {
+ {I_PMAXUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27490, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINSB[] = {
+ {I_PMINSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27497, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINSD[] = {
+ {I_PMINSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27504, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINUD[] = {
+ {I_PMINUD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27511, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMINUW[] = {
+ {I_PMINUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27518, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXBW[] = {
+ {I_PMOVSXBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27525, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXBD[] = {
+ {I_PMOVSXBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27532, 171},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXBQ[] = {
+ {I_PMOVSXBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27539, 175},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXWD[] = {
+ {I_PMOVSXWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27546, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXWQ[] = {
+ {I_PMOVSXWQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27553, 171},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVSXDQ[] = {
+ {I_PMOVSXDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27560, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXBW[] = {
+ {I_PMOVZXBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27567, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXBD[] = {
+ {I_PMOVZXBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27574, 171},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXBQ[] = {
+ {I_PMOVZXBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27581, 175},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXWD[] = {
+ {I_PMOVZXWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27588, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXWQ[] = {
+ {I_PMOVZXWQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27595, 171},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMOVZXDQ[] = {
+ {I_PMOVZXDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27602, 174},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULDQ[] = {
+ {I_PMULDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27609, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PMULLD[] = {
+ {I_PMULLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27616, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PTEST[] = {
+ {I_PTEST, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27623, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROUNDPD[] = {
+ {I_ROUNDPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8972, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROUNDPS[] = {
+ {I_ROUNDPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8980, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROUNDSD[] = {
+ {I_ROUNDSD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8988, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ROUNDSS[] = {
+ {I_ROUNDSS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8996, 169},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CRC32[] = {
+ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9021, 176},
+ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9004, 176},
+ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9012, 176},
+ {I_CRC32, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9020, 177},
+ {I_CRC32, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9028, 177},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPESTRI[] = {
+ {I_PCMPESTRI, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9036, 176},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPESTRM[] = {
+ {I_PCMPESTRM, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9044, 176},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPISTRI[] = {
+ {I_PCMPISTRI, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9052, 176},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPISTRM[] = {
+ {I_PCMPISTRM, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9060, 176},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCMPGTQ[] = {
+ {I_PCMPGTQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27630, 176},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_POPCNT[] = {
+ {I_POPCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27637, 178},
+ {I_POPCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27644, 179},
+ {I_POPCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27651, 180},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_GETSEC[] = {
+ {I_GETSEC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41522, 135},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRCPV[] = {
+ {I_PFRCPV, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+9068, 181},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PFRSQRTV[] = {
+ {I_PFRSQRTV, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+9076, 181},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVBE[] = {
+ {I_MOVBE, 2, {REG_GPR|BITS16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9084, 182},
+ {I_MOVBE, 2, {REG_GPR|BITS32,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9092, 182},
+ {I_MOVBE, 2, {REG_GPR|BITS64,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9100, 182},
+ {I_MOVBE, 2, {MEMORY|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9108, 182},
+ {I_MOVBE, 2, {MEMORY|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9116, 182},
+ {I_MOVBE, 2, {MEMORY|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9124, 182},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESENC[] = {
+ {I_AESENC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27658, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESENCLAST[] = {
+ {I_AESENCLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27665, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESDEC[] = {
+ {I_AESDEC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27672, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESDECLAST[] = {
+ {I_AESDECLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27679, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESIMC[] = {
+ {I_AESIMC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27686, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_AESKEYGENASSIST[] = {
+ {I_AESKEYGENASSIST, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9132, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESENC[] = {
+ {I_VAESENC, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27693, 184},
+ {I_VAESENC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27700, 184},
+ {I_VAESENC, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27756, 185},
+ {I_VAESENC, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27763, 185},
+ {I_VAESENC, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9148, 186},
+ {I_VAESENC, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9156, 186},
+ {I_VAESENC, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9164, 186},
+ {I_VAESENC, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9172, 186},
+ {I_VAESENC, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9276, 187},
+ {I_VAESENC, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9284, 187},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESENCLAST[] = {
+ {I_VAESENCLAST, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27707, 184},
+ {I_VAESENCLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27714, 184},
+ {I_VAESENCLAST, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27770, 185},
+ {I_VAESENCLAST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27777, 185},
+ {I_VAESENCLAST, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9180, 186},
+ {I_VAESENCLAST, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9188, 186},
+ {I_VAESENCLAST, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9196, 186},
+ {I_VAESENCLAST, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9204, 186},
+ {I_VAESENCLAST, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9292, 187},
+ {I_VAESENCLAST, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9300, 187},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESDEC[] = {
+ {I_VAESDEC, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27721, 184},
+ {I_VAESDEC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27728, 184},
+ {I_VAESDEC, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27784, 185},
+ {I_VAESDEC, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27791, 185},
+ {I_VAESDEC, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9212, 186},
+ {I_VAESDEC, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9220, 186},
+ {I_VAESDEC, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9228, 186},
+ {I_VAESDEC, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9236, 186},
+ {I_VAESDEC, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9308, 187},
+ {I_VAESDEC, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9316, 187},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESDECLAST[] = {
+ {I_VAESDECLAST, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27735, 184},
+ {I_VAESDECLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27742, 184},
+ {I_VAESDECLAST, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27798, 185},
+ {I_VAESDECLAST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27805, 185},
+ {I_VAESDECLAST, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9244, 186},
+ {I_VAESDECLAST, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9252, 186},
+ {I_VAESDECLAST, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9260, 186},
+ {I_VAESDECLAST, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9268, 186},
+ {I_VAESDECLAST, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9324, 187},
+ {I_VAESDECLAST, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9332, 187},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESIMC[] = {
+ {I_VAESIMC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27749, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VAESKEYGENASSIST[] = {
+ {I_VAESKEYGENASSIST, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9140, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDPD[] = {
+ {I_VADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27812, 184},
+ {I_VADDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27819, 184},
+ {I_VADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27826, 184},
+ {I_VADDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27833, 184},
+ {I_VADDPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12404, 225},
+ {I_VADDPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12412, 225},
+ {I_VADDPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12420, 225},
+ {I_VADDPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12428, 225},
+ {I_VADDPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+12436, 226},
+ {I_VADDPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+12444, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDPS[] = {
+ {I_VADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27840, 184},
+ {I_VADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27847, 184},
+ {I_VADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27854, 184},
+ {I_VADDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27861, 184},
+ {I_VADDPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12452, 225},
+ {I_VADDPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12460, 225},
+ {I_VADDPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12468, 225},
+ {I_VADDPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12476, 225},
+ {I_VADDPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+12484, 226},
+ {I_VADDPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+12492, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDSD[] = {
+ {I_VADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+27868, 184},
+ {I_VADDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27875, 184},
+ {I_VADDSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+12500, 226},
+ {I_VADDSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+12508, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDSS[] = {
+ {I_VADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+27882, 184},
+ {I_VADDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27889, 184},
+ {I_VADDSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+12516, 226},
+ {I_VADDSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+12524, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDSUBPD[] = {
+ {I_VADDSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27896, 184},
+ {I_VADDSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27903, 184},
+ {I_VADDSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27910, 184},
+ {I_VADDSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27917, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VADDSUBPS[] = {
+ {I_VADDSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27924, 184},
+ {I_VADDSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27931, 184},
+ {I_VADDSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27938, 184},
+ {I_VADDSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27945, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VANDPD[] = {
+ {I_VANDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27952, 184},
+ {I_VANDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27959, 184},
+ {I_VANDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27966, 184},
+ {I_VANDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27973, 184},
+ {I_VANDPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12628, 227},
+ {I_VANDPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12636, 227},
+ {I_VANDPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12644, 227},
+ {I_VANDPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12652, 227},
+ {I_VANDPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12660, 228},
+ {I_VANDPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12668, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VANDPS[] = {
+ {I_VANDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27980, 184},
+ {I_VANDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27987, 184},
+ {I_VANDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27994, 184},
+ {I_VANDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28001, 184},
+ {I_VANDPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12676, 227},
+ {I_VANDPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12684, 227},
+ {I_VANDPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12692, 227},
+ {I_VANDPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12700, 227},
+ {I_VANDPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12708, 228},
+ {I_VANDPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12716, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VANDNPD[] = {
+ {I_VANDNPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28008, 184},
+ {I_VANDNPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28015, 184},
+ {I_VANDNPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28022, 184},
+ {I_VANDNPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28029, 184},
+ {I_VANDNPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12532, 227},
+ {I_VANDNPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12540, 227},
+ {I_VANDNPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12548, 227},
+ {I_VANDNPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12556, 227},
+ {I_VANDNPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12564, 228},
+ {I_VANDNPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12572, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VANDNPS[] = {
+ {I_VANDNPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28036, 184},
+ {I_VANDNPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28043, 184},
+ {I_VANDNPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28050, 184},
+ {I_VANDNPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28057, 184},
+ {I_VANDNPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12580, 227},
+ {I_VANDNPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12588, 227},
+ {I_VANDNPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12596, 227},
+ {I_VANDNPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12604, 227},
+ {I_VANDNPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12612, 228},
+ {I_VANDNPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12620, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDPD[] = {
+ {I_VBLENDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9340, 184},
+ {I_VBLENDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9348, 184},
+ {I_VBLENDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9356, 184},
+ {I_VBLENDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9364, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDPS[] = {
+ {I_VBLENDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9372, 184},
+ {I_VBLENDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9380, 184},
+ {I_VBLENDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9388, 184},
+ {I_VBLENDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9396, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDVPD[] = {
+ {I_VBLENDVPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9404, 184},
+ {I_VBLENDVPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9412, 184},
+ {I_VBLENDVPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9420, 184},
+ {I_VBLENDVPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9428, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDVPS[] = {
+ {I_VBLENDVPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9436, 184},
+ {I_VBLENDVPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9444, 184},
+ {I_VBLENDVPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9452, 184},
+ {I_VBLENDVPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9460, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTSS[] = {
+ {I_VBROADCASTSS, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28064, 184},
+ {I_VBROADCASTSS, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28071, 184},
+ {I_VBROADCASTSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28064, 203},
+ {I_VBROADCASTSS, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28071, 203},
+ {I_VBROADCASTSS, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12940, 225},
+ {I_VBROADCASTSS, 2, {YMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12948, 225},
+ {I_VBROADCASTSS, 2, {ZMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12956, 226},
+ {I_VBROADCASTSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12964, 225},
+ {I_VBROADCASTSS, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12972, 225},
+ {I_VBROADCASTSS, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12980, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTSD[] = {
+ {I_VBROADCASTSD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28078, 184},
+ {I_VBROADCASTSD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28078, 203},
+ {I_VBROADCASTSD, 2, {YMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12908, 225},
+ {I_VBROADCASTSD, 2, {ZMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12916, 226},
+ {I_VBROADCASTSD, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12924, 225},
+ {I_VBROADCASTSD, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF128[] = {
+ {I_VBROADCASTF128, 2, {YMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28085, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_OSPD[] = {
+ {I_VCMPEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+312, 184},
+ {I_VCMPEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+321, 184},
+ {I_VCMPEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+330, 184},
+ {I_VCMPEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+339, 184},
+ {I_VCMPEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+312, 184},
+ {I_VCMPEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+321, 184},
+ {I_VCMPEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+330, 184},
+ {I_VCMPEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+339, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQPD[] = {
+ {I_VCMPEQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+348, 184},
+ {I_VCMPEQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+357, 184},
+ {I_VCMPEQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+366, 184},
+ {I_VCMPEQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+375, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OSPD[] = {
+ {I_VCMPLT_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+384, 184},
+ {I_VCMPLT_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+393, 184},
+ {I_VCMPLT_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+402, 184},
+ {I_VCMPLT_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+411, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLTPD[] = {
+ {I_VCMPLTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+384, 184},
+ {I_VCMPLTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+393, 184},
+ {I_VCMPLTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+402, 184},
+ {I_VCMPLTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+411, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OSPD[] = {
+ {I_VCMPLE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+420, 184},
+ {I_VCMPLE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+429, 184},
+ {I_VCMPLE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+438, 184},
+ {I_VCMPLE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+447, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLEPD[] = {
+ {I_VCMPLEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+420, 184},
+ {I_VCMPLEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+429, 184},
+ {I_VCMPLEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+438, 184},
+ {I_VCMPLEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+447, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_QPD[] = {
+ {I_VCMPUNORD_QPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+456, 184},
+ {I_VCMPUNORD_QPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+465, 184},
+ {I_VCMPUNORD_QPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+474, 184},
+ {I_VCMPUNORD_QPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+483, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORDPD[] = {
+ {I_VCMPUNORDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+456, 184},
+ {I_VCMPUNORDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+465, 184},
+ {I_VCMPUNORDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+474, 184},
+ {I_VCMPUNORDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+483, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_UQPD[] = {
+ {I_VCMPNEQ_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+492, 184},
+ {I_VCMPNEQ_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+501, 184},
+ {I_VCMPNEQ_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+510, 184},
+ {I_VCMPNEQ_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+519, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQPD[] = {
+ {I_VCMPNEQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+492, 184},
+ {I_VCMPNEQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+501, 184},
+ {I_VCMPNEQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+510, 184},
+ {I_VCMPNEQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+519, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_USPD[] = {
+ {I_VCMPNLT_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+528, 184},
+ {I_VCMPNLT_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+537, 184},
+ {I_VCMPNLT_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+546, 184},
+ {I_VCMPNLT_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+555, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLTPD[] = {
+ {I_VCMPNLTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+528, 184},
+ {I_VCMPNLTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+537, 184},
+ {I_VCMPNLTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+546, 184},
+ {I_VCMPNLTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+555, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_USPD[] = {
+ {I_VCMPNLE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+564, 184},
+ {I_VCMPNLE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+573, 184},
+ {I_VCMPNLE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+582, 184},
+ {I_VCMPNLE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+591, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLEPD[] = {
+ {I_VCMPNLEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+564, 184},
+ {I_VCMPNLEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+573, 184},
+ {I_VCMPNLEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+582, 184},
+ {I_VCMPNLEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+591, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_QPD[] = {
+ {I_VCMPORD_QPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+600, 184},
+ {I_VCMPORD_QPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+609, 184},
+ {I_VCMPORD_QPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+618, 184},
+ {I_VCMPORD_QPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+627, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORDPD[] = {
+ {I_VCMPORDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+600, 184},
+ {I_VCMPORDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+609, 184},
+ {I_VCMPORDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+618, 184},
+ {I_VCMPORDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+627, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_UQPD[] = {
+ {I_VCMPEQ_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+636, 184},
+ {I_VCMPEQ_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+645, 184},
+ {I_VCMPEQ_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+654, 184},
+ {I_VCMPEQ_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+663, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_USPD[] = {
+ {I_VCMPNGE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+672, 184},
+ {I_VCMPNGE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+681, 184},
+ {I_VCMPNGE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+690, 184},
+ {I_VCMPNGE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+699, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGEPD[] = {
+ {I_VCMPNGEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+672, 184},
+ {I_VCMPNGEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+681, 184},
+ {I_VCMPNGEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+690, 184},
+ {I_VCMPNGEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+699, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_USPD[] = {
+ {I_VCMPNGT_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+708, 184},
+ {I_VCMPNGT_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+717, 184},
+ {I_VCMPNGT_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+726, 184},
+ {I_VCMPNGT_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+735, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGTPD[] = {
+ {I_VCMPNGTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+708, 184},
+ {I_VCMPNGTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+717, 184},
+ {I_VCMPNGTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+726, 184},
+ {I_VCMPNGTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+735, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OQPD[] = {
+ {I_VCMPFALSE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+744, 184},
+ {I_VCMPFALSE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+753, 184},
+ {I_VCMPFALSE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+762, 184},
+ {I_VCMPFALSE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+771, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSEPD[] = {
+ {I_VCMPFALSEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+744, 184},
+ {I_VCMPFALSEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+753, 184},
+ {I_VCMPFALSEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+762, 184},
+ {I_VCMPFALSEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+771, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OQPD[] = {
+ {I_VCMPNEQ_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+780, 184},
+ {I_VCMPNEQ_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+789, 184},
+ {I_VCMPNEQ_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+798, 184},
+ {I_VCMPNEQ_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+807, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OSPD[] = {
+ {I_VCMPGE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+816, 184},
+ {I_VCMPGE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+825, 184},
+ {I_VCMPGE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+834, 184},
+ {I_VCMPGE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+843, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGEPD[] = {
+ {I_VCMPGEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+816, 184},
+ {I_VCMPGEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+825, 184},
+ {I_VCMPGEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+834, 184},
+ {I_VCMPGEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+843, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OSPD[] = {
+ {I_VCMPGT_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+852, 184},
+ {I_VCMPGT_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+861, 184},
+ {I_VCMPGT_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+870, 184},
+ {I_VCMPGT_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+879, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGTPD[] = {
+ {I_VCMPGTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+852, 184},
+ {I_VCMPGTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+861, 184},
+ {I_VCMPGTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+870, 184},
+ {I_VCMPGTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+879, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_UQPD[] = {
+ {I_VCMPTRUE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+888, 184},
+ {I_VCMPTRUE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+897, 184},
+ {I_VCMPTRUE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+906, 184},
+ {I_VCMPTRUE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+915, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUEPD[] = {
+ {I_VCMPTRUEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+888, 184},
+ {I_VCMPTRUEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+897, 184},
+ {I_VCMPTRUEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+906, 184},
+ {I_VCMPTRUEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+915, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OQPD[] = {
+ {I_VCMPLT_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+924, 184},
+ {I_VCMPLT_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+933, 184},
+ {I_VCMPLT_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+942, 184},
+ {I_VCMPLT_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+951, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OQPD[] = {
+ {I_VCMPLE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+960, 184},
+ {I_VCMPLE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+969, 184},
+ {I_VCMPLE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+978, 184},
+ {I_VCMPLE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+987, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_SPD[] = {
+ {I_VCMPUNORD_SPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+996, 184},
+ {I_VCMPUNORD_SPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1005, 184},
+ {I_VCMPUNORD_SPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1014, 184},
+ {I_VCMPUNORD_SPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1023, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_USPD[] = {
+ {I_VCMPNEQ_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1032, 184},
+ {I_VCMPNEQ_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1041, 184},
+ {I_VCMPNEQ_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1050, 184},
+ {I_VCMPNEQ_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1059, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_UQPD[] = {
+ {I_VCMPNLT_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1068, 184},
+ {I_VCMPNLT_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1077, 184},
+ {I_VCMPNLT_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1086, 184},
+ {I_VCMPNLT_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1095, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_UQPD[] = {
+ {I_VCMPNLE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1104, 184},
+ {I_VCMPNLE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1113, 184},
+ {I_VCMPNLE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1122, 184},
+ {I_VCMPNLE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1131, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_SPD[] = {
+ {I_VCMPORD_SPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1140, 184},
+ {I_VCMPORD_SPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1149, 184},
+ {I_VCMPORD_SPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1158, 184},
+ {I_VCMPORD_SPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1167, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_USPD[] = {
+ {I_VCMPEQ_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1176, 184},
+ {I_VCMPEQ_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1185, 184},
+ {I_VCMPEQ_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1194, 184},
+ {I_VCMPEQ_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1203, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_UQPD[] = {
+ {I_VCMPNGE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1212, 184},
+ {I_VCMPNGE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1221, 184},
+ {I_VCMPNGE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1230, 184},
+ {I_VCMPNGE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1239, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_UQPD[] = {
+ {I_VCMPNGT_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1248, 184},
+ {I_VCMPNGT_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1257, 184},
+ {I_VCMPNGT_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1266, 184},
+ {I_VCMPNGT_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1275, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OSPD[] = {
+ {I_VCMPFALSE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1284, 184},
+ {I_VCMPFALSE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1293, 184},
+ {I_VCMPFALSE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1302, 184},
+ {I_VCMPFALSE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1311, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OSPD[] = {
+ {I_VCMPNEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1320, 184},
+ {I_VCMPNEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1329, 184},
+ {I_VCMPNEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1338, 184},
+ {I_VCMPNEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1347, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OQPD[] = {
+ {I_VCMPGE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1356, 184},
+ {I_VCMPGE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1365, 184},
+ {I_VCMPGE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1374, 184},
+ {I_VCMPGE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1383, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OQPD[] = {
+ {I_VCMPGT_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1392, 184},
+ {I_VCMPGT_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1401, 184},
+ {I_VCMPGT_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1410, 184},
+ {I_VCMPGT_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1419, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_USPD[] = {
+ {I_VCMPTRUE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1428, 184},
+ {I_VCMPTRUE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1437, 184},
+ {I_VCMPTRUE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1446, 184},
+ {I_VCMPTRUE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1455, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPPD[] = {
+ {I_VCMPPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9468, 184},
+ {I_VCMPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9476, 184},
+ {I_VCMPPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9484, 184},
+ {I_VCMPPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9492, 184},
+ {I_VCMPPD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+4110, 225},
+ {I_VCMPPD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+4119, 225},
+ {I_VCMPPD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64|SAE,0,0}, nasm_bytecodes+4128, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_OSPS[] = {
+ {I_VCMPEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1464, 184},
+ {I_VCMPEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1473, 184},
+ {I_VCMPEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1482, 184},
+ {I_VCMPEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1491, 184},
+ {I_VCMPEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1464, 184},
+ {I_VCMPEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1473, 184},
+ {I_VCMPEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1482, 184},
+ {I_VCMPEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1491, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQPS[] = {
+ {I_VCMPEQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1500, 184},
+ {I_VCMPEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1509, 184},
+ {I_VCMPEQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1518, 184},
+ {I_VCMPEQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1527, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OSPS[] = {
+ {I_VCMPLT_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1536, 184},
+ {I_VCMPLT_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1545, 184},
+ {I_VCMPLT_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1554, 184},
+ {I_VCMPLT_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1563, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLTPS[] = {
+ {I_VCMPLTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1536, 184},
+ {I_VCMPLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1545, 184},
+ {I_VCMPLTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1554, 184},
+ {I_VCMPLTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1563, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OSPS[] = {
+ {I_VCMPLE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1572, 184},
+ {I_VCMPLE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1581, 184},
+ {I_VCMPLE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1590, 184},
+ {I_VCMPLE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1599, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLEPS[] = {
+ {I_VCMPLEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1572, 184},
+ {I_VCMPLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1581, 184},
+ {I_VCMPLEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1590, 184},
+ {I_VCMPLEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1599, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_QPS[] = {
+ {I_VCMPUNORD_QPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1608, 184},
+ {I_VCMPUNORD_QPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1617, 184},
+ {I_VCMPUNORD_QPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1626, 184},
+ {I_VCMPUNORD_QPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1635, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORDPS[] = {
+ {I_VCMPUNORDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1608, 184},
+ {I_VCMPUNORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1617, 184},
+ {I_VCMPUNORDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1626, 184},
+ {I_VCMPUNORDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1635, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_UQPS[] = {
+ {I_VCMPNEQ_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1644, 184},
+ {I_VCMPNEQ_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1653, 184},
+ {I_VCMPNEQ_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1662, 184},
+ {I_VCMPNEQ_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1671, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQPS[] = {
+ {I_VCMPNEQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1644, 184},
+ {I_VCMPNEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1653, 184},
+ {I_VCMPNEQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1662, 184},
+ {I_VCMPNEQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1671, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_USPS[] = {
+ {I_VCMPNLT_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1680, 184},
+ {I_VCMPNLT_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1689, 184},
+ {I_VCMPNLT_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1698, 184},
+ {I_VCMPNLT_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1707, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLTPS[] = {
+ {I_VCMPNLTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1680, 184},
+ {I_VCMPNLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1689, 184},
+ {I_VCMPNLTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1698, 184},
+ {I_VCMPNLTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1707, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_USPS[] = {
+ {I_VCMPNLE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1716, 184},
+ {I_VCMPNLE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1725, 184},
+ {I_VCMPNLE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1734, 184},
+ {I_VCMPNLE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1743, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLEPS[] = {
+ {I_VCMPNLEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1716, 184},
+ {I_VCMPNLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1725, 184},
+ {I_VCMPNLEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1734, 184},
+ {I_VCMPNLEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1743, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_QPS[] = {
+ {I_VCMPORD_QPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1752, 184},
+ {I_VCMPORD_QPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1761, 184},
+ {I_VCMPORD_QPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1770, 184},
+ {I_VCMPORD_QPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1779, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORDPS[] = {
+ {I_VCMPORDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1752, 184},
+ {I_VCMPORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1761, 184},
+ {I_VCMPORDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1770, 184},
+ {I_VCMPORDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1779, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_UQPS[] = {
+ {I_VCMPEQ_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1788, 184},
+ {I_VCMPEQ_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1797, 184},
+ {I_VCMPEQ_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1806, 184},
+ {I_VCMPEQ_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1815, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_USPS[] = {
+ {I_VCMPNGE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1824, 184},
+ {I_VCMPNGE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1833, 184},
+ {I_VCMPNGE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1842, 184},
+ {I_VCMPNGE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1851, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGEPS[] = {
+ {I_VCMPNGEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1824, 184},
+ {I_VCMPNGEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1833, 184},
+ {I_VCMPNGEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1842, 184},
+ {I_VCMPNGEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1851, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_USPS[] = {
+ {I_VCMPNGT_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1860, 184},
+ {I_VCMPNGT_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1869, 184},
+ {I_VCMPNGT_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1878, 184},
+ {I_VCMPNGT_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1887, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGTPS[] = {
+ {I_VCMPNGTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1860, 184},
+ {I_VCMPNGTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1869, 184},
+ {I_VCMPNGTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1878, 184},
+ {I_VCMPNGTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1887, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OQPS[] = {
+ {I_VCMPFALSE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1896, 184},
+ {I_VCMPFALSE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1905, 184},
+ {I_VCMPFALSE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1914, 184},
+ {I_VCMPFALSE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1923, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSEPS[] = {
+ {I_VCMPFALSEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1896, 184},
+ {I_VCMPFALSEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1905, 184},
+ {I_VCMPFALSEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1914, 184},
+ {I_VCMPFALSEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1923, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OQPS[] = {
+ {I_VCMPNEQ_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1932, 184},
+ {I_VCMPNEQ_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1941, 184},
+ {I_VCMPNEQ_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1950, 184},
+ {I_VCMPNEQ_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1959, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OSPS[] = {
+ {I_VCMPGE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1968, 184},
+ {I_VCMPGE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1977, 184},
+ {I_VCMPGE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1986, 184},
+ {I_VCMPGE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1995, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGEPS[] = {
+ {I_VCMPGEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1968, 184},
+ {I_VCMPGEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1977, 184},
+ {I_VCMPGEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1986, 184},
+ {I_VCMPGEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1995, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OSPS[] = {
+ {I_VCMPGT_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2004, 184},
+ {I_VCMPGT_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2013, 184},
+ {I_VCMPGT_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2022, 184},
+ {I_VCMPGT_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2031, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGTPS[] = {
+ {I_VCMPGTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2004, 184},
+ {I_VCMPGTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2013, 184},
+ {I_VCMPGTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2022, 184},
+ {I_VCMPGTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2031, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_UQPS[] = {
+ {I_VCMPTRUE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2040, 184},
+ {I_VCMPTRUE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2049, 184},
+ {I_VCMPTRUE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2058, 184},
+ {I_VCMPTRUE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2067, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUEPS[] = {
+ {I_VCMPTRUEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2040, 184},
+ {I_VCMPTRUEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2049, 184},
+ {I_VCMPTRUEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2058, 184},
+ {I_VCMPTRUEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2067, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OQPS[] = {
+ {I_VCMPLT_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2076, 184},
+ {I_VCMPLT_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2085, 184},
+ {I_VCMPLT_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2094, 184},
+ {I_VCMPLT_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2103, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OQPS[] = {
+ {I_VCMPLE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2112, 184},
+ {I_VCMPLE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2121, 184},
+ {I_VCMPLE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2130, 184},
+ {I_VCMPLE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2139, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_SPS[] = {
+ {I_VCMPUNORD_SPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2148, 184},
+ {I_VCMPUNORD_SPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2157, 184},
+ {I_VCMPUNORD_SPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2166, 184},
+ {I_VCMPUNORD_SPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2175, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_USPS[] = {
+ {I_VCMPNEQ_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2184, 184},
+ {I_VCMPNEQ_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2193, 184},
+ {I_VCMPNEQ_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2202, 184},
+ {I_VCMPNEQ_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2211, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_UQPS[] = {
+ {I_VCMPNLT_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2220, 184},
+ {I_VCMPNLT_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2229, 184},
+ {I_VCMPNLT_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2238, 184},
+ {I_VCMPNLT_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2247, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_UQPS[] = {
+ {I_VCMPNLE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2256, 184},
+ {I_VCMPNLE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2265, 184},
+ {I_VCMPNLE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2274, 184},
+ {I_VCMPNLE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2283, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_SPS[] = {
+ {I_VCMPORD_SPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2292, 184},
+ {I_VCMPORD_SPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2301, 184},
+ {I_VCMPORD_SPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2310, 184},
+ {I_VCMPORD_SPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2319, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_USPS[] = {
+ {I_VCMPEQ_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2328, 184},
+ {I_VCMPEQ_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2337, 184},
+ {I_VCMPEQ_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2346, 184},
+ {I_VCMPEQ_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2355, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_UQPS[] = {
+ {I_VCMPNGE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2364, 184},
+ {I_VCMPNGE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2373, 184},
+ {I_VCMPNGE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2382, 184},
+ {I_VCMPNGE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2391, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_UQPS[] = {
+ {I_VCMPNGT_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2400, 184},
+ {I_VCMPNGT_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2409, 184},
+ {I_VCMPNGT_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2418, 184},
+ {I_VCMPNGT_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2427, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OSPS[] = {
+ {I_VCMPFALSE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2436, 184},
+ {I_VCMPFALSE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2445, 184},
+ {I_VCMPFALSE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2454, 184},
+ {I_VCMPFALSE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2463, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OSPS[] = {
+ {I_VCMPNEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2472, 184},
+ {I_VCMPNEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2481, 184},
+ {I_VCMPNEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2490, 184},
+ {I_VCMPNEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2499, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OQPS[] = {
+ {I_VCMPGE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2508, 184},
+ {I_VCMPGE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2517, 184},
+ {I_VCMPGE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2526, 184},
+ {I_VCMPGE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2535, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OQPS[] = {
+ {I_VCMPGT_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2544, 184},
+ {I_VCMPGT_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2553, 184},
+ {I_VCMPGT_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2562, 184},
+ {I_VCMPGT_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2571, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_USPS[] = {
+ {I_VCMPTRUE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2580, 184},
+ {I_VCMPTRUE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2589, 184},
+ {I_VCMPTRUE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2598, 184},
+ {I_VCMPTRUE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2607, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPPS[] = {
+ {I_VCMPPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9500, 184},
+ {I_VCMPPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9508, 184},
+ {I_VCMPPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9516, 184},
+ {I_VCMPPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9524, 184},
+ {I_VCMPPS, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+4137, 225},
+ {I_VCMPPS, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+4146, 225},
+ {I_VCMPPS, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32|SAE,0,0}, nasm_bytecodes+4155, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_OSSD[] = {
+ {I_VCMPEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2616, 184},
+ {I_VCMPEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2625, 184},
+ {I_VCMPEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2616, 184},
+ {I_VCMPEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2625, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQSD[] = {
+ {I_VCMPEQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2634, 184},
+ {I_VCMPEQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2643, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OSSD[] = {
+ {I_VCMPLT_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2652, 184},
+ {I_VCMPLT_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2661, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLTSD[] = {
+ {I_VCMPLTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2652, 184},
+ {I_VCMPLTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2661, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OSSD[] = {
+ {I_VCMPLE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2670, 184},
+ {I_VCMPLE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2679, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLESD[] = {
+ {I_VCMPLESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2670, 184},
+ {I_VCMPLESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2679, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_QSD[] = {
+ {I_VCMPUNORD_QSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2688, 184},
+ {I_VCMPUNORD_QSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2697, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORDSD[] = {
+ {I_VCMPUNORDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2688, 184},
+ {I_VCMPUNORDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2697, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_UQSD[] = {
+ {I_VCMPNEQ_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2706, 184},
+ {I_VCMPNEQ_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2715, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQSD[] = {
+ {I_VCMPNEQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2706, 184},
+ {I_VCMPNEQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2715, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_USSD[] = {
+ {I_VCMPNLT_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2724, 184},
+ {I_VCMPNLT_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2733, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLTSD[] = {
+ {I_VCMPNLTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2724, 184},
+ {I_VCMPNLTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2733, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_USSD[] = {
+ {I_VCMPNLE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2742, 184},
+ {I_VCMPNLE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2751, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLESD[] = {
+ {I_VCMPNLESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2742, 184},
+ {I_VCMPNLESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2751, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_QSD[] = {
+ {I_VCMPORD_QSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2760, 184},
+ {I_VCMPORD_QSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2769, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORDSD[] = {
+ {I_VCMPORDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2760, 184},
+ {I_VCMPORDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2769, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_UQSD[] = {
+ {I_VCMPEQ_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2778, 184},
+ {I_VCMPEQ_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2787, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_USSD[] = {
+ {I_VCMPNGE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2796, 184},
+ {I_VCMPNGE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2805, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGESD[] = {
+ {I_VCMPNGESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2796, 184},
+ {I_VCMPNGESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2805, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_USSD[] = {
+ {I_VCMPNGT_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2814, 184},
+ {I_VCMPNGT_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2823, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGTSD[] = {
+ {I_VCMPNGTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2814, 184},
+ {I_VCMPNGTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2823, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OQSD[] = {
+ {I_VCMPFALSE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2832, 184},
+ {I_VCMPFALSE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2841, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSESD[] = {
+ {I_VCMPFALSESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2832, 184},
+ {I_VCMPFALSESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2841, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OQSD[] = {
+ {I_VCMPNEQ_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2850, 184},
+ {I_VCMPNEQ_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2859, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OSSD[] = {
+ {I_VCMPGE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2868, 184},
+ {I_VCMPGE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2877, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGESD[] = {
+ {I_VCMPGESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2868, 184},
+ {I_VCMPGESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2877, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OSSD[] = {
+ {I_VCMPGT_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2886, 184},
+ {I_VCMPGT_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2895, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGTSD[] = {
+ {I_VCMPGTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2886, 184},
+ {I_VCMPGTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2895, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_UQSD[] = {
+ {I_VCMPTRUE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2904, 184},
+ {I_VCMPTRUE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2913, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUESD[] = {
+ {I_VCMPTRUESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2904, 184},
+ {I_VCMPTRUESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2913, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OQSD[] = {
+ {I_VCMPLT_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2922, 184},
+ {I_VCMPLT_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2931, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OQSD[] = {
+ {I_VCMPLE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2940, 184},
+ {I_VCMPLE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2949, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_SSD[] = {
+ {I_VCMPUNORD_SSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2958, 184},
+ {I_VCMPUNORD_SSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2967, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_USSD[] = {
+ {I_VCMPNEQ_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2976, 184},
+ {I_VCMPNEQ_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2985, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_UQSD[] = {
+ {I_VCMPNLT_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2994, 184},
+ {I_VCMPNLT_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3003, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_UQSD[] = {
+ {I_VCMPNLE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3012, 184},
+ {I_VCMPNLE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3021, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_SSD[] = {
+ {I_VCMPORD_SSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3030, 184},
+ {I_VCMPORD_SSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3039, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_USSD[] = {
+ {I_VCMPEQ_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3048, 184},
+ {I_VCMPEQ_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3057, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_UQSD[] = {
+ {I_VCMPNGE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3066, 184},
+ {I_VCMPNGE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3075, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_UQSD[] = {
+ {I_VCMPNGT_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3084, 184},
+ {I_VCMPNGT_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3093, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OSSD[] = {
+ {I_VCMPFALSE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3102, 184},
+ {I_VCMPFALSE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3111, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OSSD[] = {
+ {I_VCMPNEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3120, 184},
+ {I_VCMPNEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3129, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OQSD[] = {
+ {I_VCMPGE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3138, 184},
+ {I_VCMPGE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3147, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OQSD[] = {
+ {I_VCMPGT_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3156, 184},
+ {I_VCMPGT_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3165, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_USSD[] = {
+ {I_VCMPTRUE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3174, 184},
+ {I_VCMPTRUE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3183, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPSD[] = {
+ {I_VCMPSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9532, 184},
+ {I_VCMPSD, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9540, 184},
+ {I_VCMPSD, 4, {KREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK,0,SAE,0,0}, nasm_bytecodes+4164, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_OSSS[] = {
+ {I_VCMPEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3192, 184},
+ {I_VCMPEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3201, 184},
+ {I_VCMPEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3192, 184},
+ {I_VCMPEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3201, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQSS[] = {
+ {I_VCMPEQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3210, 184},
+ {I_VCMPEQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3219, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OSSS[] = {
+ {I_VCMPLT_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3228, 184},
+ {I_VCMPLT_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3237, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLTSS[] = {
+ {I_VCMPLTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3228, 184},
+ {I_VCMPLTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3237, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OSSS[] = {
+ {I_VCMPLE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3246, 184},
+ {I_VCMPLE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3255, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLESS[] = {
+ {I_VCMPLESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3246, 184},
+ {I_VCMPLESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3255, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_QSS[] = {
+ {I_VCMPUNORD_QSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3264, 184},
+ {I_VCMPUNORD_QSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3273, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORDSS[] = {
+ {I_VCMPUNORDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3264, 184},
+ {I_VCMPUNORDSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3273, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_UQSS[] = {
+ {I_VCMPNEQ_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3282, 184},
+ {I_VCMPNEQ_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3291, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQSS[] = {
+ {I_VCMPNEQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3282, 184},
+ {I_VCMPNEQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3291, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_USSS[] = {
+ {I_VCMPNLT_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3300, 184},
+ {I_VCMPNLT_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3309, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLTSS[] = {
+ {I_VCMPNLTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3300, 184},
+ {I_VCMPNLTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3309, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_USSS[] = {
+ {I_VCMPNLE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3318, 184},
+ {I_VCMPNLE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3327, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLESS[] = {
+ {I_VCMPNLESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3318, 184},
+ {I_VCMPNLESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3327, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_QSS[] = {
+ {I_VCMPORD_QSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3336, 184},
+ {I_VCMPORD_QSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3345, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORDSS[] = {
+ {I_VCMPORDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3336, 184},
+ {I_VCMPORDSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3345, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_UQSS[] = {
+ {I_VCMPEQ_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3354, 184},
+ {I_VCMPEQ_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3363, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_USSS[] = {
+ {I_VCMPNGE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3372, 184},
+ {I_VCMPNGE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3381, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGESS[] = {
+ {I_VCMPNGESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3372, 184},
+ {I_VCMPNGESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3381, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_USSS[] = {
+ {I_VCMPNGT_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3390, 184},
+ {I_VCMPNGT_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3399, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGTSS[] = {
+ {I_VCMPNGTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3390, 184},
+ {I_VCMPNGTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3399, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OQSS[] = {
+ {I_VCMPFALSE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3408, 184},
+ {I_VCMPFALSE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3417, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSESS[] = {
+ {I_VCMPFALSESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3408, 184},
+ {I_VCMPFALSESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3417, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OQSS[] = {
+ {I_VCMPNEQ_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3426, 184},
+ {I_VCMPNEQ_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3435, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OSSS[] = {
+ {I_VCMPGE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3444, 184},
+ {I_VCMPGE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3453, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGESS[] = {
+ {I_VCMPGESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3444, 184},
+ {I_VCMPGESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3453, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OSSS[] = {
+ {I_VCMPGT_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3462, 184},
+ {I_VCMPGT_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3471, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGTSS[] = {
+ {I_VCMPGTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3462, 184},
+ {I_VCMPGTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3471, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_UQSS[] = {
+ {I_VCMPTRUE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3480, 184},
+ {I_VCMPTRUE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3489, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUESS[] = {
+ {I_VCMPTRUESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3480, 184},
+ {I_VCMPTRUESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3489, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLT_OQSS[] = {
+ {I_VCMPLT_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3498, 184},
+ {I_VCMPLT_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3507, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPLE_OQSS[] = {
+ {I_VCMPLE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3516, 184},
+ {I_VCMPLE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3525, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPUNORD_SSS[] = {
+ {I_VCMPUNORD_SSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3534, 184},
+ {I_VCMPUNORD_SSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3543, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_USSS[] = {
+ {I_VCMPNEQ_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3552, 184},
+ {I_VCMPNEQ_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3561, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLT_UQSS[] = {
+ {I_VCMPNLT_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3570, 184},
+ {I_VCMPNLT_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3579, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNLE_UQSS[] = {
+ {I_VCMPNLE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3588, 184},
+ {I_VCMPNLE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3597, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPORD_SSS[] = {
+ {I_VCMPORD_SSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3606, 184},
+ {I_VCMPORD_SSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3615, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPEQ_USSS[] = {
+ {I_VCMPEQ_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3624, 184},
+ {I_VCMPEQ_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3633, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGE_UQSS[] = {
+ {I_VCMPNGE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3642, 184},
+ {I_VCMPNGE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3651, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNGT_UQSS[] = {
+ {I_VCMPNGT_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3660, 184},
+ {I_VCMPNGT_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3669, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPFALSE_OSSS[] = {
+ {I_VCMPFALSE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3678, 184},
+ {I_VCMPFALSE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3687, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPNEQ_OSSS[] = {
+ {I_VCMPNEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3696, 184},
+ {I_VCMPNEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3705, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGE_OQSS[] = {
+ {I_VCMPGE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3714, 184},
+ {I_VCMPGE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3723, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPGT_OQSS[] = {
+ {I_VCMPGT_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3732, 184},
+ {I_VCMPGT_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3741, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPTRUE_USSS[] = {
+ {I_VCMPTRUE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3750, 184},
+ {I_VCMPTRUE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3759, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCMPSS[] = {
+ {I_VCMPSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9548, 184},
+ {I_VCMPSS, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9556, 184},
+ {I_VCMPSS, 4, {KREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK,0,SAE,0,0}, nasm_bytecodes+4173, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCOMISD[] = {
+ {I_VCOMISD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28092, 184},
+ {I_VCOMISD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+12988, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCOMISS[] = {
+ {I_VCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28099, 184},
+ {I_VCOMISS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+12996, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTDQ2PD[] = {
+ {I_VCVTDQ2PD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28106, 184},
+ {I_VCVTDQ2PD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28113, 184},
+ {I_VCVTDQ2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13100, 225},
+ {I_VCVTDQ2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13108, 225},
+ {I_VCVTDQ2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13116, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTDQ2PS[] = {
+ {I_VCVTDQ2PS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28120, 184},
+ {I_VCVTDQ2PS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28127, 184},
+ {I_VCVTDQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13124, 225},
+ {I_VCVTDQ2PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13132, 225},
+ {I_VCVTDQ2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13140, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPD2DQ[] = {
+ {I_VCVTPD2DQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28134, 184},
+ {I_VCVTPD2DQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28134, 188},
+ {I_VCVTPD2DQ, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28141, 184},
+ {I_VCVTPD2DQ, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28141, 189},
+ {I_VCVTPD2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13148, 225},
+ {I_VCVTPD2DQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13156, 225},
+ {I_VCVTPD2DQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13164, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPD2PS[] = {
+ {I_VCVTPD2PS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28148, 184},
+ {I_VCVTPD2PS, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28148, 188},
+ {I_VCVTPD2PS, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28155, 184},
+ {I_VCVTPD2PS, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28155, 189},
+ {I_VCVTPD2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13172, 225},
+ {I_VCVTPD2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13180, 225},
+ {I_VCVTPD2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13188, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2DQ[] = {
+ {I_VCVTPS2DQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28162, 184},
+ {I_VCVTPS2DQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28169, 184},
+ {I_VCVTPS2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13292, 225},
+ {I_VCVTPS2DQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13300, 225},
+ {I_VCVTPS2DQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13308, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2PD[] = {
+ {I_VCVTPS2PD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28176, 184},
+ {I_VCVTPS2PD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28183, 184},
+ {I_VCVTPS2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13316, 225},
+ {I_VCVTPS2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13324, 225},
+ {I_VCVTPS2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13332, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSD2SI[] = {
+ {I_VCVTSD2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28190, 184},
+ {I_VCVTSD2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28197, 190},
+ {I_VCVTSD2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13460, 226},
+ {I_VCVTSD2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13468, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSD2SS[] = {
+ {I_VCVTSD2SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28204, 184},
+ {I_VCVTSD2SS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28211, 184},
+ {I_VCVTSD2SS, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+13476, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSI2SD[] = {
+ {I_VCVTSI2SD, 3, {XMM_L16,XMM_L16,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28218, 191},
+ {I_VCVTSI2SD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28225, 191},
+ {I_VCVTSI2SD, 3, {XMM_L16,XMM_L16,MEMORY|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28218, 191},
+ {I_VCVTSI2SD, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28225, 191},
+ {I_VCVTSI2SD, 3, {XMM_L16,XMM_L16,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28232, 192},
+ {I_VCVTSI2SD, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28239, 192},
+ {I_VCVTSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13500, 226},
+ {I_VCVTSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13508, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSI2SS[] = {
+ {I_VCVTSI2SS, 3, {XMM_L16,XMM_L16,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28246, 191},
+ {I_VCVTSI2SS, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28253, 191},
+ {I_VCVTSI2SS, 3, {XMM_L16,XMM_L16,MEMORY|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28246, 191},
+ {I_VCVTSI2SS, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28253, 191},
+ {I_VCVTSI2SS, 3, {XMM_L16,XMM_L16,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28260, 192},
+ {I_VCVTSI2SS, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28267, 192},
+ {I_VCVTSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13516, 226},
+ {I_VCVTSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13524, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSS2SD[] = {
+ {I_VCVTSS2SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28274, 184},
+ {I_VCVTSS2SD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28281, 184},
+ {I_VCVTSS2SD, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+13532, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSS2SI[] = {
+ {I_VCVTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28288, 184},
+ {I_VCVTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28295, 190},
+ {I_VCVTSS2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13540, 226},
+ {I_VCVTSS2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13548, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPD2DQ[] = {
+ {I_VCVTTPD2DQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28302, 184},
+ {I_VCVTTPD2DQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28302, 188},
+ {I_VCVTTPD2DQ, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28309, 184},
+ {I_VCVTTPD2DQ, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28309, 189},
+ {I_VCVTTPD2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13572, 225},
+ {I_VCVTTPD2DQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13580, 225},
+ {I_VCVTTPD2DQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13588, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPS2DQ[] = {
+ {I_VCVTTPS2DQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28316, 184},
+ {I_VCVTTPS2DQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28323, 184},
+ {I_VCVTTPS2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13668, 225},
+ {I_VCVTTPS2DQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13676, 225},
+ {I_VCVTTPS2DQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13684, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTSD2SI[] = {
+ {I_VCVTTSD2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28330, 184},
+ {I_VCVTTSD2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28337, 190},
+ {I_VCVTTSD2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13764, 226},
+ {I_VCVTTSD2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13772, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTSS2SI[] = {
+ {I_VCVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28344, 184},
+ {I_VCVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28351, 190},
+ {I_VCVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13796, 226},
+ {I_VCVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13804, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDIVPD[] = {
+ {I_VDIVPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28358, 184},
+ {I_VDIVPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28365, 184},
+ {I_VDIVPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28372, 184},
+ {I_VDIVPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28379, 184},
+ {I_VDIVPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+13956, 225},
+ {I_VDIVPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13964, 225},
+ {I_VDIVPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+13972, 225},
+ {I_VDIVPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13980, 225},
+ {I_VDIVPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+13988, 226},
+ {I_VDIVPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13996, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDIVPS[] = {
+ {I_VDIVPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28386, 184},
+ {I_VDIVPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28393, 184},
+ {I_VDIVPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28400, 184},
+ {I_VDIVPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28407, 184},
+ {I_VDIVPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14004, 225},
+ {I_VDIVPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+14012, 225},
+ {I_VDIVPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14020, 225},
+ {I_VDIVPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+14028, 225},
+ {I_VDIVPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14036, 226},
+ {I_VDIVPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+14044, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDIVSD[] = {
+ {I_VDIVSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28414, 184},
+ {I_VDIVSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28421, 184},
+ {I_VDIVSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14052, 226},
+ {I_VDIVSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+14060, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDIVSS[] = {
+ {I_VDIVSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28428, 184},
+ {I_VDIVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28435, 184},
+ {I_VDIVSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14068, 226},
+ {I_VDIVSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+14076, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDPPD[] = {
+ {I_VDPPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9564, 184},
+ {I_VDPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9572, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDPPS[] = {
+ {I_VDPPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9580, 184},
+ {I_VDPPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9588, 184},
+ {I_VDPPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9596, 184},
+ {I_VDPPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9604, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTF128[] = {
+ {I_VEXTRACTF128, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9612, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTPS[] = {
+ {I_VEXTRACTPS, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9620, 184},
+ {I_VEXTRACTPS, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ {I_VEXTRACTPS, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ {I_VEXTRACTPS, 3, {MEMORY|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VHADDPD[] = {
+ {I_VHADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28442, 184},
+ {I_VHADDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28449, 184},
+ {I_VHADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28456, 184},
+ {I_VHADDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28463, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VHADDPS[] = {
+ {I_VHADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28470, 184},
+ {I_VHADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28477, 184},
+ {I_VHADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28484, 184},
+ {I_VHADDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28491, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VHSUBPD[] = {
+ {I_VHSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28498, 184},
+ {I_VHSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28505, 184},
+ {I_VHSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28512, 184},
+ {I_VHSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28519, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VHSUBPS[] = {
+ {I_VHSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28526, 184},
+ {I_VHSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28533, 184},
+ {I_VHSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28540, 184},
+ {I_VHSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28547, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTF128[] = {
+ {I_VINSERTF128, 4, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9628, 184},
+ {I_VINSERTF128, 3, {YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9636, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTPS[] = {
+ {I_VINSERTPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9644, 184},
+ {I_VINSERTPS, 3, {XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9652, 184},
+ {I_VINSERTPS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5172, 226},
+ {I_VINSERTPS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5181, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VLDDQU[] = {
+ {I_VLDDQU, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28554, 184},
+ {I_VLDDQU, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28561, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VLDQQU[] = {
+ {I_VLDQQU, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28561, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VLDMXCSR[] = {
+ {I_VLDMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+28568, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMASKMOVDQU[] = {
+ {I_VMASKMOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28575, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMASKMOVPS[] = {
+ {I_VMASKMOVPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28582, 184},
+ {I_VMASKMOVPS, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28589, 184},
+ {I_VMASKMOVPS, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28596, 188},
+ {I_VMASKMOVPS, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28603, 189},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMASKMOVPD[] = {
+ {I_VMASKMOVPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28610, 184},
+ {I_VMASKMOVPD, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28617, 184},
+ {I_VMASKMOVPD, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28624, 184},
+ {I_VMASKMOVPD, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28631, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMAXPD[] = {
+ {I_VMAXPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28638, 184},
+ {I_VMAXPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28645, 184},
+ {I_VMAXPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28652, 184},
+ {I_VMAXPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28659, 184},
+ {I_VMAXPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15268, 225},
+ {I_VMAXPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15276, 225},
+ {I_VMAXPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15284, 225},
+ {I_VMAXPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15292, 225},
+ {I_VMAXPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+15300, 226},
+ {I_VMAXPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15308, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMAXPS[] = {
+ {I_VMAXPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28666, 184},
+ {I_VMAXPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28673, 184},
+ {I_VMAXPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28680, 184},
+ {I_VMAXPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28687, 184},
+ {I_VMAXPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15316, 225},
+ {I_VMAXPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15324, 225},
+ {I_VMAXPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15332, 225},
+ {I_VMAXPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15340, 225},
+ {I_VMAXPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+15348, 226},
+ {I_VMAXPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15356, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMAXSD[] = {
+ {I_VMAXSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28694, 184},
+ {I_VMAXSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28701, 184},
+ {I_VMAXSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15364, 226},
+ {I_VMAXSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15372, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMAXSS[] = {
+ {I_VMAXSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28708, 184},
+ {I_VMAXSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28715, 184},
+ {I_VMAXSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15380, 226},
+ {I_VMAXSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15388, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMINPD[] = {
+ {I_VMINPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28722, 184},
+ {I_VMINPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28729, 184},
+ {I_VMINPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28736, 184},
+ {I_VMINPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28743, 184},
+ {I_VMINPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15396, 225},
+ {I_VMINPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15404, 225},
+ {I_VMINPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15412, 225},
+ {I_VMINPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15420, 225},
+ {I_VMINPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+15428, 226},
+ {I_VMINPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15436, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMINPS[] = {
+ {I_VMINPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28750, 184},
+ {I_VMINPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28757, 184},
+ {I_VMINPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28764, 184},
+ {I_VMINPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28771, 184},
+ {I_VMINPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15444, 225},
+ {I_VMINPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15452, 225},
+ {I_VMINPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15460, 225},
+ {I_VMINPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15468, 225},
+ {I_VMINPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+15476, 226},
+ {I_VMINPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15484, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMINSD[] = {
+ {I_VMINSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28778, 184},
+ {I_VMINSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28785, 184},
+ {I_VMINSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15492, 226},
+ {I_VMINSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15500, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMINSS[] = {
+ {I_VMINSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28792, 184},
+ {I_VMINSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28799, 184},
+ {I_VMINSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15508, 226},
+ {I_VMINSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15516, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVAPD[] = {
+ {I_VMOVAPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28806, 184},
+ {I_VMOVAPD, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28813, 184},
+ {I_VMOVAPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28820, 184},
+ {I_VMOVAPD, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28827, 184},
+ {I_VMOVAPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15524, 225},
+ {I_VMOVAPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15532, 225},
+ {I_VMOVAPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15540, 226},
+ {I_VMOVAPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15548, 225},
+ {I_VMOVAPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15556, 225},
+ {I_VMOVAPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15564, 226},
+ {I_VMOVAPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15572, 225},
+ {I_VMOVAPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15580, 225},
+ {I_VMOVAPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15588, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVAPS[] = {
+ {I_VMOVAPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28834, 184},
+ {I_VMOVAPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28841, 184},
+ {I_VMOVAPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28848, 184},
+ {I_VMOVAPS, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28855, 184},
+ {I_VMOVAPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15596, 225},
+ {I_VMOVAPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15604, 225},
+ {I_VMOVAPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15612, 226},
+ {I_VMOVAPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15620, 225},
+ {I_VMOVAPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15628, 225},
+ {I_VMOVAPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15636, 226},
+ {I_VMOVAPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15644, 225},
+ {I_VMOVAPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15652, 225},
+ {I_VMOVAPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15660, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVD[] = {
+ {I_VMOVD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28862, 184},
+ {I_VMOVD, 2, {RM_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28869, 184},
+ {I_VMOVD, 2, {XMMREG,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+15668, 226},
+ {I_VMOVD, 2, {RM_GPR|BITS32,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+15676, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVQ[] = {
+ {I_VMOVQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28876, 193},
+ {I_VMOVQ, 2, {RM_XMM_L16|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28883, 193},
+ {I_VMOVQ, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28890, 192},
+ {I_VMOVQ, 2, {RM_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28897, 192},
+ {I_VMOVQ, 2, {XMMREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16220, 226},
+ {I_VMOVQ, 2, {RM_GPR|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16228, 226},
+ {I_VMOVQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16236, 226},
+ {I_VMOVQ, 2, {RM_XMM|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16244, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDDUP[] = {
+ {I_VMOVDDUP, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28904, 184},
+ {I_VMOVDDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28911, 184},
+ {I_VMOVDDUP, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15684, 225},
+ {I_VMOVDDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15692, 225},
+ {I_VMOVDDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15700, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQA[] = {
+ {I_VMOVDQA, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28918, 184},
+ {I_VMOVDQA, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28925, 184},
+ {I_VMOVDQA, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28932, 184},
+ {I_VMOVDQA, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28939, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVQQA[] = {
+ {I_VMOVQQA, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28932, 184},
+ {I_VMOVQQA, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28939, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQU[] = {
+ {I_VMOVDQU, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28946, 184},
+ {I_VMOVDQU, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28953, 184},
+ {I_VMOVDQU, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28960, 184},
+ {I_VMOVDQU, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28967, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVQQU[] = {
+ {I_VMOVQQU, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28960, 184},
+ {I_VMOVQQU, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28967, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVHLPS[] = {
+ {I_VMOVHLPS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28974, 184},
+ {I_VMOVHLPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28981, 184},
+ {I_VMOVHLPS, 3, {XMMREG,XMMREG,XMMREG,0,0}, NO_DECORATOR, nasm_bytecodes+15996, 226},
+ {I_VMOVHLPS, 2, {XMMREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16004, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVHPD[] = {
+ {I_VMOVHPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28988, 184},
+ {I_VMOVHPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28995, 184},
+ {I_VMOVHPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29002, 184},
+ {I_VMOVHPD, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16012, 226},
+ {I_VMOVHPD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16020, 226},
+ {I_VMOVHPD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16028, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVHPS[] = {
+ {I_VMOVHPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29009, 184},
+ {I_VMOVHPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29016, 184},
+ {I_VMOVHPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29023, 184},
+ {I_VMOVHPS, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16036, 226},
+ {I_VMOVHPS, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16044, 226},
+ {I_VMOVHPS, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16052, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVLHPS[] = {
+ {I_VMOVLHPS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29009, 184},
+ {I_VMOVLHPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29016, 184},
+ {I_VMOVLHPS, 3, {XMMREG,XMMREG,XMMREG,0,0}, NO_DECORATOR, nasm_bytecodes+16060, 226},
+ {I_VMOVLHPS, 2, {XMMREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16068, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVLPD[] = {
+ {I_VMOVLPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29030, 184},
+ {I_VMOVLPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29037, 184},
+ {I_VMOVLPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29044, 184},
+ {I_VMOVLPD, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16076, 226},
+ {I_VMOVLPD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16084, 226},
+ {I_VMOVLPD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16092, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVLPS[] = {
+ {I_VMOVLPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28974, 184},
+ {I_VMOVLPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28981, 184},
+ {I_VMOVLPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29051, 184},
+ {I_VMOVLPS, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16100, 226},
+ {I_VMOVLPS, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16108, 226},
+ {I_VMOVLPS, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16116, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVMSKPD[] = {
+ {I_VMOVMSKPD, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29058, 190},
+ {I_VMOVMSKPD, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29058, 184},
+ {I_VMOVMSKPD, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29065, 190},
+ {I_VMOVMSKPD, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29065, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVMSKPS[] = {
+ {I_VMOVMSKPS, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29072, 190},
+ {I_VMOVMSKPS, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29072, 184},
+ {I_VMOVMSKPS, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29079, 190},
+ {I_VMOVMSKPS, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29079, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVNTDQ[] = {
+ {I_VMOVNTDQ, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29086, 184},
+ {I_VMOVNTDQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29093, 184},
+ {I_VMOVNTDQ, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16124, 225},
+ {I_VMOVNTDQ, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16132, 225},
+ {I_VMOVNTDQ, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16140, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVNTQQ[] = {
+ {I_VMOVNTQQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29093, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVNTDQA[] = {
+ {I_VMOVNTDQA, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29100, 184},
+ {I_VMOVNTDQA, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33853, 203},
+ {I_VMOVNTDQA, 2, {XMMREG,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+16148, 225},
+ {I_VMOVNTDQA, 2, {YMMREG,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+16156, 225},
+ {I_VMOVNTDQA, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+16164, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVNTPD[] = {
+ {I_VMOVNTPD, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29107, 184},
+ {I_VMOVNTPD, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29114, 184},
+ {I_VMOVNTPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16172, 225},
+ {I_VMOVNTPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16180, 225},
+ {I_VMOVNTPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16188, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVNTPS[] = {
+ {I_VMOVNTPS, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29121, 184},
+ {I_VMOVNTPS, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29128, 184},
+ {I_VMOVNTPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16196, 225},
+ {I_VMOVNTPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16204, 225},
+ {I_VMOVNTPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16212, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVSD[] = {
+ {I_VMOVSD, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29135, 184},
+ {I_VMOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29142, 184},
+ {I_VMOVSD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29149, 184},
+ {I_VMOVSD, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29156, 184},
+ {I_VMOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29163, 184},
+ {I_VMOVSD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29170, 184},
+ {I_VMOVSD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16252, 226},
+ {I_VMOVSD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16260, 226},
+ {I_VMOVSD, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16268, 226},
+ {I_VMOVSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16276, 226},
+ {I_VMOVSD, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16284, 226},
+ {I_VMOVSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16292, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVSHDUP[] = {
+ {I_VMOVSHDUP, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29177, 184},
+ {I_VMOVSHDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29184, 184},
+ {I_VMOVSHDUP, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16300, 225},
+ {I_VMOVSHDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16308, 225},
+ {I_VMOVSHDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16316, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVSLDUP[] = {
+ {I_VMOVSLDUP, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29191, 184},
+ {I_VMOVSLDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29198, 184},
+ {I_VMOVSLDUP, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16324, 225},
+ {I_VMOVSLDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16332, 225},
+ {I_VMOVSLDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16340, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVSS[] = {
+ {I_VMOVSS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29205, 184},
+ {I_VMOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29212, 184},
+ {I_VMOVSS, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+29219, 184},
+ {I_VMOVSS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29226, 184},
+ {I_VMOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29233, 184},
+ {I_VMOVSS, 2, {MEMORY|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29240, 184},
+ {I_VMOVSS, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16348, 226},
+ {I_VMOVSS, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16356, 226},
+ {I_VMOVSS, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16364, 226},
+ {I_VMOVSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16372, 226},
+ {I_VMOVSS, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16380, 226},
+ {I_VMOVSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16388, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVUPD[] = {
+ {I_VMOVUPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29247, 184},
+ {I_VMOVUPD, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29254, 184},
+ {I_VMOVUPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29261, 184},
+ {I_VMOVUPD, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29268, 184},
+ {I_VMOVUPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16396, 225},
+ {I_VMOVUPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16404, 225},
+ {I_VMOVUPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16412, 226},
+ {I_VMOVUPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16420, 225},
+ {I_VMOVUPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16428, 225},
+ {I_VMOVUPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16436, 226},
+ {I_VMOVUPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16444, 225},
+ {I_VMOVUPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16452, 225},
+ {I_VMOVUPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16460, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVUPS[] = {
+ {I_VMOVUPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29275, 184},
+ {I_VMOVUPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29282, 184},
+ {I_VMOVUPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29289, 184},
+ {I_VMOVUPS, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29296, 184},
+ {I_VMOVUPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16468, 225},
+ {I_VMOVUPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16476, 225},
+ {I_VMOVUPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16484, 226},
+ {I_VMOVUPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16492, 225},
+ {I_VMOVUPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16500, 225},
+ {I_VMOVUPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16508, 226},
+ {I_VMOVUPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16516, 225},
+ {I_VMOVUPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16524, 225},
+ {I_VMOVUPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16532, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMPSADBW[] = {
+ {I_VMPSADBW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9660, 184},
+ {I_VMPSADBW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9668, 184},
+ {I_VMPSADBW, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11844, 203},
+ {I_VMPSADBW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11852, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMULPD[] = {
+ {I_VMULPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29303, 184},
+ {I_VMULPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29310, 184},
+ {I_VMULPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29317, 184},
+ {I_VMULPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29324, 184},
+ {I_VMULPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16540, 225},
+ {I_VMULPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16548, 225},
+ {I_VMULPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16556, 225},
+ {I_VMULPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16564, 225},
+ {I_VMULPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+16572, 226},
+ {I_VMULPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+16580, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMULPS[] = {
+ {I_VMULPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29331, 184},
+ {I_VMULPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29338, 184},
+ {I_VMULPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29345, 184},
+ {I_VMULPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29352, 184},
+ {I_VMULPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16588, 225},
+ {I_VMULPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16596, 225},
+ {I_VMULPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16604, 225},
+ {I_VMULPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16612, 225},
+ {I_VMULPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+16620, 226},
+ {I_VMULPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+16628, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMULSD[] = {
+ {I_VMULSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29359, 184},
+ {I_VMULSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29366, 184},
+ {I_VMULSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+16636, 226},
+ {I_VMULSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+16644, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMULSS[] = {
+ {I_VMULSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+29373, 184},
+ {I_VMULSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+29380, 184},
+ {I_VMULSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+16652, 226},
+ {I_VMULSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+16660, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VORPD[] = {
+ {I_VORPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29387, 184},
+ {I_VORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29394, 184},
+ {I_VORPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29401, 184},
+ {I_VORPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29408, 184},
+ {I_VORPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16668, 227},
+ {I_VORPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16676, 227},
+ {I_VORPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16684, 227},
+ {I_VORPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16692, 227},
+ {I_VORPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16700, 228},
+ {I_VORPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16708, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VORPS[] = {
+ {I_VORPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29415, 184},
+ {I_VORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29422, 184},
+ {I_VORPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29429, 184},
+ {I_VORPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29436, 184},
+ {I_VORPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16716, 227},
+ {I_VORPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16724, 227},
+ {I_VORPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16732, 227},
+ {I_VORPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16740, 227},
+ {I_VORPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16748, 228},
+ {I_VORPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16756, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPABSB[] = {
+ {I_VPABSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29443, 184},
+ {I_VPABSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32593, 203},
+ {I_VPABSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16764, 229},
+ {I_VPABSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16772, 229},
+ {I_VPABSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16780, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPABSW[] = {
+ {I_VPABSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29450, 184},
+ {I_VPABSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32600, 203},
+ {I_VPABSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16836, 229},
+ {I_VPABSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16844, 229},
+ {I_VPABSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16852, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPABSD[] = {
+ {I_VPABSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29457, 184},
+ {I_VPABSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32607, 203},
+ {I_VPABSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16788, 225},
+ {I_VPABSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16796, 225},
+ {I_VPABSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16804, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPACKSSWB[] = {
+ {I_VPACKSSWB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29464, 184},
+ {I_VPACKSSWB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29471, 184},
+ {I_VPACKSSWB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32614, 203},
+ {I_VPACKSSWB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32621, 203},
+ {I_VPACKSSWB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16908, 229},
+ {I_VPACKSSWB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16916, 229},
+ {I_VPACKSSWB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16924, 229},
+ {I_VPACKSSWB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16932, 229},
+ {I_VPACKSSWB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16940, 230},
+ {I_VPACKSSWB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16948, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPACKSSDW[] = {
+ {I_VPACKSSDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29478, 184},
+ {I_VPACKSSDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29485, 184},
+ {I_VPACKSSDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32628, 203},
+ {I_VPACKSSDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32635, 203},
+ {I_VPACKSSDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16860, 229},
+ {I_VPACKSSDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16868, 229},
+ {I_VPACKSSDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16876, 229},
+ {I_VPACKSSDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16884, 229},
+ {I_VPACKSSDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16892, 230},
+ {I_VPACKSSDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16900, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPACKUSWB[] = {
+ {I_VPACKUSWB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29492, 184},
+ {I_VPACKUSWB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29499, 184},
+ {I_VPACKUSWB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32656, 203},
+ {I_VPACKUSWB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32663, 203},
+ {I_VPACKUSWB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17004, 229},
+ {I_VPACKUSWB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17012, 229},
+ {I_VPACKUSWB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17020, 229},
+ {I_VPACKUSWB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17028, 229},
+ {I_VPACKUSWB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17036, 230},
+ {I_VPACKUSWB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17044, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPACKUSDW[] = {
+ {I_VPACKUSDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29506, 184},
+ {I_VPACKUSDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29513, 184},
+ {I_VPACKUSDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32642, 203},
+ {I_VPACKUSDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32649, 203},
+ {I_VPACKUSDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16956, 229},
+ {I_VPACKUSDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16964, 229},
+ {I_VPACKUSDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16972, 229},
+ {I_VPACKUSDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16980, 229},
+ {I_VPACKUSDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16988, 230},
+ {I_VPACKUSDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16996, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDB[] = {
+ {I_VPADDB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29520, 184},
+ {I_VPADDB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29527, 184},
+ {I_VPADDB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32670, 203},
+ {I_VPADDB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32677, 203},
+ {I_VPADDB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17052, 229},
+ {I_VPADDB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17060, 229},
+ {I_VPADDB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17068, 229},
+ {I_VPADDB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17076, 229},
+ {I_VPADDB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17084, 230},
+ {I_VPADDB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17092, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDW[] = {
+ {I_VPADDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29534, 184},
+ {I_VPADDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29541, 184},
+ {I_VPADDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32684, 203},
+ {I_VPADDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32691, 203},
+ {I_VPADDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17388, 229},
+ {I_VPADDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17396, 229},
+ {I_VPADDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17404, 229},
+ {I_VPADDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17412, 229},
+ {I_VPADDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17420, 230},
+ {I_VPADDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17428, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDD[] = {
+ {I_VPADDD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29548, 184},
+ {I_VPADDD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29555, 184},
+ {I_VPADDD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32698, 203},
+ {I_VPADDD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32705, 203},
+ {I_VPADDD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17100, 225},
+ {I_VPADDD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17108, 225},
+ {I_VPADDD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17116, 225},
+ {I_VPADDD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17124, 225},
+ {I_VPADDD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17132, 226},
+ {I_VPADDD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17140, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDQ[] = {
+ {I_VPADDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29562, 184},
+ {I_VPADDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29569, 184},
+ {I_VPADDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32712, 203},
+ {I_VPADDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32719, 203},
+ {I_VPADDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17148, 225},
+ {I_VPADDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17156, 225},
+ {I_VPADDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17164, 225},
+ {I_VPADDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17172, 225},
+ {I_VPADDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17180, 226},
+ {I_VPADDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17188, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDSB[] = {
+ {I_VPADDSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29576, 184},
+ {I_VPADDSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29583, 184},
+ {I_VPADDSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32726, 203},
+ {I_VPADDSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32733, 203},
+ {I_VPADDSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17196, 229},
+ {I_VPADDSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17204, 229},
+ {I_VPADDSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17212, 229},
+ {I_VPADDSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17220, 229},
+ {I_VPADDSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17228, 230},
+ {I_VPADDSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17236, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDSW[] = {
+ {I_VPADDSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29590, 184},
+ {I_VPADDSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29597, 184},
+ {I_VPADDSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32740, 203},
+ {I_VPADDSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32747, 203},
+ {I_VPADDSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17244, 229},
+ {I_VPADDSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17252, 229},
+ {I_VPADDSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17260, 229},
+ {I_VPADDSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17268, 229},
+ {I_VPADDSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17276, 230},
+ {I_VPADDSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17284, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDUSB[] = {
+ {I_VPADDUSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29604, 184},
+ {I_VPADDUSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29611, 184},
+ {I_VPADDUSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32754, 203},
+ {I_VPADDUSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32761, 203},
+ {I_VPADDUSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17292, 229},
+ {I_VPADDUSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17300, 229},
+ {I_VPADDUSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17308, 229},
+ {I_VPADDUSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17316, 229},
+ {I_VPADDUSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17324, 230},
+ {I_VPADDUSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17332, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPADDUSW[] = {
+ {I_VPADDUSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29618, 184},
+ {I_VPADDUSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29625, 184},
+ {I_VPADDUSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32768, 203},
+ {I_VPADDUSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32775, 203},
+ {I_VPADDUSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17340, 229},
+ {I_VPADDUSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17348, 229},
+ {I_VPADDUSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17356, 229},
+ {I_VPADDUSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17364, 229},
+ {I_VPADDUSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17372, 230},
+ {I_VPADDUSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17380, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPALIGNR[] = {
+ {I_VPALIGNR, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9676, 184},
+ {I_VPALIGNR, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9684, 184},
+ {I_VPALIGNR, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11860, 203},
+ {I_VPALIGNR, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11868, 203},
+ {I_VPALIGNR, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5190, 229},
+ {I_VPALIGNR, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5199, 229},
+ {I_VPALIGNR, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5208, 229},
+ {I_VPALIGNR, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5217, 229},
+ {I_VPALIGNR, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5226, 230},
+ {I_VPALIGNR, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5235, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPAND[] = {
+ {I_VPAND, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29632, 184},
+ {I_VPAND, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29639, 184},
+ {I_VPAND, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32782, 203},
+ {I_VPAND, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32789, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPANDN[] = {
+ {I_VPANDN, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29646, 184},
+ {I_VPANDN, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29653, 184},
+ {I_VPANDN, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32796, 203},
+ {I_VPANDN, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32803, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPAVGB[] = {
+ {I_VPAVGB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29660, 184},
+ {I_VPAVGB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29667, 184},
+ {I_VPAVGB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32810, 203},
+ {I_VPAVGB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32817, 203},
+ {I_VPAVGB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17628, 229},
+ {I_VPAVGB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17636, 229},
+ {I_VPAVGB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17644, 229},
+ {I_VPAVGB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17652, 229},
+ {I_VPAVGB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17660, 230},
+ {I_VPAVGB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17668, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPAVGW[] = {
+ {I_VPAVGW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29674, 184},
+ {I_VPAVGW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29681, 184},
+ {I_VPAVGW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32824, 203},
+ {I_VPAVGW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32831, 203},
+ {I_VPAVGW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17676, 229},
+ {I_VPAVGW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17684, 229},
+ {I_VPAVGW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17692, 229},
+ {I_VPAVGW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17700, 229},
+ {I_VPAVGW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17708, 230},
+ {I_VPAVGW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17716, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDVB[] = {
+ {I_VPBLENDVB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9692, 184},
+ {I_VPBLENDVB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9700, 184},
+ {I_VPBLENDVB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11876, 203},
+ {I_VPBLENDVB, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11884, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDW[] = {
+ {I_VPBLENDW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9708, 184},
+ {I_VPBLENDW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9716, 184},
+ {I_VPBLENDW, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11892, 203},
+ {I_VPBLENDW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11900, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPESTRI[] = {
+ {I_VPCMPESTRI, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9724, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPESTRM[] = {
+ {I_VPCMPESTRM, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9732, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPISTRI[] = {
+ {I_VPCMPISTRI, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9740, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPISTRM[] = {
+ {I_VPCMPISTRM, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9748, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPEQB[] = {
+ {I_VPCMPEQB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29688, 184},
+ {I_VPCMPEQB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29695, 184},
+ {I_VPCMPEQB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32838, 203},
+ {I_VPCMPEQB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32845, 203},
+ {I_VPCMPEQB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18108, 229},
+ {I_VPCMPEQB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18116, 229},
+ {I_VPCMPEQB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18124, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPEQW[] = {
+ {I_VPCMPEQW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29702, 184},
+ {I_VPCMPEQW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29709, 184},
+ {I_VPCMPEQW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32852, 203},
+ {I_VPCMPEQW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32859, 203},
+ {I_VPCMPEQW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18180, 229},
+ {I_VPCMPEQW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18188, 229},
+ {I_VPCMPEQW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18196, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPEQD[] = {
+ {I_VPCMPEQD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29716, 184},
+ {I_VPCMPEQD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29723, 184},
+ {I_VPCMPEQD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32866, 203},
+ {I_VPCMPEQD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32873, 203},
+ {I_VPCMPEQD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18132, 225},
+ {I_VPCMPEQD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18140, 225},
+ {I_VPCMPEQD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18148, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPEQQ[] = {
+ {I_VPCMPEQQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29730, 184},
+ {I_VPCMPEQQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29737, 184},
+ {I_VPCMPEQQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32880, 203},
+ {I_VPCMPEQQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32887, 203},
+ {I_VPCMPEQQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18156, 225},
+ {I_VPCMPEQQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18164, 225},
+ {I_VPCMPEQQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18172, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPGTB[] = {
+ {I_VPCMPGTB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29744, 184},
+ {I_VPCMPGTB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29751, 184},
+ {I_VPCMPGTB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32894, 203},
+ {I_VPCMPGTB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32901, 203},
+ {I_VPCMPGTB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18204, 229},
+ {I_VPCMPGTB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18212, 229},
+ {I_VPCMPGTB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18220, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPGTW[] = {
+ {I_VPCMPGTW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29758, 184},
+ {I_VPCMPGTW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29765, 184},
+ {I_VPCMPGTW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32908, 203},
+ {I_VPCMPGTW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32915, 203},
+ {I_VPCMPGTW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18276, 229},
+ {I_VPCMPGTW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18284, 229},
+ {I_VPCMPGTW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18292, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPGTD[] = {
+ {I_VPCMPGTD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29772, 184},
+ {I_VPCMPGTD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29779, 184},
+ {I_VPCMPGTD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32922, 203},
+ {I_VPCMPGTD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32929, 203},
+ {I_VPCMPGTD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18228, 225},
+ {I_VPCMPGTD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18236, 225},
+ {I_VPCMPGTD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18244, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPGTQ[] = {
+ {I_VPCMPGTQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29786, 184},
+ {I_VPCMPGTQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29793, 184},
+ {I_VPCMPGTQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32936, 203},
+ {I_VPCMPGTQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32943, 203},
+ {I_VPCMPGTQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18252, 225},
+ {I_VPCMPGTQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18260, 225},
+ {I_VPCMPGTQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18268, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMILPD[] = {
+ {I_VPERMILPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29800, 184},
+ {I_VPERMILPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29807, 184},
+ {I_VPERMILPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29814, 184},
+ {I_VPERMILPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29821, 184},
+ {I_VPERMILPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9756, 184},
+ {I_VPERMILPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9764, 184},
+ {I_VPERMILPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5460, 225},
+ {I_VPERMILPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5469, 225},
+ {I_VPERMILPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5478, 226},
+ {I_VPERMILPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18668, 225},
+ {I_VPERMILPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18676, 225},
+ {I_VPERMILPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18684, 225},
+ {I_VPERMILPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18692, 225},
+ {I_VPERMILPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18700, 226},
+ {I_VPERMILPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18708, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMILPS[] = {
+ {I_VPERMILPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29828, 184},
+ {I_VPERMILPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29835, 184},
+ {I_VPERMILPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29842, 184},
+ {I_VPERMILPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29849, 184},
+ {I_VPERMILPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9772, 184},
+ {I_VPERMILPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9780, 184},
+ {I_VPERMILPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5487, 225},
+ {I_VPERMILPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5496, 225},
+ {I_VPERMILPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5505, 226},
+ {I_VPERMILPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18716, 225},
+ {I_VPERMILPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18724, 225},
+ {I_VPERMILPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18732, 225},
+ {I_VPERMILPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18740, 225},
+ {I_VPERMILPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18748, 226},
+ {I_VPERMILPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18756, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERM2F128[] = {
+ {I_VPERM2F128, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9788, 184},
+ {I_VPERM2F128, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9796, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXTRB[] = {
+ {I_VPEXTRB, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 190},
+ {I_VPEXTRB, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 184},
+ {I_VPEXTRB, 3, {MEMORY|BITS8,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 184},
+ {I_VPEXTRB, 3, {REG_GPR|BITS8,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ {I_VPEXTRB, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ {I_VPEXTRB, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ {I_VPEXTRB, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ {I_VPEXTRB, 3, {MEMORY|BITS8,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXTRW[] = {
+ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9812, 190},
+ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9812, 184},
+ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 190},
+ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 184},
+ {I_VPEXTRW, 3, {MEMORY|BITS16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 184},
+ {I_VPEXTRW, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ {I_VPEXTRW, 3, {MEMORY|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ {I_VPEXTRW, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXTRD[] = {
+ {I_VPEXTRD, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9828, 190},
+ {I_VPEXTRD, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9828, 184},
+ {I_VPEXTRD, 3, {RM_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5559, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXTRQ[] = {
+ {I_VPEXTRQ, 3, {RM_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9836, 190},
+ {I_VPEXTRQ, 3, {RM_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5568, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDW[] = {
+ {I_VPHADDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29856, 184},
+ {I_VPHADDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29863, 184},
+ {I_VPHADDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32950, 203},
+ {I_VPHADDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32957, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDD[] = {
+ {I_VPHADDD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29870, 184},
+ {I_VPHADDD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29877, 184},
+ {I_VPHADDD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32964, 203},
+ {I_VPHADDD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32971, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDSW[] = {
+ {I_VPHADDSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29884, 184},
+ {I_VPHADDSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29891, 184},
+ {I_VPHADDSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32978, 203},
+ {I_VPHADDSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32985, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHMINPOSUW[] = {
+ {I_VPHMINPOSUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29898, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBW[] = {
+ {I_VPHSUBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29905, 184},
+ {I_VPHSUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29912, 184},
+ {I_VPHSUBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32992, 203},
+ {I_VPHSUBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32999, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBD[] = {
+ {I_VPHSUBD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29919, 184},
+ {I_VPHSUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29926, 184},
+ {I_VPHSUBD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33006, 203},
+ {I_VPHSUBD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33013, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBSW[] = {
+ {I_VPHSUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29933, 184},
+ {I_VPHSUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29940, 184},
+ {I_VPHSUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33020, 203},
+ {I_VPHSUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33027, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPINSRB[] = {
+ {I_VPINSRB, 4, {XMM_L16,XMM_L16,MEMORY|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ {I_VPINSRB, 3, {XMM_L16,MEMORY|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ {I_VPINSRB, 4, {XMM_L16,XMM_L16,RM_GPR|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ {I_VPINSRB, 3, {XMM_L16,RM_GPR|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ {I_VPINSRB, 4, {XMM_L16,XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ {I_VPINSRB, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ {I_VPINSRB, 4, {XMMREG,XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5703, 230},
+ {I_VPINSRB, 3, {XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5712, 230},
+ {I_VPINSRB, 4, {XMMREG,XMMREG,MEMORY|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5703, 230},
+ {I_VPINSRB, 3, {XMMREG,MEMORY|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5712, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPINSRW[] = {
+ {I_VPINSRW, 4, {XMM_L16,XMM_L16,MEMORY|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ {I_VPINSRW, 3, {XMM_L16,MEMORY|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ {I_VPINSRW, 4, {XMM_L16,XMM_L16,RM_GPR|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ {I_VPINSRW, 3, {XMM_L16,RM_GPR|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ {I_VPINSRW, 4, {XMM_L16,XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ {I_VPINSRW, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ {I_VPINSRW, 4, {XMMREG,XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5757, 230},
+ {I_VPINSRW, 3, {XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5766, 230},
+ {I_VPINSRW, 4, {XMMREG,XMMREG,MEMORY|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5757, 230},
+ {I_VPINSRW, 3, {XMMREG,MEMORY|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5766, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPINSRD[] = {
+ {I_VPINSRD, 4, {XMM_L16,XMM_L16,MEMORY|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9876, 184},
+ {I_VPINSRD, 3, {XMM_L16,MEMORY|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9884, 184},
+ {I_VPINSRD, 4, {XMM_L16,XMM_L16,RM_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9876, 184},
+ {I_VPINSRD, 3, {XMM_L16,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9884, 184},
+ {I_VPINSRD, 4, {XMMREG,XMMREG,RM_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5721, 228},
+ {I_VPINSRD, 3, {XMMREG,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5730, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPINSRQ[] = {
+ {I_VPINSRQ, 4, {XMM_L16,XMM_L16,MEMORY|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9892, 190},
+ {I_VPINSRQ, 3, {XMM_L16,MEMORY|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9900, 190},
+ {I_VPINSRQ, 4, {XMM_L16,XMM_L16,RM_GPR|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9892, 190},
+ {I_VPINSRQ, 3, {XMM_L16,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9900, 190},
+ {I_VPINSRQ, 4, {XMMREG,XMMREG,RM_GPR|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5739, 228},
+ {I_VPINSRQ, 3, {XMMREG,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5748, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADDWD[] = {
+ {I_VPMADDWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29947, 184},
+ {I_VPMADDWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29954, 184},
+ {I_VPMADDWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33048, 203},
+ {I_VPMADDWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33055, 203},
+ {I_VPMADDWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19244, 229},
+ {I_VPMADDWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19252, 229},
+ {I_VPMADDWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19260, 229},
+ {I_VPMADDWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19268, 229},
+ {I_VPMADDWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19276, 230},
+ {I_VPMADDWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19284, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADDUBSW[] = {
+ {I_VPMADDUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29961, 184},
+ {I_VPMADDUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29968, 184},
+ {I_VPMADDUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33034, 203},
+ {I_VPMADDUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33041, 203},
+ {I_VPMADDUBSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19196, 229},
+ {I_VPMADDUBSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19204, 229},
+ {I_VPMADDUBSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19212, 229},
+ {I_VPMADDUBSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19220, 229},
+ {I_VPMADDUBSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19228, 230},
+ {I_VPMADDUBSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19236, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXSB[] = {
+ {I_VPMAXSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29975, 184},
+ {I_VPMAXSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29982, 184},
+ {I_VPMAXSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33062, 203},
+ {I_VPMAXSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33069, 203},
+ {I_VPMAXSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19292, 229},
+ {I_VPMAXSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19300, 229},
+ {I_VPMAXSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19308, 229},
+ {I_VPMAXSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19316, 229},
+ {I_VPMAXSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19324, 230},
+ {I_VPMAXSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19332, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXSW[] = {
+ {I_VPMAXSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29989, 184},
+ {I_VPMAXSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29996, 184},
+ {I_VPMAXSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33076, 203},
+ {I_VPMAXSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33083, 203},
+ {I_VPMAXSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19436, 229},
+ {I_VPMAXSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19444, 229},
+ {I_VPMAXSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19452, 229},
+ {I_VPMAXSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19460, 229},
+ {I_VPMAXSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19468, 230},
+ {I_VPMAXSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19476, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXSD[] = {
+ {I_VPMAXSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30003, 184},
+ {I_VPMAXSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30010, 184},
+ {I_VPMAXSD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33090, 203},
+ {I_VPMAXSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33097, 203},
+ {I_VPMAXSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19340, 225},
+ {I_VPMAXSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19348, 225},
+ {I_VPMAXSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19356, 225},
+ {I_VPMAXSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19364, 225},
+ {I_VPMAXSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19372, 226},
+ {I_VPMAXSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19380, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXUB[] = {
+ {I_VPMAXUB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30017, 184},
+ {I_VPMAXUB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30024, 184},
+ {I_VPMAXUB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33104, 203},
+ {I_VPMAXUB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33111, 203},
+ {I_VPMAXUB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19484, 229},
+ {I_VPMAXUB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19492, 229},
+ {I_VPMAXUB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19500, 229},
+ {I_VPMAXUB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19508, 229},
+ {I_VPMAXUB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19516, 230},
+ {I_VPMAXUB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19524, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXUW[] = {
+ {I_VPMAXUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30031, 184},
+ {I_VPMAXUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30038, 184},
+ {I_VPMAXUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33118, 203},
+ {I_VPMAXUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33125, 203},
+ {I_VPMAXUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19628, 229},
+ {I_VPMAXUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19636, 229},
+ {I_VPMAXUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19644, 229},
+ {I_VPMAXUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19652, 229},
+ {I_VPMAXUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19660, 230},
+ {I_VPMAXUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19668, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXUD[] = {
+ {I_VPMAXUD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30045, 184},
+ {I_VPMAXUD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30052, 184},
+ {I_VPMAXUD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33132, 203},
+ {I_VPMAXUD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33139, 203},
+ {I_VPMAXUD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19532, 225},
+ {I_VPMAXUD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19540, 225},
+ {I_VPMAXUD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19548, 225},
+ {I_VPMAXUD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19556, 225},
+ {I_VPMAXUD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19564, 226},
+ {I_VPMAXUD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19572, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINSB[] = {
+ {I_VPMINSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30059, 184},
+ {I_VPMINSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30066, 184},
+ {I_VPMINSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33146, 203},
+ {I_VPMINSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33153, 203},
+ {I_VPMINSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19676, 229},
+ {I_VPMINSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19684, 229},
+ {I_VPMINSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19692, 229},
+ {I_VPMINSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19700, 229},
+ {I_VPMINSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19708, 230},
+ {I_VPMINSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19716, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINSW[] = {
+ {I_VPMINSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30073, 184},
+ {I_VPMINSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30080, 184},
+ {I_VPMINSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33160, 203},
+ {I_VPMINSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33167, 203},
+ {I_VPMINSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19820, 229},
+ {I_VPMINSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19828, 229},
+ {I_VPMINSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19836, 229},
+ {I_VPMINSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19844, 229},
+ {I_VPMINSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19852, 230},
+ {I_VPMINSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19860, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINSD[] = {
+ {I_VPMINSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30087, 184},
+ {I_VPMINSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30094, 184},
+ {I_VPMINSD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33174, 203},
+ {I_VPMINSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33181, 203},
+ {I_VPMINSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19724, 225},
+ {I_VPMINSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19732, 225},
+ {I_VPMINSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19740, 225},
+ {I_VPMINSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19748, 225},
+ {I_VPMINSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19756, 226},
+ {I_VPMINSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19764, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINUB[] = {
+ {I_VPMINUB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30101, 184},
+ {I_VPMINUB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30108, 184},
+ {I_VPMINUB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33188, 203},
+ {I_VPMINUB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33195, 203},
+ {I_VPMINUB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19868, 229},
+ {I_VPMINUB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19876, 229},
+ {I_VPMINUB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19884, 229},
+ {I_VPMINUB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19892, 229},
+ {I_VPMINUB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19900, 230},
+ {I_VPMINUB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19908, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINUW[] = {
+ {I_VPMINUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30115, 184},
+ {I_VPMINUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30122, 184},
+ {I_VPMINUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33202, 203},
+ {I_VPMINUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33209, 203},
+ {I_VPMINUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20012, 229},
+ {I_VPMINUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20020, 229},
+ {I_VPMINUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20028, 229},
+ {I_VPMINUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20036, 229},
+ {I_VPMINUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20044, 230},
+ {I_VPMINUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20052, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINUD[] = {
+ {I_VPMINUD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30129, 184},
+ {I_VPMINUD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30136, 184},
+ {I_VPMINUD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33216, 203},
+ {I_VPMINUD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33223, 203},
+ {I_VPMINUD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19916, 225},
+ {I_VPMINUD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19924, 225},
+ {I_VPMINUD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19932, 225},
+ {I_VPMINUD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19940, 225},
+ {I_VPMINUD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19948, 226},
+ {I_VPMINUD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19956, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVMSKB[] = {
+ {I_VPMOVMSKB, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30143, 190},
+ {I_VPMOVMSKB, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30143, 184},
+ {I_VPMOVMSKB, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33230, 203},
+ {I_VPMOVMSKB, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33230, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXBW[] = {
+ {I_VPMOVSXBW, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30150, 184},
+ {I_VPMOVSXBW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33237, 203},
+ {I_VPMOVSXBW, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20804, 229},
+ {I_VPMOVSXBW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20812, 229},
+ {I_VPMOVSXBW, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20820, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXBD[] = {
+ {I_VPMOVSXBD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30157, 184},
+ {I_VPMOVSXBD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33244, 203},
+ {I_VPMOVSXBD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33244, 203},
+ {I_VPMOVSXBD, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20756, 225},
+ {I_VPMOVSXBD, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20764, 225},
+ {I_VPMOVSXBD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20772, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXBQ[] = {
+ {I_VPMOVSXBQ, 2, {XMM_L16,RM_XMM_L16|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30164, 184},
+ {I_VPMOVSXBQ, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33251, 203},
+ {I_VPMOVSXBQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33251, 203},
+ {I_VPMOVSXBQ, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20780, 225},
+ {I_VPMOVSXBQ, 2, {YMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20788, 225},
+ {I_VPMOVSXBQ, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20796, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXWD[] = {
+ {I_VPMOVSXWD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30171, 184},
+ {I_VPMOVSXWD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33258, 203},
+ {I_VPMOVSXWD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20852, 225},
+ {I_VPMOVSXWD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20860, 225},
+ {I_VPMOVSXWD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20868, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXWQ[] = {
+ {I_VPMOVSXWQ, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30178, 184},
+ {I_VPMOVSXWQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33265, 203},
+ {I_VPMOVSXWQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33265, 203},
+ {I_VPMOVSXWQ, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20876, 225},
+ {I_VPMOVSXWQ, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20884, 225},
+ {I_VPMOVSXWQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20892, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSXDQ[] = {
+ {I_VPMOVSXDQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30185, 184},
+ {I_VPMOVSXDQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33272, 203},
+ {I_VPMOVSXDQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20828, 225},
+ {I_VPMOVSXDQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20836, 225},
+ {I_VPMOVSXDQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20844, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXBW[] = {
+ {I_VPMOVZXBW, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30192, 184},
+ {I_VPMOVZXBW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33279, 203},
+ {I_VPMOVZXBW, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21308, 229},
+ {I_VPMOVZXBW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21316, 229},
+ {I_VPMOVZXBW, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21324, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXBD[] = {
+ {I_VPMOVZXBD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30199, 184},
+ {I_VPMOVZXBD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33286, 203},
+ {I_VPMOVZXBD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33286, 203},
+ {I_VPMOVZXBD, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21260, 225},
+ {I_VPMOVZXBD, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21268, 225},
+ {I_VPMOVZXBD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21276, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXBQ[] = {
+ {I_VPMOVZXBQ, 2, {XMM_L16,RM_XMM_L16|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30206, 184},
+ {I_VPMOVZXBQ, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33293, 203},
+ {I_VPMOVZXBQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33293, 203},
+ {I_VPMOVZXBQ, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21284, 225},
+ {I_VPMOVZXBQ, 2, {YMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21292, 225},
+ {I_VPMOVZXBQ, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21300, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXWD[] = {
+ {I_VPMOVZXWD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30213, 184},
+ {I_VPMOVZXWD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33300, 203},
+ {I_VPMOVZXWD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21356, 225},
+ {I_VPMOVZXWD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21364, 225},
+ {I_VPMOVZXWD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21372, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXWQ[] = {
+ {I_VPMOVZXWQ, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30220, 184},
+ {I_VPMOVZXWQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33307, 203},
+ {I_VPMOVZXWQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33307, 203},
+ {I_VPMOVZXWQ, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21380, 225},
+ {I_VPMOVZXWQ, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21388, 225},
+ {I_VPMOVZXWQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21396, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVZXDQ[] = {
+ {I_VPMOVZXDQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30227, 184},
+ {I_VPMOVZXDQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33314, 203},
+ {I_VPMOVZXDQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21332, 225},
+ {I_VPMOVZXDQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21340, 225},
+ {I_VPMOVZXDQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21348, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULHUW[] = {
+ {I_VPMULHUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30234, 184},
+ {I_VPMULHUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30241, 184},
+ {I_VPMULHUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33349, 203},
+ {I_VPMULHUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33356, 203},
+ {I_VPMULHUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21500, 229},
+ {I_VPMULHUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21508, 229},
+ {I_VPMULHUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21516, 229},
+ {I_VPMULHUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21524, 229},
+ {I_VPMULHUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21532, 230},
+ {I_VPMULHUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21540, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULHRSW[] = {
+ {I_VPMULHRSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30248, 184},
+ {I_VPMULHRSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30255, 184},
+ {I_VPMULHRSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33335, 203},
+ {I_VPMULHRSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33342, 203},
+ {I_VPMULHRSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21452, 229},
+ {I_VPMULHRSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21460, 229},
+ {I_VPMULHRSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21468, 229},
+ {I_VPMULHRSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21476, 229},
+ {I_VPMULHRSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21484, 230},
+ {I_VPMULHRSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21492, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULHW[] = {
+ {I_VPMULHW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30262, 184},
+ {I_VPMULHW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30269, 184},
+ {I_VPMULHW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33363, 203},
+ {I_VPMULHW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33370, 203},
+ {I_VPMULHW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21548, 229},
+ {I_VPMULHW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21556, 229},
+ {I_VPMULHW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21564, 229},
+ {I_VPMULHW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21572, 229},
+ {I_VPMULHW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21580, 230},
+ {I_VPMULHW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21588, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULLW[] = {
+ {I_VPMULLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30276, 184},
+ {I_VPMULLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30283, 184},
+ {I_VPMULLW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33377, 203},
+ {I_VPMULLW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33384, 203},
+ {I_VPMULLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21692, 229},
+ {I_VPMULLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21700, 229},
+ {I_VPMULLW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21708, 229},
+ {I_VPMULLW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21716, 229},
+ {I_VPMULLW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21724, 230},
+ {I_VPMULLW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21732, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULLD[] = {
+ {I_VPMULLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30290, 184},
+ {I_VPMULLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30297, 184},
+ {I_VPMULLD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33391, 203},
+ {I_VPMULLD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33398, 203},
+ {I_VPMULLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21596, 225},
+ {I_VPMULLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21604, 225},
+ {I_VPMULLD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21612, 225},
+ {I_VPMULLD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21620, 225},
+ {I_VPMULLD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21628, 226},
+ {I_VPMULLD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21636, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULUDQ[] = {
+ {I_VPMULUDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30304, 184},
+ {I_VPMULUDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30311, 184},
+ {I_VPMULUDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33405, 203},
+ {I_VPMULUDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33412, 203},
+ {I_VPMULUDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21788, 225},
+ {I_VPMULUDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21796, 225},
+ {I_VPMULUDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21804, 225},
+ {I_VPMULUDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21812, 225},
+ {I_VPMULUDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21820, 226},
+ {I_VPMULUDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21828, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULDQ[] = {
+ {I_VPMULDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30318, 184},
+ {I_VPMULDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30325, 184},
+ {I_VPMULDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33321, 203},
+ {I_VPMULDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33328, 203},
+ {I_VPMULDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21404, 225},
+ {I_VPMULDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21412, 225},
+ {I_VPMULDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21420, 225},
+ {I_VPMULDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21428, 225},
+ {I_VPMULDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21436, 226},
+ {I_VPMULDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21444, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPOR[] = {
+ {I_VPOR, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30332, 184},
+ {I_VPOR, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30339, 184},
+ {I_VPOR, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33419, 203},
+ {I_VPOR, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33426, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSADBW[] = {
+ {I_VPSADBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30346, 184},
+ {I_VPSADBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30353, 184},
+ {I_VPSADBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33433, 203},
+ {I_VPSADBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33440, 203},
+ {I_VPSADBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+22124, 229},
+ {I_VPSADBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+22132, 229},
+ {I_VPSADBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+22140, 229},
+ {I_VPSADBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+22148, 229},
+ {I_VPSADBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+22156, 230},
+ {I_VPSADBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+22164, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHUFB[] = {
+ {I_VPSHUFB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30360, 184},
+ {I_VPSHUFB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30367, 184},
+ {I_VPSHUFB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33447, 203},
+ {I_VPSHUFB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33454, 203},
+ {I_VPSHUFB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22172, 229},
+ {I_VPSHUFB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22180, 229},
+ {I_VPSHUFB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22188, 229},
+ {I_VPSHUFB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22196, 229},
+ {I_VPSHUFB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22204, 230},
+ {I_VPSHUFB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22212, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHUFD[] = {
+ {I_VPSHUFD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9908, 184},
+ {I_VPSHUFD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11908, 203},
+ {I_VPSHUFD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6099, 225},
+ {I_VPSHUFD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6108, 225},
+ {I_VPSHUFD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6117, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHUFHW[] = {
+ {I_VPSHUFHW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9916, 184},
+ {I_VPSHUFHW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11916, 203},
+ {I_VPSHUFHW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6126, 229},
+ {I_VPSHUFHW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6135, 229},
+ {I_VPSHUFHW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6144, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHUFLW[] = {
+ {I_VPSHUFLW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9924, 184},
+ {I_VPSHUFLW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11924, 203},
+ {I_VPSHUFLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6153, 229},
+ {I_VPSHUFLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6162, 229},
+ {I_VPSHUFLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6171, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSIGNB[] = {
+ {I_VPSIGNB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30374, 184},
+ {I_VPSIGNB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30381, 184},
+ {I_VPSIGNB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33461, 203},
+ {I_VPSIGNB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33468, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSIGNW[] = {
+ {I_VPSIGNW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30388, 184},
+ {I_VPSIGNW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30395, 184},
+ {I_VPSIGNW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33475, 203},
+ {I_VPSIGNW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33482, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSIGND[] = {
+ {I_VPSIGND, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30402, 184},
+ {I_VPSIGND, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30409, 184},
+ {I_VPSIGND, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33489, 203},
+ {I_VPSIGND, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33496, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLDQ[] = {
+ {I_VPSLLDQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9932, 184},
+ {I_VPSLLDQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9940, 184},
+ {I_VPSLLDQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11932, 203},
+ {I_VPSLLDQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11940, 203},
+ {I_VPSLLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6234, 229},
+ {I_VPSLLDQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6243, 229},
+ {I_VPSLLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6252, 229},
+ {I_VPSLLDQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6261, 229},
+ {I_VPSLLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6270, 230},
+ {I_VPSLLDQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6279, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLDQ[] = {
+ {I_VPSRLDQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9948, 184},
+ {I_VPSRLDQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9956, 184},
+ {I_VPSRLDQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12028, 203},
+ {I_VPSRLDQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12036, 203},
+ {I_VPSRLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6612, 229},
+ {I_VPSRLDQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6621, 229},
+ {I_VPSRLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6630, 229},
+ {I_VPSRLDQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6639, 229},
+ {I_VPSRLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6648, 230},
+ {I_VPSRLDQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6657, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLW[] = {
+ {I_VPSLLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30416, 184},
+ {I_VPSLLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30423, 184},
+ {I_VPSLLW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9964, 184},
+ {I_VPSLLW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9972, 184},
+ {I_VPSLLW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33503, 203},
+ {I_VPSLLW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33510, 203},
+ {I_VPSLLW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11948, 203},
+ {I_VPSLLW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11956, 203},
+ {I_VPSLLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22460, 229},
+ {I_VPSLLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22468, 229},
+ {I_VPSLLW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22476, 229},
+ {I_VPSLLW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22484, 229},
+ {I_VPSLLW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22492, 230},
+ {I_VPSLLW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22500, 230},
+ {I_VPSLLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6342, 229},
+ {I_VPSLLW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6351, 229},
+ {I_VPSLLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6360, 229},
+ {I_VPSLLW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6369, 229},
+ {I_VPSLLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6378, 230},
+ {I_VPSLLW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6387, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLD[] = {
+ {I_VPSLLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30430, 184},
+ {I_VPSLLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30437, 184},
+ {I_VPSLLD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9980, 184},
+ {I_VPSLLD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9988, 184},
+ {I_VPSLLD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33517, 203},
+ {I_VPSLLD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33524, 203},
+ {I_VPSLLD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11964, 203},
+ {I_VPSLLD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11972, 203},
+ {I_VPSLLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22220, 225},
+ {I_VPSLLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22228, 225},
+ {I_VPSLLD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22236, 225},
+ {I_VPSLLD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22244, 225},
+ {I_VPSLLD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22252, 226},
+ {I_VPSLLD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22260, 226},
+ {I_VPSLLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6180, 225},
+ {I_VPSLLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6189, 225},
+ {I_VPSLLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6198, 225},
+ {I_VPSLLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6207, 225},
+ {I_VPSLLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6216, 226},
+ {I_VPSLLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6225, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLQ[] = {
+ {I_VPSLLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30444, 184},
+ {I_VPSLLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30451, 184},
+ {I_VPSLLQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9996, 184},
+ {I_VPSLLQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10004, 184},
+ {I_VPSLLQ, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33531, 203},
+ {I_VPSLLQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33538, 203},
+ {I_VPSLLQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11980, 203},
+ {I_VPSLLQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11988, 203},
+ {I_VPSLLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22268, 225},
+ {I_VPSLLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22276, 225},
+ {I_VPSLLQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22284, 225},
+ {I_VPSLLQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22292, 225},
+ {I_VPSLLQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22300, 226},
+ {I_VPSLLQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22308, 226},
+ {I_VPSLLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6288, 225},
+ {I_VPSLLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6297, 225},
+ {I_VPSLLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6306, 225},
+ {I_VPSLLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6315, 225},
+ {I_VPSLLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6324, 226},
+ {I_VPSLLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6333, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAW[] = {
+ {I_VPSRAW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30458, 184},
+ {I_VPSRAW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30465, 184},
+ {I_VPSRAW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10012, 184},
+ {I_VPSRAW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10020, 184},
+ {I_VPSRAW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33545, 203},
+ {I_VPSRAW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33552, 203},
+ {I_VPSRAW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11996, 203},
+ {I_VPSRAW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12004, 203},
+ {I_VPSRAW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22748, 229},
+ {I_VPSRAW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22756, 229},
+ {I_VPSRAW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22764, 229},
+ {I_VPSRAW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22772, 229},
+ {I_VPSRAW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22780, 230},
+ {I_VPSRAW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22788, 230},
+ {I_VPSRAW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6504, 229},
+ {I_VPSRAW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6513, 229},
+ {I_VPSRAW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6522, 229},
+ {I_VPSRAW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6531, 229},
+ {I_VPSRAW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6540, 230},
+ {I_VPSRAW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6549, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAD[] = {
+ {I_VPSRAD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30472, 184},
+ {I_VPSRAD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30479, 184},
+ {I_VPSRAD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10028, 184},
+ {I_VPSRAD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10036, 184},
+ {I_VPSRAD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33559, 203},
+ {I_VPSRAD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33566, 203},
+ {I_VPSRAD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12012, 203},
+ {I_VPSRAD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12020, 203},
+ {I_VPSRAD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22508, 225},
+ {I_VPSRAD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22516, 225},
+ {I_VPSRAD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22524, 225},
+ {I_VPSRAD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22532, 225},
+ {I_VPSRAD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22540, 226},
+ {I_VPSRAD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22548, 226},
+ {I_VPSRAD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6396, 225},
+ {I_VPSRAD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6405, 225},
+ {I_VPSRAD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6414, 225},
+ {I_VPSRAD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6423, 225},
+ {I_VPSRAD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6432, 226},
+ {I_VPSRAD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6441, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLW[] = {
+ {I_VPSRLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30486, 184},
+ {I_VPSRLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30493, 184},
+ {I_VPSRLW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10044, 184},
+ {I_VPSRLW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10052, 184},
+ {I_VPSRLW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33573, 203},
+ {I_VPSRLW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33580, 203},
+ {I_VPSRLW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12044, 203},
+ {I_VPSRLW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12052, 203},
+ {I_VPSRLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23036, 229},
+ {I_VPSRLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23044, 229},
+ {I_VPSRLW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23052, 229},
+ {I_VPSRLW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23060, 229},
+ {I_VPSRLW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23068, 230},
+ {I_VPSRLW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23076, 230},
+ {I_VPSRLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6720, 229},
+ {I_VPSRLW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6729, 229},
+ {I_VPSRLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6738, 229},
+ {I_VPSRLW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6747, 229},
+ {I_VPSRLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6756, 230},
+ {I_VPSRLW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6765, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLD[] = {
+ {I_VPSRLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30500, 184},
+ {I_VPSRLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30507, 184},
+ {I_VPSRLD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10060, 184},
+ {I_VPSRLD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10068, 184},
+ {I_VPSRLD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33587, 203},
+ {I_VPSRLD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33594, 203},
+ {I_VPSRLD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12060, 203},
+ {I_VPSRLD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12068, 203},
+ {I_VPSRLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22796, 225},
+ {I_VPSRLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22804, 225},
+ {I_VPSRLD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22812, 225},
+ {I_VPSRLD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22820, 225},
+ {I_VPSRLD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22828, 226},
+ {I_VPSRLD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22836, 226},
+ {I_VPSRLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6558, 225},
+ {I_VPSRLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6567, 225},
+ {I_VPSRLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6576, 225},
+ {I_VPSRLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6585, 225},
+ {I_VPSRLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6594, 226},
+ {I_VPSRLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6603, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLQ[] = {
+ {I_VPSRLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30514, 184},
+ {I_VPSRLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30521, 184},
+ {I_VPSRLQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10076, 184},
+ {I_VPSRLQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10084, 184},
+ {I_VPSRLQ, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33601, 203},
+ {I_VPSRLQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33608, 203},
+ {I_VPSRLQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12076, 203},
+ {I_VPSRLQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12084, 203},
+ {I_VPSRLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22844, 225},
+ {I_VPSRLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22852, 225},
+ {I_VPSRLQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22860, 225},
+ {I_VPSRLQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22868, 225},
+ {I_VPSRLQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22876, 226},
+ {I_VPSRLQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22884, 226},
+ {I_VPSRLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6666, 225},
+ {I_VPSRLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6675, 225},
+ {I_VPSRLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6684, 225},
+ {I_VPSRLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6693, 225},
+ {I_VPSRLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6702, 226},
+ {I_VPSRLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6711, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTEST[] = {
+ {I_VPTEST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30528, 184},
+ {I_VPTEST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30535, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBB[] = {
+ {I_VPSUBB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30542, 184},
+ {I_VPSUBB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30549, 184},
+ {I_VPSUBB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33615, 203},
+ {I_VPSUBB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33622, 203},
+ {I_VPSUBB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23084, 229},
+ {I_VPSUBB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23092, 229},
+ {I_VPSUBB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23100, 229},
+ {I_VPSUBB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23108, 229},
+ {I_VPSUBB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23116, 230},
+ {I_VPSUBB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23124, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBW[] = {
+ {I_VPSUBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30556, 184},
+ {I_VPSUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30563, 184},
+ {I_VPSUBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33629, 203},
+ {I_VPSUBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33636, 203},
+ {I_VPSUBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23420, 229},
+ {I_VPSUBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23428, 229},
+ {I_VPSUBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23436, 229},
+ {I_VPSUBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23444, 229},
+ {I_VPSUBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23452, 230},
+ {I_VPSUBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23460, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBD[] = {
+ {I_VPSUBD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30570, 184},
+ {I_VPSUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30577, 184},
+ {I_VPSUBD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33643, 203},
+ {I_VPSUBD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33650, 203},
+ {I_VPSUBD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23132, 225},
+ {I_VPSUBD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23140, 225},
+ {I_VPSUBD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23148, 225},
+ {I_VPSUBD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23156, 225},
+ {I_VPSUBD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23164, 226},
+ {I_VPSUBD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23172, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBQ[] = {
+ {I_VPSUBQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30584, 184},
+ {I_VPSUBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30591, 184},
+ {I_VPSUBQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33657, 203},
+ {I_VPSUBQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33664, 203},
+ {I_VPSUBQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23180, 225},
+ {I_VPSUBQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23188, 225},
+ {I_VPSUBQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23196, 225},
+ {I_VPSUBQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23204, 225},
+ {I_VPSUBQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23212, 226},
+ {I_VPSUBQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23220, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBSB[] = {
+ {I_VPSUBSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30598, 184},
+ {I_VPSUBSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30605, 184},
+ {I_VPSUBSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33671, 203},
+ {I_VPSUBSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33678, 203},
+ {I_VPSUBSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23228, 229},
+ {I_VPSUBSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23236, 229},
+ {I_VPSUBSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23244, 229},
+ {I_VPSUBSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23252, 229},
+ {I_VPSUBSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23260, 230},
+ {I_VPSUBSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23268, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBSW[] = {
+ {I_VPSUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30612, 184},
+ {I_VPSUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30619, 184},
+ {I_VPSUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33685, 203},
+ {I_VPSUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33692, 203},
+ {I_VPSUBSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23276, 229},
+ {I_VPSUBSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23284, 229},
+ {I_VPSUBSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23292, 229},
+ {I_VPSUBSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23300, 229},
+ {I_VPSUBSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23308, 230},
+ {I_VPSUBSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23316, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBUSB[] = {
+ {I_VPSUBUSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30626, 184},
+ {I_VPSUBUSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30633, 184},
+ {I_VPSUBUSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33699, 203},
+ {I_VPSUBUSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33706, 203},
+ {I_VPSUBUSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23324, 229},
+ {I_VPSUBUSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23332, 229},
+ {I_VPSUBUSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23340, 229},
+ {I_VPSUBUSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23348, 229},
+ {I_VPSUBUSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23356, 230},
+ {I_VPSUBUSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23364, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSUBUSW[] = {
+ {I_VPSUBUSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30640, 184},
+ {I_VPSUBUSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30647, 184},
+ {I_VPSUBUSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33713, 203},
+ {I_VPSUBUSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33720, 203},
+ {I_VPSUBUSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23372, 229},
+ {I_VPSUBUSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23380, 229},
+ {I_VPSUBUSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23388, 229},
+ {I_VPSUBUSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23396, 229},
+ {I_VPSUBUSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23404, 230},
+ {I_VPSUBUSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23412, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKHBW[] = {
+ {I_VPUNPCKHBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30654, 184},
+ {I_VPUNPCKHBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30661, 184},
+ {I_VPUNPCKHBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33727, 203},
+ {I_VPUNPCKHBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33734, 203},
+ {I_VPUNPCKHBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23660, 229},
+ {I_VPUNPCKHBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23668, 229},
+ {I_VPUNPCKHBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23676, 229},
+ {I_VPUNPCKHBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23684, 229},
+ {I_VPUNPCKHBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23692, 230},
+ {I_VPUNPCKHBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23700, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKHWD[] = {
+ {I_VPUNPCKHWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30668, 184},
+ {I_VPUNPCKHWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30675, 184},
+ {I_VPUNPCKHWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33741, 203},
+ {I_VPUNPCKHWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33748, 203},
+ {I_VPUNPCKHWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23804, 229},
+ {I_VPUNPCKHWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23812, 229},
+ {I_VPUNPCKHWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23820, 229},
+ {I_VPUNPCKHWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23828, 229},
+ {I_VPUNPCKHWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23836, 230},
+ {I_VPUNPCKHWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23844, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKHDQ[] = {
+ {I_VPUNPCKHDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30682, 184},
+ {I_VPUNPCKHDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30689, 184},
+ {I_VPUNPCKHDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33755, 203},
+ {I_VPUNPCKHDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33762, 203},
+ {I_VPUNPCKHDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23708, 225},
+ {I_VPUNPCKHDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23716, 225},
+ {I_VPUNPCKHDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23724, 225},
+ {I_VPUNPCKHDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23732, 225},
+ {I_VPUNPCKHDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23740, 226},
+ {I_VPUNPCKHDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23748, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKHQDQ[] = {
+ {I_VPUNPCKHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30696, 184},
+ {I_VPUNPCKHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30703, 184},
+ {I_VPUNPCKHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33769, 203},
+ {I_VPUNPCKHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33776, 203},
+ {I_VPUNPCKHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23756, 225},
+ {I_VPUNPCKHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23764, 225},
+ {I_VPUNPCKHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23772, 225},
+ {I_VPUNPCKHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23780, 225},
+ {I_VPUNPCKHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23788, 226},
+ {I_VPUNPCKHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23796, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKLBW[] = {
+ {I_VPUNPCKLBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30710, 184},
+ {I_VPUNPCKLBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30717, 184},
+ {I_VPUNPCKLBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33783, 203},
+ {I_VPUNPCKLBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33790, 203},
+ {I_VPUNPCKLBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23852, 229},
+ {I_VPUNPCKLBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23860, 229},
+ {I_VPUNPCKLBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23868, 229},
+ {I_VPUNPCKLBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23876, 229},
+ {I_VPUNPCKLBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23884, 230},
+ {I_VPUNPCKLBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23892, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKLWD[] = {
+ {I_VPUNPCKLWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30724, 184},
+ {I_VPUNPCKLWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30731, 184},
+ {I_VPUNPCKLWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33797, 203},
+ {I_VPUNPCKLWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33804, 203},
+ {I_VPUNPCKLWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23996, 229},
+ {I_VPUNPCKLWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24004, 229},
+ {I_VPUNPCKLWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24012, 229},
+ {I_VPUNPCKLWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24020, 229},
+ {I_VPUNPCKLWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24028, 230},
+ {I_VPUNPCKLWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24036, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKLDQ[] = {
+ {I_VPUNPCKLDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30738, 184},
+ {I_VPUNPCKLDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30745, 184},
+ {I_VPUNPCKLDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33811, 203},
+ {I_VPUNPCKLDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33818, 203},
+ {I_VPUNPCKLDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23900, 225},
+ {I_VPUNPCKLDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23908, 225},
+ {I_VPUNPCKLDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23916, 225},
+ {I_VPUNPCKLDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23924, 225},
+ {I_VPUNPCKLDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23932, 226},
+ {I_VPUNPCKLDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23940, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPUNPCKLQDQ[] = {
+ {I_VPUNPCKLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30752, 184},
+ {I_VPUNPCKLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30759, 184},
+ {I_VPUNPCKLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33825, 203},
+ {I_VPUNPCKLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33832, 203},
+ {I_VPUNPCKLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23948, 225},
+ {I_VPUNPCKLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23956, 225},
+ {I_VPUNPCKLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23964, 225},
+ {I_VPUNPCKLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23972, 225},
+ {I_VPUNPCKLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23980, 226},
+ {I_VPUNPCKLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23988, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPXOR[] = {
+ {I_VPXOR, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30766, 184},
+ {I_VPXOR, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30773, 184},
+ {I_VPXOR, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33839, 203},
+ {I_VPXOR, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33846, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCPPS[] = {
+ {I_VRCPPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30780, 184},
+ {I_VRCPPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30787, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCPSS[] = {
+ {I_VRCPSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30794, 184},
+ {I_VRCPSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30801, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRTPS[] = {
+ {I_VRSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30808, 184},
+ {I_VRSQRTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30815, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRTSS[] = {
+ {I_VRSQRTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30822, 184},
+ {I_VRSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30829, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VROUNDPD[] = {
+ {I_VROUNDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10092, 184},
+ {I_VROUNDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10100, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VROUNDPS[] = {
+ {I_VROUNDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10108, 184},
+ {I_VROUNDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10116, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VROUNDSD[] = {
+ {I_VROUNDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10124, 184},
+ {I_VROUNDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10132, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VROUNDSS[] = {
+ {I_VROUNDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10140, 184},
+ {I_VROUNDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10148, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFPD[] = {
+ {I_VSHUFPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10156, 184},
+ {I_VSHUFPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10164, 184},
+ {I_VSHUFPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10172, 184},
+ {I_VSHUFPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10180, 184},
+ {I_VSHUFPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7476, 225},
+ {I_VSHUFPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7485, 225},
+ {I_VSHUFPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7494, 225},
+ {I_VSHUFPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7503, 225},
+ {I_VSHUFPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7512, 226},
+ {I_VSHUFPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7521, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFPS[] = {
+ {I_VSHUFPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10188, 184},
+ {I_VSHUFPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10196, 184},
+ {I_VSHUFPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10204, 184},
+ {I_VSHUFPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10212, 184},
+ {I_VSHUFPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7530, 225},
+ {I_VSHUFPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7539, 225},
+ {I_VSHUFPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7548, 225},
+ {I_VSHUFPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7557, 225},
+ {I_VSHUFPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7566, 226},
+ {I_VSHUFPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7575, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSQRTPD[] = {
+ {I_VSQRTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30836, 184},
+ {I_VSQRTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30843, 184},
+ {I_VSQRTPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24524, 225},
+ {I_VSQRTPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24532, 225},
+ {I_VSQRTPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24540, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSQRTPS[] = {
+ {I_VSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30850, 184},
+ {I_VSQRTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30857, 184},
+ {I_VSQRTPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24548, 225},
+ {I_VSQRTPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24556, 225},
+ {I_VSQRTPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24564, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSQRTSD[] = {
+ {I_VSQRTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+30864, 184},
+ {I_VSQRTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30871, 184},
+ {I_VSQRTSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24572, 226},
+ {I_VSQRTSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24580, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSQRTSS[] = {
+ {I_VSQRTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30878, 184},
+ {I_VSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30885, 184},
+ {I_VSQRTSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24588, 226},
+ {I_VSQRTSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24596, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSTMXCSR[] = {
+ {I_VSTMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+30892, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSUBPD[] = {
+ {I_VSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30899, 184},
+ {I_VSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30906, 184},
+ {I_VSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+30913, 184},
+ {I_VSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30920, 184},
+ {I_VSUBPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24604, 225},
+ {I_VSUBPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24612, 225},
+ {I_VSUBPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24620, 225},
+ {I_VSUBPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24628, 225},
+ {I_VSUBPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+24636, 226},
+ {I_VSUBPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24644, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSUBPS[] = {
+ {I_VSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30927, 184},
+ {I_VSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30934, 184},
+ {I_VSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+30941, 184},
+ {I_VSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30948, 184},
+ {I_VSUBPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24652, 225},
+ {I_VSUBPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24660, 225},
+ {I_VSUBPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24668, 225},
+ {I_VSUBPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24676, 225},
+ {I_VSUBPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+24684, 226},
+ {I_VSUBPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24692, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSUBSD[] = {
+ {I_VSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+30955, 184},
+ {I_VSUBSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30962, 184},
+ {I_VSUBSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24700, 226},
+ {I_VSUBSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24708, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSUBSS[] = {
+ {I_VSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30969, 184},
+ {I_VSUBSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30976, 184},
+ {I_VSUBSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24716, 226},
+ {I_VSUBSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24724, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VTESTPS[] = {
+ {I_VTESTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30983, 184},
+ {I_VTESTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30990, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VTESTPD[] = {
+ {I_VTESTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30997, 184},
+ {I_VTESTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31004, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUCOMISD[] = {
+ {I_VUCOMISD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+31011, 184},
+ {I_VUCOMISD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+24732, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUCOMISS[] = {
+ {I_VUCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+31018, 184},
+ {I_VUCOMISS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+24740, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUNPCKHPD[] = {
+ {I_VUNPCKHPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31025, 184},
+ {I_VUNPCKHPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31032, 184},
+ {I_VUNPCKHPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31039, 184},
+ {I_VUNPCKHPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31046, 184},
+ {I_VUNPCKHPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24748, 225},
+ {I_VUNPCKHPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24756, 225},
+ {I_VUNPCKHPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24764, 225},
+ {I_VUNPCKHPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24772, 225},
+ {I_VUNPCKHPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24780, 226},
+ {I_VUNPCKHPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24788, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUNPCKHPS[] = {
+ {I_VUNPCKHPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31053, 184},
+ {I_VUNPCKHPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31060, 184},
+ {I_VUNPCKHPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31067, 184},
+ {I_VUNPCKHPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31074, 184},
+ {I_VUNPCKHPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24796, 225},
+ {I_VUNPCKHPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24804, 225},
+ {I_VUNPCKHPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24812, 225},
+ {I_VUNPCKHPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24820, 225},
+ {I_VUNPCKHPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24828, 226},
+ {I_VUNPCKHPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24836, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUNPCKLPD[] = {
+ {I_VUNPCKLPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31081, 184},
+ {I_VUNPCKLPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31088, 184},
+ {I_VUNPCKLPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31095, 184},
+ {I_VUNPCKLPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31102, 184},
+ {I_VUNPCKLPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24844, 225},
+ {I_VUNPCKLPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24852, 225},
+ {I_VUNPCKLPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24860, 225},
+ {I_VUNPCKLPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24868, 225},
+ {I_VUNPCKLPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24876, 226},
+ {I_VUNPCKLPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24884, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VUNPCKLPS[] = {
+ {I_VUNPCKLPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31109, 184},
+ {I_VUNPCKLPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31116, 184},
+ {I_VUNPCKLPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31123, 184},
+ {I_VUNPCKLPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31130, 184},
+ {I_VUNPCKLPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24892, 225},
+ {I_VUNPCKLPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24900, 225},
+ {I_VUNPCKLPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24908, 225},
+ {I_VUNPCKLPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24916, 225},
+ {I_VUNPCKLPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24924, 226},
+ {I_VUNPCKLPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VXORPD[] = {
+ {I_VXORPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31137, 184},
+ {I_VXORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31144, 184},
+ {I_VXORPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31151, 184},
+ {I_VXORPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31158, 184},
+ {I_VXORPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24940, 227},
+ {I_VXORPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24948, 227},
+ {I_VXORPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24956, 227},
+ {I_VXORPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24964, 227},
+ {I_VXORPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24972, 228},
+ {I_VXORPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24980, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VXORPS[] = {
+ {I_VXORPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31165, 184},
+ {I_VXORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31172, 184},
+ {I_VXORPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31179, 184},
+ {I_VXORPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31186, 184},
+ {I_VXORPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24988, 227},
+ {I_VXORPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24996, 227},
+ {I_VXORPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25004, 227},
+ {I_VXORPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25012, 227},
+ {I_VXORPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25020, 228},
+ {I_VXORPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25028, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VZEROALL[] = {
+ {I_VZEROALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37336, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VZEROUPPER[] = {
+ {I_VZEROUPPER, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37342, 184},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCLMULLQLQDQ[] = {
+ {I_PCLMULLQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3768, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCLMULHQLQDQ[] = {
+ {I_PCLMULHQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3777, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCLMULLQHQDQ[] = {
+ {I_PCLMULLQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3786, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCLMULHQHQDQ[] = {
+ {I_PCLMULHQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3795, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCLMULQDQ[] = {
+ {I_PCLMULQDQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10220, 183},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCLMULLQLQDQ[] = {
+ {I_VPCLMULLQLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3804, 184},
+ {I_VPCLMULLQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3813, 184},
+ {I_VPCLMULLQLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3876, 194},
+ {I_VPCLMULLQLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3885, 194},
+ {I_VPCLMULLQLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+0, 195},
+ {I_VPCLMULLQLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+10, 195},
+ {I_VPCLMULLQLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+80, 195},
+ {I_VPCLMULLQLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+90, 195},
+ {I_VPCLMULLQLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+160, 196},
+ {I_VPCLMULLQLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+170, 196},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCLMULHQLQDQ[] = {
+ {I_VPCLMULHQLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3822, 184},
+ {I_VPCLMULHQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3831, 184},
+ {I_VPCLMULHQLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3894, 194},
+ {I_VPCLMULHQLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3903, 194},
+ {I_VPCLMULHQLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+20, 195},
+ {I_VPCLMULHQLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30, 195},
+ {I_VPCLMULHQLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+100, 195},
+ {I_VPCLMULHQLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+110, 195},
+ {I_VPCLMULHQLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+180, 196},
+ {I_VPCLMULHQLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+190, 196},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCLMULLQHQDQ[] = {
+ {I_VPCLMULLQHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3840, 184},
+ {I_VPCLMULLQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3849, 184},
+ {I_VPCLMULLQHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3912, 194},
+ {I_VPCLMULLQHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3921, 194},
+ {I_VPCLMULLQHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+40, 195},
+ {I_VPCLMULLQHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+50, 195},
+ {I_VPCLMULLQHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+120, 195},
+ {I_VPCLMULLQHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+130, 195},
+ {I_VPCLMULLQHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+200, 196},
+ {I_VPCLMULLQHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+210, 196},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCLMULHQHQDQ[] = {
+ {I_VPCLMULHQHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3858, 184},
+ {I_VPCLMULHQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3867, 184},
+ {I_VPCLMULHQHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3930, 194},
+ {I_VPCLMULHQHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3939, 194},
+ {I_VPCLMULHQHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+60, 195},
+ {I_VPCLMULHQHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+70, 195},
+ {I_VPCLMULHQHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+140, 195},
+ {I_VPCLMULHQHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+150, 195},
+ {I_VPCLMULHQHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+220, 196},
+ {I_VPCLMULHQHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+230, 196},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCLMULQDQ[] = {
+ {I_VPCLMULQDQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10228, 184},
+ {I_VPCLMULQDQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10236, 184},
+ {I_VPCLMULQDQ, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10244, 194},
+ {I_VPCLMULQDQ, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10252, 194},
+ {I_VPCLMULQDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3948, 195},
+ {I_VPCLMULQDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3957, 195},
+ {I_VPCLMULQDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3966, 195},
+ {I_VPCLMULQDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3975, 195},
+ {I_VPCLMULQDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3984, 196},
+ {I_VPCLMULQDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3993, 196},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD132PS[] = {
+ {I_VFMADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31193, 197},
+ {I_VFMADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31200, 197},
+ {I_VFMADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14172, 225},
+ {I_VFMADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14180, 225},
+ {I_VFMADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14188, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD132PD[] = {
+ {I_VFMADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31207, 197},
+ {I_VFMADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31214, 197},
+ {I_VFMADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14148, 225},
+ {I_VFMADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14156, 225},
+ {I_VFMADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14164, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD312PS[] = {
+ {I_VFMADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31193, 197},
+ {I_VFMADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31200, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD312PD[] = {
+ {I_VFMADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31207, 197},
+ {I_VFMADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31214, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD213PS[] = {
+ {I_VFMADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31221, 197},
+ {I_VFMADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31228, 197},
+ {I_VFMADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14236, 225},
+ {I_VFMADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14244, 225},
+ {I_VFMADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14252, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD213PD[] = {
+ {I_VFMADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31235, 197},
+ {I_VFMADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31242, 197},
+ {I_VFMADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14212, 225},
+ {I_VFMADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14220, 225},
+ {I_VFMADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14228, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD123PS[] = {
+ {I_VFMADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31221, 197},
+ {I_VFMADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31228, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD123PD[] = {
+ {I_VFMADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31235, 197},
+ {I_VFMADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31242, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD231PS[] = {
+ {I_VFMADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31249, 197},
+ {I_VFMADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31256, 197},
+ {I_VFMADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14300, 225},
+ {I_VFMADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14308, 225},
+ {I_VFMADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14316, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD231PD[] = {
+ {I_VFMADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31263, 197},
+ {I_VFMADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31270, 197},
+ {I_VFMADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14276, 225},
+ {I_VFMADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14284, 225},
+ {I_VFMADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14292, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD321PS[] = {
+ {I_VFMADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31249, 197},
+ {I_VFMADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31256, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD321PD[] = {
+ {I_VFMADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31263, 197},
+ {I_VFMADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31270, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB132PS[] = {
+ {I_VFMADDSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31277, 197},
+ {I_VFMADDSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31284, 197},
+ {I_VFMADDSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14364, 225},
+ {I_VFMADDSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14372, 225},
+ {I_VFMADDSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14380, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB132PD[] = {
+ {I_VFMADDSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31291, 197},
+ {I_VFMADDSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31298, 197},
+ {I_VFMADDSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14340, 225},
+ {I_VFMADDSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14348, 225},
+ {I_VFMADDSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14356, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB312PS[] = {
+ {I_VFMADDSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31277, 197},
+ {I_VFMADDSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31284, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB312PD[] = {
+ {I_VFMADDSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31291, 197},
+ {I_VFMADDSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31298, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB213PS[] = {
+ {I_VFMADDSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31305, 197},
+ {I_VFMADDSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31312, 197},
+ {I_VFMADDSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14412, 225},
+ {I_VFMADDSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14420, 225},
+ {I_VFMADDSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14428, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB213PD[] = {
+ {I_VFMADDSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31319, 197},
+ {I_VFMADDSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31326, 197},
+ {I_VFMADDSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14388, 225},
+ {I_VFMADDSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14396, 225},
+ {I_VFMADDSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14404, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB123PS[] = {
+ {I_VFMADDSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31305, 197},
+ {I_VFMADDSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31312, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB123PD[] = {
+ {I_VFMADDSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31319, 197},
+ {I_VFMADDSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31326, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB231PS[] = {
+ {I_VFMADDSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31333, 197},
+ {I_VFMADDSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31340, 197},
+ {I_VFMADDSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14460, 225},
+ {I_VFMADDSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14468, 225},
+ {I_VFMADDSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14476, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB231PD[] = {
+ {I_VFMADDSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31347, 197},
+ {I_VFMADDSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31354, 197},
+ {I_VFMADDSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14436, 225},
+ {I_VFMADDSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14444, 225},
+ {I_VFMADDSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14452, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB321PS[] = {
+ {I_VFMADDSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31333, 197},
+ {I_VFMADDSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31340, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUB321PD[] = {
+ {I_VFMADDSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31347, 197},
+ {I_VFMADDSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31354, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB132PS[] = {
+ {I_VFMSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31361, 197},
+ {I_VFMSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31368, 197},
+ {I_VFMSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14508, 225},
+ {I_VFMSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14516, 225},
+ {I_VFMSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14524, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB132PD[] = {
+ {I_VFMSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31375, 197},
+ {I_VFMSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31382, 197},
+ {I_VFMSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14484, 225},
+ {I_VFMSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14492, 225},
+ {I_VFMSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14500, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB312PS[] = {
+ {I_VFMSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31361, 197},
+ {I_VFMSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31368, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB312PD[] = {
+ {I_VFMSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31375, 197},
+ {I_VFMSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31382, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB213PS[] = {
+ {I_VFMSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31389, 197},
+ {I_VFMSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31396, 197},
+ {I_VFMSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14572, 225},
+ {I_VFMSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14580, 225},
+ {I_VFMSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14588, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB213PD[] = {
+ {I_VFMSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31403, 197},
+ {I_VFMSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31410, 197},
+ {I_VFMSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14548, 225},
+ {I_VFMSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14556, 225},
+ {I_VFMSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14564, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB123PS[] = {
+ {I_VFMSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31389, 197},
+ {I_VFMSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31396, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB123PD[] = {
+ {I_VFMSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31403, 197},
+ {I_VFMSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31410, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB231PS[] = {
+ {I_VFMSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31417, 197},
+ {I_VFMSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31424, 197},
+ {I_VFMSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14636, 225},
+ {I_VFMSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14644, 225},
+ {I_VFMSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14652, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB231PD[] = {
+ {I_VFMSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31431, 197},
+ {I_VFMSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31438, 197},
+ {I_VFMSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14612, 225},
+ {I_VFMSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14620, 225},
+ {I_VFMSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14628, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB321PS[] = {
+ {I_VFMSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31417, 197},
+ {I_VFMSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31424, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB321PD[] = {
+ {I_VFMSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31431, 197},
+ {I_VFMSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31438, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD132PS[] = {
+ {I_VFMSUBADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31445, 197},
+ {I_VFMSUBADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31452, 197},
+ {I_VFMSUBADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14700, 225},
+ {I_VFMSUBADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14708, 225},
+ {I_VFMSUBADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14716, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD132PD[] = {
+ {I_VFMSUBADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31459, 197},
+ {I_VFMSUBADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31466, 197},
+ {I_VFMSUBADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14676, 225},
+ {I_VFMSUBADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14684, 225},
+ {I_VFMSUBADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14692, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD312PS[] = {
+ {I_VFMSUBADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31445, 197},
+ {I_VFMSUBADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31452, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD312PD[] = {
+ {I_VFMSUBADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31459, 197},
+ {I_VFMSUBADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31466, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD213PS[] = {
+ {I_VFMSUBADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31473, 197},
+ {I_VFMSUBADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31480, 197},
+ {I_VFMSUBADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14748, 225},
+ {I_VFMSUBADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14756, 225},
+ {I_VFMSUBADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14764, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD213PD[] = {
+ {I_VFMSUBADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31487, 197},
+ {I_VFMSUBADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31494, 197},
+ {I_VFMSUBADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14724, 225},
+ {I_VFMSUBADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14732, 225},
+ {I_VFMSUBADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14740, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD123PS[] = {
+ {I_VFMSUBADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31473, 197},
+ {I_VFMSUBADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31480, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD123PD[] = {
+ {I_VFMSUBADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31487, 197},
+ {I_VFMSUBADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31494, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD231PS[] = {
+ {I_VFMSUBADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31501, 197},
+ {I_VFMSUBADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31508, 197},
+ {I_VFMSUBADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14796, 225},
+ {I_VFMSUBADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14804, 225},
+ {I_VFMSUBADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14812, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD231PD[] = {
+ {I_VFMSUBADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31515, 197},
+ {I_VFMSUBADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31522, 197},
+ {I_VFMSUBADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14772, 225},
+ {I_VFMSUBADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14780, 225},
+ {I_VFMSUBADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14788, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD321PS[] = {
+ {I_VFMSUBADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31501, 197},
+ {I_VFMSUBADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31508, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADD321PD[] = {
+ {I_VFMSUBADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31515, 197},
+ {I_VFMSUBADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31522, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD132PS[] = {
+ {I_VFNMADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31529, 197},
+ {I_VFNMADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31536, 197},
+ {I_VFNMADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14844, 225},
+ {I_VFNMADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14852, 225},
+ {I_VFNMADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14860, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD132PD[] = {
+ {I_VFNMADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31543, 197},
+ {I_VFNMADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31550, 197},
+ {I_VFNMADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14820, 225},
+ {I_VFNMADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14828, 225},
+ {I_VFNMADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14836, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD312PS[] = {
+ {I_VFNMADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31529, 197},
+ {I_VFNMADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31536, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD312PD[] = {
+ {I_VFNMADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31543, 197},
+ {I_VFNMADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31550, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD213PS[] = {
+ {I_VFNMADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31557, 197},
+ {I_VFNMADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31564, 197},
+ {I_VFNMADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14908, 225},
+ {I_VFNMADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14916, 225},
+ {I_VFNMADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14924, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD213PD[] = {
+ {I_VFNMADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31571, 197},
+ {I_VFNMADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31578, 197},
+ {I_VFNMADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14884, 225},
+ {I_VFNMADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14892, 225},
+ {I_VFNMADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14900, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD123PS[] = {
+ {I_VFNMADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31557, 197},
+ {I_VFNMADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31564, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD123PD[] = {
+ {I_VFNMADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31571, 197},
+ {I_VFNMADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31578, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD231PS[] = {
+ {I_VFNMADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31585, 197},
+ {I_VFNMADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31592, 197},
+ {I_VFNMADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14972, 225},
+ {I_VFNMADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14980, 225},
+ {I_VFNMADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14988, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD231PD[] = {
+ {I_VFNMADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31599, 197},
+ {I_VFNMADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31606, 197},
+ {I_VFNMADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14948, 225},
+ {I_VFNMADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14956, 225},
+ {I_VFNMADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14964, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD321PS[] = {
+ {I_VFNMADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31585, 197},
+ {I_VFNMADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31592, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD321PD[] = {
+ {I_VFNMADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31599, 197},
+ {I_VFNMADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31606, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB132PS[] = {
+ {I_VFNMSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31613, 197},
+ {I_VFNMSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31620, 197},
+ {I_VFNMSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15036, 225},
+ {I_VFNMSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15044, 225},
+ {I_VFNMSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15052, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB132PD[] = {
+ {I_VFNMSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31627, 197},
+ {I_VFNMSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31634, 197},
+ {I_VFNMSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15012, 225},
+ {I_VFNMSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15020, 225},
+ {I_VFNMSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15028, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB312PS[] = {
+ {I_VFNMSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31613, 197},
+ {I_VFNMSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31620, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB312PD[] = {
+ {I_VFNMSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31627, 197},
+ {I_VFNMSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31634, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB213PS[] = {
+ {I_VFNMSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31641, 197},
+ {I_VFNMSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31648, 197},
+ {I_VFNMSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15100, 225},
+ {I_VFNMSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15108, 225},
+ {I_VFNMSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15116, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB213PD[] = {
+ {I_VFNMSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31655, 197},
+ {I_VFNMSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31662, 197},
+ {I_VFNMSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15076, 225},
+ {I_VFNMSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15084, 225},
+ {I_VFNMSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15092, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB123PS[] = {
+ {I_VFNMSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31641, 197},
+ {I_VFNMSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31648, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB123PD[] = {
+ {I_VFNMSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31655, 197},
+ {I_VFNMSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31662, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB231PS[] = {
+ {I_VFNMSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31669, 197},
+ {I_VFNMSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31676, 197},
+ {I_VFNMSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15164, 225},
+ {I_VFNMSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15172, 225},
+ {I_VFNMSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15180, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB231PD[] = {
+ {I_VFNMSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31683, 197},
+ {I_VFNMSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31690, 197},
+ {I_VFNMSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15140, 225},
+ {I_VFNMSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15148, 225},
+ {I_VFNMSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15156, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB321PS[] = {
+ {I_VFNMSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31669, 197},
+ {I_VFNMSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31676, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB321PD[] = {
+ {I_VFNMSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31683, 197},
+ {I_VFNMSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31690, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD132SS[] = {
+ {I_VFMADD132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31697, 197},
+ {I_VFMADD132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14204, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD132SD[] = {
+ {I_VFMADD132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31704, 197},
+ {I_VFMADD132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14196, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD312SS[] = {
+ {I_VFMADD312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31697, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD312SD[] = {
+ {I_VFMADD312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31704, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD213SS[] = {
+ {I_VFMADD213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31711, 197},
+ {I_VFMADD213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14268, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD213SD[] = {
+ {I_VFMADD213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31718, 197},
+ {I_VFMADD213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14260, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD123SS[] = {
+ {I_VFMADD123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31711, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD123SD[] = {
+ {I_VFMADD123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31718, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD231SS[] = {
+ {I_VFMADD231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31725, 197},
+ {I_VFMADD231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14332, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD231SD[] = {
+ {I_VFMADD231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31732, 197},
+ {I_VFMADD231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14324, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD321SS[] = {
+ {I_VFMADD321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31725, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADD321SD[] = {
+ {I_VFMADD321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31732, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB132SS[] = {
+ {I_VFMSUB132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31739, 197},
+ {I_VFMSUB132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14540, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB132SD[] = {
+ {I_VFMSUB132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31746, 197},
+ {I_VFMSUB132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14532, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB312SS[] = {
+ {I_VFMSUB312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31739, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB312SD[] = {
+ {I_VFMSUB312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31746, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB213SS[] = {
+ {I_VFMSUB213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31753, 197},
+ {I_VFMSUB213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14604, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB213SD[] = {
+ {I_VFMSUB213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31760, 197},
+ {I_VFMSUB213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14596, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB123SS[] = {
+ {I_VFMSUB123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31753, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB123SD[] = {
+ {I_VFMSUB123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31760, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB231SS[] = {
+ {I_VFMSUB231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31767, 197},
+ {I_VFMSUB231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14668, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB231SD[] = {
+ {I_VFMSUB231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31774, 197},
+ {I_VFMSUB231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14660, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB321SS[] = {
+ {I_VFMSUB321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31767, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUB321SD[] = {
+ {I_VFMSUB321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31774, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD132SS[] = {
+ {I_VFNMADD132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31781, 197},
+ {I_VFNMADD132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14876, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD132SD[] = {
+ {I_VFNMADD132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31788, 197},
+ {I_VFNMADD132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14868, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD312SS[] = {
+ {I_VFNMADD312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31781, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD312SD[] = {
+ {I_VFNMADD312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31788, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD213SS[] = {
+ {I_VFNMADD213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31795, 197},
+ {I_VFNMADD213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14940, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD213SD[] = {
+ {I_VFNMADD213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31802, 197},
+ {I_VFNMADD213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD123SS[] = {
+ {I_VFNMADD123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31795, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD123SD[] = {
+ {I_VFNMADD123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31802, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD231SS[] = {
+ {I_VFNMADD231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31809, 197},
+ {I_VFNMADD231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15004, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD231SD[] = {
+ {I_VFNMADD231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31816, 197},
+ {I_VFNMADD231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14996, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD321SS[] = {
+ {I_VFNMADD321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31809, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADD321SD[] = {
+ {I_VFNMADD321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31816, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB132SS[] = {
+ {I_VFNMSUB132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31823, 197},
+ {I_VFNMSUB132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15068, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB132SD[] = {
+ {I_VFNMSUB132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31830, 197},
+ {I_VFNMSUB132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15060, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB312SS[] = {
+ {I_VFNMSUB312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31823, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB312SD[] = {
+ {I_VFNMSUB312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31830, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB213SS[] = {
+ {I_VFNMSUB213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31837, 197},
+ {I_VFNMSUB213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15132, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB213SD[] = {
+ {I_VFNMSUB213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31844, 197},
+ {I_VFNMSUB213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15124, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB123SS[] = {
+ {I_VFNMSUB123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31837, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB123SD[] = {
+ {I_VFNMSUB123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31844, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB231SS[] = {
+ {I_VFNMSUB231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31851, 197},
+ {I_VFNMSUB231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15196, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB231SD[] = {
+ {I_VFNMSUB231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31858, 197},
+ {I_VFNMSUB231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15188, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB321SS[] = {
+ {I_VFNMSUB321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31851, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUB321SD[] = {
+ {I_VFNMSUB321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31858, 197},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDFSBASE[] = {
+ {I_RDFSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31865, 134},
+ {I_RDFSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31872, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDGSBASE[] = {
+ {I_RDGSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31879, 134},
+ {I_RDGSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31886, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDRAND[] = {
+ {I_RDRAND, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37348, 133},
+ {I_RDRAND, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37354, 133},
+ {I_RDRAND, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37360, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WRFSBASE[] = {
+ {I_WRFSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31893, 134},
+ {I_WRFSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31900, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WRGSBASE[] = {
+ {I_WRGSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31907, 134},
+ {I_WRGSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31914, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPH2PS[] = {
+ {I_VCVTPH2PS, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31921, 198},
+ {I_VCVTPH2PS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+31928, 198},
+ {I_VCVTPH2PS, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13268, 225},
+ {I_VCVTPH2PS, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13276, 225},
+ {I_VCVTPH2PS, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+13284, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2PH[] = {
+ {I_VCVTPS2PH, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10260, 198},
+ {I_VCVTPS2PH, 3, {RM_XMM_L16|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10268, 198},
+ {I_VCVTPS2PH, 3, {XMMREG,XMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4182, 225},
+ {I_VCVTPS2PH, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4191, 225},
+ {I_VCVTPS2PH, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4200, 226},
+ {I_VCVTPS2PH, 3, {MEMORY|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4182, 225},
+ {I_VCVTPS2PH, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4191, 225},
+ {I_VCVTPS2PH, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,SAE,0,0,0}, nasm_bytecodes+4200, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADCX[] = {
+ {I_ADCX, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+10276, 133},
+ {I_ADCX, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+10284, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ADOX[] = {
+ {I_ADOX, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+10292, 133},
+ {I_ADOX, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+10300, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDSEED[] = {
+ {I_RDSEED, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37366, 133},
+ {I_RDSEED, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37372, 133},
+ {I_RDSEED, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37378, 134},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLAC[] = {
+ {I_CLAC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40471, 199},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_STAC[] = {
+ {I_STAC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40476, 199},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSTORE[] = {
+ {I_XSTORE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40481, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCRYPTECB[] = {
+ {I_XCRYPTECB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37384, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCRYPTCBC[] = {
+ {I_XCRYPTCBC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37390, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCRYPTCTR[] = {
+ {I_XCRYPTCTR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37396, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCRYPTCFB[] = {
+ {I_XCRYPTCFB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37402, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XCRYPTOFB[] = {
+ {I_XCRYPTOFB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37408, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MONTMUL[] = {
+ {I_MONTMUL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37414, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSHA1[] = {
+ {I_XSHA1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37420, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XSHA256[] = {
+ {I_XSHA256, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37426, 36},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LLWPCB[] = {
+ {I_LLWPCB, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31935, 200},
+ {I_LLWPCB, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31942, 201},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SLWPCB[] = {
+ {I_SLWPCB, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31949, 200},
+ {I_SLWPCB, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31956, 201},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LWPVAL[] = {
+ {I_LWPVAL, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10308, 200},
+ {I_LWPVAL, 3, {REG_GPR|BITS64,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10316, 201},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_LWPINS[] = {
+ {I_LWPINS, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10324, 200},
+ {I_LWPINS, 3, {REG_GPR|BITS64,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10332, 201},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDPD[] = {
+ {I_VFMADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10340, 202},
+ {I_VFMADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10348, 202},
+ {I_VFMADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10356, 202},
+ {I_VFMADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10364, 202},
+ {I_VFMADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10372, 202},
+ {I_VFMADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10380, 202},
+ {I_VFMADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10388, 202},
+ {I_VFMADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10396, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDPS[] = {
+ {I_VFMADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10404, 202},
+ {I_VFMADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10412, 202},
+ {I_VFMADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10420, 202},
+ {I_VFMADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10428, 202},
+ {I_VFMADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10436, 202},
+ {I_VFMADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10444, 202},
+ {I_VFMADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10452, 202},
+ {I_VFMADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10460, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSD[] = {
+ {I_VFMADDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10468, 202},
+ {I_VFMADDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10476, 202},
+ {I_VFMADDSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+10484, 202},
+ {I_VFMADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+10492, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSS[] = {
+ {I_VFMADDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10500, 202},
+ {I_VFMADDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10508, 202},
+ {I_VFMADDSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+10516, 202},
+ {I_VFMADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10524, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUBPD[] = {
+ {I_VFMADDSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10532, 202},
+ {I_VFMADDSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10540, 202},
+ {I_VFMADDSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10548, 202},
+ {I_VFMADDSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10556, 202},
+ {I_VFMADDSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10564, 202},
+ {I_VFMADDSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10572, 202},
+ {I_VFMADDSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10580, 202},
+ {I_VFMADDSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10588, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMADDSUBPS[] = {
+ {I_VFMADDSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10596, 202},
+ {I_VFMADDSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10604, 202},
+ {I_VFMADDSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10612, 202},
+ {I_VFMADDSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10620, 202},
+ {I_VFMADDSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10628, 202},
+ {I_VFMADDSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10636, 202},
+ {I_VFMADDSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10644, 202},
+ {I_VFMADDSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10652, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADDPD[] = {
+ {I_VFMSUBADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10660, 202},
+ {I_VFMSUBADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10668, 202},
+ {I_VFMSUBADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10676, 202},
+ {I_VFMSUBADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10684, 202},
+ {I_VFMSUBADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10692, 202},
+ {I_VFMSUBADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10700, 202},
+ {I_VFMSUBADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10708, 202},
+ {I_VFMSUBADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10716, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBADDPS[] = {
+ {I_VFMSUBADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10724, 202},
+ {I_VFMSUBADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10732, 202},
+ {I_VFMSUBADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10740, 202},
+ {I_VFMSUBADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10748, 202},
+ {I_VFMSUBADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10756, 202},
+ {I_VFMSUBADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10764, 202},
+ {I_VFMSUBADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10772, 202},
+ {I_VFMSUBADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10780, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBPD[] = {
+ {I_VFMSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10788, 202},
+ {I_VFMSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10796, 202},
+ {I_VFMSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10804, 202},
+ {I_VFMSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10812, 202},
+ {I_VFMSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10820, 202},
+ {I_VFMSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10828, 202},
+ {I_VFMSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10836, 202},
+ {I_VFMSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10844, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBPS[] = {
+ {I_VFMSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10852, 202},
+ {I_VFMSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10860, 202},
+ {I_VFMSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10868, 202},
+ {I_VFMSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10876, 202},
+ {I_VFMSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10884, 202},
+ {I_VFMSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10892, 202},
+ {I_VFMSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10900, 202},
+ {I_VFMSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10908, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBSD[] = {
+ {I_VFMSUBSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10916, 202},
+ {I_VFMSUBSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10924, 202},
+ {I_VFMSUBSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+10932, 202},
+ {I_VFMSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+10940, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFMSUBSS[] = {
+ {I_VFMSUBSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10948, 202},
+ {I_VFMSUBSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10956, 202},
+ {I_VFMSUBSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+10964, 202},
+ {I_VFMSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10972, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADDPD[] = {
+ {I_VFNMADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10980, 202},
+ {I_VFNMADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10988, 202},
+ {I_VFNMADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10996, 202},
+ {I_VFNMADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11004, 202},
+ {I_VFNMADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11012, 202},
+ {I_VFNMADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11020, 202},
+ {I_VFNMADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11028, 202},
+ {I_VFNMADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11036, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADDPS[] = {
+ {I_VFNMADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11044, 202},
+ {I_VFNMADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11052, 202},
+ {I_VFNMADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11060, 202},
+ {I_VFNMADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11068, 202},
+ {I_VFNMADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11076, 202},
+ {I_VFNMADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11084, 202},
+ {I_VFNMADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11092, 202},
+ {I_VFNMADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11100, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADDSD[] = {
+ {I_VFNMADDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11108, 202},
+ {I_VFNMADDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11116, 202},
+ {I_VFNMADDSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+11124, 202},
+ {I_VFNMADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+11132, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMADDSS[] = {
+ {I_VFNMADDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11140, 202},
+ {I_VFNMADDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11148, 202},
+ {I_VFNMADDSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+11156, 202},
+ {I_VFNMADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+11164, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUBPD[] = {
+ {I_VFNMSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11172, 202},
+ {I_VFNMSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11180, 202},
+ {I_VFNMSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11188, 202},
+ {I_VFNMSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11196, 202},
+ {I_VFNMSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11204, 202},
+ {I_VFNMSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11212, 202},
+ {I_VFNMSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11220, 202},
+ {I_VFNMSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11228, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUBPS[] = {
+ {I_VFNMSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11236, 202},
+ {I_VFNMSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11244, 202},
+ {I_VFNMSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11252, 202},
+ {I_VFNMSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11260, 202},
+ {I_VFNMSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11268, 202},
+ {I_VFNMSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11276, 202},
+ {I_VFNMSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11284, 202},
+ {I_VFNMSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11292, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUBSD[] = {
+ {I_VFNMSUBSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11300, 202},
+ {I_VFNMSUBSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11308, 202},
+ {I_VFNMSUBSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+11316, 202},
+ {I_VFNMSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+11324, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFNMSUBSS[] = {
+ {I_VFNMSUBSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11332, 202},
+ {I_VFNMSUBSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11340, 202},
+ {I_VFNMSUBSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+11348, 202},
+ {I_VFNMSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+11356, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFRCZPD[] = {
+ {I_VFRCZPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31963, 202},
+ {I_VFRCZPD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31970, 202},
+ {I_VFRCZPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31977, 202},
+ {I_VFRCZPD, 1, {YMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31984, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFRCZPS[] = {
+ {I_VFRCZPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31991, 202},
+ {I_VFRCZPS, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31998, 202},
+ {I_VFRCZPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32005, 202},
+ {I_VFRCZPS, 1, {YMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32012, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFRCZSD[] = {
+ {I_VFRCZSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+32019, 202},
+ {I_VFRCZSD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32026, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFRCZSS[] = {
+ {I_VFRCZSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+32033, 202},
+ {I_VFRCZSS, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32040, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMOV[] = {
+ {I_VPCMOV, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11364, 202},
+ {I_VPCMOV, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11372, 202},
+ {I_VPCMOV, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11380, 202},
+ {I_VPCMOV, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11388, 202},
+ {I_VPCMOV, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11396, 202},
+ {I_VPCMOV, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11404, 202},
+ {I_VPCMOV, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11412, 202},
+ {I_VPCMOV, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11420, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMB[] = {
+ {I_VPCOMB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11428, 202},
+ {I_VPCOMB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11436, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMD[] = {
+ {I_VPCOMD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11444, 202},
+ {I_VPCOMD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11452, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMQ[] = {
+ {I_VPCOMQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11460, 202},
+ {I_VPCOMQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11468, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMUB[] = {
+ {I_VPCOMUB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11476, 202},
+ {I_VPCOMUB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11484, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMUD[] = {
+ {I_VPCOMUD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11492, 202},
+ {I_VPCOMUD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11500, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMUQ[] = {
+ {I_VPCOMUQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11508, 202},
+ {I_VPCOMUQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11516, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMUW[] = {
+ {I_VPCOMUW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11524, 202},
+ {I_VPCOMUW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11532, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMW[] = {
+ {I_VPCOMW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11540, 202},
+ {I_VPCOMW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11548, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDBD[] = {
+ {I_VPHADDBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32047, 202},
+ {I_VPHADDBD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32054, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDBQ[] = {
+ {I_VPHADDBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32061, 202},
+ {I_VPHADDBQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32068, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDBW[] = {
+ {I_VPHADDBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32075, 202},
+ {I_VPHADDBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32082, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDDQ[] = {
+ {I_VPHADDDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32089, 202},
+ {I_VPHADDDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32096, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUBD[] = {
+ {I_VPHADDUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32103, 202},
+ {I_VPHADDUBD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32110, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUBQ[] = {
+ {I_VPHADDUBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32117, 202},
+ {I_VPHADDUBQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32124, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUBW[] = {
+ {I_VPHADDUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32131, 202},
+ {I_VPHADDUBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32138, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUDQ[] = {
+ {I_VPHADDUDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32145, 202},
+ {I_VPHADDUDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32152, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUWD[] = {
+ {I_VPHADDUWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32159, 202},
+ {I_VPHADDUWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32166, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDUWQ[] = {
+ {I_VPHADDUWQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32173, 202},
+ {I_VPHADDUWQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32180, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDWD[] = {
+ {I_VPHADDWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32187, 202},
+ {I_VPHADDWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32194, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHADDWQ[] = {
+ {I_VPHADDWQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32201, 202},
+ {I_VPHADDWQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32208, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBBW[] = {
+ {I_VPHSUBBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32215, 202},
+ {I_VPHSUBBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32222, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBDQ[] = {
+ {I_VPHSUBDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32229, 202},
+ {I_VPHSUBDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32236, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPHSUBWD[] = {
+ {I_VPHSUBWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32243, 202},
+ {I_VPHSUBWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32250, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSDD[] = {
+ {I_VPMACSDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11556, 202},
+ {I_VPMACSDD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11564, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSDQH[] = {
+ {I_VPMACSDQH, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11572, 202},
+ {I_VPMACSDQH, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11580, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSDQL[] = {
+ {I_VPMACSDQL, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11588, 202},
+ {I_VPMACSDQL, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11596, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSSDD[] = {
+ {I_VPMACSSDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11604, 202},
+ {I_VPMACSSDD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11612, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSSDQH[] = {
+ {I_VPMACSSDQH, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11620, 202},
+ {I_VPMACSSDQH, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11628, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSSDQL[] = {
+ {I_VPMACSSDQL, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11636, 202},
+ {I_VPMACSSDQL, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11644, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSSWD[] = {
+ {I_VPMACSSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11652, 202},
+ {I_VPMACSSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11660, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSSWW[] = {
+ {I_VPMACSSWW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11668, 202},
+ {I_VPMACSSWW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11676, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSWD[] = {
+ {I_VPMACSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11684, 202},
+ {I_VPMACSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11692, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMACSWW[] = {
+ {I_VPMACSWW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11700, 202},
+ {I_VPMACSWW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11708, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADCSSWD[] = {
+ {I_VPMADCSSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11716, 202},
+ {I_VPMADCSSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11724, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADCSWD[] = {
+ {I_VPMADCSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11732, 202},
+ {I_VPMADCSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11740, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPPERM[] = {
+ {I_VPPERM, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11748, 202},
+ {I_VPPERM, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11756, 202},
+ {I_VPPERM, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11764, 202},
+ {I_VPPERM, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11772, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROTB[] = {
+ {I_VPROTB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32257, 202},
+ {I_VPROTB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32264, 202},
+ {I_VPROTB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32271, 202},
+ {I_VPROTB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32278, 202},
+ {I_VPROTB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11780, 202},
+ {I_VPROTB, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11788, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROTD[] = {
+ {I_VPROTD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32285, 202},
+ {I_VPROTD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32292, 202},
+ {I_VPROTD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32299, 202},
+ {I_VPROTD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32306, 202},
+ {I_VPROTD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11796, 202},
+ {I_VPROTD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11804, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROTQ[] = {
+ {I_VPROTQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32313, 202},
+ {I_VPROTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32320, 202},
+ {I_VPROTQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32327, 202},
+ {I_VPROTQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32334, 202},
+ {I_VPROTQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11812, 202},
+ {I_VPROTQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11820, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROTW[] = {
+ {I_VPROTW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32341, 202},
+ {I_VPROTW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32348, 202},
+ {I_VPROTW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32355, 202},
+ {I_VPROTW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32362, 202},
+ {I_VPROTW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11828, 202},
+ {I_VPROTW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11836, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHAB[] = {
+ {I_VPSHAB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32369, 202},
+ {I_VPSHAB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32376, 202},
+ {I_VPSHAB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32383, 202},
+ {I_VPSHAB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32390, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHAD[] = {
+ {I_VPSHAD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32397, 202},
+ {I_VPSHAD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32404, 202},
+ {I_VPSHAD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32411, 202},
+ {I_VPSHAD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32418, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHAQ[] = {
+ {I_VPSHAQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32425, 202},
+ {I_VPSHAQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32432, 202},
+ {I_VPSHAQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32439, 202},
+ {I_VPSHAQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32446, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHAW[] = {
+ {I_VPSHAW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32453, 202},
+ {I_VPSHAW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32460, 202},
+ {I_VPSHAW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32467, 202},
+ {I_VPSHAW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32474, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLB[] = {
+ {I_VPSHLB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32481, 202},
+ {I_VPSHLB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32488, 202},
+ {I_VPSHLB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32495, 202},
+ {I_VPSHLB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32502, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLD[] = {
+ {I_VPSHLD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32509, 202},
+ {I_VPSHLD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32516, 202},
+ {I_VPSHLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32523, 202},
+ {I_VPSHLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32530, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLQ[] = {
+ {I_VPSHLQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32537, 202},
+ {I_VPSHLQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32544, 202},
+ {I_VPSHLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32551, 202},
+ {I_VPSHLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32558, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLW[] = {
+ {I_VPSHLW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32565, 202},
+ {I_VPSHLW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32572, 202},
+ {I_VPSHLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32579, 202},
+ {I_VPSHLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32586, 202},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI128[] = {
+ {I_VBROADCASTI128, 2, {YMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33860, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDD[] = {
+ {I_VPBLENDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12092, 203},
+ {I_VPBLENDD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12100, 203},
+ {I_VPBLENDD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12108, 203},
+ {I_VPBLENDD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12116, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTB[] = {
+ {I_VPBROADCASTB, 2, {XMM_L16,MEMORY|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33867, 203},
+ {I_VPBROADCASTB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33867, 203},
+ {I_VPBROADCASTB, 2, {YMM_L16,MEMORY|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33874, 203},
+ {I_VPBROADCASTB, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33874, 203},
+ {I_VPBROADCASTB, 2, {XMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17820, 229},
+ {I_VPBROADCASTB, 2, {YMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17828, 229},
+ {I_VPBROADCASTB, 2, {ZMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17836, 230},
+ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTW[] = {
+ {I_VPBROADCASTW, 2, {XMM_L16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33881, 203},
+ {I_VPBROADCASTW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33881, 203},
+ {I_VPBROADCASTW, 2, {YMM_L16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33888, 203},
+ {I_VPBROADCASTW, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33888, 203},
+ {I_VPBROADCASTW, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18060, 229},
+ {I_VPBROADCASTW, 2, {YMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18068, 229},
+ {I_VPBROADCASTW, 2, {ZMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18076, 230},
+ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTD[] = {
+ {I_VPBROADCASTD, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33895, 203},
+ {I_VPBROADCASTD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33895, 203},
+ {I_VPBROADCASTD, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33902, 203},
+ {I_VPBROADCASTD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33902, 203},
+ {I_VPBROADCASTD, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17868, 225},
+ {I_VPBROADCASTD, 2, {YMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17876, 225},
+ {I_VPBROADCASTD, 2, {ZMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17884, 226},
+ {I_VPBROADCASTD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17892, 225},
+ {I_VPBROADCASTD, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17900, 225},
+ {I_VPBROADCASTD, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17908, 226},
+ {I_VPBROADCASTD, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17916, 225},
+ {I_VPBROADCASTD, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17924, 225},
+ {I_VPBROADCASTD, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTQ[] = {
+ {I_VPBROADCASTQ, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33909, 203},
+ {I_VPBROADCASTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33909, 203},
+ {I_VPBROADCASTQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33916, 203},
+ {I_VPBROADCASTQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33916, 203},
+ {I_VPBROADCASTQ, 2, {XMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17988, 225},
+ {I_VPBROADCASTQ, 2, {YMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17996, 225},
+ {I_VPBROADCASTQ, 2, {ZMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18004, 226},
+ {I_VPBROADCASTQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18012, 225},
+ {I_VPBROADCASTQ, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18020, 225},
+ {I_VPBROADCASTQ, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18028, 226},
+ {I_VPBROADCASTQ, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18036, 225},
+ {I_VPBROADCASTQ, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18044, 225},
+ {I_VPBROADCASTQ, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18052, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMD[] = {
+ {I_VPERMD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33923, 203},
+ {I_VPERMD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33930, 203},
+ {I_VPERMD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18492, 225},
+ {I_VPERMD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18500, 225},
+ {I_VPERMD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18508, 226},
+ {I_VPERMD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18516, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMPD[] = {
+ {I_VPERMPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12124, 203},
+ {I_VPERMPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5514, 225},
+ {I_VPERMPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5523, 226},
+ {I_VPERMPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18764, 225},
+ {I_VPERMPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18772, 225},
+ {I_VPERMPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18780, 226},
+ {I_VPERMPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18788, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMPS[] = {
+ {I_VPERMPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33937, 203},
+ {I_VPERMPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33944, 203},
+ {I_VPERMPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18796, 225},
+ {I_VPERMPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18804, 225},
+ {I_VPERMPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18812, 226},
+ {I_VPERMPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18820, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMQ[] = {
+ {I_VPERMQ, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12132, 203},
+ {I_VPERMQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5532, 225},
+ {I_VPERMQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5541, 226},
+ {I_VPERMQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18828, 225},
+ {I_VPERMQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18836, 225},
+ {I_VPERMQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18844, 226},
+ {I_VPERMQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18852, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERM2I128[] = {
+ {I_VPERM2I128, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12140, 203},
+ {I_VPERM2I128, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12148, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTI128[] = {
+ {I_VEXTRACTI128, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12156, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTI128[] = {
+ {I_VINSERTI128, 4, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12164, 203},
+ {I_VINSERTI128, 3, {YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12172, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMASKMOVD[] = {
+ {I_VPMASKMOVD, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33951, 203},
+ {I_VPMASKMOVD, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33958, 203},
+ {I_VPMASKMOVD, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33965, 203},
+ {I_VPMASKMOVD, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33972, 203},
+ {I_VPMASKMOVD, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34007, 203},
+ {I_VPMASKMOVD, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34014, 203},
+ {I_VPMASKMOVD, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34021, 203},
+ {I_VPMASKMOVD, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34028, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMASKMOVQ[] = {
+ {I_VPMASKMOVQ, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33979, 203},
+ {I_VPMASKMOVQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33986, 203},
+ {I_VPMASKMOVQ, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33993, 203},
+ {I_VPMASKMOVQ, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34000, 203},
+ {I_VPMASKMOVQ, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34035, 203},
+ {I_VPMASKMOVQ, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34042, 203},
+ {I_VPMASKMOVQ, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34049, 203},
+ {I_VPMASKMOVQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34056, 203},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLVD[] = {
+ {I_VPSLLVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34063, 203},
+ {I_VPSLLVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34070, 203},
+ {I_VPSLLVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34091, 203},
+ {I_VPSLLVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34098, 203},
+ {I_VPSLLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22316, 225},
+ {I_VPSLLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22324, 225},
+ {I_VPSLLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22332, 225},
+ {I_VPSLLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22340, 225},
+ {I_VPSLLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22348, 226},
+ {I_VPSLLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22356, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLVQ[] = {
+ {I_VPSLLVQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34077, 203},
+ {I_VPSLLVQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34084, 203},
+ {I_VPSLLVQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34105, 203},
+ {I_VPSLLVQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34112, 203},
+ {I_VPSLLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22364, 225},
+ {I_VPSLLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22372, 225},
+ {I_VPSLLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22380, 225},
+ {I_VPSLLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22388, 225},
+ {I_VPSLLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22396, 226},
+ {I_VPSLLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22404, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAVD[] = {
+ {I_VPSRAVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34119, 203},
+ {I_VPSRAVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34126, 203},
+ {I_VPSRAVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34133, 203},
+ {I_VPSRAVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34140, 203},
+ {I_VPSRAVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22604, 225},
+ {I_VPSRAVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22612, 225},
+ {I_VPSRAVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22620, 225},
+ {I_VPSRAVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22628, 225},
+ {I_VPSRAVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22636, 226},
+ {I_VPSRAVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22644, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLVD[] = {
+ {I_VPSRLVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34147, 203},
+ {I_VPSRLVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34154, 203},
+ {I_VPSRLVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34175, 203},
+ {I_VPSRLVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34182, 203},
+ {I_VPSRLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22892, 225},
+ {I_VPSRLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22900, 225},
+ {I_VPSRLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22908, 225},
+ {I_VPSRLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22916, 225},
+ {I_VPSRLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22924, 226},
+ {I_VPSRLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLVQ[] = {
+ {I_VPSRLVQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34161, 203},
+ {I_VPSRLVQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34168, 203},
+ {I_VPSRLVQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34189, 203},
+ {I_VPSRLVQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34196, 203},
+ {I_VPSRLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22940, 225},
+ {I_VPSRLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22948, 225},
+ {I_VPSRLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22956, 225},
+ {I_VPSRLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22964, 225},
+ {I_VPSRLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22972, 226},
+ {I_VPSRLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22980, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERDPD[] = {
+ {I_VGATHERDPD, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12180, 203},
+ {I_VGATHERDPD, 3, {YMM_L16,XMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12196, 203},
+ {I_VGATHERDPD, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4704, 225},
+ {I_VGATHERDPD, 2, {YMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4713, 225},
+ {I_VGATHERDPD, 2, {ZMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4722, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERQPD[] = {
+ {I_VGATHERQPD, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12188, 203},
+ {I_VGATHERQPD, 3, {YMM_L16,YMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12204, 203},
+ {I_VGATHERQPD, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4830, 225},
+ {I_VGATHERQPD, 2, {YMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4839, 225},
+ {I_VGATHERQPD, 2, {ZMMREG,ZMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4848, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERDPS[] = {
+ {I_VGATHERDPS, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12212, 203},
+ {I_VGATHERDPS, 3, {YMM_L16,YMEM|BITS32,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12228, 203},
+ {I_VGATHERDPS, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4731, 225},
+ {I_VGATHERDPS, 2, {YMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4740, 225},
+ {I_VGATHERDPS, 2, {ZMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4749, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERQPS[] = {
+ {I_VGATHERQPS, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12220, 203},
+ {I_VGATHERQPS, 3, {XMM_L16,YMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12236, 203},
+ {I_VGATHERQPS, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4857, 225},
+ {I_VGATHERQPS, 2, {XMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4866, 225},
+ {I_VGATHERQPS, 2, {YMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4875, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPGATHERDD[] = {
+ {I_VPGATHERDD, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12244, 203},
+ {I_VPGATHERDD, 3, {YMM_L16,YMEM|BITS32,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12260, 203},
+ {I_VPGATHERDD, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5595, 225},
+ {I_VPGATHERDD, 2, {YMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5604, 225},
+ {I_VPGATHERDD, 2, {ZMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5613, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPGATHERQD[] = {
+ {I_VPGATHERQD, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12252, 203},
+ {I_VPGATHERQD, 3, {XMM_L16,YMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12268, 203},
+ {I_VPGATHERQD, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5649, 225},
+ {I_VPGATHERQD, 2, {XMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5658, 225},
+ {I_VPGATHERQD, 2, {YMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5667, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPGATHERDQ[] = {
+ {I_VPGATHERDQ, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12276, 203},
+ {I_VPGATHERDQ, 3, {YMM_L16,XMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12292, 203},
+ {I_VPGATHERDQ, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5622, 225},
+ {I_VPGATHERDQ, 2, {YMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5631, 225},
+ {I_VPGATHERDQ, 2, {ZMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5640, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPGATHERQQ[] = {
+ {I_VPGATHERQQ, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12284, 203},
+ {I_VPGATHERQQ, 3, {YMM_L16,YMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12300, 203},
+ {I_VPGATHERQQ, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5676, 225},
+ {I_VPGATHERQQ, 2, {YMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5685, 225},
+ {I_VPGATHERQQ, 2, {ZMMREG,ZMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5694, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XABORT[] = {
+ {I_XABORT, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40486, 204},
+ {I_XABORT, 1, {IMMEDIATE|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40486, 204},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XBEGIN[] = {
+ {I_XBEGIN, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37432, 204},
+ {I_XBEGIN, 1, {IMMEDIATE|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37432, 204},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37438, 205},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37438, 205},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37444, 205},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37444, 205},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37450, 206},
+ {I_XBEGIN, 1, {IMMEDIATE|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37450, 206},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XEND[] = {
+ {I_XEND, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40491, 204},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_XTEST[] = {
+ {I_XTEST, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40496, 207},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ANDN[] = {
+ {I_ANDN, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34203, 208},
+ {I_ANDN, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34210, 209},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BEXTR[] = {
+ {I_BEXTR, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34217, 208},
+ {I_BEXTR, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34224, 209},
+ {I_BEXTR, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+12308, 210},
+ {I_BEXTR, 3, {REG_GPR|BITS64,RM_GPR|BITS64,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+12316, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLCI[] = {
+ {I_BLCI, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34231, 210},
+ {I_BLCI, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34238, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLCIC[] = {
+ {I_BLCIC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34245, 210},
+ {I_BLCIC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34252, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLSI[] = {
+ {I_BLSI, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34259, 208},
+ {I_BLSI, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34266, 209},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLSIC[] = {
+ {I_BLSIC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34273, 210},
+ {I_BLSIC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34280, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLCFILL[] = {
+ {I_BLCFILL, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34287, 210},
+ {I_BLCFILL, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34294, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLSFILL[] = {
+ {I_BLSFILL, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34301, 210},
+ {I_BLSFILL, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34308, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLCMSK[] = {
+ {I_BLCMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34315, 210},
+ {I_BLCMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34322, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLSMSK[] = {
+ {I_BLSMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34329, 208},
+ {I_BLSMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34336, 209},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLSR[] = {
+ {I_BLSR, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34343, 208},
+ {I_BLSR, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34350, 209},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BLCS[] = {
+ {I_BLCS, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34357, 210},
+ {I_BLCS, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34364, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BZHI[] = {
+ {I_BZHI, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34371, 212},
+ {I_BZHI, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34378, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MULX[] = {
+ {I_MULX, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34385, 212},
+ {I_MULX, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34392, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PDEP[] = {
+ {I_PDEP, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34399, 212},
+ {I_PDEP, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34406, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PEXT[] = {
+ {I_PEXT, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34413, 212},
+ {I_PEXT, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34420, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RORX[] = {
+ {I_RORX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12324, 212},
+ {I_RORX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12332, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SARX[] = {
+ {I_SARX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34427, 212},
+ {I_SARX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34434, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHLX[] = {
+ {I_SHLX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34441, 212},
+ {I_SHLX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34448, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHRX[] = {
+ {I_SHRX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34455, 212},
+ {I_SHRX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34462, 213},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_TZCNT[] = {
+ {I_TZCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34469, 214},
+ {I_TZCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34476, 214},
+ {I_TZCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34483, 215},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_TZMSK[] = {
+ {I_TZMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34490, 210},
+ {I_TZMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34497, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_T1MSKC[] = {
+ {I_T1MSKC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34504, 210},
+ {I_T1MSKC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34511, 211},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PREFETCHWT1[] = {
+ {I_PREFETCHWT1, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40501, 216},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDMK[] = {
+ {I_BNDMK, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37456, 217},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDCL[] = {
+ {I_BNDCL, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34519, 218},
+ {I_BNDCL, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34519, 219},
+ {I_BNDCL, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34518, 220},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDCU[] = {
+ {I_BNDCU, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34526, 218},
+ {I_BNDCU, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34526, 219},
+ {I_BNDCU, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34525, 220},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDCN[] = {
+ {I_BNDCN, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34533, 218},
+ {I_BNDCN, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34533, 219},
+ {I_BNDCN, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34532, 220},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDMOV[] = {
+ {I_BNDMOV, 2, {BNDREG,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37462, 218},
+ {I_BNDMOV, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37462, 218},
+ {I_BNDMOV, 2, {BNDREG,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37468, 218},
+ {I_BNDMOV, 2, {MEMORY,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37468, 218},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDLDX[] = {
+ {I_BNDLDX, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37463, 217},
+ {I_BNDLDX, 3, {BNDREG,MEMORY,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+37474, 221},
+ {I_BNDLDX, 3, {BNDREG,MEMORY,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+37474, 222},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_BNDSTX[] = {
+ {I_BNDSTX, 2, {MEMORY,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37469, 217},
+ {I_BNDSTX, 3, {MEMORY,REG_GPR|BITS32,BNDREG,0,0}, NO_DECORATOR, nasm_bytecodes+37480, 221},
+ {I_BNDSTX, 3, {MEMORY,REG_GPR|BITS64,BNDREG,0,0}, NO_DECORATOR, nasm_bytecodes+37480, 222},
+ {I_BNDSTX, 3, {MEMORY,BNDREG,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+37486, 221},
+ {I_BNDSTX, 3, {MEMORY,BNDREG,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+37486, 222},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA1MSG1[] = {
+ {I_SHA1MSG1, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37492, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA1MSG2[] = {
+ {I_SHA1MSG2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37498, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA1NEXTE[] = {
+ {I_SHA1NEXTE, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37504, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA1RNDS4[] = {
+ {I_SHA1RNDS4, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+34539, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA256MSG1[] = {
+ {I_SHA256MSG1, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37510, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA256MSG2[] = {
+ {I_SHA256MSG2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37516, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SHA256RNDS2[] = {
+ {I_SHA256RNDS2, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+37522, 223},
+ {I_SHA256RNDS2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37522, 223},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KADDB[] = {
+ {I_KADDB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34546, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KADDD[] = {
+ {I_KADDD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34553, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KADDQ[] = {
+ {I_KADDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34560, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KADDW[] = {
+ {I_KADDW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34567, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDB[] = {
+ {I_KANDB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34574, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDD[] = {
+ {I_KANDD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34581, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDNB[] = {
+ {I_KANDNB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34588, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDND[] = {
+ {I_KANDND, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34595, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDNQ[] = {
+ {I_KANDNQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34602, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDNW[] = {
+ {I_KANDNW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34609, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDQ[] = {
+ {I_KANDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34616, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KANDW[] = {
+ {I_KANDW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34623, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KMOVB[] = {
+ {I_KMOVB, 2, {KREG,RM_K|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+34630, 224},
+ {I_KMOVB, 2, {MEMORY|BITS8,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34637, 224},
+ {I_KMOVB, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34644, 224},
+ {I_KMOVB, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34651, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KMOVD[] = {
+ {I_KMOVD, 2, {KREG,RM_K|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34658, 224},
+ {I_KMOVD, 2, {MEMORY|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34665, 224},
+ {I_KMOVD, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34672, 224},
+ {I_KMOVD, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34679, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KMOVQ[] = {
+ {I_KMOVQ, 2, {KREG,RM_K|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34686, 224},
+ {I_KMOVQ, 2, {MEMORY|BITS64,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34693, 224},
+ {I_KMOVQ, 2, {KREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34700, 224},
+ {I_KMOVQ, 2, {REG_GPR|BITS64,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34707, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KMOVW[] = {
+ {I_KMOVW, 2, {KREG,RM_K|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34714, 224},
+ {I_KMOVW, 2, {MEMORY|BITS16,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34721, 224},
+ {I_KMOVW, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34728, 224},
+ {I_KMOVW, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34735, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KNOTB[] = {
+ {I_KNOTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34742, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KNOTD[] = {
+ {I_KNOTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34749, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KNOTQ[] = {
+ {I_KNOTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34756, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KNOTW[] = {
+ {I_KNOTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34763, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORB[] = {
+ {I_KORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34770, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORD[] = {
+ {I_KORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34777, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORQ[] = {
+ {I_KORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34784, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORTESTB[] = {
+ {I_KORTESTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34791, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORTESTD[] = {
+ {I_KORTESTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34798, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORTESTQ[] = {
+ {I_KORTESTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34805, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORTESTW[] = {
+ {I_KORTESTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34812, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KORW[] = {
+ {I_KORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34819, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTLB[] = {
+ {I_KSHIFTLB, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12340, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTLD[] = {
+ {I_KSHIFTLD, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12348, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTLQ[] = {
+ {I_KSHIFTLQ, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12356, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTLW[] = {
+ {I_KSHIFTLW, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12364, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTRB[] = {
+ {I_KSHIFTRB, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12372, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTRD[] = {
+ {I_KSHIFTRD, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12380, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTRQ[] = {
+ {I_KSHIFTRQ, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12388, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KSHIFTRW[] = {
+ {I_KSHIFTRW, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12396, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KTESTB[] = {
+ {I_KTESTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34826, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KTESTD[] = {
+ {I_KTESTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34833, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KTESTQ[] = {
+ {I_KTESTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34840, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KTESTW[] = {
+ {I_KTESTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34847, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KUNPCKBW[] = {
+ {I_KUNPCKBW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34854, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KUNPCKDQ[] = {
+ {I_KUNPCKDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34861, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KUNPCKWD[] = {
+ {I_KUNPCKWD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34868, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXNORB[] = {
+ {I_KXNORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34875, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXNORD[] = {
+ {I_KXNORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34882, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXNORQ[] = {
+ {I_KXNORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34889, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXNORW[] = {
+ {I_KXNORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34896, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXORB[] = {
+ {I_KXORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34903, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXORD[] = {
+ {I_KXORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34910, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXORQ[] = {
+ {I_KXORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34917, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_KXORW[] = {
+ {I_KXORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34924, 224},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VALIGND[] = {
+ {I_VALIGND, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4002, 225},
+ {I_VALIGND, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4011, 225},
+ {I_VALIGND, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4020, 225},
+ {I_VALIGND, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4029, 225},
+ {I_VALIGND, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4038, 226},
+ {I_VALIGND, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4047, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VALIGNQ[] = {
+ {I_VALIGNQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4056, 225},
+ {I_VALIGNQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4065, 225},
+ {I_VALIGNQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4074, 225},
+ {I_VALIGNQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4083, 225},
+ {I_VALIGNQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4092, 226},
+ {I_VALIGNQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4101, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDMPD[] = {
+ {I_VBLENDMPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12724, 225},
+ {I_VBLENDMPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12732, 225},
+ {I_VBLENDMPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12740, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBLENDMPS[] = {
+ {I_VBLENDMPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12748, 225},
+ {I_VBLENDMPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12756, 225},
+ {I_VBLENDMPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12764, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF32X2[] = {
+ {I_VBROADCASTF32X2, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12772, 227},
+ {I_VBROADCASTF32X2, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12780, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF32X4[] = {
+ {I_VBROADCASTF32X4, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12788, 225},
+ {I_VBROADCASTF32X4, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12796, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF32X8[] = {
+ {I_VBROADCASTF32X8, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12804, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF64X2[] = {
+ {I_VBROADCASTF64X2, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12812, 227},
+ {I_VBROADCASTF64X2, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12820, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTF64X4[] = {
+ {I_VBROADCASTF64X4, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12828, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI32X2[] = {
+ {I_VBROADCASTI32X2, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12836, 227},
+ {I_VBROADCASTI32X2, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12844, 227},
+ {I_VBROADCASTI32X2, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12852, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI32X4[] = {
+ {I_VBROADCASTI32X4, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12860, 225},
+ {I_VBROADCASTI32X4, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12868, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI32X8[] = {
+ {I_VBROADCASTI32X8, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12876, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI64X2[] = {
+ {I_VBROADCASTI64X2, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12884, 227},
+ {I_VBROADCASTI64X2, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12892, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VBROADCASTI64X4[] = {
+ {I_VBROADCASTI64X4, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12900, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCOMPRESSPD[] = {
+ {I_VCOMPRESSPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13004, 225},
+ {I_VCOMPRESSPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13012, 225},
+ {I_VCOMPRESSPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13020, 226},
+ {I_VCOMPRESSPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13028, 225},
+ {I_VCOMPRESSPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13036, 225},
+ {I_VCOMPRESSPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13044, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCOMPRESSPS[] = {
+ {I_VCOMPRESSPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13052, 225},
+ {I_VCOMPRESSPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13060, 225},
+ {I_VCOMPRESSPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13068, 226},
+ {I_VCOMPRESSPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13076, 225},
+ {I_VCOMPRESSPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13084, 225},
+ {I_VCOMPRESSPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13092, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPD2QQ[] = {
+ {I_VCVTPD2QQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13196, 227},
+ {I_VCVTPD2QQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13204, 227},
+ {I_VCVTPD2QQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13212, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPD2UDQ[] = {
+ {I_VCVTPD2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13220, 225},
+ {I_VCVTPD2UDQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13228, 225},
+ {I_VCVTPD2UDQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13236, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPD2UQQ[] = {
+ {I_VCVTPD2UQQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13244, 227},
+ {I_VCVTPD2UQQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13252, 227},
+ {I_VCVTPD2UQQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13260, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2QQ[] = {
+ {I_VCVTPS2QQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13340, 227},
+ {I_VCVTPS2QQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13348, 227},
+ {I_VCVTPS2QQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13356, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2UDQ[] = {
+ {I_VCVTPS2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13364, 225},
+ {I_VCVTPS2UDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13372, 225},
+ {I_VCVTPS2UDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13380, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTPS2UQQ[] = {
+ {I_VCVTPS2UQQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13388, 227},
+ {I_VCVTPS2UQQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13396, 227},
+ {I_VCVTPS2UQQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13404, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTQQ2PD[] = {
+ {I_VCVTQQ2PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13412, 227},
+ {I_VCVTQQ2PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13420, 227},
+ {I_VCVTQQ2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13428, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTQQ2PS[] = {
+ {I_VCVTQQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13436, 227},
+ {I_VCVTQQ2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13444, 227},
+ {I_VCVTQQ2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13452, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSD2USI[] = {
+ {I_VCVTSD2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13484, 226},
+ {I_VCVTSD2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13492, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTSS2USI[] = {
+ {I_VCVTSS2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13556, 226},
+ {I_VCVTSS2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13564, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPD2QQ[] = {
+ {I_VCVTTPD2QQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13596, 227},
+ {I_VCVTTPD2QQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13604, 227},
+ {I_VCVTTPD2QQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13612, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPD2UDQ[] = {
+ {I_VCVTTPD2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13620, 225},
+ {I_VCVTTPD2UDQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13628, 225},
+ {I_VCVTTPD2UDQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13636, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPD2UQQ[] = {
+ {I_VCVTTPD2UQQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13644, 227},
+ {I_VCVTTPD2UQQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13652, 227},
+ {I_VCVTTPD2UQQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13660, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPS2QQ[] = {
+ {I_VCVTTPS2QQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13692, 227},
+ {I_VCVTTPS2QQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13700, 227},
+ {I_VCVTTPS2QQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13708, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPS2UDQ[] = {
+ {I_VCVTTPS2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13716, 225},
+ {I_VCVTTPS2UDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13724, 225},
+ {I_VCVTTPS2UDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13732, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTPS2UQQ[] = {
+ {I_VCVTTPS2UQQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13740, 227},
+ {I_VCVTTPS2UQQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13748, 227},
+ {I_VCVTTPS2UQQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13756, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTSD2USI[] = {
+ {I_VCVTTSD2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13780, 226},
+ {I_VCVTTSD2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13788, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTTSS2USI[] = {
+ {I_VCVTTSS2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13812, 226},
+ {I_VCVTTSS2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13820, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUDQ2PD[] = {
+ {I_VCVTUDQ2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13828, 225},
+ {I_VCVTUDQ2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13836, 225},
+ {I_VCVTUDQ2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13844, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUDQ2PS[] = {
+ {I_VCVTUDQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13852, 225},
+ {I_VCVTUDQ2PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13860, 225},
+ {I_VCVTUDQ2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13868, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUQQ2PD[] = {
+ {I_VCVTUQQ2PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13876, 227},
+ {I_VCVTUQQ2PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13884, 227},
+ {I_VCVTUQQ2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13892, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUQQ2PS[] = {
+ {I_VCVTUQQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13900, 227},
+ {I_VCVTUQQ2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13908, 227},
+ {I_VCVTUQQ2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13916, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUSI2SD[] = {
+ {I_VCVTUSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13924, 226},
+ {I_VCVTUSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13932, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VCVTUSI2SS[] = {
+ {I_VCVTUSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13940, 226},
+ {I_VCVTUSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13948, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VDBPSADBW[] = {
+ {I_VDBPSADBW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4209, 229},
+ {I_VDBPSADBW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4218, 229},
+ {I_VDBPSADBW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4227, 229},
+ {I_VDBPSADBW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4236, 229},
+ {I_VDBPSADBW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4245, 230},
+ {I_VDBPSADBW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4254, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXP2PD[] = {
+ {I_VEXP2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+14084, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXP2PS[] = {
+ {I_VEXP2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+14092, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXPANDPD[] = {
+ {I_VEXPANDPD, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14100, 225},
+ {I_VEXPANDPD, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14108, 225},
+ {I_VEXPANDPD, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14116, 226},
+ {I_VEXPANDPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14100, 225},
+ {I_VEXPANDPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14108, 225},
+ {I_VEXPANDPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14116, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXPANDPS[] = {
+ {I_VEXPANDPS, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14124, 225},
+ {I_VEXPANDPS, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14132, 225},
+ {I_VEXPANDPS, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14140, 226},
+ {I_VEXPANDPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14124, 225},
+ {I_VEXPANDPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14132, 225},
+ {I_VEXPANDPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14140, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTF32X4[] = {
+ {I_VEXTRACTF32X4, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4263, 225},
+ {I_VEXTRACTF32X4, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4272, 226},
+ {I_VEXTRACTF32X4, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4281, 225},
+ {I_VEXTRACTF32X4, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4290, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTF32X8[] = {
+ {I_VEXTRACTF32X8, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4299, 228},
+ {I_VEXTRACTF32X8, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4308, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTF64X2[] = {
+ {I_VEXTRACTF64X2, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4317, 227},
+ {I_VEXTRACTF64X2, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4326, 228},
+ {I_VEXTRACTF64X2, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4335, 227},
+ {I_VEXTRACTF64X2, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4344, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTF64X4[] = {
+ {I_VEXTRACTF64X4, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4353, 226},
+ {I_VEXTRACTF64X4, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4362, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTI32X4[] = {
+ {I_VEXTRACTI32X4, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4371, 225},
+ {I_VEXTRACTI32X4, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4380, 226},
+ {I_VEXTRACTI32X4, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4389, 225},
+ {I_VEXTRACTI32X4, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4398, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTI32X8[] = {
+ {I_VEXTRACTI32X8, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4407, 228},
+ {I_VEXTRACTI32X8, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4416, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTI64X2[] = {
+ {I_VEXTRACTI64X2, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4425, 227},
+ {I_VEXTRACTI64X2, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4434, 228},
+ {I_VEXTRACTI64X2, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4443, 227},
+ {I_VEXTRACTI64X2, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4452, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VEXTRACTI64X4[] = {
+ {I_VEXTRACTI64X4, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4461, 226},
+ {I_VEXTRACTI64X4, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4470, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFIXUPIMMPD[] = {
+ {I_VFIXUPIMMPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4488, 225},
+ {I_VFIXUPIMMPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4497, 225},
+ {I_VFIXUPIMMPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4506, 225},
+ {I_VFIXUPIMMPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4515, 225},
+ {I_VFIXUPIMMPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+4524, 226},
+ {I_VFIXUPIMMPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+4533, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFIXUPIMMPS[] = {
+ {I_VFIXUPIMMPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4542, 225},
+ {I_VFIXUPIMMPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4551, 225},
+ {I_VFIXUPIMMPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4560, 225},
+ {I_VFIXUPIMMPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4569, 225},
+ {I_VFIXUPIMMPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+4578, 226},
+ {I_VFIXUPIMMPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+4587, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFIXUPIMMSD[] = {
+ {I_VFIXUPIMMSD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4596, 226},
+ {I_VFIXUPIMMSD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4605, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFIXUPIMMSS[] = {
+ {I_VFIXUPIMMSS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4614, 226},
+ {I_VFIXUPIMMSS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4623, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFPCLASSPD[] = {
+ {I_VFPCLASSPD, 3, {KREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4632, 227},
+ {I_VFPCLASSPD, 3, {KREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4641, 227},
+ {I_VFPCLASSPD, 3, {KREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4650, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFPCLASSPS[] = {
+ {I_VFPCLASSPS, 3, {KREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4659, 227},
+ {I_VFPCLASSPS, 3, {KREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4668, 227},
+ {I_VFPCLASSPS, 3, {KREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4677, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFPCLASSSD[] = {
+ {I_VFPCLASSSD, 3, {KREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4686, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VFPCLASSSS[] = {
+ {I_VFPCLASSSS, 3, {KREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4695, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF0DPD[] = {
+ {I_VGATHERPF0DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4758, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF0DPS[] = {
+ {I_VGATHERPF0DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4767, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF0QPD[] = {
+ {I_VGATHERPF0QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4776, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF0QPS[] = {
+ {I_VGATHERPF0QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4785, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF1DPD[] = {
+ {I_VGATHERPF1DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4794, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF1DPS[] = {
+ {I_VGATHERPF1DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4803, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF1QPD[] = {
+ {I_VGATHERPF1QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4812, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGATHERPF1QPS[] = {
+ {I_VGATHERPF1QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4821, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETEXPPD[] = {
+ {I_VGETEXPPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15204, 225},
+ {I_VGETEXPPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15212, 225},
+ {I_VGETEXPPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15220, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETEXPPS[] = {
+ {I_VGETEXPPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15228, 225},
+ {I_VGETEXPPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15236, 225},
+ {I_VGETEXPPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15244, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETEXPSD[] = {
+ {I_VGETEXPSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15252, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETEXPSS[] = {
+ {I_VGETEXPSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15260, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETMANTPD[] = {
+ {I_VGETMANTPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4884, 225},
+ {I_VGETMANTPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4893, 225},
+ {I_VGETMANTPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+4902, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETMANTPS[] = {
+ {I_VGETMANTPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4911, 225},
+ {I_VGETMANTPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4920, 225},
+ {I_VGETMANTPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+4929, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETMANTSD[] = {
+ {I_VGETMANTSD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4938, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGETMANTSS[] = {
+ {I_VGETMANTSS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4947, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTF32X4[] = {
+ {I_VINSERTF32X4, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4956, 225},
+ {I_VINSERTF32X4, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4965, 225},
+ {I_VINSERTF32X4, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4974, 226},
+ {I_VINSERTF32X4, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4983, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTF32X8[] = {
+ {I_VINSERTF32X8, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4992, 228},
+ {I_VINSERTF32X8, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5001, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTF64X2[] = {
+ {I_VINSERTF64X2, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5010, 227},
+ {I_VINSERTF64X2, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5019, 227},
+ {I_VINSERTF64X2, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5028, 228},
+ {I_VINSERTF64X2, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5037, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTF64X4[] = {
+ {I_VINSERTF64X4, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5046, 226},
+ {I_VINSERTF64X4, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5055, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTI32X4[] = {
+ {I_VINSERTI32X4, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5064, 225},
+ {I_VINSERTI32X4, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5073, 225},
+ {I_VINSERTI32X4, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5082, 226},
+ {I_VINSERTI32X4, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5091, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTI32X8[] = {
+ {I_VINSERTI32X8, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5100, 228},
+ {I_VINSERTI32X8, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5109, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTI64X2[] = {
+ {I_VINSERTI64X2, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5118, 227},
+ {I_VINSERTI64X2, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5127, 227},
+ {I_VINSERTI64X2, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5136, 228},
+ {I_VINSERTI64X2, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5145, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VINSERTI64X4[] = {
+ {I_VINSERTI64X4, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5154, 226},
+ {I_VINSERTI64X4, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5163, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQA32[] = {
+ {I_VMOVDQA32, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15708, 225},
+ {I_VMOVDQA32, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15716, 225},
+ {I_VMOVDQA32, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15724, 226},
+ {I_VMOVDQA32, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15732, 225},
+ {I_VMOVDQA32, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15740, 225},
+ {I_VMOVDQA32, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15748, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQA64[] = {
+ {I_VMOVDQA64, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15756, 225},
+ {I_VMOVDQA64, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15764, 225},
+ {I_VMOVDQA64, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15772, 226},
+ {I_VMOVDQA64, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15780, 225},
+ {I_VMOVDQA64, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15788, 225},
+ {I_VMOVDQA64, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15796, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQU16[] = {
+ {I_VMOVDQU16, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15804, 229},
+ {I_VMOVDQU16, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15812, 229},
+ {I_VMOVDQU16, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15820, 230},
+ {I_VMOVDQU16, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15828, 229},
+ {I_VMOVDQU16, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15836, 229},
+ {I_VMOVDQU16, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15844, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQU32[] = {
+ {I_VMOVDQU32, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15852, 225},
+ {I_VMOVDQU32, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15860, 225},
+ {I_VMOVDQU32, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15868, 226},
+ {I_VMOVDQU32, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15876, 225},
+ {I_VMOVDQU32, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15884, 225},
+ {I_VMOVDQU32, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15892, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQU64[] = {
+ {I_VMOVDQU64, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15900, 225},
+ {I_VMOVDQU64, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15908, 225},
+ {I_VMOVDQU64, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15916, 226},
+ {I_VMOVDQU64, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15924, 225},
+ {I_VMOVDQU64, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15932, 225},
+ {I_VMOVDQU64, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15940, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VMOVDQU8[] = {
+ {I_VMOVDQU8, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15948, 229},
+ {I_VMOVDQU8, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15956, 229},
+ {I_VMOVDQU8, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15964, 230},
+ {I_VMOVDQU8, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15972, 229},
+ {I_VMOVDQU8, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15980, 229},
+ {I_VMOVDQU8, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15988, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPABSQ[] = {
+ {I_VPABSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16812, 225},
+ {I_VPABSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16820, 225},
+ {I_VPABSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16828, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPANDD[] = {
+ {I_VPANDD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17436, 225},
+ {I_VPANDD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17444, 225},
+ {I_VPANDD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17452, 225},
+ {I_VPANDD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17460, 225},
+ {I_VPANDD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17468, 226},
+ {I_VPANDD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17476, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPANDND[] = {
+ {I_VPANDND, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17484, 225},
+ {I_VPANDND, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17492, 225},
+ {I_VPANDND, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17500, 225},
+ {I_VPANDND, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17508, 225},
+ {I_VPANDND, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17516, 226},
+ {I_VPANDND, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17524, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPANDNQ[] = {
+ {I_VPANDNQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17532, 225},
+ {I_VPANDNQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17540, 225},
+ {I_VPANDNQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17548, 225},
+ {I_VPANDNQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17556, 225},
+ {I_VPANDNQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17564, 226},
+ {I_VPANDNQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17572, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPANDQ[] = {
+ {I_VPANDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17580, 225},
+ {I_VPANDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17588, 225},
+ {I_VPANDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17596, 225},
+ {I_VPANDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17604, 225},
+ {I_VPANDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17612, 226},
+ {I_VPANDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17620, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDMB[] = {
+ {I_VPBLENDMB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17724, 229},
+ {I_VPBLENDMB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17732, 229},
+ {I_VPBLENDMB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17740, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDMD[] = {
+ {I_VPBLENDMD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17748, 225},
+ {I_VPBLENDMD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17756, 225},
+ {I_VPBLENDMD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17764, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDMQ[] = {
+ {I_VPBLENDMQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17772, 225},
+ {I_VPBLENDMQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17780, 225},
+ {I_VPBLENDMQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17788, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBLENDMW[] = {
+ {I_VPBLENDMW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17796, 229},
+ {I_VPBLENDMW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17804, 229},
+ {I_VPBLENDMW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17812, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTMB2Q[] = {
+ {I_VPBROADCASTMB2Q, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17940, 233},
+ {I_VPBROADCASTMB2Q, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17948, 233},
+ {I_VPBROADCASTMB2Q, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17956, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPBROADCASTMW2D[] = {
+ {I_VPBROADCASTMW2D, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17964, 233},
+ {I_VPBROADCASTMW2D, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17972, 233},
+ {I_VPBROADCASTMW2D, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17980, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPB[] = {
+ {I_VPCMPB, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5244, 229},
+ {I_VPCMPB, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5253, 229},
+ {I_VPCMPB, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5262, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPD[] = {
+ {I_VPCMPD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5271, 225},
+ {I_VPCMPD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5280, 225},
+ {I_VPCMPD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5289, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPQ[] = {
+ {I_VPCMPQ, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5298, 225},
+ {I_VPCMPQ, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5307, 225},
+ {I_VPCMPQ, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5316, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPUB[] = {
+ {I_VPCMPUB, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5325, 229},
+ {I_VPCMPUB, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5334, 229},
+ {I_VPCMPUB, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5343, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPUD[] = {
+ {I_VPCMPUD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5352, 225},
+ {I_VPCMPUD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5361, 225},
+ {I_VPCMPUD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5370, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPUQ[] = {
+ {I_VPCMPUQ, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5379, 225},
+ {I_VPCMPUQ, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5388, 225},
+ {I_VPCMPUQ, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5397, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPUW[] = {
+ {I_VPCMPUW, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5406, 229},
+ {I_VPCMPUW, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5415, 229},
+ {I_VPCMPUW, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5424, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCMPW[] = {
+ {I_VPCMPW, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5433, 229},
+ {I_VPCMPW, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5442, 229},
+ {I_VPCMPW, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5451, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMPRESSD[] = {
+ {I_VPCOMPRESSD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18300, 225},
+ {I_VPCOMPRESSD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18308, 225},
+ {I_VPCOMPRESSD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18316, 226},
+ {I_VPCOMPRESSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18324, 225},
+ {I_VPCOMPRESSD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18332, 225},
+ {I_VPCOMPRESSD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18340, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMPRESSQ[] = {
+ {I_VPCOMPRESSQ, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18348, 225},
+ {I_VPCOMPRESSQ, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18356, 225},
+ {I_VPCOMPRESSQ, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18364, 226},
+ {I_VPCOMPRESSQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18372, 225},
+ {I_VPCOMPRESSQ, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18380, 225},
+ {I_VPCOMPRESSQ, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18388, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCONFLICTD[] = {
+ {I_VPCONFLICTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18396, 233},
+ {I_VPCONFLICTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18404, 233},
+ {I_VPCONFLICTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18412, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCONFLICTQ[] = {
+ {I_VPCONFLICTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18420, 233},
+ {I_VPCONFLICTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18428, 233},
+ {I_VPCONFLICTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18436, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMB[] = {
+ {I_VPERMB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18444, 235},
+ {I_VPERMB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18452, 235},
+ {I_VPERMB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18460, 235},
+ {I_VPERMB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18468, 235},
+ {I_VPERMB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18476, 236},
+ {I_VPERMB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18484, 236},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2B[] = {
+ {I_VPERMI2B, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18524, 235},
+ {I_VPERMI2B, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18532, 235},
+ {I_VPERMI2B, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18540, 236},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2D[] = {
+ {I_VPERMI2D, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18548, 225},
+ {I_VPERMI2D, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18556, 225},
+ {I_VPERMI2D, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18564, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2PD[] = {
+ {I_VPERMI2PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18572, 225},
+ {I_VPERMI2PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18580, 225},
+ {I_VPERMI2PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18588, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2PS[] = {
+ {I_VPERMI2PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18596, 225},
+ {I_VPERMI2PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18604, 225},
+ {I_VPERMI2PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18612, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2Q[] = {
+ {I_VPERMI2Q, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18620, 225},
+ {I_VPERMI2Q, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18628, 225},
+ {I_VPERMI2Q, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18636, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMI2W[] = {
+ {I_VPERMI2W, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18644, 229},
+ {I_VPERMI2W, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18652, 229},
+ {I_VPERMI2W, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18660, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2B[] = {
+ {I_VPERMT2B, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18860, 235},
+ {I_VPERMT2B, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18868, 235},
+ {I_VPERMT2B, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18876, 236},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2D[] = {
+ {I_VPERMT2D, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18884, 225},
+ {I_VPERMT2D, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18892, 225},
+ {I_VPERMT2D, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18900, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2PD[] = {
+ {I_VPERMT2PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18908, 225},
+ {I_VPERMT2PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18916, 225},
+ {I_VPERMT2PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18924, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2PS[] = {
+ {I_VPERMT2PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18932, 225},
+ {I_VPERMT2PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18940, 225},
+ {I_VPERMT2PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18948, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2Q[] = {
+ {I_VPERMT2Q, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18956, 225},
+ {I_VPERMT2Q, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18964, 225},
+ {I_VPERMT2Q, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18972, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMT2W[] = {
+ {I_VPERMT2W, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18980, 229},
+ {I_VPERMT2W, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18988, 229},
+ {I_VPERMT2W, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18996, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPERMW[] = {
+ {I_VPERMW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19004, 229},
+ {I_VPERMW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19012, 229},
+ {I_VPERMW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19020, 229},
+ {I_VPERMW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19028, 229},
+ {I_VPERMW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19036, 230},
+ {I_VPERMW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19044, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXPANDD[] = {
+ {I_VPEXPANDD, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19052, 225},
+ {I_VPEXPANDD, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19060, 225},
+ {I_VPEXPANDD, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19068, 226},
+ {I_VPEXPANDD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19052, 225},
+ {I_VPEXPANDD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19060, 225},
+ {I_VPEXPANDD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19068, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXPANDQ[] = {
+ {I_VPEXPANDQ, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19076, 225},
+ {I_VPEXPANDQ, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19084, 225},
+ {I_VPEXPANDQ, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19092, 226},
+ {I_VPEXPANDQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19076, 225},
+ {I_VPEXPANDQ, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19084, 225},
+ {I_VPEXPANDQ, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19092, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPLZCNTD[] = {
+ {I_VPLZCNTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19100, 233},
+ {I_VPLZCNTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19108, 233},
+ {I_VPLZCNTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19116, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPLZCNTQ[] = {
+ {I_VPLZCNTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19124, 233},
+ {I_VPLZCNTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19132, 233},
+ {I_VPLZCNTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19140, 234},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADD52HUQ[] = {
+ {I_VPMADD52HUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19148, 237},
+ {I_VPMADD52HUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19156, 237},
+ {I_VPMADD52HUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19164, 238},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMADD52LUQ[] = {
+ {I_VPMADD52LUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19172, 237},
+ {I_VPMADD52LUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19180, 237},
+ {I_VPMADD52LUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19188, 238},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXSQ[] = {
+ {I_VPMAXSQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19388, 225},
+ {I_VPMAXSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19396, 225},
+ {I_VPMAXSQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19404, 225},
+ {I_VPMAXSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19412, 225},
+ {I_VPMAXSQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19420, 226},
+ {I_VPMAXSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19428, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMAXUQ[] = {
+ {I_VPMAXUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19580, 225},
+ {I_VPMAXUQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19588, 225},
+ {I_VPMAXUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19596, 225},
+ {I_VPMAXUQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19604, 225},
+ {I_VPMAXUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19612, 226},
+ {I_VPMAXUQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19620, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINSQ[] = {
+ {I_VPMINSQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19772, 225},
+ {I_VPMINSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19780, 225},
+ {I_VPMINSQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19788, 225},
+ {I_VPMINSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19796, 225},
+ {I_VPMINSQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19804, 226},
+ {I_VPMINSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19812, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMINUQ[] = {
+ {I_VPMINUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19964, 225},
+ {I_VPMINUQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19972, 225},
+ {I_VPMINUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19980, 225},
+ {I_VPMINUQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19988, 225},
+ {I_VPMINUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19996, 226},
+ {I_VPMINUQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+20004, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVB2M[] = {
+ {I_VPMOVB2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20060, 229},
+ {I_VPMOVB2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20068, 229},
+ {I_VPMOVB2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20076, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVD2M[] = {
+ {I_VPMOVD2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20084, 227},
+ {I_VPMOVD2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20092, 227},
+ {I_VPMOVD2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20100, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVDB[] = {
+ {I_VPMOVDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20108, 225},
+ {I_VPMOVDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20116, 225},
+ {I_VPMOVDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20124, 226},
+ {I_VPMOVDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20132, 225},
+ {I_VPMOVDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20140, 225},
+ {I_VPMOVDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20148, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVDW[] = {
+ {I_VPMOVDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20156, 225},
+ {I_VPMOVDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20164, 225},
+ {I_VPMOVDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20172, 226},
+ {I_VPMOVDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20180, 225},
+ {I_VPMOVDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20188, 225},
+ {I_VPMOVDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20196, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVM2B[] = {
+ {I_VPMOVM2B, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20204, 229},
+ {I_VPMOVM2B, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20212, 229},
+ {I_VPMOVM2B, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20220, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVM2D[] = {
+ {I_VPMOVM2D, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20228, 227},
+ {I_VPMOVM2D, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20236, 227},
+ {I_VPMOVM2D, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20244, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVM2Q[] = {
+ {I_VPMOVM2Q, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20252, 227},
+ {I_VPMOVM2Q, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20260, 227},
+ {I_VPMOVM2Q, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20268, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVM2W[] = {
+ {I_VPMOVM2W, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20276, 229},
+ {I_VPMOVM2W, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20284, 229},
+ {I_VPMOVM2W, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20292, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVQ2M[] = {
+ {I_VPMOVQ2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20300, 227},
+ {I_VPMOVQ2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20308, 227},
+ {I_VPMOVQ2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20316, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVQB[] = {
+ {I_VPMOVQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20324, 225},
+ {I_VPMOVQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20332, 225},
+ {I_VPMOVQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20340, 226},
+ {I_VPMOVQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20348, 225},
+ {I_VPMOVQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20356, 225},
+ {I_VPMOVQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20364, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVQD[] = {
+ {I_VPMOVQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20372, 225},
+ {I_VPMOVQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20380, 225},
+ {I_VPMOVQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20388, 226},
+ {I_VPMOVQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20396, 225},
+ {I_VPMOVQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20404, 225},
+ {I_VPMOVQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20412, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVQW[] = {
+ {I_VPMOVQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20420, 225},
+ {I_VPMOVQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20428, 225},
+ {I_VPMOVQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20436, 226},
+ {I_VPMOVQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20444, 225},
+ {I_VPMOVQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20452, 225},
+ {I_VPMOVQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20460, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSDB[] = {
+ {I_VPMOVSDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20468, 225},
+ {I_VPMOVSDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20476, 225},
+ {I_VPMOVSDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20484, 226},
+ {I_VPMOVSDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20492, 225},
+ {I_VPMOVSDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20500, 225},
+ {I_VPMOVSDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20508, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSDW[] = {
+ {I_VPMOVSDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20516, 225},
+ {I_VPMOVSDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20524, 225},
+ {I_VPMOVSDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20532, 226},
+ {I_VPMOVSDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20540, 225},
+ {I_VPMOVSDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20548, 225},
+ {I_VPMOVSDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20556, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSQB[] = {
+ {I_VPMOVSQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20564, 225},
+ {I_VPMOVSQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20572, 225},
+ {I_VPMOVSQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20580, 226},
+ {I_VPMOVSQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20588, 225},
+ {I_VPMOVSQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20596, 225},
+ {I_VPMOVSQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20604, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSQD[] = {
+ {I_VPMOVSQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20612, 225},
+ {I_VPMOVSQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20620, 225},
+ {I_VPMOVSQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20628, 226},
+ {I_VPMOVSQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20636, 225},
+ {I_VPMOVSQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20644, 225},
+ {I_VPMOVSQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20652, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSQW[] = {
+ {I_VPMOVSQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20660, 225},
+ {I_VPMOVSQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20668, 225},
+ {I_VPMOVSQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20676, 226},
+ {I_VPMOVSQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20684, 225},
+ {I_VPMOVSQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20692, 225},
+ {I_VPMOVSQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20700, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVSWB[] = {
+ {I_VPMOVSWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20708, 229},
+ {I_VPMOVSWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20716, 229},
+ {I_VPMOVSWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20724, 230},
+ {I_VPMOVSWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20732, 229},
+ {I_VPMOVSWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20740, 229},
+ {I_VPMOVSWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20748, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSDB[] = {
+ {I_VPMOVUSDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20900, 225},
+ {I_VPMOVUSDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20908, 225},
+ {I_VPMOVUSDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20916, 226},
+ {I_VPMOVUSDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20924, 225},
+ {I_VPMOVUSDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20932, 225},
+ {I_VPMOVUSDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20940, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSDW[] = {
+ {I_VPMOVUSDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20948, 225},
+ {I_VPMOVUSDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20956, 225},
+ {I_VPMOVUSDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20964, 226},
+ {I_VPMOVUSDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20972, 225},
+ {I_VPMOVUSDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20980, 225},
+ {I_VPMOVUSDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20988, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSQB[] = {
+ {I_VPMOVUSQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20996, 225},
+ {I_VPMOVUSQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21004, 225},
+ {I_VPMOVUSQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21012, 226},
+ {I_VPMOVUSQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21020, 225},
+ {I_VPMOVUSQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21028, 225},
+ {I_VPMOVUSQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21036, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSQD[] = {
+ {I_VPMOVUSQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21044, 225},
+ {I_VPMOVUSQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21052, 225},
+ {I_VPMOVUSQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21060, 226},
+ {I_VPMOVUSQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21068, 225},
+ {I_VPMOVUSQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21076, 225},
+ {I_VPMOVUSQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21084, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSQW[] = {
+ {I_VPMOVUSQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21092, 225},
+ {I_VPMOVUSQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21100, 225},
+ {I_VPMOVUSQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21108, 226},
+ {I_VPMOVUSQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21116, 225},
+ {I_VPMOVUSQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21124, 225},
+ {I_VPMOVUSQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21132, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVUSWB[] = {
+ {I_VPMOVUSWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21140, 229},
+ {I_VPMOVUSWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21148, 229},
+ {I_VPMOVUSWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21156, 230},
+ {I_VPMOVUSWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21164, 229},
+ {I_VPMOVUSWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21172, 229},
+ {I_VPMOVUSWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21180, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVW2M[] = {
+ {I_VPMOVW2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21188, 229},
+ {I_VPMOVW2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21196, 229},
+ {I_VPMOVW2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21204, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMOVWB[] = {
+ {I_VPMOVWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21212, 229},
+ {I_VPMOVWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21220, 229},
+ {I_VPMOVWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21228, 230},
+ {I_VPMOVWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21236, 229},
+ {I_VPMOVWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21244, 229},
+ {I_VPMOVWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21252, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULLQ[] = {
+ {I_VPMULLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21644, 227},
+ {I_VPMULLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21652, 227},
+ {I_VPMULLQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21660, 227},
+ {I_VPMULLQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21668, 227},
+ {I_VPMULLQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21676, 228},
+ {I_VPMULLQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21684, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPMULTISHIFTQB[] = {
+ {I_VPMULTISHIFTQB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21740, 235},
+ {I_VPMULTISHIFTQB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21748, 235},
+ {I_VPMULTISHIFTQB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21756, 235},
+ {I_VPMULTISHIFTQB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21764, 235},
+ {I_VPMULTISHIFTQB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21772, 236},
+ {I_VPMULTISHIFTQB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21780, 236},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPORD[] = {
+ {I_VPORD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21836, 225},
+ {I_VPORD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21844, 225},
+ {I_VPORD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21852, 225},
+ {I_VPORD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21860, 225},
+ {I_VPORD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21868, 226},
+ {I_VPORD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21876, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPORQ[] = {
+ {I_VPORQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21884, 225},
+ {I_VPORQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21892, 225},
+ {I_VPORQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21900, 225},
+ {I_VPORQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21908, 225},
+ {I_VPORQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21916, 226},
+ {I_VPORQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21924, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROLD[] = {
+ {I_VPROLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5775, 225},
+ {I_VPROLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5784, 225},
+ {I_VPROLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5793, 225},
+ {I_VPROLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5802, 225},
+ {I_VPROLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5811, 226},
+ {I_VPROLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5820, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROLQ[] = {
+ {I_VPROLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5829, 225},
+ {I_VPROLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5838, 225},
+ {I_VPROLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5847, 225},
+ {I_VPROLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5856, 225},
+ {I_VPROLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5865, 226},
+ {I_VPROLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5874, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROLVD[] = {
+ {I_VPROLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21932, 225},
+ {I_VPROLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21940, 225},
+ {I_VPROLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21948, 225},
+ {I_VPROLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21956, 225},
+ {I_VPROLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21964, 226},
+ {I_VPROLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21972, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPROLVQ[] = {
+ {I_VPROLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21980, 225},
+ {I_VPROLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21988, 225},
+ {I_VPROLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21996, 225},
+ {I_VPROLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22004, 225},
+ {I_VPROLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22012, 226},
+ {I_VPROLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22020, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPRORD[] = {
+ {I_VPRORD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5883, 225},
+ {I_VPRORD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5892, 225},
+ {I_VPRORD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5901, 225},
+ {I_VPRORD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5910, 225},
+ {I_VPRORD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5919, 226},
+ {I_VPRORD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5928, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPRORQ[] = {
+ {I_VPRORQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5937, 225},
+ {I_VPRORQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5946, 225},
+ {I_VPRORQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5955, 225},
+ {I_VPRORQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5964, 225},
+ {I_VPRORQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5973, 226},
+ {I_VPRORQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5982, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPRORVD[] = {
+ {I_VPRORVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22028, 225},
+ {I_VPRORVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22036, 225},
+ {I_VPRORVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22044, 225},
+ {I_VPRORVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22052, 225},
+ {I_VPRORVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22060, 226},
+ {I_VPRORVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22068, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPRORVQ[] = {
+ {I_VPRORVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22076, 225},
+ {I_VPRORVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22084, 225},
+ {I_VPRORVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22092, 225},
+ {I_VPRORVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22100, 225},
+ {I_VPRORVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22108, 226},
+ {I_VPRORVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22116, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSCATTERDD[] = {
+ {I_VPSCATTERDD, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5991, 225},
+ {I_VPSCATTERDD, 2, {YMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6000, 225},
+ {I_VPSCATTERDD, 2, {ZMEM|BITS32,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6009, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSCATTERDQ[] = {
+ {I_VPSCATTERDQ, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6018, 225},
+ {I_VPSCATTERDQ, 2, {XMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6027, 225},
+ {I_VPSCATTERDQ, 2, {YMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6036, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSCATTERQD[] = {
+ {I_VPSCATTERQD, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6045, 225},
+ {I_VPSCATTERQD, 2, {YMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6054, 225},
+ {I_VPSCATTERQD, 2, {ZMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6063, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSCATTERQQ[] = {
+ {I_VPSCATTERQQ, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6072, 225},
+ {I_VPSCATTERQQ, 2, {YMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6081, 225},
+ {I_VPSCATTERQQ, 2, {ZMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6090, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSLLVW[] = {
+ {I_VPSLLVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22412, 229},
+ {I_VPSLLVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22420, 229},
+ {I_VPSLLVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22428, 229},
+ {I_VPSLLVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22436, 229},
+ {I_VPSLLVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22444, 230},
+ {I_VPSLLVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22452, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAQ[] = {
+ {I_VPSRAQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22556, 225},
+ {I_VPSRAQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22564, 225},
+ {I_VPSRAQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22572, 225},
+ {I_VPSRAQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22580, 225},
+ {I_VPSRAQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22588, 226},
+ {I_VPSRAQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22596, 226},
+ {I_VPSRAQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6450, 225},
+ {I_VPSRAQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6459, 225},
+ {I_VPSRAQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6468, 225},
+ {I_VPSRAQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6477, 225},
+ {I_VPSRAQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6486, 226},
+ {I_VPSRAQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6495, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAVQ[] = {
+ {I_VPSRAVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22652, 225},
+ {I_VPSRAVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22660, 225},
+ {I_VPSRAVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22668, 225},
+ {I_VPSRAVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22676, 225},
+ {I_VPSRAVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22684, 226},
+ {I_VPSRAVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22692, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRAVW[] = {
+ {I_VPSRAVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22700, 229},
+ {I_VPSRAVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22708, 229},
+ {I_VPSRAVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22716, 229},
+ {I_VPSRAVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22724, 229},
+ {I_VPSRAVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22732, 230},
+ {I_VPSRAVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22740, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSRLVW[] = {
+ {I_VPSRLVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22988, 229},
+ {I_VPSRLVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22996, 229},
+ {I_VPSRLVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23004, 229},
+ {I_VPSRLVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23012, 229},
+ {I_VPSRLVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23020, 230},
+ {I_VPSRLVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23028, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTERNLOGD[] = {
+ {I_VPTERNLOGD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6774, 225},
+ {I_VPTERNLOGD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6783, 225},
+ {I_VPTERNLOGD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6792, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTERNLOGQ[] = {
+ {I_VPTERNLOGQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6801, 225},
+ {I_VPTERNLOGQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6810, 225},
+ {I_VPTERNLOGQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6819, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTMB[] = {
+ {I_VPTESTMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23468, 229},
+ {I_VPTESTMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23476, 229},
+ {I_VPTESTMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23484, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTMD[] = {
+ {I_VPTESTMD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23492, 225},
+ {I_VPTESTMD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23500, 225},
+ {I_VPTESTMD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23508, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTMQ[] = {
+ {I_VPTESTMQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23516, 225},
+ {I_VPTESTMQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23524, 225},
+ {I_VPTESTMQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23532, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTMW[] = {
+ {I_VPTESTMW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23540, 229},
+ {I_VPTESTMW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23548, 229},
+ {I_VPTESTMW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23556, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTNMB[] = {
+ {I_VPTESTNMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23564, 229},
+ {I_VPTESTNMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23572, 229},
+ {I_VPTESTNMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23580, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTNMD[] = {
+ {I_VPTESTNMD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23588, 225},
+ {I_VPTESTNMD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23596, 225},
+ {I_VPTESTNMD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23604, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTNMQ[] = {
+ {I_VPTESTNMQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23612, 225},
+ {I_VPTESTNMQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23620, 225},
+ {I_VPTESTNMQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23628, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPTESTNMW[] = {
+ {I_VPTESTNMW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23636, 229},
+ {I_VPTESTNMW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23644, 229},
+ {I_VPTESTNMW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23652, 230},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPXORD[] = {
+ {I_VPXORD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24044, 225},
+ {I_VPXORD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24052, 225},
+ {I_VPXORD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24060, 225},
+ {I_VPXORD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24068, 225},
+ {I_VPXORD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24076, 226},
+ {I_VPXORD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24084, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPXORQ[] = {
+ {I_VPXORQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24092, 225},
+ {I_VPXORQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24100, 225},
+ {I_VPXORQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24108, 225},
+ {I_VPXORQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24116, 225},
+ {I_VPXORQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24124, 226},
+ {I_VPXORQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24132, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRANGEPD[] = {
+ {I_VRANGEPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6828, 227},
+ {I_VRANGEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6837, 227},
+ {I_VRANGEPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6846, 227},
+ {I_VRANGEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6855, 227},
+ {I_VRANGEPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+6864, 228},
+ {I_VRANGEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+6873, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRANGEPS[] = {
+ {I_VRANGEPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6882, 227},
+ {I_VRANGEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6891, 227},
+ {I_VRANGEPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6900, 227},
+ {I_VRANGEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6909, 227},
+ {I_VRANGEPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+6918, 228},
+ {I_VRANGEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+6927, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRANGESD[] = {
+ {I_VRANGESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+6936, 228},
+ {I_VRANGESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+6945, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRANGESS[] = {
+ {I_VRANGESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+6954, 228},
+ {I_VRANGESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+6963, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP14PD[] = {
+ {I_VRCP14PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24140, 225},
+ {I_VRCP14PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24148, 225},
+ {I_VRCP14PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24156, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP14PS[] = {
+ {I_VRCP14PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24164, 225},
+ {I_VRCP14PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24172, 225},
+ {I_VRCP14PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24180, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP14SD[] = {
+ {I_VRCP14SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24188, 226},
+ {I_VRCP14SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24196, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP14SS[] = {
+ {I_VRCP14SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24204, 226},
+ {I_VRCP14SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24212, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP28PD[] = {
+ {I_VRCP28PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+24220, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP28PS[] = {
+ {I_VRCP28PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+24228, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP28SD[] = {
+ {I_VRCP28SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24236, 231},
+ {I_VRCP28SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24244, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRCP28SS[] = {
+ {I_VRCP28SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24252, 231},
+ {I_VRCP28SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24260, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VREDUCEPD[] = {
+ {I_VREDUCEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6972, 227},
+ {I_VREDUCEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6981, 227},
+ {I_VREDUCEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+6990, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VREDUCEPS[] = {
+ {I_VREDUCEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6999, 227},
+ {I_VREDUCEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7008, 227},
+ {I_VREDUCEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+7017, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VREDUCESD[] = {
+ {I_VREDUCESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7026, 228},
+ {I_VREDUCESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7035, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VREDUCESS[] = {
+ {I_VREDUCESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7044, 228},
+ {I_VREDUCESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7053, 228},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRNDSCALEPD[] = {
+ {I_VRNDSCALEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7062, 225},
+ {I_VRNDSCALEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7071, 225},
+ {I_VRNDSCALEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+7080, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRNDSCALEPS[] = {
+ {I_VRNDSCALEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7089, 225},
+ {I_VRNDSCALEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7098, 225},
+ {I_VRNDSCALEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+7107, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRNDSCALESD[] = {
+ {I_VRNDSCALESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7116, 226},
+ {I_VRNDSCALESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7125, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRNDSCALESS[] = {
+ {I_VRNDSCALESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7134, 226},
+ {I_VRNDSCALESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7143, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT14PD[] = {
+ {I_VRSQRT14PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24268, 225},
+ {I_VRSQRT14PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24276, 225},
+ {I_VRSQRT14PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24284, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT14PS[] = {
+ {I_VRSQRT14PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24292, 225},
+ {I_VRSQRT14PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24300, 225},
+ {I_VRSQRT14PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24308, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT14SD[] = {
+ {I_VRSQRT14SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24316, 226},
+ {I_VRSQRT14SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24324, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT14SS[] = {
+ {I_VRSQRT14SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24332, 226},
+ {I_VRSQRT14SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24340, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT28PD[] = {
+ {I_VRSQRT28PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+24348, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT28PS[] = {
+ {I_VRSQRT28PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+24356, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT28SD[] = {
+ {I_VRSQRT28SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24364, 231},
+ {I_VRSQRT28SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24372, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VRSQRT28SS[] = {
+ {I_VRSQRT28SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24380, 231},
+ {I_VRSQRT28SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24388, 231},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCALEFPD[] = {
+ {I_VSCALEFPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24396, 225},
+ {I_VSCALEFPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24404, 225},
+ {I_VSCALEFPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24412, 225},
+ {I_VSCALEFPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24420, 225},
+ {I_VSCALEFPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+24428, 226},
+ {I_VSCALEFPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24436, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCALEFPS[] = {
+ {I_VSCALEFPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24444, 225},
+ {I_VSCALEFPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24452, 225},
+ {I_VSCALEFPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24460, 225},
+ {I_VSCALEFPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24468, 225},
+ {I_VSCALEFPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+24476, 226},
+ {I_VSCALEFPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24484, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCALEFSD[] = {
+ {I_VSCALEFSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24492, 226},
+ {I_VSCALEFSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24500, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCALEFSS[] = {
+ {I_VSCALEFSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24508, 226},
+ {I_VSCALEFSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24516, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERDPD[] = {
+ {I_VSCATTERDPD, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7152, 225},
+ {I_VSCATTERDPD, 2, {XMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7161, 225},
+ {I_VSCATTERDPD, 2, {YMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7170, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERDPS[] = {
+ {I_VSCATTERDPS, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7179, 225},
+ {I_VSCATTERDPS, 2, {YMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7188, 225},
+ {I_VSCATTERDPS, 2, {ZMEM|BITS32,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7197, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF0DPD[] = {
+ {I_VSCATTERPF0DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7206, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF0DPS[] = {
+ {I_VSCATTERPF0DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7215, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF0QPD[] = {
+ {I_VSCATTERPF0QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7224, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF0QPS[] = {
+ {I_VSCATTERPF0QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7233, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF1DPD[] = {
+ {I_VSCATTERPF1DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7242, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF1DPS[] = {
+ {I_VSCATTERPF1DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7251, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF1QPD[] = {
+ {I_VSCATTERPF1QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7260, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERPF1QPS[] = {
+ {I_VSCATTERPF1QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7269, 232},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERQPD[] = {
+ {I_VSCATTERQPD, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7278, 225},
+ {I_VSCATTERQPD, 2, {YMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7287, 225},
+ {I_VSCATTERQPD, 2, {ZMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7296, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSCATTERQPS[] = {
+ {I_VSCATTERQPS, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7305, 225},
+ {I_VSCATTERQPS, 2, {YMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7314, 225},
+ {I_VSCATTERQPS, 2, {ZMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7323, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFF32X4[] = {
+ {I_VSHUFF32X4, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7332, 225},
+ {I_VSHUFF32X4, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7341, 225},
+ {I_VSHUFF32X4, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7350, 226},
+ {I_VSHUFF32X4, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7359, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFF64X2[] = {
+ {I_VSHUFF64X2, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7368, 225},
+ {I_VSHUFF64X2, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7377, 225},
+ {I_VSHUFF64X2, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7386, 226},
+ {I_VSHUFF64X2, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7395, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFI32X4[] = {
+ {I_VSHUFI32X4, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7404, 225},
+ {I_VSHUFI32X4, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7413, 225},
+ {I_VSHUFI32X4, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7422, 226},
+ {I_VSHUFI32X4, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7431, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VSHUFI64X2[] = {
+ {I_VSHUFI64X2, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7440, 225},
+ {I_VSHUFI64X2, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7449, 225},
+ {I_VSHUFI64X2, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7458, 226},
+ {I_VSHUFI64X2, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7467, 226},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDPKRU[] = {
+ {I_RDPKRU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40506, 239},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WRPKRU[] = {
+ {I_WRPKRU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40511, 239},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_RDPID[] = {
+ {I_RDPID, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34932, 240},
+ {I_RDPID, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34931, 239},
+ {I_RDPID, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34932, 241},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLFLUSHOPT[] = {
+ {I_CLFLUSHOPT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37528, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLWB[] = {
+ {I_CLWB, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37534, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCOMMIT[] = {
+ {I_PCOMMIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37540, 242},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLZERO[] = {
+ {I_CLZERO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40516, 243},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PTWRITE[] = {
+ {I_PTWRITE, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26840, 133},
+ {I_PTWRITE, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26839, 239},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CLDEMOTE[] = {
+ {I_CLDEMOTE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37546, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDIRI[] = {
+ {I_MOVDIRI, 2, {MEMORY|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34938, 244},
+ {I_MOVDIRI, 2, {MEMORY|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34945, 245},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_MOVDIR64B[] = {
+ {I_MOVDIR64B, 2, {REG_GPR|BITS16,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25036, 240},
+ {I_MOVDIR64B, 2, {REG_GPR|BITS32,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25044, 133},
+ {I_MOVDIR64B, 2, {REG_GPR|BITS64,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25052, 239},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_PCONFIG[] = {
+ {I_PCONFIG, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37552, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_TPAUSE[] = {
+ {I_TPAUSE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37534, 133},
+ {I_TPAUSE, 3, {REG_GPR|BITS32,REG_EDX,REG_EAX,0,0}, NO_DECORATOR, nasm_bytecodes+37534, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UMONITOR[] = {
+ {I_UMONITOR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34952, 240},
+ {I_UMONITOR, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34959, 133},
+ {I_UMONITOR, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34966, 239},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_UMWAIT[] = {
+ {I_UMWAIT, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37558, 133},
+ {I_UMWAIT, 3, {REG_GPR|BITS32,REG_EDX,REG_EAX,0,0}, NO_DECORATOR, nasm_bytecodes+37558, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_WBNOINVD[] = {
+ {I_WBNOINVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40521, 133},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_GF2P8AFFINEINVQB[] = {
+ {I_GF2P8AFFINEINVQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25060, 246},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGF2P8AFFINEINVQB[] = {
+ {I_VGF2P8AFFINEINVQB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25068, 247},
+ {I_VGF2P8AFFINEINVQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25076, 247},
+ {I_VGF2P8AFFINEINVQB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25084, 247},
+ {I_VGF2P8AFFINEINVQB, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25092, 247},
+ {I_VGF2P8AFFINEINVQB, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7584, 248},
+ {I_VGF2P8AFFINEINVQB, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7593, 248},
+ {I_VGF2P8AFFINEINVQB, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7602, 248},
+ {I_VGF2P8AFFINEINVQB, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7611, 248},
+ {I_VGF2P8AFFINEINVQB, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7620, 249},
+ {I_VGF2P8AFFINEINVQB, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7629, 249},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_GF2P8AFFINEQB[] = {
+ {I_GF2P8AFFINEQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25100, 246},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGF2P8AFFINEQB[] = {
+ {I_VGF2P8AFFINEQB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25108, 247},
+ {I_VGF2P8AFFINEQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25116, 247},
+ {I_VGF2P8AFFINEQB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25124, 247},
+ {I_VGF2P8AFFINEQB, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25132, 247},
+ {I_VGF2P8AFFINEQB, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7638, 248},
+ {I_VGF2P8AFFINEQB, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7647, 248},
+ {I_VGF2P8AFFINEQB, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7656, 248},
+ {I_VGF2P8AFFINEQB, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7665, 248},
+ {I_VGF2P8AFFINEQB, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7674, 249},
+ {I_VGF2P8AFFINEQB, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7683, 249},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_GF2P8MULB[] = {
+ {I_GF2P8MULB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34973, 246},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VGF2P8MULB[] = {
+ {I_VGF2P8MULB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34980, 247},
+ {I_VGF2P8MULB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34987, 247},
+ {I_VGF2P8MULB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34994, 247},
+ {I_VGF2P8MULB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+35001, 247},
+ {I_VGF2P8MULB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25140, 248},
+ {I_VGF2P8MULB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25148, 248},
+ {I_VGF2P8MULB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25156, 248},
+ {I_VGF2P8MULB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25164, 248},
+ {I_VGF2P8MULB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25172, 249},
+ {I_VGF2P8MULB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25180, 249},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMPRESSB[] = {
+ {I_VPCOMPRESSB, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25188, 250},
+ {I_VPCOMPRESSB, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25196, 250},
+ {I_VPCOMPRESSB, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25204, 251},
+ {I_VPCOMPRESSB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25212, 250},
+ {I_VPCOMPRESSB, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25220, 250},
+ {I_VPCOMPRESSB, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25228, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPCOMPRESSW[] = {
+ {I_VPCOMPRESSW, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25236, 250},
+ {I_VPCOMPRESSW, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25244, 250},
+ {I_VPCOMPRESSW, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25252, 251},
+ {I_VPCOMPRESSW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25260, 250},
+ {I_VPCOMPRESSW, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25268, 250},
+ {I_VPCOMPRESSW, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25276, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXPANDB[] = {
+ {I_VPEXPANDB, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25284, 250},
+ {I_VPEXPANDB, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25292, 250},
+ {I_VPEXPANDB, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25300, 251},
+ {I_VPEXPANDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25308, 250},
+ {I_VPEXPANDB, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25316, 250},
+ {I_VPEXPANDB, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25324, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPEXPANDW[] = {
+ {I_VPEXPANDW, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25332, 250},
+ {I_VPEXPANDW, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25340, 250},
+ {I_VPEXPANDW, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25348, 251},
+ {I_VPEXPANDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25356, 250},
+ {I_VPEXPANDW, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25364, 250},
+ {I_VPEXPANDW, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25372, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDW[] = {
+ {I_VPSHLDW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7692, 250},
+ {I_VPSHLDW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7701, 250},
+ {I_VPSHLDW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7710, 250},
+ {I_VPSHLDW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7719, 250},
+ {I_VPSHLDW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7728, 251},
+ {I_VPSHLDW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7737, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDD[] = {
+ {I_VPSHLDD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7746, 250},
+ {I_VPSHLDD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7755, 250},
+ {I_VPSHLDD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7764, 250},
+ {I_VPSHLDD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7773, 250},
+ {I_VPSHLDD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7782, 251},
+ {I_VPSHLDD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7791, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDQ[] = {
+ {I_VPSHLDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7800, 250},
+ {I_VPSHLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7809, 250},
+ {I_VPSHLDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7818, 250},
+ {I_VPSHLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7827, 250},
+ {I_VPSHLDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7836, 251},
+ {I_VPSHLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7845, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDVW[] = {
+ {I_VPSHLDVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7854, 250},
+ {I_VPSHLDVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7863, 250},
+ {I_VPSHLDVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7872, 250},
+ {I_VPSHLDVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7881, 250},
+ {I_VPSHLDVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7890, 251},
+ {I_VPSHLDVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7899, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDVD[] = {
+ {I_VPSHLDVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7908, 250},
+ {I_VPSHLDVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7917, 250},
+ {I_VPSHLDVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7926, 250},
+ {I_VPSHLDVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7935, 250},
+ {I_VPSHLDVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7944, 251},
+ {I_VPSHLDVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7953, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHLDVQ[] = {
+ {I_VPSHLDVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7962, 250},
+ {I_VPSHLDVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7971, 250},
+ {I_VPSHLDVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7980, 250},
+ {I_VPSHLDVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7989, 250},
+ {I_VPSHLDVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7998, 251},
+ {I_VPSHLDVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8007, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDW[] = {
+ {I_VPSHRDW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8016, 250},
+ {I_VPSHRDW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8025, 250},
+ {I_VPSHRDW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8034, 250},
+ {I_VPSHRDW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8043, 250},
+ {I_VPSHRDW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8052, 251},
+ {I_VPSHRDW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8061, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDD[] = {
+ {I_VPSHRDD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8070, 250},
+ {I_VPSHRDD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8079, 250},
+ {I_VPSHRDD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8088, 250},
+ {I_VPSHRDD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8097, 250},
+ {I_VPSHRDD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8106, 251},
+ {I_VPSHRDD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8115, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDQ[] = {
+ {I_VPSHRDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8124, 250},
+ {I_VPSHRDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8133, 250},
+ {I_VPSHRDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8142, 250},
+ {I_VPSHRDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8151, 250},
+ {I_VPSHRDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8160, 251},
+ {I_VPSHRDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8169, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDVW[] = {
+ {I_VPSHRDVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8178, 250},
+ {I_VPSHRDVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8187, 250},
+ {I_VPSHRDVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8196, 250},
+ {I_VPSHRDVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8205, 250},
+ {I_VPSHRDVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8214, 251},
+ {I_VPSHRDVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8223, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDVD[] = {
+ {I_VPSHRDVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8232, 250},
+ {I_VPSHRDVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8241, 250},
+ {I_VPSHRDVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8250, 250},
+ {I_VPSHRDVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8259, 250},
+ {I_VPSHRDVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8268, 251},
+ {I_VPSHRDVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8277, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHRDVQ[] = {
+ {I_VPSHRDVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8286, 250},
+ {I_VPSHRDVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8295, 250},
+ {I_VPSHRDVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8304, 250},
+ {I_VPSHRDVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8313, 250},
+ {I_VPSHRDVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8322, 251},
+ {I_VPSHRDVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8331, 251},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPDPBUSD[] = {
+ {I_VPDPBUSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25380, 252},
+ {I_VPDPBUSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25388, 252},
+ {I_VPDPBUSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25396, 252},
+ {I_VPDPBUSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25404, 252},
+ {I_VPDPBUSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25412, 253},
+ {I_VPDPBUSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25420, 253},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPDPBUSDS[] = {
+ {I_VPDPBUSDS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25428, 252},
+ {I_VPDPBUSDS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25436, 252},
+ {I_VPDPBUSDS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25444, 252},
+ {I_VPDPBUSDS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25452, 252},
+ {I_VPDPBUSDS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25460, 253},
+ {I_VPDPBUSDS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25468, 253},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPDPWSSD[] = {
+ {I_VPDPWSSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25476, 252},
+ {I_VPDPWSSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25484, 252},
+ {I_VPDPWSSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25492, 252},
+ {I_VPDPWSSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25500, 252},
+ {I_VPDPWSSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25508, 253},
+ {I_VPDPWSSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25516, 253},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPDPWSSDS[] = {
+ {I_VPDPWSSDS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25524, 252},
+ {I_VPDPWSSDS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25532, 252},
+ {I_VPDPWSSDS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25540, 252},
+ {I_VPDPWSSDS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25548, 252},
+ {I_VPDPWSSDS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25556, 253},
+ {I_VPDPWSSDS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25564, 253},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPOPCNTB[] = {
+ {I_VPOPCNTB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25572, 254},
+ {I_VPOPCNTB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25580, 254},
+ {I_VPOPCNTB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25588, 255},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPOPCNTW[] = {
+ {I_VPOPCNTW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25596, 254},
+ {I_VPOPCNTW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25604, 254},
+ {I_VPOPCNTW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25612, 255},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPOPCNTD[] = {
+ {I_VPOPCNTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25620, 256},
+ {I_VPOPCNTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25628, 256},
+ {I_VPOPCNTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25636, 257},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPOPCNTQ[] = {
+ {I_VPOPCNTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25644, 256},
+ {I_VPOPCNTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25652, 256},
+ {I_VPOPCNTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25660, 257},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_VPSHUFBITQMB[] = {
+ {I_VPSHUFBITQMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25668, 254},
+ {I_VPSHUFBITQMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25676, 254},
+ {I_VPSHUFBITQMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25684, 255},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4FMADDPS[] = {
+ {I_V4FMADDPS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25692, 258},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4FNMADDPS[] = {
+ {I_V4FNMADDPS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25700, 258},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4FMADDSS[] = {
+ {I_V4FMADDSS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25708, 258},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4FNMADDSS[] = {
+ {I_V4FNMADDSS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25716, 258},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4DPWSSDS[] = {
+ {I_V4DPWSSDS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25724, 259},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_V4DPWSSD[] = {
+ {I_V4DPWSSD, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25732, 259},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ENCLS[] = {
+ {I_ENCLS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37564, 260},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ENCLU[] = {
+ {I_ENCLU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37570, 260},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_ENCLV[] = {
+ {I_ENCLV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37576, 260},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP0[] = {
+ {I_HINT_NOP0, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37582, 261},
+ {I_HINT_NOP0, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37588, 261},
+ {I_HINT_NOP0, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37594, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP1[] = {
+ {I_HINT_NOP1, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37600, 261},
+ {I_HINT_NOP1, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37606, 261},
+ {I_HINT_NOP1, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37612, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP2[] = {
+ {I_HINT_NOP2, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37618, 261},
+ {I_HINT_NOP2, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37624, 261},
+ {I_HINT_NOP2, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37630, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP3[] = {
+ {I_HINT_NOP3, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37636, 261},
+ {I_HINT_NOP3, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37642, 261},
+ {I_HINT_NOP3, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37648, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP4[] = {
+ {I_HINT_NOP4, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37654, 261},
+ {I_HINT_NOP4, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37660, 261},
+ {I_HINT_NOP4, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37666, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP5[] = {
+ {I_HINT_NOP5, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37672, 261},
+ {I_HINT_NOP5, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37678, 261},
+ {I_HINT_NOP5, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37684, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP6[] = {
+ {I_HINT_NOP6, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37690, 261},
+ {I_HINT_NOP6, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37696, 261},
+ {I_HINT_NOP6, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37702, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP7[] = {
+ {I_HINT_NOP7, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37708, 261},
+ {I_HINT_NOP7, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37714, 261},
+ {I_HINT_NOP7, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37720, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP8[] = {
+ {I_HINT_NOP8, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37726, 261},
+ {I_HINT_NOP8, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37732, 261},
+ {I_HINT_NOP8, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37738, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP9[] = {
+ {I_HINT_NOP9, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37744, 261},
+ {I_HINT_NOP9, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37750, 261},
+ {I_HINT_NOP9, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37756, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP10[] = {
+ {I_HINT_NOP10, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37762, 261},
+ {I_HINT_NOP10, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37768, 261},
+ {I_HINT_NOP10, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37774, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP11[] = {
+ {I_HINT_NOP11, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37780, 261},
+ {I_HINT_NOP11, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37786, 261},
+ {I_HINT_NOP11, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37792, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP12[] = {
+ {I_HINT_NOP12, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37798, 261},
+ {I_HINT_NOP12, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37804, 261},
+ {I_HINT_NOP12, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37810, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP13[] = {
+ {I_HINT_NOP13, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37816, 261},
+ {I_HINT_NOP13, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37822, 261},
+ {I_HINT_NOP13, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37828, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP14[] = {
+ {I_HINT_NOP14, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37834, 261},
+ {I_HINT_NOP14, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37840, 261},
+ {I_HINT_NOP14, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37846, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP15[] = {
+ {I_HINT_NOP15, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37852, 261},
+ {I_HINT_NOP15, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37858, 261},
+ {I_HINT_NOP15, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37864, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP16[] = {
+ {I_HINT_NOP16, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37870, 261},
+ {I_HINT_NOP16, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37876, 261},
+ {I_HINT_NOP16, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37882, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP17[] = {
+ {I_HINT_NOP17, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37888, 261},
+ {I_HINT_NOP17, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37894, 261},
+ {I_HINT_NOP17, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37900, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP18[] = {
+ {I_HINT_NOP18, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37906, 261},
+ {I_HINT_NOP18, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37912, 261},
+ {I_HINT_NOP18, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37918, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP19[] = {
+ {I_HINT_NOP19, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37924, 261},
+ {I_HINT_NOP19, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37930, 261},
+ {I_HINT_NOP19, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37936, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP20[] = {
+ {I_HINT_NOP20, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37942, 261},
+ {I_HINT_NOP20, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37948, 261},
+ {I_HINT_NOP20, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37954, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP21[] = {
+ {I_HINT_NOP21, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37960, 261},
+ {I_HINT_NOP21, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37966, 261},
+ {I_HINT_NOP21, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37972, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP22[] = {
+ {I_HINT_NOP22, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37978, 261},
+ {I_HINT_NOP22, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37984, 261},
+ {I_HINT_NOP22, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37990, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP23[] = {
+ {I_HINT_NOP23, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37996, 261},
+ {I_HINT_NOP23, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38002, 261},
+ {I_HINT_NOP23, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38008, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP24[] = {
+ {I_HINT_NOP24, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38014, 261},
+ {I_HINT_NOP24, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38020, 261},
+ {I_HINT_NOP24, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38026, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP25[] = {
+ {I_HINT_NOP25, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38032, 261},
+ {I_HINT_NOP25, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38038, 261},
+ {I_HINT_NOP25, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38044, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP26[] = {
+ {I_HINT_NOP26, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38050, 261},
+ {I_HINT_NOP26, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38056, 261},
+ {I_HINT_NOP26, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38062, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP27[] = {
+ {I_HINT_NOP27, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38068, 261},
+ {I_HINT_NOP27, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38074, 261},
+ {I_HINT_NOP27, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38080, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP28[] = {
+ {I_HINT_NOP28, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38086, 261},
+ {I_HINT_NOP28, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38092, 261},
+ {I_HINT_NOP28, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38098, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP29[] = {
+ {I_HINT_NOP29, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38104, 261},
+ {I_HINT_NOP29, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38110, 261},
+ {I_HINT_NOP29, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38116, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP30[] = {
+ {I_HINT_NOP30, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38122, 261},
+ {I_HINT_NOP30, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38128, 261},
+ {I_HINT_NOP30, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38134, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP31[] = {
+ {I_HINT_NOP31, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38140, 261},
+ {I_HINT_NOP31, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38146, 261},
+ {I_HINT_NOP31, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38152, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP32[] = {
+ {I_HINT_NOP32, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38158, 261},
+ {I_HINT_NOP32, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38164, 261},
+ {I_HINT_NOP32, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38170, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP33[] = {
+ {I_HINT_NOP33, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38176, 261},
+ {I_HINT_NOP33, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38182, 261},
+ {I_HINT_NOP33, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38188, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP34[] = {
+ {I_HINT_NOP34, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38194, 261},
+ {I_HINT_NOP34, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38200, 261},
+ {I_HINT_NOP34, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38206, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP35[] = {
+ {I_HINT_NOP35, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38212, 261},
+ {I_HINT_NOP35, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38218, 261},
+ {I_HINT_NOP35, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38224, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP36[] = {
+ {I_HINT_NOP36, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38230, 261},
+ {I_HINT_NOP36, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38236, 261},
+ {I_HINT_NOP36, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38242, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP37[] = {
+ {I_HINT_NOP37, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38248, 261},
+ {I_HINT_NOP37, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38254, 261},
+ {I_HINT_NOP37, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38260, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP38[] = {
+ {I_HINT_NOP38, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38266, 261},
+ {I_HINT_NOP38, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38272, 261},
+ {I_HINT_NOP38, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38278, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP39[] = {
+ {I_HINT_NOP39, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38284, 261},
+ {I_HINT_NOP39, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38290, 261},
+ {I_HINT_NOP39, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38296, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP40[] = {
+ {I_HINT_NOP40, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38302, 261},
+ {I_HINT_NOP40, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38308, 261},
+ {I_HINT_NOP40, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38314, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP41[] = {
+ {I_HINT_NOP41, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38320, 261},
+ {I_HINT_NOP41, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38326, 261},
+ {I_HINT_NOP41, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38332, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP42[] = {
+ {I_HINT_NOP42, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38338, 261},
+ {I_HINT_NOP42, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38344, 261},
+ {I_HINT_NOP42, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38350, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP43[] = {
+ {I_HINT_NOP43, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38356, 261},
+ {I_HINT_NOP43, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38362, 261},
+ {I_HINT_NOP43, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38368, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP44[] = {
+ {I_HINT_NOP44, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38374, 261},
+ {I_HINT_NOP44, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38380, 261},
+ {I_HINT_NOP44, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38386, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP45[] = {
+ {I_HINT_NOP45, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38392, 261},
+ {I_HINT_NOP45, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38398, 261},
+ {I_HINT_NOP45, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38404, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP46[] = {
+ {I_HINT_NOP46, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38410, 261},
+ {I_HINT_NOP46, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38416, 261},
+ {I_HINT_NOP46, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38422, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP47[] = {
+ {I_HINT_NOP47, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38428, 261},
+ {I_HINT_NOP47, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38434, 261},
+ {I_HINT_NOP47, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38440, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP48[] = {
+ {I_HINT_NOP48, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38446, 261},
+ {I_HINT_NOP48, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38452, 261},
+ {I_HINT_NOP48, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38458, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP49[] = {
+ {I_HINT_NOP49, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38464, 261},
+ {I_HINT_NOP49, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38470, 261},
+ {I_HINT_NOP49, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38476, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP50[] = {
+ {I_HINT_NOP50, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38482, 261},
+ {I_HINT_NOP50, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38488, 261},
+ {I_HINT_NOP50, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38494, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP51[] = {
+ {I_HINT_NOP51, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38500, 261},
+ {I_HINT_NOP51, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38506, 261},
+ {I_HINT_NOP51, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38512, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP52[] = {
+ {I_HINT_NOP52, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38518, 261},
+ {I_HINT_NOP52, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38524, 261},
+ {I_HINT_NOP52, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38530, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP53[] = {
+ {I_HINT_NOP53, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38536, 261},
+ {I_HINT_NOP53, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38542, 261},
+ {I_HINT_NOP53, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38548, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP54[] = {
+ {I_HINT_NOP54, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38554, 261},
+ {I_HINT_NOP54, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38560, 261},
+ {I_HINT_NOP54, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38566, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP55[] = {
+ {I_HINT_NOP55, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38572, 261},
+ {I_HINT_NOP55, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38578, 261},
+ {I_HINT_NOP55, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38584, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP56[] = {
+ {I_HINT_NOP56, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35698, 261},
+ {I_HINT_NOP56, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35704, 261},
+ {I_HINT_NOP56, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35710, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP57[] = {
+ {I_HINT_NOP57, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38590, 261},
+ {I_HINT_NOP57, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38596, 261},
+ {I_HINT_NOP57, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38602, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP58[] = {
+ {I_HINT_NOP58, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38608, 261},
+ {I_HINT_NOP58, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38614, 261},
+ {I_HINT_NOP58, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38620, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP59[] = {
+ {I_HINT_NOP59, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38626, 261},
+ {I_HINT_NOP59, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38632, 261},
+ {I_HINT_NOP59, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38638, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP60[] = {
+ {I_HINT_NOP60, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38644, 261},
+ {I_HINT_NOP60, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38650, 261},
+ {I_HINT_NOP60, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38656, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP61[] = {
+ {I_HINT_NOP61, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38662, 261},
+ {I_HINT_NOP61, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38668, 261},
+ {I_HINT_NOP61, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38674, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP62[] = {
+ {I_HINT_NOP62, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38680, 261},
+ {I_HINT_NOP62, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38686, 261},
+ {I_HINT_NOP62, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38692, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_HINT_NOP63[] = {
+ {I_HINT_NOP63, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38698, 261},
+ {I_HINT_NOP63, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38704, 261},
+ {I_HINT_NOP63, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38710, 262},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_CMOVcc[] = {
+ {I_CMOVcc, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26720, 118},
+ {I_CMOVcc, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26720, 86},
+ {I_CMOVcc, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26727, 118},
+ {I_CMOVcc, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26727, 86},
+ {I_CMOVcc, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26734, 10},
+ {I_CMOVcc, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26734, 7},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_Jcc[] = {
+ {I_Jcc, 1, {IMMEDIATE|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26741, 119},
+ {I_Jcc, 1, {IMMEDIATE|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26748, 27},
+ {I_Jcc, 1, {IMMEDIATE|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26755, 27},
+ {I_Jcc, 1, {IMMEDIATE|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26762, 28},
+ {I_Jcc, 1, {IMMEDIATE|SHORT,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40402, 25},
+ {I_Jcc, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40401, 25},
+ {I_Jcc, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26763, 119},
+ {I_Jcc, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26769, 25},
+ {I_Jcc, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40402, 25},
+ ITEMPLATE_END
+};
+
+static const struct itemplate instrux_SETcc[] = {
+ {I_SETcc, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36250, 21},
+ {I_SETcc, 1, {REG_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36250, 5},
+ ITEMPLATE_END
+};
+
+const struct itemplate * const nasm_instructions[] = {
+ instrux_DB,
+ instrux_DW,
+ instrux_DD,
+ instrux_DQ,
+ instrux_DT,
+ instrux_DO,
+ instrux_DY,
+ instrux_DZ,
+ instrux_RESB,
+ instrux_RESW,
+ instrux_RESD,
+ instrux_RESQ,
+ instrux_REST,
+ instrux_RESO,
+ instrux_RESY,
+ instrux_RESZ,
+ instrux_INCBIN,
+ instrux_AAA,
+ instrux_AAD,
+ instrux_AAM,
+ instrux_AAS,
+ instrux_ADC,
+ instrux_ADD,
+ instrux_AND,
+ instrux_ARPL,
+ instrux_BB0_RESET,
+ instrux_BB1_RESET,
+ instrux_BOUND,
+ instrux_BSF,
+ instrux_BSR,
+ instrux_BSWAP,
+ instrux_BT,
+ instrux_BTC,
+ instrux_BTR,
+ instrux_BTS,
+ instrux_CALL,
+ instrux_CBW,
+ instrux_CDQ,
+ instrux_CDQE,
+ instrux_CLC,
+ instrux_CLD,
+ instrux_CLI,
+ instrux_CLTS,
+ instrux_CMC,
+ instrux_CMP,
+ instrux_CMPSB,
+ instrux_CMPSD,
+ instrux_CMPSQ,
+ instrux_CMPSW,
+ instrux_CMPXCHG,
+ instrux_CMPXCHG486,
+ instrux_CMPXCHG8B,
+ instrux_CMPXCHG16B,
+ instrux_CPUID,
+ instrux_CPU_READ,
+ instrux_CPU_WRITE,
+ instrux_CQO,
+ instrux_CWD,
+ instrux_CWDE,
+ instrux_DAA,
+ instrux_DAS,
+ instrux_DEC,
+ instrux_DIV,
+ instrux_DMINT,
+ instrux_EMMS,
+ instrux_ENTER,
+ instrux_EQU,
+ instrux_F2XM1,
+ instrux_FABS,
+ instrux_FADD,
+ instrux_FADDP,
+ instrux_FBLD,
+ instrux_FBSTP,
+ instrux_FCHS,
+ instrux_FCLEX,
+ instrux_FCMOVB,
+ instrux_FCMOVBE,
+ instrux_FCMOVE,
+ instrux_FCMOVNB,
+ instrux_FCMOVNBE,
+ instrux_FCMOVNE,
+ instrux_FCMOVNU,
+ instrux_FCMOVU,
+ instrux_FCOM,
+ instrux_FCOMI,
+ instrux_FCOMIP,
+ instrux_FCOMP,
+ instrux_FCOMPP,
+ instrux_FCOS,
+ instrux_FDECSTP,
+ instrux_FDISI,
+ instrux_FDIV,
+ instrux_FDIVP,
+ instrux_FDIVR,
+ instrux_FDIVRP,
+ instrux_FEMMS,
+ instrux_FENI,
+ instrux_FFREE,
+ instrux_FFREEP,
+ instrux_FIADD,
+ instrux_FICOM,
+ instrux_FICOMP,
+ instrux_FIDIV,
+ instrux_FIDIVR,
+ instrux_FILD,
+ instrux_FIMUL,
+ instrux_FINCSTP,
+ instrux_FINIT,
+ instrux_FIST,
+ instrux_FISTP,
+ instrux_FISTTP,
+ instrux_FISUB,
+ instrux_FISUBR,
+ instrux_FLD,
+ instrux_FLD1,
+ instrux_FLDCW,
+ instrux_FLDENV,
+ instrux_FLDL2E,
+ instrux_FLDL2T,
+ instrux_FLDLG2,
+ instrux_FLDLN2,
+ instrux_FLDPI,
+ instrux_FLDZ,
+ instrux_FMUL,
+ instrux_FMULP,
+ instrux_FNCLEX,
+ instrux_FNDISI,
+ instrux_FNENI,
+ instrux_FNINIT,
+ instrux_FNOP,
+ instrux_FNSAVE,
+ instrux_FNSTCW,
+ instrux_FNSTENV,
+ instrux_FNSTSW,
+ instrux_FPATAN,
+ instrux_FPREM,
+ instrux_FPREM1,
+ instrux_FPTAN,
+ instrux_FRNDINT,
+ instrux_FRSTOR,
+ instrux_FSAVE,
+ instrux_FSCALE,
+ instrux_FSETPM,
+ instrux_FSIN,
+ instrux_FSINCOS,
+ instrux_FSQRT,
+ instrux_FST,
+ instrux_FSTCW,
+ instrux_FSTENV,
+ instrux_FSTP,
+ instrux_FSTSW,
+ instrux_FSUB,
+ instrux_FSUBP,
+ instrux_FSUBR,
+ instrux_FSUBRP,
+ instrux_FTST,
+ instrux_FUCOM,
+ instrux_FUCOMI,
+ instrux_FUCOMIP,
+ instrux_FUCOMP,
+ instrux_FUCOMPP,
+ instrux_FXAM,
+ instrux_FXCH,
+ instrux_FXTRACT,
+ instrux_FYL2X,
+ instrux_FYL2XP1,
+ instrux_HLT,
+ instrux_IBTS,
+ instrux_ICEBP,
+ instrux_IDIV,
+ instrux_IMUL,
+ instrux_IN,
+ instrux_INC,
+ instrux_INSB,
+ instrux_INSD,
+ instrux_INSW,
+ instrux_INT,
+ instrux_INT01,
+ instrux_INT1,
+ instrux_INT03,
+ instrux_INT3,
+ instrux_INTO,
+ instrux_INVD,
+ instrux_INVPCID,
+ instrux_INVLPG,
+ instrux_INVLPGA,
+ instrux_IRET,
+ instrux_IRETD,
+ instrux_IRETQ,
+ instrux_IRETW,
+ instrux_JCXZ,
+ instrux_JECXZ,
+ instrux_JRCXZ,
+ instrux_JMP,
+ instrux_JMPE,
+ instrux_LAHF,
+ instrux_LAR,
+ instrux_LDS,
+ instrux_LEA,
+ instrux_LEAVE,
+ instrux_LES,
+ instrux_LFENCE,
+ instrux_LFS,
+ instrux_LGDT,
+ instrux_LGS,
+ instrux_LIDT,
+ instrux_LLDT,
+ instrux_LMSW,
+ instrux_LOADALL,
+ instrux_LOADALL286,
+ instrux_LODSB,
+ instrux_LODSD,
+ instrux_LODSQ,
+ instrux_LODSW,
+ instrux_LOOP,
+ instrux_LOOPE,
+ instrux_LOOPNE,
+ instrux_LOOPNZ,
+ instrux_LOOPZ,
+ instrux_LSL,
+ instrux_LSS,
+ instrux_LTR,
+ instrux_MFENCE,
+ instrux_MONITOR,
+ instrux_MONITORX,
+ instrux_MOV,
+ instrux_MOVD,
+ instrux_MOVQ,
+ instrux_MOVSB,
+ instrux_MOVSD,
+ instrux_MOVSQ,
+ instrux_MOVSW,
+ instrux_MOVSX,
+ instrux_MOVSXD,
+ instrux_MOVZX,
+ instrux_MUL,
+ instrux_MWAIT,
+ instrux_MWAITX,
+ instrux_NEG,
+ instrux_NOP,
+ instrux_NOT,
+ instrux_OR,
+ instrux_OUT,
+ instrux_OUTSB,
+ instrux_OUTSD,
+ instrux_OUTSW,
+ instrux_PACKSSDW,
+ instrux_PACKSSWB,
+ instrux_PACKUSWB,
+ instrux_PADDB,
+ instrux_PADDD,
+ instrux_PADDSB,
+ instrux_PADDSIW,
+ instrux_PADDSW,
+ instrux_PADDUSB,
+ instrux_PADDUSW,
+ instrux_PADDW,
+ instrux_PAND,
+ instrux_PANDN,
+ instrux_PAUSE,
+ instrux_PAVEB,
+ instrux_PAVGUSB,
+ instrux_PCMPEQB,
+ instrux_PCMPEQD,
+ instrux_PCMPEQW,
+ instrux_PCMPGTB,
+ instrux_PCMPGTD,
+ instrux_PCMPGTW,
+ instrux_PDISTIB,
+ instrux_PF2ID,
+ instrux_PFACC,
+ instrux_PFADD,
+ instrux_PFCMPEQ,
+ instrux_PFCMPGE,
+ instrux_PFCMPGT,
+ instrux_PFMAX,
+ instrux_PFMIN,
+ instrux_PFMUL,
+ instrux_PFRCP,
+ instrux_PFRCPIT1,
+ instrux_PFRCPIT2,
+ instrux_PFRSQIT1,
+ instrux_PFRSQRT,
+ instrux_PFSUB,
+ instrux_PFSUBR,
+ instrux_PI2FD,
+ instrux_PMACHRIW,
+ instrux_PMADDWD,
+ instrux_PMAGW,
+ instrux_PMULHRIW,
+ instrux_PMULHRWA,
+ instrux_PMULHRWC,
+ instrux_PMULHW,
+ instrux_PMULLW,
+ instrux_PMVGEZB,
+ instrux_PMVLZB,
+ instrux_PMVNZB,
+ instrux_PMVZB,
+ instrux_POP,
+ instrux_POPA,
+ instrux_POPAD,
+ instrux_POPAW,
+ instrux_POPF,
+ instrux_POPFD,
+ instrux_POPFQ,
+ instrux_POPFW,
+ instrux_POR,
+ instrux_PREFETCH,
+ instrux_PREFETCHW,
+ instrux_PSLLD,
+ instrux_PSLLQ,
+ instrux_PSLLW,
+ instrux_PSRAD,
+ instrux_PSRAW,
+ instrux_PSRLD,
+ instrux_PSRLQ,
+ instrux_PSRLW,
+ instrux_PSUBB,
+ instrux_PSUBD,
+ instrux_PSUBSB,
+ instrux_PSUBSIW,
+ instrux_PSUBSW,
+ instrux_PSUBUSB,
+ instrux_PSUBUSW,
+ instrux_PSUBW,
+ instrux_PUNPCKHBW,
+ instrux_PUNPCKHDQ,
+ instrux_PUNPCKHWD,
+ instrux_PUNPCKLBW,
+ instrux_PUNPCKLDQ,
+ instrux_PUNPCKLWD,
+ instrux_PUSH,
+ instrux_PUSHA,
+ instrux_PUSHAD,
+ instrux_PUSHAW,
+ instrux_PUSHF,
+ instrux_PUSHFD,
+ instrux_PUSHFQ,
+ instrux_PUSHFW,
+ instrux_PXOR,
+ instrux_RCL,
+ instrux_RCR,
+ instrux_RDSHR,
+ instrux_RDMSR,
+ instrux_RDPMC,
+ instrux_RDTSC,
+ instrux_RDTSCP,
+ instrux_RET,
+ instrux_RETF,
+ instrux_RETN,
+ instrux_RETW,
+ instrux_RETFW,
+ instrux_RETNW,
+ instrux_RETD,
+ instrux_RETFD,
+ instrux_RETND,
+ instrux_RETQ,
+ instrux_RETFQ,
+ instrux_RETNQ,
+ instrux_ROL,
+ instrux_ROR,
+ instrux_RDM,
+ instrux_RSDC,
+ instrux_RSLDT,
+ instrux_RSM,
+ instrux_RSTS,
+ instrux_SAHF,
+ instrux_SAL,
+ instrux_SALC,
+ instrux_SAR,
+ instrux_SBB,
+ instrux_SCASB,
+ instrux_SCASD,
+ instrux_SCASQ,
+ instrux_SCASW,
+ instrux_SFENCE,
+ instrux_SGDT,
+ instrux_SHL,
+ instrux_SHLD,
+ instrux_SHR,
+ instrux_SHRD,
+ instrux_SIDT,
+ instrux_SLDT,
+ instrux_SKINIT,
+ instrux_SMI,
+ instrux_SMINT,
+ instrux_SMINTOLD,
+ instrux_SMSW,
+ instrux_STC,
+ instrux_STD,
+ instrux_STI,
+ instrux_STOSB,
+ instrux_STOSD,
+ instrux_STOSQ,
+ instrux_STOSW,
+ instrux_STR,
+ instrux_SUB,
+ instrux_SVDC,
+ instrux_SVLDT,
+ instrux_SVTS,
+ instrux_SWAPGS,
+ instrux_SYSCALL,
+ instrux_SYSENTER,
+ instrux_SYSEXIT,
+ instrux_SYSRET,
+ instrux_TEST,
+ instrux_UD0,
+ instrux_UD1,
+ instrux_UD2B,
+ instrux_UD2,
+ instrux_UD2A,
+ instrux_UMOV,
+ instrux_VERR,
+ instrux_VERW,
+ instrux_FWAIT,
+ instrux_WBINVD,
+ instrux_WRSHR,
+ instrux_WRMSR,
+ instrux_XADD,
+ instrux_XBTS,
+ instrux_XCHG,
+ instrux_XLATB,
+ instrux_XLAT,
+ instrux_XOR,
+ instrux_ADDPS,
+ instrux_ADDSS,
+ instrux_ANDNPS,
+ instrux_ANDPS,
+ instrux_CMPEQPS,
+ instrux_CMPEQSS,
+ instrux_CMPLEPS,
+ instrux_CMPLESS,
+ instrux_CMPLTPS,
+ instrux_CMPLTSS,
+ instrux_CMPNEQPS,
+ instrux_CMPNEQSS,
+ instrux_CMPNLEPS,
+ instrux_CMPNLESS,
+ instrux_CMPNLTPS,
+ instrux_CMPNLTSS,
+ instrux_CMPORDPS,
+ instrux_CMPORDSS,
+ instrux_CMPUNORDPS,
+ instrux_CMPUNORDSS,
+ instrux_CMPPS,
+ instrux_CMPSS,
+ instrux_COMISS,
+ instrux_CVTPI2PS,
+ instrux_CVTPS2PI,
+ instrux_CVTSI2SS,
+ instrux_CVTSS2SI,
+ instrux_CVTTPS2PI,
+ instrux_CVTTSS2SI,
+ instrux_DIVPS,
+ instrux_DIVSS,
+ instrux_LDMXCSR,
+ instrux_MAXPS,
+ instrux_MAXSS,
+ instrux_MINPS,
+ instrux_MINSS,
+ instrux_MOVAPS,
+ instrux_MOVHPS,
+ instrux_MOVLHPS,
+ instrux_MOVLPS,
+ instrux_MOVHLPS,
+ instrux_MOVMSKPS,
+ instrux_MOVNTPS,
+ instrux_MOVSS,
+ instrux_MOVUPS,
+ instrux_MULPS,
+ instrux_MULSS,
+ instrux_ORPS,
+ instrux_RCPPS,
+ instrux_RCPSS,
+ instrux_RSQRTPS,
+ instrux_RSQRTSS,
+ instrux_SHUFPS,
+ instrux_SQRTPS,
+ instrux_SQRTSS,
+ instrux_STMXCSR,
+ instrux_SUBPS,
+ instrux_SUBSS,
+ instrux_UCOMISS,
+ instrux_UNPCKHPS,
+ instrux_UNPCKLPS,
+ instrux_XORPS,
+ instrux_FXRSTOR,
+ instrux_FXRSTOR64,
+ instrux_FXSAVE,
+ instrux_FXSAVE64,
+ instrux_XGETBV,
+ instrux_XSETBV,
+ instrux_XSAVE,
+ instrux_XSAVE64,
+ instrux_XSAVEC,
+ instrux_XSAVEC64,
+ instrux_XSAVEOPT,
+ instrux_XSAVEOPT64,
+ instrux_XSAVES,
+ instrux_XSAVES64,
+ instrux_XRSTOR,
+ instrux_XRSTOR64,
+ instrux_XRSTORS,
+ instrux_XRSTORS64,
+ instrux_PREFETCHNTA,
+ instrux_PREFETCHT0,
+ instrux_PREFETCHT1,
+ instrux_PREFETCHT2,
+ instrux_MASKMOVQ,
+ instrux_MOVNTQ,
+ instrux_PAVGB,
+ instrux_PAVGW,
+ instrux_PEXTRW,
+ instrux_PINSRW,
+ instrux_PMAXSW,
+ instrux_PMAXUB,
+ instrux_PMINSW,
+ instrux_PMINUB,
+ instrux_PMOVMSKB,
+ instrux_PMULHUW,
+ instrux_PSADBW,
+ instrux_PSHUFW,
+ instrux_PF2IW,
+ instrux_PFNACC,
+ instrux_PFPNACC,
+ instrux_PI2FW,
+ instrux_PSWAPD,
+ instrux_MASKMOVDQU,
+ instrux_CLFLUSH,
+ instrux_MOVNTDQ,
+ instrux_MOVNTI,
+ instrux_MOVNTPD,
+ instrux_MOVDQA,
+ instrux_MOVDQU,
+ instrux_MOVDQ2Q,
+ instrux_MOVQ2DQ,
+ instrux_PADDQ,
+ instrux_PMULUDQ,
+ instrux_PSHUFD,
+ instrux_PSHUFHW,
+ instrux_PSHUFLW,
+ instrux_PSLLDQ,
+ instrux_PSRLDQ,
+ instrux_PSUBQ,
+ instrux_PUNPCKHQDQ,
+ instrux_PUNPCKLQDQ,
+ instrux_ADDPD,
+ instrux_ADDSD,
+ instrux_ANDNPD,
+ instrux_ANDPD,
+ instrux_CMPEQPD,
+ instrux_CMPEQSD,
+ instrux_CMPLEPD,
+ instrux_CMPLESD,
+ instrux_CMPLTPD,
+ instrux_CMPLTSD,
+ instrux_CMPNEQPD,
+ instrux_CMPNEQSD,
+ instrux_CMPNLEPD,
+ instrux_CMPNLESD,
+ instrux_CMPNLTPD,
+ instrux_CMPNLTSD,
+ instrux_CMPORDPD,
+ instrux_CMPORDSD,
+ instrux_CMPUNORDPD,
+ instrux_CMPUNORDSD,
+ instrux_CMPPD,
+ instrux_COMISD,
+ instrux_CVTDQ2PD,
+ instrux_CVTDQ2PS,
+ instrux_CVTPD2DQ,
+ instrux_CVTPD2PI,
+ instrux_CVTPD2PS,
+ instrux_CVTPI2PD,
+ instrux_CVTPS2DQ,
+ instrux_CVTPS2PD,
+ instrux_CVTSD2SI,
+ instrux_CVTSD2SS,
+ instrux_CVTSI2SD,
+ instrux_CVTSS2SD,
+ instrux_CVTTPD2PI,
+ instrux_CVTTPD2DQ,
+ instrux_CVTTPS2DQ,
+ instrux_CVTTSD2SI,
+ instrux_DIVPD,
+ instrux_DIVSD,
+ instrux_MAXPD,
+ instrux_MAXSD,
+ instrux_MINPD,
+ instrux_MINSD,
+ instrux_MOVAPD,
+ instrux_MOVHPD,
+ instrux_MOVLPD,
+ instrux_MOVMSKPD,
+ instrux_MOVUPD,
+ instrux_MULPD,
+ instrux_MULSD,
+ instrux_ORPD,
+ instrux_SHUFPD,
+ instrux_SQRTPD,
+ instrux_SQRTSD,
+ instrux_SUBPD,
+ instrux_SUBSD,
+ instrux_UCOMISD,
+ instrux_UNPCKHPD,
+ instrux_UNPCKLPD,
+ instrux_XORPD,
+ instrux_ADDSUBPD,
+ instrux_ADDSUBPS,
+ instrux_HADDPD,
+ instrux_HADDPS,
+ instrux_HSUBPD,
+ instrux_HSUBPS,
+ instrux_LDDQU,
+ instrux_MOVDDUP,
+ instrux_MOVSHDUP,
+ instrux_MOVSLDUP,
+ instrux_CLGI,
+ instrux_STGI,
+ instrux_VMCALL,
+ instrux_VMCLEAR,
+ instrux_VMFUNC,
+ instrux_VMLAUNCH,
+ instrux_VMLOAD,
+ instrux_VMMCALL,
+ instrux_VMPTRLD,
+ instrux_VMPTRST,
+ instrux_VMREAD,
+ instrux_VMRESUME,
+ instrux_VMRUN,
+ instrux_VMSAVE,
+ instrux_VMWRITE,
+ instrux_VMXOFF,
+ instrux_VMXON,
+ instrux_INVEPT,
+ instrux_INVVPID,
+ instrux_PABSB,
+ instrux_PABSW,
+ instrux_PABSD,
+ instrux_PALIGNR,
+ instrux_PHADDW,
+ instrux_PHADDD,
+ instrux_PHADDSW,
+ instrux_PHSUBW,
+ instrux_PHSUBD,
+ instrux_PHSUBSW,
+ instrux_PMADDUBSW,
+ instrux_PMULHRSW,
+ instrux_PSHUFB,
+ instrux_PSIGNB,
+ instrux_PSIGNW,
+ instrux_PSIGND,
+ instrux_EXTRQ,
+ instrux_INSERTQ,
+ instrux_MOVNTSD,
+ instrux_MOVNTSS,
+ instrux_LZCNT,
+ instrux_BLENDPD,
+ instrux_BLENDPS,
+ instrux_BLENDVPD,
+ instrux_BLENDVPS,
+ instrux_DPPD,
+ instrux_DPPS,
+ instrux_EXTRACTPS,
+ instrux_INSERTPS,
+ instrux_MOVNTDQA,
+ instrux_MPSADBW,
+ instrux_PACKUSDW,
+ instrux_PBLENDVB,
+ instrux_PBLENDW,
+ instrux_PCMPEQQ,
+ instrux_PEXTRB,
+ instrux_PEXTRD,
+ instrux_PEXTRQ,
+ instrux_PHMINPOSUW,
+ instrux_PINSRB,
+ instrux_PINSRD,
+ instrux_PINSRQ,
+ instrux_PMAXSB,
+ instrux_PMAXSD,
+ instrux_PMAXUD,
+ instrux_PMAXUW,
+ instrux_PMINSB,
+ instrux_PMINSD,
+ instrux_PMINUD,
+ instrux_PMINUW,
+ instrux_PMOVSXBW,
+ instrux_PMOVSXBD,
+ instrux_PMOVSXBQ,
+ instrux_PMOVSXWD,
+ instrux_PMOVSXWQ,
+ instrux_PMOVSXDQ,
+ instrux_PMOVZXBW,
+ instrux_PMOVZXBD,
+ instrux_PMOVZXBQ,
+ instrux_PMOVZXWD,
+ instrux_PMOVZXWQ,
+ instrux_PMOVZXDQ,
+ instrux_PMULDQ,
+ instrux_PMULLD,
+ instrux_PTEST,
+ instrux_ROUNDPD,
+ instrux_ROUNDPS,
+ instrux_ROUNDSD,
+ instrux_ROUNDSS,
+ instrux_CRC32,
+ instrux_PCMPESTRI,
+ instrux_PCMPESTRM,
+ instrux_PCMPISTRI,
+ instrux_PCMPISTRM,
+ instrux_PCMPGTQ,
+ instrux_POPCNT,
+ instrux_GETSEC,
+ instrux_PFRCPV,
+ instrux_PFRSQRTV,
+ instrux_MOVBE,
+ instrux_AESENC,
+ instrux_AESENCLAST,
+ instrux_AESDEC,
+ instrux_AESDECLAST,
+ instrux_AESIMC,
+ instrux_AESKEYGENASSIST,
+ instrux_VAESENC,
+ instrux_VAESENCLAST,
+ instrux_VAESDEC,
+ instrux_VAESDECLAST,
+ instrux_VAESIMC,
+ instrux_VAESKEYGENASSIST,
+ instrux_VADDPD,
+ instrux_VADDPS,
+ instrux_VADDSD,
+ instrux_VADDSS,
+ instrux_VADDSUBPD,
+ instrux_VADDSUBPS,
+ instrux_VANDPD,
+ instrux_VANDPS,
+ instrux_VANDNPD,
+ instrux_VANDNPS,
+ instrux_VBLENDPD,
+ instrux_VBLENDPS,
+ instrux_VBLENDVPD,
+ instrux_VBLENDVPS,
+ instrux_VBROADCASTSS,
+ instrux_VBROADCASTSD,
+ instrux_VBROADCASTF128,
+ instrux_VCMPEQ_OSPD,
+ instrux_VCMPEQPD,
+ instrux_VCMPLT_OSPD,
+ instrux_VCMPLTPD,
+ instrux_VCMPLE_OSPD,
+ instrux_VCMPLEPD,
+ instrux_VCMPUNORD_QPD,
+ instrux_VCMPUNORDPD,
+ instrux_VCMPNEQ_UQPD,
+ instrux_VCMPNEQPD,
+ instrux_VCMPNLT_USPD,
+ instrux_VCMPNLTPD,
+ instrux_VCMPNLE_USPD,
+ instrux_VCMPNLEPD,
+ instrux_VCMPORD_QPD,
+ instrux_VCMPORDPD,
+ instrux_VCMPEQ_UQPD,
+ instrux_VCMPNGE_USPD,
+ instrux_VCMPNGEPD,
+ instrux_VCMPNGT_USPD,
+ instrux_VCMPNGTPD,
+ instrux_VCMPFALSE_OQPD,
+ instrux_VCMPFALSEPD,
+ instrux_VCMPNEQ_OQPD,
+ instrux_VCMPGE_OSPD,
+ instrux_VCMPGEPD,
+ instrux_VCMPGT_OSPD,
+ instrux_VCMPGTPD,
+ instrux_VCMPTRUE_UQPD,
+ instrux_VCMPTRUEPD,
+ instrux_VCMPLT_OQPD,
+ instrux_VCMPLE_OQPD,
+ instrux_VCMPUNORD_SPD,
+ instrux_VCMPNEQ_USPD,
+ instrux_VCMPNLT_UQPD,
+ instrux_VCMPNLE_UQPD,
+ instrux_VCMPORD_SPD,
+ instrux_VCMPEQ_USPD,
+ instrux_VCMPNGE_UQPD,
+ instrux_VCMPNGT_UQPD,
+ instrux_VCMPFALSE_OSPD,
+ instrux_VCMPNEQ_OSPD,
+ instrux_VCMPGE_OQPD,
+ instrux_VCMPGT_OQPD,
+ instrux_VCMPTRUE_USPD,
+ instrux_VCMPPD,
+ instrux_VCMPEQ_OSPS,
+ instrux_VCMPEQPS,
+ instrux_VCMPLT_OSPS,
+ instrux_VCMPLTPS,
+ instrux_VCMPLE_OSPS,
+ instrux_VCMPLEPS,
+ instrux_VCMPUNORD_QPS,
+ instrux_VCMPUNORDPS,
+ instrux_VCMPNEQ_UQPS,
+ instrux_VCMPNEQPS,
+ instrux_VCMPNLT_USPS,
+ instrux_VCMPNLTPS,
+ instrux_VCMPNLE_USPS,
+ instrux_VCMPNLEPS,
+ instrux_VCMPORD_QPS,
+ instrux_VCMPORDPS,
+ instrux_VCMPEQ_UQPS,
+ instrux_VCMPNGE_USPS,
+ instrux_VCMPNGEPS,
+ instrux_VCMPNGT_USPS,
+ instrux_VCMPNGTPS,
+ instrux_VCMPFALSE_OQPS,
+ instrux_VCMPFALSEPS,
+ instrux_VCMPNEQ_OQPS,
+ instrux_VCMPGE_OSPS,
+ instrux_VCMPGEPS,
+ instrux_VCMPGT_OSPS,
+ instrux_VCMPGTPS,
+ instrux_VCMPTRUE_UQPS,
+ instrux_VCMPTRUEPS,
+ instrux_VCMPLT_OQPS,
+ instrux_VCMPLE_OQPS,
+ instrux_VCMPUNORD_SPS,
+ instrux_VCMPNEQ_USPS,
+ instrux_VCMPNLT_UQPS,
+ instrux_VCMPNLE_UQPS,
+ instrux_VCMPORD_SPS,
+ instrux_VCMPEQ_USPS,
+ instrux_VCMPNGE_UQPS,
+ instrux_VCMPNGT_UQPS,
+ instrux_VCMPFALSE_OSPS,
+ instrux_VCMPNEQ_OSPS,
+ instrux_VCMPGE_OQPS,
+ instrux_VCMPGT_OQPS,
+ instrux_VCMPTRUE_USPS,
+ instrux_VCMPPS,
+ instrux_VCMPEQ_OSSD,
+ instrux_VCMPEQSD,
+ instrux_VCMPLT_OSSD,
+ instrux_VCMPLTSD,
+ instrux_VCMPLE_OSSD,
+ instrux_VCMPLESD,
+ instrux_VCMPUNORD_QSD,
+ instrux_VCMPUNORDSD,
+ instrux_VCMPNEQ_UQSD,
+ instrux_VCMPNEQSD,
+ instrux_VCMPNLT_USSD,
+ instrux_VCMPNLTSD,
+ instrux_VCMPNLE_USSD,
+ instrux_VCMPNLESD,
+ instrux_VCMPORD_QSD,
+ instrux_VCMPORDSD,
+ instrux_VCMPEQ_UQSD,
+ instrux_VCMPNGE_USSD,
+ instrux_VCMPNGESD,
+ instrux_VCMPNGT_USSD,
+ instrux_VCMPNGTSD,
+ instrux_VCMPFALSE_OQSD,
+ instrux_VCMPFALSESD,
+ instrux_VCMPNEQ_OQSD,
+ instrux_VCMPGE_OSSD,
+ instrux_VCMPGESD,
+ instrux_VCMPGT_OSSD,
+ instrux_VCMPGTSD,
+ instrux_VCMPTRUE_UQSD,
+ instrux_VCMPTRUESD,
+ instrux_VCMPLT_OQSD,
+ instrux_VCMPLE_OQSD,
+ instrux_VCMPUNORD_SSD,
+ instrux_VCMPNEQ_USSD,
+ instrux_VCMPNLT_UQSD,
+ instrux_VCMPNLE_UQSD,
+ instrux_VCMPORD_SSD,
+ instrux_VCMPEQ_USSD,
+ instrux_VCMPNGE_UQSD,
+ instrux_VCMPNGT_UQSD,
+ instrux_VCMPFALSE_OSSD,
+ instrux_VCMPNEQ_OSSD,
+ instrux_VCMPGE_OQSD,
+ instrux_VCMPGT_OQSD,
+ instrux_VCMPTRUE_USSD,
+ instrux_VCMPSD,
+ instrux_VCMPEQ_OSSS,
+ instrux_VCMPEQSS,
+ instrux_VCMPLT_OSSS,
+ instrux_VCMPLTSS,
+ instrux_VCMPLE_OSSS,
+ instrux_VCMPLESS,
+ instrux_VCMPUNORD_QSS,
+ instrux_VCMPUNORDSS,
+ instrux_VCMPNEQ_UQSS,
+ instrux_VCMPNEQSS,
+ instrux_VCMPNLT_USSS,
+ instrux_VCMPNLTSS,
+ instrux_VCMPNLE_USSS,
+ instrux_VCMPNLESS,
+ instrux_VCMPORD_QSS,
+ instrux_VCMPORDSS,
+ instrux_VCMPEQ_UQSS,
+ instrux_VCMPNGE_USSS,
+ instrux_VCMPNGESS,
+ instrux_VCMPNGT_USSS,
+ instrux_VCMPNGTSS,
+ instrux_VCMPFALSE_OQSS,
+ instrux_VCMPFALSESS,
+ instrux_VCMPNEQ_OQSS,
+ instrux_VCMPGE_OSSS,
+ instrux_VCMPGESS,
+ instrux_VCMPGT_OSSS,
+ instrux_VCMPGTSS,
+ instrux_VCMPTRUE_UQSS,
+ instrux_VCMPTRUESS,
+ instrux_VCMPLT_OQSS,
+ instrux_VCMPLE_OQSS,
+ instrux_VCMPUNORD_SSS,
+ instrux_VCMPNEQ_USSS,
+ instrux_VCMPNLT_UQSS,
+ instrux_VCMPNLE_UQSS,
+ instrux_VCMPORD_SSS,
+ instrux_VCMPEQ_USSS,
+ instrux_VCMPNGE_UQSS,
+ instrux_VCMPNGT_UQSS,
+ instrux_VCMPFALSE_OSSS,
+ instrux_VCMPNEQ_OSSS,
+ instrux_VCMPGE_OQSS,
+ instrux_VCMPGT_OQSS,
+ instrux_VCMPTRUE_USSS,
+ instrux_VCMPSS,
+ instrux_VCOMISD,
+ instrux_VCOMISS,
+ instrux_VCVTDQ2PD,
+ instrux_VCVTDQ2PS,
+ instrux_VCVTPD2DQ,
+ instrux_VCVTPD2PS,
+ instrux_VCVTPS2DQ,
+ instrux_VCVTPS2PD,
+ instrux_VCVTSD2SI,
+ instrux_VCVTSD2SS,
+ instrux_VCVTSI2SD,
+ instrux_VCVTSI2SS,
+ instrux_VCVTSS2SD,
+ instrux_VCVTSS2SI,
+ instrux_VCVTTPD2DQ,
+ instrux_VCVTTPS2DQ,
+ instrux_VCVTTSD2SI,
+ instrux_VCVTTSS2SI,
+ instrux_VDIVPD,
+ instrux_VDIVPS,
+ instrux_VDIVSD,
+ instrux_VDIVSS,
+ instrux_VDPPD,
+ instrux_VDPPS,
+ instrux_VEXTRACTF128,
+ instrux_VEXTRACTPS,
+ instrux_VHADDPD,
+ instrux_VHADDPS,
+ instrux_VHSUBPD,
+ instrux_VHSUBPS,
+ instrux_VINSERTF128,
+ instrux_VINSERTPS,
+ instrux_VLDDQU,
+ instrux_VLDQQU,
+ instrux_VLDMXCSR,
+ instrux_VMASKMOVDQU,
+ instrux_VMASKMOVPS,
+ instrux_VMASKMOVPD,
+ instrux_VMAXPD,
+ instrux_VMAXPS,
+ instrux_VMAXSD,
+ instrux_VMAXSS,
+ instrux_VMINPD,
+ instrux_VMINPS,
+ instrux_VMINSD,
+ instrux_VMINSS,
+ instrux_VMOVAPD,
+ instrux_VMOVAPS,
+ instrux_VMOVD,
+ instrux_VMOVQ,
+ instrux_VMOVDDUP,
+ instrux_VMOVDQA,
+ instrux_VMOVQQA,
+ instrux_VMOVDQU,
+ instrux_VMOVQQU,
+ instrux_VMOVHLPS,
+ instrux_VMOVHPD,
+ instrux_VMOVHPS,
+ instrux_VMOVLHPS,
+ instrux_VMOVLPD,
+ instrux_VMOVLPS,
+ instrux_VMOVMSKPD,
+ instrux_VMOVMSKPS,
+ instrux_VMOVNTDQ,
+ instrux_VMOVNTQQ,
+ instrux_VMOVNTDQA,
+ instrux_VMOVNTPD,
+ instrux_VMOVNTPS,
+ instrux_VMOVSD,
+ instrux_VMOVSHDUP,
+ instrux_VMOVSLDUP,
+ instrux_VMOVSS,
+ instrux_VMOVUPD,
+ instrux_VMOVUPS,
+ instrux_VMPSADBW,
+ instrux_VMULPD,
+ instrux_VMULPS,
+ instrux_VMULSD,
+ instrux_VMULSS,
+ instrux_VORPD,
+ instrux_VORPS,
+ instrux_VPABSB,
+ instrux_VPABSW,
+ instrux_VPABSD,
+ instrux_VPACKSSWB,
+ instrux_VPACKSSDW,
+ instrux_VPACKUSWB,
+ instrux_VPACKUSDW,
+ instrux_VPADDB,
+ instrux_VPADDW,
+ instrux_VPADDD,
+ instrux_VPADDQ,
+ instrux_VPADDSB,
+ instrux_VPADDSW,
+ instrux_VPADDUSB,
+ instrux_VPADDUSW,
+ instrux_VPALIGNR,
+ instrux_VPAND,
+ instrux_VPANDN,
+ instrux_VPAVGB,
+ instrux_VPAVGW,
+ instrux_VPBLENDVB,
+ instrux_VPBLENDW,
+ instrux_VPCMPESTRI,
+ instrux_VPCMPESTRM,
+ instrux_VPCMPISTRI,
+ instrux_VPCMPISTRM,
+ instrux_VPCMPEQB,
+ instrux_VPCMPEQW,
+ instrux_VPCMPEQD,
+ instrux_VPCMPEQQ,
+ instrux_VPCMPGTB,
+ instrux_VPCMPGTW,
+ instrux_VPCMPGTD,
+ instrux_VPCMPGTQ,
+ instrux_VPERMILPD,
+ instrux_VPERMILPS,
+ instrux_VPERM2F128,
+ instrux_VPEXTRB,
+ instrux_VPEXTRW,
+ instrux_VPEXTRD,
+ instrux_VPEXTRQ,
+ instrux_VPHADDW,
+ instrux_VPHADDD,
+ instrux_VPHADDSW,
+ instrux_VPHMINPOSUW,
+ instrux_VPHSUBW,
+ instrux_VPHSUBD,
+ instrux_VPHSUBSW,
+ instrux_VPINSRB,
+ instrux_VPINSRW,
+ instrux_VPINSRD,
+ instrux_VPINSRQ,
+ instrux_VPMADDWD,
+ instrux_VPMADDUBSW,
+ instrux_VPMAXSB,
+ instrux_VPMAXSW,
+ instrux_VPMAXSD,
+ instrux_VPMAXUB,
+ instrux_VPMAXUW,
+ instrux_VPMAXUD,
+ instrux_VPMINSB,
+ instrux_VPMINSW,
+ instrux_VPMINSD,
+ instrux_VPMINUB,
+ instrux_VPMINUW,
+ instrux_VPMINUD,
+ instrux_VPMOVMSKB,
+ instrux_VPMOVSXBW,
+ instrux_VPMOVSXBD,
+ instrux_VPMOVSXBQ,
+ instrux_VPMOVSXWD,
+ instrux_VPMOVSXWQ,
+ instrux_VPMOVSXDQ,
+ instrux_VPMOVZXBW,
+ instrux_VPMOVZXBD,
+ instrux_VPMOVZXBQ,
+ instrux_VPMOVZXWD,
+ instrux_VPMOVZXWQ,
+ instrux_VPMOVZXDQ,
+ instrux_VPMULHUW,
+ instrux_VPMULHRSW,
+ instrux_VPMULHW,
+ instrux_VPMULLW,
+ instrux_VPMULLD,
+ instrux_VPMULUDQ,
+ instrux_VPMULDQ,
+ instrux_VPOR,
+ instrux_VPSADBW,
+ instrux_VPSHUFB,
+ instrux_VPSHUFD,
+ instrux_VPSHUFHW,
+ instrux_VPSHUFLW,
+ instrux_VPSIGNB,
+ instrux_VPSIGNW,
+ instrux_VPSIGND,
+ instrux_VPSLLDQ,
+ instrux_VPSRLDQ,
+ instrux_VPSLLW,
+ instrux_VPSLLD,
+ instrux_VPSLLQ,
+ instrux_VPSRAW,
+ instrux_VPSRAD,
+ instrux_VPSRLW,
+ instrux_VPSRLD,
+ instrux_VPSRLQ,
+ instrux_VPTEST,
+ instrux_VPSUBB,
+ instrux_VPSUBW,
+ instrux_VPSUBD,
+ instrux_VPSUBQ,
+ instrux_VPSUBSB,
+ instrux_VPSUBSW,
+ instrux_VPSUBUSB,
+ instrux_VPSUBUSW,
+ instrux_VPUNPCKHBW,
+ instrux_VPUNPCKHWD,
+ instrux_VPUNPCKHDQ,
+ instrux_VPUNPCKHQDQ,
+ instrux_VPUNPCKLBW,
+ instrux_VPUNPCKLWD,
+ instrux_VPUNPCKLDQ,
+ instrux_VPUNPCKLQDQ,
+ instrux_VPXOR,
+ instrux_VRCPPS,
+ instrux_VRCPSS,
+ instrux_VRSQRTPS,
+ instrux_VRSQRTSS,
+ instrux_VROUNDPD,
+ instrux_VROUNDPS,
+ instrux_VROUNDSD,
+ instrux_VROUNDSS,
+ instrux_VSHUFPD,
+ instrux_VSHUFPS,
+ instrux_VSQRTPD,
+ instrux_VSQRTPS,
+ instrux_VSQRTSD,
+ instrux_VSQRTSS,
+ instrux_VSTMXCSR,
+ instrux_VSUBPD,
+ instrux_VSUBPS,
+ instrux_VSUBSD,
+ instrux_VSUBSS,
+ instrux_VTESTPS,
+ instrux_VTESTPD,
+ instrux_VUCOMISD,
+ instrux_VUCOMISS,
+ instrux_VUNPCKHPD,
+ instrux_VUNPCKHPS,
+ instrux_VUNPCKLPD,
+ instrux_VUNPCKLPS,
+ instrux_VXORPD,
+ instrux_VXORPS,
+ instrux_VZEROALL,
+ instrux_VZEROUPPER,
+ instrux_PCLMULLQLQDQ,
+ instrux_PCLMULHQLQDQ,
+ instrux_PCLMULLQHQDQ,
+ instrux_PCLMULHQHQDQ,
+ instrux_PCLMULQDQ,
+ instrux_VPCLMULLQLQDQ,
+ instrux_VPCLMULHQLQDQ,
+ instrux_VPCLMULLQHQDQ,
+ instrux_VPCLMULHQHQDQ,
+ instrux_VPCLMULQDQ,
+ instrux_VFMADD132PS,
+ instrux_VFMADD132PD,
+ instrux_VFMADD312PS,
+ instrux_VFMADD312PD,
+ instrux_VFMADD213PS,
+ instrux_VFMADD213PD,
+ instrux_VFMADD123PS,
+ instrux_VFMADD123PD,
+ instrux_VFMADD231PS,
+ instrux_VFMADD231PD,
+ instrux_VFMADD321PS,
+ instrux_VFMADD321PD,
+ instrux_VFMADDSUB132PS,
+ instrux_VFMADDSUB132PD,
+ instrux_VFMADDSUB312PS,
+ instrux_VFMADDSUB312PD,
+ instrux_VFMADDSUB213PS,
+ instrux_VFMADDSUB213PD,
+ instrux_VFMADDSUB123PS,
+ instrux_VFMADDSUB123PD,
+ instrux_VFMADDSUB231PS,
+ instrux_VFMADDSUB231PD,
+ instrux_VFMADDSUB321PS,
+ instrux_VFMADDSUB321PD,
+ instrux_VFMSUB132PS,
+ instrux_VFMSUB132PD,
+ instrux_VFMSUB312PS,
+ instrux_VFMSUB312PD,
+ instrux_VFMSUB213PS,
+ instrux_VFMSUB213PD,
+ instrux_VFMSUB123PS,
+ instrux_VFMSUB123PD,
+ instrux_VFMSUB231PS,
+ instrux_VFMSUB231PD,
+ instrux_VFMSUB321PS,
+ instrux_VFMSUB321PD,
+ instrux_VFMSUBADD132PS,
+ instrux_VFMSUBADD132PD,
+ instrux_VFMSUBADD312PS,
+ instrux_VFMSUBADD312PD,
+ instrux_VFMSUBADD213PS,
+ instrux_VFMSUBADD213PD,
+ instrux_VFMSUBADD123PS,
+ instrux_VFMSUBADD123PD,
+ instrux_VFMSUBADD231PS,
+ instrux_VFMSUBADD231PD,
+ instrux_VFMSUBADD321PS,
+ instrux_VFMSUBADD321PD,
+ instrux_VFNMADD132PS,
+ instrux_VFNMADD132PD,
+ instrux_VFNMADD312PS,
+ instrux_VFNMADD312PD,
+ instrux_VFNMADD213PS,
+ instrux_VFNMADD213PD,
+ instrux_VFNMADD123PS,
+ instrux_VFNMADD123PD,
+ instrux_VFNMADD231PS,
+ instrux_VFNMADD231PD,
+ instrux_VFNMADD321PS,
+ instrux_VFNMADD321PD,
+ instrux_VFNMSUB132PS,
+ instrux_VFNMSUB132PD,
+ instrux_VFNMSUB312PS,
+ instrux_VFNMSUB312PD,
+ instrux_VFNMSUB213PS,
+ instrux_VFNMSUB213PD,
+ instrux_VFNMSUB123PS,
+ instrux_VFNMSUB123PD,
+ instrux_VFNMSUB231PS,
+ instrux_VFNMSUB231PD,
+ instrux_VFNMSUB321PS,
+ instrux_VFNMSUB321PD,
+ instrux_VFMADD132SS,
+ instrux_VFMADD132SD,
+ instrux_VFMADD312SS,
+ instrux_VFMADD312SD,
+ instrux_VFMADD213SS,
+ instrux_VFMADD213SD,
+ instrux_VFMADD123SS,
+ instrux_VFMADD123SD,
+ instrux_VFMADD231SS,
+ instrux_VFMADD231SD,
+ instrux_VFMADD321SS,
+ instrux_VFMADD321SD,
+ instrux_VFMSUB132SS,
+ instrux_VFMSUB132SD,
+ instrux_VFMSUB312SS,
+ instrux_VFMSUB312SD,
+ instrux_VFMSUB213SS,
+ instrux_VFMSUB213SD,
+ instrux_VFMSUB123SS,
+ instrux_VFMSUB123SD,
+ instrux_VFMSUB231SS,
+ instrux_VFMSUB231SD,
+ instrux_VFMSUB321SS,
+ instrux_VFMSUB321SD,
+ instrux_VFNMADD132SS,
+ instrux_VFNMADD132SD,
+ instrux_VFNMADD312SS,
+ instrux_VFNMADD312SD,
+ instrux_VFNMADD213SS,
+ instrux_VFNMADD213SD,
+ instrux_VFNMADD123SS,
+ instrux_VFNMADD123SD,
+ instrux_VFNMADD231SS,
+ instrux_VFNMADD231SD,
+ instrux_VFNMADD321SS,
+ instrux_VFNMADD321SD,
+ instrux_VFNMSUB132SS,
+ instrux_VFNMSUB132SD,
+ instrux_VFNMSUB312SS,
+ instrux_VFNMSUB312SD,
+ instrux_VFNMSUB213SS,
+ instrux_VFNMSUB213SD,
+ instrux_VFNMSUB123SS,
+ instrux_VFNMSUB123SD,
+ instrux_VFNMSUB231SS,
+ instrux_VFNMSUB231SD,
+ instrux_VFNMSUB321SS,
+ instrux_VFNMSUB321SD,
+ instrux_RDFSBASE,
+ instrux_RDGSBASE,
+ instrux_RDRAND,
+ instrux_WRFSBASE,
+ instrux_WRGSBASE,
+ instrux_VCVTPH2PS,
+ instrux_VCVTPS2PH,
+ instrux_ADCX,
+ instrux_ADOX,
+ instrux_RDSEED,
+ instrux_CLAC,
+ instrux_STAC,
+ instrux_XSTORE,
+ instrux_XCRYPTECB,
+ instrux_XCRYPTCBC,
+ instrux_XCRYPTCTR,
+ instrux_XCRYPTCFB,
+ instrux_XCRYPTOFB,
+ instrux_MONTMUL,
+ instrux_XSHA1,
+ instrux_XSHA256,
+ instrux_LLWPCB,
+ instrux_SLWPCB,
+ instrux_LWPVAL,
+ instrux_LWPINS,
+ instrux_VFMADDPD,
+ instrux_VFMADDPS,
+ instrux_VFMADDSD,
+ instrux_VFMADDSS,
+ instrux_VFMADDSUBPD,
+ instrux_VFMADDSUBPS,
+ instrux_VFMSUBADDPD,
+ instrux_VFMSUBADDPS,
+ instrux_VFMSUBPD,
+ instrux_VFMSUBPS,
+ instrux_VFMSUBSD,
+ instrux_VFMSUBSS,
+ instrux_VFNMADDPD,
+ instrux_VFNMADDPS,
+ instrux_VFNMADDSD,
+ instrux_VFNMADDSS,
+ instrux_VFNMSUBPD,
+ instrux_VFNMSUBPS,
+ instrux_VFNMSUBSD,
+ instrux_VFNMSUBSS,
+ instrux_VFRCZPD,
+ instrux_VFRCZPS,
+ instrux_VFRCZSD,
+ instrux_VFRCZSS,
+ instrux_VPCMOV,
+ instrux_VPCOMB,
+ instrux_VPCOMD,
+ instrux_VPCOMQ,
+ instrux_VPCOMUB,
+ instrux_VPCOMUD,
+ instrux_VPCOMUQ,
+ instrux_VPCOMUW,
+ instrux_VPCOMW,
+ instrux_VPHADDBD,
+ instrux_VPHADDBQ,
+ instrux_VPHADDBW,
+ instrux_VPHADDDQ,
+ instrux_VPHADDUBD,
+ instrux_VPHADDUBQ,
+ instrux_VPHADDUBW,
+ instrux_VPHADDUDQ,
+ instrux_VPHADDUWD,
+ instrux_VPHADDUWQ,
+ instrux_VPHADDWD,
+ instrux_VPHADDWQ,
+ instrux_VPHSUBBW,
+ instrux_VPHSUBDQ,
+ instrux_VPHSUBWD,
+ instrux_VPMACSDD,
+ instrux_VPMACSDQH,
+ instrux_VPMACSDQL,
+ instrux_VPMACSSDD,
+ instrux_VPMACSSDQH,
+ instrux_VPMACSSDQL,
+ instrux_VPMACSSWD,
+ instrux_VPMACSSWW,
+ instrux_VPMACSWD,
+ instrux_VPMACSWW,
+ instrux_VPMADCSSWD,
+ instrux_VPMADCSWD,
+ instrux_VPPERM,
+ instrux_VPROTB,
+ instrux_VPROTD,
+ instrux_VPROTQ,
+ instrux_VPROTW,
+ instrux_VPSHAB,
+ instrux_VPSHAD,
+ instrux_VPSHAQ,
+ instrux_VPSHAW,
+ instrux_VPSHLB,
+ instrux_VPSHLD,
+ instrux_VPSHLQ,
+ instrux_VPSHLW,
+ instrux_VBROADCASTI128,
+ instrux_VPBLENDD,
+ instrux_VPBROADCASTB,
+ instrux_VPBROADCASTW,
+ instrux_VPBROADCASTD,
+ instrux_VPBROADCASTQ,
+ instrux_VPERMD,
+ instrux_VPERMPD,
+ instrux_VPERMPS,
+ instrux_VPERMQ,
+ instrux_VPERM2I128,
+ instrux_VEXTRACTI128,
+ instrux_VINSERTI128,
+ instrux_VPMASKMOVD,
+ instrux_VPMASKMOVQ,
+ instrux_VPSLLVD,
+ instrux_VPSLLVQ,
+ instrux_VPSRAVD,
+ instrux_VPSRLVD,
+ instrux_VPSRLVQ,
+ instrux_VGATHERDPD,
+ instrux_VGATHERQPD,
+ instrux_VGATHERDPS,
+ instrux_VGATHERQPS,
+ instrux_VPGATHERDD,
+ instrux_VPGATHERQD,
+ instrux_VPGATHERDQ,
+ instrux_VPGATHERQQ,
+ instrux_XABORT,
+ instrux_XBEGIN,
+ instrux_XEND,
+ instrux_XTEST,
+ instrux_ANDN,
+ instrux_BEXTR,
+ instrux_BLCI,
+ instrux_BLCIC,
+ instrux_BLSI,
+ instrux_BLSIC,
+ instrux_BLCFILL,
+ instrux_BLSFILL,
+ instrux_BLCMSK,
+ instrux_BLSMSK,
+ instrux_BLSR,
+ instrux_BLCS,
+ instrux_BZHI,
+ instrux_MULX,
+ instrux_PDEP,
+ instrux_PEXT,
+ instrux_RORX,
+ instrux_SARX,
+ instrux_SHLX,
+ instrux_SHRX,
+ instrux_TZCNT,
+ instrux_TZMSK,
+ instrux_T1MSKC,
+ instrux_PREFETCHWT1,
+ instrux_BNDMK,
+ instrux_BNDCL,
+ instrux_BNDCU,
+ instrux_BNDCN,
+ instrux_BNDMOV,
+ instrux_BNDLDX,
+ instrux_BNDSTX,
+ instrux_SHA1MSG1,
+ instrux_SHA1MSG2,
+ instrux_SHA1NEXTE,
+ instrux_SHA1RNDS4,
+ instrux_SHA256MSG1,
+ instrux_SHA256MSG2,
+ instrux_SHA256RNDS2,
+ instrux_KADDB,
+ instrux_KADDD,
+ instrux_KADDQ,
+ instrux_KADDW,
+ instrux_KANDB,
+ instrux_KANDD,
+ instrux_KANDNB,
+ instrux_KANDND,
+ instrux_KANDNQ,
+ instrux_KANDNW,
+ instrux_KANDQ,
+ instrux_KANDW,
+ instrux_KMOVB,
+ instrux_KMOVD,
+ instrux_KMOVQ,
+ instrux_KMOVW,
+ instrux_KNOTB,
+ instrux_KNOTD,
+ instrux_KNOTQ,
+ instrux_KNOTW,
+ instrux_KORB,
+ instrux_KORD,
+ instrux_KORQ,
+ instrux_KORTESTB,
+ instrux_KORTESTD,
+ instrux_KORTESTQ,
+ instrux_KORTESTW,
+ instrux_KORW,
+ instrux_KSHIFTLB,
+ instrux_KSHIFTLD,
+ instrux_KSHIFTLQ,
+ instrux_KSHIFTLW,
+ instrux_KSHIFTRB,
+ instrux_KSHIFTRD,
+ instrux_KSHIFTRQ,
+ instrux_KSHIFTRW,
+ instrux_KTESTB,
+ instrux_KTESTD,
+ instrux_KTESTQ,
+ instrux_KTESTW,
+ instrux_KUNPCKBW,
+ instrux_KUNPCKDQ,
+ instrux_KUNPCKWD,
+ instrux_KXNORB,
+ instrux_KXNORD,
+ instrux_KXNORQ,
+ instrux_KXNORW,
+ instrux_KXORB,
+ instrux_KXORD,
+ instrux_KXORQ,
+ instrux_KXORW,
+ instrux_VALIGND,
+ instrux_VALIGNQ,
+ instrux_VBLENDMPD,
+ instrux_VBLENDMPS,
+ instrux_VBROADCASTF32X2,
+ instrux_VBROADCASTF32X4,
+ instrux_VBROADCASTF32X8,
+ instrux_VBROADCASTF64X2,
+ instrux_VBROADCASTF64X4,
+ instrux_VBROADCASTI32X2,
+ instrux_VBROADCASTI32X4,
+ instrux_VBROADCASTI32X8,
+ instrux_VBROADCASTI64X2,
+ instrux_VBROADCASTI64X4,
+ instrux_VCOMPRESSPD,
+ instrux_VCOMPRESSPS,
+ instrux_VCVTPD2QQ,
+ instrux_VCVTPD2UDQ,
+ instrux_VCVTPD2UQQ,
+ instrux_VCVTPS2QQ,
+ instrux_VCVTPS2UDQ,
+ instrux_VCVTPS2UQQ,
+ instrux_VCVTQQ2PD,
+ instrux_VCVTQQ2PS,
+ instrux_VCVTSD2USI,
+ instrux_VCVTSS2USI,
+ instrux_VCVTTPD2QQ,
+ instrux_VCVTTPD2UDQ,
+ instrux_VCVTTPD2UQQ,
+ instrux_VCVTTPS2QQ,
+ instrux_VCVTTPS2UDQ,
+ instrux_VCVTTPS2UQQ,
+ instrux_VCVTTSD2USI,
+ instrux_VCVTTSS2USI,
+ instrux_VCVTUDQ2PD,
+ instrux_VCVTUDQ2PS,
+ instrux_VCVTUQQ2PD,
+ instrux_VCVTUQQ2PS,
+ instrux_VCVTUSI2SD,
+ instrux_VCVTUSI2SS,
+ instrux_VDBPSADBW,
+ instrux_VEXP2PD,
+ instrux_VEXP2PS,
+ instrux_VEXPANDPD,
+ instrux_VEXPANDPS,
+ instrux_VEXTRACTF32X4,
+ instrux_VEXTRACTF32X8,
+ instrux_VEXTRACTF64X2,
+ instrux_VEXTRACTF64X4,
+ instrux_VEXTRACTI32X4,
+ instrux_VEXTRACTI32X8,
+ instrux_VEXTRACTI64X2,
+ instrux_VEXTRACTI64X4,
+ instrux_VFIXUPIMMPD,
+ instrux_VFIXUPIMMPS,
+ instrux_VFIXUPIMMSD,
+ instrux_VFIXUPIMMSS,
+ instrux_VFPCLASSPD,
+ instrux_VFPCLASSPS,
+ instrux_VFPCLASSSD,
+ instrux_VFPCLASSSS,
+ instrux_VGATHERPF0DPD,
+ instrux_VGATHERPF0DPS,
+ instrux_VGATHERPF0QPD,
+ instrux_VGATHERPF0QPS,
+ instrux_VGATHERPF1DPD,
+ instrux_VGATHERPF1DPS,
+ instrux_VGATHERPF1QPD,
+ instrux_VGATHERPF1QPS,
+ instrux_VGETEXPPD,
+ instrux_VGETEXPPS,
+ instrux_VGETEXPSD,
+ instrux_VGETEXPSS,
+ instrux_VGETMANTPD,
+ instrux_VGETMANTPS,
+ instrux_VGETMANTSD,
+ instrux_VGETMANTSS,
+ instrux_VINSERTF32X4,
+ instrux_VINSERTF32X8,
+ instrux_VINSERTF64X2,
+ instrux_VINSERTF64X4,
+ instrux_VINSERTI32X4,
+ instrux_VINSERTI32X8,
+ instrux_VINSERTI64X2,
+ instrux_VINSERTI64X4,
+ instrux_VMOVDQA32,
+ instrux_VMOVDQA64,
+ instrux_VMOVDQU16,
+ instrux_VMOVDQU32,
+ instrux_VMOVDQU64,
+ instrux_VMOVDQU8,
+ instrux_VPABSQ,
+ instrux_VPANDD,
+ instrux_VPANDND,
+ instrux_VPANDNQ,
+ instrux_VPANDQ,
+ instrux_VPBLENDMB,
+ instrux_VPBLENDMD,
+ instrux_VPBLENDMQ,
+ instrux_VPBLENDMW,
+ instrux_VPBROADCASTMB2Q,
+ instrux_VPBROADCASTMW2D,
+ instrux_VPCMPB,
+ instrux_VPCMPD,
+ instrux_VPCMPQ,
+ instrux_VPCMPUB,
+ instrux_VPCMPUD,
+ instrux_VPCMPUQ,
+ instrux_VPCMPUW,
+ instrux_VPCMPW,
+ instrux_VPCOMPRESSD,
+ instrux_VPCOMPRESSQ,
+ instrux_VPCONFLICTD,
+ instrux_VPCONFLICTQ,
+ instrux_VPERMB,
+ instrux_VPERMI2B,
+ instrux_VPERMI2D,
+ instrux_VPERMI2PD,
+ instrux_VPERMI2PS,
+ instrux_VPERMI2Q,
+ instrux_VPERMI2W,
+ instrux_VPERMT2B,
+ instrux_VPERMT2D,
+ instrux_VPERMT2PD,
+ instrux_VPERMT2PS,
+ instrux_VPERMT2Q,
+ instrux_VPERMT2W,
+ instrux_VPERMW,
+ instrux_VPEXPANDD,
+ instrux_VPEXPANDQ,
+ instrux_VPLZCNTD,
+ instrux_VPLZCNTQ,
+ instrux_VPMADD52HUQ,
+ instrux_VPMADD52LUQ,
+ instrux_VPMAXSQ,
+ instrux_VPMAXUQ,
+ instrux_VPMINSQ,
+ instrux_VPMINUQ,
+ instrux_VPMOVB2M,
+ instrux_VPMOVD2M,
+ instrux_VPMOVDB,
+ instrux_VPMOVDW,
+ instrux_VPMOVM2B,
+ instrux_VPMOVM2D,
+ instrux_VPMOVM2Q,
+ instrux_VPMOVM2W,
+ instrux_VPMOVQ2M,
+ instrux_VPMOVQB,
+ instrux_VPMOVQD,
+ instrux_VPMOVQW,
+ instrux_VPMOVSDB,
+ instrux_VPMOVSDW,
+ instrux_VPMOVSQB,
+ instrux_VPMOVSQD,
+ instrux_VPMOVSQW,
+ instrux_VPMOVSWB,
+ instrux_VPMOVUSDB,
+ instrux_VPMOVUSDW,
+ instrux_VPMOVUSQB,
+ instrux_VPMOVUSQD,
+ instrux_VPMOVUSQW,
+ instrux_VPMOVUSWB,
+ instrux_VPMOVW2M,
+ instrux_VPMOVWB,
+ instrux_VPMULLQ,
+ instrux_VPMULTISHIFTQB,
+ instrux_VPORD,
+ instrux_VPORQ,
+ instrux_VPROLD,
+ instrux_VPROLQ,
+ instrux_VPROLVD,
+ instrux_VPROLVQ,
+ instrux_VPRORD,
+ instrux_VPRORQ,
+ instrux_VPRORVD,
+ instrux_VPRORVQ,
+ instrux_VPSCATTERDD,
+ instrux_VPSCATTERDQ,
+ instrux_VPSCATTERQD,
+ instrux_VPSCATTERQQ,
+ instrux_VPSLLVW,
+ instrux_VPSRAQ,
+ instrux_VPSRAVQ,
+ instrux_VPSRAVW,
+ instrux_VPSRLVW,
+ instrux_VPTERNLOGD,
+ instrux_VPTERNLOGQ,
+ instrux_VPTESTMB,
+ instrux_VPTESTMD,
+ instrux_VPTESTMQ,
+ instrux_VPTESTMW,
+ instrux_VPTESTNMB,
+ instrux_VPTESTNMD,
+ instrux_VPTESTNMQ,
+ instrux_VPTESTNMW,
+ instrux_VPXORD,
+ instrux_VPXORQ,
+ instrux_VRANGEPD,
+ instrux_VRANGEPS,
+ instrux_VRANGESD,
+ instrux_VRANGESS,
+ instrux_VRCP14PD,
+ instrux_VRCP14PS,
+ instrux_VRCP14SD,
+ instrux_VRCP14SS,
+ instrux_VRCP28PD,
+ instrux_VRCP28PS,
+ instrux_VRCP28SD,
+ instrux_VRCP28SS,
+ instrux_VREDUCEPD,
+ instrux_VREDUCEPS,
+ instrux_VREDUCESD,
+ instrux_VREDUCESS,
+ instrux_VRNDSCALEPD,
+ instrux_VRNDSCALEPS,
+ instrux_VRNDSCALESD,
+ instrux_VRNDSCALESS,
+ instrux_VRSQRT14PD,
+ instrux_VRSQRT14PS,
+ instrux_VRSQRT14SD,
+ instrux_VRSQRT14SS,
+ instrux_VRSQRT28PD,
+ instrux_VRSQRT28PS,
+ instrux_VRSQRT28SD,
+ instrux_VRSQRT28SS,
+ instrux_VSCALEFPD,
+ instrux_VSCALEFPS,
+ instrux_VSCALEFSD,
+ instrux_VSCALEFSS,
+ instrux_VSCATTERDPD,
+ instrux_VSCATTERDPS,
+ instrux_VSCATTERPF0DPD,
+ instrux_VSCATTERPF0DPS,
+ instrux_VSCATTERPF0QPD,
+ instrux_VSCATTERPF0QPS,
+ instrux_VSCATTERPF1DPD,
+ instrux_VSCATTERPF1DPS,
+ instrux_VSCATTERPF1QPD,
+ instrux_VSCATTERPF1QPS,
+ instrux_VSCATTERQPD,
+ instrux_VSCATTERQPS,
+ instrux_VSHUFF32X4,
+ instrux_VSHUFF64X2,
+ instrux_VSHUFI32X4,
+ instrux_VSHUFI64X2,
+ instrux_RDPKRU,
+ instrux_WRPKRU,
+ instrux_RDPID,
+ instrux_CLFLUSHOPT,
+ instrux_CLWB,
+ instrux_PCOMMIT,
+ instrux_CLZERO,
+ instrux_PTWRITE,
+ instrux_CLDEMOTE,
+ instrux_MOVDIRI,
+ instrux_MOVDIR64B,
+ instrux_PCONFIG,
+ instrux_TPAUSE,
+ instrux_UMONITOR,
+ instrux_UMWAIT,
+ instrux_WBNOINVD,
+ instrux_GF2P8AFFINEINVQB,
+ instrux_VGF2P8AFFINEINVQB,
+ instrux_GF2P8AFFINEQB,
+ instrux_VGF2P8AFFINEQB,
+ instrux_GF2P8MULB,
+ instrux_VGF2P8MULB,
+ instrux_VPCOMPRESSB,
+ instrux_VPCOMPRESSW,
+ instrux_VPEXPANDB,
+ instrux_VPEXPANDW,
+ instrux_VPSHLDW,
+ instrux_VPSHLDD,
+ instrux_VPSHLDQ,
+ instrux_VPSHLDVW,
+ instrux_VPSHLDVD,
+ instrux_VPSHLDVQ,
+ instrux_VPSHRDW,
+ instrux_VPSHRDD,
+ instrux_VPSHRDQ,
+ instrux_VPSHRDVW,
+ instrux_VPSHRDVD,
+ instrux_VPSHRDVQ,
+ instrux_VPDPBUSD,
+ instrux_VPDPBUSDS,
+ instrux_VPDPWSSD,
+ instrux_VPDPWSSDS,
+ instrux_VPOPCNTB,
+ instrux_VPOPCNTW,
+ instrux_VPOPCNTD,
+ instrux_VPOPCNTQ,
+ instrux_VPSHUFBITQMB,
+ instrux_V4FMADDPS,
+ instrux_V4FNMADDPS,
+ instrux_V4FMADDSS,
+ instrux_V4FNMADDSS,
+ instrux_V4DPWSSDS,
+ instrux_V4DPWSSD,
+ instrux_ENCLS,
+ instrux_ENCLU,
+ instrux_ENCLV,
+ instrux_HINT_NOP0,
+ instrux_HINT_NOP1,
+ instrux_HINT_NOP2,
+ instrux_HINT_NOP3,
+ instrux_HINT_NOP4,
+ instrux_HINT_NOP5,
+ instrux_HINT_NOP6,
+ instrux_HINT_NOP7,
+ instrux_HINT_NOP8,
+ instrux_HINT_NOP9,
+ instrux_HINT_NOP10,
+ instrux_HINT_NOP11,
+ instrux_HINT_NOP12,
+ instrux_HINT_NOP13,
+ instrux_HINT_NOP14,
+ instrux_HINT_NOP15,
+ instrux_HINT_NOP16,
+ instrux_HINT_NOP17,
+ instrux_HINT_NOP18,
+ instrux_HINT_NOP19,
+ instrux_HINT_NOP20,
+ instrux_HINT_NOP21,
+ instrux_HINT_NOP22,
+ instrux_HINT_NOP23,
+ instrux_HINT_NOP24,
+ instrux_HINT_NOP25,
+ instrux_HINT_NOP26,
+ instrux_HINT_NOP27,
+ instrux_HINT_NOP28,
+ instrux_HINT_NOP29,
+ instrux_HINT_NOP30,
+ instrux_HINT_NOP31,
+ instrux_HINT_NOP32,
+ instrux_HINT_NOP33,
+ instrux_HINT_NOP34,
+ instrux_HINT_NOP35,
+ instrux_HINT_NOP36,
+ instrux_HINT_NOP37,
+ instrux_HINT_NOP38,
+ instrux_HINT_NOP39,
+ instrux_HINT_NOP40,
+ instrux_HINT_NOP41,
+ instrux_HINT_NOP42,
+ instrux_HINT_NOP43,
+ instrux_HINT_NOP44,
+ instrux_HINT_NOP45,
+ instrux_HINT_NOP46,
+ instrux_HINT_NOP47,
+ instrux_HINT_NOP48,
+ instrux_HINT_NOP49,
+ instrux_HINT_NOP50,
+ instrux_HINT_NOP51,
+ instrux_HINT_NOP52,
+ instrux_HINT_NOP53,
+ instrux_HINT_NOP54,
+ instrux_HINT_NOP55,
+ instrux_HINT_NOP56,
+ instrux_HINT_NOP57,
+ instrux_HINT_NOP58,
+ instrux_HINT_NOP59,
+ instrux_HINT_NOP60,
+ instrux_HINT_NOP61,
+ instrux_HINT_NOP62,
+ instrux_HINT_NOP63,
+ instrux_CMOVcc,
+ instrux_Jcc,
+ instrux_SETcc,
+};
diff --git a/x86/insnsb.c b/x86/insnsb.c
new file mode 100644
index 00000000..9e1c0c8d
--- /dev/null
+++ b/x86/insnsb.c
@@ -0,0 +1,5712 @@
+/* This file auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include "nasm.h"
+#include "insns.h"
+
+const uint8_t nasm_bytecodes[41571] = {
+ /* 0 */ 0241,0203,041,0301,01,0104,0120,01,0,0,
+ /* 10 */ 0240,0203,041,0301,01,0104,0110,01,0,0,
+ /* 20 */ 0241,0203,041,0301,01,0104,0120,01,01,0,
+ /* 30 */ 0240,0203,041,0301,01,0104,0110,01,01,0,
+ /* 40 */ 0241,0203,041,0301,01,0104,0120,01,020,0,
+ /* 50 */ 0240,0203,041,0301,01,0104,0110,01,020,0,
+ /* 60 */ 0241,0203,041,0301,01,0104,0120,01,021,0,
+ /* 70 */ 0240,0203,041,0301,01,0104,0110,01,021,0,
+ /* 80 */ 0241,0203,045,0301,01,0104,0120,01,0,0,
+ /* 90 */ 0240,0203,045,0301,01,0104,0110,01,0,0,
+ /* 100 */ 0241,0203,045,0301,01,0104,0120,01,01,0,
+ /* 110 */ 0240,0203,045,0301,01,0104,0110,01,01,0,
+ /* 120 */ 0241,0203,045,0301,01,0104,0120,01,020,0,
+ /* 130 */ 0240,0203,045,0301,01,0104,0110,01,020,0,
+ /* 140 */ 0241,0203,045,0301,01,0104,0120,01,021,0,
+ /* 150 */ 0240,0203,045,0301,01,0104,0110,01,021,0,
+ /* 160 */ 0241,0203,051,0301,01,0104,0120,01,0,0,
+ /* 170 */ 0240,0203,051,0301,01,0104,0110,01,0,0,
+ /* 180 */ 0241,0203,051,0301,01,0104,0120,01,01,0,
+ /* 190 */ 0240,0203,051,0301,01,0104,0110,01,01,0,
+ /* 200 */ 0241,0203,051,0301,01,0104,0120,01,020,0,
+ /* 210 */ 0240,0203,051,0301,01,0104,0110,01,020,0,
+ /* 220 */ 0241,0203,051,0301,01,0104,0120,01,021,0,
+ /* 230 */ 0240,0203,051,0301,01,0104,0110,01,021,0,
+ /* 240 */ 0324,0361,03,017,072,027,0101,026,0,
+ /* 249 */ 0323,0361,03,017,072,024,0101,026,0,
+ /* 258 */ 0317,0361,03,017,072,026,0101,026,0,
+ /* 267 */ 0324,0361,03,017,072,026,0101,026,0,
+ /* 276 */ 0324,0361,03,017,072,025,0101,026,0,
+ /* 285 */ 0325,0361,03,017,072,040,0110,026,0,
+ /* 294 */ 0317,0361,03,017,072,042,0110,026,0,
+ /* 303 */ 0324,0361,03,017,072,042,0110,026,0,
+ /* 312 */ 0261,01,041,01,0302,0120,01,020,0,
+ /* 321 */ 0260,01,041,01,0302,0110,01,020,0,
+ /* 330 */ 0261,01,045,01,0302,0120,01,020,0,
+ /* 339 */ 0260,01,045,01,0302,0110,01,020,0,
+ /* 348 */ 0261,01,041,01,0302,0120,01,0,0,
+ /* 357 */ 0260,01,041,01,0302,0110,01,0,0,
+ /* 366 */ 0261,01,045,01,0302,0120,01,0,0,
+ /* 375 */ 0260,01,045,01,0302,0110,01,0,0,
+ /* 384 */ 0261,01,041,01,0302,0120,01,01,0,
+ /* 393 */ 0260,01,041,01,0302,0110,01,01,0,
+ /* 402 */ 0261,01,045,01,0302,0120,01,01,0,
+ /* 411 */ 0260,01,045,01,0302,0110,01,01,0,
+ /* 420 */ 0261,01,041,01,0302,0120,01,02,0,
+ /* 429 */ 0260,01,041,01,0302,0110,01,02,0,
+ /* 438 */ 0261,01,045,01,0302,0120,01,02,0,
+ /* 447 */ 0260,01,045,01,0302,0110,01,02,0,
+ /* 456 */ 0261,01,041,01,0302,0120,01,03,0,
+ /* 465 */ 0260,01,041,01,0302,0110,01,03,0,
+ /* 474 */ 0261,01,045,01,0302,0120,01,03,0,
+ /* 483 */ 0260,01,045,01,0302,0110,01,03,0,
+ /* 492 */ 0261,01,041,01,0302,0120,01,04,0,
+ /* 501 */ 0260,01,041,01,0302,0110,01,04,0,
+ /* 510 */ 0261,01,045,01,0302,0120,01,04,0,
+ /* 519 */ 0260,01,045,01,0302,0110,01,04,0,
+ /* 528 */ 0261,01,041,01,0302,0120,01,05,0,
+ /* 537 */ 0260,01,041,01,0302,0110,01,05,0,
+ /* 546 */ 0261,01,045,01,0302,0120,01,05,0,
+ /* 555 */ 0260,01,045,01,0302,0110,01,05,0,
+ /* 564 */ 0261,01,041,01,0302,0120,01,06,0,
+ /* 573 */ 0260,01,041,01,0302,0110,01,06,0,
+ /* 582 */ 0261,01,045,01,0302,0120,01,06,0,
+ /* 591 */ 0260,01,045,01,0302,0110,01,06,0,
+ /* 600 */ 0261,01,041,01,0302,0120,01,07,0,
+ /* 609 */ 0260,01,041,01,0302,0110,01,07,0,
+ /* 618 */ 0261,01,045,01,0302,0120,01,07,0,
+ /* 627 */ 0260,01,045,01,0302,0110,01,07,0,
+ /* 636 */ 0261,01,041,01,0302,0120,01,010,0,
+ /* 645 */ 0260,01,041,01,0302,0110,01,010,0,
+ /* 654 */ 0261,01,045,01,0302,0120,01,010,0,
+ /* 663 */ 0260,01,045,01,0302,0110,01,010,0,
+ /* 672 */ 0261,01,041,01,0302,0120,01,011,0,
+ /* 681 */ 0260,01,041,01,0302,0110,01,011,0,
+ /* 690 */ 0261,01,045,01,0302,0120,01,011,0,
+ /* 699 */ 0260,01,045,01,0302,0110,01,011,0,
+ /* 708 */ 0261,01,041,01,0302,0120,01,012,0,
+ /* 717 */ 0260,01,041,01,0302,0110,01,012,0,
+ /* 726 */ 0261,01,045,01,0302,0120,01,012,0,
+ /* 735 */ 0260,01,045,01,0302,0110,01,012,0,
+ /* 744 */ 0261,01,041,01,0302,0120,01,013,0,
+ /* 753 */ 0260,01,041,01,0302,0110,01,013,0,
+ /* 762 */ 0261,01,045,01,0302,0120,01,013,0,
+ /* 771 */ 0260,01,045,01,0302,0110,01,013,0,
+ /* 780 */ 0261,01,041,01,0302,0120,01,014,0,
+ /* 789 */ 0260,01,041,01,0302,0110,01,014,0,
+ /* 798 */ 0261,01,045,01,0302,0120,01,014,0,
+ /* 807 */ 0260,01,045,01,0302,0110,01,014,0,
+ /* 816 */ 0261,01,041,01,0302,0120,01,015,0,
+ /* 825 */ 0260,01,041,01,0302,0110,01,015,0,
+ /* 834 */ 0261,01,045,01,0302,0120,01,015,0,
+ /* 843 */ 0260,01,045,01,0302,0110,01,015,0,
+ /* 852 */ 0261,01,041,01,0302,0120,01,016,0,
+ /* 861 */ 0260,01,041,01,0302,0110,01,016,0,
+ /* 870 */ 0261,01,045,01,0302,0120,01,016,0,
+ /* 879 */ 0260,01,045,01,0302,0110,01,016,0,
+ /* 888 */ 0261,01,041,01,0302,0120,01,017,0,
+ /* 897 */ 0260,01,041,01,0302,0110,01,017,0,
+ /* 906 */ 0261,01,045,01,0302,0120,01,017,0,
+ /* 915 */ 0260,01,045,01,0302,0110,01,017,0,
+ /* 924 */ 0261,01,041,01,0302,0120,01,021,0,
+ /* 933 */ 0260,01,041,01,0302,0110,01,021,0,
+ /* 942 */ 0261,01,045,01,0302,0120,01,021,0,
+ /* 951 */ 0260,01,045,01,0302,0110,01,021,0,
+ /* 960 */ 0261,01,041,01,0302,0120,01,022,0,
+ /* 969 */ 0260,01,041,01,0302,0110,01,022,0,
+ /* 978 */ 0261,01,045,01,0302,0120,01,022,0,
+ /* 987 */ 0260,01,045,01,0302,0110,01,022,0,
+ /* 996 */ 0261,01,041,01,0302,0120,01,023,0,
+ /* 1005 */ 0260,01,041,01,0302,0110,01,023,0,
+ /* 1014 */ 0261,01,045,01,0302,0120,01,023,0,
+ /* 1023 */ 0260,01,045,01,0302,0110,01,023,0,
+ /* 1032 */ 0261,01,041,01,0302,0120,01,024,0,
+ /* 1041 */ 0260,01,041,01,0302,0110,01,024,0,
+ /* 1050 */ 0261,01,045,01,0302,0120,01,024,0,
+ /* 1059 */ 0260,01,045,01,0302,0110,01,024,0,
+ /* 1068 */ 0261,01,041,01,0302,0120,01,025,0,
+ /* 1077 */ 0260,01,041,01,0302,0110,01,025,0,
+ /* 1086 */ 0261,01,045,01,0302,0120,01,025,0,
+ /* 1095 */ 0260,01,045,01,0302,0110,01,025,0,
+ /* 1104 */ 0261,01,041,01,0302,0120,01,026,0,
+ /* 1113 */ 0260,01,041,01,0302,0110,01,026,0,
+ /* 1122 */ 0261,01,045,01,0302,0120,01,026,0,
+ /* 1131 */ 0260,01,045,01,0302,0110,01,026,0,
+ /* 1140 */ 0261,01,041,01,0302,0120,01,027,0,
+ /* 1149 */ 0260,01,041,01,0302,0110,01,027,0,
+ /* 1158 */ 0261,01,045,01,0302,0120,01,027,0,
+ /* 1167 */ 0260,01,045,01,0302,0110,01,027,0,
+ /* 1176 */ 0261,01,041,01,0302,0120,01,030,0,
+ /* 1185 */ 0260,01,041,01,0302,0110,01,030,0,
+ /* 1194 */ 0261,01,045,01,0302,0120,01,030,0,
+ /* 1203 */ 0260,01,045,01,0302,0110,01,030,0,
+ /* 1212 */ 0261,01,041,01,0302,0120,01,031,0,
+ /* 1221 */ 0260,01,041,01,0302,0110,01,031,0,
+ /* 1230 */ 0261,01,045,01,0302,0120,01,031,0,
+ /* 1239 */ 0260,01,045,01,0302,0110,01,031,0,
+ /* 1248 */ 0261,01,041,01,0302,0120,01,032,0,
+ /* 1257 */ 0260,01,041,01,0302,0110,01,032,0,
+ /* 1266 */ 0261,01,045,01,0302,0120,01,032,0,
+ /* 1275 */ 0260,01,045,01,0302,0110,01,032,0,
+ /* 1284 */ 0261,01,041,01,0302,0120,01,033,0,
+ /* 1293 */ 0260,01,041,01,0302,0110,01,033,0,
+ /* 1302 */ 0261,01,045,01,0302,0120,01,033,0,
+ /* 1311 */ 0260,01,045,01,0302,0110,01,033,0,
+ /* 1320 */ 0261,01,041,01,0302,0120,01,034,0,
+ /* 1329 */ 0260,01,041,01,0302,0110,01,034,0,
+ /* 1338 */ 0261,01,045,01,0302,0120,01,034,0,
+ /* 1347 */ 0260,01,045,01,0302,0110,01,034,0,
+ /* 1356 */ 0261,01,041,01,0302,0120,01,035,0,
+ /* 1365 */ 0260,01,041,01,0302,0110,01,035,0,
+ /* 1374 */ 0261,01,045,01,0302,0120,01,035,0,
+ /* 1383 */ 0260,01,045,01,0302,0110,01,035,0,
+ /* 1392 */ 0261,01,041,01,0302,0120,01,036,0,
+ /* 1401 */ 0260,01,041,01,0302,0110,01,036,0,
+ /* 1410 */ 0261,01,045,01,0302,0120,01,036,0,
+ /* 1419 */ 0260,01,045,01,0302,0110,01,036,0,
+ /* 1428 */ 0261,01,041,01,0302,0120,01,037,0,
+ /* 1437 */ 0260,01,041,01,0302,0110,01,037,0,
+ /* 1446 */ 0261,01,045,01,0302,0120,01,037,0,
+ /* 1455 */ 0260,01,045,01,0302,0110,01,037,0,
+ /* 1464 */ 0261,01,040,01,0302,0120,01,020,0,
+ /* 1473 */ 0260,01,040,01,0302,0110,01,020,0,
+ /* 1482 */ 0261,01,044,01,0302,0120,01,020,0,
+ /* 1491 */ 0260,01,044,01,0302,0110,01,020,0,
+ /* 1500 */ 0261,01,040,01,0302,0120,01,0,0,
+ /* 1509 */ 0260,01,040,01,0302,0110,01,0,0,
+ /* 1518 */ 0261,01,044,01,0302,0120,01,0,0,
+ /* 1527 */ 0260,01,044,01,0302,0110,01,0,0,
+ /* 1536 */ 0261,01,040,01,0302,0120,01,01,0,
+ /* 1545 */ 0260,01,040,01,0302,0110,01,01,0,
+ /* 1554 */ 0261,01,044,01,0302,0120,01,01,0,
+ /* 1563 */ 0260,01,044,01,0302,0110,01,01,0,
+ /* 1572 */ 0261,01,040,01,0302,0120,01,02,0,
+ /* 1581 */ 0260,01,040,01,0302,0110,01,02,0,
+ /* 1590 */ 0261,01,044,01,0302,0120,01,02,0,
+ /* 1599 */ 0260,01,044,01,0302,0110,01,02,0,
+ /* 1608 */ 0261,01,040,01,0302,0120,01,03,0,
+ /* 1617 */ 0260,01,040,01,0302,0110,01,03,0,
+ /* 1626 */ 0261,01,044,01,0302,0120,01,03,0,
+ /* 1635 */ 0260,01,044,01,0302,0110,01,03,0,
+ /* 1644 */ 0261,01,040,01,0302,0120,01,04,0,
+ /* 1653 */ 0260,01,040,01,0302,0110,01,04,0,
+ /* 1662 */ 0261,01,044,01,0302,0120,01,04,0,
+ /* 1671 */ 0260,01,044,01,0302,0110,01,04,0,
+ /* 1680 */ 0261,01,040,01,0302,0120,01,05,0,
+ /* 1689 */ 0260,01,040,01,0302,0110,01,05,0,
+ /* 1698 */ 0261,01,044,01,0302,0120,01,05,0,
+ /* 1707 */ 0260,01,044,01,0302,0110,01,05,0,
+ /* 1716 */ 0261,01,040,01,0302,0120,01,06,0,
+ /* 1725 */ 0260,01,040,01,0302,0110,01,06,0,
+ /* 1734 */ 0261,01,044,01,0302,0120,01,06,0,
+ /* 1743 */ 0260,01,044,01,0302,0110,01,06,0,
+ /* 1752 */ 0261,01,040,01,0302,0120,01,07,0,
+ /* 1761 */ 0260,01,040,01,0302,0110,01,07,0,
+ /* 1770 */ 0261,01,044,01,0302,0120,01,07,0,
+ /* 1779 */ 0260,01,044,01,0302,0110,01,07,0,
+ /* 1788 */ 0261,01,040,01,0302,0120,01,010,0,
+ /* 1797 */ 0260,01,040,01,0302,0110,01,010,0,
+ /* 1806 */ 0261,01,044,01,0302,0120,01,010,0,
+ /* 1815 */ 0260,01,044,01,0302,0110,01,010,0,
+ /* 1824 */ 0261,01,040,01,0302,0120,01,011,0,
+ /* 1833 */ 0260,01,040,01,0302,0110,01,011,0,
+ /* 1842 */ 0261,01,044,01,0302,0120,01,011,0,
+ /* 1851 */ 0260,01,044,01,0302,0110,01,011,0,
+ /* 1860 */ 0261,01,040,01,0302,0120,01,012,0,
+ /* 1869 */ 0260,01,040,01,0302,0110,01,012,0,
+ /* 1878 */ 0261,01,044,01,0302,0120,01,012,0,
+ /* 1887 */ 0260,01,044,01,0302,0110,01,012,0,
+ /* 1896 */ 0261,01,040,01,0302,0120,01,013,0,
+ /* 1905 */ 0260,01,040,01,0302,0110,01,013,0,
+ /* 1914 */ 0261,01,044,01,0302,0120,01,013,0,
+ /* 1923 */ 0260,01,044,01,0302,0110,01,013,0,
+ /* 1932 */ 0261,01,040,01,0302,0120,01,014,0,
+ /* 1941 */ 0260,01,040,01,0302,0110,01,014,0,
+ /* 1950 */ 0261,01,044,01,0302,0120,01,014,0,
+ /* 1959 */ 0260,01,044,01,0302,0110,01,014,0,
+ /* 1968 */ 0261,01,040,01,0302,0120,01,015,0,
+ /* 1977 */ 0260,01,040,01,0302,0110,01,015,0,
+ /* 1986 */ 0261,01,044,01,0302,0120,01,015,0,
+ /* 1995 */ 0260,01,044,01,0302,0110,01,015,0,
+ /* 2004 */ 0261,01,040,01,0302,0120,01,016,0,
+ /* 2013 */ 0260,01,040,01,0302,0110,01,016,0,
+ /* 2022 */ 0261,01,044,01,0302,0120,01,016,0,
+ /* 2031 */ 0260,01,044,01,0302,0110,01,016,0,
+ /* 2040 */ 0261,01,040,01,0302,0120,01,017,0,
+ /* 2049 */ 0260,01,040,01,0302,0110,01,017,0,
+ /* 2058 */ 0261,01,044,01,0302,0120,01,017,0,
+ /* 2067 */ 0260,01,044,01,0302,0110,01,017,0,
+ /* 2076 */ 0261,01,040,01,0302,0120,01,021,0,
+ /* 2085 */ 0260,01,040,01,0302,0110,01,021,0,
+ /* 2094 */ 0261,01,044,01,0302,0120,01,021,0,
+ /* 2103 */ 0260,01,044,01,0302,0110,01,021,0,
+ /* 2112 */ 0261,01,040,01,0302,0120,01,022,0,
+ /* 2121 */ 0260,01,040,01,0302,0110,01,022,0,
+ /* 2130 */ 0261,01,044,01,0302,0120,01,022,0,
+ /* 2139 */ 0260,01,044,01,0302,0110,01,022,0,
+ /* 2148 */ 0261,01,040,01,0302,0120,01,023,0,
+ /* 2157 */ 0260,01,040,01,0302,0110,01,023,0,
+ /* 2166 */ 0261,01,044,01,0302,0120,01,023,0,
+ /* 2175 */ 0260,01,044,01,0302,0110,01,023,0,
+ /* 2184 */ 0261,01,040,01,0302,0120,01,024,0,
+ /* 2193 */ 0260,01,040,01,0302,0110,01,024,0,
+ /* 2202 */ 0261,01,044,01,0302,0120,01,024,0,
+ /* 2211 */ 0260,01,044,01,0302,0110,01,024,0,
+ /* 2220 */ 0261,01,040,01,0302,0120,01,025,0,
+ /* 2229 */ 0260,01,040,01,0302,0110,01,025,0,
+ /* 2238 */ 0261,01,044,01,0302,0120,01,025,0,
+ /* 2247 */ 0260,01,044,01,0302,0110,01,025,0,
+ /* 2256 */ 0261,01,040,01,0302,0120,01,026,0,
+ /* 2265 */ 0260,01,040,01,0302,0110,01,026,0,
+ /* 2274 */ 0261,01,044,01,0302,0120,01,026,0,
+ /* 2283 */ 0260,01,044,01,0302,0110,01,026,0,
+ /* 2292 */ 0261,01,040,01,0302,0120,01,027,0,
+ /* 2301 */ 0260,01,040,01,0302,0110,01,027,0,
+ /* 2310 */ 0261,01,044,01,0302,0120,01,027,0,
+ /* 2319 */ 0260,01,044,01,0302,0110,01,027,0,
+ /* 2328 */ 0261,01,040,01,0302,0120,01,030,0,
+ /* 2337 */ 0260,01,040,01,0302,0110,01,030,0,
+ /* 2346 */ 0261,01,044,01,0302,0120,01,030,0,
+ /* 2355 */ 0260,01,044,01,0302,0110,01,030,0,
+ /* 2364 */ 0261,01,040,01,0302,0120,01,031,0,
+ /* 2373 */ 0260,01,040,01,0302,0110,01,031,0,
+ /* 2382 */ 0261,01,044,01,0302,0120,01,031,0,
+ /* 2391 */ 0260,01,044,01,0302,0110,01,031,0,
+ /* 2400 */ 0261,01,040,01,0302,0120,01,032,0,
+ /* 2409 */ 0260,01,040,01,0302,0110,01,032,0,
+ /* 2418 */ 0261,01,044,01,0302,0120,01,032,0,
+ /* 2427 */ 0260,01,044,01,0302,0110,01,032,0,
+ /* 2436 */ 0261,01,040,01,0302,0120,01,033,0,
+ /* 2445 */ 0260,01,040,01,0302,0110,01,033,0,
+ /* 2454 */ 0261,01,044,01,0302,0120,01,033,0,
+ /* 2463 */ 0260,01,044,01,0302,0110,01,033,0,
+ /* 2472 */ 0261,01,040,01,0302,0120,01,034,0,
+ /* 2481 */ 0260,01,040,01,0302,0110,01,034,0,
+ /* 2490 */ 0261,01,044,01,0302,0120,01,034,0,
+ /* 2499 */ 0260,01,044,01,0302,0110,01,034,0,
+ /* 2508 */ 0261,01,040,01,0302,0120,01,035,0,
+ /* 2517 */ 0260,01,040,01,0302,0110,01,035,0,
+ /* 2526 */ 0261,01,044,01,0302,0120,01,035,0,
+ /* 2535 */ 0260,01,044,01,0302,0110,01,035,0,
+ /* 2544 */ 0261,01,040,01,0302,0120,01,036,0,
+ /* 2553 */ 0260,01,040,01,0302,0110,01,036,0,
+ /* 2562 */ 0261,01,044,01,0302,0120,01,036,0,
+ /* 2571 */ 0260,01,044,01,0302,0110,01,036,0,
+ /* 2580 */ 0261,01,040,01,0302,0120,01,037,0,
+ /* 2589 */ 0260,01,040,01,0302,0110,01,037,0,
+ /* 2598 */ 0261,01,044,01,0302,0120,01,037,0,
+ /* 2607 */ 0260,01,044,01,0302,0110,01,037,0,
+ /* 2616 */ 0261,01,053,01,0302,0120,01,020,0,
+ /* 2625 */ 0260,01,053,01,0302,0110,01,020,0,
+ /* 2634 */ 0261,01,053,01,0302,0120,01,0,0,
+ /* 2643 */ 0260,01,053,01,0302,0110,01,0,0,
+ /* 2652 */ 0261,01,053,01,0302,0120,01,01,0,
+ /* 2661 */ 0260,01,053,01,0302,0110,01,01,0,
+ /* 2670 */ 0261,01,053,01,0302,0120,01,02,0,
+ /* 2679 */ 0260,01,053,01,0302,0110,01,02,0,
+ /* 2688 */ 0261,01,053,01,0302,0120,01,03,0,
+ /* 2697 */ 0260,01,053,01,0302,0110,01,03,0,
+ /* 2706 */ 0261,01,053,01,0302,0120,01,04,0,
+ /* 2715 */ 0260,01,053,01,0302,0110,01,04,0,
+ /* 2724 */ 0261,01,053,01,0302,0120,01,05,0,
+ /* 2733 */ 0260,01,053,01,0302,0110,01,05,0,
+ /* 2742 */ 0261,01,053,01,0302,0120,01,06,0,
+ /* 2751 */ 0260,01,053,01,0302,0110,01,06,0,
+ /* 2760 */ 0261,01,053,01,0302,0120,01,07,0,
+ /* 2769 */ 0260,01,053,01,0302,0110,01,07,0,
+ /* 2778 */ 0261,01,053,01,0302,0120,01,010,0,
+ /* 2787 */ 0260,01,053,01,0302,0110,01,010,0,
+ /* 2796 */ 0261,01,053,01,0302,0120,01,011,0,
+ /* 2805 */ 0260,01,053,01,0302,0110,01,011,0,
+ /* 2814 */ 0261,01,053,01,0302,0120,01,012,0,
+ /* 2823 */ 0260,01,053,01,0302,0110,01,012,0,
+ /* 2832 */ 0261,01,053,01,0302,0120,01,013,0,
+ /* 2841 */ 0260,01,053,01,0302,0110,01,013,0,
+ /* 2850 */ 0261,01,053,01,0302,0120,01,014,0,
+ /* 2859 */ 0260,01,053,01,0302,0110,01,014,0,
+ /* 2868 */ 0261,01,053,01,0302,0120,01,015,0,
+ /* 2877 */ 0260,01,053,01,0302,0110,01,015,0,
+ /* 2886 */ 0261,01,053,01,0302,0120,01,016,0,
+ /* 2895 */ 0260,01,053,01,0302,0110,01,016,0,
+ /* 2904 */ 0261,01,053,01,0302,0120,01,017,0,
+ /* 2913 */ 0260,01,053,01,0302,0110,01,017,0,
+ /* 2922 */ 0261,01,053,01,0302,0120,01,021,0,
+ /* 2931 */ 0260,01,053,01,0302,0110,01,021,0,
+ /* 2940 */ 0261,01,053,01,0302,0120,01,022,0,
+ /* 2949 */ 0260,01,053,01,0302,0110,01,022,0,
+ /* 2958 */ 0261,01,053,01,0302,0120,01,023,0,
+ /* 2967 */ 0260,01,053,01,0302,0110,01,023,0,
+ /* 2976 */ 0261,01,053,01,0302,0120,01,024,0,
+ /* 2985 */ 0260,01,053,01,0302,0110,01,024,0,
+ /* 2994 */ 0261,01,053,01,0302,0120,01,025,0,
+ /* 3003 */ 0260,01,053,01,0302,0110,01,025,0,
+ /* 3012 */ 0261,01,053,01,0302,0120,01,026,0,
+ /* 3021 */ 0260,01,053,01,0302,0110,01,026,0,
+ /* 3030 */ 0261,01,053,01,0302,0120,01,027,0,
+ /* 3039 */ 0260,01,053,01,0302,0110,01,027,0,
+ /* 3048 */ 0261,01,053,01,0302,0120,01,030,0,
+ /* 3057 */ 0260,01,053,01,0302,0110,01,030,0,
+ /* 3066 */ 0261,01,053,01,0302,0120,01,031,0,
+ /* 3075 */ 0260,01,053,01,0302,0110,01,031,0,
+ /* 3084 */ 0261,01,053,01,0302,0120,01,032,0,
+ /* 3093 */ 0260,01,053,01,0302,0110,01,032,0,
+ /* 3102 */ 0261,01,053,01,0302,0120,01,033,0,
+ /* 3111 */ 0260,01,053,01,0302,0110,01,033,0,
+ /* 3120 */ 0261,01,053,01,0302,0120,01,034,0,
+ /* 3129 */ 0260,01,053,01,0302,0110,01,034,0,
+ /* 3138 */ 0261,01,053,01,0302,0120,01,035,0,
+ /* 3147 */ 0260,01,053,01,0302,0110,01,035,0,
+ /* 3156 */ 0261,01,053,01,0302,0120,01,036,0,
+ /* 3165 */ 0260,01,053,01,0302,0110,01,036,0,
+ /* 3174 */ 0261,01,053,01,0302,0120,01,037,0,
+ /* 3183 */ 0260,01,053,01,0302,0110,01,037,0,
+ /* 3192 */ 0261,01,052,01,0302,0120,01,020,0,
+ /* 3201 */ 0260,01,052,01,0302,0110,01,020,0,
+ /* 3210 */ 0261,01,052,01,0302,0120,01,0,0,
+ /* 3219 */ 0260,01,052,01,0302,0110,01,0,0,
+ /* 3228 */ 0261,01,052,01,0302,0120,01,01,0,
+ /* 3237 */ 0260,01,052,01,0302,0110,01,01,0,
+ /* 3246 */ 0261,01,052,01,0302,0120,01,02,0,
+ /* 3255 */ 0260,01,052,01,0302,0110,01,02,0,
+ /* 3264 */ 0261,01,052,01,0302,0120,01,03,0,
+ /* 3273 */ 0260,01,052,01,0302,0110,01,03,0,
+ /* 3282 */ 0261,01,052,01,0302,0120,01,04,0,
+ /* 3291 */ 0260,01,052,01,0302,0110,01,04,0,
+ /* 3300 */ 0261,01,052,01,0302,0120,01,05,0,
+ /* 3309 */ 0260,01,052,01,0302,0110,01,05,0,
+ /* 3318 */ 0261,01,052,01,0302,0120,01,06,0,
+ /* 3327 */ 0260,01,052,01,0302,0110,01,06,0,
+ /* 3336 */ 0261,01,052,01,0302,0120,01,07,0,
+ /* 3345 */ 0260,01,052,01,0302,0110,01,07,0,
+ /* 3354 */ 0261,01,052,01,0302,0120,01,010,0,
+ /* 3363 */ 0260,01,052,01,0302,0110,01,010,0,
+ /* 3372 */ 0261,01,052,01,0302,0120,01,011,0,
+ /* 3381 */ 0260,01,052,01,0302,0110,01,011,0,
+ /* 3390 */ 0261,01,052,01,0302,0120,01,012,0,
+ /* 3399 */ 0260,01,052,01,0302,0110,01,012,0,
+ /* 3408 */ 0261,01,052,01,0302,0120,01,013,0,
+ /* 3417 */ 0260,01,052,01,0302,0110,01,013,0,
+ /* 3426 */ 0261,01,052,01,0302,0120,01,014,0,
+ /* 3435 */ 0260,01,052,01,0302,0110,01,014,0,
+ /* 3444 */ 0261,01,052,01,0302,0120,01,015,0,
+ /* 3453 */ 0260,01,052,01,0302,0110,01,015,0,
+ /* 3462 */ 0261,01,052,01,0302,0120,01,016,0,
+ /* 3471 */ 0260,01,052,01,0302,0110,01,016,0,
+ /* 3480 */ 0261,01,052,01,0302,0120,01,017,0,
+ /* 3489 */ 0260,01,052,01,0302,0110,01,017,0,
+ /* 3498 */ 0261,01,052,01,0302,0120,01,021,0,
+ /* 3507 */ 0260,01,052,01,0302,0110,01,021,0,
+ /* 3516 */ 0261,01,052,01,0302,0120,01,022,0,
+ /* 3525 */ 0260,01,052,01,0302,0110,01,022,0,
+ /* 3534 */ 0261,01,052,01,0302,0120,01,023,0,
+ /* 3543 */ 0260,01,052,01,0302,0110,01,023,0,
+ /* 3552 */ 0261,01,052,01,0302,0120,01,024,0,
+ /* 3561 */ 0260,01,052,01,0302,0110,01,024,0,
+ /* 3570 */ 0261,01,052,01,0302,0120,01,025,0,
+ /* 3579 */ 0260,01,052,01,0302,0110,01,025,0,
+ /* 3588 */ 0261,01,052,01,0302,0120,01,026,0,
+ /* 3597 */ 0260,01,052,01,0302,0110,01,026,0,
+ /* 3606 */ 0261,01,052,01,0302,0120,01,027,0,
+ /* 3615 */ 0260,01,052,01,0302,0110,01,027,0,
+ /* 3624 */ 0261,01,052,01,0302,0120,01,030,0,
+ /* 3633 */ 0260,01,052,01,0302,0110,01,030,0,
+ /* 3642 */ 0261,01,052,01,0302,0120,01,031,0,
+ /* 3651 */ 0260,01,052,01,0302,0110,01,031,0,
+ /* 3660 */ 0261,01,052,01,0302,0120,01,032,0,
+ /* 3669 */ 0260,01,052,01,0302,0110,01,032,0,
+ /* 3678 */ 0261,01,052,01,0302,0120,01,033,0,
+ /* 3687 */ 0260,01,052,01,0302,0110,01,033,0,
+ /* 3696 */ 0261,01,052,01,0302,0120,01,034,0,
+ /* 3705 */ 0260,01,052,01,0302,0110,01,034,0,
+ /* 3714 */ 0261,01,052,01,0302,0120,01,035,0,
+ /* 3723 */ 0260,01,052,01,0302,0110,01,035,0,
+ /* 3732 */ 0261,01,052,01,0302,0120,01,036,0,
+ /* 3741 */ 0260,01,052,01,0302,0110,01,036,0,
+ /* 3750 */ 0261,01,052,01,0302,0120,01,037,0,
+ /* 3759 */ 0260,01,052,01,0302,0110,01,037,0,
+ /* 3768 */ 0361,03,017,072,0104,0110,01,0,0,
+ /* 3777 */ 0361,03,017,072,0104,0110,01,01,0,
+ /* 3786 */ 0361,03,017,072,0104,0110,01,020,0,
+ /* 3795 */ 0361,03,017,072,0104,0110,01,021,0,
+ /* 3804 */ 0261,03,041,01,0104,0120,01,0,0,
+ /* 3813 */ 0260,03,041,01,0104,0110,01,0,0,
+ /* 3822 */ 0261,03,041,01,0104,0120,01,01,0,
+ /* 3831 */ 0260,03,041,01,0104,0110,01,01,0,
+ /* 3840 */ 0261,03,041,01,0104,0120,01,020,0,
+ /* 3849 */ 0260,03,041,01,0104,0110,01,020,0,
+ /* 3858 */ 0261,03,041,01,0104,0120,01,021,0,
+ /* 3867 */ 0260,03,041,01,0104,0110,01,021,0,
+ /* 3876 */ 0261,03,045,01,0104,0120,01,0,0,
+ /* 3885 */ 0260,03,045,01,0104,0110,01,0,0,
+ /* 3894 */ 0261,03,045,01,0104,0120,01,01,0,
+ /* 3903 */ 0260,03,045,01,0104,0110,01,01,0,
+ /* 3912 */ 0261,03,045,01,0104,0120,01,020,0,
+ /* 3921 */ 0260,03,045,01,0104,0110,01,020,0,
+ /* 3930 */ 0261,03,045,01,0104,0120,01,021,0,
+ /* 3939 */ 0260,03,045,01,0104,0110,01,021,0,
+ /* 3948 */ 0241,0203,041,0301,01,0104,0120,023,0,
+ /* 3957 */ 0240,0203,041,0301,01,0104,0110,022,0,
+ /* 3966 */ 0241,0203,045,0301,01,0104,0120,023,0,
+ /* 3975 */ 0240,0203,045,0301,01,0104,0110,022,0,
+ /* 3984 */ 0241,0203,051,0301,01,0104,0120,023,0,
+ /* 3993 */ 0240,0203,051,0301,01,0104,0110,022,0,
+ /* 4002 */ 0241,0203,01,0301,01,03,0120,023,0,
+ /* 4011 */ 0240,0203,01,0301,01,03,0110,022,0,
+ /* 4020 */ 0241,0203,05,0301,01,03,0120,023,0,
+ /* 4029 */ 0240,0203,05,0301,01,03,0110,022,0,
+ /* 4038 */ 0241,0203,011,0301,01,03,0120,023,0,
+ /* 4047 */ 0240,0203,011,0301,01,03,0110,022,0,
+ /* 4056 */ 0241,0203,021,0301,01,03,0120,023,0,
+ /* 4065 */ 0240,0203,021,0301,01,03,0110,022,0,
+ /* 4074 */ 0241,0203,025,0301,01,03,0120,023,0,
+ /* 4083 */ 0240,0203,025,0301,01,03,0110,022,0,
+ /* 4092 */ 0241,0203,031,0301,01,03,0120,023,0,
+ /* 4101 */ 0240,0203,031,0301,01,03,0110,022,0,
+ /* 4110 */ 0241,0201,021,0301,01,0302,0120,023,0,
+ /* 4119 */ 0241,0201,025,0301,01,0302,0120,023,0,
+ /* 4128 */ 0241,0201,031,0301,01,0302,0120,023,0,
+ /* 4137 */ 0241,0201,0,0301,01,0302,0120,023,0,
+ /* 4146 */ 0241,0201,04,0301,01,0302,0120,023,0,
+ /* 4155 */ 0241,0201,010,0301,01,0302,0120,023,0,
+ /* 4164 */ 0241,0201,023,0306,01,0302,0120,023,0,
+ /* 4173 */ 0241,0201,02,0306,01,0302,0120,023,0,
+ /* 4182 */ 0250,0203,01,0314,01,035,0101,022,0,
+ /* 4191 */ 0250,0203,05,0314,01,035,0101,022,0,
+ /* 4200 */ 0250,0203,011,0314,01,035,0101,022,0,
+ /* 4209 */ 0241,0203,01,0303,01,0102,0120,023,0,
+ /* 4218 */ 0240,0203,01,0303,01,0102,0110,022,0,
+ /* 4227 */ 0241,0203,05,0303,01,0102,0120,023,0,
+ /* 4236 */ 0240,0203,05,0303,01,0102,0110,022,0,
+ /* 4245 */ 0241,0203,011,0303,01,0102,0120,023,0,
+ /* 4254 */ 0240,0203,011,0303,01,0102,0110,022,0,
+ /* 4263 */ 0250,0203,05,0300,01,031,0101,022,0,
+ /* 4272 */ 0250,0203,011,0300,01,031,0101,022,0,
+ /* 4281 */ 0250,0203,05,0312,01,031,0101,022,0,
+ /* 4290 */ 0250,0203,011,0312,01,031,0101,022,0,
+ /* 4299 */ 0250,0203,011,0300,01,033,0101,022,0,
+ /* 4308 */ 0250,0203,011,0313,01,033,0101,022,0,
+ /* 4317 */ 0250,0203,025,0300,01,031,0101,022,0,
+ /* 4326 */ 0250,0203,031,0300,01,031,0101,022,0,
+ /* 4335 */ 0250,0203,025,0311,01,031,0101,022,0,
+ /* 4344 */ 0250,0203,031,0311,01,031,0101,022,0,
+ /* 4353 */ 0250,0203,031,0300,01,033,0101,022,0,
+ /* 4362 */ 0250,0203,031,0312,01,033,0101,022,0,
+ /* 4371 */ 0250,0203,05,0300,01,071,0101,022,0,
+ /* 4380 */ 0250,0203,011,0300,01,071,0101,022,0,
+ /* 4389 */ 0250,0203,05,0312,01,071,0101,022,0,
+ /* 4398 */ 0250,0203,011,0312,01,071,0101,022,0,
+ /* 4407 */ 0250,0203,011,0300,01,073,0101,022,0,
+ /* 4416 */ 0250,0203,011,0313,01,073,0101,022,0,
+ /* 4425 */ 0250,0203,025,0300,01,071,0101,022,0,
+ /* 4434 */ 0250,0203,031,0300,01,071,0101,022,0,
+ /* 4443 */ 0250,0203,025,0311,01,071,0101,022,0,
+ /* 4452 */ 0250,0203,031,0311,01,071,0101,022,0,
+ /* 4461 */ 0250,0203,031,0300,01,073,0101,022,0,
+ /* 4470 */ 0250,0203,031,0312,01,073,0101,022,0,
+ /* 4479 */ 0250,0203,041,0306,01,027,0101,022,0,
+ /* 4488 */ 0241,0203,021,0301,01,0124,0120,023,0,
+ /* 4497 */ 0240,0203,021,0301,01,0124,0110,022,0,
+ /* 4506 */ 0241,0203,025,0301,01,0124,0120,023,0,
+ /* 4515 */ 0240,0203,025,0301,01,0124,0110,022,0,
+ /* 4524 */ 0241,0203,031,0301,01,0124,0120,023,0,
+ /* 4533 */ 0240,0203,031,0301,01,0124,0110,022,0,
+ /* 4542 */ 0241,0203,01,0301,01,0124,0120,023,0,
+ /* 4551 */ 0240,0203,01,0301,01,0124,0110,022,0,
+ /* 4560 */ 0241,0203,05,0301,01,0124,0120,023,0,
+ /* 4569 */ 0240,0203,05,0301,01,0124,0110,022,0,
+ /* 4578 */ 0241,0203,011,0301,01,0124,0120,023,0,
+ /* 4587 */ 0240,0203,011,0301,01,0124,0110,022,0,
+ /* 4596 */ 0241,0203,021,0306,01,0125,0120,023,0,
+ /* 4605 */ 0240,0203,021,0306,01,0125,0110,022,0,
+ /* 4614 */ 0241,0203,01,0306,01,0125,0120,023,0,
+ /* 4623 */ 0240,0203,01,0306,01,0125,0110,022,0,
+ /* 4632 */ 0250,0203,021,0301,01,0146,0110,022,0,
+ /* 4641 */ 0250,0203,025,0301,01,0146,0110,022,0,
+ /* 4650 */ 0250,0203,031,0301,01,0146,0110,022,0,
+ /* 4659 */ 0250,0203,01,0301,01,0146,0110,022,0,
+ /* 4668 */ 0250,0203,05,0301,01,0146,0110,022,0,
+ /* 4677 */ 0250,0203,011,0301,01,0146,0110,022,0,
+ /* 4686 */ 0250,0203,021,0306,01,0147,0110,022,0,
+ /* 4695 */ 0250,0203,01,0306,01,0147,0110,022,0,
+ /* 4704 */ 0374,0250,0202,021,0306,01,0222,0110,0,
+ /* 4713 */ 0374,0250,0202,025,0306,01,0222,0110,0,
+ /* 4722 */ 0375,0250,0202,031,0306,01,0222,0110,0,
+ /* 4731 */ 0374,0250,0202,01,0306,01,0222,0110,0,
+ /* 4740 */ 0375,0250,0202,05,0306,01,0222,0110,0,
+ /* 4749 */ 0376,0250,0202,011,0306,01,0222,0110,0,
+ /* 4758 */ 0375,0250,0202,031,0306,01,0306,0201,0,
+ /* 4767 */ 0376,0250,0202,011,0306,01,0306,0201,0,
+ /* 4776 */ 0376,0250,0202,031,0306,01,0307,0201,0,
+ /* 4785 */ 0376,0250,0202,011,0306,01,0307,0201,0,
+ /* 4794 */ 0375,0250,0202,031,0306,01,0306,0202,0,
+ /* 4803 */ 0376,0250,0202,011,0306,01,0306,0202,0,
+ /* 4812 */ 0376,0250,0202,031,0306,01,0307,0202,0,
+ /* 4821 */ 0376,0250,0202,011,0306,01,0307,0202,0,
+ /* 4830 */ 0374,0250,0202,021,0306,01,0223,0110,0,
+ /* 4839 */ 0375,0250,0202,025,0306,01,0223,0110,0,
+ /* 4848 */ 0376,0250,0202,031,0306,01,0223,0110,0,
+ /* 4857 */ 0374,0250,0202,01,0306,01,0223,0110,0,
+ /* 4866 */ 0375,0250,0202,05,0306,01,0223,0110,0,
+ /* 4875 */ 0376,0250,0202,011,0306,01,0223,0110,0,
+ /* 4884 */ 0250,0203,021,0301,01,046,0110,022,0,
+ /* 4893 */ 0250,0203,025,0301,01,046,0110,022,0,
+ /* 4902 */ 0250,0203,031,0301,01,046,0110,022,0,
+ /* 4911 */ 0250,0203,01,0301,01,046,0110,022,0,
+ /* 4920 */ 0250,0203,05,0301,01,046,0110,022,0,
+ /* 4929 */ 0250,0203,011,0301,01,046,0110,022,0,
+ /* 4938 */ 0241,0203,021,0306,01,047,0120,023,0,
+ /* 4947 */ 0241,0203,01,0306,01,047,0120,023,0,
+ /* 4956 */ 0241,0203,05,0312,01,030,0120,023,0,
+ /* 4965 */ 0240,0203,05,0312,01,030,0110,022,0,
+ /* 4974 */ 0241,0203,011,0312,01,030,0120,023,0,
+ /* 4983 */ 0240,0203,011,0312,01,030,0110,022,0,
+ /* 4992 */ 0241,0203,011,0313,01,032,0120,023,0,
+ /* 5001 */ 0240,0203,011,0313,01,032,0110,022,0,
+ /* 5010 */ 0241,0203,025,0311,01,030,0120,023,0,
+ /* 5019 */ 0240,0203,025,0311,01,030,0110,022,0,
+ /* 5028 */ 0241,0203,031,0311,01,030,0120,023,0,
+ /* 5037 */ 0240,0203,031,0311,01,030,0110,022,0,
+ /* 5046 */ 0241,0203,031,0312,01,032,0120,023,0,
+ /* 5055 */ 0240,0203,031,0312,01,032,0110,022,0,
+ /* 5064 */ 0241,0203,05,0312,01,070,0120,023,0,
+ /* 5073 */ 0240,0203,05,0312,01,070,0110,022,0,
+ /* 5082 */ 0241,0203,011,0312,01,070,0120,023,0,
+ /* 5091 */ 0240,0203,011,0312,01,070,0110,022,0,
+ /* 5100 */ 0241,0203,011,0313,01,072,0120,023,0,
+ /* 5109 */ 0240,0203,011,0313,01,072,0110,022,0,
+ /* 5118 */ 0241,0203,025,0311,01,070,0120,023,0,
+ /* 5127 */ 0240,0203,025,0311,01,070,0110,022,0,
+ /* 5136 */ 0241,0203,031,0311,01,070,0120,023,0,
+ /* 5145 */ 0240,0203,031,0311,01,070,0110,022,0,
+ /* 5154 */ 0241,0203,031,0312,01,072,0120,023,0,
+ /* 5163 */ 0240,0203,031,0312,01,072,0110,022,0,
+ /* 5172 */ 0241,0203,01,0306,01,041,0120,023,0,
+ /* 5181 */ 0240,0203,01,0306,01,041,0110,022,0,
+ /* 5190 */ 0241,0203,041,0303,01,017,0120,023,0,
+ /* 5199 */ 0240,0203,041,0303,01,017,0110,022,0,
+ /* 5208 */ 0241,0203,045,0303,01,017,0120,023,0,
+ /* 5217 */ 0240,0203,045,0303,01,017,0110,022,0,
+ /* 5226 */ 0241,0203,051,0303,01,017,0120,023,0,
+ /* 5235 */ 0240,0203,051,0303,01,017,0110,022,0,
+ /* 5244 */ 0241,0203,01,0303,01,077,0120,023,0,
+ /* 5253 */ 0241,0203,05,0303,01,077,0120,023,0,
+ /* 5262 */ 0241,0203,011,0303,01,077,0120,023,0,
+ /* 5271 */ 0241,0203,01,0301,01,037,0120,023,0,
+ /* 5280 */ 0241,0203,05,0301,01,037,0120,023,0,
+ /* 5289 */ 0241,0203,011,0301,01,037,0120,023,0,
+ /* 5298 */ 0241,0203,021,0301,01,037,0120,023,0,
+ /* 5307 */ 0241,0203,025,0301,01,037,0120,023,0,
+ /* 5316 */ 0241,0203,031,0301,01,037,0120,023,0,
+ /* 5325 */ 0241,0203,01,0303,01,076,0120,023,0,
+ /* 5334 */ 0241,0203,05,0303,01,076,0120,023,0,
+ /* 5343 */ 0241,0203,011,0303,01,076,0120,023,0,
+ /* 5352 */ 0241,0203,01,0301,01,036,0120,023,0,
+ /* 5361 */ 0241,0203,05,0301,01,036,0120,023,0,
+ /* 5370 */ 0241,0203,011,0301,01,036,0120,023,0,
+ /* 5379 */ 0241,0203,021,0301,01,036,0120,023,0,
+ /* 5388 */ 0241,0203,025,0301,01,036,0120,023,0,
+ /* 5397 */ 0241,0203,031,0301,01,036,0120,023,0,
+ /* 5406 */ 0241,0203,021,0303,01,076,0120,023,0,
+ /* 5415 */ 0241,0203,025,0303,01,076,0120,023,0,
+ /* 5424 */ 0241,0203,031,0303,01,076,0120,023,0,
+ /* 5433 */ 0241,0203,021,0303,01,077,0120,023,0,
+ /* 5442 */ 0241,0203,025,0303,01,077,0120,023,0,
+ /* 5451 */ 0241,0203,031,0303,01,077,0120,023,0,
+ /* 5460 */ 0250,0203,021,0301,01,05,0110,022,0,
+ /* 5469 */ 0250,0203,025,0301,01,05,0110,022,0,
+ /* 5478 */ 0250,0203,031,0301,01,05,0110,022,0,
+ /* 5487 */ 0250,0203,01,0301,01,04,0110,022,0,
+ /* 5496 */ 0250,0203,05,0301,01,04,0110,022,0,
+ /* 5505 */ 0250,0203,011,0301,01,04,0110,022,0,
+ /* 5514 */ 0250,0203,025,0301,01,01,0110,022,0,
+ /* 5523 */ 0250,0203,031,0301,01,01,0110,022,0,
+ /* 5532 */ 0250,0203,025,0301,01,0,0110,022,0,
+ /* 5541 */ 0250,0203,031,0301,01,0,0110,022,0,
+ /* 5550 */ 0250,0203,041,0304,01,024,0101,022,0,
+ /* 5559 */ 0250,0203,01,0306,01,026,0101,022,0,
+ /* 5568 */ 0250,0203,021,0306,01,026,0101,022,0,
+ /* 5577 */ 0250,0203,041,0305,01,025,0101,022,0,
+ /* 5586 */ 0250,0201,041,0300,01,0305,0110,022,0,
+ /* 5595 */ 0374,0250,0202,01,0306,01,0220,0110,0,
+ /* 5604 */ 0375,0250,0202,05,0306,01,0220,0110,0,
+ /* 5613 */ 0376,0250,0202,011,0306,01,0220,0110,0,
+ /* 5622 */ 0374,0250,0202,021,0306,01,0220,0110,0,
+ /* 5631 */ 0374,0250,0202,025,0306,01,0220,0110,0,
+ /* 5640 */ 0375,0250,0202,031,0306,01,0220,0110,0,
+ /* 5649 */ 0374,0250,0202,01,0306,01,0221,0110,0,
+ /* 5658 */ 0375,0250,0202,05,0306,01,0221,0110,0,
+ /* 5667 */ 0376,0250,0202,011,0306,01,0221,0110,0,
+ /* 5676 */ 0374,0250,0202,021,0306,01,0221,0110,0,
+ /* 5685 */ 0375,0250,0202,025,0306,01,0221,0110,0,
+ /* 5694 */ 0376,0250,0202,031,0306,01,0221,0110,0,
+ /* 5703 */ 0241,0203,041,0304,01,040,0120,023,0,
+ /* 5712 */ 0240,0203,041,0304,01,040,0110,022,0,
+ /* 5721 */ 0241,0203,01,0306,01,042,0120,023,0,
+ /* 5730 */ 0240,0203,01,0306,01,042,0110,022,0,
+ /* 5739 */ 0241,0203,021,0306,01,042,0120,023,0,
+ /* 5748 */ 0240,0203,021,0306,01,042,0110,022,0,
+ /* 5757 */ 0241,0201,041,0305,01,0304,0120,023,0,
+ /* 5766 */ 0240,0201,041,0305,01,0304,0110,022,0,
+ /* 5775 */ 0240,0201,01,0301,01,0162,0211,022,0,
+ /* 5784 */ 0240,0201,01,0301,01,0162,0201,021,0,
+ /* 5793 */ 0240,0201,05,0301,01,0162,0211,022,0,
+ /* 5802 */ 0240,0201,05,0301,01,0162,0201,021,0,
+ /* 5811 */ 0240,0201,011,0301,01,0162,0211,022,0,
+ /* 5820 */ 0240,0201,011,0301,01,0162,0201,021,0,
+ /* 5829 */ 0240,0201,021,0301,01,0162,0211,022,0,
+ /* 5838 */ 0240,0201,021,0301,01,0162,0201,021,0,
+ /* 5847 */ 0240,0201,025,0301,01,0162,0211,022,0,
+ /* 5856 */ 0240,0201,025,0301,01,0162,0201,021,0,
+ /* 5865 */ 0240,0201,031,0301,01,0162,0211,022,0,
+ /* 5874 */ 0240,0201,031,0301,01,0162,0201,021,0,
+ /* 5883 */ 0240,0201,01,0301,01,0162,0210,022,0,
+ /* 5892 */ 0240,0201,01,0301,01,0162,0200,021,0,
+ /* 5901 */ 0240,0201,05,0301,01,0162,0210,022,0,
+ /* 5910 */ 0240,0201,05,0301,01,0162,0200,021,0,
+ /* 5919 */ 0240,0201,011,0301,01,0162,0210,022,0,
+ /* 5928 */ 0240,0201,011,0301,01,0162,0200,021,0,
+ /* 5937 */ 0240,0201,021,0301,01,0162,0210,022,0,
+ /* 5946 */ 0240,0201,021,0301,01,0162,0200,021,0,
+ /* 5955 */ 0240,0201,025,0301,01,0162,0210,022,0,
+ /* 5964 */ 0240,0201,025,0301,01,0162,0200,021,0,
+ /* 5973 */ 0240,0201,031,0301,01,0162,0210,022,0,
+ /* 5982 */ 0240,0201,031,0301,01,0162,0200,021,0,
+ /* 5991 */ 0374,0250,0202,01,0306,01,0240,0101,0,
+ /* 6000 */ 0375,0250,0202,05,0306,01,0240,0101,0,
+ /* 6009 */ 0376,0250,0202,011,0306,01,0240,0101,0,
+ /* 6018 */ 0374,0250,0202,021,0306,01,0240,0101,0,
+ /* 6027 */ 0374,0250,0202,025,0306,01,0240,0101,0,
+ /* 6036 */ 0375,0250,0202,031,0306,01,0240,0101,0,
+ /* 6045 */ 0374,0250,0202,01,0306,01,0241,0101,0,
+ /* 6054 */ 0375,0250,0202,05,0306,01,0241,0101,0,
+ /* 6063 */ 0376,0250,0202,011,0306,01,0241,0101,0,
+ /* 6072 */ 0374,0250,0202,021,0306,01,0241,0101,0,
+ /* 6081 */ 0375,0250,0202,025,0306,01,0241,0101,0,
+ /* 6090 */ 0376,0250,0202,031,0306,01,0241,0101,0,
+ /* 6099 */ 0250,0201,01,0301,01,0160,0110,022,0,
+ /* 6108 */ 0250,0201,05,0301,01,0160,0110,022,0,
+ /* 6117 */ 0250,0201,011,0301,01,0160,0110,022,0,
+ /* 6126 */ 0250,0201,042,0303,01,0160,0110,022,0,
+ /* 6135 */ 0250,0201,046,0303,01,0160,0110,022,0,
+ /* 6144 */ 0250,0201,052,0303,01,0160,0110,022,0,
+ /* 6153 */ 0250,0201,043,0303,01,0160,0110,022,0,
+ /* 6162 */ 0250,0201,047,0303,01,0160,0110,022,0,
+ /* 6171 */ 0250,0201,053,0303,01,0160,0110,022,0,
+ /* 6180 */ 0240,0201,01,0301,01,0162,0216,022,0,
+ /* 6189 */ 0240,0201,01,0301,01,0162,0206,021,0,
+ /* 6198 */ 0240,0201,05,0301,01,0162,0216,022,0,
+ /* 6207 */ 0240,0201,05,0301,01,0162,0206,021,0,
+ /* 6216 */ 0240,0201,011,0301,01,0162,0216,022,0,
+ /* 6225 */ 0240,0201,011,0301,01,0162,0206,021,0,
+ /* 6234 */ 0240,0201,041,0303,01,0163,0217,022,0,
+ /* 6243 */ 0240,0201,041,0303,01,0163,0207,021,0,
+ /* 6252 */ 0240,0201,045,0303,01,0163,0217,022,0,
+ /* 6261 */ 0240,0201,045,0303,01,0163,0207,021,0,
+ /* 6270 */ 0240,0201,051,0303,01,0163,0217,022,0,
+ /* 6279 */ 0240,0201,051,0303,01,0163,0207,021,0,
+ /* 6288 */ 0240,0201,021,0301,01,0163,0216,022,0,
+ /* 6297 */ 0240,0201,021,0301,01,0163,0206,021,0,
+ /* 6306 */ 0240,0201,025,0301,01,0163,0216,022,0,
+ /* 6315 */ 0240,0201,025,0301,01,0163,0206,021,0,
+ /* 6324 */ 0240,0201,031,0301,01,0163,0216,022,0,
+ /* 6333 */ 0240,0201,031,0301,01,0163,0206,021,0,
+ /* 6342 */ 0240,0201,041,0303,01,0161,0216,022,0,
+ /* 6351 */ 0240,0201,041,0303,01,0161,0206,021,0,
+ /* 6360 */ 0240,0201,045,0303,01,0161,0216,022,0,
+ /* 6369 */ 0240,0201,045,0303,01,0161,0206,021,0,
+ /* 6378 */ 0240,0201,051,0303,01,0161,0216,022,0,
+ /* 6387 */ 0240,0201,051,0303,01,0161,0206,021,0,
+ /* 6396 */ 0240,0201,01,0301,01,0162,0214,022,0,
+ /* 6405 */ 0240,0201,01,0301,01,0162,0204,021,0,
+ /* 6414 */ 0240,0201,05,0301,01,0162,0214,022,0,
+ /* 6423 */ 0240,0201,05,0301,01,0162,0204,021,0,
+ /* 6432 */ 0240,0201,011,0301,01,0162,0214,022,0,
+ /* 6441 */ 0240,0201,011,0301,01,0162,0204,021,0,
+ /* 6450 */ 0240,0201,021,0301,01,0162,0214,022,0,
+ /* 6459 */ 0240,0201,021,0301,01,0162,0204,021,0,
+ /* 6468 */ 0240,0201,025,0301,01,0162,0214,022,0,
+ /* 6477 */ 0240,0201,025,0301,01,0162,0204,021,0,
+ /* 6486 */ 0240,0201,031,0301,01,0162,0214,022,0,
+ /* 6495 */ 0240,0201,031,0301,01,0162,0204,021,0,
+ /* 6504 */ 0240,0201,041,0303,01,0161,0214,022,0,
+ /* 6513 */ 0240,0201,041,0303,01,0161,0204,021,0,
+ /* 6522 */ 0240,0201,045,0303,01,0161,0214,022,0,
+ /* 6531 */ 0240,0201,045,0303,01,0161,0204,021,0,
+ /* 6540 */ 0240,0201,051,0303,01,0161,0214,022,0,
+ /* 6549 */ 0240,0201,051,0303,01,0161,0204,021,0,
+ /* 6558 */ 0240,0201,01,0301,01,0162,0212,022,0,
+ /* 6567 */ 0240,0201,01,0301,01,0162,0202,021,0,
+ /* 6576 */ 0240,0201,05,0301,01,0162,0212,022,0,
+ /* 6585 */ 0240,0201,05,0301,01,0162,0202,021,0,
+ /* 6594 */ 0240,0201,011,0301,01,0162,0212,022,0,
+ /* 6603 */ 0240,0201,011,0301,01,0162,0202,021,0,
+ /* 6612 */ 0240,0201,041,0303,01,0163,0213,022,0,
+ /* 6621 */ 0240,0201,041,0303,01,0163,0203,021,0,
+ /* 6630 */ 0240,0201,045,0303,01,0163,0213,022,0,
+ /* 6639 */ 0240,0201,045,0303,01,0163,0203,021,0,
+ /* 6648 */ 0240,0201,051,0303,01,0163,0213,022,0,
+ /* 6657 */ 0240,0201,051,0303,01,0163,0203,021,0,
+ /* 6666 */ 0240,0201,021,0301,01,0163,0212,022,0,
+ /* 6675 */ 0240,0201,021,0301,01,0163,0202,021,0,
+ /* 6684 */ 0240,0201,025,0301,01,0163,0212,022,0,
+ /* 6693 */ 0240,0201,025,0301,01,0163,0202,021,0,
+ /* 6702 */ 0240,0201,031,0301,01,0163,0212,022,0,
+ /* 6711 */ 0240,0201,031,0301,01,0163,0202,021,0,
+ /* 6720 */ 0240,0201,041,0303,01,0161,0212,022,0,
+ /* 6729 */ 0240,0201,041,0303,01,0161,0202,021,0,
+ /* 6738 */ 0240,0201,045,0303,01,0161,0212,022,0,
+ /* 6747 */ 0240,0201,045,0303,01,0161,0202,021,0,
+ /* 6756 */ 0240,0201,051,0303,01,0161,0212,022,0,
+ /* 6765 */ 0240,0201,051,0303,01,0161,0202,021,0,
+ /* 6774 */ 0241,0203,01,0301,01,045,0120,023,0,
+ /* 6783 */ 0241,0203,05,0301,01,045,0120,023,0,
+ /* 6792 */ 0241,0203,011,0301,01,045,0120,023,0,
+ /* 6801 */ 0241,0203,021,0301,01,045,0120,023,0,
+ /* 6810 */ 0241,0203,025,0301,01,045,0120,023,0,
+ /* 6819 */ 0241,0203,031,0301,01,045,0120,023,0,
+ /* 6828 */ 0241,0203,021,0301,01,0120,0120,023,0,
+ /* 6837 */ 0240,0203,021,0301,01,0120,0110,022,0,
+ /* 6846 */ 0241,0203,025,0301,01,0120,0120,023,0,
+ /* 6855 */ 0240,0203,025,0301,01,0120,0110,022,0,
+ /* 6864 */ 0241,0203,031,0301,01,0120,0120,023,0,
+ /* 6873 */ 0240,0203,031,0301,01,0120,0110,022,0,
+ /* 6882 */ 0241,0203,01,0301,01,0120,0120,023,0,
+ /* 6891 */ 0240,0203,01,0301,01,0120,0110,022,0,
+ /* 6900 */ 0241,0203,05,0301,01,0120,0120,023,0,
+ /* 6909 */ 0240,0203,05,0301,01,0120,0110,022,0,
+ /* 6918 */ 0241,0203,011,0301,01,0120,0120,023,0,
+ /* 6927 */ 0240,0203,011,0301,01,0120,0110,022,0,
+ /* 6936 */ 0241,0203,021,0306,01,0121,0120,023,0,
+ /* 6945 */ 0240,0203,021,0306,01,0121,0110,022,0,
+ /* 6954 */ 0241,0203,01,0306,01,0121,0120,023,0,
+ /* 6963 */ 0240,0203,01,0306,01,0121,0110,022,0,
+ /* 6972 */ 0250,0203,021,0301,01,0126,0110,022,0,
+ /* 6981 */ 0250,0203,025,0301,01,0126,0110,022,0,
+ /* 6990 */ 0250,0203,031,0301,01,0126,0110,022,0,
+ /* 6999 */ 0250,0203,01,0301,01,0126,0110,022,0,
+ /* 7008 */ 0250,0203,05,0301,01,0126,0110,022,0,
+ /* 7017 */ 0250,0203,011,0301,01,0126,0110,022,0,
+ /* 7026 */ 0241,0203,021,0306,01,0127,0120,023,0,
+ /* 7035 */ 0240,0203,021,0306,01,0127,0110,022,0,
+ /* 7044 */ 0241,0203,01,0306,01,0127,0120,023,0,
+ /* 7053 */ 0240,0203,01,0306,01,0127,0110,022,0,
+ /* 7062 */ 0250,0203,021,0301,01,011,0110,022,0,
+ /* 7071 */ 0250,0203,025,0301,01,011,0110,022,0,
+ /* 7080 */ 0250,0203,031,0301,01,011,0110,022,0,
+ /* 7089 */ 0250,0203,01,0301,01,010,0110,022,0,
+ /* 7098 */ 0250,0203,05,0301,01,010,0110,022,0,
+ /* 7107 */ 0250,0203,011,0301,01,010,0110,022,0,
+ /* 7116 */ 0241,0203,021,0306,01,013,0120,023,0,
+ /* 7125 */ 0240,0203,021,0306,01,013,0110,022,0,
+ /* 7134 */ 0241,0203,01,0306,01,012,0120,023,0,
+ /* 7143 */ 0240,0203,01,0306,01,012,0110,022,0,
+ /* 7152 */ 0374,0250,0202,021,0306,01,0242,0101,0,
+ /* 7161 */ 0374,0250,0202,025,0306,01,0242,0101,0,
+ /* 7170 */ 0375,0250,0202,031,0306,01,0242,0101,0,
+ /* 7179 */ 0374,0250,0202,01,0306,01,0242,0101,0,
+ /* 7188 */ 0375,0250,0202,05,0306,01,0242,0101,0,
+ /* 7197 */ 0376,0250,0202,011,0306,01,0242,0101,0,
+ /* 7206 */ 0375,0250,0202,031,0306,01,0306,0205,0,
+ /* 7215 */ 0376,0250,0202,011,0306,01,0306,0205,0,
+ /* 7224 */ 0376,0250,0202,031,0306,01,0307,0205,0,
+ /* 7233 */ 0376,0250,0202,011,0306,01,0307,0205,0,
+ /* 7242 */ 0375,0250,0202,031,0306,01,0306,0206,0,
+ /* 7251 */ 0376,0250,0202,011,0306,01,0306,0206,0,
+ /* 7260 */ 0376,0250,0202,031,0306,01,0307,0206,0,
+ /* 7269 */ 0376,0250,0202,011,0306,01,0307,0206,0,
+ /* 7278 */ 0374,0250,0202,021,0306,01,0243,0101,0,
+ /* 7287 */ 0375,0250,0202,025,0306,01,0243,0101,0,
+ /* 7296 */ 0376,0250,0202,031,0306,01,0243,0101,0,
+ /* 7305 */ 0374,0250,0202,01,0306,01,0243,0101,0,
+ /* 7314 */ 0375,0250,0202,05,0306,01,0243,0101,0,
+ /* 7323 */ 0376,0250,0202,011,0306,01,0243,0101,0,
+ /* 7332 */ 0241,0203,05,0301,01,043,0120,023,0,
+ /* 7341 */ 0240,0203,05,0301,01,043,0110,022,0,
+ /* 7350 */ 0241,0203,011,0301,01,043,0120,023,0,
+ /* 7359 */ 0240,0203,011,0301,01,043,0110,022,0,
+ /* 7368 */ 0241,0203,025,0301,01,043,0120,023,0,
+ /* 7377 */ 0240,0203,025,0301,01,043,0110,022,0,
+ /* 7386 */ 0241,0203,031,0301,01,043,0120,023,0,
+ /* 7395 */ 0240,0203,031,0301,01,043,0110,022,0,
+ /* 7404 */ 0241,0203,05,0301,01,0103,0120,023,0,
+ /* 7413 */ 0240,0203,05,0301,01,0103,0110,022,0,
+ /* 7422 */ 0241,0203,011,0301,01,0103,0120,023,0,
+ /* 7431 */ 0240,0203,011,0301,01,0103,0110,022,0,
+ /* 7440 */ 0241,0203,025,0301,01,0103,0120,023,0,
+ /* 7449 */ 0240,0203,025,0301,01,0103,0110,022,0,
+ /* 7458 */ 0241,0203,031,0301,01,0103,0120,023,0,
+ /* 7467 */ 0240,0203,031,0301,01,0103,0110,022,0,
+ /* 7476 */ 0241,0201,021,0301,01,0306,0120,023,0,
+ /* 7485 */ 0240,0201,021,0301,01,0306,0110,022,0,
+ /* 7494 */ 0241,0201,025,0301,01,0306,0120,023,0,
+ /* 7503 */ 0240,0201,025,0301,01,0306,0110,022,0,
+ /* 7512 */ 0241,0201,031,0301,01,0306,0120,023,0,
+ /* 7521 */ 0240,0201,031,0301,01,0306,0110,022,0,
+ /* 7530 */ 0241,0201,0,0301,01,0306,0120,023,0,
+ /* 7539 */ 0240,0201,0,0301,01,0306,0110,022,0,
+ /* 7548 */ 0241,0201,04,0301,01,0306,0120,023,0,
+ /* 7557 */ 0240,0201,04,0301,01,0306,0110,022,0,
+ /* 7566 */ 0241,0201,010,0301,01,0306,0120,023,0,
+ /* 7575 */ 0240,0201,010,0301,01,0306,0110,022,0,
+ /* 7584 */ 0241,0203,021,0301,01,0317,0120,023,0,
+ /* 7593 */ 0240,0203,021,0301,01,0317,0110,022,0,
+ /* 7602 */ 0241,0203,025,0301,01,0317,0120,023,0,
+ /* 7611 */ 0240,0203,025,0301,01,0317,0110,022,0,
+ /* 7620 */ 0241,0203,031,0301,01,0317,0120,023,0,
+ /* 7629 */ 0240,0203,031,0301,01,0317,0110,022,0,
+ /* 7638 */ 0241,0203,021,0301,01,0316,0120,023,0,
+ /* 7647 */ 0240,0203,021,0301,01,0316,0110,022,0,
+ /* 7656 */ 0241,0203,025,0301,01,0316,0120,023,0,
+ /* 7665 */ 0240,0203,025,0301,01,0316,0110,022,0,
+ /* 7674 */ 0241,0203,031,0301,01,0316,0120,023,0,
+ /* 7683 */ 0240,0203,031,0301,01,0316,0110,022,0,
+ /* 7692 */ 0241,0203,021,0303,01,0160,0120,023,0,
+ /* 7701 */ 0240,0203,021,0303,01,0160,0110,022,0,
+ /* 7710 */ 0241,0203,025,0303,01,0160,0120,023,0,
+ /* 7719 */ 0240,0203,025,0303,01,0160,0110,022,0,
+ /* 7728 */ 0241,0203,031,0303,01,0160,0120,023,0,
+ /* 7737 */ 0240,0203,031,0303,01,0160,0110,022,0,
+ /* 7746 */ 0241,0203,01,0301,01,0161,0120,023,0,
+ /* 7755 */ 0240,0203,01,0301,01,0161,0110,022,0,
+ /* 7764 */ 0241,0203,05,0301,01,0161,0120,023,0,
+ /* 7773 */ 0240,0203,05,0301,01,0161,0110,022,0,
+ /* 7782 */ 0241,0203,011,0301,01,0161,0120,023,0,
+ /* 7791 */ 0240,0203,011,0301,01,0161,0110,022,0,
+ /* 7800 */ 0241,0203,021,0301,01,0161,0120,023,0,
+ /* 7809 */ 0240,0203,021,0301,01,0161,0110,022,0,
+ /* 7818 */ 0241,0203,025,0301,01,0161,0120,023,0,
+ /* 7827 */ 0240,0203,025,0301,01,0161,0110,022,0,
+ /* 7836 */ 0241,0203,031,0301,01,0161,0120,023,0,
+ /* 7845 */ 0240,0203,031,0301,01,0161,0110,022,0,
+ /* 7854 */ 0241,0202,021,0303,01,0160,0120,023,0,
+ /* 7863 */ 0240,0202,021,0303,01,0160,0110,022,0,
+ /* 7872 */ 0241,0202,025,0303,01,0160,0120,023,0,
+ /* 7881 */ 0240,0202,025,0303,01,0160,0110,022,0,
+ /* 7890 */ 0241,0202,031,0303,01,0160,0120,023,0,
+ /* 7899 */ 0240,0202,031,0303,01,0160,0110,022,0,
+ /* 7908 */ 0241,0202,01,0301,01,0161,0120,023,0,
+ /* 7917 */ 0240,0202,01,0301,01,0161,0110,022,0,
+ /* 7926 */ 0241,0202,05,0301,01,0161,0120,023,0,
+ /* 7935 */ 0240,0202,05,0301,01,0161,0110,022,0,
+ /* 7944 */ 0241,0202,011,0301,01,0161,0120,023,0,
+ /* 7953 */ 0240,0202,011,0301,01,0161,0110,022,0,
+ /* 7962 */ 0241,0202,021,0301,01,0161,0120,023,0,
+ /* 7971 */ 0240,0202,021,0301,01,0161,0110,022,0,
+ /* 7980 */ 0241,0202,025,0301,01,0161,0120,023,0,
+ /* 7989 */ 0240,0202,025,0301,01,0161,0110,022,0,
+ /* 7998 */ 0241,0202,031,0301,01,0161,0120,023,0,
+ /* 8007 */ 0240,0202,031,0301,01,0161,0110,022,0,
+ /* 8016 */ 0241,0203,021,0303,01,0162,0120,023,0,
+ /* 8025 */ 0240,0203,021,0303,01,0162,0110,022,0,
+ /* 8034 */ 0241,0203,025,0303,01,0162,0120,023,0,
+ /* 8043 */ 0240,0203,025,0303,01,0162,0110,022,0,
+ /* 8052 */ 0241,0203,031,0303,01,0162,0120,023,0,
+ /* 8061 */ 0240,0203,031,0303,01,0162,0110,022,0,
+ /* 8070 */ 0241,0203,01,0301,01,0163,0120,023,0,
+ /* 8079 */ 0240,0203,01,0301,01,0163,0110,022,0,
+ /* 8088 */ 0241,0203,05,0301,01,0163,0120,023,0,
+ /* 8097 */ 0240,0203,05,0301,01,0163,0110,022,0,
+ /* 8106 */ 0241,0203,011,0301,01,0163,0120,023,0,
+ /* 8115 */ 0240,0203,011,0301,01,0163,0110,022,0,
+ /* 8124 */ 0241,0203,021,0301,01,0163,0120,023,0,
+ /* 8133 */ 0240,0203,021,0301,01,0163,0110,022,0,
+ /* 8142 */ 0241,0203,025,0301,01,0163,0120,023,0,
+ /* 8151 */ 0240,0203,025,0301,01,0163,0110,022,0,
+ /* 8160 */ 0241,0203,031,0301,01,0163,0120,023,0,
+ /* 8169 */ 0240,0203,031,0301,01,0163,0110,022,0,
+ /* 8178 */ 0241,0202,021,0303,01,0162,0120,023,0,
+ /* 8187 */ 0240,0202,021,0303,01,0162,0110,022,0,
+ /* 8196 */ 0241,0202,025,0303,01,0162,0120,023,0,
+ /* 8205 */ 0240,0202,025,0303,01,0162,0110,022,0,
+ /* 8214 */ 0241,0202,031,0303,01,0162,0120,023,0,
+ /* 8223 */ 0240,0202,031,0303,01,0162,0110,022,0,
+ /* 8232 */ 0241,0202,01,0301,01,0163,0120,023,0,
+ /* 8241 */ 0240,0202,01,0301,01,0163,0110,022,0,
+ /* 8250 */ 0241,0202,05,0301,01,0163,0120,023,0,
+ /* 8259 */ 0240,0202,05,0301,01,0163,0110,022,0,
+ /* 8268 */ 0241,0202,011,0301,01,0163,0120,023,0,
+ /* 8277 */ 0240,0202,011,0301,01,0163,0110,022,0,
+ /* 8286 */ 0241,0202,021,0301,01,0163,0120,023,0,
+ /* 8295 */ 0240,0202,021,0301,01,0163,0110,022,0,
+ /* 8304 */ 0241,0202,025,0301,01,0163,0120,023,0,
+ /* 8313 */ 0240,0202,025,0301,01,0163,0110,022,0,
+ /* 8322 */ 0241,0202,031,0301,01,0163,0120,023,0,
+ /* 8331 */ 0240,0202,031,0301,01,0163,0110,022,0,
+ /* 8340 */ 0273,0320,02,017,0272,0207,025,0,
+ /* 8348 */ 0273,0321,02,017,0272,0207,025,0,
+ /* 8356 */ 0273,0324,02,017,0272,0207,025,0,
+ /* 8364 */ 0273,0320,02,017,0272,0206,025,0,
+ /* 8372 */ 0273,0321,02,017,0272,0206,025,0,
+ /* 8380 */ 0273,0324,02,017,0272,0206,025,0,
+ /* 8388 */ 0273,0320,02,017,0272,0205,025,0,
+ /* 8396 */ 0273,0321,02,017,0272,0205,025,0,
+ /* 8404 */ 0273,0324,02,017,0272,0205,025,0,
+ /* 8412 */ 0323,02,017,017,0110,01,0277,0,
+ /* 8420 */ 0323,02,017,017,0110,01,035,0,
+ /* 8428 */ 0323,02,017,017,0110,01,0256,0,
+ /* 8436 */ 0323,02,017,017,0110,01,0236,0,
+ /* 8444 */ 0323,02,017,017,0110,01,0260,0,
+ /* 8452 */ 0323,02,017,017,0110,01,0220,0,
+ /* 8460 */ 0323,02,017,017,0110,01,0240,0,
+ /* 8468 */ 0323,02,017,017,0110,01,0244,0,
+ /* 8476 */ 0323,02,017,017,0110,01,0224,0,
+ /* 8484 */ 0323,02,017,017,0110,01,0264,0,
+ /* 8492 */ 0323,02,017,017,0110,01,0226,0,
+ /* 8500 */ 0323,02,017,017,0110,01,0246,0,
+ /* 8508 */ 0323,02,017,017,0110,01,0266,0,
+ /* 8516 */ 0323,02,017,017,0110,01,0247,0,
+ /* 8524 */ 0323,02,017,017,0110,01,0227,0,
+ /* 8532 */ 0323,02,017,017,0110,01,0232,0,
+ /* 8540 */ 0323,02,017,017,0110,01,0252,0,
+ /* 8548 */ 0323,02,017,017,0110,01,015,0,
+ /* 8556 */ 0323,02,017,017,0110,01,0267,0,
+ /* 8564 */ 0360,02,017,0302,0110,01,0,0,
+ /* 8572 */ 0333,02,017,0302,0110,01,0,0,
+ /* 8580 */ 0360,02,017,0302,0110,01,02,0,
+ /* 8588 */ 0333,02,017,0302,0110,01,02,0,
+ /* 8596 */ 0360,02,017,0302,0110,01,01,0,
+ /* 8604 */ 0333,02,017,0302,0110,01,01,0,
+ /* 8612 */ 0360,02,017,0302,0110,01,04,0,
+ /* 8620 */ 0333,02,017,0302,0110,01,04,0,
+ /* 8628 */ 0360,02,017,0302,0110,01,06,0,
+ /* 8636 */ 0333,02,017,0302,0110,01,06,0,
+ /* 8644 */ 0360,02,017,0302,0110,01,05,0,
+ /* 8652 */ 0333,02,017,0302,0110,01,05,0,
+ /* 8660 */ 0360,02,017,0302,0110,01,07,0,
+ /* 8668 */ 0333,02,017,0302,0110,01,07,0,
+ /* 8676 */ 0360,02,017,0302,0110,01,03,0,
+ /* 8684 */ 0333,02,017,0302,0110,01,03,0,
+ /* 8692 */ 0360,0323,02,017,0160,0110,022,0,
+ /* 8700 */ 0323,02,017,017,0110,01,034,0,
+ /* 8708 */ 0323,02,017,017,0110,01,0212,0,
+ /* 8716 */ 0323,02,017,017,0110,01,0216,0,
+ /* 8724 */ 0323,02,017,017,0110,01,014,0,
+ /* 8732 */ 0323,02,017,017,0110,01,0273,0,
+ /* 8740 */ 0361,02,017,0302,0110,01,0,0,
+ /* 8748 */ 0332,02,017,0302,0110,01,0,0,
+ /* 8756 */ 0361,02,017,0302,0110,01,02,0,
+ /* 8764 */ 0332,02,017,0302,0110,01,02,0,
+ /* 8772 */ 0361,02,017,0302,0110,01,01,0,
+ /* 8780 */ 0332,02,017,0302,0110,01,01,0,
+ /* 8788 */ 0361,02,017,0302,0110,01,04,0,
+ /* 8796 */ 0332,02,017,0302,0110,01,04,0,
+ /* 8804 */ 0361,02,017,0302,0110,01,06,0,
+ /* 8812 */ 0332,02,017,0302,0110,01,06,0,
+ /* 8820 */ 0361,02,017,0302,0110,01,05,0,
+ /* 8828 */ 0332,02,017,0302,0110,01,05,0,
+ /* 8836 */ 0361,02,017,0302,0110,01,07,0,
+ /* 8844 */ 0332,02,017,0302,0110,01,07,0,
+ /* 8852 */ 0361,02,017,0302,0110,01,03,0,
+ /* 8860 */ 0332,02,017,0302,0110,01,03,0,
+ /* 8868 */ 0323,0361,03,017,070,0200,0110,0,
+ /* 8876 */ 0323,0361,03,017,070,0201,0110,0,
+ /* 8884 */ 0360,03,017,072,017,0110,026,0,
+ /* 8892 */ 0361,03,017,072,017,0110,026,0,
+ /* 8900 */ 0361,02,017,0170,0200,025,026,0,
+ /* 8908 */ 0332,02,017,0170,0110,026,027,0,
+ /* 8916 */ 0361,03,017,072,015,0110,026,0,
+ /* 8924 */ 0361,03,017,072,014,0110,026,0,
+ /* 8932 */ 0361,03,017,072,0101,0110,026,0,
+ /* 8940 */ 0361,03,017,072,0100,0110,026,0,
+ /* 8948 */ 0361,03,017,072,041,0110,026,0,
+ /* 8956 */ 0361,03,017,072,0102,0110,026,0,
+ /* 8964 */ 0361,03,017,072,016,0110,026,0,
+ /* 8972 */ 0361,03,017,072,011,0110,026,0,
+ /* 8980 */ 0361,03,017,072,010,0110,026,0,
+ /* 8988 */ 0361,03,017,072,013,0110,026,0,
+ /* 8996 */ 0361,03,017,072,012,0110,026,0,
+ /* 9004 */ 0320,0332,03,017,070,0361,0110,0,
+ /* 9012 */ 0321,0332,03,017,070,0361,0110,0,
+ /* 9020 */ 0324,0332,03,017,070,0360,0110,0,
+ /* 9028 */ 0324,0332,03,017,070,0361,0110,0,
+ /* 9036 */ 0361,03,017,072,0141,0110,026,0,
+ /* 9044 */ 0361,03,017,072,0140,0110,026,0,
+ /* 9052 */ 0361,03,017,072,0143,0110,026,0,
+ /* 9060 */ 0361,03,017,072,0142,0110,026,0,
+ /* 9068 */ 0323,02,017,017,0110,01,0206,0,
+ /* 9076 */ 0323,02,017,017,0110,01,0207,0,
+ /* 9084 */ 0320,0331,03,017,070,0360,0110,0,
+ /* 9092 */ 0321,0331,03,017,070,0360,0110,0,
+ /* 9100 */ 0324,0331,03,017,070,0360,0110,0,
+ /* 9108 */ 0320,0331,03,017,070,0361,0101,0,
+ /* 9116 */ 0321,0331,03,017,070,0361,0101,0,
+ /* 9124 */ 0324,0331,03,017,070,0361,0101,0,
+ /* 9132 */ 0361,03,017,072,0337,0110,022,0,
+ /* 9140 */ 0270,03,041,01,0337,0110,022,0,
+ /* 9148 */ 0241,0202,041,0301,01,0334,0120,0,
+ /* 9156 */ 0240,0202,041,0301,01,0334,0110,0,
+ /* 9164 */ 0241,0202,045,0301,01,0334,0120,0,
+ /* 9172 */ 0240,0202,045,0301,01,0334,0110,0,
+ /* 9180 */ 0241,0202,041,0301,01,0335,0120,0,
+ /* 9188 */ 0240,0202,041,0301,01,0335,0110,0,
+ /* 9196 */ 0241,0202,045,0301,01,0335,0120,0,
+ /* 9204 */ 0240,0202,045,0301,01,0335,0110,0,
+ /* 9212 */ 0241,0202,041,0301,01,0336,0120,0,
+ /* 9220 */ 0240,0202,041,0301,01,0336,0110,0,
+ /* 9228 */ 0241,0202,045,0301,01,0336,0120,0,
+ /* 9236 */ 0240,0202,045,0301,01,0336,0110,0,
+ /* 9244 */ 0241,0202,041,0301,01,0337,0120,0,
+ /* 9252 */ 0240,0202,041,0301,01,0337,0110,0,
+ /* 9260 */ 0241,0202,045,0301,01,0337,0120,0,
+ /* 9268 */ 0240,0202,045,0301,01,0337,0110,0,
+ /* 9276 */ 0241,0202,051,0301,01,0334,0120,0,
+ /* 9284 */ 0240,0202,051,0301,01,0334,0110,0,
+ /* 9292 */ 0241,0202,051,0301,01,0335,0120,0,
+ /* 9300 */ 0240,0202,051,0301,01,0335,0110,0,
+ /* 9308 */ 0241,0202,051,0301,01,0336,0120,0,
+ /* 9316 */ 0240,0202,051,0301,01,0336,0110,0,
+ /* 9324 */ 0241,0202,051,0301,01,0337,0120,0,
+ /* 9332 */ 0240,0202,051,0301,01,0337,0110,0,
+ /* 9340 */ 0261,03,041,01,015,0120,023,0,
+ /* 9348 */ 0260,03,041,01,015,0110,022,0,
+ /* 9356 */ 0261,03,045,01,015,0120,023,0,
+ /* 9364 */ 0260,03,045,01,015,0110,022,0,
+ /* 9372 */ 0261,03,041,01,014,0120,023,0,
+ /* 9380 */ 0260,03,041,01,014,0110,022,0,
+ /* 9388 */ 0261,03,045,01,014,0120,023,0,
+ /* 9396 */ 0260,03,045,01,014,0110,022,0,
+ /* 9404 */ 0261,03,01,01,0113,0120,0177,0,
+ /* 9412 */ 0260,03,01,01,0113,0110,0176,0,
+ /* 9420 */ 0261,03,05,01,0113,0120,0177,0,
+ /* 9428 */ 0260,03,05,01,0113,0110,0176,0,
+ /* 9436 */ 0261,03,01,01,0112,0120,0177,0,
+ /* 9444 */ 0260,03,01,01,0112,0110,0176,0,
+ /* 9452 */ 0261,03,05,01,0112,0120,0177,0,
+ /* 9460 */ 0260,03,05,01,0112,0110,0176,0,
+ /* 9468 */ 0261,01,041,01,0302,0120,023,0,
+ /* 9476 */ 0260,01,041,01,0302,0110,022,0,
+ /* 9484 */ 0261,01,045,01,0302,0120,023,0,
+ /* 9492 */ 0260,01,045,01,0302,0110,022,0,
+ /* 9500 */ 0261,01,040,01,0302,0120,023,0,
+ /* 9508 */ 0260,01,040,01,0302,0110,022,0,
+ /* 9516 */ 0261,01,044,01,0302,0120,023,0,
+ /* 9524 */ 0260,01,044,01,0302,0110,022,0,
+ /* 9532 */ 0261,01,053,01,0302,0120,023,0,
+ /* 9540 */ 0260,01,053,01,0302,0110,022,0,
+ /* 9548 */ 0261,01,052,01,0302,0120,023,0,
+ /* 9556 */ 0260,01,052,01,0302,0110,022,0,
+ /* 9564 */ 0261,03,041,01,0101,0120,023,0,
+ /* 9572 */ 0260,03,041,01,0101,0110,022,0,
+ /* 9580 */ 0261,03,041,01,0100,0120,023,0,
+ /* 9588 */ 0260,03,041,01,0100,0110,022,0,
+ /* 9596 */ 0261,03,045,01,0100,0120,023,0,
+ /* 9604 */ 0260,03,045,01,0100,0110,022,0,
+ /* 9612 */ 0270,03,05,01,031,0101,022,0,
+ /* 9620 */ 0270,03,041,01,027,0101,022,0,
+ /* 9628 */ 0261,03,05,01,030,0120,023,0,
+ /* 9636 */ 0260,03,05,01,030,0110,022,0,
+ /* 9644 */ 0261,03,041,01,041,0120,023,0,
+ /* 9652 */ 0260,03,041,01,041,0110,022,0,
+ /* 9660 */ 0261,03,041,01,0102,0120,023,0,
+ /* 9668 */ 0260,03,041,01,0102,0110,022,0,
+ /* 9676 */ 0261,03,041,01,017,0120,023,0,
+ /* 9684 */ 0260,03,041,01,017,0110,022,0,
+ /* 9692 */ 0261,03,01,01,0114,0120,0177,0,
+ /* 9700 */ 0260,03,01,01,0114,0110,0176,0,
+ /* 9708 */ 0261,03,041,01,016,0120,023,0,
+ /* 9716 */ 0260,03,041,01,016,0110,022,0,
+ /* 9724 */ 0270,03,041,01,0141,0110,022,0,
+ /* 9732 */ 0270,03,041,01,0140,0110,022,0,
+ /* 9740 */ 0270,03,041,01,0143,0110,022,0,
+ /* 9748 */ 0270,03,041,01,0142,0110,022,0,
+ /* 9756 */ 0270,03,01,01,05,0110,022,0,
+ /* 9764 */ 0270,03,05,01,05,0110,022,0,
+ /* 9772 */ 0270,03,01,01,04,0110,022,0,
+ /* 9780 */ 0270,03,05,01,04,0110,022,0,
+ /* 9788 */ 0261,03,05,01,06,0120,023,0,
+ /* 9796 */ 0260,03,05,01,06,0110,022,0,
+ /* 9804 */ 0270,03,01,01,024,0101,022,0,
+ /* 9812 */ 0270,01,01,01,0305,0110,022,0,
+ /* 9820 */ 0270,03,01,01,025,0101,022,0,
+ /* 9828 */ 0270,03,01,01,026,0101,022,0,
+ /* 9836 */ 0270,03,021,01,026,0101,022,0,
+ /* 9844 */ 0261,03,041,01,040,0120,023,0,
+ /* 9852 */ 0260,03,041,01,040,0110,022,0,
+ /* 9860 */ 0261,01,041,01,0304,0120,023,0,
+ /* 9868 */ 0260,01,041,01,0304,0110,022,0,
+ /* 9876 */ 0261,03,01,01,042,0120,023,0,
+ /* 9884 */ 0260,03,01,01,042,0110,022,0,
+ /* 9892 */ 0261,03,021,01,042,0120,023,0,
+ /* 9900 */ 0260,03,021,01,042,0110,022,0,
+ /* 9908 */ 0270,01,041,01,0160,0110,022,0,
+ /* 9916 */ 0270,01,042,01,0160,0110,022,0,
+ /* 9924 */ 0270,01,043,01,0160,0110,022,0,
+ /* 9932 */ 0260,01,041,01,0163,0217,022,0,
+ /* 9940 */ 0260,01,041,01,0163,0207,021,0,
+ /* 9948 */ 0260,01,041,01,0163,0213,022,0,
+ /* 9956 */ 0260,01,041,01,0163,0203,021,0,
+ /* 9964 */ 0260,01,041,01,0161,0216,022,0,
+ /* 9972 */ 0260,01,041,01,0161,0206,021,0,
+ /* 9980 */ 0260,01,041,01,0162,0216,022,0,
+ /* 9988 */ 0260,01,041,01,0162,0206,021,0,
+ /* 9996 */ 0260,01,041,01,0163,0216,022,0,
+ /* 10004 */ 0260,01,041,01,0163,0206,021,0,
+ /* 10012 */ 0260,01,041,01,0161,0214,022,0,
+ /* 10020 */ 0260,01,041,01,0161,0204,021,0,
+ /* 10028 */ 0260,01,041,01,0162,0214,022,0,
+ /* 10036 */ 0260,01,041,01,0162,0204,021,0,
+ /* 10044 */ 0260,01,041,01,0161,0212,022,0,
+ /* 10052 */ 0260,01,041,01,0161,0202,021,0,
+ /* 10060 */ 0260,01,041,01,0162,0212,022,0,
+ /* 10068 */ 0260,01,041,01,0162,0202,021,0,
+ /* 10076 */ 0260,01,041,01,0163,0212,022,0,
+ /* 10084 */ 0260,01,041,01,0163,0202,021,0,
+ /* 10092 */ 0270,03,041,01,011,0110,022,0,
+ /* 10100 */ 0270,03,045,01,011,0110,022,0,
+ /* 10108 */ 0270,03,041,01,010,0110,022,0,
+ /* 10116 */ 0270,03,045,01,010,0110,022,0,
+ /* 10124 */ 0261,03,041,01,013,0120,023,0,
+ /* 10132 */ 0260,03,041,01,013,0110,022,0,
+ /* 10140 */ 0261,03,041,01,012,0120,023,0,
+ /* 10148 */ 0260,03,041,01,012,0110,022,0,
+ /* 10156 */ 0261,01,041,01,0306,0120,023,0,
+ /* 10164 */ 0260,01,041,01,0306,0110,022,0,
+ /* 10172 */ 0261,01,045,01,0306,0120,023,0,
+ /* 10180 */ 0260,01,045,01,0306,0110,022,0,
+ /* 10188 */ 0261,01,040,01,0306,0120,023,0,
+ /* 10196 */ 0260,01,040,01,0306,0110,022,0,
+ /* 10204 */ 0261,01,044,01,0306,0120,023,0,
+ /* 10212 */ 0260,01,044,01,0306,0110,022,0,
+ /* 10220 */ 0361,03,017,072,0104,0110,022,0,
+ /* 10228 */ 0261,03,041,01,0104,0120,023,0,
+ /* 10236 */ 0260,03,041,01,0104,0110,022,0,
+ /* 10244 */ 0261,03,045,01,0104,0120,023,0,
+ /* 10252 */ 0260,03,045,01,0104,0110,022,0,
+ /* 10260 */ 0270,03,05,01,035,0101,022,0,
+ /* 10268 */ 0270,03,01,01,035,0101,022,0,
+ /* 10276 */ 0317,0361,03,017,070,0366,0110,0,
+ /* 10284 */ 0324,0361,03,017,070,0366,0110,0,
+ /* 10292 */ 0317,0333,03,017,070,0366,0110,0,
+ /* 10300 */ 0324,0333,03,017,070,0366,0110,0,
+ /* 10308 */ 0260,0112,0,01,022,0211,042,0,
+ /* 10316 */ 0260,0112,020,01,022,0211,042,0,
+ /* 10324 */ 0260,0112,0,01,022,0210,042,0,
+ /* 10332 */ 0260,0112,020,01,022,0210,042,0,
+ /* 10340 */ 0261,03,01,01,0151,0120,0177,0,
+ /* 10348 */ 0260,03,01,01,0151,0110,0176,0,
+ /* 10356 */ 0261,03,05,01,0151,0120,0177,0,
+ /* 10364 */ 0260,03,05,01,0151,0110,0176,0,
+ /* 10372 */ 0261,03,021,01,0151,0130,0176,0,
+ /* 10380 */ 0260,03,021,01,0151,0120,0175,0,
+ /* 10388 */ 0261,03,025,01,0151,0130,0176,0,
+ /* 10396 */ 0260,03,025,01,0151,0120,0175,0,
+ /* 10404 */ 0261,03,01,01,0150,0120,0177,0,
+ /* 10412 */ 0260,03,01,01,0150,0110,0176,0,
+ /* 10420 */ 0261,03,05,01,0150,0120,0177,0,
+ /* 10428 */ 0260,03,05,01,0150,0110,0176,0,
+ /* 10436 */ 0261,03,021,01,0150,0130,0176,0,
+ /* 10444 */ 0260,03,021,01,0150,0120,0175,0,
+ /* 10452 */ 0261,03,025,01,0150,0130,0176,0,
+ /* 10460 */ 0260,03,025,01,0150,0120,0175,0,
+ /* 10468 */ 0261,03,01,01,0153,0120,0177,0,
+ /* 10476 */ 0260,03,01,01,0153,0110,0176,0,
+ /* 10484 */ 0261,03,021,01,0153,0130,0176,0,
+ /* 10492 */ 0260,03,021,01,0153,0120,0175,0,
+ /* 10500 */ 0261,03,01,01,0152,0120,0177,0,
+ /* 10508 */ 0260,03,01,01,0152,0110,0176,0,
+ /* 10516 */ 0261,03,021,01,0152,0130,0176,0,
+ /* 10524 */ 0260,03,021,01,0152,0120,0175,0,
+ /* 10532 */ 0261,03,01,01,0135,0120,0177,0,
+ /* 10540 */ 0260,03,01,01,0135,0110,0176,0,
+ /* 10548 */ 0261,03,05,01,0135,0120,0177,0,
+ /* 10556 */ 0260,03,05,01,0135,0110,0176,0,
+ /* 10564 */ 0261,03,021,01,0135,0130,0176,0,
+ /* 10572 */ 0260,03,021,01,0135,0120,0175,0,
+ /* 10580 */ 0261,03,025,01,0135,0130,0176,0,
+ /* 10588 */ 0260,03,025,01,0135,0120,0175,0,
+ /* 10596 */ 0261,03,01,01,0134,0120,0177,0,
+ /* 10604 */ 0260,03,01,01,0134,0110,0176,0,
+ /* 10612 */ 0261,03,05,01,0134,0120,0177,0,
+ /* 10620 */ 0260,03,05,01,0134,0110,0176,0,
+ /* 10628 */ 0261,03,021,01,0134,0130,0176,0,
+ /* 10636 */ 0260,03,021,01,0134,0120,0175,0,
+ /* 10644 */ 0261,03,025,01,0134,0130,0176,0,
+ /* 10652 */ 0260,03,025,01,0134,0120,0175,0,
+ /* 10660 */ 0261,03,01,01,0137,0120,0177,0,
+ /* 10668 */ 0260,03,01,01,0137,0110,0176,0,
+ /* 10676 */ 0261,03,05,01,0137,0120,0177,0,
+ /* 10684 */ 0260,03,05,01,0137,0110,0176,0,
+ /* 10692 */ 0261,03,021,01,0137,0130,0176,0,
+ /* 10700 */ 0260,03,021,01,0137,0120,0175,0,
+ /* 10708 */ 0261,03,025,01,0137,0130,0176,0,
+ /* 10716 */ 0260,03,025,01,0137,0120,0175,0,
+ /* 10724 */ 0261,03,01,01,0136,0120,0177,0,
+ /* 10732 */ 0260,03,01,01,0136,0110,0176,0,
+ /* 10740 */ 0261,03,05,01,0136,0120,0177,0,
+ /* 10748 */ 0260,03,05,01,0136,0110,0176,0,
+ /* 10756 */ 0261,03,021,01,0136,0130,0176,0,
+ /* 10764 */ 0260,03,021,01,0136,0120,0175,0,
+ /* 10772 */ 0261,03,025,01,0136,0130,0176,0,
+ /* 10780 */ 0260,03,025,01,0136,0120,0175,0,
+ /* 10788 */ 0261,03,01,01,0155,0120,0177,0,
+ /* 10796 */ 0260,03,01,01,0155,0110,0176,0,
+ /* 10804 */ 0261,03,05,01,0155,0120,0177,0,
+ /* 10812 */ 0260,03,05,01,0155,0110,0176,0,
+ /* 10820 */ 0261,03,021,01,0155,0130,0176,0,
+ /* 10828 */ 0260,03,021,01,0155,0120,0175,0,
+ /* 10836 */ 0261,03,025,01,0155,0130,0176,0,
+ /* 10844 */ 0260,03,025,01,0155,0120,0175,0,
+ /* 10852 */ 0261,03,01,01,0154,0120,0177,0,
+ /* 10860 */ 0260,03,01,01,0154,0110,0176,0,
+ /* 10868 */ 0261,03,05,01,0154,0120,0177,0,
+ /* 10876 */ 0260,03,05,01,0154,0110,0176,0,
+ /* 10884 */ 0261,03,021,01,0154,0130,0176,0,
+ /* 10892 */ 0260,03,021,01,0154,0120,0175,0,
+ /* 10900 */ 0261,03,025,01,0154,0130,0176,0,
+ /* 10908 */ 0260,03,025,01,0154,0120,0175,0,
+ /* 10916 */ 0261,03,01,01,0157,0120,0177,0,
+ /* 10924 */ 0260,03,01,01,0157,0110,0176,0,
+ /* 10932 */ 0261,03,021,01,0157,0130,0176,0,
+ /* 10940 */ 0260,03,021,01,0157,0120,0175,0,
+ /* 10948 */ 0261,03,01,01,0156,0120,0177,0,
+ /* 10956 */ 0260,03,01,01,0156,0110,0176,0,
+ /* 10964 */ 0261,03,021,01,0156,0130,0176,0,
+ /* 10972 */ 0260,03,021,01,0156,0120,0175,0,
+ /* 10980 */ 0261,03,01,01,0171,0120,0177,0,
+ /* 10988 */ 0260,03,01,01,0171,0110,0176,0,
+ /* 10996 */ 0261,03,05,01,0171,0120,0177,0,
+ /* 11004 */ 0260,03,05,01,0171,0110,0176,0,
+ /* 11012 */ 0261,03,021,01,0171,0130,0176,0,
+ /* 11020 */ 0260,03,021,01,0171,0120,0175,0,
+ /* 11028 */ 0261,03,025,01,0171,0130,0176,0,
+ /* 11036 */ 0260,03,025,01,0171,0120,0175,0,
+ /* 11044 */ 0261,03,01,01,0170,0120,0177,0,
+ /* 11052 */ 0260,03,01,01,0170,0110,0176,0,
+ /* 11060 */ 0261,03,05,01,0170,0120,0177,0,
+ /* 11068 */ 0260,03,05,01,0170,0110,0176,0,
+ /* 11076 */ 0261,03,021,01,0170,0130,0176,0,
+ /* 11084 */ 0260,03,021,01,0170,0120,0175,0,
+ /* 11092 */ 0261,03,025,01,0170,0130,0176,0,
+ /* 11100 */ 0260,03,025,01,0170,0120,0175,0,
+ /* 11108 */ 0261,03,01,01,0173,0120,0177,0,
+ /* 11116 */ 0260,03,01,01,0173,0110,0176,0,
+ /* 11124 */ 0261,03,021,01,0173,0130,0176,0,
+ /* 11132 */ 0260,03,021,01,0173,0120,0175,0,
+ /* 11140 */ 0261,03,01,01,0172,0120,0177,0,
+ /* 11148 */ 0260,03,01,01,0172,0110,0176,0,
+ /* 11156 */ 0261,03,021,01,0172,0130,0176,0,
+ /* 11164 */ 0260,03,021,01,0172,0120,0175,0,
+ /* 11172 */ 0261,03,01,01,0175,0120,0177,0,
+ /* 11180 */ 0260,03,01,01,0175,0110,0176,0,
+ /* 11188 */ 0261,03,05,01,0175,0120,0177,0,
+ /* 11196 */ 0260,03,05,01,0175,0110,0176,0,
+ /* 11204 */ 0261,03,021,01,0175,0130,0176,0,
+ /* 11212 */ 0260,03,021,01,0175,0120,0175,0,
+ /* 11220 */ 0261,03,025,01,0175,0130,0176,0,
+ /* 11228 */ 0260,03,025,01,0175,0120,0175,0,
+ /* 11236 */ 0261,03,01,01,0174,0120,0177,0,
+ /* 11244 */ 0260,03,01,01,0174,0110,0176,0,
+ /* 11252 */ 0261,03,05,01,0174,0120,0177,0,
+ /* 11260 */ 0260,03,05,01,0174,0110,0176,0,
+ /* 11268 */ 0261,03,021,01,0174,0130,0176,0,
+ /* 11276 */ 0260,03,021,01,0174,0120,0175,0,
+ /* 11284 */ 0261,03,025,01,0174,0130,0176,0,
+ /* 11292 */ 0260,03,025,01,0174,0120,0175,0,
+ /* 11300 */ 0261,03,01,01,0177,0120,0177,0,
+ /* 11308 */ 0260,03,01,01,0177,0110,0176,0,
+ /* 11316 */ 0261,03,021,01,0177,0130,0176,0,
+ /* 11324 */ 0260,03,021,01,0177,0120,0175,0,
+ /* 11332 */ 0261,03,01,01,0176,0120,0177,0,
+ /* 11340 */ 0260,03,01,01,0176,0110,0176,0,
+ /* 11348 */ 0261,03,021,01,0176,0130,0176,0,
+ /* 11356 */ 0260,03,021,01,0176,0120,0175,0,
+ /* 11364 */ 0261,0110,0,01,0242,0120,0177,0,
+ /* 11372 */ 0260,0110,0,01,0242,0110,0176,0,
+ /* 11380 */ 0261,0110,04,01,0242,0120,0177,0,
+ /* 11388 */ 0260,0110,04,01,0242,0110,0176,0,
+ /* 11396 */ 0261,0110,020,01,0242,0130,0176,0,
+ /* 11404 */ 0260,0110,020,01,0242,0120,0175,0,
+ /* 11412 */ 0261,0110,024,01,0242,0130,0176,0,
+ /* 11420 */ 0260,0110,024,01,0242,0120,0175,0,
+ /* 11428 */ 0261,0110,0,01,0314,0120,023,0,
+ /* 11436 */ 0260,0110,0,01,0314,0110,022,0,
+ /* 11444 */ 0261,0110,0,01,0316,0120,023,0,
+ /* 11452 */ 0260,0110,0,01,0316,0110,022,0,
+ /* 11460 */ 0261,0110,0,01,0317,0120,023,0,
+ /* 11468 */ 0260,0110,0,01,0317,0110,022,0,
+ /* 11476 */ 0261,0110,0,01,0354,0120,023,0,
+ /* 11484 */ 0260,0110,0,01,0354,0110,022,0,
+ /* 11492 */ 0261,0110,0,01,0356,0120,023,0,
+ /* 11500 */ 0260,0110,0,01,0356,0110,022,0,
+ /* 11508 */ 0261,0110,0,01,0357,0120,023,0,
+ /* 11516 */ 0260,0110,0,01,0357,0110,022,0,
+ /* 11524 */ 0261,0110,0,01,0355,0120,023,0,
+ /* 11532 */ 0260,0110,0,01,0355,0110,022,0,
+ /* 11540 */ 0261,0110,0,01,0315,0120,023,0,
+ /* 11548 */ 0260,0110,0,01,0315,0110,022,0,
+ /* 11556 */ 0261,0110,0,01,0236,0120,0177,0,
+ /* 11564 */ 0260,0110,0,01,0236,0110,0176,0,
+ /* 11572 */ 0261,0110,0,01,0237,0120,0177,0,
+ /* 11580 */ 0260,0110,0,01,0237,0110,0176,0,
+ /* 11588 */ 0261,0110,0,01,0227,0120,0177,0,
+ /* 11596 */ 0260,0110,0,01,0227,0110,0176,0,
+ /* 11604 */ 0261,0110,0,01,0216,0120,0177,0,
+ /* 11612 */ 0260,0110,0,01,0216,0110,0176,0,
+ /* 11620 */ 0261,0110,0,01,0217,0120,0177,0,
+ /* 11628 */ 0260,0110,0,01,0217,0110,0176,0,
+ /* 11636 */ 0261,0110,0,01,0207,0120,0177,0,
+ /* 11644 */ 0260,0110,0,01,0207,0110,0176,0,
+ /* 11652 */ 0261,0110,0,01,0206,0120,0177,0,
+ /* 11660 */ 0260,0110,0,01,0206,0110,0176,0,
+ /* 11668 */ 0261,0110,0,01,0205,0120,0177,0,
+ /* 11676 */ 0260,0110,0,01,0205,0110,0176,0,
+ /* 11684 */ 0261,0110,0,01,0226,0120,0177,0,
+ /* 11692 */ 0260,0110,0,01,0226,0110,0176,0,
+ /* 11700 */ 0261,0110,0,01,0225,0120,0177,0,
+ /* 11708 */ 0260,0110,0,01,0225,0110,0176,0,
+ /* 11716 */ 0261,0110,0,01,0246,0120,0177,0,
+ /* 11724 */ 0260,0110,0,01,0246,0110,0176,0,
+ /* 11732 */ 0261,0110,0,01,0266,0120,0177,0,
+ /* 11740 */ 0260,0110,0,01,0266,0110,0176,0,
+ /* 11748 */ 0261,0110,020,01,0243,0130,0176,0,
+ /* 11756 */ 0260,0110,020,01,0243,0120,0175,0,
+ /* 11764 */ 0261,0110,0,01,0243,0120,0177,0,
+ /* 11772 */ 0260,0110,0,01,0243,0110,0176,0,
+ /* 11780 */ 0270,0110,0,01,0300,0110,022,0,
+ /* 11788 */ 0270,0110,0,01,0300,0100,021,0,
+ /* 11796 */ 0270,0110,0,01,0302,0110,022,0,
+ /* 11804 */ 0270,0110,0,01,0302,0100,021,0,
+ /* 11812 */ 0270,0110,0,01,0303,0110,022,0,
+ /* 11820 */ 0270,0110,0,01,0303,0100,021,0,
+ /* 11828 */ 0270,0110,0,01,0301,0110,022,0,
+ /* 11836 */ 0270,0110,0,01,0301,0100,021,0,
+ /* 11844 */ 0261,03,045,01,0102,0120,023,0,
+ /* 11852 */ 0260,03,045,01,0102,0110,022,0,
+ /* 11860 */ 0261,03,045,01,017,0120,023,0,
+ /* 11868 */ 0260,03,045,01,017,0110,022,0,
+ /* 11876 */ 0261,03,045,01,0114,0120,0177,0,
+ /* 11884 */ 0260,03,045,01,0114,0110,0176,0,
+ /* 11892 */ 0261,03,045,01,016,0120,023,0,
+ /* 11900 */ 0260,03,045,01,016,0110,022,0,
+ /* 11908 */ 0270,01,045,01,0160,0110,022,0,
+ /* 11916 */ 0270,01,046,01,0160,0110,022,0,
+ /* 11924 */ 0270,01,047,01,0160,0110,022,0,
+ /* 11932 */ 0260,01,045,01,0163,0217,022,0,
+ /* 11940 */ 0260,01,045,01,0163,0207,021,0,
+ /* 11948 */ 0260,01,045,01,0161,0216,022,0,
+ /* 11956 */ 0260,01,045,01,0161,0206,021,0,
+ /* 11964 */ 0260,01,045,01,0162,0216,022,0,
+ /* 11972 */ 0260,01,045,01,0162,0206,021,0,
+ /* 11980 */ 0260,01,045,01,0163,0216,022,0,
+ /* 11988 */ 0260,01,045,01,0163,0206,021,0,
+ /* 11996 */ 0260,01,045,01,0161,0214,022,0,
+ /* 12004 */ 0260,01,045,01,0161,0204,021,0,
+ /* 12012 */ 0260,01,045,01,0162,0214,022,0,
+ /* 12020 */ 0260,01,045,01,0162,0204,021,0,
+ /* 12028 */ 0260,01,045,01,0163,0213,022,0,
+ /* 12036 */ 0260,01,045,01,0163,0203,021,0,
+ /* 12044 */ 0260,01,045,01,0161,0212,022,0,
+ /* 12052 */ 0260,01,045,01,0161,0202,021,0,
+ /* 12060 */ 0260,01,045,01,0162,0212,022,0,
+ /* 12068 */ 0260,01,045,01,0162,0202,021,0,
+ /* 12076 */ 0260,01,045,01,0163,0212,022,0,
+ /* 12084 */ 0260,01,045,01,0163,0202,021,0,
+ /* 12092 */ 0261,03,01,01,02,0120,023,0,
+ /* 12100 */ 0260,03,01,01,02,0110,022,0,
+ /* 12108 */ 0261,03,05,01,02,0120,023,0,
+ /* 12116 */ 0260,03,05,01,02,0110,022,0,
+ /* 12124 */ 0270,03,025,01,01,0110,022,0,
+ /* 12132 */ 0270,03,025,01,0,0110,022,0,
+ /* 12140 */ 0261,03,05,01,0106,0120,023,0,
+ /* 12148 */ 0260,03,05,01,0106,0110,022,0,
+ /* 12156 */ 0270,03,05,01,071,0101,022,0,
+ /* 12164 */ 0261,03,05,01,070,0120,023,0,
+ /* 12172 */ 0260,03,05,01,070,0110,022,0,
+ /* 12180 */ 0374,0262,02,021,01,0222,0110,0,
+ /* 12188 */ 0374,0262,02,021,01,0223,0110,0,
+ /* 12196 */ 0374,0262,02,025,01,0222,0110,0,
+ /* 12204 */ 0375,0262,02,025,01,0223,0110,0,
+ /* 12212 */ 0374,0262,02,01,01,0222,0110,0,
+ /* 12220 */ 0374,0262,02,01,01,0223,0110,0,
+ /* 12228 */ 0375,0262,02,05,01,0222,0110,0,
+ /* 12236 */ 0375,0262,02,05,01,0223,0110,0,
+ /* 12244 */ 0374,0262,02,01,01,0220,0110,0,
+ /* 12252 */ 0374,0262,02,01,01,0221,0110,0,
+ /* 12260 */ 0375,0262,02,05,01,0220,0110,0,
+ /* 12268 */ 0375,0262,02,05,01,0221,0110,0,
+ /* 12276 */ 0374,0262,02,021,01,0220,0110,0,
+ /* 12284 */ 0374,0262,02,021,01,0221,0110,0,
+ /* 12292 */ 0374,0262,02,025,01,0220,0110,0,
+ /* 12300 */ 0375,0262,02,025,01,0221,0110,0,
+ /* 12308 */ 0270,0112,0,01,020,0110,042,0,
+ /* 12316 */ 0270,0112,020,01,020,0110,042,0,
+ /* 12324 */ 0270,03,03,01,0360,0110,022,0,
+ /* 12332 */ 0270,03,023,01,0360,0110,022,0,
+ /* 12340 */ 0270,03,01,01,062,0110,022,0,
+ /* 12348 */ 0270,03,01,01,063,0110,022,0,
+ /* 12356 */ 0270,03,021,01,063,0110,022,0,
+ /* 12364 */ 0270,03,021,01,062,0110,022,0,
+ /* 12372 */ 0270,03,01,01,060,0110,022,0,
+ /* 12380 */ 0270,03,01,01,061,0110,022,0,
+ /* 12388 */ 0270,03,021,01,061,0110,022,0,
+ /* 12396 */ 0270,03,021,01,060,0110,022,0,
+ /* 12404 */ 0241,0201,021,0301,01,0130,0120,0,
+ /* 12412 */ 0240,0201,021,0301,01,0130,0110,0,
+ /* 12420 */ 0241,0201,025,0301,01,0130,0120,0,
+ /* 12428 */ 0240,0201,025,0301,01,0130,0110,0,
+ /* 12436 */ 0241,0201,031,0301,01,0130,0120,0,
+ /* 12444 */ 0240,0201,031,0301,01,0130,0110,0,
+ /* 12452 */ 0241,0201,0,0301,01,0130,0120,0,
+ /* 12460 */ 0240,0201,0,0301,01,0130,0110,0,
+ /* 12468 */ 0241,0201,04,0301,01,0130,0120,0,
+ /* 12476 */ 0240,0201,04,0301,01,0130,0110,0,
+ /* 12484 */ 0241,0201,010,0301,01,0130,0120,0,
+ /* 12492 */ 0240,0201,010,0301,01,0130,0110,0,
+ /* 12500 */ 0241,0201,023,0306,01,0130,0120,0,
+ /* 12508 */ 0240,0201,023,0306,01,0130,0110,0,
+ /* 12516 */ 0241,0201,02,0306,01,0130,0120,0,
+ /* 12524 */ 0240,0201,02,0306,01,0130,0110,0,
+ /* 12532 */ 0241,0201,021,0301,01,0125,0120,0,
+ /* 12540 */ 0240,0201,021,0301,01,0125,0110,0,
+ /* 12548 */ 0241,0201,025,0301,01,0125,0120,0,
+ /* 12556 */ 0240,0201,025,0301,01,0125,0110,0,
+ /* 12564 */ 0241,0201,031,0301,01,0125,0120,0,
+ /* 12572 */ 0240,0201,031,0301,01,0125,0110,0,
+ /* 12580 */ 0241,0201,0,0301,01,0125,0120,0,
+ /* 12588 */ 0240,0201,0,0301,01,0125,0110,0,
+ /* 12596 */ 0241,0201,04,0301,01,0125,0120,0,
+ /* 12604 */ 0240,0201,04,0301,01,0125,0110,0,
+ /* 12612 */ 0241,0201,010,0301,01,0125,0120,0,
+ /* 12620 */ 0240,0201,010,0301,01,0125,0110,0,
+ /* 12628 */ 0241,0201,021,0301,01,0124,0120,0,
+ /* 12636 */ 0240,0201,021,0301,01,0124,0110,0,
+ /* 12644 */ 0241,0201,025,0301,01,0124,0120,0,
+ /* 12652 */ 0240,0201,025,0301,01,0124,0110,0,
+ /* 12660 */ 0241,0201,031,0301,01,0124,0120,0,
+ /* 12668 */ 0240,0201,031,0301,01,0124,0110,0,
+ /* 12676 */ 0241,0201,0,0301,01,0124,0120,0,
+ /* 12684 */ 0240,0201,0,0301,01,0124,0110,0,
+ /* 12692 */ 0241,0201,04,0301,01,0124,0120,0,
+ /* 12700 */ 0240,0201,04,0301,01,0124,0110,0,
+ /* 12708 */ 0241,0201,010,0301,01,0124,0120,0,
+ /* 12716 */ 0240,0201,010,0301,01,0124,0110,0,
+ /* 12724 */ 0241,0202,021,0301,01,0145,0120,0,
+ /* 12732 */ 0241,0202,025,0301,01,0145,0120,0,
+ /* 12740 */ 0241,0202,031,0301,01,0145,0120,0,
+ /* 12748 */ 0241,0202,01,0301,01,0145,0120,0,
+ /* 12756 */ 0241,0202,05,0301,01,0145,0120,0,
+ /* 12764 */ 0241,0202,011,0301,01,0145,0120,0,
+ /* 12772 */ 0250,0202,05,0311,01,031,0110,0,
+ /* 12780 */ 0250,0202,011,0311,01,031,0110,0,
+ /* 12788 */ 0250,0202,05,0312,01,032,0110,0,
+ /* 12796 */ 0250,0202,011,0312,01,032,0110,0,
+ /* 12804 */ 0250,0202,011,0313,01,033,0110,0,
+ /* 12812 */ 0250,0202,025,0311,01,032,0110,0,
+ /* 12820 */ 0250,0202,031,0311,01,032,0110,0,
+ /* 12828 */ 0250,0202,031,0312,01,033,0110,0,
+ /* 12836 */ 0250,0202,01,0311,01,0131,0110,0,
+ /* 12844 */ 0250,0202,05,0311,01,0131,0110,0,
+ /* 12852 */ 0250,0202,011,0311,01,0131,0110,0,
+ /* 12860 */ 0250,0202,05,0312,01,0132,0110,0,
+ /* 12868 */ 0250,0202,011,0312,01,0132,0110,0,
+ /* 12876 */ 0250,0202,011,0313,01,0133,0110,0,
+ /* 12884 */ 0250,0202,025,0311,01,0132,0110,0,
+ /* 12892 */ 0250,0202,031,0311,01,0132,0110,0,
+ /* 12900 */ 0250,0202,031,0312,01,0133,0110,0,
+ /* 12908 */ 0250,0202,025,0306,01,031,0110,0,
+ /* 12916 */ 0250,0202,031,0306,01,031,0110,0,
+ /* 12924 */ 0250,0202,025,0300,01,031,0110,0,
+ /* 12932 */ 0250,0202,031,0300,01,031,0110,0,
+ /* 12940 */ 0250,0202,01,0306,01,030,0110,0,
+ /* 12948 */ 0250,0202,05,0306,01,030,0110,0,
+ /* 12956 */ 0250,0202,011,0306,01,030,0110,0,
+ /* 12964 */ 0250,0202,01,0300,01,030,0110,0,
+ /* 12972 */ 0250,0202,05,0300,01,030,0110,0,
+ /* 12980 */ 0250,0202,011,0300,01,030,0110,0,
+ /* 12988 */ 0250,0201,021,0306,01,057,0110,0,
+ /* 12996 */ 0250,0201,0,0306,01,057,0110,0,
+ /* 13004 */ 0250,0202,021,0306,01,0212,0101,0,
+ /* 13012 */ 0250,0202,025,0306,01,0212,0101,0,
+ /* 13020 */ 0250,0202,031,0306,01,0212,0101,0,
+ /* 13028 */ 0250,0202,021,0300,01,0212,0101,0,
+ /* 13036 */ 0250,0202,025,0300,01,0212,0101,0,
+ /* 13044 */ 0250,0202,031,0300,01,0212,0101,0,
+ /* 13052 */ 0250,0202,01,0306,01,0212,0101,0,
+ /* 13060 */ 0250,0202,05,0306,01,0212,0101,0,
+ /* 13068 */ 0250,0202,011,0306,01,0212,0101,0,
+ /* 13076 */ 0250,0202,01,0300,01,0212,0101,0,
+ /* 13084 */ 0250,0202,05,0300,01,0212,0101,0,
+ /* 13092 */ 0250,0202,011,0300,01,0212,0101,0,
+ /* 13100 */ 0250,0201,02,0302,01,0346,0110,0,
+ /* 13108 */ 0250,0201,06,0302,01,0346,0110,0,
+ /* 13116 */ 0250,0201,012,0302,01,0346,0110,0,
+ /* 13124 */ 0250,0201,0,0301,01,0133,0110,0,
+ /* 13132 */ 0250,0201,04,0301,01,0133,0110,0,
+ /* 13140 */ 0250,0201,010,0301,01,0133,0110,0,
+ /* 13148 */ 0250,0201,023,0301,01,0346,0110,0,
+ /* 13156 */ 0250,0201,027,0301,01,0346,0110,0,
+ /* 13164 */ 0250,0201,033,0301,01,0346,0110,0,
+ /* 13172 */ 0250,0201,021,0301,01,0132,0110,0,
+ /* 13180 */ 0250,0201,025,0301,01,0132,0110,0,
+ /* 13188 */ 0250,0201,031,0301,01,0132,0110,0,
+ /* 13196 */ 0250,0201,021,0301,01,0173,0110,0,
+ /* 13204 */ 0250,0201,025,0301,01,0173,0110,0,
+ /* 13212 */ 0250,0201,031,0301,01,0173,0110,0,
+ /* 13220 */ 0250,0201,020,0301,01,0171,0110,0,
+ /* 13228 */ 0250,0201,024,0301,01,0171,0110,0,
+ /* 13236 */ 0250,0201,030,0301,01,0171,0110,0,
+ /* 13244 */ 0250,0201,021,0301,01,0171,0110,0,
+ /* 13252 */ 0250,0201,025,0301,01,0171,0110,0,
+ /* 13260 */ 0250,0201,031,0301,01,0171,0110,0,
+ /* 13268 */ 0250,0202,01,0314,01,023,0110,0,
+ /* 13276 */ 0250,0202,05,0314,01,023,0110,0,
+ /* 13284 */ 0250,0202,011,0314,01,023,0110,0,
+ /* 13292 */ 0250,0201,01,0301,01,0133,0110,0,
+ /* 13300 */ 0250,0201,05,0301,01,0133,0110,0,
+ /* 13308 */ 0250,0201,011,0301,01,0133,0110,0,
+ /* 13316 */ 0250,0201,0,0302,01,0132,0110,0,
+ /* 13324 */ 0250,0201,04,0302,01,0132,0110,0,
+ /* 13332 */ 0250,0201,010,0302,01,0132,0110,0,
+ /* 13340 */ 0250,0201,01,0302,01,0173,0110,0,
+ /* 13348 */ 0250,0201,05,0302,01,0173,0110,0,
+ /* 13356 */ 0250,0201,011,0302,01,0173,0110,0,
+ /* 13364 */ 0250,0201,0,0301,01,0171,0110,0,
+ /* 13372 */ 0250,0201,04,0301,01,0171,0110,0,
+ /* 13380 */ 0250,0201,010,0301,01,0171,0110,0,
+ /* 13388 */ 0250,0201,01,0302,01,0171,0110,0,
+ /* 13396 */ 0250,0201,05,0302,01,0171,0110,0,
+ /* 13404 */ 0250,0201,011,0302,01,0171,0110,0,
+ /* 13412 */ 0250,0201,022,0301,01,0346,0110,0,
+ /* 13420 */ 0250,0201,026,0301,01,0346,0110,0,
+ /* 13428 */ 0250,0201,032,0301,01,0346,0110,0,
+ /* 13436 */ 0250,0201,020,0301,01,0133,0110,0,
+ /* 13444 */ 0250,0201,024,0301,01,0133,0110,0,
+ /* 13452 */ 0250,0201,030,0301,01,0133,0110,0,
+ /* 13460 */ 0250,0201,03,0310,01,055,0110,0,
+ /* 13468 */ 0250,0201,023,0310,01,055,0110,0,
+ /* 13476 */ 0241,0201,023,0306,01,0132,0120,0,
+ /* 13484 */ 0250,0201,03,0310,01,0171,0110,0,
+ /* 13492 */ 0250,0201,023,0310,01,0171,0110,0,
+ /* 13500 */ 0241,0201,03,0306,01,052,0120,0,
+ /* 13508 */ 0241,0201,023,0306,01,052,0120,0,
+ /* 13516 */ 0241,0201,02,0306,01,052,0120,0,
+ /* 13524 */ 0241,0201,022,0306,01,052,0120,0,
+ /* 13532 */ 0241,0201,02,0306,01,0132,0120,0,
+ /* 13540 */ 0250,0201,02,0307,01,055,0110,0,
+ /* 13548 */ 0250,0201,022,0307,01,055,0110,0,
+ /* 13556 */ 0250,0201,02,0307,01,0171,0110,0,
+ /* 13564 */ 0250,0201,022,0307,01,0171,0110,0,
+ /* 13572 */ 0250,0201,021,0301,01,0346,0110,0,
+ /* 13580 */ 0250,0201,025,0301,01,0346,0110,0,
+ /* 13588 */ 0250,0201,031,0301,01,0346,0110,0,
+ /* 13596 */ 0250,0201,021,0301,01,0172,0110,0,
+ /* 13604 */ 0250,0201,025,0301,01,0172,0110,0,
+ /* 13612 */ 0250,0201,031,0301,01,0172,0110,0,
+ /* 13620 */ 0250,0201,020,0301,01,0170,0110,0,
+ /* 13628 */ 0250,0201,024,0301,01,0170,0110,0,
+ /* 13636 */ 0250,0201,030,0301,01,0170,0110,0,
+ /* 13644 */ 0250,0201,021,0301,01,0170,0110,0,
+ /* 13652 */ 0250,0201,025,0301,01,0170,0110,0,
+ /* 13660 */ 0250,0201,031,0301,01,0170,0110,0,
+ /* 13668 */ 0250,0201,02,0301,01,0133,0110,0,
+ /* 13676 */ 0250,0201,06,0301,01,0133,0110,0,
+ /* 13684 */ 0250,0201,012,0301,01,0133,0110,0,
+ /* 13692 */ 0250,0201,01,0302,01,0172,0110,0,
+ /* 13700 */ 0250,0201,05,0302,01,0172,0110,0,
+ /* 13708 */ 0250,0201,011,0302,01,0172,0110,0,
+ /* 13716 */ 0250,0201,0,0301,01,0170,0110,0,
+ /* 13724 */ 0250,0201,04,0301,01,0170,0110,0,
+ /* 13732 */ 0250,0201,010,0301,01,0170,0110,0,
+ /* 13740 */ 0250,0201,01,0302,01,0170,0110,0,
+ /* 13748 */ 0250,0201,05,0302,01,0170,0110,0,
+ /* 13756 */ 0250,0201,011,0302,01,0170,0110,0,
+ /* 13764 */ 0250,0201,03,0310,01,054,0110,0,
+ /* 13772 */ 0250,0201,023,0310,01,054,0110,0,
+ /* 13780 */ 0250,0201,03,0310,01,0170,0110,0,
+ /* 13788 */ 0250,0201,023,0310,01,0170,0110,0,
+ /* 13796 */ 0250,0201,02,0307,01,054,0110,0,
+ /* 13804 */ 0250,0201,022,0307,01,054,0110,0,
+ /* 13812 */ 0250,0201,02,0307,01,0170,0110,0,
+ /* 13820 */ 0250,0201,022,0307,01,0170,0110,0,
+ /* 13828 */ 0250,0201,02,0302,01,0172,0110,0,
+ /* 13836 */ 0250,0201,06,0302,01,0172,0110,0,
+ /* 13844 */ 0250,0201,012,0302,01,0172,0110,0,
+ /* 13852 */ 0250,0201,03,0301,01,0172,0110,0,
+ /* 13860 */ 0250,0201,07,0301,01,0172,0110,0,
+ /* 13868 */ 0250,0201,013,0301,01,0172,0110,0,
+ /* 13876 */ 0250,0201,022,0301,01,0172,0110,0,
+ /* 13884 */ 0250,0201,026,0301,01,0172,0110,0,
+ /* 13892 */ 0250,0201,032,0301,01,0172,0110,0,
+ /* 13900 */ 0250,0201,023,0301,01,0172,0110,0,
+ /* 13908 */ 0250,0201,027,0301,01,0172,0110,0,
+ /* 13916 */ 0250,0201,033,0301,01,0172,0110,0,
+ /* 13924 */ 0241,0201,03,0306,01,0173,0120,0,
+ /* 13932 */ 0241,0201,023,0306,01,0173,0120,0,
+ /* 13940 */ 0241,0201,02,0306,01,0173,0120,0,
+ /* 13948 */ 0241,0201,022,0306,01,0173,0120,0,
+ /* 13956 */ 0241,0201,021,0301,01,0136,0120,0,
+ /* 13964 */ 0240,0201,021,0301,01,0136,0110,0,
+ /* 13972 */ 0241,0201,025,0301,01,0136,0120,0,
+ /* 13980 */ 0240,0201,025,0301,01,0136,0110,0,
+ /* 13988 */ 0241,0201,031,0301,01,0136,0120,0,
+ /* 13996 */ 0240,0201,031,0301,01,0136,0110,0,
+ /* 14004 */ 0241,0201,0,0301,01,0136,0120,0,
+ /* 14012 */ 0240,0201,0,0301,01,0136,0110,0,
+ /* 14020 */ 0241,0201,04,0301,01,0136,0120,0,
+ /* 14028 */ 0240,0201,04,0301,01,0136,0110,0,
+ /* 14036 */ 0241,0201,010,0301,01,0136,0120,0,
+ /* 14044 */ 0240,0201,010,0301,01,0136,0110,0,
+ /* 14052 */ 0241,0201,023,0306,01,0136,0120,0,
+ /* 14060 */ 0240,0201,023,0306,01,0136,0110,0,
+ /* 14068 */ 0241,0201,02,0306,01,0136,0120,0,
+ /* 14076 */ 0240,0201,02,0306,01,0136,0110,0,
+ /* 14084 */ 0250,0202,031,0301,01,0310,0110,0,
+ /* 14092 */ 0250,0202,011,0301,01,0310,0110,0,
+ /* 14100 */ 0250,0202,021,0306,01,0210,0110,0,
+ /* 14108 */ 0250,0202,025,0306,01,0210,0110,0,
+ /* 14116 */ 0250,0202,031,0306,01,0210,0110,0,
+ /* 14124 */ 0250,0202,01,0306,01,0210,0110,0,
+ /* 14132 */ 0250,0202,05,0306,01,0210,0110,0,
+ /* 14140 */ 0250,0202,011,0306,01,0210,0110,0,
+ /* 14148 */ 0241,0202,021,0301,01,0230,0120,0,
+ /* 14156 */ 0241,0202,025,0301,01,0230,0120,0,
+ /* 14164 */ 0241,0202,031,0301,01,0230,0120,0,
+ /* 14172 */ 0241,0202,01,0301,01,0230,0120,0,
+ /* 14180 */ 0241,0202,05,0301,01,0230,0120,0,
+ /* 14188 */ 0241,0202,011,0301,01,0230,0120,0,
+ /* 14196 */ 0241,0202,021,0306,01,0231,0120,0,
+ /* 14204 */ 0241,0202,01,0306,01,0231,0120,0,
+ /* 14212 */ 0241,0202,021,0301,01,0250,0120,0,
+ /* 14220 */ 0241,0202,025,0301,01,0250,0120,0,
+ /* 14228 */ 0241,0202,031,0301,01,0250,0120,0,
+ /* 14236 */ 0241,0202,01,0301,01,0250,0120,0,
+ /* 14244 */ 0241,0202,05,0301,01,0250,0120,0,
+ /* 14252 */ 0241,0202,011,0301,01,0250,0120,0,
+ /* 14260 */ 0241,0202,021,0306,01,0251,0120,0,
+ /* 14268 */ 0241,0202,01,0306,01,0251,0120,0,
+ /* 14276 */ 0241,0202,021,0301,01,0270,0120,0,
+ /* 14284 */ 0241,0202,025,0301,01,0270,0120,0,
+ /* 14292 */ 0241,0202,031,0301,01,0270,0120,0,
+ /* 14300 */ 0241,0202,01,0301,01,0270,0120,0,
+ /* 14308 */ 0241,0202,05,0301,01,0270,0120,0,
+ /* 14316 */ 0241,0202,011,0301,01,0270,0120,0,
+ /* 14324 */ 0241,0202,021,0306,01,0271,0120,0,
+ /* 14332 */ 0241,0202,01,0306,01,0271,0120,0,
+ /* 14340 */ 0241,0202,021,0301,01,0226,0120,0,
+ /* 14348 */ 0241,0202,025,0301,01,0226,0120,0,
+ /* 14356 */ 0241,0202,031,0301,01,0226,0120,0,
+ /* 14364 */ 0241,0202,01,0301,01,0226,0120,0,
+ /* 14372 */ 0241,0202,05,0301,01,0226,0120,0,
+ /* 14380 */ 0241,0202,011,0301,01,0226,0120,0,
+ /* 14388 */ 0241,0202,021,0301,01,0246,0120,0,
+ /* 14396 */ 0241,0202,025,0301,01,0246,0120,0,
+ /* 14404 */ 0241,0202,031,0301,01,0246,0120,0,
+ /* 14412 */ 0241,0202,01,0301,01,0246,0120,0,
+ /* 14420 */ 0241,0202,05,0301,01,0246,0120,0,
+ /* 14428 */ 0241,0202,011,0301,01,0246,0120,0,
+ /* 14436 */ 0241,0202,021,0301,01,0266,0120,0,
+ /* 14444 */ 0241,0202,025,0301,01,0266,0120,0,
+ /* 14452 */ 0241,0202,031,0301,01,0266,0120,0,
+ /* 14460 */ 0241,0202,01,0301,01,0266,0120,0,
+ /* 14468 */ 0241,0202,05,0301,01,0266,0120,0,
+ /* 14476 */ 0241,0202,011,0301,01,0266,0120,0,
+ /* 14484 */ 0241,0202,021,0301,01,0232,0120,0,
+ /* 14492 */ 0241,0202,025,0301,01,0232,0120,0,
+ /* 14500 */ 0241,0202,031,0301,01,0232,0120,0,
+ /* 14508 */ 0241,0202,01,0301,01,0232,0120,0,
+ /* 14516 */ 0241,0202,05,0301,01,0232,0120,0,
+ /* 14524 */ 0241,0202,011,0301,01,0232,0120,0,
+ /* 14532 */ 0241,0202,021,0306,01,0233,0120,0,
+ /* 14540 */ 0241,0202,01,0306,01,0233,0120,0,
+ /* 14548 */ 0241,0202,021,0301,01,0252,0120,0,
+ /* 14556 */ 0241,0202,025,0301,01,0252,0120,0,
+ /* 14564 */ 0241,0202,031,0301,01,0252,0120,0,
+ /* 14572 */ 0241,0202,01,0301,01,0252,0120,0,
+ /* 14580 */ 0241,0202,05,0301,01,0252,0120,0,
+ /* 14588 */ 0241,0202,011,0301,01,0252,0120,0,
+ /* 14596 */ 0241,0202,021,0306,01,0253,0120,0,
+ /* 14604 */ 0241,0202,01,0306,01,0253,0120,0,
+ /* 14612 */ 0241,0202,021,0301,01,0272,0120,0,
+ /* 14620 */ 0241,0202,025,0301,01,0272,0120,0,
+ /* 14628 */ 0241,0202,031,0301,01,0272,0120,0,
+ /* 14636 */ 0241,0202,01,0301,01,0272,0120,0,
+ /* 14644 */ 0241,0202,05,0301,01,0272,0120,0,
+ /* 14652 */ 0241,0202,011,0301,01,0272,0120,0,
+ /* 14660 */ 0241,0202,021,0306,01,0273,0120,0,
+ /* 14668 */ 0241,0202,01,0306,01,0273,0120,0,
+ /* 14676 */ 0241,0202,021,0301,01,0227,0120,0,
+ /* 14684 */ 0241,0202,025,0301,01,0227,0120,0,
+ /* 14692 */ 0241,0202,031,0301,01,0227,0120,0,
+ /* 14700 */ 0241,0202,01,0301,01,0227,0120,0,
+ /* 14708 */ 0241,0202,05,0301,01,0227,0120,0,
+ /* 14716 */ 0241,0202,011,0301,01,0227,0120,0,
+ /* 14724 */ 0241,0202,021,0301,01,0247,0120,0,
+ /* 14732 */ 0241,0202,025,0301,01,0247,0120,0,
+ /* 14740 */ 0241,0202,031,0301,01,0247,0120,0,
+ /* 14748 */ 0241,0202,01,0301,01,0247,0120,0,
+ /* 14756 */ 0241,0202,05,0301,01,0247,0120,0,
+ /* 14764 */ 0241,0202,011,0301,01,0247,0120,0,
+ /* 14772 */ 0241,0202,021,0301,01,0267,0120,0,
+ /* 14780 */ 0241,0202,025,0301,01,0267,0120,0,
+ /* 14788 */ 0241,0202,031,0301,01,0267,0120,0,
+ /* 14796 */ 0241,0202,01,0301,01,0267,0120,0,
+ /* 14804 */ 0241,0202,05,0301,01,0267,0120,0,
+ /* 14812 */ 0241,0202,011,0301,01,0267,0120,0,
+ /* 14820 */ 0241,0202,021,0301,01,0234,0120,0,
+ /* 14828 */ 0241,0202,025,0301,01,0234,0120,0,
+ /* 14836 */ 0241,0202,031,0301,01,0234,0120,0,
+ /* 14844 */ 0241,0202,01,0301,01,0234,0120,0,
+ /* 14852 */ 0241,0202,05,0301,01,0234,0120,0,
+ /* 14860 */ 0241,0202,011,0301,01,0234,0120,0,
+ /* 14868 */ 0241,0202,021,0306,01,0235,0120,0,
+ /* 14876 */ 0241,0202,01,0306,01,0235,0120,0,
+ /* 14884 */ 0241,0202,021,0301,01,0254,0120,0,
+ /* 14892 */ 0241,0202,025,0301,01,0254,0120,0,
+ /* 14900 */ 0241,0202,031,0301,01,0254,0120,0,
+ /* 14908 */ 0241,0202,01,0301,01,0254,0120,0,
+ /* 14916 */ 0241,0202,05,0301,01,0254,0120,0,
+ /* 14924 */ 0241,0202,011,0301,01,0254,0120,0,
+ /* 14932 */ 0241,0202,021,0306,01,0255,0120,0,
+ /* 14940 */ 0241,0202,01,0306,01,0255,0120,0,
+ /* 14948 */ 0241,0202,021,0301,01,0274,0120,0,
+ /* 14956 */ 0241,0202,025,0301,01,0274,0120,0,
+ /* 14964 */ 0241,0202,031,0301,01,0274,0120,0,
+ /* 14972 */ 0241,0202,01,0301,01,0274,0120,0,
+ /* 14980 */ 0241,0202,05,0301,01,0274,0120,0,
+ /* 14988 */ 0241,0202,011,0301,01,0274,0120,0,
+ /* 14996 */ 0241,0202,021,0306,01,0275,0120,0,
+ /* 15004 */ 0241,0202,01,0306,01,0275,0120,0,
+ /* 15012 */ 0241,0202,021,0301,01,0236,0120,0,
+ /* 15020 */ 0241,0202,025,0301,01,0236,0120,0,
+ /* 15028 */ 0241,0202,031,0301,01,0236,0120,0,
+ /* 15036 */ 0241,0202,01,0301,01,0236,0120,0,
+ /* 15044 */ 0241,0202,05,0301,01,0236,0120,0,
+ /* 15052 */ 0241,0202,011,0301,01,0236,0120,0,
+ /* 15060 */ 0241,0202,021,0306,01,0237,0120,0,
+ /* 15068 */ 0241,0202,01,0306,01,0237,0120,0,
+ /* 15076 */ 0241,0202,021,0301,01,0256,0120,0,
+ /* 15084 */ 0241,0202,025,0301,01,0256,0120,0,
+ /* 15092 */ 0241,0202,031,0301,01,0256,0120,0,
+ /* 15100 */ 0241,0202,01,0301,01,0256,0120,0,
+ /* 15108 */ 0241,0202,05,0301,01,0256,0120,0,
+ /* 15116 */ 0241,0202,011,0301,01,0256,0120,0,
+ /* 15124 */ 0241,0202,021,0306,01,0257,0120,0,
+ /* 15132 */ 0241,0202,01,0306,01,0257,0120,0,
+ /* 15140 */ 0241,0202,021,0301,01,0276,0120,0,
+ /* 15148 */ 0241,0202,025,0301,01,0276,0120,0,
+ /* 15156 */ 0241,0202,031,0301,01,0276,0120,0,
+ /* 15164 */ 0241,0202,01,0301,01,0276,0120,0,
+ /* 15172 */ 0241,0202,05,0301,01,0276,0120,0,
+ /* 15180 */ 0241,0202,011,0301,01,0276,0120,0,
+ /* 15188 */ 0241,0202,021,0306,01,0277,0120,0,
+ /* 15196 */ 0241,0202,01,0306,01,0277,0120,0,
+ /* 15204 */ 0250,0202,021,0301,01,0102,0110,0,
+ /* 15212 */ 0250,0202,025,0301,01,0102,0110,0,
+ /* 15220 */ 0250,0202,031,0301,01,0102,0110,0,
+ /* 15228 */ 0250,0202,01,0301,01,0102,0110,0,
+ /* 15236 */ 0250,0202,05,0301,01,0102,0110,0,
+ /* 15244 */ 0250,0202,011,0301,01,0102,0110,0,
+ /* 15252 */ 0241,0202,021,0306,01,0103,0120,0,
+ /* 15260 */ 0241,0202,01,0306,01,0103,0120,0,
+ /* 15268 */ 0241,0201,021,0301,01,0137,0120,0,
+ /* 15276 */ 0240,0201,021,0301,01,0137,0110,0,
+ /* 15284 */ 0241,0201,025,0301,01,0137,0120,0,
+ /* 15292 */ 0240,0201,025,0301,01,0137,0110,0,
+ /* 15300 */ 0241,0201,031,0301,01,0137,0120,0,
+ /* 15308 */ 0240,0201,031,0301,01,0137,0110,0,
+ /* 15316 */ 0241,0201,0,0301,01,0137,0120,0,
+ /* 15324 */ 0240,0201,0,0301,01,0137,0110,0,
+ /* 15332 */ 0241,0201,04,0301,01,0137,0120,0,
+ /* 15340 */ 0240,0201,04,0301,01,0137,0110,0,
+ /* 15348 */ 0241,0201,010,0301,01,0137,0120,0,
+ /* 15356 */ 0240,0201,010,0301,01,0137,0110,0,
+ /* 15364 */ 0241,0201,023,0306,01,0137,0120,0,
+ /* 15372 */ 0240,0201,023,0306,01,0137,0110,0,
+ /* 15380 */ 0241,0201,02,0306,01,0137,0120,0,
+ /* 15388 */ 0240,0201,02,0306,01,0137,0110,0,
+ /* 15396 */ 0241,0201,021,0301,01,0135,0120,0,
+ /* 15404 */ 0240,0201,021,0301,01,0135,0110,0,
+ /* 15412 */ 0241,0201,025,0301,01,0135,0120,0,
+ /* 15420 */ 0240,0201,025,0301,01,0135,0110,0,
+ /* 15428 */ 0241,0201,031,0301,01,0135,0120,0,
+ /* 15436 */ 0240,0201,031,0301,01,0135,0110,0,
+ /* 15444 */ 0241,0201,0,0301,01,0135,0120,0,
+ /* 15452 */ 0240,0201,0,0301,01,0135,0110,0,
+ /* 15460 */ 0241,0201,04,0301,01,0135,0120,0,
+ /* 15468 */ 0240,0201,04,0301,01,0135,0110,0,
+ /* 15476 */ 0241,0201,010,0301,01,0135,0120,0,
+ /* 15484 */ 0240,0201,010,0301,01,0135,0110,0,
+ /* 15492 */ 0241,0201,023,0306,01,0135,0120,0,
+ /* 15500 */ 0240,0201,023,0306,01,0135,0110,0,
+ /* 15508 */ 0241,0201,02,0306,01,0135,0120,0,
+ /* 15516 */ 0240,0201,02,0306,01,0135,0110,0,
+ /* 15524 */ 0250,0201,021,0303,01,050,0110,0,
+ /* 15532 */ 0250,0201,025,0303,01,050,0110,0,
+ /* 15540 */ 0250,0201,031,0303,01,050,0110,0,
+ /* 15548 */ 0250,0201,021,0300,01,051,0101,0,
+ /* 15556 */ 0250,0201,025,0300,01,051,0101,0,
+ /* 15564 */ 0250,0201,031,0300,01,051,0101,0,
+ /* 15572 */ 0250,0201,021,0303,01,051,0101,0,
+ /* 15580 */ 0250,0201,025,0303,01,051,0101,0,
+ /* 15588 */ 0250,0201,031,0303,01,051,0101,0,
+ /* 15596 */ 0250,0201,0,0303,01,050,0110,0,
+ /* 15604 */ 0250,0201,04,0303,01,050,0110,0,
+ /* 15612 */ 0250,0201,010,0303,01,050,0110,0,
+ /* 15620 */ 0250,0201,0,0300,01,051,0101,0,
+ /* 15628 */ 0250,0201,04,0300,01,051,0101,0,
+ /* 15636 */ 0250,0201,010,0300,01,051,0101,0,
+ /* 15644 */ 0250,0201,0,0303,01,051,0101,0,
+ /* 15652 */ 0250,0201,04,0303,01,051,0101,0,
+ /* 15660 */ 0250,0201,010,0303,01,051,0101,0,
+ /* 15668 */ 0250,0201,01,0306,01,0156,0110,0,
+ /* 15676 */ 0250,0201,01,0306,01,0176,0101,0,
+ /* 15684 */ 0250,0201,023,0320,01,022,0110,0,
+ /* 15692 */ 0250,0201,027,0320,01,022,0110,0,
+ /* 15700 */ 0250,0201,033,0320,01,022,0110,0,
+ /* 15708 */ 0250,0201,01,0303,01,0157,0110,0,
+ /* 15716 */ 0250,0201,05,0303,01,0157,0110,0,
+ /* 15724 */ 0250,0201,011,0303,01,0157,0110,0,
+ /* 15732 */ 0250,0201,01,0303,01,0177,0101,0,
+ /* 15740 */ 0250,0201,05,0303,01,0177,0101,0,
+ /* 15748 */ 0250,0201,011,0303,01,0177,0101,0,
+ /* 15756 */ 0250,0201,021,0303,01,0157,0110,0,
+ /* 15764 */ 0250,0201,025,0303,01,0157,0110,0,
+ /* 15772 */ 0250,0201,031,0303,01,0157,0110,0,
+ /* 15780 */ 0250,0201,021,0303,01,0177,0101,0,
+ /* 15788 */ 0250,0201,025,0303,01,0177,0101,0,
+ /* 15796 */ 0250,0201,031,0303,01,0177,0101,0,
+ /* 15804 */ 0250,0201,023,0303,01,0157,0110,0,
+ /* 15812 */ 0250,0201,027,0303,01,0157,0110,0,
+ /* 15820 */ 0250,0201,033,0303,01,0157,0110,0,
+ /* 15828 */ 0250,0201,023,0303,01,0177,0101,0,
+ /* 15836 */ 0250,0201,027,0303,01,0177,0101,0,
+ /* 15844 */ 0250,0201,033,0303,01,0177,0101,0,
+ /* 15852 */ 0250,0201,02,0303,01,0157,0110,0,
+ /* 15860 */ 0250,0201,06,0303,01,0157,0110,0,
+ /* 15868 */ 0250,0201,012,0303,01,0157,0110,0,
+ /* 15876 */ 0250,0201,02,0303,01,0177,0101,0,
+ /* 15884 */ 0250,0201,06,0303,01,0177,0101,0,
+ /* 15892 */ 0250,0201,012,0303,01,0177,0101,0,
+ /* 15900 */ 0250,0201,022,0303,01,0157,0110,0,
+ /* 15908 */ 0250,0201,026,0303,01,0157,0110,0,
+ /* 15916 */ 0250,0201,032,0303,01,0157,0110,0,
+ /* 15924 */ 0250,0201,022,0303,01,0177,0101,0,
+ /* 15932 */ 0250,0201,026,0303,01,0177,0101,0,
+ /* 15940 */ 0250,0201,032,0303,01,0177,0101,0,
+ /* 15948 */ 0250,0201,03,0303,01,0157,0110,0,
+ /* 15956 */ 0250,0201,07,0303,01,0157,0110,0,
+ /* 15964 */ 0250,0201,013,0303,01,0157,0110,0,
+ /* 15972 */ 0250,0201,03,0303,01,0177,0101,0,
+ /* 15980 */ 0250,0201,07,0303,01,0177,0101,0,
+ /* 15988 */ 0250,0201,013,0303,01,0177,0101,0,
+ /* 15996 */ 0241,0201,0,0300,01,022,0120,0,
+ /* 16004 */ 0240,0201,0,0300,01,022,0110,0,
+ /* 16012 */ 0241,0201,021,0306,01,026,0120,0,
+ /* 16020 */ 0240,0201,021,0306,01,026,0110,0,
+ /* 16028 */ 0250,0201,021,0306,01,027,0101,0,
+ /* 16036 */ 0241,0201,0,0311,01,026,0120,0,
+ /* 16044 */ 0240,0201,0,0311,01,026,0110,0,
+ /* 16052 */ 0250,0201,0,0311,01,027,0101,0,
+ /* 16060 */ 0241,0201,0,0300,01,026,0120,0,
+ /* 16068 */ 0240,0201,0,0300,01,026,0110,0,
+ /* 16076 */ 0241,0201,021,0306,01,022,0120,0,
+ /* 16084 */ 0240,0201,021,0306,01,022,0110,0,
+ /* 16092 */ 0250,0201,021,0306,01,023,0101,0,
+ /* 16100 */ 0241,0201,0,0311,01,022,0120,0,
+ /* 16108 */ 0240,0201,0,0311,01,022,0110,0,
+ /* 16116 */ 0250,0201,0,0311,01,023,0101,0,
+ /* 16124 */ 0250,0201,01,0303,01,0347,0101,0,
+ /* 16132 */ 0250,0201,05,0303,01,0347,0101,0,
+ /* 16140 */ 0250,0201,011,0303,01,0347,0101,0,
+ /* 16148 */ 0250,0202,01,0303,01,052,0110,0,
+ /* 16156 */ 0250,0202,05,0303,01,052,0110,0,
+ /* 16164 */ 0250,0202,011,0303,01,052,0110,0,
+ /* 16172 */ 0250,0201,021,0303,01,053,0101,0,
+ /* 16180 */ 0250,0201,025,0303,01,053,0101,0,
+ /* 16188 */ 0250,0201,031,0303,01,053,0101,0,
+ /* 16196 */ 0250,0201,0,0303,01,053,0101,0,
+ /* 16204 */ 0250,0201,04,0303,01,053,0101,0,
+ /* 16212 */ 0250,0201,010,0303,01,053,0101,0,
+ /* 16220 */ 0250,0201,021,0306,01,0156,0110,0,
+ /* 16228 */ 0250,0201,021,0306,01,0176,0101,0,
+ /* 16236 */ 0250,0201,022,0306,01,0176,0110,0,
+ /* 16244 */ 0250,0201,021,0306,01,0326,0101,0,
+ /* 16252 */ 0250,0201,023,0306,01,020,0110,0,
+ /* 16260 */ 0250,0201,023,0306,01,021,0101,0,
+ /* 16268 */ 0241,0201,023,0300,01,020,0120,0,
+ /* 16276 */ 0240,0201,023,0300,01,020,0110,0,
+ /* 16284 */ 0241,0201,023,0300,01,021,0102,0,
+ /* 16292 */ 0240,0201,023,0300,01,021,0101,0,
+ /* 16300 */ 0250,0201,02,0303,01,026,0110,0,
+ /* 16308 */ 0250,0201,06,0303,01,026,0110,0,
+ /* 16316 */ 0250,0201,012,0303,01,026,0110,0,
+ /* 16324 */ 0250,0201,02,0303,01,022,0110,0,
+ /* 16332 */ 0250,0201,06,0303,01,022,0110,0,
+ /* 16340 */ 0250,0201,012,0303,01,022,0110,0,
+ /* 16348 */ 0250,0201,02,0306,01,020,0110,0,
+ /* 16356 */ 0250,0201,02,0306,01,021,0101,0,
+ /* 16364 */ 0241,0201,02,0300,01,020,0120,0,
+ /* 16372 */ 0240,0201,02,0300,01,020,0110,0,
+ /* 16380 */ 0241,0201,02,0300,01,021,0102,0,
+ /* 16388 */ 0240,0201,02,0300,01,021,0101,0,
+ /* 16396 */ 0250,0201,021,0303,01,020,0110,0,
+ /* 16404 */ 0250,0201,025,0303,01,020,0110,0,
+ /* 16412 */ 0250,0201,031,0303,01,020,0110,0,
+ /* 16420 */ 0250,0201,021,0300,01,021,0101,0,
+ /* 16428 */ 0250,0201,025,0300,01,021,0101,0,
+ /* 16436 */ 0250,0201,031,0300,01,021,0101,0,
+ /* 16444 */ 0250,0201,021,0303,01,021,0101,0,
+ /* 16452 */ 0250,0201,025,0303,01,021,0101,0,
+ /* 16460 */ 0250,0201,031,0303,01,021,0101,0,
+ /* 16468 */ 0250,0201,0,0303,01,020,0110,0,
+ /* 16476 */ 0250,0201,04,0303,01,020,0110,0,
+ /* 16484 */ 0250,0201,010,0303,01,020,0110,0,
+ /* 16492 */ 0250,0201,0,0300,01,021,0101,0,
+ /* 16500 */ 0250,0201,04,0300,01,021,0101,0,
+ /* 16508 */ 0250,0201,010,0300,01,021,0101,0,
+ /* 16516 */ 0250,0201,0,0303,01,021,0101,0,
+ /* 16524 */ 0250,0201,04,0303,01,021,0101,0,
+ /* 16532 */ 0250,0201,010,0303,01,021,0101,0,
+ /* 16540 */ 0241,0201,021,0301,01,0131,0120,0,
+ /* 16548 */ 0240,0201,021,0301,01,0131,0110,0,
+ /* 16556 */ 0241,0201,025,0301,01,0131,0120,0,
+ /* 16564 */ 0240,0201,025,0301,01,0131,0110,0,
+ /* 16572 */ 0241,0201,031,0301,01,0131,0120,0,
+ /* 16580 */ 0240,0201,031,0301,01,0131,0110,0,
+ /* 16588 */ 0241,0201,0,0301,01,0131,0120,0,
+ /* 16596 */ 0240,0201,0,0301,01,0131,0110,0,
+ /* 16604 */ 0241,0201,04,0301,01,0131,0120,0,
+ /* 16612 */ 0240,0201,04,0301,01,0131,0110,0,
+ /* 16620 */ 0241,0201,010,0301,01,0131,0120,0,
+ /* 16628 */ 0240,0201,010,0301,01,0131,0110,0,
+ /* 16636 */ 0241,0201,023,0306,01,0131,0120,0,
+ /* 16644 */ 0240,0201,023,0306,01,0131,0110,0,
+ /* 16652 */ 0241,0201,02,0306,01,0131,0120,0,
+ /* 16660 */ 0240,0201,02,0306,01,0131,0110,0,
+ /* 16668 */ 0241,0201,021,0301,01,0126,0120,0,
+ /* 16676 */ 0240,0201,021,0301,01,0126,0110,0,
+ /* 16684 */ 0241,0201,025,0301,01,0126,0120,0,
+ /* 16692 */ 0240,0201,025,0301,01,0126,0110,0,
+ /* 16700 */ 0241,0201,031,0301,01,0126,0120,0,
+ /* 16708 */ 0240,0201,031,0301,01,0126,0110,0,
+ /* 16716 */ 0241,0201,0,0301,01,0126,0120,0,
+ /* 16724 */ 0240,0201,0,0301,01,0126,0110,0,
+ /* 16732 */ 0241,0201,04,0301,01,0126,0120,0,
+ /* 16740 */ 0240,0201,04,0301,01,0126,0110,0,
+ /* 16748 */ 0241,0201,010,0301,01,0126,0120,0,
+ /* 16756 */ 0240,0201,010,0301,01,0126,0110,0,
+ /* 16764 */ 0250,0202,041,0303,01,034,0110,0,
+ /* 16772 */ 0250,0202,045,0303,01,034,0110,0,
+ /* 16780 */ 0250,0202,051,0303,01,034,0110,0,
+ /* 16788 */ 0250,0202,01,0301,01,036,0110,0,
+ /* 16796 */ 0250,0202,05,0301,01,036,0110,0,
+ /* 16804 */ 0250,0202,011,0301,01,036,0110,0,
+ /* 16812 */ 0250,0202,021,0301,01,037,0110,0,
+ /* 16820 */ 0250,0202,025,0301,01,037,0110,0,
+ /* 16828 */ 0250,0202,031,0301,01,037,0110,0,
+ /* 16836 */ 0250,0202,041,0303,01,035,0110,0,
+ /* 16844 */ 0250,0202,045,0303,01,035,0110,0,
+ /* 16852 */ 0250,0202,051,0303,01,035,0110,0,
+ /* 16860 */ 0241,0201,01,0301,01,0153,0120,0,
+ /* 16868 */ 0240,0201,01,0301,01,0153,0110,0,
+ /* 16876 */ 0241,0201,05,0301,01,0153,0120,0,
+ /* 16884 */ 0240,0201,05,0301,01,0153,0110,0,
+ /* 16892 */ 0241,0201,011,0301,01,0153,0120,0,
+ /* 16900 */ 0240,0201,011,0301,01,0153,0110,0,
+ /* 16908 */ 0241,0201,041,0303,01,0143,0120,0,
+ /* 16916 */ 0240,0201,041,0303,01,0143,0110,0,
+ /* 16924 */ 0241,0201,045,0303,01,0143,0120,0,
+ /* 16932 */ 0240,0201,045,0303,01,0143,0110,0,
+ /* 16940 */ 0241,0201,051,0303,01,0143,0120,0,
+ /* 16948 */ 0240,0201,051,0303,01,0143,0110,0,
+ /* 16956 */ 0241,0202,01,0301,01,053,0120,0,
+ /* 16964 */ 0240,0202,01,0301,01,053,0110,0,
+ /* 16972 */ 0241,0202,05,0301,01,053,0120,0,
+ /* 16980 */ 0240,0202,05,0301,01,053,0110,0,
+ /* 16988 */ 0241,0202,011,0301,01,053,0120,0,
+ /* 16996 */ 0240,0202,011,0301,01,053,0110,0,
+ /* 17004 */ 0241,0201,041,0303,01,0147,0120,0,
+ /* 17012 */ 0240,0201,041,0303,01,0147,0110,0,
+ /* 17020 */ 0241,0201,045,0303,01,0147,0120,0,
+ /* 17028 */ 0240,0201,045,0303,01,0147,0110,0,
+ /* 17036 */ 0241,0201,051,0303,01,0147,0120,0,
+ /* 17044 */ 0240,0201,051,0303,01,0147,0110,0,
+ /* 17052 */ 0241,0201,041,0303,01,0374,0120,0,
+ /* 17060 */ 0240,0201,041,0303,01,0374,0110,0,
+ /* 17068 */ 0241,0201,045,0303,01,0374,0120,0,
+ /* 17076 */ 0240,0201,045,0303,01,0374,0110,0,
+ /* 17084 */ 0241,0201,051,0303,01,0374,0120,0,
+ /* 17092 */ 0240,0201,051,0303,01,0374,0110,0,
+ /* 17100 */ 0241,0201,01,0301,01,0376,0120,0,
+ /* 17108 */ 0240,0201,01,0301,01,0376,0110,0,
+ /* 17116 */ 0241,0201,05,0301,01,0376,0120,0,
+ /* 17124 */ 0240,0201,05,0301,01,0376,0110,0,
+ /* 17132 */ 0241,0201,011,0301,01,0376,0120,0,
+ /* 17140 */ 0240,0201,011,0301,01,0376,0110,0,
+ /* 17148 */ 0241,0201,021,0301,01,0324,0120,0,
+ /* 17156 */ 0240,0201,021,0301,01,0324,0110,0,
+ /* 17164 */ 0241,0201,025,0301,01,0324,0120,0,
+ /* 17172 */ 0240,0201,025,0301,01,0324,0110,0,
+ /* 17180 */ 0241,0201,031,0301,01,0324,0120,0,
+ /* 17188 */ 0240,0201,031,0301,01,0324,0110,0,
+ /* 17196 */ 0241,0201,041,0303,01,0354,0120,0,
+ /* 17204 */ 0240,0201,041,0303,01,0354,0110,0,
+ /* 17212 */ 0241,0201,045,0303,01,0354,0120,0,
+ /* 17220 */ 0240,0201,045,0303,01,0354,0110,0,
+ /* 17228 */ 0241,0201,051,0303,01,0354,0120,0,
+ /* 17236 */ 0240,0201,051,0303,01,0354,0110,0,
+ /* 17244 */ 0241,0201,041,0303,01,0355,0120,0,
+ /* 17252 */ 0240,0201,041,0303,01,0355,0110,0,
+ /* 17260 */ 0241,0201,045,0303,01,0355,0120,0,
+ /* 17268 */ 0240,0201,045,0303,01,0355,0110,0,
+ /* 17276 */ 0241,0201,051,0303,01,0355,0120,0,
+ /* 17284 */ 0240,0201,051,0303,01,0355,0110,0,
+ /* 17292 */ 0241,0201,041,0303,01,0334,0120,0,
+ /* 17300 */ 0240,0201,041,0303,01,0334,0110,0,
+ /* 17308 */ 0241,0201,045,0303,01,0334,0120,0,
+ /* 17316 */ 0240,0201,045,0303,01,0334,0110,0,
+ /* 17324 */ 0241,0201,051,0303,01,0334,0120,0,
+ /* 17332 */ 0240,0201,051,0303,01,0334,0110,0,
+ /* 17340 */ 0241,0201,041,0303,01,0335,0120,0,
+ /* 17348 */ 0240,0201,041,0303,01,0335,0110,0,
+ /* 17356 */ 0241,0201,045,0303,01,0335,0120,0,
+ /* 17364 */ 0240,0201,045,0303,01,0335,0110,0,
+ /* 17372 */ 0241,0201,051,0303,01,0335,0120,0,
+ /* 17380 */ 0240,0201,051,0303,01,0335,0110,0,
+ /* 17388 */ 0241,0201,041,0303,01,0375,0120,0,
+ /* 17396 */ 0240,0201,041,0303,01,0375,0110,0,
+ /* 17404 */ 0241,0201,045,0303,01,0375,0120,0,
+ /* 17412 */ 0240,0201,045,0303,01,0375,0110,0,
+ /* 17420 */ 0241,0201,051,0303,01,0375,0120,0,
+ /* 17428 */ 0240,0201,051,0303,01,0375,0110,0,
+ /* 17436 */ 0241,0201,01,0301,01,0333,0120,0,
+ /* 17444 */ 0240,0201,01,0301,01,0333,0110,0,
+ /* 17452 */ 0241,0201,05,0301,01,0333,0120,0,
+ /* 17460 */ 0240,0201,05,0301,01,0333,0110,0,
+ /* 17468 */ 0241,0201,011,0301,01,0333,0120,0,
+ /* 17476 */ 0240,0201,011,0301,01,0333,0110,0,
+ /* 17484 */ 0241,0201,01,0301,01,0337,0120,0,
+ /* 17492 */ 0240,0201,01,0301,01,0337,0110,0,
+ /* 17500 */ 0241,0201,05,0301,01,0337,0120,0,
+ /* 17508 */ 0240,0201,05,0301,01,0337,0110,0,
+ /* 17516 */ 0241,0201,011,0301,01,0337,0120,0,
+ /* 17524 */ 0240,0201,011,0301,01,0337,0110,0,
+ /* 17532 */ 0241,0201,021,0301,01,0337,0120,0,
+ /* 17540 */ 0240,0201,021,0301,01,0337,0110,0,
+ /* 17548 */ 0241,0201,025,0301,01,0337,0120,0,
+ /* 17556 */ 0240,0201,025,0301,01,0337,0110,0,
+ /* 17564 */ 0241,0201,031,0301,01,0337,0120,0,
+ /* 17572 */ 0240,0201,031,0301,01,0337,0110,0,
+ /* 17580 */ 0241,0201,021,0301,01,0333,0120,0,
+ /* 17588 */ 0240,0201,021,0301,01,0333,0110,0,
+ /* 17596 */ 0241,0201,025,0301,01,0333,0120,0,
+ /* 17604 */ 0240,0201,025,0301,01,0333,0110,0,
+ /* 17612 */ 0241,0201,031,0301,01,0333,0120,0,
+ /* 17620 */ 0240,0201,031,0301,01,0333,0110,0,
+ /* 17628 */ 0241,0201,041,0303,01,0340,0120,0,
+ /* 17636 */ 0240,0201,041,0303,01,0340,0110,0,
+ /* 17644 */ 0241,0201,045,0303,01,0340,0120,0,
+ /* 17652 */ 0240,0201,045,0303,01,0340,0110,0,
+ /* 17660 */ 0241,0201,051,0303,01,0340,0120,0,
+ /* 17668 */ 0240,0201,051,0303,01,0340,0110,0,
+ /* 17676 */ 0241,0201,041,0303,01,0343,0120,0,
+ /* 17684 */ 0240,0201,041,0303,01,0343,0110,0,
+ /* 17692 */ 0241,0201,045,0303,01,0343,0120,0,
+ /* 17700 */ 0240,0201,045,0303,01,0343,0110,0,
+ /* 17708 */ 0241,0201,051,0303,01,0343,0120,0,
+ /* 17716 */ 0240,0201,051,0303,01,0343,0110,0,
+ /* 17724 */ 0241,0202,01,0303,01,0146,0120,0,
+ /* 17732 */ 0241,0202,05,0303,01,0146,0120,0,
+ /* 17740 */ 0241,0202,011,0303,01,0146,0120,0,
+ /* 17748 */ 0241,0202,01,0301,01,0144,0120,0,
+ /* 17756 */ 0241,0202,05,0301,01,0144,0120,0,
+ /* 17764 */ 0241,0202,011,0301,01,0144,0120,0,
+ /* 17772 */ 0241,0202,021,0301,01,0144,0120,0,
+ /* 17780 */ 0241,0202,025,0301,01,0144,0120,0,
+ /* 17788 */ 0241,0202,031,0301,01,0144,0120,0,
+ /* 17796 */ 0241,0202,021,0303,01,0146,0120,0,
+ /* 17804 */ 0241,0202,025,0303,01,0146,0120,0,
+ /* 17812 */ 0241,0202,031,0303,01,0146,0120,0,
+ /* 17820 */ 0250,0202,01,0304,01,0170,0110,0,
+ /* 17828 */ 0250,0202,05,0304,01,0170,0110,0,
+ /* 17836 */ 0250,0202,011,0304,01,0170,0110,0,
+ /* 17844 */ 0250,0202,01,0300,01,0172,0110,0,
+ /* 17852 */ 0250,0202,05,0300,01,0172,0110,0,
+ /* 17860 */ 0250,0202,011,0300,01,0172,0110,0,
+ /* 17868 */ 0250,0202,01,0306,01,0130,0110,0,
+ /* 17876 */ 0250,0202,05,0306,01,0130,0110,0,
+ /* 17884 */ 0250,0202,011,0306,01,0130,0110,0,
+ /* 17892 */ 0250,0202,01,0300,01,0130,0110,0,
+ /* 17900 */ 0250,0202,05,0300,01,0130,0110,0,
+ /* 17908 */ 0250,0202,011,0300,01,0130,0110,0,
+ /* 17916 */ 0250,0202,01,0300,01,0174,0110,0,
+ /* 17924 */ 0250,0202,05,0300,01,0174,0110,0,
+ /* 17932 */ 0250,0202,011,0300,01,0174,0110,0,
+ /* 17940 */ 0250,0202,022,0300,01,052,0110,0,
+ /* 17948 */ 0250,0202,026,0300,01,052,0110,0,
+ /* 17956 */ 0250,0202,032,0300,01,052,0110,0,
+ /* 17964 */ 0250,0202,02,0300,01,072,0110,0,
+ /* 17972 */ 0250,0202,06,0300,01,072,0110,0,
+ /* 17980 */ 0250,0202,012,0300,01,072,0110,0,
+ /* 17988 */ 0250,0202,021,0306,01,0131,0110,0,
+ /* 17996 */ 0250,0202,025,0306,01,0131,0110,0,
+ /* 18004 */ 0250,0202,031,0306,01,0131,0110,0,
+ /* 18012 */ 0250,0202,021,0300,01,0131,0110,0,
+ /* 18020 */ 0250,0202,025,0300,01,0131,0110,0,
+ /* 18028 */ 0250,0202,031,0300,01,0131,0110,0,
+ /* 18036 */ 0250,0202,021,0300,01,0174,0110,0,
+ /* 18044 */ 0250,0202,025,0300,01,0174,0110,0,
+ /* 18052 */ 0250,0202,031,0300,01,0174,0110,0,
+ /* 18060 */ 0250,0202,01,0305,01,0171,0110,0,
+ /* 18068 */ 0250,0202,05,0305,01,0171,0110,0,
+ /* 18076 */ 0250,0202,011,0305,01,0171,0110,0,
+ /* 18084 */ 0250,0202,01,0300,01,0173,0110,0,
+ /* 18092 */ 0250,0202,05,0300,01,0173,0110,0,
+ /* 18100 */ 0250,0202,011,0300,01,0173,0110,0,
+ /* 18108 */ 0241,0201,041,0303,01,0164,0120,0,
+ /* 18116 */ 0241,0201,045,0303,01,0164,0120,0,
+ /* 18124 */ 0241,0201,051,0303,01,0164,0120,0,
+ /* 18132 */ 0241,0201,01,0301,01,0166,0120,0,
+ /* 18140 */ 0241,0201,05,0301,01,0166,0120,0,
+ /* 18148 */ 0241,0201,011,0301,01,0166,0120,0,
+ /* 18156 */ 0241,0202,021,0301,01,051,0120,0,
+ /* 18164 */ 0241,0202,025,0301,01,051,0120,0,
+ /* 18172 */ 0241,0202,031,0301,01,051,0120,0,
+ /* 18180 */ 0241,0201,041,0303,01,0165,0120,0,
+ /* 18188 */ 0241,0201,045,0303,01,0165,0120,0,
+ /* 18196 */ 0241,0201,051,0303,01,0165,0120,0,
+ /* 18204 */ 0241,0201,041,0303,01,0144,0120,0,
+ /* 18212 */ 0241,0201,045,0303,01,0144,0120,0,
+ /* 18220 */ 0241,0201,051,0303,01,0144,0120,0,
+ /* 18228 */ 0241,0201,01,0301,01,0146,0120,0,
+ /* 18236 */ 0241,0201,05,0301,01,0146,0120,0,
+ /* 18244 */ 0241,0201,011,0301,01,0146,0120,0,
+ /* 18252 */ 0241,0202,021,0301,01,067,0120,0,
+ /* 18260 */ 0241,0202,025,0301,01,067,0120,0,
+ /* 18268 */ 0241,0202,031,0301,01,067,0120,0,
+ /* 18276 */ 0241,0201,041,0303,01,0145,0120,0,
+ /* 18284 */ 0241,0201,045,0303,01,0145,0120,0,
+ /* 18292 */ 0241,0201,051,0303,01,0145,0120,0,
+ /* 18300 */ 0250,0202,01,0306,01,0213,0101,0,
+ /* 18308 */ 0250,0202,05,0306,01,0213,0101,0,
+ /* 18316 */ 0250,0202,011,0306,01,0213,0101,0,
+ /* 18324 */ 0250,0202,01,0300,01,0213,0101,0,
+ /* 18332 */ 0250,0202,05,0300,01,0213,0101,0,
+ /* 18340 */ 0250,0202,011,0300,01,0213,0101,0,
+ /* 18348 */ 0250,0202,021,0306,01,0213,0101,0,
+ /* 18356 */ 0250,0202,025,0306,01,0213,0101,0,
+ /* 18364 */ 0250,0202,031,0306,01,0213,0101,0,
+ /* 18372 */ 0250,0202,021,0300,01,0213,0101,0,
+ /* 18380 */ 0250,0202,025,0300,01,0213,0101,0,
+ /* 18388 */ 0250,0202,031,0300,01,0213,0101,0,
+ /* 18396 */ 0250,0202,01,0301,01,0304,0110,0,
+ /* 18404 */ 0250,0202,05,0301,01,0304,0110,0,
+ /* 18412 */ 0250,0202,011,0301,01,0304,0110,0,
+ /* 18420 */ 0250,0202,021,0301,01,0304,0110,0,
+ /* 18428 */ 0250,0202,025,0301,01,0304,0110,0,
+ /* 18436 */ 0250,0202,031,0301,01,0304,0110,0,
+ /* 18444 */ 0241,0202,01,0303,01,0215,0120,0,
+ /* 18452 */ 0240,0202,01,0303,01,0215,0110,0,
+ /* 18460 */ 0241,0202,05,0303,01,0215,0120,0,
+ /* 18468 */ 0240,0202,05,0303,01,0215,0110,0,
+ /* 18476 */ 0241,0202,011,0303,01,0215,0120,0,
+ /* 18484 */ 0240,0202,011,0303,01,0215,0110,0,
+ /* 18492 */ 0241,0202,05,0301,01,066,0120,0,
+ /* 18500 */ 0240,0202,05,0301,01,066,0110,0,
+ /* 18508 */ 0241,0202,011,0301,01,066,0120,0,
+ /* 18516 */ 0240,0202,011,0301,01,066,0110,0,
+ /* 18524 */ 0241,0202,01,0303,01,0165,0120,0,
+ /* 18532 */ 0241,0202,05,0303,01,0165,0120,0,
+ /* 18540 */ 0241,0202,011,0303,01,0165,0120,0,
+ /* 18548 */ 0241,0202,01,0301,01,0166,0120,0,
+ /* 18556 */ 0241,0202,05,0301,01,0166,0120,0,
+ /* 18564 */ 0241,0202,011,0301,01,0166,0120,0,
+ /* 18572 */ 0241,0202,021,0301,01,0167,0120,0,
+ /* 18580 */ 0241,0202,025,0301,01,0167,0120,0,
+ /* 18588 */ 0241,0202,031,0301,01,0167,0120,0,
+ /* 18596 */ 0241,0202,01,0301,01,0167,0120,0,
+ /* 18604 */ 0241,0202,05,0301,01,0167,0120,0,
+ /* 18612 */ 0241,0202,011,0301,01,0167,0120,0,
+ /* 18620 */ 0241,0202,021,0301,01,0166,0120,0,
+ /* 18628 */ 0241,0202,025,0301,01,0166,0120,0,
+ /* 18636 */ 0241,0202,031,0301,01,0166,0120,0,
+ /* 18644 */ 0241,0202,021,0303,01,0165,0120,0,
+ /* 18652 */ 0241,0202,025,0303,01,0165,0120,0,
+ /* 18660 */ 0241,0202,031,0303,01,0165,0120,0,
+ /* 18668 */ 0241,0202,021,0301,01,015,0120,0,
+ /* 18676 */ 0240,0202,021,0301,01,015,0110,0,
+ /* 18684 */ 0241,0202,025,0301,01,015,0120,0,
+ /* 18692 */ 0240,0202,025,0301,01,015,0110,0,
+ /* 18700 */ 0241,0202,031,0301,01,015,0120,0,
+ /* 18708 */ 0240,0202,031,0301,01,015,0110,0,
+ /* 18716 */ 0241,0202,01,0301,01,014,0120,0,
+ /* 18724 */ 0240,0202,01,0301,01,014,0110,0,
+ /* 18732 */ 0241,0202,05,0301,01,014,0120,0,
+ /* 18740 */ 0240,0202,05,0301,01,014,0110,0,
+ /* 18748 */ 0241,0202,011,0301,01,014,0120,0,
+ /* 18756 */ 0240,0202,011,0301,01,014,0110,0,
+ /* 18764 */ 0241,0202,025,0301,01,026,0120,0,
+ /* 18772 */ 0240,0202,025,0301,01,026,0110,0,
+ /* 18780 */ 0241,0202,031,0301,01,026,0120,0,
+ /* 18788 */ 0240,0202,031,0301,01,026,0110,0,
+ /* 18796 */ 0241,0202,05,0301,01,026,0120,0,
+ /* 18804 */ 0240,0202,05,0301,01,026,0110,0,
+ /* 18812 */ 0241,0202,011,0301,01,026,0120,0,
+ /* 18820 */ 0240,0202,011,0301,01,026,0110,0,
+ /* 18828 */ 0241,0202,025,0301,01,066,0120,0,
+ /* 18836 */ 0240,0202,025,0301,01,066,0110,0,
+ /* 18844 */ 0241,0202,031,0301,01,066,0120,0,
+ /* 18852 */ 0240,0202,031,0301,01,066,0110,0,
+ /* 18860 */ 0241,0202,01,0303,01,0175,0120,0,
+ /* 18868 */ 0241,0202,05,0303,01,0175,0120,0,
+ /* 18876 */ 0241,0202,011,0303,01,0175,0120,0,
+ /* 18884 */ 0241,0202,01,0301,01,0176,0120,0,
+ /* 18892 */ 0241,0202,05,0301,01,0176,0120,0,
+ /* 18900 */ 0241,0202,011,0301,01,0176,0120,0,
+ /* 18908 */ 0241,0202,021,0301,01,0177,0120,0,
+ /* 18916 */ 0241,0202,025,0301,01,0177,0120,0,
+ /* 18924 */ 0241,0202,031,0301,01,0177,0120,0,
+ /* 18932 */ 0241,0202,01,0301,01,0177,0120,0,
+ /* 18940 */ 0241,0202,05,0301,01,0177,0120,0,
+ /* 18948 */ 0241,0202,011,0301,01,0177,0120,0,
+ /* 18956 */ 0241,0202,021,0301,01,0176,0120,0,
+ /* 18964 */ 0241,0202,025,0301,01,0176,0120,0,
+ /* 18972 */ 0241,0202,031,0301,01,0176,0120,0,
+ /* 18980 */ 0241,0202,021,0303,01,0175,0120,0,
+ /* 18988 */ 0241,0202,025,0303,01,0175,0120,0,
+ /* 18996 */ 0241,0202,031,0303,01,0175,0120,0,
+ /* 19004 */ 0241,0202,021,0303,01,0215,0120,0,
+ /* 19012 */ 0240,0202,021,0303,01,0215,0110,0,
+ /* 19020 */ 0241,0202,025,0303,01,0215,0120,0,
+ /* 19028 */ 0240,0202,025,0303,01,0215,0110,0,
+ /* 19036 */ 0241,0202,031,0303,01,0215,0120,0,
+ /* 19044 */ 0240,0202,031,0303,01,0215,0110,0,
+ /* 19052 */ 0250,0202,01,0306,01,0211,0110,0,
+ /* 19060 */ 0250,0202,05,0306,01,0211,0110,0,
+ /* 19068 */ 0250,0202,011,0306,01,0211,0110,0,
+ /* 19076 */ 0250,0202,021,0306,01,0211,0110,0,
+ /* 19084 */ 0250,0202,025,0306,01,0211,0110,0,
+ /* 19092 */ 0250,0202,031,0306,01,0211,0110,0,
+ /* 19100 */ 0250,0202,01,0301,01,0104,0110,0,
+ /* 19108 */ 0250,0202,05,0301,01,0104,0110,0,
+ /* 19116 */ 0250,0202,011,0301,01,0104,0110,0,
+ /* 19124 */ 0250,0202,021,0301,01,0104,0110,0,
+ /* 19132 */ 0250,0202,025,0301,01,0104,0110,0,
+ /* 19140 */ 0250,0202,031,0301,01,0104,0110,0,
+ /* 19148 */ 0241,0202,021,0301,01,0265,0120,0,
+ /* 19156 */ 0241,0202,025,0301,01,0265,0120,0,
+ /* 19164 */ 0241,0202,031,0301,01,0265,0120,0,
+ /* 19172 */ 0241,0202,021,0301,01,0264,0120,0,
+ /* 19180 */ 0241,0202,025,0301,01,0264,0120,0,
+ /* 19188 */ 0241,0202,031,0301,01,0264,0120,0,
+ /* 19196 */ 0241,0202,041,0303,01,04,0120,0,
+ /* 19204 */ 0240,0202,041,0303,01,04,0110,0,
+ /* 19212 */ 0241,0202,045,0303,01,04,0120,0,
+ /* 19220 */ 0240,0202,045,0303,01,04,0110,0,
+ /* 19228 */ 0241,0202,051,0303,01,04,0120,0,
+ /* 19236 */ 0240,0202,051,0303,01,04,0110,0,
+ /* 19244 */ 0241,0201,041,0303,01,0365,0120,0,
+ /* 19252 */ 0240,0201,041,0303,01,0365,0110,0,
+ /* 19260 */ 0241,0201,045,0303,01,0365,0120,0,
+ /* 19268 */ 0240,0201,045,0303,01,0365,0110,0,
+ /* 19276 */ 0241,0201,051,0303,01,0365,0120,0,
+ /* 19284 */ 0240,0201,051,0303,01,0365,0110,0,
+ /* 19292 */ 0241,0202,041,0303,01,074,0120,0,
+ /* 19300 */ 0240,0202,041,0303,01,074,0110,0,
+ /* 19308 */ 0241,0202,045,0303,01,074,0120,0,
+ /* 19316 */ 0240,0202,045,0303,01,074,0110,0,
+ /* 19324 */ 0241,0202,051,0303,01,074,0120,0,
+ /* 19332 */ 0240,0202,051,0303,01,074,0110,0,
+ /* 19340 */ 0241,0202,01,0301,01,075,0120,0,
+ /* 19348 */ 0240,0202,01,0301,01,075,0110,0,
+ /* 19356 */ 0241,0202,05,0301,01,075,0120,0,
+ /* 19364 */ 0240,0202,05,0301,01,075,0110,0,
+ /* 19372 */ 0241,0202,011,0301,01,075,0120,0,
+ /* 19380 */ 0240,0202,011,0301,01,075,0110,0,
+ /* 19388 */ 0241,0202,021,0301,01,075,0120,0,
+ /* 19396 */ 0240,0202,021,0301,01,075,0110,0,
+ /* 19404 */ 0241,0202,025,0301,01,075,0120,0,
+ /* 19412 */ 0240,0202,025,0301,01,075,0110,0,
+ /* 19420 */ 0241,0202,031,0301,01,075,0120,0,
+ /* 19428 */ 0240,0202,031,0301,01,075,0110,0,
+ /* 19436 */ 0241,0201,041,0303,01,0356,0120,0,
+ /* 19444 */ 0240,0201,041,0303,01,0356,0110,0,
+ /* 19452 */ 0241,0201,045,0303,01,0356,0120,0,
+ /* 19460 */ 0240,0201,045,0303,01,0356,0110,0,
+ /* 19468 */ 0241,0201,051,0303,01,0356,0120,0,
+ /* 19476 */ 0240,0201,051,0303,01,0356,0110,0,
+ /* 19484 */ 0241,0201,041,0303,01,0336,0120,0,
+ /* 19492 */ 0240,0201,041,0303,01,0336,0110,0,
+ /* 19500 */ 0241,0201,045,0303,01,0336,0120,0,
+ /* 19508 */ 0240,0201,045,0303,01,0336,0110,0,
+ /* 19516 */ 0241,0201,051,0303,01,0336,0120,0,
+ /* 19524 */ 0240,0201,051,0303,01,0336,0110,0,
+ /* 19532 */ 0241,0202,01,0301,01,077,0120,0,
+ /* 19540 */ 0240,0202,01,0301,01,077,0110,0,
+ /* 19548 */ 0241,0202,05,0301,01,077,0120,0,
+ /* 19556 */ 0240,0202,05,0301,01,077,0110,0,
+ /* 19564 */ 0241,0202,011,0301,01,077,0120,0,
+ /* 19572 */ 0240,0202,011,0301,01,077,0110,0,
+ /* 19580 */ 0241,0202,021,0301,01,077,0120,0,
+ /* 19588 */ 0240,0202,021,0301,01,077,0110,0,
+ /* 19596 */ 0241,0202,025,0301,01,077,0120,0,
+ /* 19604 */ 0240,0202,025,0301,01,077,0110,0,
+ /* 19612 */ 0241,0202,031,0301,01,077,0120,0,
+ /* 19620 */ 0240,0202,031,0301,01,077,0110,0,
+ /* 19628 */ 0241,0202,041,0303,01,076,0120,0,
+ /* 19636 */ 0240,0202,041,0303,01,076,0110,0,
+ /* 19644 */ 0241,0202,045,0303,01,076,0120,0,
+ /* 19652 */ 0240,0202,045,0303,01,076,0110,0,
+ /* 19660 */ 0241,0202,051,0303,01,076,0120,0,
+ /* 19668 */ 0240,0202,051,0303,01,076,0110,0,
+ /* 19676 */ 0241,0202,041,0303,01,070,0120,0,
+ /* 19684 */ 0240,0202,041,0303,01,070,0110,0,
+ /* 19692 */ 0241,0202,045,0303,01,070,0120,0,
+ /* 19700 */ 0240,0202,045,0303,01,070,0110,0,
+ /* 19708 */ 0241,0202,051,0303,01,070,0120,0,
+ /* 19716 */ 0240,0202,051,0303,01,070,0110,0,
+ /* 19724 */ 0241,0202,01,0301,01,071,0120,0,
+ /* 19732 */ 0240,0202,01,0301,01,071,0110,0,
+ /* 19740 */ 0241,0202,05,0301,01,071,0120,0,
+ /* 19748 */ 0240,0202,05,0301,01,071,0110,0,
+ /* 19756 */ 0241,0202,011,0301,01,071,0120,0,
+ /* 19764 */ 0240,0202,011,0301,01,071,0110,0,
+ /* 19772 */ 0241,0202,021,0301,01,071,0120,0,
+ /* 19780 */ 0240,0202,021,0301,01,071,0110,0,
+ /* 19788 */ 0241,0202,025,0301,01,071,0120,0,
+ /* 19796 */ 0240,0202,025,0301,01,071,0110,0,
+ /* 19804 */ 0241,0202,031,0301,01,071,0120,0,
+ /* 19812 */ 0240,0202,031,0301,01,071,0110,0,
+ /* 19820 */ 0241,0201,041,0303,01,0352,0120,0,
+ /* 19828 */ 0240,0201,041,0303,01,0352,0110,0,
+ /* 19836 */ 0241,0201,045,0303,01,0352,0120,0,
+ /* 19844 */ 0240,0201,045,0303,01,0352,0110,0,
+ /* 19852 */ 0241,0201,051,0303,01,0352,0120,0,
+ /* 19860 */ 0240,0201,051,0303,01,0352,0110,0,
+ /* 19868 */ 0241,0201,041,0303,01,0332,0120,0,
+ /* 19876 */ 0240,0201,041,0303,01,0332,0110,0,
+ /* 19884 */ 0241,0201,045,0303,01,0332,0120,0,
+ /* 19892 */ 0240,0201,045,0303,01,0332,0110,0,
+ /* 19900 */ 0241,0201,051,0303,01,0332,0120,0,
+ /* 19908 */ 0240,0201,051,0303,01,0332,0110,0,
+ /* 19916 */ 0241,0202,01,0301,01,073,0120,0,
+ /* 19924 */ 0240,0202,01,0301,01,073,0110,0,
+ /* 19932 */ 0241,0202,05,0301,01,073,0120,0,
+ /* 19940 */ 0240,0202,05,0301,01,073,0110,0,
+ /* 19948 */ 0241,0202,011,0301,01,073,0120,0,
+ /* 19956 */ 0240,0202,011,0301,01,073,0110,0,
+ /* 19964 */ 0241,0202,021,0301,01,073,0120,0,
+ /* 19972 */ 0240,0202,021,0301,01,073,0110,0,
+ /* 19980 */ 0241,0202,025,0301,01,073,0120,0,
+ /* 19988 */ 0240,0202,025,0301,01,073,0110,0,
+ /* 19996 */ 0241,0202,031,0301,01,073,0120,0,
+ /* 20004 */ 0240,0202,031,0301,01,073,0110,0,
+ /* 20012 */ 0241,0202,041,0303,01,072,0120,0,
+ /* 20020 */ 0240,0202,041,0303,01,072,0110,0,
+ /* 20028 */ 0241,0202,045,0303,01,072,0120,0,
+ /* 20036 */ 0240,0202,045,0303,01,072,0110,0,
+ /* 20044 */ 0241,0202,051,0303,01,072,0120,0,
+ /* 20052 */ 0240,0202,051,0303,01,072,0110,0,
+ /* 20060 */ 0250,0202,02,0300,01,051,0110,0,
+ /* 20068 */ 0250,0202,06,0300,01,051,0110,0,
+ /* 20076 */ 0250,0202,012,0300,01,051,0110,0,
+ /* 20084 */ 0250,0202,02,0300,01,071,0110,0,
+ /* 20092 */ 0250,0202,06,0300,01,071,0110,0,
+ /* 20100 */ 0250,0202,012,0300,01,071,0110,0,
+ /* 20108 */ 0250,0202,02,0300,01,061,0101,0,
+ /* 20116 */ 0250,0202,06,0300,01,061,0101,0,
+ /* 20124 */ 0250,0202,012,0300,01,061,0101,0,
+ /* 20132 */ 0250,0202,02,0315,01,061,0101,0,
+ /* 20140 */ 0250,0202,06,0315,01,061,0101,0,
+ /* 20148 */ 0250,0202,012,0315,01,061,0101,0,
+ /* 20156 */ 0250,0202,02,0300,01,063,0101,0,
+ /* 20164 */ 0250,0202,06,0300,01,063,0101,0,
+ /* 20172 */ 0250,0202,012,0300,01,063,0101,0,
+ /* 20180 */ 0250,0202,02,0314,01,063,0101,0,
+ /* 20188 */ 0250,0202,06,0314,01,063,0101,0,
+ /* 20196 */ 0250,0202,012,0314,01,063,0101,0,
+ /* 20204 */ 0250,0202,02,0300,01,050,0110,0,
+ /* 20212 */ 0250,0202,06,0300,01,050,0110,0,
+ /* 20220 */ 0250,0202,012,0300,01,050,0110,0,
+ /* 20228 */ 0250,0202,02,0300,01,070,0110,0,
+ /* 20236 */ 0250,0202,06,0300,01,070,0110,0,
+ /* 20244 */ 0250,0202,012,0300,01,070,0110,0,
+ /* 20252 */ 0250,0202,022,0300,01,070,0110,0,
+ /* 20260 */ 0250,0202,026,0300,01,070,0110,0,
+ /* 20268 */ 0250,0202,032,0300,01,070,0110,0,
+ /* 20276 */ 0250,0202,022,0300,01,050,0110,0,
+ /* 20284 */ 0250,0202,026,0300,01,050,0110,0,
+ /* 20292 */ 0250,0202,032,0300,01,050,0110,0,
+ /* 20300 */ 0250,0202,022,0300,01,071,0110,0,
+ /* 20308 */ 0250,0202,026,0300,01,071,0110,0,
+ /* 20316 */ 0250,0202,032,0300,01,071,0110,0,
+ /* 20324 */ 0250,0202,02,0300,01,062,0101,0,
+ /* 20332 */ 0250,0202,06,0300,01,062,0101,0,
+ /* 20340 */ 0250,0202,012,0300,01,062,0101,0,
+ /* 20348 */ 0250,0202,02,0316,01,062,0101,0,
+ /* 20356 */ 0250,0202,06,0316,01,062,0101,0,
+ /* 20364 */ 0250,0202,012,0316,01,062,0101,0,
+ /* 20372 */ 0250,0202,02,0300,01,065,0101,0,
+ /* 20380 */ 0250,0202,06,0300,01,065,0101,0,
+ /* 20388 */ 0250,0202,012,0300,01,065,0101,0,
+ /* 20396 */ 0250,0202,02,0314,01,065,0101,0,
+ /* 20404 */ 0250,0202,06,0314,01,065,0101,0,
+ /* 20412 */ 0250,0202,012,0314,01,065,0101,0,
+ /* 20420 */ 0250,0202,02,0300,01,064,0101,0,
+ /* 20428 */ 0250,0202,06,0300,01,064,0101,0,
+ /* 20436 */ 0250,0202,012,0300,01,064,0101,0,
+ /* 20444 */ 0250,0202,02,0315,01,064,0101,0,
+ /* 20452 */ 0250,0202,06,0315,01,064,0101,0,
+ /* 20460 */ 0250,0202,012,0315,01,064,0101,0,
+ /* 20468 */ 0250,0202,02,0300,01,041,0101,0,
+ /* 20476 */ 0250,0202,06,0300,01,041,0101,0,
+ /* 20484 */ 0250,0202,012,0300,01,041,0101,0,
+ /* 20492 */ 0250,0202,02,0315,01,041,0101,0,
+ /* 20500 */ 0250,0202,06,0315,01,041,0101,0,
+ /* 20508 */ 0250,0202,012,0315,01,041,0101,0,
+ /* 20516 */ 0250,0202,02,0300,01,043,0101,0,
+ /* 20524 */ 0250,0202,06,0300,01,043,0101,0,
+ /* 20532 */ 0250,0202,012,0300,01,043,0101,0,
+ /* 20540 */ 0250,0202,02,0314,01,043,0101,0,
+ /* 20548 */ 0250,0202,06,0314,01,043,0101,0,
+ /* 20556 */ 0250,0202,012,0314,01,043,0101,0,
+ /* 20564 */ 0250,0202,02,0300,01,042,0101,0,
+ /* 20572 */ 0250,0202,06,0300,01,042,0101,0,
+ /* 20580 */ 0250,0202,012,0300,01,042,0101,0,
+ /* 20588 */ 0250,0202,02,0316,01,042,0101,0,
+ /* 20596 */ 0250,0202,06,0316,01,042,0101,0,
+ /* 20604 */ 0250,0202,012,0316,01,042,0101,0,
+ /* 20612 */ 0250,0202,02,0300,01,045,0101,0,
+ /* 20620 */ 0250,0202,06,0300,01,045,0101,0,
+ /* 20628 */ 0250,0202,012,0300,01,045,0101,0,
+ /* 20636 */ 0250,0202,02,0314,01,045,0101,0,
+ /* 20644 */ 0250,0202,06,0314,01,045,0101,0,
+ /* 20652 */ 0250,0202,012,0314,01,045,0101,0,
+ /* 20660 */ 0250,0202,02,0300,01,044,0101,0,
+ /* 20668 */ 0250,0202,06,0300,01,044,0101,0,
+ /* 20676 */ 0250,0202,012,0300,01,044,0101,0,
+ /* 20684 */ 0250,0202,02,0315,01,044,0101,0,
+ /* 20692 */ 0250,0202,06,0315,01,044,0101,0,
+ /* 20700 */ 0250,0202,012,0315,01,044,0101,0,
+ /* 20708 */ 0250,0202,02,0300,01,040,0101,0,
+ /* 20716 */ 0250,0202,06,0300,01,040,0101,0,
+ /* 20724 */ 0250,0202,012,0300,01,040,0101,0,
+ /* 20732 */ 0250,0202,02,0314,01,040,0101,0,
+ /* 20740 */ 0250,0202,06,0314,01,040,0101,0,
+ /* 20748 */ 0250,0202,012,0314,01,040,0101,0,
+ /* 20756 */ 0250,0202,041,0315,01,041,0110,0,
+ /* 20764 */ 0250,0202,045,0315,01,041,0110,0,
+ /* 20772 */ 0250,0202,051,0315,01,041,0110,0,
+ /* 20780 */ 0250,0202,041,0316,01,042,0110,0,
+ /* 20788 */ 0250,0202,045,0316,01,042,0110,0,
+ /* 20796 */ 0250,0202,051,0316,01,042,0110,0,
+ /* 20804 */ 0250,0202,041,0314,01,040,0110,0,
+ /* 20812 */ 0250,0202,045,0314,01,040,0110,0,
+ /* 20820 */ 0250,0202,051,0314,01,040,0110,0,
+ /* 20828 */ 0250,0202,01,0314,01,045,0110,0,
+ /* 20836 */ 0250,0202,05,0314,01,045,0110,0,
+ /* 20844 */ 0250,0202,011,0314,01,045,0110,0,
+ /* 20852 */ 0250,0202,041,0314,01,043,0110,0,
+ /* 20860 */ 0250,0202,045,0314,01,043,0110,0,
+ /* 20868 */ 0250,0202,051,0314,01,043,0110,0,
+ /* 20876 */ 0250,0202,041,0315,01,044,0110,0,
+ /* 20884 */ 0250,0202,045,0315,01,044,0110,0,
+ /* 20892 */ 0250,0202,051,0315,01,044,0110,0,
+ /* 20900 */ 0250,0202,02,0300,01,021,0101,0,
+ /* 20908 */ 0250,0202,06,0300,01,021,0101,0,
+ /* 20916 */ 0250,0202,012,0300,01,021,0101,0,
+ /* 20924 */ 0250,0202,02,0315,01,021,0101,0,
+ /* 20932 */ 0250,0202,06,0315,01,021,0101,0,
+ /* 20940 */ 0250,0202,012,0315,01,021,0101,0,
+ /* 20948 */ 0250,0202,02,0300,01,023,0101,0,
+ /* 20956 */ 0250,0202,06,0300,01,023,0101,0,
+ /* 20964 */ 0250,0202,012,0300,01,023,0101,0,
+ /* 20972 */ 0250,0202,02,0314,01,023,0101,0,
+ /* 20980 */ 0250,0202,06,0314,01,023,0101,0,
+ /* 20988 */ 0250,0202,012,0314,01,023,0101,0,
+ /* 20996 */ 0250,0202,02,0300,01,022,0101,0,
+ /* 21004 */ 0250,0202,06,0300,01,022,0101,0,
+ /* 21012 */ 0250,0202,012,0300,01,022,0101,0,
+ /* 21020 */ 0250,0202,02,0316,01,022,0101,0,
+ /* 21028 */ 0250,0202,06,0316,01,022,0101,0,
+ /* 21036 */ 0250,0202,012,0316,01,022,0101,0,
+ /* 21044 */ 0250,0202,02,0300,01,025,0101,0,
+ /* 21052 */ 0250,0202,06,0300,01,025,0101,0,
+ /* 21060 */ 0250,0202,012,0300,01,025,0101,0,
+ /* 21068 */ 0250,0202,02,0314,01,025,0101,0,
+ /* 21076 */ 0250,0202,06,0314,01,025,0101,0,
+ /* 21084 */ 0250,0202,012,0314,01,025,0101,0,
+ /* 21092 */ 0250,0202,02,0300,01,024,0101,0,
+ /* 21100 */ 0250,0202,06,0300,01,024,0101,0,
+ /* 21108 */ 0250,0202,012,0300,01,024,0101,0,
+ /* 21116 */ 0250,0202,02,0315,01,024,0101,0,
+ /* 21124 */ 0250,0202,06,0315,01,024,0101,0,
+ /* 21132 */ 0250,0202,012,0315,01,024,0101,0,
+ /* 21140 */ 0250,0202,02,0300,01,020,0101,0,
+ /* 21148 */ 0250,0202,06,0300,01,020,0101,0,
+ /* 21156 */ 0250,0202,012,0300,01,020,0101,0,
+ /* 21164 */ 0250,0202,02,0314,01,020,0101,0,
+ /* 21172 */ 0250,0202,06,0314,01,020,0101,0,
+ /* 21180 */ 0250,0202,012,0314,01,020,0101,0,
+ /* 21188 */ 0250,0202,022,0300,01,051,0110,0,
+ /* 21196 */ 0250,0202,026,0300,01,051,0110,0,
+ /* 21204 */ 0250,0202,032,0300,01,051,0110,0,
+ /* 21212 */ 0250,0202,02,0300,01,060,0101,0,
+ /* 21220 */ 0250,0202,06,0300,01,060,0101,0,
+ /* 21228 */ 0250,0202,012,0300,01,060,0101,0,
+ /* 21236 */ 0250,0202,02,0314,01,060,0101,0,
+ /* 21244 */ 0250,0202,06,0314,01,060,0101,0,
+ /* 21252 */ 0250,0202,012,0314,01,060,0101,0,
+ /* 21260 */ 0250,0202,041,0315,01,061,0110,0,
+ /* 21268 */ 0250,0202,045,0315,01,061,0110,0,
+ /* 21276 */ 0250,0202,051,0315,01,061,0110,0,
+ /* 21284 */ 0250,0202,041,0316,01,062,0110,0,
+ /* 21292 */ 0250,0202,045,0316,01,062,0110,0,
+ /* 21300 */ 0250,0202,051,0316,01,062,0110,0,
+ /* 21308 */ 0250,0202,041,0314,01,060,0110,0,
+ /* 21316 */ 0250,0202,045,0314,01,060,0110,0,
+ /* 21324 */ 0250,0202,051,0314,01,060,0110,0,
+ /* 21332 */ 0250,0202,01,0314,01,065,0110,0,
+ /* 21340 */ 0250,0202,05,0314,01,065,0110,0,
+ /* 21348 */ 0250,0202,011,0314,01,065,0110,0,
+ /* 21356 */ 0250,0202,041,0314,01,063,0110,0,
+ /* 21364 */ 0250,0202,045,0314,01,063,0110,0,
+ /* 21372 */ 0250,0202,051,0314,01,063,0110,0,
+ /* 21380 */ 0250,0202,041,0315,01,064,0110,0,
+ /* 21388 */ 0250,0202,045,0315,01,064,0110,0,
+ /* 21396 */ 0250,0202,051,0315,01,064,0110,0,
+ /* 21404 */ 0241,0202,021,0301,01,050,0120,0,
+ /* 21412 */ 0240,0202,021,0301,01,050,0110,0,
+ /* 21420 */ 0241,0202,025,0301,01,050,0120,0,
+ /* 21428 */ 0240,0202,025,0301,01,050,0110,0,
+ /* 21436 */ 0241,0202,031,0301,01,050,0120,0,
+ /* 21444 */ 0240,0202,031,0301,01,050,0110,0,
+ /* 21452 */ 0241,0202,041,0303,01,013,0120,0,
+ /* 21460 */ 0240,0202,041,0303,01,013,0110,0,
+ /* 21468 */ 0241,0202,045,0303,01,013,0120,0,
+ /* 21476 */ 0240,0202,045,0303,01,013,0110,0,
+ /* 21484 */ 0241,0202,051,0303,01,013,0120,0,
+ /* 21492 */ 0240,0202,051,0303,01,013,0110,0,
+ /* 21500 */ 0241,0201,041,0303,01,0344,0120,0,
+ /* 21508 */ 0240,0201,041,0303,01,0344,0110,0,
+ /* 21516 */ 0241,0201,045,0303,01,0344,0120,0,
+ /* 21524 */ 0240,0201,045,0303,01,0344,0110,0,
+ /* 21532 */ 0241,0201,051,0303,01,0344,0120,0,
+ /* 21540 */ 0240,0201,051,0303,01,0344,0110,0,
+ /* 21548 */ 0241,0201,041,0303,01,0345,0120,0,
+ /* 21556 */ 0240,0201,041,0303,01,0345,0110,0,
+ /* 21564 */ 0241,0201,045,0303,01,0345,0120,0,
+ /* 21572 */ 0240,0201,045,0303,01,0345,0110,0,
+ /* 21580 */ 0241,0201,051,0303,01,0345,0120,0,
+ /* 21588 */ 0240,0201,051,0303,01,0345,0110,0,
+ /* 21596 */ 0241,0202,01,0301,01,0100,0120,0,
+ /* 21604 */ 0240,0202,01,0301,01,0100,0110,0,
+ /* 21612 */ 0241,0202,05,0301,01,0100,0120,0,
+ /* 21620 */ 0240,0202,05,0301,01,0100,0110,0,
+ /* 21628 */ 0241,0202,011,0301,01,0100,0120,0,
+ /* 21636 */ 0240,0202,011,0301,01,0100,0110,0,
+ /* 21644 */ 0241,0202,021,0301,01,0100,0120,0,
+ /* 21652 */ 0240,0202,021,0301,01,0100,0110,0,
+ /* 21660 */ 0241,0202,025,0301,01,0100,0120,0,
+ /* 21668 */ 0240,0202,025,0301,01,0100,0110,0,
+ /* 21676 */ 0241,0202,031,0301,01,0100,0120,0,
+ /* 21684 */ 0240,0202,031,0301,01,0100,0110,0,
+ /* 21692 */ 0241,0201,041,0303,01,0325,0120,0,
+ /* 21700 */ 0240,0201,041,0303,01,0325,0110,0,
+ /* 21708 */ 0241,0201,045,0303,01,0325,0120,0,
+ /* 21716 */ 0240,0201,045,0303,01,0325,0110,0,
+ /* 21724 */ 0241,0201,051,0303,01,0325,0120,0,
+ /* 21732 */ 0240,0201,051,0303,01,0325,0110,0,
+ /* 21740 */ 0241,0202,021,0301,01,0203,0120,0,
+ /* 21748 */ 0240,0202,021,0301,01,0203,0110,0,
+ /* 21756 */ 0241,0202,025,0301,01,0203,0120,0,
+ /* 21764 */ 0240,0202,025,0301,01,0203,0110,0,
+ /* 21772 */ 0241,0202,031,0301,01,0203,0120,0,
+ /* 21780 */ 0240,0202,031,0301,01,0203,0110,0,
+ /* 21788 */ 0241,0201,021,0301,01,0364,0120,0,
+ /* 21796 */ 0240,0201,021,0301,01,0364,0110,0,
+ /* 21804 */ 0241,0201,025,0301,01,0364,0120,0,
+ /* 21812 */ 0240,0201,025,0301,01,0364,0110,0,
+ /* 21820 */ 0241,0201,031,0301,01,0364,0120,0,
+ /* 21828 */ 0240,0201,031,0301,01,0364,0110,0,
+ /* 21836 */ 0241,0201,01,0301,01,0353,0120,0,
+ /* 21844 */ 0240,0201,01,0301,01,0353,0110,0,
+ /* 21852 */ 0241,0201,05,0301,01,0353,0120,0,
+ /* 21860 */ 0240,0201,05,0301,01,0353,0110,0,
+ /* 21868 */ 0241,0201,011,0301,01,0353,0120,0,
+ /* 21876 */ 0240,0201,011,0301,01,0353,0110,0,
+ /* 21884 */ 0241,0201,021,0301,01,0353,0120,0,
+ /* 21892 */ 0240,0201,021,0301,01,0353,0110,0,
+ /* 21900 */ 0241,0201,025,0301,01,0353,0120,0,
+ /* 21908 */ 0240,0201,025,0301,01,0353,0110,0,
+ /* 21916 */ 0241,0201,031,0301,01,0353,0120,0,
+ /* 21924 */ 0240,0201,031,0301,01,0353,0110,0,
+ /* 21932 */ 0241,0202,01,0301,01,025,0120,0,
+ /* 21940 */ 0240,0202,01,0301,01,025,0110,0,
+ /* 21948 */ 0241,0202,05,0301,01,025,0120,0,
+ /* 21956 */ 0240,0202,05,0301,01,025,0110,0,
+ /* 21964 */ 0241,0202,011,0301,01,025,0120,0,
+ /* 21972 */ 0240,0202,011,0301,01,025,0110,0,
+ /* 21980 */ 0241,0202,021,0301,01,025,0120,0,
+ /* 21988 */ 0240,0202,021,0301,01,025,0110,0,
+ /* 21996 */ 0241,0202,025,0301,01,025,0120,0,
+ /* 22004 */ 0240,0202,025,0301,01,025,0110,0,
+ /* 22012 */ 0241,0202,031,0301,01,025,0120,0,
+ /* 22020 */ 0240,0202,031,0301,01,025,0110,0,
+ /* 22028 */ 0241,0202,01,0301,01,024,0120,0,
+ /* 22036 */ 0240,0202,01,0301,01,024,0110,0,
+ /* 22044 */ 0241,0202,05,0301,01,024,0120,0,
+ /* 22052 */ 0240,0202,05,0301,01,024,0110,0,
+ /* 22060 */ 0241,0202,011,0301,01,024,0120,0,
+ /* 22068 */ 0240,0202,011,0301,01,024,0110,0,
+ /* 22076 */ 0241,0202,021,0301,01,024,0120,0,
+ /* 22084 */ 0240,0202,021,0301,01,024,0110,0,
+ /* 22092 */ 0241,0202,025,0301,01,024,0120,0,
+ /* 22100 */ 0240,0202,025,0301,01,024,0110,0,
+ /* 22108 */ 0241,0202,031,0301,01,024,0120,0,
+ /* 22116 */ 0240,0202,031,0301,01,024,0110,0,
+ /* 22124 */ 0241,0201,041,0303,01,0366,0120,0,
+ /* 22132 */ 0240,0201,041,0303,01,0366,0110,0,
+ /* 22140 */ 0241,0201,045,0303,01,0366,0120,0,
+ /* 22148 */ 0240,0201,045,0303,01,0366,0110,0,
+ /* 22156 */ 0241,0201,051,0303,01,0366,0120,0,
+ /* 22164 */ 0240,0201,051,0303,01,0366,0110,0,
+ /* 22172 */ 0241,0202,041,0303,01,0,0120,0,
+ /* 22180 */ 0240,0202,041,0303,01,0,0110,0,
+ /* 22188 */ 0241,0202,045,0303,01,0,0120,0,
+ /* 22196 */ 0240,0202,045,0303,01,0,0110,0,
+ /* 22204 */ 0241,0202,051,0303,01,0,0120,0,
+ /* 22212 */ 0240,0202,051,0303,01,0,0110,0,
+ /* 22220 */ 0241,0201,01,0317,01,0362,0120,0,
+ /* 22228 */ 0240,0201,01,0317,01,0362,0110,0,
+ /* 22236 */ 0241,0201,05,0317,01,0362,0120,0,
+ /* 22244 */ 0240,0201,05,0317,01,0362,0110,0,
+ /* 22252 */ 0241,0201,011,0317,01,0362,0120,0,
+ /* 22260 */ 0240,0201,011,0317,01,0362,0110,0,
+ /* 22268 */ 0241,0201,021,0317,01,0363,0120,0,
+ /* 22276 */ 0240,0201,021,0317,01,0363,0110,0,
+ /* 22284 */ 0241,0201,025,0317,01,0363,0120,0,
+ /* 22292 */ 0240,0201,025,0317,01,0363,0110,0,
+ /* 22300 */ 0241,0201,031,0317,01,0363,0120,0,
+ /* 22308 */ 0240,0201,031,0317,01,0363,0110,0,
+ /* 22316 */ 0241,0202,01,0301,01,0107,0120,0,
+ /* 22324 */ 0240,0202,01,0301,01,0107,0110,0,
+ /* 22332 */ 0241,0202,05,0301,01,0107,0120,0,
+ /* 22340 */ 0240,0202,05,0301,01,0107,0110,0,
+ /* 22348 */ 0241,0202,011,0301,01,0107,0120,0,
+ /* 22356 */ 0240,0202,011,0301,01,0107,0110,0,
+ /* 22364 */ 0241,0202,021,0301,01,0107,0120,0,
+ /* 22372 */ 0240,0202,021,0301,01,0107,0110,0,
+ /* 22380 */ 0241,0202,025,0301,01,0107,0120,0,
+ /* 22388 */ 0240,0202,025,0301,01,0107,0110,0,
+ /* 22396 */ 0241,0202,031,0301,01,0107,0120,0,
+ /* 22404 */ 0240,0202,031,0301,01,0107,0110,0,
+ /* 22412 */ 0241,0202,021,0303,01,022,0120,0,
+ /* 22420 */ 0240,0202,021,0303,01,022,0110,0,
+ /* 22428 */ 0241,0202,025,0303,01,022,0120,0,
+ /* 22436 */ 0240,0202,025,0303,01,022,0110,0,
+ /* 22444 */ 0241,0202,031,0303,01,022,0120,0,
+ /* 22452 */ 0240,0202,031,0303,01,022,0110,0,
+ /* 22460 */ 0241,0201,041,0317,01,0361,0120,0,
+ /* 22468 */ 0240,0201,041,0317,01,0361,0110,0,
+ /* 22476 */ 0241,0201,045,0317,01,0361,0120,0,
+ /* 22484 */ 0240,0201,045,0317,01,0361,0110,0,
+ /* 22492 */ 0241,0201,051,0317,01,0361,0120,0,
+ /* 22500 */ 0240,0201,051,0317,01,0361,0110,0,
+ /* 22508 */ 0241,0201,01,0317,01,0342,0120,0,
+ /* 22516 */ 0240,0201,01,0317,01,0342,0110,0,
+ /* 22524 */ 0241,0201,05,0317,01,0342,0120,0,
+ /* 22532 */ 0240,0201,05,0317,01,0342,0110,0,
+ /* 22540 */ 0241,0201,011,0317,01,0342,0120,0,
+ /* 22548 */ 0240,0201,011,0317,01,0342,0110,0,
+ /* 22556 */ 0241,0201,021,0317,01,0342,0120,0,
+ /* 22564 */ 0240,0201,021,0317,01,0342,0110,0,
+ /* 22572 */ 0241,0201,025,0317,01,0342,0120,0,
+ /* 22580 */ 0240,0201,025,0317,01,0342,0110,0,
+ /* 22588 */ 0241,0201,031,0317,01,0342,0120,0,
+ /* 22596 */ 0240,0201,031,0317,01,0342,0110,0,
+ /* 22604 */ 0241,0202,01,0301,01,0106,0120,0,
+ /* 22612 */ 0240,0202,01,0301,01,0106,0110,0,
+ /* 22620 */ 0241,0202,05,0301,01,0106,0120,0,
+ /* 22628 */ 0240,0202,05,0301,01,0106,0110,0,
+ /* 22636 */ 0241,0202,011,0301,01,0106,0120,0,
+ /* 22644 */ 0240,0202,011,0301,01,0106,0110,0,
+ /* 22652 */ 0241,0202,021,0301,01,0106,0120,0,
+ /* 22660 */ 0240,0202,021,0301,01,0106,0110,0,
+ /* 22668 */ 0241,0202,025,0301,01,0106,0120,0,
+ /* 22676 */ 0240,0202,025,0301,01,0106,0110,0,
+ /* 22684 */ 0241,0202,031,0301,01,0106,0120,0,
+ /* 22692 */ 0240,0202,031,0301,01,0106,0110,0,
+ /* 22700 */ 0241,0202,021,0303,01,021,0120,0,
+ /* 22708 */ 0240,0202,021,0303,01,021,0110,0,
+ /* 22716 */ 0241,0202,025,0303,01,021,0120,0,
+ /* 22724 */ 0240,0202,025,0303,01,021,0110,0,
+ /* 22732 */ 0241,0202,031,0303,01,021,0120,0,
+ /* 22740 */ 0240,0202,031,0303,01,021,0110,0,
+ /* 22748 */ 0241,0201,041,0317,01,0341,0120,0,
+ /* 22756 */ 0240,0201,041,0317,01,0341,0110,0,
+ /* 22764 */ 0241,0201,045,0317,01,0341,0120,0,
+ /* 22772 */ 0240,0201,045,0317,01,0341,0110,0,
+ /* 22780 */ 0241,0201,051,0317,01,0341,0120,0,
+ /* 22788 */ 0240,0201,051,0317,01,0341,0110,0,
+ /* 22796 */ 0241,0201,01,0317,01,0322,0120,0,
+ /* 22804 */ 0240,0201,01,0317,01,0322,0110,0,
+ /* 22812 */ 0241,0201,05,0317,01,0322,0120,0,
+ /* 22820 */ 0240,0201,05,0317,01,0322,0110,0,
+ /* 22828 */ 0241,0201,011,0317,01,0322,0120,0,
+ /* 22836 */ 0240,0201,011,0317,01,0322,0110,0,
+ /* 22844 */ 0241,0201,021,0317,01,0323,0120,0,
+ /* 22852 */ 0240,0201,021,0317,01,0323,0110,0,
+ /* 22860 */ 0241,0201,025,0317,01,0323,0120,0,
+ /* 22868 */ 0240,0201,025,0317,01,0323,0110,0,
+ /* 22876 */ 0241,0201,031,0317,01,0323,0120,0,
+ /* 22884 */ 0240,0201,031,0317,01,0323,0110,0,
+ /* 22892 */ 0241,0202,01,0301,01,0105,0120,0,
+ /* 22900 */ 0240,0202,01,0301,01,0105,0110,0,
+ /* 22908 */ 0241,0202,05,0301,01,0105,0120,0,
+ /* 22916 */ 0240,0202,05,0301,01,0105,0110,0,
+ /* 22924 */ 0241,0202,011,0301,01,0105,0120,0,
+ /* 22932 */ 0240,0202,011,0301,01,0105,0110,0,
+ /* 22940 */ 0241,0202,021,0301,01,0105,0120,0,
+ /* 22948 */ 0240,0202,021,0301,01,0105,0110,0,
+ /* 22956 */ 0241,0202,025,0301,01,0105,0120,0,
+ /* 22964 */ 0240,0202,025,0301,01,0105,0110,0,
+ /* 22972 */ 0241,0202,031,0301,01,0105,0120,0,
+ /* 22980 */ 0240,0202,031,0301,01,0105,0110,0,
+ /* 22988 */ 0241,0202,021,0303,01,020,0120,0,
+ /* 22996 */ 0240,0202,021,0303,01,020,0110,0,
+ /* 23004 */ 0241,0202,025,0303,01,020,0120,0,
+ /* 23012 */ 0240,0202,025,0303,01,020,0110,0,
+ /* 23020 */ 0241,0202,031,0303,01,020,0120,0,
+ /* 23028 */ 0240,0202,031,0303,01,020,0110,0,
+ /* 23036 */ 0241,0201,041,0317,01,0321,0120,0,
+ /* 23044 */ 0240,0201,041,0317,01,0321,0110,0,
+ /* 23052 */ 0241,0201,045,0317,01,0321,0120,0,
+ /* 23060 */ 0240,0201,045,0317,01,0321,0110,0,
+ /* 23068 */ 0241,0201,051,0317,01,0321,0120,0,
+ /* 23076 */ 0240,0201,051,0317,01,0321,0110,0,
+ /* 23084 */ 0241,0201,041,0303,01,0370,0120,0,
+ /* 23092 */ 0240,0201,041,0303,01,0370,0110,0,
+ /* 23100 */ 0241,0201,045,0303,01,0370,0120,0,
+ /* 23108 */ 0240,0201,045,0303,01,0370,0110,0,
+ /* 23116 */ 0241,0201,051,0303,01,0370,0120,0,
+ /* 23124 */ 0240,0201,051,0303,01,0370,0110,0,
+ /* 23132 */ 0241,0201,01,0301,01,0372,0120,0,
+ /* 23140 */ 0240,0201,01,0301,01,0372,0110,0,
+ /* 23148 */ 0241,0201,05,0301,01,0372,0120,0,
+ /* 23156 */ 0240,0201,05,0301,01,0372,0110,0,
+ /* 23164 */ 0241,0201,011,0301,01,0372,0120,0,
+ /* 23172 */ 0240,0201,011,0301,01,0372,0110,0,
+ /* 23180 */ 0241,0201,021,0301,01,0373,0120,0,
+ /* 23188 */ 0240,0201,021,0301,01,0373,0110,0,
+ /* 23196 */ 0241,0201,025,0301,01,0373,0120,0,
+ /* 23204 */ 0240,0201,025,0301,01,0373,0110,0,
+ /* 23212 */ 0241,0201,031,0301,01,0373,0120,0,
+ /* 23220 */ 0240,0201,031,0301,01,0373,0110,0,
+ /* 23228 */ 0241,0201,041,0303,01,0350,0120,0,
+ /* 23236 */ 0240,0201,041,0303,01,0350,0110,0,
+ /* 23244 */ 0241,0201,045,0303,01,0350,0120,0,
+ /* 23252 */ 0240,0201,045,0303,01,0350,0110,0,
+ /* 23260 */ 0241,0201,051,0303,01,0350,0120,0,
+ /* 23268 */ 0240,0201,051,0303,01,0350,0110,0,
+ /* 23276 */ 0241,0201,041,0303,01,0351,0120,0,
+ /* 23284 */ 0240,0201,041,0303,01,0351,0110,0,
+ /* 23292 */ 0241,0201,045,0303,01,0351,0120,0,
+ /* 23300 */ 0240,0201,045,0303,01,0351,0110,0,
+ /* 23308 */ 0241,0201,051,0303,01,0351,0120,0,
+ /* 23316 */ 0240,0201,051,0303,01,0351,0110,0,
+ /* 23324 */ 0241,0201,041,0303,01,0330,0120,0,
+ /* 23332 */ 0240,0201,041,0303,01,0330,0110,0,
+ /* 23340 */ 0241,0201,045,0303,01,0330,0120,0,
+ /* 23348 */ 0240,0201,045,0303,01,0330,0110,0,
+ /* 23356 */ 0241,0201,051,0303,01,0330,0120,0,
+ /* 23364 */ 0240,0201,051,0303,01,0330,0110,0,
+ /* 23372 */ 0241,0201,041,0303,01,0331,0120,0,
+ /* 23380 */ 0240,0201,041,0303,01,0331,0110,0,
+ /* 23388 */ 0241,0201,045,0303,01,0331,0120,0,
+ /* 23396 */ 0240,0201,045,0303,01,0331,0110,0,
+ /* 23404 */ 0241,0201,051,0303,01,0331,0120,0,
+ /* 23412 */ 0240,0201,051,0303,01,0331,0110,0,
+ /* 23420 */ 0241,0201,041,0303,01,0371,0120,0,
+ /* 23428 */ 0240,0201,041,0303,01,0371,0110,0,
+ /* 23436 */ 0241,0201,045,0303,01,0371,0120,0,
+ /* 23444 */ 0240,0201,045,0303,01,0371,0110,0,
+ /* 23452 */ 0241,0201,051,0303,01,0371,0120,0,
+ /* 23460 */ 0240,0201,051,0303,01,0371,0110,0,
+ /* 23468 */ 0241,0202,01,0303,01,046,0120,0,
+ /* 23476 */ 0241,0202,05,0303,01,046,0120,0,
+ /* 23484 */ 0241,0202,011,0303,01,046,0120,0,
+ /* 23492 */ 0241,0202,01,0301,01,047,0120,0,
+ /* 23500 */ 0241,0202,05,0301,01,047,0120,0,
+ /* 23508 */ 0241,0202,011,0301,01,047,0120,0,
+ /* 23516 */ 0241,0202,021,0301,01,047,0120,0,
+ /* 23524 */ 0241,0202,025,0301,01,047,0120,0,
+ /* 23532 */ 0241,0202,031,0301,01,047,0120,0,
+ /* 23540 */ 0241,0202,021,0303,01,046,0120,0,
+ /* 23548 */ 0241,0202,025,0303,01,046,0120,0,
+ /* 23556 */ 0241,0202,031,0303,01,046,0120,0,
+ /* 23564 */ 0241,0202,02,0303,01,046,0120,0,
+ /* 23572 */ 0241,0202,06,0303,01,046,0120,0,
+ /* 23580 */ 0241,0202,012,0303,01,046,0120,0,
+ /* 23588 */ 0241,0202,02,0301,01,047,0120,0,
+ /* 23596 */ 0241,0202,06,0301,01,047,0120,0,
+ /* 23604 */ 0241,0202,012,0301,01,047,0120,0,
+ /* 23612 */ 0241,0202,022,0301,01,047,0120,0,
+ /* 23620 */ 0241,0202,026,0301,01,047,0120,0,
+ /* 23628 */ 0241,0202,032,0301,01,047,0120,0,
+ /* 23636 */ 0241,0202,022,0303,01,046,0120,0,
+ /* 23644 */ 0241,0202,026,0303,01,046,0120,0,
+ /* 23652 */ 0241,0202,032,0303,01,046,0120,0,
+ /* 23660 */ 0241,0201,041,0303,01,0150,0120,0,
+ /* 23668 */ 0240,0201,041,0303,01,0150,0110,0,
+ /* 23676 */ 0241,0201,045,0303,01,0150,0120,0,
+ /* 23684 */ 0240,0201,045,0303,01,0150,0110,0,
+ /* 23692 */ 0241,0201,051,0303,01,0150,0120,0,
+ /* 23700 */ 0240,0201,051,0303,01,0150,0110,0,
+ /* 23708 */ 0241,0201,01,0301,01,0152,0120,0,
+ /* 23716 */ 0240,0201,01,0301,01,0152,0110,0,
+ /* 23724 */ 0241,0201,05,0301,01,0152,0120,0,
+ /* 23732 */ 0240,0201,05,0301,01,0152,0110,0,
+ /* 23740 */ 0241,0201,011,0301,01,0152,0120,0,
+ /* 23748 */ 0240,0201,011,0301,01,0152,0110,0,
+ /* 23756 */ 0241,0201,021,0301,01,0155,0120,0,
+ /* 23764 */ 0240,0201,021,0301,01,0155,0110,0,
+ /* 23772 */ 0241,0201,025,0301,01,0155,0120,0,
+ /* 23780 */ 0240,0201,025,0301,01,0155,0110,0,
+ /* 23788 */ 0241,0201,031,0301,01,0155,0120,0,
+ /* 23796 */ 0240,0201,031,0301,01,0155,0110,0,
+ /* 23804 */ 0241,0201,041,0303,01,0151,0120,0,
+ /* 23812 */ 0240,0201,041,0303,01,0151,0110,0,
+ /* 23820 */ 0241,0201,045,0303,01,0151,0120,0,
+ /* 23828 */ 0240,0201,045,0303,01,0151,0110,0,
+ /* 23836 */ 0241,0201,051,0303,01,0151,0120,0,
+ /* 23844 */ 0240,0201,051,0303,01,0151,0110,0,
+ /* 23852 */ 0241,0201,041,0303,01,0140,0120,0,
+ /* 23860 */ 0240,0201,041,0303,01,0140,0110,0,
+ /* 23868 */ 0241,0201,045,0303,01,0140,0120,0,
+ /* 23876 */ 0240,0201,045,0303,01,0140,0110,0,
+ /* 23884 */ 0241,0201,051,0303,01,0140,0120,0,
+ /* 23892 */ 0240,0201,051,0303,01,0140,0110,0,
+ /* 23900 */ 0241,0201,01,0301,01,0142,0120,0,
+ /* 23908 */ 0240,0201,01,0301,01,0142,0110,0,
+ /* 23916 */ 0241,0201,05,0301,01,0142,0120,0,
+ /* 23924 */ 0240,0201,05,0301,01,0142,0110,0,
+ /* 23932 */ 0241,0201,011,0301,01,0142,0120,0,
+ /* 23940 */ 0240,0201,011,0301,01,0142,0110,0,
+ /* 23948 */ 0241,0201,021,0301,01,0154,0120,0,
+ /* 23956 */ 0240,0201,021,0301,01,0154,0110,0,
+ /* 23964 */ 0241,0201,025,0301,01,0154,0120,0,
+ /* 23972 */ 0240,0201,025,0301,01,0154,0110,0,
+ /* 23980 */ 0241,0201,031,0301,01,0154,0120,0,
+ /* 23988 */ 0240,0201,031,0301,01,0154,0110,0,
+ /* 23996 */ 0241,0201,041,0303,01,0141,0120,0,
+ /* 24004 */ 0240,0201,041,0303,01,0141,0110,0,
+ /* 24012 */ 0241,0201,045,0303,01,0141,0120,0,
+ /* 24020 */ 0240,0201,045,0303,01,0141,0110,0,
+ /* 24028 */ 0241,0201,051,0303,01,0141,0120,0,
+ /* 24036 */ 0240,0201,051,0303,01,0141,0110,0,
+ /* 24044 */ 0241,0201,01,0301,01,0357,0120,0,
+ /* 24052 */ 0240,0201,01,0301,01,0357,0110,0,
+ /* 24060 */ 0241,0201,05,0301,01,0357,0120,0,
+ /* 24068 */ 0240,0201,05,0301,01,0357,0110,0,
+ /* 24076 */ 0241,0201,011,0301,01,0357,0120,0,
+ /* 24084 */ 0240,0201,011,0301,01,0357,0110,0,
+ /* 24092 */ 0241,0201,021,0301,01,0357,0120,0,
+ /* 24100 */ 0240,0201,021,0301,01,0357,0110,0,
+ /* 24108 */ 0241,0201,025,0301,01,0357,0120,0,
+ /* 24116 */ 0240,0201,025,0301,01,0357,0110,0,
+ /* 24124 */ 0241,0201,031,0301,01,0357,0120,0,
+ /* 24132 */ 0240,0201,031,0301,01,0357,0110,0,
+ /* 24140 */ 0250,0202,021,0301,01,0114,0110,0,
+ /* 24148 */ 0250,0202,025,0301,01,0114,0110,0,
+ /* 24156 */ 0250,0202,031,0301,01,0114,0110,0,
+ /* 24164 */ 0250,0202,01,0301,01,0114,0110,0,
+ /* 24172 */ 0250,0202,05,0301,01,0114,0110,0,
+ /* 24180 */ 0250,0202,011,0301,01,0114,0110,0,
+ /* 24188 */ 0241,0202,021,0306,01,0115,0120,0,
+ /* 24196 */ 0240,0202,021,0306,01,0115,0110,0,
+ /* 24204 */ 0241,0202,01,0306,01,0115,0120,0,
+ /* 24212 */ 0240,0202,01,0306,01,0115,0110,0,
+ /* 24220 */ 0250,0202,031,0301,01,0312,0110,0,
+ /* 24228 */ 0250,0202,011,0301,01,0312,0110,0,
+ /* 24236 */ 0241,0202,021,0306,01,0313,0120,0,
+ /* 24244 */ 0240,0202,021,0306,01,0313,0110,0,
+ /* 24252 */ 0241,0202,01,0306,01,0313,0120,0,
+ /* 24260 */ 0240,0202,01,0306,01,0313,0110,0,
+ /* 24268 */ 0250,0202,021,0301,01,0116,0110,0,
+ /* 24276 */ 0250,0202,025,0301,01,0116,0110,0,
+ /* 24284 */ 0250,0202,031,0301,01,0116,0110,0,
+ /* 24292 */ 0250,0202,01,0301,01,0116,0110,0,
+ /* 24300 */ 0250,0202,05,0301,01,0116,0110,0,
+ /* 24308 */ 0250,0202,011,0301,01,0116,0110,0,
+ /* 24316 */ 0241,0202,021,0306,01,0117,0120,0,
+ /* 24324 */ 0240,0202,021,0306,01,0117,0110,0,
+ /* 24332 */ 0241,0202,01,0306,01,0117,0120,0,
+ /* 24340 */ 0240,0202,01,0306,01,0117,0110,0,
+ /* 24348 */ 0250,0202,031,0301,01,0314,0110,0,
+ /* 24356 */ 0250,0202,011,0301,01,0314,0110,0,
+ /* 24364 */ 0241,0202,021,0306,01,0315,0120,0,
+ /* 24372 */ 0240,0202,021,0306,01,0315,0110,0,
+ /* 24380 */ 0241,0202,01,0306,01,0315,0120,0,
+ /* 24388 */ 0240,0202,01,0306,01,0315,0110,0,
+ /* 24396 */ 0241,0202,021,0301,01,054,0120,0,
+ /* 24404 */ 0240,0202,021,0301,01,054,0110,0,
+ /* 24412 */ 0241,0202,025,0301,01,054,0120,0,
+ /* 24420 */ 0240,0202,025,0301,01,054,0110,0,
+ /* 24428 */ 0241,0202,031,0301,01,054,0120,0,
+ /* 24436 */ 0240,0202,031,0301,01,054,0110,0,
+ /* 24444 */ 0241,0202,01,0301,01,054,0120,0,
+ /* 24452 */ 0240,0202,01,0301,01,054,0110,0,
+ /* 24460 */ 0241,0202,05,0301,01,054,0120,0,
+ /* 24468 */ 0240,0202,05,0301,01,054,0110,0,
+ /* 24476 */ 0241,0202,011,0301,01,054,0120,0,
+ /* 24484 */ 0240,0202,011,0301,01,054,0110,0,
+ /* 24492 */ 0241,0202,021,0306,01,055,0120,0,
+ /* 24500 */ 0240,0202,021,0306,01,055,0110,0,
+ /* 24508 */ 0241,0202,01,0306,01,055,0120,0,
+ /* 24516 */ 0240,0202,01,0306,01,055,0110,0,
+ /* 24524 */ 0250,0201,021,0301,01,0121,0110,0,
+ /* 24532 */ 0250,0201,025,0301,01,0121,0110,0,
+ /* 24540 */ 0250,0201,031,0301,01,0121,0110,0,
+ /* 24548 */ 0250,0201,0,0301,01,0121,0110,0,
+ /* 24556 */ 0250,0201,04,0301,01,0121,0110,0,
+ /* 24564 */ 0250,0201,010,0301,01,0121,0110,0,
+ /* 24572 */ 0241,0201,023,0306,01,0121,0120,0,
+ /* 24580 */ 0240,0201,023,0306,01,0121,0110,0,
+ /* 24588 */ 0241,0201,02,0306,01,0121,0120,0,
+ /* 24596 */ 0240,0201,02,0306,01,0121,0110,0,
+ /* 24604 */ 0241,0201,021,0301,01,0134,0120,0,
+ /* 24612 */ 0240,0201,021,0301,01,0134,0110,0,
+ /* 24620 */ 0241,0201,025,0301,01,0134,0120,0,
+ /* 24628 */ 0240,0201,025,0301,01,0134,0110,0,
+ /* 24636 */ 0241,0201,031,0301,01,0134,0120,0,
+ /* 24644 */ 0240,0201,031,0301,01,0134,0110,0,
+ /* 24652 */ 0241,0201,0,0301,01,0134,0120,0,
+ /* 24660 */ 0240,0201,0,0301,01,0134,0110,0,
+ /* 24668 */ 0241,0201,04,0301,01,0134,0120,0,
+ /* 24676 */ 0240,0201,04,0301,01,0134,0110,0,
+ /* 24684 */ 0241,0201,010,0301,01,0134,0120,0,
+ /* 24692 */ 0240,0201,010,0301,01,0134,0110,0,
+ /* 24700 */ 0241,0201,023,0306,01,0134,0120,0,
+ /* 24708 */ 0240,0201,023,0306,01,0134,0110,0,
+ /* 24716 */ 0241,0201,02,0306,01,0134,0120,0,
+ /* 24724 */ 0240,0201,02,0306,01,0134,0110,0,
+ /* 24732 */ 0250,0201,021,0306,01,056,0110,0,
+ /* 24740 */ 0250,0201,0,0306,01,056,0110,0,
+ /* 24748 */ 0241,0201,021,0301,01,025,0120,0,
+ /* 24756 */ 0240,0201,021,0301,01,025,0110,0,
+ /* 24764 */ 0241,0201,025,0301,01,025,0120,0,
+ /* 24772 */ 0240,0201,025,0301,01,025,0110,0,
+ /* 24780 */ 0241,0201,031,0301,01,025,0120,0,
+ /* 24788 */ 0240,0201,031,0301,01,025,0110,0,
+ /* 24796 */ 0241,0201,0,0301,01,025,0120,0,
+ /* 24804 */ 0240,0201,0,0301,01,025,0110,0,
+ /* 24812 */ 0241,0201,04,0301,01,025,0120,0,
+ /* 24820 */ 0240,0201,04,0301,01,025,0110,0,
+ /* 24828 */ 0241,0201,010,0301,01,025,0120,0,
+ /* 24836 */ 0240,0201,010,0301,01,025,0110,0,
+ /* 24844 */ 0241,0201,021,0301,01,024,0120,0,
+ /* 24852 */ 0240,0201,021,0301,01,024,0110,0,
+ /* 24860 */ 0241,0201,025,0301,01,024,0120,0,
+ /* 24868 */ 0240,0201,025,0301,01,024,0110,0,
+ /* 24876 */ 0241,0201,031,0301,01,024,0120,0,
+ /* 24884 */ 0240,0201,031,0301,01,024,0110,0,
+ /* 24892 */ 0241,0201,0,0301,01,024,0120,0,
+ /* 24900 */ 0240,0201,0,0301,01,024,0110,0,
+ /* 24908 */ 0241,0201,04,0301,01,024,0120,0,
+ /* 24916 */ 0240,0201,04,0301,01,024,0110,0,
+ /* 24924 */ 0241,0201,010,0301,01,024,0120,0,
+ /* 24932 */ 0240,0201,010,0301,01,024,0110,0,
+ /* 24940 */ 0241,0201,021,0301,01,0127,0120,0,
+ /* 24948 */ 0240,0201,021,0301,01,0127,0110,0,
+ /* 24956 */ 0241,0201,025,0301,01,0127,0120,0,
+ /* 24964 */ 0240,0201,025,0301,01,0127,0110,0,
+ /* 24972 */ 0241,0201,031,0301,01,0127,0120,0,
+ /* 24980 */ 0240,0201,031,0301,01,0127,0110,0,
+ /* 24988 */ 0241,0201,0,0301,01,0127,0120,0,
+ /* 24996 */ 0240,0201,0,0301,01,0127,0110,0,
+ /* 25004 */ 0241,0201,04,0301,01,0127,0120,0,
+ /* 25012 */ 0240,0201,04,0301,01,0127,0110,0,
+ /* 25020 */ 0241,0201,010,0301,01,0127,0120,0,
+ /* 25028 */ 0240,0201,010,0301,01,0127,0110,0,
+ /* 25036 */ 0310,0361,03,017,070,0370,0110,0,
+ /* 25044 */ 0311,0361,03,017,070,0370,0110,0,
+ /* 25052 */ 0313,0361,03,017,070,0370,0110,0,
+ /* 25060 */ 0361,03,017,072,0317,0110,022,0,
+ /* 25068 */ 0261,03,021,01,0317,0120,023,0,
+ /* 25076 */ 0260,03,021,01,0317,0110,022,0,
+ /* 25084 */ 0261,03,025,01,0317,0120,023,0,
+ /* 25092 */ 0260,03,025,01,0317,0110,022,0,
+ /* 25100 */ 0361,03,017,072,0316,0110,022,0,
+ /* 25108 */ 0261,03,021,01,0316,0120,023,0,
+ /* 25116 */ 0260,03,021,01,0316,0110,022,0,
+ /* 25124 */ 0261,03,025,01,0316,0120,023,0,
+ /* 25132 */ 0260,03,025,01,0316,0110,022,0,
+ /* 25140 */ 0241,0202,01,0303,01,0317,0120,0,
+ /* 25148 */ 0240,0202,01,0303,01,0317,0110,0,
+ /* 25156 */ 0241,0202,05,0303,01,0317,0120,0,
+ /* 25164 */ 0240,0202,05,0303,01,0317,0110,0,
+ /* 25172 */ 0241,0202,011,0303,01,0317,0120,0,
+ /* 25180 */ 0240,0202,011,0303,01,0317,0110,0,
+ /* 25188 */ 0250,0202,01,0306,01,0143,0101,0,
+ /* 25196 */ 0250,0202,05,0306,01,0143,0101,0,
+ /* 25204 */ 0250,0202,011,0306,01,0143,0101,0,
+ /* 25212 */ 0250,0202,01,0300,01,0143,0101,0,
+ /* 25220 */ 0250,0202,05,0300,01,0143,0101,0,
+ /* 25228 */ 0250,0202,011,0300,01,0143,0101,0,
+ /* 25236 */ 0250,0202,021,0306,01,0143,0101,0,
+ /* 25244 */ 0250,0202,025,0306,01,0143,0101,0,
+ /* 25252 */ 0250,0202,031,0306,01,0143,0101,0,
+ /* 25260 */ 0250,0202,021,0300,01,0143,0101,0,
+ /* 25268 */ 0250,0202,025,0300,01,0143,0101,0,
+ /* 25276 */ 0250,0202,031,0300,01,0143,0101,0,
+ /* 25284 */ 0250,0202,01,0306,01,0142,0101,0,
+ /* 25292 */ 0250,0202,05,0306,01,0142,0101,0,
+ /* 25300 */ 0250,0202,011,0306,01,0142,0101,0,
+ /* 25308 */ 0250,0202,01,0300,01,0142,0101,0,
+ /* 25316 */ 0250,0202,05,0300,01,0142,0101,0,
+ /* 25324 */ 0250,0202,011,0300,01,0142,0101,0,
+ /* 25332 */ 0250,0202,021,0306,01,0142,0101,0,
+ /* 25340 */ 0250,0202,025,0306,01,0142,0101,0,
+ /* 25348 */ 0250,0202,031,0306,01,0142,0101,0,
+ /* 25356 */ 0250,0202,021,0300,01,0142,0101,0,
+ /* 25364 */ 0250,0202,025,0300,01,0142,0101,0,
+ /* 25372 */ 0250,0202,031,0300,01,0142,0101,0,
+ /* 25380 */ 0241,0202,01,0301,01,0120,0120,0,
+ /* 25388 */ 0240,0202,01,0301,01,0120,0110,0,
+ /* 25396 */ 0241,0202,05,0301,01,0120,0120,0,
+ /* 25404 */ 0240,0202,05,0301,01,0120,0110,0,
+ /* 25412 */ 0241,0202,011,0301,01,0120,0120,0,
+ /* 25420 */ 0240,0202,011,0301,01,0120,0110,0,
+ /* 25428 */ 0241,0202,01,0301,01,0121,0120,0,
+ /* 25436 */ 0240,0202,01,0301,01,0121,0110,0,
+ /* 25444 */ 0241,0202,05,0301,01,0121,0120,0,
+ /* 25452 */ 0240,0202,05,0301,01,0121,0110,0,
+ /* 25460 */ 0241,0202,011,0301,01,0121,0120,0,
+ /* 25468 */ 0240,0202,011,0301,01,0121,0110,0,
+ /* 25476 */ 0241,0202,01,0301,01,0122,0120,0,
+ /* 25484 */ 0240,0202,01,0301,01,0122,0110,0,
+ /* 25492 */ 0241,0202,05,0301,01,0122,0120,0,
+ /* 25500 */ 0240,0202,05,0301,01,0122,0110,0,
+ /* 25508 */ 0241,0202,011,0301,01,0122,0120,0,
+ /* 25516 */ 0240,0202,011,0301,01,0122,0110,0,
+ /* 25524 */ 0241,0202,01,0301,01,0123,0120,0,
+ /* 25532 */ 0240,0202,01,0301,01,0123,0110,0,
+ /* 25540 */ 0241,0202,05,0301,01,0123,0120,0,
+ /* 25548 */ 0240,0202,05,0301,01,0123,0110,0,
+ /* 25556 */ 0241,0202,011,0301,01,0123,0120,0,
+ /* 25564 */ 0240,0202,011,0301,01,0123,0110,0,
+ /* 25572 */ 0250,0202,01,0303,01,0124,0110,0,
+ /* 25580 */ 0250,0202,05,0303,01,0124,0110,0,
+ /* 25588 */ 0250,0202,011,0303,01,0124,0110,0,
+ /* 25596 */ 0250,0202,021,0303,01,0124,0110,0,
+ /* 25604 */ 0250,0202,025,0303,01,0124,0110,0,
+ /* 25612 */ 0250,0202,031,0303,01,0124,0110,0,
+ /* 25620 */ 0250,0202,01,0301,01,0125,0110,0,
+ /* 25628 */ 0250,0202,05,0301,01,0125,0110,0,
+ /* 25636 */ 0250,0202,011,0301,01,0125,0110,0,
+ /* 25644 */ 0250,0202,021,0301,01,0125,0110,0,
+ /* 25652 */ 0250,0202,025,0301,01,0125,0110,0,
+ /* 25660 */ 0250,0202,031,0301,01,0125,0110,0,
+ /* 25668 */ 0241,0202,01,0303,01,0217,0120,0,
+ /* 25676 */ 0241,0202,05,0303,01,0217,0120,0,
+ /* 25684 */ 0241,0202,011,0303,01,0217,0120,0,
+ /* 25692 */ 0241,0202,013,0317,01,0232,0120,0,
+ /* 25700 */ 0241,0202,013,0317,01,0252,0120,0,
+ /* 25708 */ 0241,0202,03,0317,01,0233,0120,0,
+ /* 25716 */ 0241,0202,03,0317,01,0253,0120,0,
+ /* 25724 */ 0241,0202,013,0317,01,0123,0120,0,
+ /* 25732 */ 0241,0202,013,0317,01,0122,0120,0,
+ /* 25740 */ 0273,0320,01,0203,0202,0275,0,
+ /* 25747 */ 0273,0321,01,0203,0202,0275,0,
+ /* 25754 */ 0273,0324,01,0203,0202,0275,0,
+ /* 25761 */ 0273,0320,01,0201,0202,031,0,
+ /* 25768 */ 0273,0321,01,0201,0202,041,0,
+ /* 25775 */ 0273,0324,01,0201,0202,0255,0,
+ /* 25782 */ 0273,0320,01,0203,0200,0275,0,
+ /* 25789 */ 0273,0321,01,0203,0200,0275,0,
+ /* 25796 */ 0273,0324,01,0203,0200,0275,0,
+ /* 25803 */ 0273,0320,01,0201,0200,031,0,
+ /* 25810 */ 0273,0321,01,0201,0200,041,0,
+ /* 25817 */ 0273,0324,01,0201,0200,0255,0,
+ /* 25824 */ 0273,0320,01,0203,0204,0275,0,
+ /* 25831 */ 0273,0321,01,0203,0204,0275,0,
+ /* 25838 */ 0273,0324,01,0203,0204,0275,0,
+ /* 25845 */ 0273,0320,01,0201,0204,031,0,
+ /* 25852 */ 0273,0321,01,0201,0204,041,0,
+ /* 25859 */ 0273,0324,01,0201,0204,0255,0,
+ /* 25866 */ 0320,0326,02,017,0274,0110,0,
+ /* 25873 */ 0321,0326,02,017,0274,0110,0,
+ /* 25880 */ 0324,0326,02,017,0274,0110,0,
+ /* 25887 */ 0320,0326,02,017,0275,0110,0,
+ /* 25894 */ 0321,0326,02,017,0275,0110,0,
+ /* 25901 */ 0324,0326,02,017,0275,0110,0,
+ /* 25908 */ 0320,02,017,0272,0204,025,0,
+ /* 25915 */ 0321,02,017,0272,0204,025,0,
+ /* 25922 */ 0324,02,017,0272,0204,025,0,
+ /* 25929 */ 0273,0320,02,017,0273,0101,0,
+ /* 25936 */ 0273,0321,02,017,0273,0101,0,
+ /* 25943 */ 0273,0324,02,017,0273,0101,0,
+ /* 25950 */ 0273,0320,02,017,0263,0101,0,
+ /* 25957 */ 0273,0321,02,017,0263,0101,0,
+ /* 25964 */ 0273,0324,02,017,0263,0101,0,
+ /* 25971 */ 0273,0320,02,017,0253,0101,0,
+ /* 25978 */ 0273,0321,02,017,0253,0101,0,
+ /* 25985 */ 0273,0324,02,017,0253,0101,0,
+ /* 25992 */ 0273,0320,02,017,0261,0101,0,
+ /* 25999 */ 0273,0321,02,017,0261,0101,0,
+ /* 26006 */ 0273,0324,02,017,0261,0101,0,
+ /* 26013 */ 0273,0317,02,017,0307,0201,0,
+ /* 26020 */ 0361,03,017,070,0202,0110,0,
+ /* 26027 */ 0323,0313,03,017,01,0337,0,
+ /* 26034 */ 0320,0323,02,017,02,0110,0,
+ /* 26041 */ 0321,0323,02,017,02,0110,0,
+ /* 26048 */ 0320,0323,02,017,03,0110,0,
+ /* 26055 */ 0321,0323,02,017,03,0110,0,
+ /* 26062 */ 0271,0320,01,0307,0200,031,0,
+ /* 26069 */ 0271,0321,01,0307,0200,041,0,
+ /* 26076 */ 0271,0324,01,0307,0200,0255,0,
+ /* 26083 */ 0360,0324,02,017,0156,0110,0,
+ /* 26090 */ 0360,0324,02,017,0176,0101,0,
+ /* 26097 */ 0273,0320,01,0203,0201,0275,0,
+ /* 26104 */ 0273,0321,01,0203,0201,0275,0,
+ /* 26111 */ 0273,0324,01,0203,0201,0275,0,
+ /* 26118 */ 0273,0320,01,0201,0201,031,0,
+ /* 26125 */ 0273,0321,01,0201,0201,041,0,
+ /* 26132 */ 0273,0324,01,0201,0201,0255,0,
+ /* 26139 */ 0360,0323,02,017,0153,0110,0,
+ /* 26146 */ 0360,0323,02,017,0143,0110,0,
+ /* 26153 */ 0360,0323,02,017,0147,0110,0,
+ /* 26160 */ 0360,0323,02,017,0374,0110,0,
+ /* 26167 */ 0360,0323,02,017,0376,0110,0,
+ /* 26174 */ 0360,0323,02,017,0354,0110,0,
+ /* 26181 */ 0360,0323,02,017,0355,0110,0,
+ /* 26188 */ 0360,0323,02,017,0334,0110,0,
+ /* 26195 */ 0360,0323,02,017,0335,0110,0,
+ /* 26202 */ 0360,0323,02,017,0375,0110,0,
+ /* 26209 */ 0360,0323,02,017,0333,0110,0,
+ /* 26216 */ 0360,0323,02,017,0337,0110,0,
+ /* 26223 */ 0360,0323,02,017,0164,0110,0,
+ /* 26230 */ 0360,0323,02,017,0166,0110,0,
+ /* 26237 */ 0360,0323,02,017,0165,0110,0,
+ /* 26244 */ 0360,0323,02,017,0144,0110,0,
+ /* 26251 */ 0360,0323,02,017,0146,0110,0,
+ /* 26258 */ 0360,0323,02,017,0145,0110,0,
+ /* 26265 */ 0360,0323,02,017,0365,0110,0,
+ /* 26272 */ 0360,0323,02,017,0345,0110,0,
+ /* 26279 */ 0360,0323,02,017,0325,0110,0,
+ /* 26286 */ 0360,0323,02,017,0353,0110,0,
+ /* 26293 */ 0360,0323,02,017,0362,0110,0,
+ /* 26300 */ 0360,02,017,0162,0206,025,0,
+ /* 26307 */ 0360,0323,02,017,0363,0110,0,
+ /* 26314 */ 0360,02,017,0163,0206,025,0,
+ /* 26321 */ 0360,0323,02,017,0361,0110,0,
+ /* 26328 */ 0360,02,017,0161,0206,025,0,
+ /* 26335 */ 0360,0323,02,017,0342,0110,0,
+ /* 26342 */ 0360,02,017,0162,0204,025,0,
+ /* 26349 */ 0360,0323,02,017,0341,0110,0,
+ /* 26356 */ 0360,02,017,0161,0204,025,0,
+ /* 26363 */ 0360,0323,02,017,0322,0110,0,
+ /* 26370 */ 0360,02,017,0162,0202,025,0,
+ /* 26377 */ 0360,0323,02,017,0323,0110,0,
+ /* 26384 */ 0360,02,017,0163,0202,025,0,
+ /* 26391 */ 0360,0323,02,017,0321,0110,0,
+ /* 26398 */ 0360,02,017,0161,0202,025,0,
+ /* 26405 */ 0360,0323,02,017,0370,0110,0,
+ /* 26412 */ 0360,0323,02,017,0372,0110,0,
+ /* 26419 */ 0360,0323,02,017,0350,0110,0,
+ /* 26426 */ 0360,0323,02,017,0351,0110,0,
+ /* 26433 */ 0360,0323,02,017,0330,0110,0,
+ /* 26440 */ 0360,0323,02,017,0331,0110,0,
+ /* 26447 */ 0360,0323,02,017,0371,0110,0,
+ /* 26454 */ 0360,0323,02,017,0150,0110,0,
+ /* 26461 */ 0360,0323,02,017,0152,0110,0,
+ /* 26468 */ 0360,0323,02,017,0151,0110,0,
+ /* 26475 */ 0360,0323,02,017,0140,0110,0,
+ /* 26482 */ 0360,0323,02,017,0142,0110,0,
+ /* 26489 */ 0360,0323,02,017,0141,0110,0,
+ /* 26496 */ 0360,0323,02,017,0357,0110,0,
+ /* 26503 */ 0273,0320,01,0203,0203,0275,0,
+ /* 26510 */ 0273,0321,01,0203,0203,0275,0,
+ /* 26517 */ 0273,0324,01,0203,0203,0275,0,
+ /* 26524 */ 0273,0320,01,0201,0203,031,0,
+ /* 26531 */ 0273,0321,01,0201,0203,041,0,
+ /* 26538 */ 0273,0324,01,0201,0203,0255,0,
+ /* 26545 */ 0320,02,017,0244,0101,026,0,
+ /* 26552 */ 0321,02,017,0244,0101,026,0,
+ /* 26559 */ 0324,02,017,0244,0101,026,0,
+ /* 26566 */ 0320,02,017,0254,0101,026,0,
+ /* 26573 */ 0321,02,017,0254,0101,026,0,
+ /* 26580 */ 0324,02,017,0254,0101,026,0,
+ /* 26587 */ 0273,0320,01,0203,0205,0275,0,
+ /* 26594 */ 0273,0321,01,0203,0205,0275,0,
+ /* 26601 */ 0273,0324,01,0203,0205,0275,0,
+ /* 26608 */ 0273,0320,01,0201,0205,031,0,
+ /* 26615 */ 0273,0321,01,0201,0205,041,0,
+ /* 26622 */ 0273,0324,01,0201,0205,0255,0,
+ /* 26629 */ 0360,0320,02,017,021,0101,0,
+ /* 26636 */ 0360,0321,02,017,021,0101,0,
+ /* 26643 */ 0360,0320,02,017,023,0110,0,
+ /* 26650 */ 0360,0321,02,017,023,0110,0,
+ /* 26657 */ 0273,0320,02,017,0301,0101,0,
+ /* 26664 */ 0273,0321,02,017,0301,0101,0,
+ /* 26671 */ 0273,0324,02,017,0301,0101,0,
+ /* 26678 */ 0273,0320,01,0203,0206,0275,0,
+ /* 26685 */ 0273,0321,01,0203,0206,0275,0,
+ /* 26692 */ 0273,0324,01,0203,0206,0275,0,
+ /* 26699 */ 0273,0320,01,0201,0206,031,0,
+ /* 26706 */ 0273,0321,01,0201,0206,041,0,
+ /* 26713 */ 0273,0324,01,0201,0206,0255,0,
+ /* 26720 */ 0320,01,017,0330,0100,0110,0,
+ /* 26727 */ 0321,01,017,0330,0100,0110,0,
+ /* 26734 */ 0324,01,017,0330,0100,0110,0,
+ /* 26741 */ 0322,01,017,0330,0200,064,0,
+ /* 26748 */ 0320,01,017,0330,0200,064,0,
+ /* 26755 */ 0321,01,017,0330,0200,064,0,
+ /* 26762 */ 0323,01,017,0330,0200,064,0,
+ /* 26769 */ 0330,0161,0373,01,0351,064,0,
+ /* 26776 */ 0360,02,017,0302,0110,026,0,
+ /* 26783 */ 0333,02,017,0302,0110,026,0,
+ /* 26790 */ 0324,0333,02,017,052,0110,0,
+ /* 26797 */ 0324,0333,02,017,055,0110,0,
+ /* 26804 */ 0324,0333,02,017,054,0110,0,
+ /* 26811 */ 0360,0324,02,017,0120,0110,0,
+ /* 26818 */ 0360,02,017,0306,0110,026,0,
+ /* 26825 */ 0324,0360,02,017,0256,0201,0,
+ /* 26832 */ 0324,0360,02,017,0256,0200,0,
+ /* 26839 */ 0324,0360,02,017,0256,0204,0,
+ /* 26846 */ 0324,0360,02,017,0307,0204,0,
+ /* 26853 */ 0324,0360,02,017,0256,0206,0,
+ /* 26860 */ 0324,0360,02,017,0307,0205,0,
+ /* 26867 */ 0324,0360,02,017,0256,0205,0,
+ /* 26874 */ 0324,0360,02,017,0307,0203,0,
+ /* 26881 */ 0360,0323,02,017,0340,0110,0,
+ /* 26888 */ 0360,0323,02,017,0343,0110,0,
+ /* 26895 */ 0360,02,017,0305,0110,026,0,
+ /* 26902 */ 0360,02,017,0304,0110,026,0,
+ /* 26909 */ 0360,0323,02,017,0356,0110,0,
+ /* 26916 */ 0360,0323,02,017,0336,0110,0,
+ /* 26923 */ 0360,0323,02,017,0352,0110,0,
+ /* 26930 */ 0360,0323,02,017,0332,0110,0,
+ /* 26937 */ 0360,0323,02,017,0344,0110,0,
+ /* 26944 */ 0360,0323,02,017,0366,0110,0,
+ /* 26951 */ 0324,0360,02,017,0303,0101,0,
+ /* 26958 */ 0361,0317,02,017,0176,0101,0,
+ /* 26965 */ 0361,0317,02,017,0156,0110,0,
+ /* 26972 */ 0361,0324,02,017,0156,0110,0,
+ /* 26979 */ 0361,0324,02,017,0176,0101,0,
+ /* 26986 */ 0361,02,017,0305,0110,026,0,
+ /* 26993 */ 0361,02,017,0304,0110,026,0,
+ /* 27000 */ 0360,0323,02,017,0364,0110,0,
+ /* 27007 */ 0361,02,017,0160,0110,022,0,
+ /* 27014 */ 0333,02,017,0160,0110,022,0,
+ /* 27021 */ 0332,02,017,0160,0110,022,0,
+ /* 27028 */ 0361,02,017,0163,0207,025,0,
+ /* 27035 */ 0361,02,017,0161,0206,025,0,
+ /* 27042 */ 0361,02,017,0162,0206,025,0,
+ /* 27049 */ 0361,02,017,0163,0206,025,0,
+ /* 27056 */ 0361,02,017,0161,0204,025,0,
+ /* 27063 */ 0361,02,017,0162,0204,025,0,
+ /* 27070 */ 0361,02,017,0163,0203,025,0,
+ /* 27077 */ 0361,02,017,0161,0202,025,0,
+ /* 27084 */ 0361,02,017,0162,0202,025,0,
+ /* 27091 */ 0361,02,017,0163,0202,025,0,
+ /* 27098 */ 0360,0323,02,017,0373,0110,0,
+ /* 27105 */ 0361,02,017,0302,0110,026,0,
+ /* 27112 */ 0332,02,017,0302,0110,026,0,
+ /* 27119 */ 0317,0332,02,017,055,0110,0,
+ /* 27126 */ 0324,0332,02,017,055,0110,0,
+ /* 27133 */ 0317,0332,02,017,052,0110,0,
+ /* 27140 */ 0324,0332,02,017,052,0110,0,
+ /* 27147 */ 0317,0332,02,017,054,0110,0,
+ /* 27154 */ 0324,0332,02,017,054,0110,0,
+ /* 27161 */ 0361,0324,02,017,0120,0110,0,
+ /* 27168 */ 0361,02,017,0306,0110,026,0,
+ /* 27175 */ 0323,0360,02,017,0170,0101,0,
+ /* 27182 */ 0323,0360,02,017,0171,0110,0,
+ /* 27189 */ 0360,03,017,070,034,0110,0,
+ /* 27196 */ 0361,03,017,070,034,0110,0,
+ /* 27203 */ 0360,03,017,070,035,0110,0,
+ /* 27210 */ 0361,03,017,070,035,0110,0,
+ /* 27217 */ 0360,03,017,070,036,0110,0,
+ /* 27224 */ 0361,03,017,070,036,0110,0,
+ /* 27231 */ 0360,03,017,070,01,0110,0,
+ /* 27238 */ 0361,03,017,070,01,0110,0,
+ /* 27245 */ 0360,03,017,070,02,0110,0,
+ /* 27252 */ 0361,03,017,070,02,0110,0,
+ /* 27259 */ 0360,03,017,070,03,0110,0,
+ /* 27266 */ 0361,03,017,070,03,0110,0,
+ /* 27273 */ 0360,03,017,070,05,0110,0,
+ /* 27280 */ 0361,03,017,070,05,0110,0,
+ /* 27287 */ 0360,03,017,070,06,0110,0,
+ /* 27294 */ 0361,03,017,070,06,0110,0,
+ /* 27301 */ 0360,03,017,070,07,0110,0,
+ /* 27308 */ 0361,03,017,070,07,0110,0,
+ /* 27315 */ 0360,03,017,070,04,0110,0,
+ /* 27322 */ 0361,03,017,070,04,0110,0,
+ /* 27329 */ 0360,03,017,070,013,0110,0,
+ /* 27336 */ 0361,03,017,070,013,0110,0,
+ /* 27343 */ 0360,03,017,070,0,0110,0,
+ /* 27350 */ 0361,03,017,070,0,0110,0,
+ /* 27357 */ 0360,03,017,070,010,0110,0,
+ /* 27364 */ 0361,03,017,070,010,0110,0,
+ /* 27371 */ 0360,03,017,070,011,0110,0,
+ /* 27378 */ 0361,03,017,070,011,0110,0,
+ /* 27385 */ 0360,03,017,070,012,0110,0,
+ /* 27392 */ 0361,03,017,070,012,0110,0,
+ /* 27399 */ 0320,0333,02,017,0275,0110,0,
+ /* 27406 */ 0321,0333,02,017,0275,0110,0,
+ /* 27413 */ 0324,0333,02,017,0275,0110,0,
+ /* 27420 */ 0361,03,017,070,025,0110,0,
+ /* 27427 */ 0361,03,017,070,024,0110,0,
+ /* 27434 */ 0361,03,017,070,052,0110,0,
+ /* 27441 */ 0361,03,017,070,053,0110,0,
+ /* 27448 */ 0361,03,017,070,020,0110,0,
+ /* 27455 */ 0361,03,017,070,051,0110,0,
+ /* 27462 */ 0361,03,017,070,0101,0110,0,
+ /* 27469 */ 0361,03,017,070,074,0110,0,
+ /* 27476 */ 0361,03,017,070,075,0110,0,
+ /* 27483 */ 0361,03,017,070,077,0110,0,
+ /* 27490 */ 0361,03,017,070,076,0110,0,
+ /* 27497 */ 0361,03,017,070,070,0110,0,
+ /* 27504 */ 0361,03,017,070,071,0110,0,
+ /* 27511 */ 0361,03,017,070,073,0110,0,
+ /* 27518 */ 0361,03,017,070,072,0110,0,
+ /* 27525 */ 0361,03,017,070,040,0110,0,
+ /* 27532 */ 0361,03,017,070,041,0110,0,
+ /* 27539 */ 0361,03,017,070,042,0110,0,
+ /* 27546 */ 0361,03,017,070,043,0110,0,
+ /* 27553 */ 0361,03,017,070,044,0110,0,
+ /* 27560 */ 0361,03,017,070,045,0110,0,
+ /* 27567 */ 0361,03,017,070,060,0110,0,
+ /* 27574 */ 0361,03,017,070,061,0110,0,
+ /* 27581 */ 0361,03,017,070,062,0110,0,
+ /* 27588 */ 0361,03,017,070,063,0110,0,
+ /* 27595 */ 0361,03,017,070,064,0110,0,
+ /* 27602 */ 0361,03,017,070,065,0110,0,
+ /* 27609 */ 0361,03,017,070,050,0110,0,
+ /* 27616 */ 0361,03,017,070,0100,0110,0,
+ /* 27623 */ 0361,03,017,070,027,0110,0,
+ /* 27630 */ 0361,03,017,070,067,0110,0,
+ /* 27637 */ 0320,0333,02,017,0270,0110,0,
+ /* 27644 */ 0321,0333,02,017,0270,0110,0,
+ /* 27651 */ 0324,0333,02,017,0270,0110,0,
+ /* 27658 */ 0361,03,017,070,0334,0110,0,
+ /* 27665 */ 0361,03,017,070,0335,0110,0,
+ /* 27672 */ 0361,03,017,070,0336,0110,0,
+ /* 27679 */ 0361,03,017,070,0337,0110,0,
+ /* 27686 */ 0361,03,017,070,0333,0110,0,
+ /* 27693 */ 0261,02,041,01,0334,0120,0,
+ /* 27700 */ 0260,02,041,01,0334,0110,0,
+ /* 27707 */ 0261,02,041,01,0335,0120,0,
+ /* 27714 */ 0260,02,041,01,0335,0110,0,
+ /* 27721 */ 0261,02,041,01,0336,0120,0,
+ /* 27728 */ 0260,02,041,01,0336,0110,0,
+ /* 27735 */ 0261,02,041,01,0337,0120,0,
+ /* 27742 */ 0260,02,041,01,0337,0110,0,
+ /* 27749 */ 0270,02,041,01,0333,0110,0,
+ /* 27756 */ 0261,02,045,01,0334,0120,0,
+ /* 27763 */ 0260,02,045,01,0334,0110,0,
+ /* 27770 */ 0261,02,045,01,0335,0120,0,
+ /* 27777 */ 0260,02,045,01,0335,0110,0,
+ /* 27784 */ 0261,02,045,01,0336,0120,0,
+ /* 27791 */ 0260,02,045,01,0336,0110,0,
+ /* 27798 */ 0261,02,045,01,0337,0120,0,
+ /* 27805 */ 0260,02,045,01,0337,0110,0,
+ /* 27812 */ 0261,01,041,01,0130,0120,0,
+ /* 27819 */ 0260,01,041,01,0130,0110,0,
+ /* 27826 */ 0261,01,045,01,0130,0120,0,
+ /* 27833 */ 0260,01,045,01,0130,0110,0,
+ /* 27840 */ 0261,01,040,01,0130,0120,0,
+ /* 27847 */ 0260,01,040,01,0130,0110,0,
+ /* 27854 */ 0261,01,044,01,0130,0120,0,
+ /* 27861 */ 0260,01,044,01,0130,0110,0,
+ /* 27868 */ 0261,01,053,01,0130,0120,0,
+ /* 27875 */ 0260,01,053,01,0130,0110,0,
+ /* 27882 */ 0261,01,052,01,0130,0120,0,
+ /* 27889 */ 0260,01,052,01,0130,0110,0,
+ /* 27896 */ 0261,01,041,01,0320,0120,0,
+ /* 27903 */ 0260,01,041,01,0320,0110,0,
+ /* 27910 */ 0261,01,045,01,0320,0120,0,
+ /* 27917 */ 0260,01,045,01,0320,0110,0,
+ /* 27924 */ 0261,01,043,01,0320,0120,0,
+ /* 27931 */ 0260,01,043,01,0320,0110,0,
+ /* 27938 */ 0261,01,047,01,0320,0120,0,
+ /* 27945 */ 0260,01,047,01,0320,0110,0,
+ /* 27952 */ 0261,01,041,01,0124,0120,0,
+ /* 27959 */ 0260,01,041,01,0124,0110,0,
+ /* 27966 */ 0261,01,045,01,0124,0120,0,
+ /* 27973 */ 0260,01,045,01,0124,0110,0,
+ /* 27980 */ 0261,01,040,01,0124,0120,0,
+ /* 27987 */ 0260,01,040,01,0124,0110,0,
+ /* 27994 */ 0261,01,044,01,0124,0120,0,
+ /* 28001 */ 0260,01,044,01,0124,0110,0,
+ /* 28008 */ 0261,01,041,01,0125,0120,0,
+ /* 28015 */ 0260,01,041,01,0125,0110,0,
+ /* 28022 */ 0261,01,045,01,0125,0120,0,
+ /* 28029 */ 0260,01,045,01,0125,0110,0,
+ /* 28036 */ 0261,01,040,01,0125,0120,0,
+ /* 28043 */ 0260,01,040,01,0125,0110,0,
+ /* 28050 */ 0261,01,044,01,0125,0120,0,
+ /* 28057 */ 0260,01,044,01,0125,0110,0,
+ /* 28064 */ 0270,02,01,01,030,0110,0,
+ /* 28071 */ 0270,02,05,01,030,0110,0,
+ /* 28078 */ 0270,02,05,01,031,0110,0,
+ /* 28085 */ 0270,02,05,01,032,0110,0,
+ /* 28092 */ 0270,01,051,01,057,0110,0,
+ /* 28099 */ 0270,01,050,01,057,0110,0,
+ /* 28106 */ 0270,01,042,01,0346,0110,0,
+ /* 28113 */ 0270,01,046,01,0346,0110,0,
+ /* 28120 */ 0270,01,040,01,0133,0110,0,
+ /* 28127 */ 0270,01,044,01,0133,0110,0,
+ /* 28134 */ 0270,01,043,01,0346,0110,0,
+ /* 28141 */ 0270,01,047,01,0346,0110,0,
+ /* 28148 */ 0270,01,041,01,0132,0110,0,
+ /* 28155 */ 0270,01,045,01,0132,0110,0,
+ /* 28162 */ 0270,01,041,01,0133,0110,0,
+ /* 28169 */ 0270,01,045,01,0133,0110,0,
+ /* 28176 */ 0270,01,040,01,0132,0110,0,
+ /* 28183 */ 0270,01,044,01,0132,0110,0,
+ /* 28190 */ 0270,01,013,01,055,0110,0,
+ /* 28197 */ 0270,01,033,01,055,0110,0,
+ /* 28204 */ 0261,01,053,01,0132,0120,0,
+ /* 28211 */ 0260,01,053,01,0132,0110,0,
+ /* 28218 */ 0261,01,013,01,052,0120,0,
+ /* 28225 */ 0260,01,013,01,052,0110,0,
+ /* 28232 */ 0261,01,033,01,052,0120,0,
+ /* 28239 */ 0260,01,033,01,052,0110,0,
+ /* 28246 */ 0261,01,012,01,052,0120,0,
+ /* 28253 */ 0260,01,012,01,052,0110,0,
+ /* 28260 */ 0261,01,032,01,052,0120,0,
+ /* 28267 */ 0260,01,032,01,052,0110,0,
+ /* 28274 */ 0261,01,052,01,0132,0120,0,
+ /* 28281 */ 0260,01,052,01,0132,0110,0,
+ /* 28288 */ 0270,01,012,01,055,0110,0,
+ /* 28295 */ 0270,01,032,01,055,0110,0,
+ /* 28302 */ 0270,01,041,01,0346,0110,0,
+ /* 28309 */ 0270,01,045,01,0346,0110,0,
+ /* 28316 */ 0270,01,042,01,0133,0110,0,
+ /* 28323 */ 0270,01,046,01,0133,0110,0,
+ /* 28330 */ 0270,01,013,01,054,0110,0,
+ /* 28337 */ 0270,01,033,01,054,0110,0,
+ /* 28344 */ 0270,01,012,01,054,0110,0,
+ /* 28351 */ 0270,01,032,01,054,0110,0,
+ /* 28358 */ 0261,01,041,01,0136,0120,0,
+ /* 28365 */ 0260,01,041,01,0136,0110,0,
+ /* 28372 */ 0261,01,045,01,0136,0120,0,
+ /* 28379 */ 0260,01,045,01,0136,0110,0,
+ /* 28386 */ 0261,01,040,01,0136,0120,0,
+ /* 28393 */ 0260,01,040,01,0136,0110,0,
+ /* 28400 */ 0261,01,044,01,0136,0120,0,
+ /* 28407 */ 0260,01,044,01,0136,0110,0,
+ /* 28414 */ 0261,01,053,01,0136,0120,0,
+ /* 28421 */ 0260,01,053,01,0136,0110,0,
+ /* 28428 */ 0261,01,052,01,0136,0120,0,
+ /* 28435 */ 0260,01,052,01,0136,0110,0,
+ /* 28442 */ 0261,01,041,01,0174,0120,0,
+ /* 28449 */ 0260,01,041,01,0174,0110,0,
+ /* 28456 */ 0261,01,045,01,0174,0120,0,
+ /* 28463 */ 0260,01,045,01,0174,0110,0,
+ /* 28470 */ 0261,01,043,01,0174,0120,0,
+ /* 28477 */ 0260,01,043,01,0174,0110,0,
+ /* 28484 */ 0261,01,047,01,0174,0120,0,
+ /* 28491 */ 0260,01,047,01,0174,0110,0,
+ /* 28498 */ 0261,01,041,01,0175,0120,0,
+ /* 28505 */ 0260,01,041,01,0175,0110,0,
+ /* 28512 */ 0261,01,045,01,0175,0120,0,
+ /* 28519 */ 0260,01,045,01,0175,0110,0,
+ /* 28526 */ 0261,01,043,01,0175,0120,0,
+ /* 28533 */ 0260,01,043,01,0175,0110,0,
+ /* 28540 */ 0261,01,047,01,0175,0120,0,
+ /* 28547 */ 0260,01,047,01,0175,0110,0,
+ /* 28554 */ 0270,01,043,01,0360,0110,0,
+ /* 28561 */ 0270,01,047,01,0360,0110,0,
+ /* 28568 */ 0270,01,040,01,0256,0202,0,
+ /* 28575 */ 0270,01,041,01,0367,0110,0,
+ /* 28582 */ 0261,02,01,01,054,0120,0,
+ /* 28589 */ 0261,02,05,01,054,0120,0,
+ /* 28596 */ 0261,02,01,01,056,0102,0,
+ /* 28603 */ 0261,02,05,01,056,0102,0,
+ /* 28610 */ 0261,02,01,01,055,0120,0,
+ /* 28617 */ 0261,02,05,01,055,0120,0,
+ /* 28624 */ 0261,02,01,01,057,0102,0,
+ /* 28631 */ 0261,02,05,01,057,0102,0,
+ /* 28638 */ 0261,01,041,01,0137,0120,0,
+ /* 28645 */ 0260,01,041,01,0137,0110,0,
+ /* 28652 */ 0261,01,045,01,0137,0120,0,
+ /* 28659 */ 0260,01,045,01,0137,0110,0,
+ /* 28666 */ 0261,01,040,01,0137,0120,0,
+ /* 28673 */ 0260,01,040,01,0137,0110,0,
+ /* 28680 */ 0261,01,044,01,0137,0120,0,
+ /* 28687 */ 0260,01,044,01,0137,0110,0,
+ /* 28694 */ 0261,01,053,01,0137,0120,0,
+ /* 28701 */ 0260,01,053,01,0137,0110,0,
+ /* 28708 */ 0261,01,052,01,0137,0120,0,
+ /* 28715 */ 0260,01,052,01,0137,0110,0,
+ /* 28722 */ 0261,01,041,01,0135,0120,0,
+ /* 28729 */ 0260,01,041,01,0135,0110,0,
+ /* 28736 */ 0261,01,045,01,0135,0120,0,
+ /* 28743 */ 0260,01,045,01,0135,0110,0,
+ /* 28750 */ 0261,01,040,01,0135,0120,0,
+ /* 28757 */ 0260,01,040,01,0135,0110,0,
+ /* 28764 */ 0261,01,044,01,0135,0120,0,
+ /* 28771 */ 0260,01,044,01,0135,0110,0,
+ /* 28778 */ 0261,01,053,01,0135,0120,0,
+ /* 28785 */ 0260,01,053,01,0135,0110,0,
+ /* 28792 */ 0261,01,052,01,0135,0120,0,
+ /* 28799 */ 0260,01,052,01,0135,0110,0,
+ /* 28806 */ 0270,01,041,01,050,0110,0,
+ /* 28813 */ 0270,01,041,01,051,0101,0,
+ /* 28820 */ 0270,01,045,01,050,0110,0,
+ /* 28827 */ 0270,01,045,01,051,0101,0,
+ /* 28834 */ 0270,01,040,01,050,0110,0,
+ /* 28841 */ 0270,01,040,01,051,0101,0,
+ /* 28848 */ 0270,01,044,01,050,0110,0,
+ /* 28855 */ 0270,01,044,01,051,0101,0,
+ /* 28862 */ 0270,01,01,01,0156,0110,0,
+ /* 28869 */ 0270,01,01,01,0176,0101,0,
+ /* 28876 */ 0270,01,042,01,0176,0110,0,
+ /* 28883 */ 0270,01,041,01,0326,0101,0,
+ /* 28890 */ 0270,01,021,01,0156,0110,0,
+ /* 28897 */ 0270,01,021,01,0176,0101,0,
+ /* 28904 */ 0270,01,043,01,022,0110,0,
+ /* 28911 */ 0270,01,047,01,022,0110,0,
+ /* 28918 */ 0270,01,041,01,0157,0110,0,
+ /* 28925 */ 0270,01,041,01,0177,0101,0,
+ /* 28932 */ 0270,01,045,01,0157,0110,0,
+ /* 28939 */ 0270,01,045,01,0177,0101,0,
+ /* 28946 */ 0270,01,042,01,0157,0110,0,
+ /* 28953 */ 0270,01,042,01,0177,0101,0,
+ /* 28960 */ 0270,01,046,01,0157,0110,0,
+ /* 28967 */ 0270,01,046,01,0177,0101,0,
+ /* 28974 */ 0261,01,040,01,022,0120,0,
+ /* 28981 */ 0260,01,040,01,022,0110,0,
+ /* 28988 */ 0261,01,041,01,026,0120,0,
+ /* 28995 */ 0260,01,041,01,026,0110,0,
+ /* 29002 */ 0270,01,041,01,027,0101,0,
+ /* 29009 */ 0261,01,040,01,026,0120,0,
+ /* 29016 */ 0260,01,040,01,026,0110,0,
+ /* 29023 */ 0270,01,040,01,027,0101,0,
+ /* 29030 */ 0261,01,041,01,022,0120,0,
+ /* 29037 */ 0260,01,041,01,022,0110,0,
+ /* 29044 */ 0270,01,041,01,023,0101,0,
+ /* 29051 */ 0270,01,040,01,023,0101,0,
+ /* 29058 */ 0270,01,041,01,0120,0110,0,
+ /* 29065 */ 0270,01,045,01,0120,0110,0,
+ /* 29072 */ 0270,01,040,01,0120,0110,0,
+ /* 29079 */ 0270,01,044,01,0120,0110,0,
+ /* 29086 */ 0270,01,041,01,0347,0101,0,
+ /* 29093 */ 0270,01,045,01,0347,0101,0,
+ /* 29100 */ 0270,02,041,01,052,0110,0,
+ /* 29107 */ 0270,01,041,01,053,0101,0,
+ /* 29114 */ 0270,01,045,01,053,0101,0,
+ /* 29121 */ 0270,01,040,01,053,0101,0,
+ /* 29128 */ 0270,01,044,01,053,0101,0,
+ /* 29135 */ 0261,01,053,01,020,0120,0,
+ /* 29142 */ 0260,01,053,01,020,0110,0,
+ /* 29149 */ 0270,01,053,01,020,0110,0,
+ /* 29156 */ 0261,01,053,01,021,0102,0,
+ /* 29163 */ 0260,01,053,01,021,0101,0,
+ /* 29170 */ 0270,01,053,01,021,0101,0,
+ /* 29177 */ 0270,01,042,01,026,0110,0,
+ /* 29184 */ 0270,01,046,01,026,0110,0,
+ /* 29191 */ 0270,01,042,01,022,0110,0,
+ /* 29198 */ 0270,01,046,01,022,0110,0,
+ /* 29205 */ 0261,01,052,01,020,0120,0,
+ /* 29212 */ 0260,01,052,01,020,0110,0,
+ /* 29219 */ 0270,01,052,01,020,0110,0,
+ /* 29226 */ 0261,01,052,01,021,0102,0,
+ /* 29233 */ 0260,01,052,01,021,0101,0,
+ /* 29240 */ 0270,01,052,01,021,0101,0,
+ /* 29247 */ 0270,01,041,01,020,0110,0,
+ /* 29254 */ 0270,01,041,01,021,0101,0,
+ /* 29261 */ 0270,01,045,01,020,0110,0,
+ /* 29268 */ 0270,01,045,01,021,0101,0,
+ /* 29275 */ 0270,01,040,01,020,0110,0,
+ /* 29282 */ 0270,01,040,01,021,0101,0,
+ /* 29289 */ 0270,01,044,01,020,0110,0,
+ /* 29296 */ 0270,01,044,01,021,0101,0,
+ /* 29303 */ 0261,01,041,01,0131,0120,0,
+ /* 29310 */ 0260,01,041,01,0131,0110,0,
+ /* 29317 */ 0261,01,045,01,0131,0120,0,
+ /* 29324 */ 0260,01,045,01,0131,0110,0,
+ /* 29331 */ 0261,01,040,01,0131,0120,0,
+ /* 29338 */ 0260,01,040,01,0131,0110,0,
+ /* 29345 */ 0261,01,044,01,0131,0120,0,
+ /* 29352 */ 0260,01,044,01,0131,0110,0,
+ /* 29359 */ 0261,01,053,01,0131,0120,0,
+ /* 29366 */ 0260,01,053,01,0131,0110,0,
+ /* 29373 */ 0261,01,052,01,0131,0120,0,
+ /* 29380 */ 0260,01,052,01,0131,0110,0,
+ /* 29387 */ 0261,01,041,01,0126,0120,0,
+ /* 29394 */ 0260,01,041,01,0126,0110,0,
+ /* 29401 */ 0261,01,045,01,0126,0120,0,
+ /* 29408 */ 0260,01,045,01,0126,0110,0,
+ /* 29415 */ 0261,01,040,01,0126,0120,0,
+ /* 29422 */ 0260,01,040,01,0126,0110,0,
+ /* 29429 */ 0261,01,044,01,0126,0120,0,
+ /* 29436 */ 0260,01,044,01,0126,0110,0,
+ /* 29443 */ 0270,02,041,01,034,0110,0,
+ /* 29450 */ 0270,02,041,01,035,0110,0,
+ /* 29457 */ 0270,02,041,01,036,0110,0,
+ /* 29464 */ 0261,01,041,01,0143,0120,0,
+ /* 29471 */ 0260,01,041,01,0143,0110,0,
+ /* 29478 */ 0261,01,041,01,0153,0120,0,
+ /* 29485 */ 0260,01,041,01,0153,0110,0,
+ /* 29492 */ 0261,01,041,01,0147,0120,0,
+ /* 29499 */ 0260,01,041,01,0147,0110,0,
+ /* 29506 */ 0261,02,041,01,053,0120,0,
+ /* 29513 */ 0260,02,041,01,053,0110,0,
+ /* 29520 */ 0261,01,041,01,0374,0120,0,
+ /* 29527 */ 0260,01,041,01,0374,0110,0,
+ /* 29534 */ 0261,01,041,01,0375,0120,0,
+ /* 29541 */ 0260,01,041,01,0375,0110,0,
+ /* 29548 */ 0261,01,041,01,0376,0120,0,
+ /* 29555 */ 0260,01,041,01,0376,0110,0,
+ /* 29562 */ 0261,01,041,01,0324,0120,0,
+ /* 29569 */ 0260,01,041,01,0324,0110,0,
+ /* 29576 */ 0261,01,041,01,0354,0120,0,
+ /* 29583 */ 0260,01,041,01,0354,0110,0,
+ /* 29590 */ 0261,01,041,01,0355,0120,0,
+ /* 29597 */ 0260,01,041,01,0355,0110,0,
+ /* 29604 */ 0261,01,041,01,0334,0120,0,
+ /* 29611 */ 0260,01,041,01,0334,0110,0,
+ /* 29618 */ 0261,01,041,01,0335,0120,0,
+ /* 29625 */ 0260,01,041,01,0335,0110,0,
+ /* 29632 */ 0261,01,041,01,0333,0120,0,
+ /* 29639 */ 0260,01,041,01,0333,0110,0,
+ /* 29646 */ 0261,01,041,01,0337,0120,0,
+ /* 29653 */ 0260,01,041,01,0337,0110,0,
+ /* 29660 */ 0261,01,041,01,0340,0120,0,
+ /* 29667 */ 0260,01,041,01,0340,0110,0,
+ /* 29674 */ 0261,01,041,01,0343,0120,0,
+ /* 29681 */ 0260,01,041,01,0343,0110,0,
+ /* 29688 */ 0261,01,041,01,0164,0120,0,
+ /* 29695 */ 0260,01,041,01,0164,0110,0,
+ /* 29702 */ 0261,01,041,01,0165,0120,0,
+ /* 29709 */ 0260,01,041,01,0165,0110,0,
+ /* 29716 */ 0261,01,041,01,0166,0120,0,
+ /* 29723 */ 0260,01,041,01,0166,0110,0,
+ /* 29730 */ 0261,02,041,01,051,0120,0,
+ /* 29737 */ 0260,02,041,01,051,0110,0,
+ /* 29744 */ 0261,01,041,01,0144,0120,0,
+ /* 29751 */ 0260,01,041,01,0144,0110,0,
+ /* 29758 */ 0261,01,041,01,0145,0120,0,
+ /* 29765 */ 0260,01,041,01,0145,0110,0,
+ /* 29772 */ 0261,01,041,01,0146,0120,0,
+ /* 29779 */ 0260,01,041,01,0146,0110,0,
+ /* 29786 */ 0261,02,041,01,067,0120,0,
+ /* 29793 */ 0260,02,041,01,067,0110,0,
+ /* 29800 */ 0261,02,01,01,015,0120,0,
+ /* 29807 */ 0260,02,01,01,015,0110,0,
+ /* 29814 */ 0261,02,05,01,015,0120,0,
+ /* 29821 */ 0260,02,05,01,015,0110,0,
+ /* 29828 */ 0261,02,01,01,014,0120,0,
+ /* 29835 */ 0260,02,01,01,014,0110,0,
+ /* 29842 */ 0261,02,05,01,014,0120,0,
+ /* 29849 */ 0260,02,05,01,014,0110,0,
+ /* 29856 */ 0261,02,041,01,01,0120,0,
+ /* 29863 */ 0260,02,041,01,01,0110,0,
+ /* 29870 */ 0261,02,041,01,02,0120,0,
+ /* 29877 */ 0260,02,041,01,02,0110,0,
+ /* 29884 */ 0261,02,041,01,03,0120,0,
+ /* 29891 */ 0260,02,041,01,03,0110,0,
+ /* 29898 */ 0270,02,041,01,0101,0110,0,
+ /* 29905 */ 0261,02,041,01,05,0120,0,
+ /* 29912 */ 0260,02,041,01,05,0110,0,
+ /* 29919 */ 0261,02,041,01,06,0120,0,
+ /* 29926 */ 0260,02,041,01,06,0110,0,
+ /* 29933 */ 0261,02,041,01,07,0120,0,
+ /* 29940 */ 0260,02,041,01,07,0110,0,
+ /* 29947 */ 0261,01,041,01,0365,0120,0,
+ /* 29954 */ 0260,01,041,01,0365,0110,0,
+ /* 29961 */ 0261,02,041,01,04,0120,0,
+ /* 29968 */ 0260,02,041,01,04,0110,0,
+ /* 29975 */ 0261,02,041,01,074,0120,0,
+ /* 29982 */ 0260,02,041,01,074,0110,0,
+ /* 29989 */ 0261,01,041,01,0356,0120,0,
+ /* 29996 */ 0260,01,041,01,0356,0110,0,
+ /* 30003 */ 0261,02,041,01,075,0120,0,
+ /* 30010 */ 0260,02,041,01,075,0110,0,
+ /* 30017 */ 0261,01,041,01,0336,0120,0,
+ /* 30024 */ 0260,01,041,01,0336,0110,0,
+ /* 30031 */ 0261,02,041,01,076,0120,0,
+ /* 30038 */ 0260,02,041,01,076,0110,0,
+ /* 30045 */ 0261,02,041,01,077,0120,0,
+ /* 30052 */ 0260,02,041,01,077,0110,0,
+ /* 30059 */ 0261,02,041,01,070,0120,0,
+ /* 30066 */ 0260,02,041,01,070,0110,0,
+ /* 30073 */ 0261,01,041,01,0352,0120,0,
+ /* 30080 */ 0260,01,041,01,0352,0110,0,
+ /* 30087 */ 0261,02,041,01,071,0120,0,
+ /* 30094 */ 0260,02,041,01,071,0110,0,
+ /* 30101 */ 0261,01,041,01,0332,0120,0,
+ /* 30108 */ 0260,01,041,01,0332,0110,0,
+ /* 30115 */ 0261,02,041,01,072,0120,0,
+ /* 30122 */ 0260,02,041,01,072,0110,0,
+ /* 30129 */ 0261,02,041,01,073,0120,0,
+ /* 30136 */ 0260,02,041,01,073,0110,0,
+ /* 30143 */ 0270,01,041,01,0327,0110,0,
+ /* 30150 */ 0270,02,041,01,040,0110,0,
+ /* 30157 */ 0270,02,041,01,041,0110,0,
+ /* 30164 */ 0270,02,041,01,042,0110,0,
+ /* 30171 */ 0270,02,041,01,043,0110,0,
+ /* 30178 */ 0270,02,041,01,044,0110,0,
+ /* 30185 */ 0270,02,041,01,045,0110,0,
+ /* 30192 */ 0270,02,041,01,060,0110,0,
+ /* 30199 */ 0270,02,041,01,061,0110,0,
+ /* 30206 */ 0270,02,041,01,062,0110,0,
+ /* 30213 */ 0270,02,041,01,063,0110,0,
+ /* 30220 */ 0270,02,041,01,064,0110,0,
+ /* 30227 */ 0270,02,041,01,065,0110,0,
+ /* 30234 */ 0261,01,041,01,0344,0120,0,
+ /* 30241 */ 0260,01,041,01,0344,0110,0,
+ /* 30248 */ 0261,02,041,01,013,0120,0,
+ /* 30255 */ 0260,02,041,01,013,0110,0,
+ /* 30262 */ 0261,01,041,01,0345,0120,0,
+ /* 30269 */ 0260,01,041,01,0345,0110,0,
+ /* 30276 */ 0261,01,041,01,0325,0120,0,
+ /* 30283 */ 0260,01,041,01,0325,0110,0,
+ /* 30290 */ 0261,02,041,01,0100,0120,0,
+ /* 30297 */ 0260,02,041,01,0100,0110,0,
+ /* 30304 */ 0261,01,041,01,0364,0120,0,
+ /* 30311 */ 0260,01,041,01,0364,0110,0,
+ /* 30318 */ 0261,02,041,01,050,0120,0,
+ /* 30325 */ 0260,02,041,01,050,0110,0,
+ /* 30332 */ 0261,01,041,01,0353,0120,0,
+ /* 30339 */ 0260,01,041,01,0353,0110,0,
+ /* 30346 */ 0261,01,041,01,0366,0120,0,
+ /* 30353 */ 0260,01,041,01,0366,0110,0,
+ /* 30360 */ 0261,02,041,01,0,0120,0,
+ /* 30367 */ 0260,02,041,01,0,0110,0,
+ /* 30374 */ 0261,02,041,01,010,0120,0,
+ /* 30381 */ 0260,02,041,01,010,0110,0,
+ /* 30388 */ 0261,02,041,01,011,0120,0,
+ /* 30395 */ 0260,02,041,01,011,0110,0,
+ /* 30402 */ 0261,02,041,01,012,0120,0,
+ /* 30409 */ 0260,02,041,01,012,0110,0,
+ /* 30416 */ 0261,01,041,01,0361,0120,0,
+ /* 30423 */ 0260,01,041,01,0361,0110,0,
+ /* 30430 */ 0261,01,041,01,0362,0120,0,
+ /* 30437 */ 0260,01,041,01,0362,0110,0,
+ /* 30444 */ 0261,01,041,01,0363,0120,0,
+ /* 30451 */ 0260,01,041,01,0363,0110,0,
+ /* 30458 */ 0261,01,041,01,0341,0120,0,
+ /* 30465 */ 0260,01,041,01,0341,0110,0,
+ /* 30472 */ 0261,01,041,01,0342,0120,0,
+ /* 30479 */ 0260,01,041,01,0342,0110,0,
+ /* 30486 */ 0261,01,041,01,0321,0120,0,
+ /* 30493 */ 0260,01,041,01,0321,0110,0,
+ /* 30500 */ 0261,01,041,01,0322,0120,0,
+ /* 30507 */ 0260,01,041,01,0322,0110,0,
+ /* 30514 */ 0261,01,041,01,0323,0120,0,
+ /* 30521 */ 0260,01,041,01,0323,0110,0,
+ /* 30528 */ 0270,02,041,01,027,0110,0,
+ /* 30535 */ 0270,02,045,01,027,0110,0,
+ /* 30542 */ 0261,01,041,01,0370,0120,0,
+ /* 30549 */ 0260,01,041,01,0370,0110,0,
+ /* 30556 */ 0261,01,041,01,0371,0120,0,
+ /* 30563 */ 0260,01,041,01,0371,0110,0,
+ /* 30570 */ 0261,01,041,01,0372,0120,0,
+ /* 30577 */ 0260,01,041,01,0372,0110,0,
+ /* 30584 */ 0261,01,041,01,0373,0120,0,
+ /* 30591 */ 0260,01,041,01,0373,0110,0,
+ /* 30598 */ 0261,01,041,01,0350,0120,0,
+ /* 30605 */ 0260,01,041,01,0350,0110,0,
+ /* 30612 */ 0261,01,041,01,0351,0120,0,
+ /* 30619 */ 0260,01,041,01,0351,0110,0,
+ /* 30626 */ 0261,01,041,01,0330,0120,0,
+ /* 30633 */ 0260,01,041,01,0330,0110,0,
+ /* 30640 */ 0261,01,041,01,0331,0120,0,
+ /* 30647 */ 0260,01,041,01,0331,0110,0,
+ /* 30654 */ 0261,01,041,01,0150,0120,0,
+ /* 30661 */ 0260,01,041,01,0150,0110,0,
+ /* 30668 */ 0261,01,041,01,0151,0120,0,
+ /* 30675 */ 0260,01,041,01,0151,0110,0,
+ /* 30682 */ 0261,01,041,01,0152,0120,0,
+ /* 30689 */ 0260,01,041,01,0152,0110,0,
+ /* 30696 */ 0261,01,041,01,0155,0120,0,
+ /* 30703 */ 0260,01,041,01,0155,0110,0,
+ /* 30710 */ 0261,01,041,01,0140,0120,0,
+ /* 30717 */ 0260,01,041,01,0140,0110,0,
+ /* 30724 */ 0261,01,041,01,0141,0120,0,
+ /* 30731 */ 0260,01,041,01,0141,0110,0,
+ /* 30738 */ 0261,01,041,01,0142,0120,0,
+ /* 30745 */ 0260,01,041,01,0142,0110,0,
+ /* 30752 */ 0261,01,041,01,0154,0120,0,
+ /* 30759 */ 0260,01,041,01,0154,0110,0,
+ /* 30766 */ 0261,01,041,01,0357,0120,0,
+ /* 30773 */ 0260,01,041,01,0357,0110,0,
+ /* 30780 */ 0270,01,040,01,0123,0110,0,
+ /* 30787 */ 0270,01,044,01,0123,0110,0,
+ /* 30794 */ 0261,01,052,01,0123,0120,0,
+ /* 30801 */ 0260,01,052,01,0123,0110,0,
+ /* 30808 */ 0270,01,040,01,0122,0110,0,
+ /* 30815 */ 0270,01,044,01,0122,0110,0,
+ /* 30822 */ 0261,01,052,01,0122,0120,0,
+ /* 30829 */ 0260,01,052,01,0122,0110,0,
+ /* 30836 */ 0270,01,041,01,0121,0110,0,
+ /* 30843 */ 0270,01,045,01,0121,0110,0,
+ /* 30850 */ 0270,01,040,01,0121,0110,0,
+ /* 30857 */ 0270,01,044,01,0121,0110,0,
+ /* 30864 */ 0261,01,053,01,0121,0120,0,
+ /* 30871 */ 0260,01,053,01,0121,0110,0,
+ /* 30878 */ 0261,01,052,01,0121,0120,0,
+ /* 30885 */ 0260,01,052,01,0121,0110,0,
+ /* 30892 */ 0270,01,040,01,0256,0203,0,
+ /* 30899 */ 0261,01,041,01,0134,0120,0,
+ /* 30906 */ 0260,01,041,01,0134,0110,0,
+ /* 30913 */ 0261,01,045,01,0134,0120,0,
+ /* 30920 */ 0260,01,045,01,0134,0110,0,
+ /* 30927 */ 0261,01,040,01,0134,0120,0,
+ /* 30934 */ 0260,01,040,01,0134,0110,0,
+ /* 30941 */ 0261,01,044,01,0134,0120,0,
+ /* 30948 */ 0260,01,044,01,0134,0110,0,
+ /* 30955 */ 0261,01,053,01,0134,0120,0,
+ /* 30962 */ 0260,01,053,01,0134,0110,0,
+ /* 30969 */ 0261,01,052,01,0134,0120,0,
+ /* 30976 */ 0260,01,052,01,0134,0110,0,
+ /* 30983 */ 0270,02,01,01,016,0110,0,
+ /* 30990 */ 0270,02,05,01,016,0110,0,
+ /* 30997 */ 0270,02,01,01,017,0110,0,
+ /* 31004 */ 0270,02,05,01,017,0110,0,
+ /* 31011 */ 0270,01,051,01,056,0110,0,
+ /* 31018 */ 0270,01,050,01,056,0110,0,
+ /* 31025 */ 0261,01,041,01,025,0120,0,
+ /* 31032 */ 0260,01,041,01,025,0110,0,
+ /* 31039 */ 0261,01,045,01,025,0120,0,
+ /* 31046 */ 0260,01,045,01,025,0110,0,
+ /* 31053 */ 0261,01,040,01,025,0120,0,
+ /* 31060 */ 0260,01,040,01,025,0110,0,
+ /* 31067 */ 0261,01,044,01,025,0120,0,
+ /* 31074 */ 0260,01,044,01,025,0110,0,
+ /* 31081 */ 0261,01,041,01,024,0120,0,
+ /* 31088 */ 0260,01,041,01,024,0110,0,
+ /* 31095 */ 0261,01,045,01,024,0120,0,
+ /* 31102 */ 0260,01,045,01,024,0110,0,
+ /* 31109 */ 0261,01,040,01,024,0120,0,
+ /* 31116 */ 0260,01,040,01,024,0110,0,
+ /* 31123 */ 0261,01,044,01,024,0120,0,
+ /* 31130 */ 0260,01,044,01,024,0110,0,
+ /* 31137 */ 0261,01,041,01,0127,0120,0,
+ /* 31144 */ 0260,01,041,01,0127,0110,0,
+ /* 31151 */ 0261,01,045,01,0127,0120,0,
+ /* 31158 */ 0260,01,045,01,0127,0110,0,
+ /* 31165 */ 0261,01,040,01,0127,0120,0,
+ /* 31172 */ 0260,01,040,01,0127,0110,0,
+ /* 31179 */ 0261,01,044,01,0127,0120,0,
+ /* 31186 */ 0260,01,044,01,0127,0110,0,
+ /* 31193 */ 0261,02,01,01,0230,0120,0,
+ /* 31200 */ 0261,02,05,01,0230,0120,0,
+ /* 31207 */ 0261,02,021,01,0230,0120,0,
+ /* 31214 */ 0261,02,025,01,0230,0120,0,
+ /* 31221 */ 0261,02,01,01,0250,0120,0,
+ /* 31228 */ 0261,02,05,01,0250,0120,0,
+ /* 31235 */ 0261,02,021,01,0250,0120,0,
+ /* 31242 */ 0261,02,025,01,0250,0120,0,
+ /* 31249 */ 0261,02,01,01,0270,0120,0,
+ /* 31256 */ 0261,02,05,01,0270,0120,0,
+ /* 31263 */ 0261,02,021,01,0270,0120,0,
+ /* 31270 */ 0261,02,025,01,0270,0120,0,
+ /* 31277 */ 0261,02,01,01,0226,0120,0,
+ /* 31284 */ 0261,02,05,01,0226,0120,0,
+ /* 31291 */ 0261,02,021,01,0226,0120,0,
+ /* 31298 */ 0261,02,025,01,0226,0120,0,
+ /* 31305 */ 0261,02,01,01,0246,0120,0,
+ /* 31312 */ 0261,02,05,01,0246,0120,0,
+ /* 31319 */ 0261,02,021,01,0246,0120,0,
+ /* 31326 */ 0261,02,025,01,0246,0120,0,
+ /* 31333 */ 0261,02,01,01,0266,0120,0,
+ /* 31340 */ 0261,02,05,01,0266,0120,0,
+ /* 31347 */ 0261,02,021,01,0266,0120,0,
+ /* 31354 */ 0261,02,025,01,0266,0120,0,
+ /* 31361 */ 0261,02,01,01,0232,0120,0,
+ /* 31368 */ 0261,02,05,01,0232,0120,0,
+ /* 31375 */ 0261,02,021,01,0232,0120,0,
+ /* 31382 */ 0261,02,025,01,0232,0120,0,
+ /* 31389 */ 0261,02,01,01,0252,0120,0,
+ /* 31396 */ 0261,02,05,01,0252,0120,0,
+ /* 31403 */ 0261,02,021,01,0252,0120,0,
+ /* 31410 */ 0261,02,025,01,0252,0120,0,
+ /* 31417 */ 0261,02,01,01,0272,0120,0,
+ /* 31424 */ 0261,02,05,01,0272,0120,0,
+ /* 31431 */ 0261,02,021,01,0272,0120,0,
+ /* 31438 */ 0261,02,025,01,0272,0120,0,
+ /* 31445 */ 0261,02,01,01,0227,0120,0,
+ /* 31452 */ 0261,02,05,01,0227,0120,0,
+ /* 31459 */ 0261,02,021,01,0227,0120,0,
+ /* 31466 */ 0261,02,025,01,0227,0120,0,
+ /* 31473 */ 0261,02,01,01,0247,0120,0,
+ /* 31480 */ 0261,02,05,01,0247,0120,0,
+ /* 31487 */ 0261,02,021,01,0247,0120,0,
+ /* 31494 */ 0261,02,025,01,0247,0120,0,
+ /* 31501 */ 0261,02,01,01,0267,0120,0,
+ /* 31508 */ 0261,02,05,01,0267,0120,0,
+ /* 31515 */ 0261,02,021,01,0267,0120,0,
+ /* 31522 */ 0261,02,025,01,0267,0120,0,
+ /* 31529 */ 0261,02,01,01,0234,0120,0,
+ /* 31536 */ 0261,02,05,01,0234,0120,0,
+ /* 31543 */ 0261,02,021,01,0234,0120,0,
+ /* 31550 */ 0261,02,025,01,0234,0120,0,
+ /* 31557 */ 0261,02,01,01,0254,0120,0,
+ /* 31564 */ 0261,02,05,01,0254,0120,0,
+ /* 31571 */ 0261,02,021,01,0254,0120,0,
+ /* 31578 */ 0261,02,025,01,0254,0120,0,
+ /* 31585 */ 0261,02,01,01,0274,0120,0,
+ /* 31592 */ 0261,02,05,01,0274,0120,0,
+ /* 31599 */ 0261,02,021,01,0274,0120,0,
+ /* 31606 */ 0261,02,025,01,0274,0120,0,
+ /* 31613 */ 0261,02,01,01,0236,0120,0,
+ /* 31620 */ 0261,02,05,01,0236,0120,0,
+ /* 31627 */ 0261,02,021,01,0236,0120,0,
+ /* 31634 */ 0261,02,025,01,0236,0120,0,
+ /* 31641 */ 0261,02,01,01,0256,0120,0,
+ /* 31648 */ 0261,02,05,01,0256,0120,0,
+ /* 31655 */ 0261,02,021,01,0256,0120,0,
+ /* 31662 */ 0261,02,025,01,0256,0120,0,
+ /* 31669 */ 0261,02,01,01,0276,0120,0,
+ /* 31676 */ 0261,02,05,01,0276,0120,0,
+ /* 31683 */ 0261,02,021,01,0276,0120,0,
+ /* 31690 */ 0261,02,025,01,0276,0120,0,
+ /* 31697 */ 0261,02,01,01,0231,0120,0,
+ /* 31704 */ 0261,02,021,01,0231,0120,0,
+ /* 31711 */ 0261,02,01,01,0251,0120,0,
+ /* 31718 */ 0261,02,021,01,0251,0120,0,
+ /* 31725 */ 0261,02,01,01,0271,0120,0,
+ /* 31732 */ 0261,02,021,01,0271,0120,0,
+ /* 31739 */ 0261,02,01,01,0233,0120,0,
+ /* 31746 */ 0261,02,021,01,0233,0120,0,
+ /* 31753 */ 0261,02,01,01,0253,0120,0,
+ /* 31760 */ 0261,02,021,01,0253,0120,0,
+ /* 31767 */ 0261,02,01,01,0273,0120,0,
+ /* 31774 */ 0261,02,021,01,0273,0120,0,
+ /* 31781 */ 0261,02,01,01,0235,0120,0,
+ /* 31788 */ 0261,02,021,01,0235,0120,0,
+ /* 31795 */ 0261,02,01,01,0255,0120,0,
+ /* 31802 */ 0261,02,021,01,0255,0120,0,
+ /* 31809 */ 0261,02,01,01,0275,0120,0,
+ /* 31816 */ 0261,02,021,01,0275,0120,0,
+ /* 31823 */ 0261,02,01,01,0237,0120,0,
+ /* 31830 */ 0261,02,021,01,0237,0120,0,
+ /* 31837 */ 0261,02,01,01,0257,0120,0,
+ /* 31844 */ 0261,02,021,01,0257,0120,0,
+ /* 31851 */ 0261,02,01,01,0277,0120,0,
+ /* 31858 */ 0261,02,021,01,0277,0120,0,
+ /* 31865 */ 0317,0333,02,017,0256,0200,0,
+ /* 31872 */ 0324,0333,02,017,0256,0200,0,
+ /* 31879 */ 0317,0333,02,017,0256,0201,0,
+ /* 31886 */ 0324,0333,02,017,0256,0201,0,
+ /* 31893 */ 0317,0333,02,017,0256,0202,0,
+ /* 31900 */ 0324,0333,02,017,0256,0202,0,
+ /* 31907 */ 0317,0333,02,017,0256,0203,0,
+ /* 31914 */ 0324,0333,02,017,0256,0203,0,
+ /* 31921 */ 0270,02,05,01,023,0110,0,
+ /* 31928 */ 0270,02,01,01,023,0110,0,
+ /* 31935 */ 0270,0111,0,01,022,0200,0,
+ /* 31942 */ 0270,0111,020,01,022,0200,0,
+ /* 31949 */ 0270,0111,0,01,022,0201,0,
+ /* 31956 */ 0270,0111,020,01,022,0201,0,
+ /* 31963 */ 0270,0111,0,01,0201,0110,0,
+ /* 31970 */ 0270,0111,0,01,0201,0100,0,
+ /* 31977 */ 0270,0111,04,01,0201,0110,0,
+ /* 31984 */ 0270,0111,04,01,0201,0100,0,
+ /* 31991 */ 0270,0111,0,01,0200,0110,0,
+ /* 31998 */ 0270,0111,0,01,0200,0100,0,
+ /* 32005 */ 0270,0111,04,01,0200,0110,0,
+ /* 32012 */ 0270,0111,04,01,0200,0100,0,
+ /* 32019 */ 0270,0111,0,01,0203,0110,0,
+ /* 32026 */ 0270,0111,0,01,0203,0100,0,
+ /* 32033 */ 0270,0111,0,01,0202,0110,0,
+ /* 32040 */ 0270,0111,0,01,0202,0100,0,
+ /* 32047 */ 0270,0111,0,01,0302,0110,0,
+ /* 32054 */ 0270,0111,0,01,0302,0100,0,
+ /* 32061 */ 0270,0111,0,01,0303,0110,0,
+ /* 32068 */ 0270,0111,0,01,0303,0100,0,
+ /* 32075 */ 0270,0111,0,01,0301,0110,0,
+ /* 32082 */ 0270,0111,0,01,0301,0100,0,
+ /* 32089 */ 0270,0111,0,01,0313,0110,0,
+ /* 32096 */ 0270,0111,0,01,0313,0100,0,
+ /* 32103 */ 0270,0111,0,01,0322,0110,0,
+ /* 32110 */ 0270,0111,0,01,0322,0100,0,
+ /* 32117 */ 0270,0111,0,01,0323,0110,0,
+ /* 32124 */ 0270,0111,0,01,0323,0100,0,
+ /* 32131 */ 0270,0111,0,01,0321,0110,0,
+ /* 32138 */ 0270,0111,0,01,0321,0100,0,
+ /* 32145 */ 0270,0111,0,01,0333,0110,0,
+ /* 32152 */ 0270,0111,0,01,0333,0100,0,
+ /* 32159 */ 0270,0111,0,01,0326,0110,0,
+ /* 32166 */ 0270,0111,0,01,0326,0100,0,
+ /* 32173 */ 0270,0111,0,01,0327,0110,0,
+ /* 32180 */ 0270,0111,0,01,0327,0100,0,
+ /* 32187 */ 0270,0111,0,01,0306,0110,0,
+ /* 32194 */ 0270,0111,0,01,0306,0100,0,
+ /* 32201 */ 0270,0111,0,01,0307,0110,0,
+ /* 32208 */ 0270,0111,0,01,0307,0100,0,
+ /* 32215 */ 0270,0111,0,01,0341,0110,0,
+ /* 32222 */ 0270,0111,0,01,0341,0100,0,
+ /* 32229 */ 0270,0111,0,01,0343,0110,0,
+ /* 32236 */ 0270,0111,0,01,0343,0100,0,
+ /* 32243 */ 0270,0111,0,01,0342,0110,0,
+ /* 32250 */ 0270,0111,0,01,0342,0100,0,
+ /* 32257 */ 0262,0111,0,01,0220,0110,0,
+ /* 32264 */ 0261,0111,0,01,0220,0100,0,
+ /* 32271 */ 0261,0111,020,01,0220,0120,0,
+ /* 32278 */ 0260,0111,020,01,0220,0110,0,
+ /* 32285 */ 0262,0111,0,01,0222,0110,0,
+ /* 32292 */ 0261,0111,0,01,0222,0100,0,
+ /* 32299 */ 0261,0111,020,01,0222,0120,0,
+ /* 32306 */ 0260,0111,020,01,0222,0110,0,
+ /* 32313 */ 0262,0111,0,01,0223,0110,0,
+ /* 32320 */ 0261,0111,0,01,0223,0100,0,
+ /* 32327 */ 0261,0111,020,01,0223,0120,0,
+ /* 32334 */ 0260,0111,020,01,0223,0110,0,
+ /* 32341 */ 0262,0111,0,01,0221,0110,0,
+ /* 32348 */ 0261,0111,0,01,0221,0100,0,
+ /* 32355 */ 0261,0111,020,01,0221,0120,0,
+ /* 32362 */ 0260,0111,020,01,0221,0110,0,
+ /* 32369 */ 0262,0111,0,01,0230,0110,0,
+ /* 32376 */ 0261,0111,0,01,0230,0100,0,
+ /* 32383 */ 0261,0111,020,01,0230,0120,0,
+ /* 32390 */ 0260,0111,020,01,0230,0110,0,
+ /* 32397 */ 0262,0111,0,01,0232,0110,0,
+ /* 32404 */ 0261,0111,0,01,0232,0100,0,
+ /* 32411 */ 0261,0111,020,01,0232,0120,0,
+ /* 32418 */ 0260,0111,020,01,0232,0110,0,
+ /* 32425 */ 0262,0111,0,01,0233,0110,0,
+ /* 32432 */ 0261,0111,0,01,0233,0100,0,
+ /* 32439 */ 0261,0111,020,01,0233,0120,0,
+ /* 32446 */ 0260,0111,020,01,0233,0110,0,
+ /* 32453 */ 0262,0111,0,01,0231,0110,0,
+ /* 32460 */ 0261,0111,0,01,0231,0100,0,
+ /* 32467 */ 0261,0111,020,01,0231,0120,0,
+ /* 32474 */ 0260,0111,020,01,0231,0110,0,
+ /* 32481 */ 0262,0111,0,01,0224,0110,0,
+ /* 32488 */ 0261,0111,0,01,0224,0100,0,
+ /* 32495 */ 0261,0111,020,01,0224,0120,0,
+ /* 32502 */ 0260,0111,020,01,0224,0110,0,
+ /* 32509 */ 0262,0111,0,01,0226,0110,0,
+ /* 32516 */ 0261,0111,0,01,0226,0100,0,
+ /* 32523 */ 0261,0111,020,01,0226,0120,0,
+ /* 32530 */ 0260,0111,020,01,0226,0110,0,
+ /* 32537 */ 0262,0111,0,01,0227,0110,0,
+ /* 32544 */ 0261,0111,0,01,0227,0100,0,
+ /* 32551 */ 0261,0111,020,01,0227,0120,0,
+ /* 32558 */ 0260,0111,020,01,0227,0110,0,
+ /* 32565 */ 0262,0111,0,01,0225,0110,0,
+ /* 32572 */ 0261,0111,0,01,0225,0100,0,
+ /* 32579 */ 0261,0111,020,01,0225,0120,0,
+ /* 32586 */ 0260,0111,020,01,0225,0110,0,
+ /* 32593 */ 0270,02,045,01,034,0110,0,
+ /* 32600 */ 0270,02,045,01,035,0110,0,
+ /* 32607 */ 0270,02,045,01,036,0110,0,
+ /* 32614 */ 0261,01,045,01,0143,0120,0,
+ /* 32621 */ 0260,01,045,01,0143,0110,0,
+ /* 32628 */ 0261,01,045,01,0153,0120,0,
+ /* 32635 */ 0260,01,045,01,0153,0110,0,
+ /* 32642 */ 0261,02,045,01,053,0120,0,
+ /* 32649 */ 0260,02,045,01,053,0110,0,
+ /* 32656 */ 0261,01,045,01,0147,0120,0,
+ /* 32663 */ 0260,01,045,01,0147,0110,0,
+ /* 32670 */ 0261,01,045,01,0374,0120,0,
+ /* 32677 */ 0260,01,045,01,0374,0110,0,
+ /* 32684 */ 0261,01,045,01,0375,0120,0,
+ /* 32691 */ 0260,01,045,01,0375,0110,0,
+ /* 32698 */ 0261,01,045,01,0376,0120,0,
+ /* 32705 */ 0260,01,045,01,0376,0110,0,
+ /* 32712 */ 0261,01,045,01,0324,0120,0,
+ /* 32719 */ 0260,01,045,01,0324,0110,0,
+ /* 32726 */ 0261,01,045,01,0354,0120,0,
+ /* 32733 */ 0260,01,045,01,0354,0110,0,
+ /* 32740 */ 0261,01,045,01,0355,0120,0,
+ /* 32747 */ 0260,01,045,01,0355,0110,0,
+ /* 32754 */ 0261,01,045,01,0334,0120,0,
+ /* 32761 */ 0260,01,045,01,0334,0110,0,
+ /* 32768 */ 0261,01,045,01,0335,0120,0,
+ /* 32775 */ 0260,01,045,01,0335,0110,0,
+ /* 32782 */ 0261,01,045,01,0333,0120,0,
+ /* 32789 */ 0260,01,045,01,0333,0110,0,
+ /* 32796 */ 0261,01,045,01,0337,0120,0,
+ /* 32803 */ 0260,01,045,01,0337,0110,0,
+ /* 32810 */ 0261,01,045,01,0340,0120,0,
+ /* 32817 */ 0260,01,045,01,0340,0110,0,
+ /* 32824 */ 0261,01,045,01,0343,0120,0,
+ /* 32831 */ 0260,01,045,01,0343,0110,0,
+ /* 32838 */ 0261,01,045,01,0164,0120,0,
+ /* 32845 */ 0260,01,045,01,0164,0110,0,
+ /* 32852 */ 0261,01,045,01,0165,0120,0,
+ /* 32859 */ 0260,01,045,01,0165,0110,0,
+ /* 32866 */ 0261,01,045,01,0166,0120,0,
+ /* 32873 */ 0260,01,045,01,0166,0110,0,
+ /* 32880 */ 0261,02,045,01,051,0120,0,
+ /* 32887 */ 0260,02,045,01,051,0110,0,
+ /* 32894 */ 0261,01,045,01,0144,0120,0,
+ /* 32901 */ 0260,01,045,01,0144,0110,0,
+ /* 32908 */ 0261,01,045,01,0145,0120,0,
+ /* 32915 */ 0260,01,045,01,0145,0110,0,
+ /* 32922 */ 0261,01,045,01,0146,0120,0,
+ /* 32929 */ 0260,01,045,01,0146,0110,0,
+ /* 32936 */ 0261,02,045,01,067,0120,0,
+ /* 32943 */ 0260,02,045,01,067,0110,0,
+ /* 32950 */ 0261,02,045,01,01,0120,0,
+ /* 32957 */ 0260,02,045,01,01,0110,0,
+ /* 32964 */ 0261,02,045,01,02,0120,0,
+ /* 32971 */ 0260,02,045,01,02,0110,0,
+ /* 32978 */ 0261,02,045,01,03,0120,0,
+ /* 32985 */ 0260,02,045,01,03,0110,0,
+ /* 32992 */ 0261,02,045,01,05,0120,0,
+ /* 32999 */ 0260,02,045,01,05,0110,0,
+ /* 33006 */ 0261,02,045,01,06,0120,0,
+ /* 33013 */ 0260,02,045,01,06,0110,0,
+ /* 33020 */ 0261,02,045,01,07,0120,0,
+ /* 33027 */ 0260,02,045,01,07,0110,0,
+ /* 33034 */ 0261,02,045,01,04,0120,0,
+ /* 33041 */ 0260,02,045,01,04,0110,0,
+ /* 33048 */ 0261,01,045,01,0365,0120,0,
+ /* 33055 */ 0260,01,045,01,0365,0110,0,
+ /* 33062 */ 0261,02,045,01,074,0120,0,
+ /* 33069 */ 0260,02,045,01,074,0110,0,
+ /* 33076 */ 0261,01,045,01,0356,0120,0,
+ /* 33083 */ 0260,01,045,01,0356,0110,0,
+ /* 33090 */ 0261,02,045,01,075,0120,0,
+ /* 33097 */ 0260,02,045,01,075,0110,0,
+ /* 33104 */ 0261,01,045,01,0336,0120,0,
+ /* 33111 */ 0260,01,045,01,0336,0110,0,
+ /* 33118 */ 0261,02,045,01,076,0120,0,
+ /* 33125 */ 0260,02,045,01,076,0110,0,
+ /* 33132 */ 0261,02,045,01,077,0120,0,
+ /* 33139 */ 0260,02,045,01,077,0110,0,
+ /* 33146 */ 0261,02,045,01,070,0120,0,
+ /* 33153 */ 0260,02,045,01,070,0110,0,
+ /* 33160 */ 0261,01,045,01,0352,0120,0,
+ /* 33167 */ 0260,01,045,01,0352,0110,0,
+ /* 33174 */ 0261,02,045,01,071,0120,0,
+ /* 33181 */ 0260,02,045,01,071,0110,0,
+ /* 33188 */ 0261,01,045,01,0332,0120,0,
+ /* 33195 */ 0260,01,045,01,0332,0110,0,
+ /* 33202 */ 0261,02,045,01,072,0120,0,
+ /* 33209 */ 0260,02,045,01,072,0110,0,
+ /* 33216 */ 0261,02,045,01,073,0120,0,
+ /* 33223 */ 0260,02,045,01,073,0110,0,
+ /* 33230 */ 0270,01,045,01,0327,0110,0,
+ /* 33237 */ 0270,02,045,01,040,0110,0,
+ /* 33244 */ 0270,02,045,01,041,0110,0,
+ /* 33251 */ 0270,02,045,01,042,0110,0,
+ /* 33258 */ 0270,02,045,01,043,0110,0,
+ /* 33265 */ 0270,02,045,01,044,0110,0,
+ /* 33272 */ 0270,02,045,01,045,0110,0,
+ /* 33279 */ 0270,02,045,01,060,0110,0,
+ /* 33286 */ 0270,02,045,01,061,0110,0,
+ /* 33293 */ 0270,02,045,01,062,0110,0,
+ /* 33300 */ 0270,02,045,01,063,0110,0,
+ /* 33307 */ 0270,02,045,01,064,0110,0,
+ /* 33314 */ 0270,02,045,01,065,0110,0,
+ /* 33321 */ 0261,02,045,01,050,0120,0,
+ /* 33328 */ 0260,02,045,01,050,0110,0,
+ /* 33335 */ 0261,02,045,01,013,0120,0,
+ /* 33342 */ 0260,02,045,01,013,0110,0,
+ /* 33349 */ 0261,01,045,01,0344,0120,0,
+ /* 33356 */ 0260,01,045,01,0344,0110,0,
+ /* 33363 */ 0261,01,045,01,0345,0120,0,
+ /* 33370 */ 0260,01,045,01,0345,0110,0,
+ /* 33377 */ 0261,01,045,01,0325,0120,0,
+ /* 33384 */ 0260,01,045,01,0325,0110,0,
+ /* 33391 */ 0261,02,045,01,0100,0120,0,
+ /* 33398 */ 0260,02,045,01,0100,0110,0,
+ /* 33405 */ 0261,01,045,01,0364,0120,0,
+ /* 33412 */ 0260,01,045,01,0364,0110,0,
+ /* 33419 */ 0261,01,045,01,0353,0120,0,
+ /* 33426 */ 0260,01,045,01,0353,0110,0,
+ /* 33433 */ 0261,01,045,01,0366,0120,0,
+ /* 33440 */ 0260,01,045,01,0366,0110,0,
+ /* 33447 */ 0261,02,045,01,0,0120,0,
+ /* 33454 */ 0260,02,045,01,0,0110,0,
+ /* 33461 */ 0261,02,045,01,010,0120,0,
+ /* 33468 */ 0260,02,045,01,010,0110,0,
+ /* 33475 */ 0261,02,045,01,011,0120,0,
+ /* 33482 */ 0260,02,045,01,011,0110,0,
+ /* 33489 */ 0261,02,045,01,012,0120,0,
+ /* 33496 */ 0260,02,045,01,012,0110,0,
+ /* 33503 */ 0261,01,045,01,0361,0120,0,
+ /* 33510 */ 0260,01,045,01,0361,0110,0,
+ /* 33517 */ 0261,01,045,01,0362,0120,0,
+ /* 33524 */ 0260,01,045,01,0362,0110,0,
+ /* 33531 */ 0261,01,045,01,0363,0120,0,
+ /* 33538 */ 0260,01,045,01,0363,0110,0,
+ /* 33545 */ 0261,01,045,01,0341,0120,0,
+ /* 33552 */ 0260,01,045,01,0341,0110,0,
+ /* 33559 */ 0261,01,045,01,0342,0120,0,
+ /* 33566 */ 0260,01,045,01,0342,0110,0,
+ /* 33573 */ 0261,01,045,01,0321,0120,0,
+ /* 33580 */ 0260,01,045,01,0321,0110,0,
+ /* 33587 */ 0261,01,045,01,0322,0120,0,
+ /* 33594 */ 0260,01,045,01,0322,0110,0,
+ /* 33601 */ 0261,01,045,01,0323,0120,0,
+ /* 33608 */ 0260,01,045,01,0323,0110,0,
+ /* 33615 */ 0261,01,045,01,0370,0120,0,
+ /* 33622 */ 0260,01,045,01,0370,0110,0,
+ /* 33629 */ 0261,01,045,01,0371,0120,0,
+ /* 33636 */ 0260,01,045,01,0371,0110,0,
+ /* 33643 */ 0261,01,045,01,0372,0120,0,
+ /* 33650 */ 0260,01,045,01,0372,0110,0,
+ /* 33657 */ 0261,01,045,01,0373,0120,0,
+ /* 33664 */ 0260,01,045,01,0373,0110,0,
+ /* 33671 */ 0261,01,045,01,0350,0120,0,
+ /* 33678 */ 0260,01,045,01,0350,0110,0,
+ /* 33685 */ 0261,01,045,01,0351,0120,0,
+ /* 33692 */ 0260,01,045,01,0351,0110,0,
+ /* 33699 */ 0261,01,045,01,0330,0120,0,
+ /* 33706 */ 0260,01,045,01,0330,0110,0,
+ /* 33713 */ 0261,01,045,01,0331,0120,0,
+ /* 33720 */ 0260,01,045,01,0331,0110,0,
+ /* 33727 */ 0261,01,045,01,0150,0120,0,
+ /* 33734 */ 0260,01,045,01,0150,0110,0,
+ /* 33741 */ 0261,01,045,01,0151,0120,0,
+ /* 33748 */ 0260,01,045,01,0151,0110,0,
+ /* 33755 */ 0261,01,045,01,0152,0120,0,
+ /* 33762 */ 0260,01,045,01,0152,0110,0,
+ /* 33769 */ 0261,01,045,01,0155,0120,0,
+ /* 33776 */ 0260,01,045,01,0155,0110,0,
+ /* 33783 */ 0261,01,045,01,0140,0120,0,
+ /* 33790 */ 0260,01,045,01,0140,0110,0,
+ /* 33797 */ 0261,01,045,01,0141,0120,0,
+ /* 33804 */ 0260,01,045,01,0141,0110,0,
+ /* 33811 */ 0261,01,045,01,0142,0120,0,
+ /* 33818 */ 0260,01,045,01,0142,0110,0,
+ /* 33825 */ 0261,01,045,01,0154,0120,0,
+ /* 33832 */ 0260,01,045,01,0154,0110,0,
+ /* 33839 */ 0261,01,045,01,0357,0120,0,
+ /* 33846 */ 0260,01,045,01,0357,0110,0,
+ /* 33853 */ 0270,02,045,01,052,0110,0,
+ /* 33860 */ 0270,02,05,01,0132,0110,0,
+ /* 33867 */ 0270,02,01,01,0170,0110,0,
+ /* 33874 */ 0270,02,05,01,0170,0110,0,
+ /* 33881 */ 0270,02,01,01,0171,0110,0,
+ /* 33888 */ 0270,02,05,01,0171,0110,0,
+ /* 33895 */ 0270,02,01,01,0130,0110,0,
+ /* 33902 */ 0270,02,05,01,0130,0110,0,
+ /* 33909 */ 0270,02,01,01,0131,0110,0,
+ /* 33916 */ 0270,02,05,01,0131,0110,0,
+ /* 33923 */ 0261,02,05,01,066,0120,0,
+ /* 33930 */ 0260,02,05,01,066,0110,0,
+ /* 33937 */ 0261,02,05,01,026,0120,0,
+ /* 33944 */ 0260,02,05,01,026,0110,0,
+ /* 33951 */ 0261,02,01,01,0214,0120,0,
+ /* 33958 */ 0260,02,01,01,0214,0110,0,
+ /* 33965 */ 0261,02,05,01,0214,0120,0,
+ /* 33972 */ 0260,02,05,01,0214,0110,0,
+ /* 33979 */ 0261,02,021,01,0214,0120,0,
+ /* 33986 */ 0260,02,021,01,0214,0110,0,
+ /* 33993 */ 0261,02,025,01,0214,0120,0,
+ /* 34000 */ 0260,02,025,01,0214,0110,0,
+ /* 34007 */ 0261,02,01,01,0216,0102,0,
+ /* 34014 */ 0260,02,01,01,0216,0101,0,
+ /* 34021 */ 0261,02,05,01,0216,0102,0,
+ /* 34028 */ 0260,02,05,01,0216,0101,0,
+ /* 34035 */ 0261,02,021,01,0216,0102,0,
+ /* 34042 */ 0260,02,021,01,0216,0101,0,
+ /* 34049 */ 0261,02,025,01,0216,0102,0,
+ /* 34056 */ 0260,02,025,01,0216,0101,0,
+ /* 34063 */ 0261,02,01,01,0107,0120,0,
+ /* 34070 */ 0260,02,01,01,0107,0110,0,
+ /* 34077 */ 0261,02,021,01,0107,0120,0,
+ /* 34084 */ 0260,02,021,01,0107,0110,0,
+ /* 34091 */ 0261,02,05,01,0107,0120,0,
+ /* 34098 */ 0260,02,05,01,0107,0110,0,
+ /* 34105 */ 0261,02,025,01,0107,0120,0,
+ /* 34112 */ 0260,02,025,01,0107,0110,0,
+ /* 34119 */ 0261,02,01,01,0106,0120,0,
+ /* 34126 */ 0260,02,01,01,0106,0110,0,
+ /* 34133 */ 0261,02,05,01,0106,0120,0,
+ /* 34140 */ 0260,02,05,01,0106,0110,0,
+ /* 34147 */ 0261,02,01,01,0105,0120,0,
+ /* 34154 */ 0260,02,01,01,0105,0110,0,
+ /* 34161 */ 0261,02,021,01,0105,0120,0,
+ /* 34168 */ 0260,02,021,01,0105,0110,0,
+ /* 34175 */ 0261,02,05,01,0105,0120,0,
+ /* 34182 */ 0260,02,05,01,0105,0110,0,
+ /* 34189 */ 0261,02,025,01,0105,0120,0,
+ /* 34196 */ 0260,02,025,01,0105,0110,0,
+ /* 34203 */ 0261,02,0,01,0362,0120,0,
+ /* 34210 */ 0261,02,020,01,0362,0120,0,
+ /* 34217 */ 0262,02,0,01,0367,0110,0,
+ /* 34224 */ 0262,02,020,01,0367,0110,0,
+ /* 34231 */ 0260,0111,0,01,02,0216,0,
+ /* 34238 */ 0260,0111,020,01,02,0216,0,
+ /* 34245 */ 0260,0111,0,01,01,0215,0,
+ /* 34252 */ 0260,0111,020,01,01,0215,0,
+ /* 34259 */ 0260,02,0,01,0363,0213,0,
+ /* 34266 */ 0260,02,020,01,0363,0213,0,
+ /* 34273 */ 0260,0111,0,01,01,0216,0,
+ /* 34280 */ 0260,0111,020,01,01,0216,0,
+ /* 34287 */ 0260,0111,0,01,01,0211,0,
+ /* 34294 */ 0260,0111,020,01,01,0211,0,
+ /* 34301 */ 0260,0111,0,01,01,0212,0,
+ /* 34308 */ 0260,0111,020,01,01,0212,0,
+ /* 34315 */ 0260,0111,0,01,02,0211,0,
+ /* 34322 */ 0260,0111,020,01,02,0211,0,
+ /* 34329 */ 0260,02,0,01,0363,0212,0,
+ /* 34336 */ 0260,02,020,01,0363,0212,0,
+ /* 34343 */ 0260,02,0,01,0363,0211,0,
+ /* 34350 */ 0260,02,020,01,0363,0211,0,
+ /* 34357 */ 0260,0111,0,01,01,0213,0,
+ /* 34364 */ 0260,0111,020,01,01,0213,0,
+ /* 34371 */ 0262,02,0,01,0365,0110,0,
+ /* 34378 */ 0262,02,020,01,0365,0110,0,
+ /* 34385 */ 0261,02,03,01,0366,0120,0,
+ /* 34392 */ 0261,02,023,01,0366,0120,0,
+ /* 34399 */ 0261,02,03,01,0365,0120,0,
+ /* 34406 */ 0261,02,023,01,0365,0120,0,
+ /* 34413 */ 0261,02,02,01,0365,0120,0,
+ /* 34420 */ 0261,02,022,01,0365,0120,0,
+ /* 34427 */ 0262,02,02,01,0367,0110,0,
+ /* 34434 */ 0262,02,022,01,0367,0110,0,
+ /* 34441 */ 0262,02,01,01,0367,0110,0,
+ /* 34448 */ 0262,02,021,01,0367,0110,0,
+ /* 34455 */ 0262,02,03,01,0367,0110,0,
+ /* 34462 */ 0262,02,023,01,0367,0110,0,
+ /* 34469 */ 0320,0333,02,017,0274,0110,0,
+ /* 34476 */ 0321,0333,02,017,0274,0110,0,
+ /* 34483 */ 0324,0333,02,017,0274,0110,0,
+ /* 34490 */ 0260,0111,0,01,01,0214,0,
+ /* 34497 */ 0260,0111,020,01,01,0214,0,
+ /* 34504 */ 0260,0111,0,01,01,0217,0,
+ /* 34511 */ 0260,0111,020,01,01,0217,0,
+ /* 34518 */ 0323,0333,02,017,032,0110,0,
+ /* 34525 */ 0323,0332,02,017,032,0110,0,
+ /* 34532 */ 0323,0332,02,017,033,0110,0,
+ /* 34539 */ 03,017,072,0314,0110,022,0,
+ /* 34546 */ 0261,01,05,01,0112,0120,0,
+ /* 34553 */ 0261,01,025,01,0112,0120,0,
+ /* 34560 */ 0261,01,024,01,0112,0120,0,
+ /* 34567 */ 0261,01,04,01,0112,0120,0,
+ /* 34574 */ 0261,01,05,01,0101,0120,0,
+ /* 34581 */ 0261,01,025,01,0101,0120,0,
+ /* 34588 */ 0261,01,05,01,0102,0120,0,
+ /* 34595 */ 0261,01,025,01,0102,0120,0,
+ /* 34602 */ 0261,01,024,01,0102,0120,0,
+ /* 34609 */ 0261,01,04,01,0102,0120,0,
+ /* 34616 */ 0261,01,024,01,0101,0120,0,
+ /* 34623 */ 0261,01,04,01,0101,0120,0,
+ /* 34630 */ 0270,01,01,01,0220,0110,0,
+ /* 34637 */ 0270,01,01,01,0221,0101,0,
+ /* 34644 */ 0270,01,01,01,0222,0110,0,
+ /* 34651 */ 0270,01,01,01,0223,0110,0,
+ /* 34658 */ 0270,01,021,01,0220,0110,0,
+ /* 34665 */ 0270,01,021,01,0221,0101,0,
+ /* 34672 */ 0270,01,03,01,0222,0110,0,
+ /* 34679 */ 0270,01,03,01,0223,0110,0,
+ /* 34686 */ 0270,01,020,01,0220,0110,0,
+ /* 34693 */ 0270,01,020,01,0221,0101,0,
+ /* 34700 */ 0270,01,023,01,0222,0110,0,
+ /* 34707 */ 0270,01,023,01,0223,0110,0,
+ /* 34714 */ 0270,01,0,01,0220,0110,0,
+ /* 34721 */ 0270,01,0,01,0221,0101,0,
+ /* 34728 */ 0270,01,0,01,0222,0110,0,
+ /* 34735 */ 0270,01,0,01,0223,0110,0,
+ /* 34742 */ 0270,01,01,01,0104,0110,0,
+ /* 34749 */ 0270,01,021,01,0104,0110,0,
+ /* 34756 */ 0270,01,020,01,0104,0110,0,
+ /* 34763 */ 0270,01,0,01,0104,0110,0,
+ /* 34770 */ 0261,01,05,01,0105,0120,0,
+ /* 34777 */ 0261,01,025,01,0105,0120,0,
+ /* 34784 */ 0261,01,024,01,0105,0120,0,
+ /* 34791 */ 0270,01,01,01,0230,0110,0,
+ /* 34798 */ 0270,01,021,01,0230,0110,0,
+ /* 34805 */ 0270,01,020,01,0230,0110,0,
+ /* 34812 */ 0270,01,0,01,0230,0110,0,
+ /* 34819 */ 0261,01,04,01,0105,0120,0,
+ /* 34826 */ 0270,01,01,01,0231,0110,0,
+ /* 34833 */ 0270,01,021,01,0231,0110,0,
+ /* 34840 */ 0270,01,020,01,0231,0110,0,
+ /* 34847 */ 0270,01,0,01,0231,0110,0,
+ /* 34854 */ 0261,01,05,01,0113,0120,0,
+ /* 34861 */ 0261,01,024,01,0113,0120,0,
+ /* 34868 */ 0261,01,04,01,0113,0120,0,
+ /* 34875 */ 0261,01,05,01,0106,0120,0,
+ /* 34882 */ 0261,01,025,01,0106,0120,0,
+ /* 34889 */ 0261,01,024,01,0106,0120,0,
+ /* 34896 */ 0261,01,04,01,0106,0120,0,
+ /* 34903 */ 0261,01,05,01,0107,0120,0,
+ /* 34910 */ 0261,01,025,01,0107,0120,0,
+ /* 34917 */ 0261,01,024,01,0107,0120,0,
+ /* 34924 */ 0261,01,04,01,0107,0120,0,
+ /* 34931 */ 0323,0333,02,017,0307,0207,0,
+ /* 34938 */ 0360,03,017,070,0371,0101,0,
+ /* 34945 */ 0324,03,017,070,0371,0101,0,
+ /* 34952 */ 0310,0333,02,017,0256,0206,0,
+ /* 34959 */ 0311,0333,02,017,0256,0206,0,
+ /* 34966 */ 0313,0333,02,017,0256,0206,0,
+ /* 34973 */ 0361,03,017,070,0317,0110,0,
+ /* 34980 */ 0261,02,01,01,0317,0120,0,
+ /* 34987 */ 0260,02,01,01,0317,0110,0,
+ /* 34994 */ 0261,02,05,01,0317,0120,0,
+ /* 35001 */ 0260,02,05,01,0317,0110,0,
+ /* 35008 */ 0273,0320,01,021,0101,0,
+ /* 35014 */ 0273,0321,01,021,0101,0,
+ /* 35020 */ 0273,0324,01,021,0101,0,
+ /* 35026 */ 0273,01,0200,0202,021,0,
+ /* 35032 */ 0273,01,0202,0202,021,0,
+ /* 35038 */ 0273,0320,01,01,0101,0,
+ /* 35044 */ 0273,0321,01,01,0101,0,
+ /* 35050 */ 0273,0324,01,01,0101,0,
+ /* 35056 */ 0273,01,0200,0200,021,0,
+ /* 35062 */ 0273,01,0202,0200,021,0,
+ /* 35068 */ 0273,0320,01,041,0101,0,
+ /* 35074 */ 0273,0321,01,041,0101,0,
+ /* 35080 */ 0273,0324,01,041,0101,0,
+ /* 35086 */ 0273,01,0200,0204,021,0,
+ /* 35092 */ 0273,01,0202,0204,021,0,
+ /* 35098 */ 0321,01,017,010,0310,0,
+ /* 35104 */ 0324,01,017,010,0310,0,
+ /* 35110 */ 0320,02,017,0243,0101,0,
+ /* 35116 */ 0321,02,017,0243,0101,0,
+ /* 35122 */ 0324,02,017,0243,0101,0,
+ /* 35128 */ 0322,01,0232,034,074,0,
+ /* 35134 */ 0320,01,0232,034,074,0,
+ /* 35140 */ 0321,01,0232,034,074,0,
+ /* 35146 */ 0322,01,0232,035,030,0,
+ /* 35152 */ 0320,01,0232,031,030,0,
+ /* 35158 */ 0321,01,0232,041,030,0,
+ /* 35164 */ 0320,01,0203,0207,0275,0,
+ /* 35170 */ 0321,01,0203,0207,0275,0,
+ /* 35176 */ 0324,01,0203,0207,0275,0,
+ /* 35182 */ 0320,01,0201,0207,031,0,
+ /* 35188 */ 0321,01,0201,0207,041,0,
+ /* 35194 */ 0324,01,0201,0207,0255,0,
+ /* 35200 */ 0273,02,017,0260,0101,0,
+ /* 35206 */ 0320,02,017,0247,0101,0,
+ /* 35212 */ 0321,02,017,0247,0101,0,
+ /* 35218 */ 0324,02,017,0307,0201,0,
+ /* 35224 */ 0273,0320,01,0377,0201,0,
+ /* 35230 */ 0273,0321,01,0377,0201,0,
+ /* 35236 */ 0273,0324,01,0377,0201,0,
+ /* 35242 */ 0320,02,017,0257,0110,0,
+ /* 35248 */ 0321,02,017,0257,0110,0,
+ /* 35254 */ 0324,02,017,0257,0110,0,
+ /* 35260 */ 0320,01,0153,0110,0276,0,
+ /* 35266 */ 0320,01,0151,0110,032,0,
+ /* 35272 */ 0321,01,0153,0110,0276,0,
+ /* 35278 */ 0321,01,0151,0110,042,0,
+ /* 35284 */ 0324,01,0153,0110,0276,0,
+ /* 35290 */ 0324,01,0151,0110,042,0,
+ /* 35296 */ 0324,01,0151,0110,0256,0,
+ /* 35302 */ 0320,01,0153,0100,0275,0,
+ /* 35308 */ 0320,01,0151,0100,031,0,
+ /* 35314 */ 0321,01,0153,0100,0275,0,
+ /* 35320 */ 0321,01,0151,0100,041,0,
+ /* 35326 */ 0324,01,0153,0100,0275,0,
+ /* 35332 */ 0324,01,0151,0100,0255,0,
+ /* 35338 */ 0273,0320,01,0377,0200,0,
+ /* 35344 */ 0273,0321,01,0377,0200,0,
+ /* 35350 */ 0273,0324,01,0377,0200,0,
+ /* 35356 */ 0310,03,017,01,0337,0,
+ /* 35362 */ 0311,03,017,01,0337,0,
+ /* 35368 */ 0322,01,0352,034,074,0,
+ /* 35374 */ 0320,01,0352,034,074,0,
+ /* 35380 */ 0321,01,0352,034,074,0,
+ /* 35386 */ 0322,01,0352,035,030,0,
+ /* 35392 */ 0320,01,0352,031,030,0,
+ /* 35398 */ 0321,01,0352,041,030,0,
+ /* 35404 */ 0322,02,017,0270,064,0,
+ /* 35410 */ 0320,02,017,0270,064,0,
+ /* 35416 */ 0321,02,017,0270,064,0,
+ /* 35422 */ 0320,02,017,0,0206,0,
+ /* 35428 */ 0321,02,017,0,0206,0,
+ /* 35434 */ 0320,02,017,02,0110,0,
+ /* 35440 */ 0321,02,017,02,0110,0,
+ /* 35446 */ 0324,02,017,02,0110,0,
+ /* 35452 */ 0360,03,017,0256,0350,0,
+ /* 35458 */ 0320,02,017,0264,0110,0,
+ /* 35464 */ 0321,02,017,0264,0110,0,
+ /* 35470 */ 0324,02,017,0264,0110,0,
+ /* 35476 */ 0320,02,017,0265,0110,0,
+ /* 35482 */ 0321,02,017,0265,0110,0,
+ /* 35488 */ 0324,02,017,0265,0110,0,
+ /* 35494 */ 0320,02,017,03,0110,0,
+ /* 35500 */ 0321,02,017,03,0110,0,
+ /* 35506 */ 0324,02,017,03,0110,0,
+ /* 35512 */ 0320,02,017,0262,0110,0,
+ /* 35518 */ 0321,02,017,0262,0110,0,
+ /* 35524 */ 0324,02,017,0262,0110,0,
+ /* 35530 */ 0360,03,017,0256,0360,0,
+ /* 35536 */ 0334,02,017,040,0101,0,
+ /* 35542 */ 0323,02,017,040,0101,0,
+ /* 35548 */ 0334,02,017,042,0110,0,
+ /* 35554 */ 0323,02,017,042,0110,0,
+ /* 35560 */ 0323,02,017,041,0101,0,
+ /* 35566 */ 0323,02,017,043,0110,0,
+ /* 35572 */ 0271,0320,01,0211,0101,0,
+ /* 35578 */ 0271,0321,01,0211,0101,0,
+ /* 35584 */ 0271,0324,01,0211,0101,0,
+ /* 35590 */ 0271,01,0306,0200,021,0,
+ /* 35596 */ 0360,02,017,0156,0110,0,
+ /* 35602 */ 0360,02,017,0176,0101,0,
+ /* 35608 */ 0360,02,017,0157,0110,0,
+ /* 35614 */ 0360,02,017,0177,0101,0,
+ /* 35620 */ 0320,02,017,0276,0110,0,
+ /* 35626 */ 0321,02,017,0276,0110,0,
+ /* 35632 */ 0321,02,017,0277,0110,0,
+ /* 35638 */ 0324,02,017,0276,0110,0,
+ /* 35644 */ 0324,02,017,0277,0110,0,
+ /* 35650 */ 0320,02,017,0266,0110,0,
+ /* 35656 */ 0321,02,017,0266,0110,0,
+ /* 35662 */ 0321,02,017,0267,0110,0,
+ /* 35668 */ 0324,02,017,0266,0110,0,
+ /* 35674 */ 0324,02,017,0267,0110,0,
+ /* 35680 */ 0273,0320,01,0367,0203,0,
+ /* 35686 */ 0273,0321,01,0367,0203,0,
+ /* 35692 */ 0273,0324,01,0367,0203,0,
+ /* 35698 */ 0320,02,017,037,0200,0,
+ /* 35704 */ 0321,02,017,037,0200,0,
+ /* 35710 */ 0324,02,017,037,0200,0,
+ /* 35716 */ 0273,0320,01,0367,0202,0,
+ /* 35722 */ 0273,0321,01,0367,0202,0,
+ /* 35728 */ 0273,0324,01,0367,0202,0,
+ /* 35734 */ 0273,0320,01,011,0101,0,
+ /* 35740 */ 0273,0321,01,011,0101,0,
+ /* 35746 */ 0273,0324,01,011,0101,0,
+ /* 35752 */ 0273,01,0200,0201,021,0,
+ /* 35758 */ 0273,01,0202,0201,021,0,
+ /* 35764 */ 0323,02,017,0121,0110,0,
+ /* 35770 */ 0323,02,017,0120,0110,0,
+ /* 35776 */ 0323,02,017,0122,0110,0,
+ /* 35782 */ 0323,02,017,0135,0110,0,
+ /* 35788 */ 0323,02,017,0131,0110,0,
+ /* 35794 */ 0323,02,017,0125,0110,0,
+ /* 35800 */ 0320,01,0301,0202,025,0,
+ /* 35806 */ 0321,01,0301,0202,025,0,
+ /* 35812 */ 0324,01,0301,0202,025,0,
+ /* 35818 */ 0320,01,0301,0203,025,0,
+ /* 35824 */ 0321,01,0301,0203,025,0,
+ /* 35830 */ 0324,01,0301,0203,025,0,
+ /* 35836 */ 0321,02,017,066,0200,0,
+ /* 35842 */ 0320,01,0301,0200,025,0,
+ /* 35848 */ 0321,01,0301,0200,025,0,
+ /* 35854 */ 0324,01,0301,0200,025,0,
+ /* 35860 */ 0320,01,0301,0201,025,0,
+ /* 35866 */ 0321,01,0301,0201,025,0,
+ /* 35872 */ 0324,01,0301,0201,025,0,
+ /* 35878 */ 0320,01,0301,0204,025,0,
+ /* 35884 */ 0321,01,0301,0204,025,0,
+ /* 35890 */ 0324,01,0301,0204,025,0,
+ /* 35896 */ 0320,01,0301,0207,025,0,
+ /* 35902 */ 0321,01,0301,0207,025,0,
+ /* 35908 */ 0324,01,0301,0207,025,0,
+ /* 35914 */ 0273,0320,01,031,0101,0,
+ /* 35920 */ 0273,0321,01,031,0101,0,
+ /* 35926 */ 0273,0324,01,031,0101,0,
+ /* 35932 */ 0273,01,0200,0203,021,0,
+ /* 35938 */ 0273,01,0202,0203,021,0,
+ /* 35944 */ 0360,03,017,0256,0370,0,
+ /* 35950 */ 0320,02,017,0245,0101,0,
+ /* 35956 */ 0321,02,017,0245,0101,0,
+ /* 35962 */ 0324,02,017,0245,0101,0,
+ /* 35968 */ 0320,01,0301,0205,025,0,
+ /* 35974 */ 0321,01,0301,0205,025,0,
+ /* 35980 */ 0324,01,0301,0205,025,0,
+ /* 35986 */ 0320,02,017,0255,0101,0,
+ /* 35992 */ 0321,02,017,0255,0101,0,
+ /* 35998 */ 0324,02,017,0255,0101,0,
+ /* 36004 */ 0320,02,017,0,0200,0,
+ /* 36010 */ 0321,02,017,0,0200,0,
+ /* 36016 */ 0323,02,017,0,0200,0,
+ /* 36022 */ 0324,02,017,0,0200,0,
+ /* 36028 */ 0320,02,017,01,0204,0,
+ /* 36034 */ 0321,02,017,01,0204,0,
+ /* 36040 */ 0324,02,017,01,0204,0,
+ /* 36046 */ 0320,02,017,0,0201,0,
+ /* 36052 */ 0321,02,017,0,0201,0,
+ /* 36058 */ 0324,02,017,0,0201,0,
+ /* 36064 */ 0273,0320,01,051,0101,0,
+ /* 36070 */ 0273,0321,01,051,0101,0,
+ /* 36076 */ 0273,0324,01,051,0101,0,
+ /* 36082 */ 0273,01,0200,0205,021,0,
+ /* 36088 */ 0273,01,0202,0205,021,0,
+ /* 36094 */ 0320,01,0367,0200,031,0,
+ /* 36100 */ 0321,01,0367,0200,041,0,
+ /* 36106 */ 0324,01,0367,0200,0255,0,
+ /* 36112 */ 0320,02,017,0377,0110,0,
+ /* 36118 */ 0321,02,017,0377,0110,0,
+ /* 36124 */ 0324,02,017,0377,0110,0,
+ /* 36130 */ 0320,02,017,0271,0110,0,
+ /* 36136 */ 0321,02,017,0271,0110,0,
+ /* 36142 */ 0324,02,017,0271,0110,0,
+ /* 36148 */ 0360,02,017,020,0101,0,
+ /* 36154 */ 0360,02,017,022,0110,0,
+ /* 36160 */ 0321,02,017,067,0200,0,
+ /* 36166 */ 0273,02,017,0300,0101,0,
+ /* 36172 */ 0320,02,017,0246,0110,0,
+ /* 36178 */ 0321,02,017,0246,0110,0,
+ /* 36184 */ 0272,0320,01,0207,0110,0,
+ /* 36190 */ 0272,0321,01,0207,0110,0,
+ /* 36196 */ 0272,0324,01,0207,0110,0,
+ /* 36202 */ 0272,0320,01,0207,0101,0,
+ /* 36208 */ 0272,0321,01,0207,0101,0,
+ /* 36214 */ 0272,0324,01,0207,0101,0,
+ /* 36220 */ 0273,0320,01,061,0101,0,
+ /* 36226 */ 0273,0321,01,061,0101,0,
+ /* 36232 */ 0273,0324,01,061,0101,0,
+ /* 36238 */ 0273,01,0200,0206,021,0,
+ /* 36244 */ 0273,01,0202,0206,021,0,
+ /* 36250 */ 01,017,0330,0220,0200,0,
+ /* 36256 */ 0360,02,017,0130,0110,0,
+ /* 36262 */ 0333,02,017,0130,0110,0,
+ /* 36268 */ 0360,02,017,0125,0110,0,
+ /* 36274 */ 0360,02,017,0124,0110,0,
+ /* 36280 */ 0360,02,017,057,0110,0,
+ /* 36286 */ 0360,02,017,052,0110,0,
+ /* 36292 */ 0360,02,017,055,0110,0,
+ /* 36298 */ 0360,02,017,054,0110,0,
+ /* 36304 */ 0360,02,017,0136,0110,0,
+ /* 36310 */ 0333,02,017,0136,0110,0,
+ /* 36316 */ 0360,02,017,0256,0202,0,
+ /* 36322 */ 0360,02,017,0137,0110,0,
+ /* 36328 */ 0333,02,017,0137,0110,0,
+ /* 36334 */ 0360,02,017,0135,0110,0,
+ /* 36340 */ 0333,02,017,0135,0110,0,
+ /* 36346 */ 0360,02,017,050,0110,0,
+ /* 36352 */ 0360,02,017,051,0101,0,
+ /* 36358 */ 0360,02,017,026,0110,0,
+ /* 36364 */ 0360,02,017,027,0101,0,
+ /* 36370 */ 0360,02,017,023,0101,0,
+ /* 36376 */ 0360,02,017,0120,0110,0,
+ /* 36382 */ 0360,02,017,053,0101,0,
+ /* 36388 */ 0333,02,017,020,0110,0,
+ /* 36394 */ 0333,02,017,021,0101,0,
+ /* 36400 */ 0360,02,017,020,0110,0,
+ /* 36406 */ 0360,02,017,021,0101,0,
+ /* 36412 */ 0360,02,017,0131,0110,0,
+ /* 36418 */ 0333,02,017,0131,0110,0,
+ /* 36424 */ 0360,02,017,0126,0110,0,
+ /* 36430 */ 0360,02,017,0123,0110,0,
+ /* 36436 */ 0333,02,017,0123,0110,0,
+ /* 36442 */ 0360,02,017,0122,0110,0,
+ /* 36448 */ 0333,02,017,0122,0110,0,
+ /* 36454 */ 0360,02,017,0121,0110,0,
+ /* 36460 */ 0333,02,017,0121,0110,0,
+ /* 36466 */ 0360,02,017,0256,0203,0,
+ /* 36472 */ 0360,02,017,0134,0110,0,
+ /* 36478 */ 0333,02,017,0134,0110,0,
+ /* 36484 */ 0360,02,017,056,0110,0,
+ /* 36490 */ 0360,02,017,025,0110,0,
+ /* 36496 */ 0360,02,017,024,0110,0,
+ /* 36502 */ 0360,02,017,0127,0110,0,
+ /* 36508 */ 0360,02,017,0367,0110,0,
+ /* 36514 */ 0360,02,017,0347,0101,0,
+ /* 36520 */ 0360,02,017,0327,0110,0,
+ /* 36526 */ 0361,02,017,0367,0110,0,
+ /* 36532 */ 0360,02,017,0256,0207,0,
+ /* 36538 */ 0361,02,017,0347,0101,0,
+ /* 36544 */ 0361,02,017,053,0101,0,
+ /* 36550 */ 0361,02,017,0157,0110,0,
+ /* 36556 */ 0361,02,017,0177,0101,0,
+ /* 36562 */ 0333,02,017,0157,0110,0,
+ /* 36568 */ 0333,02,017,0177,0101,0,
+ /* 36574 */ 0332,02,017,0326,0110,0,
+ /* 36580 */ 0333,02,017,0176,0110,0,
+ /* 36586 */ 0361,02,017,0326,0101,0,
+ /* 36592 */ 0333,02,017,0326,0110,0,
+ /* 36598 */ 0361,02,017,0143,0110,0,
+ /* 36604 */ 0361,02,017,0153,0110,0,
+ /* 36610 */ 0361,02,017,0147,0110,0,
+ /* 36616 */ 0361,02,017,0374,0110,0,
+ /* 36622 */ 0361,02,017,0375,0110,0,
+ /* 36628 */ 0361,02,017,0376,0110,0,
+ /* 36634 */ 0360,02,017,0324,0110,0,
+ /* 36640 */ 0361,02,017,0324,0110,0,
+ /* 36646 */ 0361,02,017,0354,0110,0,
+ /* 36652 */ 0361,02,017,0355,0110,0,
+ /* 36658 */ 0361,02,017,0334,0110,0,
+ /* 36664 */ 0361,02,017,0335,0110,0,
+ /* 36670 */ 0361,02,017,0333,0110,0,
+ /* 36676 */ 0361,02,017,0337,0110,0,
+ /* 36682 */ 0361,02,017,0340,0110,0,
+ /* 36688 */ 0361,02,017,0343,0110,0,
+ /* 36694 */ 0361,02,017,0164,0110,0,
+ /* 36700 */ 0361,02,017,0165,0110,0,
+ /* 36706 */ 0361,02,017,0166,0110,0,
+ /* 36712 */ 0361,02,017,0144,0110,0,
+ /* 36718 */ 0361,02,017,0145,0110,0,
+ /* 36724 */ 0361,02,017,0146,0110,0,
+ /* 36730 */ 0361,02,017,0365,0110,0,
+ /* 36736 */ 0361,02,017,0356,0110,0,
+ /* 36742 */ 0361,02,017,0336,0110,0,
+ /* 36748 */ 0361,02,017,0352,0110,0,
+ /* 36754 */ 0361,02,017,0332,0110,0,
+ /* 36760 */ 0361,02,017,0327,0110,0,
+ /* 36766 */ 0361,02,017,0344,0110,0,
+ /* 36772 */ 0361,02,017,0345,0110,0,
+ /* 36778 */ 0361,02,017,0325,0110,0,
+ /* 36784 */ 0361,02,017,0364,0110,0,
+ /* 36790 */ 0361,02,017,0353,0110,0,
+ /* 36796 */ 0361,02,017,0366,0110,0,
+ /* 36802 */ 0361,02,017,0361,0110,0,
+ /* 36808 */ 0361,02,017,0362,0110,0,
+ /* 36814 */ 0361,02,017,0363,0110,0,
+ /* 36820 */ 0361,02,017,0341,0110,0,
+ /* 36826 */ 0361,02,017,0342,0110,0,
+ /* 36832 */ 0361,02,017,0321,0110,0,
+ /* 36838 */ 0361,02,017,0322,0110,0,
+ /* 36844 */ 0361,02,017,0323,0110,0,
+ /* 36850 */ 0361,02,017,0370,0110,0,
+ /* 36856 */ 0361,02,017,0371,0110,0,
+ /* 36862 */ 0361,02,017,0372,0110,0,
+ /* 36868 */ 0361,02,017,0373,0110,0,
+ /* 36874 */ 0361,02,017,0350,0110,0,
+ /* 36880 */ 0361,02,017,0351,0110,0,
+ /* 36886 */ 0361,02,017,0330,0110,0,
+ /* 36892 */ 0361,02,017,0331,0110,0,
+ /* 36898 */ 0361,02,017,0150,0110,0,
+ /* 36904 */ 0361,02,017,0151,0110,0,
+ /* 36910 */ 0361,02,017,0152,0110,0,
+ /* 36916 */ 0361,02,017,0155,0110,0,
+ /* 36922 */ 0361,02,017,0140,0110,0,
+ /* 36928 */ 0361,02,017,0141,0110,0,
+ /* 36934 */ 0361,02,017,0142,0110,0,
+ /* 36940 */ 0361,02,017,0154,0110,0,
+ /* 36946 */ 0361,02,017,0357,0110,0,
+ /* 36952 */ 0361,02,017,0130,0110,0,
+ /* 36958 */ 0332,02,017,0130,0110,0,
+ /* 36964 */ 0361,02,017,0125,0110,0,
+ /* 36970 */ 0361,02,017,0124,0110,0,
+ /* 36976 */ 0361,02,017,057,0110,0,
+ /* 36982 */ 0333,02,017,0346,0110,0,
+ /* 36988 */ 0360,02,017,0133,0110,0,
+ /* 36994 */ 0332,02,017,0346,0110,0,
+ /* 37000 */ 0361,02,017,055,0110,0,
+ /* 37006 */ 0361,02,017,0132,0110,0,
+ /* 37012 */ 0361,02,017,052,0110,0,
+ /* 37018 */ 0361,02,017,0133,0110,0,
+ /* 37024 */ 0360,02,017,0132,0110,0,
+ /* 37030 */ 0332,02,017,0132,0110,0,
+ /* 37036 */ 0333,02,017,0132,0110,0,
+ /* 37042 */ 0361,02,017,054,0110,0,
+ /* 37048 */ 0361,02,017,0346,0110,0,
+ /* 37054 */ 0333,02,017,0133,0110,0,
+ /* 37060 */ 0361,02,017,0136,0110,0,
+ /* 37066 */ 0332,02,017,0136,0110,0,
+ /* 37072 */ 0361,02,017,0137,0110,0,
+ /* 37078 */ 0332,02,017,0137,0110,0,
+ /* 37084 */ 0361,02,017,0135,0110,0,
+ /* 37090 */ 0332,02,017,0135,0110,0,
+ /* 37096 */ 0361,02,017,050,0110,0,
+ /* 37102 */ 0361,02,017,051,0101,0,
+ /* 37108 */ 0361,02,017,027,0101,0,
+ /* 37114 */ 0361,02,017,026,0110,0,
+ /* 37120 */ 0361,02,017,023,0101,0,
+ /* 37126 */ 0361,02,017,022,0110,0,
+ /* 37132 */ 0361,02,017,0120,0110,0,
+ /* 37138 */ 0332,02,017,020,0110,0,
+ /* 37144 */ 0332,02,017,021,0101,0,
+ /* 37150 */ 0361,02,017,020,0110,0,
+ /* 37156 */ 0361,02,017,021,0101,0,
+ /* 37162 */ 0361,02,017,0131,0110,0,
+ /* 37168 */ 0332,02,017,0131,0110,0,
+ /* 37174 */ 0361,02,017,0126,0110,0,
+ /* 37180 */ 0361,02,017,0121,0110,0,
+ /* 37186 */ 0332,02,017,0121,0110,0,
+ /* 37192 */ 0361,02,017,0134,0110,0,
+ /* 37198 */ 0332,02,017,0134,0110,0,
+ /* 37204 */ 0361,02,017,056,0110,0,
+ /* 37210 */ 0361,02,017,025,0110,0,
+ /* 37216 */ 0361,02,017,024,0110,0,
+ /* 37222 */ 0361,02,017,0127,0110,0,
+ /* 37228 */ 0361,02,017,0320,0110,0,
+ /* 37234 */ 0332,02,017,0320,0110,0,
+ /* 37240 */ 0361,02,017,0174,0110,0,
+ /* 37246 */ 0332,02,017,0174,0110,0,
+ /* 37252 */ 0361,02,017,0175,0110,0,
+ /* 37258 */ 0332,02,017,0175,0110,0,
+ /* 37264 */ 0332,02,017,0360,0110,0,
+ /* 37270 */ 0332,02,017,022,0110,0,
+ /* 37276 */ 0333,02,017,026,0110,0,
+ /* 37282 */ 0333,02,017,022,0110,0,
+ /* 37288 */ 0361,02,017,0307,0206,0,
+ /* 37294 */ 0360,02,017,0307,0206,0,
+ /* 37300 */ 0360,02,017,0307,0207,0,
+ /* 37306 */ 0333,02,017,0307,0206,0,
+ /* 37312 */ 0361,02,017,0171,0110,0,
+ /* 37318 */ 0332,02,017,0171,0110,0,
+ /* 37324 */ 0332,02,017,053,0101,0,
+ /* 37330 */ 0333,02,017,053,0101,0,
+ /* 37336 */ 0270,01,04,01,0167,0,
+ /* 37342 */ 0270,01,0,01,0167,0,
+ /* 37348 */ 0320,02,017,0307,0206,0,
+ /* 37354 */ 0321,02,017,0307,0206,0,
+ /* 37360 */ 0324,02,017,0307,0206,0,
+ /* 37366 */ 0320,02,017,0307,0207,0,
+ /* 37372 */ 0321,02,017,0307,0207,0,
+ /* 37378 */ 0324,02,017,0307,0207,0,
+ /* 37384 */ 0336,03,017,0247,0310,0,
+ /* 37390 */ 0336,03,017,0247,0320,0,
+ /* 37396 */ 0336,03,017,0247,0330,0,
+ /* 37402 */ 0336,03,017,0247,0340,0,
+ /* 37408 */ 0336,03,017,0247,0350,0,
+ /* 37414 */ 0336,03,017,0246,0300,0,
+ /* 37420 */ 0336,03,017,0246,0310,0,
+ /* 37426 */ 0336,03,017,0246,0320,0,
+ /* 37432 */ 0322,02,0307,0370,064,0,
+ /* 37438 */ 0320,02,0307,0370,064,0,
+ /* 37444 */ 0321,02,0307,0370,064,0,
+ /* 37450 */ 0323,02,0307,0370,064,0,
+ /* 37456 */ 0333,02,017,033,0110,0,
+ /* 37462 */ 0361,02,017,032,0110,0,
+ /* 37468 */ 0361,02,017,033,0101,0,
+ /* 37474 */ 02,017,032,016,0110,0,
+ /* 37480 */ 02,017,033,015,0102,0,
+ /* 37486 */ 02,017,033,016,0101,0,
+ /* 37492 */ 03,017,070,0311,0110,0,
+ /* 37498 */ 03,017,070,0312,0110,0,
+ /* 37504 */ 03,017,070,0310,0110,0,
+ /* 37510 */ 03,017,070,0314,0110,0,
+ /* 37516 */ 03,017,070,0315,0110,0,
+ /* 37522 */ 03,017,070,0313,0110,0,
+ /* 37528 */ 0361,02,017,0256,0207,0,
+ /* 37534 */ 0361,02,017,0256,0206,0,
+ /* 37540 */ 0361,03,017,0256,0370,0,
+ /* 37546 */ 0360,02,017,034,0200,0,
+ /* 37552 */ 0360,03,017,01,0305,0,
+ /* 37558 */ 0332,02,017,0256,0206,0,
+ /* 37564 */ 0360,03,017,01,0317,0,
+ /* 37570 */ 0360,03,017,01,0327,0,
+ /* 37576 */ 0360,03,017,01,0300,0,
+ /* 37582 */ 0320,02,017,030,0200,0,
+ /* 37588 */ 0321,02,017,030,0200,0,
+ /* 37594 */ 0324,02,017,030,0200,0,
+ /* 37600 */ 0320,02,017,030,0201,0,
+ /* 37606 */ 0321,02,017,030,0201,0,
+ /* 37612 */ 0324,02,017,030,0201,0,
+ /* 37618 */ 0320,02,017,030,0202,0,
+ /* 37624 */ 0321,02,017,030,0202,0,
+ /* 37630 */ 0324,02,017,030,0202,0,
+ /* 37636 */ 0320,02,017,030,0203,0,
+ /* 37642 */ 0321,02,017,030,0203,0,
+ /* 37648 */ 0324,02,017,030,0203,0,
+ /* 37654 */ 0320,02,017,030,0204,0,
+ /* 37660 */ 0321,02,017,030,0204,0,
+ /* 37666 */ 0324,02,017,030,0204,0,
+ /* 37672 */ 0320,02,017,030,0205,0,
+ /* 37678 */ 0321,02,017,030,0205,0,
+ /* 37684 */ 0324,02,017,030,0205,0,
+ /* 37690 */ 0320,02,017,030,0206,0,
+ /* 37696 */ 0321,02,017,030,0206,0,
+ /* 37702 */ 0324,02,017,030,0206,0,
+ /* 37708 */ 0320,02,017,030,0207,0,
+ /* 37714 */ 0321,02,017,030,0207,0,
+ /* 37720 */ 0324,02,017,030,0207,0,
+ /* 37726 */ 0320,02,017,031,0200,0,
+ /* 37732 */ 0321,02,017,031,0200,0,
+ /* 37738 */ 0324,02,017,031,0200,0,
+ /* 37744 */ 0320,02,017,031,0201,0,
+ /* 37750 */ 0321,02,017,031,0201,0,
+ /* 37756 */ 0324,02,017,031,0201,0,
+ /* 37762 */ 0320,02,017,031,0202,0,
+ /* 37768 */ 0321,02,017,031,0202,0,
+ /* 37774 */ 0324,02,017,031,0202,0,
+ /* 37780 */ 0320,02,017,031,0203,0,
+ /* 37786 */ 0321,02,017,031,0203,0,
+ /* 37792 */ 0324,02,017,031,0203,0,
+ /* 37798 */ 0320,02,017,031,0204,0,
+ /* 37804 */ 0321,02,017,031,0204,0,
+ /* 37810 */ 0324,02,017,031,0204,0,
+ /* 37816 */ 0320,02,017,031,0205,0,
+ /* 37822 */ 0321,02,017,031,0205,0,
+ /* 37828 */ 0324,02,017,031,0205,0,
+ /* 37834 */ 0320,02,017,031,0206,0,
+ /* 37840 */ 0321,02,017,031,0206,0,
+ /* 37846 */ 0324,02,017,031,0206,0,
+ /* 37852 */ 0320,02,017,031,0207,0,
+ /* 37858 */ 0321,02,017,031,0207,0,
+ /* 37864 */ 0324,02,017,031,0207,0,
+ /* 37870 */ 0320,02,017,032,0200,0,
+ /* 37876 */ 0321,02,017,032,0200,0,
+ /* 37882 */ 0324,02,017,032,0200,0,
+ /* 37888 */ 0320,02,017,032,0201,0,
+ /* 37894 */ 0321,02,017,032,0201,0,
+ /* 37900 */ 0324,02,017,032,0201,0,
+ /* 37906 */ 0320,02,017,032,0202,0,
+ /* 37912 */ 0321,02,017,032,0202,0,
+ /* 37918 */ 0324,02,017,032,0202,0,
+ /* 37924 */ 0320,02,017,032,0203,0,
+ /* 37930 */ 0321,02,017,032,0203,0,
+ /* 37936 */ 0324,02,017,032,0203,0,
+ /* 37942 */ 0320,02,017,032,0204,0,
+ /* 37948 */ 0321,02,017,032,0204,0,
+ /* 37954 */ 0324,02,017,032,0204,0,
+ /* 37960 */ 0320,02,017,032,0205,0,
+ /* 37966 */ 0321,02,017,032,0205,0,
+ /* 37972 */ 0324,02,017,032,0205,0,
+ /* 37978 */ 0320,02,017,032,0206,0,
+ /* 37984 */ 0321,02,017,032,0206,0,
+ /* 37990 */ 0324,02,017,032,0206,0,
+ /* 37996 */ 0320,02,017,032,0207,0,
+ /* 38002 */ 0321,02,017,032,0207,0,
+ /* 38008 */ 0324,02,017,032,0207,0,
+ /* 38014 */ 0320,02,017,033,0200,0,
+ /* 38020 */ 0321,02,017,033,0200,0,
+ /* 38026 */ 0324,02,017,033,0200,0,
+ /* 38032 */ 0320,02,017,033,0201,0,
+ /* 38038 */ 0321,02,017,033,0201,0,
+ /* 38044 */ 0324,02,017,033,0201,0,
+ /* 38050 */ 0320,02,017,033,0202,0,
+ /* 38056 */ 0321,02,017,033,0202,0,
+ /* 38062 */ 0324,02,017,033,0202,0,
+ /* 38068 */ 0320,02,017,033,0203,0,
+ /* 38074 */ 0321,02,017,033,0203,0,
+ /* 38080 */ 0324,02,017,033,0203,0,
+ /* 38086 */ 0320,02,017,033,0204,0,
+ /* 38092 */ 0321,02,017,033,0204,0,
+ /* 38098 */ 0324,02,017,033,0204,0,
+ /* 38104 */ 0320,02,017,033,0205,0,
+ /* 38110 */ 0321,02,017,033,0205,0,
+ /* 38116 */ 0324,02,017,033,0205,0,
+ /* 38122 */ 0320,02,017,033,0206,0,
+ /* 38128 */ 0321,02,017,033,0206,0,
+ /* 38134 */ 0324,02,017,033,0206,0,
+ /* 38140 */ 0320,02,017,033,0207,0,
+ /* 38146 */ 0321,02,017,033,0207,0,
+ /* 38152 */ 0324,02,017,033,0207,0,
+ /* 38158 */ 0320,02,017,034,0200,0,
+ /* 38164 */ 0321,02,017,034,0200,0,
+ /* 38170 */ 0324,02,017,034,0200,0,
+ /* 38176 */ 0320,02,017,034,0201,0,
+ /* 38182 */ 0321,02,017,034,0201,0,
+ /* 38188 */ 0324,02,017,034,0201,0,
+ /* 38194 */ 0320,02,017,034,0202,0,
+ /* 38200 */ 0321,02,017,034,0202,0,
+ /* 38206 */ 0324,02,017,034,0202,0,
+ /* 38212 */ 0320,02,017,034,0203,0,
+ /* 38218 */ 0321,02,017,034,0203,0,
+ /* 38224 */ 0324,02,017,034,0203,0,
+ /* 38230 */ 0320,02,017,034,0204,0,
+ /* 38236 */ 0321,02,017,034,0204,0,
+ /* 38242 */ 0324,02,017,034,0204,0,
+ /* 38248 */ 0320,02,017,034,0205,0,
+ /* 38254 */ 0321,02,017,034,0205,0,
+ /* 38260 */ 0324,02,017,034,0205,0,
+ /* 38266 */ 0320,02,017,034,0206,0,
+ /* 38272 */ 0321,02,017,034,0206,0,
+ /* 38278 */ 0324,02,017,034,0206,0,
+ /* 38284 */ 0320,02,017,034,0207,0,
+ /* 38290 */ 0321,02,017,034,0207,0,
+ /* 38296 */ 0324,02,017,034,0207,0,
+ /* 38302 */ 0320,02,017,035,0200,0,
+ /* 38308 */ 0321,02,017,035,0200,0,
+ /* 38314 */ 0324,02,017,035,0200,0,
+ /* 38320 */ 0320,02,017,035,0201,0,
+ /* 38326 */ 0321,02,017,035,0201,0,
+ /* 38332 */ 0324,02,017,035,0201,0,
+ /* 38338 */ 0320,02,017,035,0202,0,
+ /* 38344 */ 0321,02,017,035,0202,0,
+ /* 38350 */ 0324,02,017,035,0202,0,
+ /* 38356 */ 0320,02,017,035,0203,0,
+ /* 38362 */ 0321,02,017,035,0203,0,
+ /* 38368 */ 0324,02,017,035,0203,0,
+ /* 38374 */ 0320,02,017,035,0204,0,
+ /* 38380 */ 0321,02,017,035,0204,0,
+ /* 38386 */ 0324,02,017,035,0204,0,
+ /* 38392 */ 0320,02,017,035,0205,0,
+ /* 38398 */ 0321,02,017,035,0205,0,
+ /* 38404 */ 0324,02,017,035,0205,0,
+ /* 38410 */ 0320,02,017,035,0206,0,
+ /* 38416 */ 0321,02,017,035,0206,0,
+ /* 38422 */ 0324,02,017,035,0206,0,
+ /* 38428 */ 0320,02,017,035,0207,0,
+ /* 38434 */ 0321,02,017,035,0207,0,
+ /* 38440 */ 0324,02,017,035,0207,0,
+ /* 38446 */ 0320,02,017,036,0200,0,
+ /* 38452 */ 0321,02,017,036,0200,0,
+ /* 38458 */ 0324,02,017,036,0200,0,
+ /* 38464 */ 0320,02,017,036,0201,0,
+ /* 38470 */ 0321,02,017,036,0201,0,
+ /* 38476 */ 0324,02,017,036,0201,0,
+ /* 38482 */ 0320,02,017,036,0202,0,
+ /* 38488 */ 0321,02,017,036,0202,0,
+ /* 38494 */ 0324,02,017,036,0202,0,
+ /* 38500 */ 0320,02,017,036,0203,0,
+ /* 38506 */ 0321,02,017,036,0203,0,
+ /* 38512 */ 0324,02,017,036,0203,0,
+ /* 38518 */ 0320,02,017,036,0204,0,
+ /* 38524 */ 0321,02,017,036,0204,0,
+ /* 38530 */ 0324,02,017,036,0204,0,
+ /* 38536 */ 0320,02,017,036,0205,0,
+ /* 38542 */ 0321,02,017,036,0205,0,
+ /* 38548 */ 0324,02,017,036,0205,0,
+ /* 38554 */ 0320,02,017,036,0206,0,
+ /* 38560 */ 0321,02,017,036,0206,0,
+ /* 38566 */ 0324,02,017,036,0206,0,
+ /* 38572 */ 0320,02,017,036,0207,0,
+ /* 38578 */ 0321,02,017,036,0207,0,
+ /* 38584 */ 0324,02,017,036,0207,0,
+ /* 38590 */ 0320,02,017,037,0201,0,
+ /* 38596 */ 0321,02,017,037,0201,0,
+ /* 38602 */ 0324,02,017,037,0201,0,
+ /* 38608 */ 0320,02,017,037,0202,0,
+ /* 38614 */ 0321,02,017,037,0202,0,
+ /* 38620 */ 0324,02,017,037,0202,0,
+ /* 38626 */ 0320,02,017,037,0203,0,
+ /* 38632 */ 0321,02,017,037,0203,0,
+ /* 38638 */ 0324,02,017,037,0203,0,
+ /* 38644 */ 0320,02,017,037,0204,0,
+ /* 38650 */ 0321,02,017,037,0204,0,
+ /* 38656 */ 0324,02,017,037,0204,0,
+ /* 38662 */ 0320,02,017,037,0205,0,
+ /* 38668 */ 0321,02,017,037,0205,0,
+ /* 38674 */ 0324,02,017,037,0205,0,
+ /* 38680 */ 0320,02,017,037,0206,0,
+ /* 38686 */ 0321,02,017,037,0206,0,
+ /* 38692 */ 0324,02,017,037,0206,0,
+ /* 38698 */ 0320,02,017,037,0207,0,
+ /* 38704 */ 0321,02,017,037,0207,0,
+ /* 38710 */ 0324,02,017,037,0207,0,
+ /* 38716 */ 0273,01,020,0101,0,
+ /* 38721 */ 0320,01,023,0110,0,
+ /* 38726 */ 0321,01,023,0110,0,
+ /* 38731 */ 0324,01,023,0110,0,
+ /* 38736 */ 0320,01,025,031,0,
+ /* 38741 */ 0321,01,025,041,0,
+ /* 38746 */ 0324,01,025,0255,0,
+ /* 38751 */ 0273,01,0,0101,0,
+ /* 38756 */ 0320,01,03,0110,0,
+ /* 38761 */ 0321,01,03,0110,0,
+ /* 38766 */ 0324,01,03,0110,0,
+ /* 38771 */ 0320,01,05,031,0,
+ /* 38776 */ 0321,01,05,041,0,
+ /* 38781 */ 0324,01,05,0255,0,
+ /* 38786 */ 0273,01,040,0101,0,
+ /* 38791 */ 0320,01,043,0110,0,
+ /* 38796 */ 0321,01,043,0110,0,
+ /* 38801 */ 0324,01,043,0110,0,
+ /* 38806 */ 0320,01,045,031,0,
+ /* 38811 */ 0321,01,045,041,0,
+ /* 38816 */ 0324,01,045,0255,0,
+ /* 38821 */ 0320,01,0142,0110,0,
+ /* 38826 */ 0321,01,0142,0110,0,
+ /* 38831 */ 0322,01,0350,064,0,
+ /* 38836 */ 0320,01,0350,064,0,
+ /* 38841 */ 0321,01,0350,064,0,
+ /* 38846 */ 0323,01,0350,064,0,
+ /* 38851 */ 0322,01,0377,0203,0,
+ /* 38856 */ 0324,01,0377,0203,0,
+ /* 38861 */ 0320,01,0377,0203,0,
+ /* 38866 */ 0321,01,0377,0203,0,
+ /* 38871 */ 0322,01,0377,0202,0,
+ /* 38876 */ 0320,01,0377,0202,0,
+ /* 38881 */ 0321,01,0377,0202,0,
+ /* 38886 */ 0323,01,0377,0202,0,
+ /* 38891 */ 0320,01,071,0101,0,
+ /* 38896 */ 0321,01,071,0101,0,
+ /* 38901 */ 0324,01,071,0101,0,
+ /* 38906 */ 0320,01,073,0110,0,
+ /* 38911 */ 0321,01,073,0110,0,
+ /* 38916 */ 0324,01,073,0110,0,
+ /* 38921 */ 0320,01,075,031,0,
+ /* 38926 */ 0321,01,075,041,0,
+ /* 38931 */ 0324,01,075,0255,0,
+ /* 38936 */ 01,0200,0207,021,0,
+ /* 38941 */ 01,0202,0207,021,0,
+ /* 38946 */ 0335,0321,01,0247,0,
+ /* 38951 */ 0335,0324,01,0247,0,
+ /* 38956 */ 0335,0320,01,0247,0,
+ /* 38961 */ 02,017,0246,0101,0,
+ /* 38966 */ 0273,01,0376,0201,0,
+ /* 38971 */ 0320,01,0367,0206,0,
+ /* 38976 */ 0321,01,0367,0206,0,
+ /* 38981 */ 0324,01,0367,0206,0,
+ /* 38986 */ 01,0310,030,025,0,
+ /* 38991 */ 01,0334,010,0300,0,
+ /* 38996 */ 01,0330,010,0300,0,
+ /* 39001 */ 01,0330,011,0300,0,
+ /* 39006 */ 01,0336,010,0300,0,
+ /* 39011 */ 0341,02,0333,0342,0,
+ /* 39016 */ 01,0332,010,0300,0,
+ /* 39021 */ 01,0332,011,0300,0,
+ /* 39026 */ 01,0332,010,0320,0,
+ /* 39031 */ 01,0332,011,0320,0,
+ /* 39036 */ 01,0332,010,0310,0,
+ /* 39041 */ 01,0332,011,0310,0,
+ /* 39046 */ 01,0333,010,0300,0,
+ /* 39051 */ 01,0333,011,0300,0,
+ /* 39056 */ 01,0333,010,0320,0,
+ /* 39061 */ 01,0333,011,0320,0,
+ /* 39066 */ 01,0333,010,0310,0,
+ /* 39071 */ 01,0333,011,0310,0,
+ /* 39076 */ 01,0333,010,0330,0,
+ /* 39081 */ 01,0333,011,0330,0,
+ /* 39086 */ 01,0332,010,0330,0,
+ /* 39091 */ 01,0332,011,0330,0,
+ /* 39096 */ 01,0330,010,0320,0,
+ /* 39101 */ 01,0330,011,0320,0,
+ /* 39106 */ 01,0333,010,0360,0,
+ /* 39111 */ 01,0333,011,0360,0,
+ /* 39116 */ 01,0337,010,0360,0,
+ /* 39121 */ 01,0337,011,0360,0,
+ /* 39126 */ 01,0330,010,0330,0,
+ /* 39131 */ 01,0330,011,0330,0,
+ /* 39136 */ 0341,02,0333,0341,0,
+ /* 39141 */ 01,0334,010,0370,0,
+ /* 39146 */ 01,0330,010,0360,0,
+ /* 39151 */ 01,0330,011,0360,0,
+ /* 39156 */ 01,0336,010,0370,0,
+ /* 39161 */ 01,0334,010,0360,0,
+ /* 39166 */ 01,0330,010,0370,0,
+ /* 39171 */ 01,0330,011,0370,0,
+ /* 39176 */ 01,0336,010,0360,0,
+ /* 39181 */ 0341,02,0333,0340,0,
+ /* 39186 */ 01,0335,010,0300,0,
+ /* 39191 */ 01,0337,010,0300,0,
+ /* 39196 */ 0341,02,0333,0343,0,
+ /* 39201 */ 01,0331,010,0300,0,
+ /* 39206 */ 01,0334,010,0310,0,
+ /* 39211 */ 01,0330,010,0310,0,
+ /* 39216 */ 01,0330,011,0310,0,
+ /* 39221 */ 01,0336,010,0310,0,
+ /* 39226 */ 0341,01,0335,0206,0,
+ /* 39231 */ 01,0335,010,0320,0,
+ /* 39236 */ 0341,01,0331,0207,0,
+ /* 39241 */ 0341,01,0331,0206,0,
+ /* 39246 */ 01,0335,010,0330,0,
+ /* 39251 */ 0341,01,0335,0207,0,
+ /* 39256 */ 0341,02,0337,0340,0,
+ /* 39261 */ 01,0334,010,0350,0,
+ /* 39266 */ 01,0330,010,0340,0,
+ /* 39271 */ 01,0330,011,0340,0,
+ /* 39276 */ 01,0336,010,0350,0,
+ /* 39281 */ 01,0334,010,0340,0,
+ /* 39286 */ 01,0330,010,0350,0,
+ /* 39291 */ 01,0330,011,0350,0,
+ /* 39296 */ 01,0336,010,0340,0,
+ /* 39301 */ 01,0335,010,0340,0,
+ /* 39306 */ 01,0335,011,0340,0,
+ /* 39311 */ 01,0333,010,0350,0,
+ /* 39316 */ 01,0333,011,0350,0,
+ /* 39321 */ 01,0337,010,0350,0,
+ /* 39326 */ 01,0337,011,0350,0,
+ /* 39331 */ 01,0335,010,0350,0,
+ /* 39336 */ 01,0335,011,0350,0,
+ /* 39341 */ 01,0331,010,0310,0,
+ /* 39346 */ 01,0331,011,0310,0,
+ /* 39351 */ 0320,01,0367,0207,0,
+ /* 39356 */ 0321,01,0367,0207,0,
+ /* 39361 */ 0324,01,0367,0207,0,
+ /* 39366 */ 0320,01,0367,0205,0,
+ /* 39371 */ 0321,01,0367,0205,0,
+ /* 39376 */ 0324,01,0367,0205,0,
+ /* 39381 */ 0320,01,0345,025,0,
+ /* 39386 */ 0321,01,0345,025,0,
+ /* 39391 */ 0273,01,0376,0200,0,
+ /* 39396 */ 02,017,01,0207,0,
+ /* 39401 */ 0310,01,0343,050,0,
+ /* 39406 */ 0311,01,0343,050,0,
+ /* 39411 */ 0313,01,0343,050,0,
+ /* 39416 */ 0371,01,0353,050,0,
+ /* 39421 */ 0322,01,0351,064,0,
+ /* 39426 */ 0320,01,0351,064,0,
+ /* 39431 */ 0321,01,0351,064,0,
+ /* 39436 */ 0323,01,0351,064,0,
+ /* 39441 */ 0322,01,0377,0205,0,
+ /* 39446 */ 0324,01,0377,0205,0,
+ /* 39451 */ 0320,01,0377,0205,0,
+ /* 39456 */ 0321,01,0377,0205,0,
+ /* 39461 */ 0322,01,0377,0204,0,
+ /* 39466 */ 0320,01,0377,0204,0,
+ /* 39471 */ 0321,01,0377,0204,0,
+ /* 39476 */ 0323,01,0377,0204,0,
+ /* 39481 */ 0320,01,0305,0110,0,
+ /* 39486 */ 0321,01,0305,0110,0,
+ /* 39491 */ 0320,01,0215,0110,0,
+ /* 39496 */ 0321,01,0215,0110,0,
+ /* 39501 */ 0324,01,0215,0110,0,
+ /* 39506 */ 0320,01,0304,0110,0,
+ /* 39511 */ 0321,01,0304,0110,0,
+ /* 39516 */ 02,017,01,0202,0,
+ /* 39521 */ 02,017,01,0203,0,
+ /* 39526 */ 02,017,0,0202,0,
+ /* 39531 */ 02,017,01,0206,0,
+ /* 39536 */ 0312,01,0342,050,0,
+ /* 39541 */ 0310,01,0342,050,0,
+ /* 39546 */ 0311,01,0342,050,0,
+ /* 39551 */ 0313,01,0342,050,0,
+ /* 39556 */ 0312,01,0341,050,0,
+ /* 39561 */ 0310,01,0341,050,0,
+ /* 39566 */ 0311,01,0341,050,0,
+ /* 39571 */ 0313,01,0341,050,0,
+ /* 39576 */ 0312,01,0340,050,0,
+ /* 39581 */ 0310,01,0340,050,0,
+ /* 39586 */ 0311,01,0340,050,0,
+ /* 39591 */ 0313,01,0340,050,0,
+ /* 39596 */ 02,017,0,0203,0,
+ /* 39601 */ 03,017,01,0310,0,
+ /* 39606 */ 03,017,01,0372,0,
+ /* 39611 */ 0320,01,0214,0101,0,
+ /* 39616 */ 0321,01,0214,0101,0,
+ /* 39621 */ 0323,01,0214,0101,0,
+ /* 39626 */ 0324,01,0214,0101,0,
+ /* 39631 */ 0323,01,0216,0110,0,
+ /* 39636 */ 0320,01,0216,0110,0,
+ /* 39641 */ 0321,01,0216,0110,0,
+ /* 39646 */ 0324,01,0216,0110,0,
+ /* 39651 */ 0320,01,0241,045,0,
+ /* 39656 */ 0321,01,0241,045,0,
+ /* 39661 */ 0324,01,0241,045,0,
+ /* 39666 */ 0320,01,0243,044,0,
+ /* 39671 */ 0321,01,0243,044,0,
+ /* 39676 */ 0324,01,0243,044,0,
+ /* 39681 */ 02,017,044,0101,0,
+ /* 39686 */ 02,017,046,0110,0,
+ /* 39691 */ 0271,01,0210,0101,0,
+ /* 39696 */ 0320,01,0213,0110,0,
+ /* 39701 */ 0321,01,0213,0110,0,
+ /* 39706 */ 0324,01,0213,0110,0,
+ /* 39711 */ 0320,010,0270,031,0,
+ /* 39716 */ 0321,010,0270,041,0,
+ /* 39721 */ 0323,010,0270,041,0,
+ /* 39726 */ 0324,010,0270,055,0,
+ /* 39731 */ 0324,01,0143,0110,0,
+ /* 39736 */ 0320,01,0367,0204,0,
+ /* 39741 */ 0321,01,0367,0204,0,
+ /* 39746 */ 0324,01,0367,0204,0,
+ /* 39751 */ 03,017,01,0311,0,
+ /* 39756 */ 03,017,01,0373,0,
+ /* 39761 */ 0273,01,0366,0203,0,
+ /* 39766 */ 0314,0326,01,0220,0,
+ /* 39771 */ 0273,01,0366,0202,0,
+ /* 39776 */ 0273,01,010,0101,0,
+ /* 39781 */ 0320,01,013,0110,0,
+ /* 39786 */ 0321,01,013,0110,0,
+ /* 39791 */ 0324,01,013,0110,0,
+ /* 39796 */ 0320,01,015,031,0,
+ /* 39801 */ 0321,01,015,041,0,
+ /* 39806 */ 0324,01,015,0255,0,
+ /* 39811 */ 0320,01,0347,024,0,
+ /* 39816 */ 0321,01,0347,024,0,
+ /* 39821 */ 0320,01,0217,0200,0,
+ /* 39826 */ 0321,01,0217,0200,0,
+ /* 39831 */ 0323,01,0217,0200,0,
+ /* 39836 */ 02,017,015,0200,0,
+ /* 39841 */ 02,017,015,0201,0,
+ /* 39846 */ 0320,01,0377,0206,0,
+ /* 39851 */ 0321,01,0377,0206,0,
+ /* 39856 */ 0323,01,0377,0206,0,
+ /* 39861 */ 0320,01,0152,0274,0,
+ /* 39866 */ 0320,01,0150,030,0,
+ /* 39871 */ 0321,01,0152,0274,0,
+ /* 39876 */ 0321,01,0150,040,0,
+ /* 39881 */ 0323,01,0152,0274,0,
+ /* 39886 */ 0323,01,0150,0254,0,
+ /* 39891 */ 01,0300,0202,025,0,
+ /* 39896 */ 0320,01,0321,0202,0,
+ /* 39901 */ 0320,01,0323,0202,0,
+ /* 39906 */ 0321,01,0321,0202,0,
+ /* 39911 */ 0321,01,0323,0202,0,
+ /* 39916 */ 0324,01,0321,0202,0,
+ /* 39921 */ 0324,01,0323,0202,0,
+ /* 39926 */ 01,0300,0203,025,0,
+ /* 39931 */ 0320,01,0321,0203,0,
+ /* 39936 */ 0320,01,0323,0203,0,
+ /* 39941 */ 0321,01,0321,0203,0,
+ /* 39946 */ 0321,01,0323,0203,0,
+ /* 39951 */ 0324,01,0321,0203,0,
+ /* 39956 */ 0324,01,0323,0203,0,
+ /* 39961 */ 03,017,01,0371,0,
+ /* 39966 */ 0320,01,0312,030,0,
+ /* 39971 */ 0320,01,0302,030,0,
+ /* 39976 */ 0321,01,0302,030,0,
+ /* 39981 */ 0321,01,0312,030,0,
+ /* 39986 */ 0323,01,0302,030,0,
+ /* 39991 */ 0324,01,0312,030,0,
+ /* 39996 */ 01,0300,0200,025,0,
+ /* 40001 */ 0320,01,0321,0200,0,
+ /* 40006 */ 0320,01,0323,0200,0,
+ /* 40011 */ 0321,01,0321,0200,0,
+ /* 40016 */ 0321,01,0323,0200,0,
+ /* 40021 */ 0324,01,0321,0200,0,
+ /* 40026 */ 0324,01,0323,0200,0,
+ /* 40031 */ 01,0300,0201,025,0,
+ /* 40036 */ 0320,01,0321,0201,0,
+ /* 40041 */ 0320,01,0323,0201,0,
+ /* 40046 */ 0321,01,0321,0201,0,
+ /* 40051 */ 0321,01,0323,0201,0,
+ /* 40056 */ 0324,01,0321,0201,0,
+ /* 40061 */ 0324,01,0323,0201,0,
+ /* 40066 */ 02,017,0173,0200,0,
+ /* 40071 */ 02,017,0175,0200,0,
+ /* 40076 */ 01,0300,0204,025,0,
+ /* 40081 */ 0320,01,0321,0204,0,
+ /* 40086 */ 0320,01,0323,0204,0,
+ /* 40091 */ 0321,01,0321,0204,0,
+ /* 40096 */ 0321,01,0323,0204,0,
+ /* 40101 */ 0324,01,0321,0204,0,
+ /* 40106 */ 0324,01,0323,0204,0,
+ /* 40111 */ 01,0300,0207,025,0,
+ /* 40116 */ 0320,01,0321,0207,0,
+ /* 40121 */ 0320,01,0323,0207,0,
+ /* 40126 */ 0321,01,0321,0207,0,
+ /* 40131 */ 0321,01,0323,0207,0,
+ /* 40136 */ 0324,01,0321,0207,0,
+ /* 40141 */ 0324,01,0323,0207,0,
+ /* 40146 */ 0273,01,030,0101,0,
+ /* 40151 */ 0320,01,033,0110,0,
+ /* 40156 */ 0321,01,033,0110,0,
+ /* 40161 */ 0324,01,033,0110,0,
+ /* 40166 */ 0320,01,035,031,0,
+ /* 40171 */ 0321,01,035,041,0,
+ /* 40176 */ 0324,01,035,0255,0,
+ /* 40181 */ 0335,0321,01,0257,0,
+ /* 40186 */ 0335,0324,01,0257,0,
+ /* 40191 */ 0335,0320,01,0257,0,
+ /* 40196 */ 02,017,01,0200,0,
+ /* 40201 */ 01,0300,0205,025,0,
+ /* 40206 */ 0320,01,0321,0205,0,
+ /* 40211 */ 0320,01,0323,0205,0,
+ /* 40216 */ 0321,01,0321,0205,0,
+ /* 40221 */ 0321,01,0323,0205,0,
+ /* 40226 */ 0324,01,0321,0205,0,
+ /* 40231 */ 0324,01,0323,0205,0,
+ /* 40236 */ 02,017,01,0201,0,
+ /* 40241 */ 03,017,01,0336,0,
+ /* 40246 */ 0273,01,050,0101,0,
+ /* 40251 */ 0320,01,053,0110,0,
+ /* 40256 */ 0321,01,053,0110,0,
+ /* 40261 */ 0324,01,053,0110,0,
+ /* 40266 */ 0320,01,055,031,0,
+ /* 40271 */ 0321,01,055,041,0,
+ /* 40276 */ 0324,01,055,0255,0,
+ /* 40281 */ 02,017,0172,0200,0,
+ /* 40286 */ 02,017,0174,0200,0,
+ /* 40291 */ 03,017,01,0370,0,
+ /* 40296 */ 0320,01,0205,0101,0,
+ /* 40301 */ 0321,01,0205,0101,0,
+ /* 40306 */ 0324,01,0205,0101,0,
+ /* 40311 */ 0320,01,0205,0110,0,
+ /* 40316 */ 0321,01,0205,0110,0,
+ /* 40321 */ 0324,01,0205,0110,0,
+ /* 40326 */ 0320,01,0251,031,0,
+ /* 40331 */ 0321,01,0251,041,0,
+ /* 40336 */ 0324,01,0251,0255,0,
+ /* 40341 */ 01,0366,0200,021,0,
+ /* 40346 */ 02,017,0,0204,0,
+ /* 40351 */ 02,017,0,0205,0,
+ /* 40356 */ 0272,01,0206,0110,0,
+ /* 40361 */ 0272,01,0206,0101,0,
+ /* 40366 */ 0273,01,060,0101,0,
+ /* 40371 */ 0320,01,063,0110,0,
+ /* 40376 */ 0321,01,063,0110,0,
+ /* 40381 */ 0324,01,063,0110,0,
+ /* 40386 */ 0320,01,065,031,0,
+ /* 40391 */ 0321,01,065,041,0,
+ /* 40396 */ 0324,01,065,0255,0,
+ /* 40401 */ 0370,0330,0160,050,0,
+ /* 40406 */ 03,017,01,0320,0,
+ /* 40411 */ 03,017,01,0321,0,
+ /* 40416 */ 03,017,01,0335,0,
+ /* 40421 */ 03,017,01,0334,0,
+ /* 40426 */ 03,017,01,0301,0,
+ /* 40431 */ 03,017,01,0324,0,
+ /* 40436 */ 03,017,01,0302,0,
+ /* 40441 */ 03,017,01,0332,0,
+ /* 40446 */ 03,017,01,0331,0,
+ /* 40451 */ 03,017,01,0303,0,
+ /* 40456 */ 03,017,01,0330,0,
+ /* 40461 */ 03,017,01,0333,0,
+ /* 40466 */ 03,017,01,0304,0,
+ /* 40471 */ 03,017,01,0312,0,
+ /* 40476 */ 03,017,01,0313,0,
+ /* 40481 */ 03,017,0247,0300,0,
+ /* 40486 */ 02,0306,0370,020,0,
+ /* 40491 */ 03,017,01,0325,0,
+ /* 40496 */ 03,017,01,0326,0,
+ /* 40501 */ 02,017,015,0202,0,
+ /* 40506 */ 03,017,01,0356,0,
+ /* 40511 */ 03,017,01,0357,0,
+ /* 40516 */ 03,017,01,0374,0,
+ /* 40521 */ 0333,02,017,011,0,
+ /* 40526 */ 02,0325,012,0,
+ /* 40530 */ 01,0325,024,0,
+ /* 40534 */ 02,0324,012,0,
+ /* 40538 */ 01,0324,024,0,
+ /* 40542 */ 01,024,021,0,
+ /* 40546 */ 01,04,021,0,
+ /* 40550 */ 01,044,021,0,
+ /* 40554 */ 02,017,072,0,
+ /* 40558 */ 02,017,073,0,
+ /* 40562 */ 0320,01,0230,0,
+ /* 40566 */ 0321,01,0231,0,
+ /* 40570 */ 0324,01,0230,0,
+ /* 40574 */ 02,017,06,0,
+ /* 40578 */ 01,070,0101,0,
+ /* 40582 */ 01,074,021,0,
+ /* 40586 */ 0335,01,0246,0,
+ /* 40590 */ 02,017,0242,0,
+ /* 40594 */ 02,017,075,0,
+ /* 40598 */ 02,017,074,0,
+ /* 40602 */ 0324,01,0231,0,
+ /* 40606 */ 0320,01,0231,0,
+ /* 40610 */ 0321,01,0230,0,
+ /* 40614 */ 0320,010,0110,0,
+ /* 40618 */ 0321,010,0110,0,
+ /* 40622 */ 01,0366,0206,0,
+ /* 40626 */ 02,017,071,0,
+ /* 40630 */ 02,017,0167,0,
+ /* 40634 */ 02,0331,0360,0,
+ /* 40638 */ 02,0331,0341,0,
+ /* 40642 */ 01,0330,0200,0,
+ /* 40646 */ 01,0334,0200,0,
+ /* 40650 */ 02,0336,0301,0,
+ /* 40654 */ 01,0337,0204,0,
+ /* 40658 */ 01,0337,0206,0,
+ /* 40662 */ 02,0331,0340,0,
+ /* 40666 */ 02,0332,0301,0,
+ /* 40670 */ 02,0332,0321,0,
+ /* 40674 */ 02,0332,0311,0,
+ /* 40678 */ 02,0333,0301,0,
+ /* 40682 */ 02,0333,0321,0,
+ /* 40686 */ 02,0333,0311,0,
+ /* 40690 */ 02,0333,0331,0,
+ /* 40694 */ 02,0332,0331,0,
+ /* 40698 */ 01,0330,0202,0,
+ /* 40702 */ 01,0334,0202,0,
+ /* 40706 */ 02,0330,0321,0,
+ /* 40710 */ 02,0333,0361,0,
+ /* 40714 */ 02,0337,0361,0,
+ /* 40718 */ 01,0330,0203,0,
+ /* 40722 */ 01,0334,0203,0,
+ /* 40726 */ 02,0330,0331,0,
+ /* 40730 */ 02,0336,0331,0,
+ /* 40734 */ 02,0331,0377,0,
+ /* 40738 */ 02,0331,0366,0,
+ /* 40742 */ 01,0330,0206,0,
+ /* 40746 */ 01,0334,0206,0,
+ /* 40750 */ 02,0336,0371,0,
+ /* 40754 */ 01,0330,0207,0,
+ /* 40758 */ 01,0334,0207,0,
+ /* 40762 */ 02,0336,0361,0,
+ /* 40766 */ 02,017,016,0,
+ /* 40770 */ 02,0335,0301,0,
+ /* 40774 */ 02,0337,0301,0,
+ /* 40778 */ 01,0332,0200,0,
+ /* 40782 */ 01,0336,0200,0,
+ /* 40786 */ 01,0332,0202,0,
+ /* 40790 */ 01,0336,0202,0,
+ /* 40794 */ 01,0332,0203,0,
+ /* 40798 */ 01,0336,0203,0,
+ /* 40802 */ 01,0332,0206,0,
+ /* 40806 */ 01,0336,0206,0,
+ /* 40810 */ 01,0332,0207,0,
+ /* 40814 */ 01,0336,0207,0,
+ /* 40818 */ 01,0333,0200,0,
+ /* 40822 */ 01,0337,0200,0,
+ /* 40826 */ 01,0337,0205,0,
+ /* 40830 */ 01,0332,0201,0,
+ /* 40834 */ 01,0336,0201,0,
+ /* 40838 */ 02,0331,0367,0,
+ /* 40842 */ 01,0333,0202,0,
+ /* 40846 */ 01,0337,0202,0,
+ /* 40850 */ 01,0333,0203,0,
+ /* 40854 */ 01,0337,0203,0,
+ /* 40858 */ 01,0337,0207,0,
+ /* 40862 */ 01,0337,0201,0,
+ /* 40866 */ 01,0333,0201,0,
+ /* 40870 */ 01,0335,0201,0,
+ /* 40874 */ 01,0332,0204,0,
+ /* 40878 */ 01,0336,0204,0,
+ /* 40882 */ 01,0332,0205,0,
+ /* 40886 */ 01,0336,0205,0,
+ /* 40890 */ 01,0331,0200,0,
+ /* 40894 */ 01,0335,0200,0,
+ /* 40898 */ 01,0333,0205,0,
+ /* 40902 */ 02,0331,0301,0,
+ /* 40906 */ 02,0331,0350,0,
+ /* 40910 */ 01,0331,0205,0,
+ /* 40914 */ 01,0331,0204,0,
+ /* 40918 */ 02,0331,0352,0,
+ /* 40922 */ 02,0331,0351,0,
+ /* 40926 */ 02,0331,0354,0,
+ /* 40930 */ 02,0331,0355,0,
+ /* 40934 */ 02,0331,0353,0,
+ /* 40938 */ 02,0331,0356,0,
+ /* 40942 */ 01,0330,0201,0,
+ /* 40946 */ 01,0334,0201,0,
+ /* 40950 */ 02,0336,0311,0,
+ /* 40954 */ 02,0331,0320,0,
+ /* 40958 */ 02,0331,0363,0,
+ /* 40962 */ 02,0331,0370,0,
+ /* 40966 */ 02,0331,0365,0,
+ /* 40970 */ 02,0331,0362,0,
+ /* 40974 */ 02,0331,0374,0,
+ /* 40978 */ 01,0335,0204,0,
+ /* 40982 */ 02,0331,0375,0,
+ /* 40986 */ 02,0333,0344,0,
+ /* 40990 */ 02,0331,0376,0,
+ /* 40994 */ 02,0331,0373,0,
+ /* 40998 */ 02,0331,0372,0,
+ /* 41002 */ 01,0331,0202,0,
+ /* 41006 */ 01,0335,0202,0,
+ /* 41010 */ 02,0335,0321,0,
+ /* 41014 */ 01,0331,0203,0,
+ /* 41018 */ 01,0335,0203,0,
+ /* 41022 */ 01,0333,0207,0,
+ /* 41026 */ 02,0335,0331,0,
+ /* 41030 */ 01,0330,0204,0,
+ /* 41034 */ 01,0334,0204,0,
+ /* 41038 */ 02,0336,0351,0,
+ /* 41042 */ 01,0330,0205,0,
+ /* 41046 */ 01,0334,0205,0,
+ /* 41050 */ 02,0336,0341,0,
+ /* 41054 */ 02,0331,0344,0,
+ /* 41058 */ 02,0335,0341,0,
+ /* 41062 */ 02,0333,0351,0,
+ /* 41066 */ 02,0337,0351,0,
+ /* 41070 */ 02,0335,0351,0,
+ /* 41074 */ 02,0332,0351,0,
+ /* 41078 */ 02,0331,0345,0,
+ /* 41082 */ 02,0331,0311,0,
+ /* 41086 */ 02,0331,0364,0,
+ /* 41090 */ 02,0331,0361,0,
+ /* 41094 */ 02,0331,0371,0,
+ /* 41098 */ 01,0366,0207,0,
+ /* 41102 */ 01,0366,0205,0,
+ /* 41106 */ 01,0344,025,0,
+ /* 41110 */ 0320,01,0355,0,
+ /* 41114 */ 0321,01,0355,0,
+ /* 41118 */ 0320,010,0100,0,
+ /* 41122 */ 0321,010,0100,0,
+ /* 41126 */ 0321,01,0155,0,
+ /* 41130 */ 0320,01,0155,0,
+ /* 41134 */ 01,0315,024,0,
+ /* 41138 */ 02,017,010,0,
+ /* 41142 */ 0322,01,0317,0,
+ /* 41146 */ 0321,01,0317,0,
+ /* 41150 */ 0324,01,0317,0,
+ /* 41154 */ 0320,01,0317,0,
+ /* 41158 */ 02,017,07,0,
+ /* 41162 */ 02,017,05,0,
+ /* 41166 */ 0321,01,0255,0,
+ /* 41170 */ 0324,01,0255,0,
+ /* 41174 */ 0320,01,0255,0,
+ /* 41178 */ 01,0240,045,0,
+ /* 41182 */ 01,0242,044,0,
+ /* 41186 */ 01,0212,0110,0,
+ /* 41190 */ 010,0260,021,0,
+ /* 41194 */ 0321,01,0245,0,
+ /* 41198 */ 0324,01,0245,0,
+ /* 41202 */ 0320,01,0245,0,
+ /* 41206 */ 01,0366,0204,0,
+ /* 41210 */ 01,014,021,0,
+ /* 41214 */ 01,0346,024,0,
+ /* 41218 */ 0320,01,0357,0,
+ /* 41222 */ 0321,01,0357,0,
+ /* 41226 */ 0321,01,0157,0,
+ /* 41230 */ 0320,01,0157,0,
+ /* 41234 */ 0333,01,0220,0,
+ /* 41238 */ 0320,010,0130,0,
+ /* 41242 */ 0321,010,0130,0,
+ /* 41246 */ 0323,010,0130,0,
+ /* 41250 */ 02,017,0241,0,
+ /* 41254 */ 02,017,0251,0,
+ /* 41258 */ 0322,01,0141,0,
+ /* 41262 */ 0321,01,0141,0,
+ /* 41266 */ 0320,01,0141,0,
+ /* 41270 */ 0322,01,0235,0,
+ /* 41274 */ 0321,01,0235,0,
+ /* 41278 */ 0320,01,0235,0,
+ /* 41282 */ 0320,010,0120,0,
+ /* 41286 */ 0321,010,0120,0,
+ /* 41290 */ 0323,010,0120,0,
+ /* 41294 */ 02,017,0240,0,
+ /* 41298 */ 02,017,0250,0,
+ /* 41302 */ 0322,01,0140,0,
+ /* 41306 */ 0321,01,0140,0,
+ /* 41310 */ 0320,01,0140,0,
+ /* 41314 */ 0322,01,0234,0,
+ /* 41318 */ 0321,01,0234,0,
+ /* 41322 */ 0320,01,0234,0,
+ /* 41326 */ 01,0320,0202,0,
+ /* 41330 */ 01,0322,0202,0,
+ /* 41334 */ 01,0320,0203,0,
+ /* 41338 */ 01,0322,0203,0,
+ /* 41342 */ 02,017,062,0,
+ /* 41346 */ 02,017,063,0,
+ /* 41350 */ 02,017,061,0,
+ /* 41354 */ 0320,01,0303,0,
+ /* 41358 */ 0320,01,0313,0,
+ /* 41362 */ 0321,01,0303,0,
+ /* 41366 */ 0321,01,0313,0,
+ /* 41370 */ 0323,01,0303,0,
+ /* 41374 */ 0324,01,0313,0,
+ /* 41378 */ 01,0320,0200,0,
+ /* 41382 */ 01,0322,0200,0,
+ /* 41386 */ 01,0320,0201,0,
+ /* 41390 */ 01,0322,0201,0,
+ /* 41394 */ 02,017,0252,0,
+ /* 41398 */ 01,0320,0204,0,
+ /* 41402 */ 01,0322,0204,0,
+ /* 41406 */ 01,0320,0207,0,
+ /* 41410 */ 01,0322,0207,0,
+ /* 41414 */ 01,034,021,0,
+ /* 41418 */ 0335,01,0256,0,
+ /* 41422 */ 01,0320,0205,0,
+ /* 41426 */ 01,0322,0205,0,
+ /* 41430 */ 02,017,070,0,
+ /* 41434 */ 02,017,0176,0,
+ /* 41438 */ 0321,01,0253,0,
+ /* 41442 */ 0324,01,0253,0,
+ /* 41446 */ 0320,01,0253,0,
+ /* 41450 */ 01,054,021,0,
+ /* 41454 */ 02,017,064,0,
+ /* 41458 */ 02,017,065,0,
+ /* 41462 */ 01,0204,0101,0,
+ /* 41466 */ 01,0204,0110,0,
+ /* 41470 */ 01,0250,021,0,
+ /* 41474 */ 02,017,0377,0,
+ /* 41478 */ 02,017,0271,0,
+ /* 41482 */ 02,017,013,0,
+ /* 41486 */ 02,017,060,0,
+ /* 41490 */ 0320,011,0220,0,
+ /* 41494 */ 0321,011,0220,0,
+ /* 41498 */ 0324,011,0220,0,
+ /* 41502 */ 0320,010,0220,0,
+ /* 41506 */ 0321,010,0220,0,
+ /* 41510 */ 0324,010,0220,0,
+ /* 41514 */ 0321,01,0220,0,
+ /* 41518 */ 01,064,021,0,
+ /* 41522 */ 02,017,067,0,
+ /* 41526 */ 01,067,0,
+ /* 41529 */ 01,077,0,
+ /* 41532 */ 01,0365,0,
+ /* 41535 */ 01,047,0,
+ /* 41538 */ 01,057,0,
+ /* 41541 */ 01,0364,0,
+ /* 41544 */ 01,0361,0,
+ /* 41547 */ 01,0354,0,
+ /* 41550 */ 01,0154,0,
+ /* 41553 */ 01,0314,0,
+ /* 41556 */ 01,0316,0,
+ /* 41559 */ 01,0237,0,
+ /* 41562 */ 01,0254,0,
+ /* 41565 */ 01,0156,0,
+ /* 41568 */ 01,0375,0,
+};
+
+/*
+ * Bytecode frequencies (including reuse):
+ *
+ * 0:6606 | 40: 2 | 100: 49 | 140: 0 | 200: 120 | 240: 638 | 300: 0 | 340: 1
+ * 1:5983 | 41: 37 | 101: 577 | 141: 0 | 201: 92 | 241: 849 | 301: 0 | 341: 10
+ * 2:1045 | 42: 12 | 102: 14 | 142: 0 | 202: 110 | 242: 0 | 302: 0 | 342: 0
+ * 3: 204 | 43: 0 | 103: 0 | 143: 0 | 203: 89 | 243: 0 | 303: 0 | 343: 0
+ * 4: 0 | 44: 4 | 104: 0 | 144: 0 | 204: 121 | 244: 0 | 304: 0 | 344: 0
+ * 5: 0 | 45: 4 | 105: 0 | 145: 0 | 205: 85 | 245: 0 | 305: 0 | 345: 0
+ * 6: 0 | 46: 0 | 106: 0 | 146: 0 | 206: 109 | 246: 0 | 306: 0 | 346: 0
+ * 7: 0 | 47: 0 | 107: 0 | 147: 0 | 207: 88 | 247: 0 | 307: 0 | 347: 0
+ * 10: 73 | 50: 28 | 110:2684 | 150: 0 | 210: 8 | 250: 748 | 310: 9 | 350: 0
+ * 11: 26 | 51: 0 | 111: 0 | 151: 0 | 211: 14 | 251: 0 | 311: 9 | 351: 0
+ * 12: 0 | 52: 0 | 112: 0 | 152: 0 | 212: 19 | 252: 0 | 312: 5 | 352: 0
+ * 13: 0 | 53: 0 | 113: 0 | 153: 0 | 213: 9 | 253: 0 | 313: 9 | 353: 0
+ * 14: 0 | 54: 0 | 114: 0 | 154: 0 | 214: 15 | 254: 2 | 314: 1 | 354: 0
+ * 15: 2 | 55: 1 | 115: 0 | 155: 0 | 215: 2 | 255: 23 | 315: 0 | 355: 0
+ * 16: 4 | 56: 0 | 116: 0 | 156: 0 | 216: 19 | 256: 2 | 316: 0 | 356: 0
+ * 17: 0 | 57: 0 | 117: 0 | 157: 0 | 217: 7 | 257: 0 | 317: 19 | 357: 0
+ * 20: 2 | 60: 0 | 120:1804 | 160: 0 | 220: 0 | 260: 800 | 320: 347 | 360: 194
+ * 21: 107 | 61: 0 | 121: 0 | 161: 0 | 221: 0 | 261: 979 | 321: 356 | 361: 260
+ * 22: 386 | 62: 0 | 122: 0 | 162: 0 | 222: 0 | 262: 38 | 322: 23 | 362: 0
+ * 23: 206 | 63: 0 | 123: 0 | 163: 0 | 223: 0 | 263: 0 | 323: 132 | 363: 0
+ * 24: 6 | 64: 33 | 124: 0 | 164: 0 | 224: 0 | 264: 0 | 324: 324 | 364: 0
+ * 25: 67 | 65: 0 | 125: 0 | 165: 0 | 225: 0 | 265: 0 | 325: 1 | 365: 0
+ * 26: 68 | 66: 0 | 126: 0 | 166: 0 | 226: 0 | 266: 0 | 326: 13 | 366: 0
+ * 27: 1 | 67: 0 | 127: 0 | 167: 0 | 227: 0 | 267: 0 | 327: 0 | 367: 0
+ * 30: 24 | 70: 0 | 130: 35 | 170: 0 | 230: 0 | 270: 320 | 330: 17 | 370: 1
+ * 31: 36 | 71: 0 | 131: 0 | 171: 0 | 231: 0 | 271: 12 | 331: 6 | 371: 1
+ * 32: 4 | 72: 0 | 132: 0 | 172: 0 | 232: 0 | 272: 8 | 332: 57 | 372: 0
+ * 33: 0 | 73: 0 | 133: 0 | 173: 0 | 233: 0 | 273: 183 | 333: 78 | 373: 1
+ * 34: 6 | 74: 6 | 134: 0 | 174: 0 | 234: 0 | 274: 6 | 334: 2 | 374: 30
+ * 35: 2 | 75: 0 | 135: 0 | 175: 35 | 235: 0 | 275: 94 | 335: 8 | 375: 26
+ * 36: 0 | 76: 0 | 136: 0 | 176: 88 | 236: 0 | 276: 12 | 336: 8 | 376: 24
+ * 37: 0 | 77: 0 | 137: 0 | 177: 53 | 237: 0 | 277: 0 | 337: 0 | 377: 0
+ */
diff --git a/x86/insnsd.c b/x86/insnsd.c
new file mode 100644
index 00000000..e0dda2e9
--- /dev/null
+++ b/x86/insnsd.c
@@ -0,0 +1,24536 @@
+/* This file auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include "nasm.h"
+#include "insns.h"
+
+static const struct itemplate instrux[] = {
+ /* 0 */ {I_RESB, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40664, 0},
+ /* 1 */ {I_AAA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41526, 1},
+ /* 2 */ {I_AAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40526, 1},
+ /* 3 */ {I_AAD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40530, 2},
+ /* 4 */ {I_AAM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40534, 1},
+ /* 5 */ {I_AAM, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40538, 2},
+ /* 6 */ {I_AAS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41529, 1},
+ /* 7 */ {I_ADC, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38716, 3},
+ /* 8 */ {I_ADC, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38717, 0},
+ /* 9 */ {I_ADC, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35008, 3},
+ /* 10 */ {I_ADC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35009, 0},
+ /* 11 */ {I_ADC, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35014, 4},
+ /* 12 */ {I_ADC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35015, 5},
+ /* 13 */ {I_ADC, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35020, 6},
+ /* 14 */ {I_ADC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35021, 7},
+ /* 15 */ {I_ADC, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+29201, 8},
+ /* 16 */ {I_ADC, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+29201, 0},
+ /* 17 */ {I_ADC, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38721, 8},
+ /* 18 */ {I_ADC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38721, 0},
+ /* 19 */ {I_ADC, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38726, 9},
+ /* 20 */ {I_ADC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38726, 5},
+ /* 21 */ {I_ADC, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38731, 10},
+ /* 22 */ {I_ADC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38731, 7},
+ /* 23 */ {I_ADC, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25740, 11},
+ /* 24 */ {I_ADC, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25747, 12},
+ /* 25 */ {I_ADC, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25754, 13},
+ /* 26 */ {I_ADC, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40542, 8},
+ /* 27 */ {I_ADC, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38736, 8},
+ /* 28 */ {I_ADC, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38741, 9},
+ /* 29 */ {I_ADC, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38746, 10},
+ /* 30 */ {I_ADC, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35026, 3},
+ /* 31 */ {I_ADC, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25761, 3},
+ /* 32 */ {I_ADC, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25768, 4},
+ /* 33 */ {I_ADC, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25775, 6},
+ /* 34 */ {I_ADC, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25761, 3},
+ /* 35 */ {I_ADC, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25768, 4},
+ /* 36 */ {I_ADD, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38751, 3},
+ /* 37 */ {I_ADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38752, 0},
+ /* 38 */ {I_ADD, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35038, 3},
+ /* 39 */ {I_ADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35039, 0},
+ /* 40 */ {I_ADD, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35044, 4},
+ /* 41 */ {I_ADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35045, 5},
+ /* 42 */ {I_ADD, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35050, 6},
+ /* 43 */ {I_ADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35051, 7},
+ /* 44 */ {I_ADD, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+32974, 8},
+ /* 45 */ {I_ADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+32974, 0},
+ /* 46 */ {I_ADD, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38756, 8},
+ /* 47 */ {I_ADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38756, 0},
+ /* 48 */ {I_ADD, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38761, 9},
+ /* 49 */ {I_ADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38761, 5},
+ /* 50 */ {I_ADD, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38766, 10},
+ /* 51 */ {I_ADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38766, 7},
+ /* 52 */ {I_ADD, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25782, 11},
+ /* 53 */ {I_ADD, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25789, 12},
+ /* 54 */ {I_ADD, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25796, 13},
+ /* 55 */ {I_ADD, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40546, 8},
+ /* 56 */ {I_ADD, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38771, 8},
+ /* 57 */ {I_ADD, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38776, 9},
+ /* 58 */ {I_ADD, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38781, 10},
+ /* 59 */ {I_ADD, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35056, 3},
+ /* 60 */ {I_ADD, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25803, 3},
+ /* 61 */ {I_ADD, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25810, 4},
+ /* 62 */ {I_ADD, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25817, 6},
+ /* 63 */ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35056, 3},
+ /* 64 */ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25803, 3},
+ /* 65 */ {I_ADD, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25810, 4},
+ /* 66 */ {I_AND, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38786, 3},
+ /* 67 */ {I_AND, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38787, 0},
+ /* 68 */ {I_AND, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35068, 3},
+ /* 69 */ {I_AND, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35069, 0},
+ /* 70 */ {I_AND, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35074, 4},
+ /* 71 */ {I_AND, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35075, 5},
+ /* 72 */ {I_AND, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35080, 6},
+ /* 73 */ {I_AND, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35081, 7},
+ /* 74 */ {I_AND, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33254, 8},
+ /* 75 */ {I_AND, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33254, 0},
+ /* 76 */ {I_AND, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38791, 8},
+ /* 77 */ {I_AND, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38791, 0},
+ /* 78 */ {I_AND, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38796, 9},
+ /* 79 */ {I_AND, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38796, 5},
+ /* 80 */ {I_AND, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38801, 10},
+ /* 81 */ {I_AND, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38801, 7},
+ /* 82 */ {I_AND, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25824, 11},
+ /* 83 */ {I_AND, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25831, 12},
+ /* 84 */ {I_AND, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+25838, 13},
+ /* 85 */ {I_AND, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40550, 8},
+ /* 86 */ {I_AND, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38806, 8},
+ /* 87 */ {I_AND, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38811, 9},
+ /* 88 */ {I_AND, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38816, 10},
+ /* 89 */ {I_AND, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35086, 3},
+ /* 90 */ {I_AND, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25845, 3},
+ /* 91 */ {I_AND, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25852, 4},
+ /* 92 */ {I_AND, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25859, 6},
+ /* 93 */ {I_AND, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35086, 3},
+ /* 94 */ {I_AND, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25845, 3},
+ /* 95 */ {I_AND, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25852, 4},
+ /* 96 */ {I_ARPL, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25280, 15},
+ /* 97 */ {I_ARPL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25280, 16},
+ /* 98 */ {I_BOUND, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38821, 18},
+ /* 99 */ {I_BOUND, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38826, 19},
+ /* 100 */ {I_BSF, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25866, 9},
+ /* 101 */ {I_BSF, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25866, 5},
+ /* 102 */ {I_BSF, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25873, 9},
+ /* 103 */ {I_BSF, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25873, 5},
+ /* 104 */ {I_BSF, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25880, 10},
+ /* 105 */ {I_BSF, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25880, 7},
+ /* 106 */ {I_BSR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25887, 9},
+ /* 107 */ {I_BSR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25887, 5},
+ /* 108 */ {I_BSR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25894, 9},
+ /* 109 */ {I_BSR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25894, 5},
+ /* 110 */ {I_BSR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+25901, 10},
+ /* 111 */ {I_BSR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25901, 7},
+ /* 112 */ {I_BSWAP, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35098, 20},
+ /* 113 */ {I_BSWAP, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35104, 7},
+ /* 114 */ {I_BT, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35110, 9},
+ /* 115 */ {I_BT, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35110, 5},
+ /* 116 */ {I_BT, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35116, 9},
+ /* 117 */ {I_BT, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35116, 5},
+ /* 118 */ {I_BT, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35122, 10},
+ /* 119 */ {I_BT, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35122, 7},
+ /* 120 */ {I_BT, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25908, 21},
+ /* 121 */ {I_BT, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25915, 21},
+ /* 122 */ {I_BT, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+25922, 22},
+ /* 123 */ {I_BTC, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25929, 4},
+ /* 124 */ {I_BTC, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25930, 5},
+ /* 125 */ {I_BTC, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25936, 4},
+ /* 126 */ {I_BTC, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25937, 5},
+ /* 127 */ {I_BTC, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25943, 6},
+ /* 128 */ {I_BTC, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25944, 7},
+ /* 129 */ {I_BTC, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8340, 23},
+ /* 130 */ {I_BTC, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8348, 23},
+ /* 131 */ {I_BTC, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8356, 24},
+ /* 132 */ {I_BTR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25950, 4},
+ /* 133 */ {I_BTR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25951, 5},
+ /* 134 */ {I_BTR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25957, 4},
+ /* 135 */ {I_BTR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25958, 5},
+ /* 136 */ {I_BTR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25964, 6},
+ /* 137 */ {I_BTR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25965, 7},
+ /* 138 */ {I_BTR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8364, 23},
+ /* 139 */ {I_BTR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8372, 23},
+ /* 140 */ {I_BTR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8380, 24},
+ /* 141 */ {I_BTS, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25971, 4},
+ /* 142 */ {I_BTS, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25972, 5},
+ /* 143 */ {I_BTS, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25978, 4},
+ /* 144 */ {I_BTS, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25979, 5},
+ /* 145 */ {I_BTS, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25985, 6},
+ /* 146 */ {I_BTS, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+25986, 7},
+ /* 147 */ {I_BTS, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8388, 23},
+ /* 148 */ {I_BTS, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8396, 23},
+ /* 149 */ {I_BTS, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+8404, 24},
+ /* 150 */ {I_CALL, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38831, 25},
+ /* 151 */ {I_CALL, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38836, 26},
+ /* 152 */ {I_CALL, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38841, 27},
+ /* 153 */ {I_CALL, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38846, 28},
+ /* 154 */ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35146, 1},
+ /* 155 */ {I_CALL, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35152, 1},
+ /* 156 */ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35152, 1},
+ /* 157 */ {I_CALL, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35158, 19},
+ /* 158 */ {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35158, 19},
+ /* 159 */ {I_CALL, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38851, 1},
+ /* 160 */ {I_CALL, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38856, 7},
+ /* 161 */ {I_CALL, 1, {MEMORY|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38861, 0},
+ /* 162 */ {I_CALL, 1, {MEMORY|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38866, 5},
+ /* 163 */ {I_CALL, 1, {MEMORY|BITS64|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38856, 7},
+ /* 164 */ {I_CALL, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38871, 25},
+ /* 165 */ {I_CALL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38876, 26},
+ /* 166 */ {I_CALL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38881, 27},
+ /* 167 */ {I_CALL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38886, 28},
+ /* 168 */ {I_CBW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40562, 0},
+ /* 169 */ {I_CDQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40566, 5},
+ /* 170 */ {I_CDQE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40570, 7},
+ /* 171 */ {I_CLC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40293, 0},
+ /* 172 */ {I_CLD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40518, 0},
+ /* 173 */ {I_CLI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39608, 0},
+ /* 174 */ {I_CLTS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40574, 29},
+ /* 175 */ {I_CMC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41532, 0},
+ /* 176 */ {I_CMP, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40578, 8},
+ /* 177 */ {I_CMP, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40578, 0},
+ /* 178 */ {I_CMP, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38891, 8},
+ /* 179 */ {I_CMP, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38891, 0},
+ /* 180 */ {I_CMP, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38896, 9},
+ /* 181 */ {I_CMP, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38896, 5},
+ /* 182 */ {I_CMP, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38901, 10},
+ /* 183 */ {I_CMP, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38901, 7},
+ /* 184 */ {I_CMP, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33212, 8},
+ /* 185 */ {I_CMP, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33212, 0},
+ /* 186 */ {I_CMP, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38906, 8},
+ /* 187 */ {I_CMP, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+38906, 0},
+ /* 188 */ {I_CMP, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38911, 9},
+ /* 189 */ {I_CMP, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+38911, 5},
+ /* 190 */ {I_CMP, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+38916, 10},
+ /* 191 */ {I_CMP, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+38916, 7},
+ /* 192 */ {I_CMP, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35164, 0},
+ /* 193 */ {I_CMP, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35170, 5},
+ /* 194 */ {I_CMP, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35176, 7},
+ /* 195 */ {I_CMP, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40582, 8},
+ /* 196 */ {I_CMP, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38921, 8},
+ /* 197 */ {I_CMP, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38926, 9},
+ /* 198 */ {I_CMP, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38931, 10},
+ /* 199 */ {I_CMP, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38936, 8},
+ /* 200 */ {I_CMP, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35182, 8},
+ /* 201 */ {I_CMP, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35188, 9},
+ /* 202 */ {I_CMP, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35194, 10},
+ /* 203 */ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+38936, 8},
+ /* 204 */ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35182, 8},
+ /* 205 */ {I_CMP, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35188, 9},
+ /* 206 */ {I_CMPSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40586, 0},
+ /* 207 */ {I_CMPSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38946, 5},
+ /* 208 */ {I_CMPSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38951, 7},
+ /* 209 */ {I_CMPSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38956, 0},
+ /* 210 */ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35200, 31},
+ /* 211 */ {I_CMPXCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35201, 32},
+ /* 212 */ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25992, 31},
+ /* 213 */ {I_CMPXCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+25993, 32},
+ /* 214 */ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+25999, 31},
+ /* 215 */ {I_CMPXCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26000, 32},
+ /* 216 */ {I_CMPXCHG, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26006, 6},
+ /* 217 */ {I_CMPXCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26007, 7},
+ /* 218 */ {I_CMPXCHG8B, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26013, 35},
+ /* 219 */ {I_CMPXCHG16B, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35218, 13},
+ /* 220 */ {I_CPUID, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40590, 32},
+ /* 221 */ {I_CPU_READ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40594, 36},
+ /* 222 */ {I_CPU_WRITE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40598, 36},
+ /* 223 */ {I_CQO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40602, 7},
+ /* 224 */ {I_CWD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40606, 0},
+ /* 225 */ {I_CWDE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40610, 5},
+ /* 226 */ {I_DAA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41535, 1},
+ /* 227 */ {I_DAS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41538, 1},
+ /* 228 */ {I_DEC, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40614, 1},
+ /* 229 */ {I_DEC, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40618, 19},
+ /* 230 */ {I_DEC, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38966, 11},
+ /* 231 */ {I_DEC, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35224, 11},
+ /* 232 */ {I_DEC, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35230, 12},
+ /* 233 */ {I_DEC, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35236, 13},
+ /* 234 */ {I_DIV, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40622, 0},
+ /* 235 */ {I_DIV, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38971, 0},
+ /* 236 */ {I_DIV, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38976, 5},
+ /* 237 */ {I_DIV, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38981, 7},
+ /* 238 */ {I_DMINT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40626, 37},
+ /* 239 */ {I_EMMS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40630, 38},
+ /* 240 */ {I_ENTER, 2, {IMMEDIATE,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+38986, 39},
+ /* 241 */ {I_EQU, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41570, 0},
+ /* 242 */ {I_EQU, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41570, 0},
+ /* 243 */ {I_F2XM1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40634, 40},
+ /* 244 */ {I_FABS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40638, 40},
+ /* 245 */ {I_FADD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40642, 40},
+ /* 246 */ {I_FADD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40646, 40},
+ /* 247 */ {I_FADD, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38991, 40},
+ /* 248 */ {I_FADD, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38996, 40},
+ /* 249 */ {I_FADD, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38991, 40},
+ /* 250 */ {I_FADD, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39001, 40},
+ /* 251 */ {I_FADDP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39006, 40},
+ /* 252 */ {I_FADDP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39006, 40},
+ /* 253 */ {I_FBLD, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40654, 40},
+ /* 254 */ {I_FBLD, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40654, 40},
+ /* 255 */ {I_FBSTP, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40658, 40},
+ /* 256 */ {I_FBSTP, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40658, 40},
+ /* 257 */ {I_FCHS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40662, 40},
+ /* 258 */ {I_FCLEX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39011, 40},
+ /* 259 */ {I_FCMOVB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39016, 41},
+ /* 260 */ {I_FCMOVB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39021, 41},
+ /* 261 */ {I_FCMOVBE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39026, 41},
+ /* 262 */ {I_FCMOVBE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39031, 41},
+ /* 263 */ {I_FCMOVE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39036, 41},
+ /* 264 */ {I_FCMOVE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39041, 41},
+ /* 265 */ {I_FCMOVNB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39046, 41},
+ /* 266 */ {I_FCMOVNB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39051, 41},
+ /* 267 */ {I_FCMOVNBE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39056, 41},
+ /* 268 */ {I_FCMOVNBE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39061, 41},
+ /* 269 */ {I_FCMOVNE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39066, 41},
+ /* 270 */ {I_FCMOVNE, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39071, 41},
+ /* 271 */ {I_FCMOVNU, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39076, 41},
+ /* 272 */ {I_FCMOVNU, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39081, 41},
+ /* 273 */ {I_FCMOVU, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39086, 41},
+ /* 274 */ {I_FCMOVU, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39091, 41},
+ /* 275 */ {I_FCOM, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40698, 40},
+ /* 276 */ {I_FCOM, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40702, 40},
+ /* 277 */ {I_FCOM, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39096, 40},
+ /* 278 */ {I_FCOM, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39101, 40},
+ /* 279 */ {I_FCOMI, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39106, 41},
+ /* 280 */ {I_FCOMI, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39111, 41},
+ /* 281 */ {I_FCOMIP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39116, 41},
+ /* 282 */ {I_FCOMIP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39121, 41},
+ /* 283 */ {I_FCOMP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40718, 40},
+ /* 284 */ {I_FCOMP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40722, 40},
+ /* 285 */ {I_FCOMP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39126, 40},
+ /* 286 */ {I_FCOMP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39131, 40},
+ /* 287 */ {I_FCOMPP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40730, 40},
+ /* 288 */ {I_FCOS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40734, 42},
+ /* 289 */ {I_FDECSTP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40738, 40},
+ /* 290 */ {I_FDISI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39136, 40},
+ /* 291 */ {I_FDIV, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40742, 40},
+ /* 292 */ {I_FDIV, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40746, 40},
+ /* 293 */ {I_FDIV, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39141, 40},
+ /* 294 */ {I_FDIV, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39146, 40},
+ /* 295 */ {I_FDIV, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39141, 40},
+ /* 296 */ {I_FDIV, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39151, 40},
+ /* 297 */ {I_FDIVP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39156, 40},
+ /* 298 */ {I_FDIVP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39156, 40},
+ /* 299 */ {I_FDIVR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40754, 40},
+ /* 300 */ {I_FDIVR, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40758, 40},
+ /* 301 */ {I_FDIVR, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39161, 40},
+ /* 302 */ {I_FDIVR, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39161, 40},
+ /* 303 */ {I_FDIVR, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39166, 40},
+ /* 304 */ {I_FDIVR, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39171, 40},
+ /* 305 */ {I_FDIVRP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39176, 40},
+ /* 306 */ {I_FDIVRP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39176, 40},
+ /* 307 */ {I_FEMMS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40766, 43},
+ /* 308 */ {I_FENI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39181, 40},
+ /* 309 */ {I_FFREE, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39186, 40},
+ /* 310 */ {I_FFREE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40770, 40},
+ /* 311 */ {I_FFREEP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39191, 44},
+ /* 312 */ {I_FFREEP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40774, 44},
+ /* 313 */ {I_FIADD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40778, 40},
+ /* 314 */ {I_FIADD, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40782, 40},
+ /* 315 */ {I_FICOM, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40786, 40},
+ /* 316 */ {I_FICOM, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40790, 40},
+ /* 317 */ {I_FICOMP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40794, 40},
+ /* 318 */ {I_FICOMP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40798, 40},
+ /* 319 */ {I_FIDIV, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40802, 40},
+ /* 320 */ {I_FIDIV, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40806, 40},
+ /* 321 */ {I_FIDIVR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40810, 40},
+ /* 322 */ {I_FIDIVR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40814, 40},
+ /* 323 */ {I_FILD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40818, 40},
+ /* 324 */ {I_FILD, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40822, 40},
+ /* 325 */ {I_FILD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40826, 40},
+ /* 326 */ {I_FIMUL, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40830, 40},
+ /* 327 */ {I_FIMUL, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40834, 40},
+ /* 328 */ {I_FINCSTP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40838, 40},
+ /* 329 */ {I_FINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39196, 40},
+ /* 330 */ {I_FIST, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40842, 40},
+ /* 331 */ {I_FIST, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40846, 40},
+ /* 332 */ {I_FISTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40850, 40},
+ /* 333 */ {I_FISTP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40854, 40},
+ /* 334 */ {I_FISTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40858, 40},
+ /* 335 */ {I_FISTTP, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40862, 45},
+ /* 336 */ {I_FISTTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40866, 45},
+ /* 337 */ {I_FISTTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40870, 45},
+ /* 338 */ {I_FISUB, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40874, 40},
+ /* 339 */ {I_FISUB, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40878, 40},
+ /* 340 */ {I_FISUBR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40882, 40},
+ /* 341 */ {I_FISUBR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40886, 40},
+ /* 342 */ {I_FLD, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40890, 40},
+ /* 343 */ {I_FLD, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40894, 40},
+ /* 344 */ {I_FLD, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40898, 40},
+ /* 345 */ {I_FLD, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39201, 40},
+ /* 346 */ {I_FLD1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40906, 40},
+ /* 347 */ {I_FLDCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40910, 46},
+ /* 348 */ {I_FLDENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40914, 40},
+ /* 349 */ {I_FLDL2E, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40918, 40},
+ /* 350 */ {I_FLDL2T, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40922, 40},
+ /* 351 */ {I_FLDLG2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40926, 40},
+ /* 352 */ {I_FLDLN2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40930, 40},
+ /* 353 */ {I_FLDPI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40934, 40},
+ /* 354 */ {I_FLDZ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40938, 40},
+ /* 355 */ {I_FMUL, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40942, 40},
+ /* 356 */ {I_FMUL, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40946, 40},
+ /* 357 */ {I_FMUL, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39206, 40},
+ /* 358 */ {I_FMUL, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39206, 40},
+ /* 359 */ {I_FMUL, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39211, 40},
+ /* 360 */ {I_FMUL, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39216, 40},
+ /* 361 */ {I_FMULP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39221, 40},
+ /* 362 */ {I_FMULP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39221, 40},
+ /* 363 */ {I_FNCLEX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39012, 40},
+ /* 364 */ {I_FNDISI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39137, 40},
+ /* 365 */ {I_FNENI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39182, 40},
+ /* 366 */ {I_FNINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39197, 40},
+ /* 367 */ {I_FNOP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40954, 40},
+ /* 368 */ {I_FNSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39227, 40},
+ /* 369 */ {I_FNSTCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39237, 46},
+ /* 370 */ {I_FNSTENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39242, 40},
+ /* 371 */ {I_FNSTSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39252, 46},
+ /* 372 */ {I_FNSTSW, 1, {REG_AX,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39257, 47},
+ /* 373 */ {I_FPATAN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40958, 40},
+ /* 374 */ {I_FPREM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40962, 40},
+ /* 375 */ {I_FPREM1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40966, 42},
+ /* 376 */ {I_FPTAN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40970, 40},
+ /* 377 */ {I_FRNDINT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40974, 40},
+ /* 378 */ {I_FRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40978, 40},
+ /* 379 */ {I_FSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39226, 40},
+ /* 380 */ {I_FSCALE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40982, 40},
+ /* 381 */ {I_FSETPM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40986, 47},
+ /* 382 */ {I_FSIN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40990, 42},
+ /* 383 */ {I_FSINCOS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40994, 42},
+ /* 384 */ {I_FSQRT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40998, 40},
+ /* 385 */ {I_FST, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41002, 40},
+ /* 386 */ {I_FST, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41006, 40},
+ /* 387 */ {I_FST, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39231, 40},
+ /* 388 */ {I_FSTCW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39236, 46},
+ /* 389 */ {I_FSTENV, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39241, 40},
+ /* 390 */ {I_FSTP, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41014, 40},
+ /* 391 */ {I_FSTP, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41018, 40},
+ /* 392 */ {I_FSTP, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41022, 40},
+ /* 393 */ {I_FSTP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39246, 40},
+ /* 394 */ {I_FSTSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39251, 46},
+ /* 395 */ {I_FSTSW, 1, {REG_AX,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39256, 47},
+ /* 396 */ {I_FSUB, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41030, 40},
+ /* 397 */ {I_FSUB, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41034, 40},
+ /* 398 */ {I_FSUB, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39261, 40},
+ /* 399 */ {I_FSUB, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39261, 40},
+ /* 400 */ {I_FSUB, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39266, 40},
+ /* 401 */ {I_FSUB, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39271, 40},
+ /* 402 */ {I_FSUBP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39276, 40},
+ /* 403 */ {I_FSUBP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39276, 40},
+ /* 404 */ {I_FSUBR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41042, 40},
+ /* 405 */ {I_FSUBR, 1, {MEMORY|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41046, 40},
+ /* 406 */ {I_FSUBR, 1, {FPUREG|TO,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39281, 40},
+ /* 407 */ {I_FSUBR, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39281, 40},
+ /* 408 */ {I_FSUBR, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39286, 40},
+ /* 409 */ {I_FSUBR, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39291, 40},
+ /* 410 */ {I_FSUBRP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39296, 40},
+ /* 411 */ {I_FSUBRP, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39296, 40},
+ /* 412 */ {I_FTST, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41054, 40},
+ /* 413 */ {I_FUCOM, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39301, 42},
+ /* 414 */ {I_FUCOM, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39306, 42},
+ /* 415 */ {I_FUCOMI, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39311, 41},
+ /* 416 */ {I_FUCOMI, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39316, 41},
+ /* 417 */ {I_FUCOMIP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39321, 41},
+ /* 418 */ {I_FUCOMIP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39326, 41},
+ /* 419 */ {I_FUCOMP, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39331, 42},
+ /* 420 */ {I_FUCOMP, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39336, 42},
+ /* 421 */ {I_FUCOMPP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41074, 42},
+ /* 422 */ {I_FXAM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41078, 40},
+ /* 423 */ {I_FXCH, 1, {FPUREG,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39341, 40},
+ /* 424 */ {I_FXCH, 2, {FPUREG,FPU0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39341, 40},
+ /* 425 */ {I_FXCH, 2, {FPU0,FPUREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39346, 40},
+ /* 426 */ {I_FXTRACT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41086, 40},
+ /* 427 */ {I_FYL2X, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41090, 40},
+ /* 428 */ {I_FYL2XP1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41094, 40},
+ /* 429 */ {I_HLT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41541, 48},
+ /* 430 */ {I_IDIV, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41098, 0},
+ /* 431 */ {I_IDIV, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39351, 0},
+ /* 432 */ {I_IDIV, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39356, 5},
+ /* 433 */ {I_IDIV, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39361, 7},
+ /* 434 */ {I_IMUL, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41102, 0},
+ /* 435 */ {I_IMUL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39366, 0},
+ /* 436 */ {I_IMUL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39371, 5},
+ /* 437 */ {I_IMUL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39376, 7},
+ /* 438 */ {I_IMUL, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35242, 9},
+ /* 439 */ {I_IMUL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35242, 5},
+ /* 440 */ {I_IMUL, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35248, 9},
+ /* 441 */ {I_IMUL, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35248, 5},
+ /* 442 */ {I_IMUL, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35254, 10},
+ /* 443 */ {I_IMUL, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35254, 7},
+ /* 444 */ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 52},
+ /* 445 */ {I_IMUL, 3, {REG_GPR|BITS16,MEMORY,IMMEDIATE|BITS16,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 52},
+ /* 446 */ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35260, 39},
+ /* 447 */ {I_IMUL, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE|BITS16,0,0}, NO_DECORATOR, nasm_bytecodes+35266, 39},
+ /* 448 */ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 9},
+ /* 449 */ {I_IMUL, 3, {REG_GPR|BITS32,MEMORY,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 9},
+ /* 450 */ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35272, 5},
+ /* 451 */ {I_IMUL, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35278, 5},
+ /* 452 */ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 10},
+ /* 453 */ {I_IMUL, 3, {REG_GPR|BITS64,MEMORY,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35290, 10},
+ /* 454 */ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+35284, 7},
+ /* 455 */ {I_IMUL, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+35290, 7},
+ /* 456 */ {I_IMUL, 2, {REG_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35302, 39},
+ /* 457 */ {I_IMUL, 2, {REG_GPR|BITS16,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35308, 39},
+ /* 458 */ {I_IMUL, 2, {REG_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35314, 5},
+ /* 459 */ {I_IMUL, 2, {REG_GPR|BITS32,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35320, 5},
+ /* 460 */ {I_IMUL, 2, {REG_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35326, 7},
+ /* 461 */ {I_IMUL, 2, {REG_GPR|BITS64,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35332, 7},
+ /* 462 */ {I_IN, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41106, 53},
+ /* 463 */ {I_IN, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39381, 53},
+ /* 464 */ {I_IN, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39386, 21},
+ /* 465 */ {I_IN, 2, {REG_AL,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41547, 0},
+ /* 466 */ {I_IN, 2, {REG_AX,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41110, 0},
+ /* 467 */ {I_IN, 2, {REG_EAX,REG_DX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41114, 5},
+ /* 468 */ {I_INC, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41118, 1},
+ /* 469 */ {I_INC, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41122, 19},
+ /* 470 */ {I_INC, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39391, 11},
+ /* 471 */ {I_INC, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35338, 11},
+ /* 472 */ {I_INC, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35344, 12},
+ /* 473 */ {I_INC, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35350, 13},
+ /* 474 */ {I_INSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41550, 39},
+ /* 475 */ {I_INSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41126, 5},
+ /* 476 */ {I_INSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41130, 39},
+ /* 477 */ {I_INT, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41134, 53},
+ /* 478 */ {I_INT1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 5},
+ /* 479 */ {I_INT3, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41553, 0},
+ /* 480 */ {I_INTO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41556, 1},
+ /* 481 */ {I_INVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41138, 54},
+ /* 482 */ {I_INVPCID, 2, {REG_GPR|BITS32,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+26020, 55},
+ /* 483 */ {I_INVPCID, 2, {REG_GPR|BITS64,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+26020, 56},
+ /* 484 */ {I_INVLPG, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39396, 54},
+ /* 485 */ {I_INVLPGA, 2, {REG_AX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35356, 57},
+ /* 486 */ {I_INVLPGA, 2, {REG_EAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35362, 58},
+ /* 487 */ {I_INVLPGA, 2, {REG_RAX,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26027, 59},
+ /* 488 */ {I_INVLPGA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35363, 58},
+ /* 489 */ {I_IRET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41142, 0},
+ /* 490 */ {I_IRETD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41146, 5},
+ /* 491 */ {I_IRETQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41150, 7},
+ /* 492 */ {I_IRETW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41154, 0},
+ /* 493 */ {I_JCXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39401, 1},
+ /* 494 */ {I_JECXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39406, 5},
+ /* 495 */ {I_JRCXZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39411, 7},
+ /* 496 */ {I_JMP, 1, {IMMEDIATE|SHORT,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39417, 0},
+ /* 497 */ {I_JMP, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39421, 25},
+ /* 498 */ {I_JMP, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39426, 26},
+ /* 499 */ {I_JMP, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39431, 27},
+ /* 500 */ {I_JMP, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39436, 28},
+ /* 501 */ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35386, 1},
+ /* 502 */ {I_JMP, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35392, 1},
+ /* 503 */ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35392, 1},
+ /* 504 */ {I_JMP, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35398, 19},
+ /* 505 */ {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35398, 19},
+ /* 506 */ {I_JMP, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39441, 1},
+ /* 507 */ {I_JMP, 1, {MEMORY|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39446, 7},
+ /* 508 */ {I_JMP, 1, {MEMORY|BITS16|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39451, 0},
+ /* 509 */ {I_JMP, 1, {MEMORY|BITS32|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39456, 5},
+ /* 510 */ {I_JMP, 1, {MEMORY|BITS64|FAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39446, 7},
+ /* 511 */ {I_JMP, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39461, 25},
+ /* 512 */ {I_JMP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39466, 26},
+ /* 513 */ {I_JMP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39471, 27},
+ /* 514 */ {I_JMP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39476, 28},
+ /* 515 */ {I_JMPE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35404, 60},
+ /* 516 */ {I_JMPE, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35410, 60},
+ /* 517 */ {I_JMPE, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35416, 60},
+ /* 518 */ {I_JMPE, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35422, 60},
+ /* 519 */ {I_JMPE, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35428, 60},
+ /* 520 */ {I_LAHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41559, 0},
+ /* 521 */ {I_LAR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 61},
+ /* 522 */ {I_LAR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 62},
+ /* 523 */ {I_LAR, 2, {REG_GPR|BITS16,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35434, 63},
+ /* 524 */ {I_LAR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 65},
+ /* 525 */ {I_LAR, 2, {REG_GPR|BITS32,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 63},
+ /* 526 */ {I_LAR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35440, 63},
+ /* 527 */ {I_LAR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 66},
+ /* 528 */ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ /* 529 */ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ /* 530 */ {I_LAR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35446, 64},
+ /* 531 */ {I_LDS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39481, 1},
+ /* 532 */ {I_LDS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39486, 19},
+ /* 533 */ {I_LEA, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39491, 0},
+ /* 534 */ {I_LEA, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39496, 5},
+ /* 535 */ {I_LEA, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39501, 7},
+ /* 536 */ {I_LEAVE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39753, 39},
+ /* 537 */ {I_LES, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39506, 1},
+ /* 538 */ {I_LES, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39511, 19},
+ /* 539 */ {I_LFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35452, 59},
+ /* 540 */ {I_LFS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35458, 5},
+ /* 541 */ {I_LFS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35464, 5},
+ /* 542 */ {I_LFS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35470, 7},
+ /* 543 */ {I_LGDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39516, 29},
+ /* 544 */ {I_LGS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35476, 5},
+ /* 545 */ {I_LGS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35482, 5},
+ /* 546 */ {I_LGS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35488, 7},
+ /* 547 */ {I_LIDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39521, 29},
+ /* 548 */ {I_LLDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ /* 549 */ {I_LLDT, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ /* 550 */ {I_LLDT, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39526, 67},
+ /* 551 */ {I_LMSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ /* 552 */ {I_LMSW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ /* 553 */ {I_LMSW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39531, 29},
+ /* 554 */ {I_LODSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41562, 0},
+ /* 555 */ {I_LODSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41166, 5},
+ /* 556 */ {I_LODSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41170, 7},
+ /* 557 */ {I_LODSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41174, 0},
+ /* 558 */ {I_LOOP, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39536, 0},
+ /* 559 */ {I_LOOP, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39541, 1},
+ /* 560 */ {I_LOOP, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39546, 5},
+ /* 561 */ {I_LOOP, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39551, 7},
+ /* 562 */ {I_LOOPE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39556, 0},
+ /* 563 */ {I_LOOPE, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39561, 1},
+ /* 564 */ {I_LOOPE, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39566, 5},
+ /* 565 */ {I_LOOPE, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39571, 7},
+ /* 566 */ {I_LOOPNE, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39576, 0},
+ /* 567 */ {I_LOOPNE, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39581, 1},
+ /* 568 */ {I_LOOPNE, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39586, 5},
+ /* 569 */ {I_LOOPNE, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39591, 7},
+ /* 570 */ {I_LOOPNZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39576, 0},
+ /* 571 */ {I_LOOPNZ, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39581, 1},
+ /* 572 */ {I_LOOPNZ, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39586, 5},
+ /* 573 */ {I_LOOPNZ, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39591, 7},
+ /* 574 */ {I_LOOPZ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39556, 0},
+ /* 575 */ {I_LOOPZ, 2, {IMMEDIATE,REG_CX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39561, 1},
+ /* 576 */ {I_LOOPZ, 2, {IMMEDIATE,REG_ECX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39566, 5},
+ /* 577 */ {I_LOOPZ, 2, {IMMEDIATE,REG_RCX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39571, 7},
+ /* 578 */ {I_LSL, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 61},
+ /* 579 */ {I_LSL, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 62},
+ /* 580 */ {I_LSL, 2, {REG_GPR|BITS16,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35494, 63},
+ /* 581 */ {I_LSL, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 65},
+ /* 582 */ {I_LSL, 2, {REG_GPR|BITS32,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 63},
+ /* 583 */ {I_LSL, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35500, 63},
+ /* 584 */ {I_LSL, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 66},
+ /* 585 */ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ /* 586 */ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ /* 587 */ {I_LSL, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35506, 64},
+ /* 588 */ {I_LSS, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35512, 5},
+ /* 589 */ {I_LSS, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35518, 5},
+ /* 590 */ {I_LSS, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35524, 7},
+ /* 591 */ {I_LTR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ /* 592 */ {I_LTR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ /* 593 */ {I_LTR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39596, 67},
+ /* 594 */ {I_MFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35530, 59},
+ /* 595 */ {I_MONITOR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39601, 69},
+ /* 596 */ {I_MONITORX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39606, 71},
+ /* 597 */ {I_MOV, 2, {MEMORY,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39627, 72},
+ /* 598 */ {I_MOV, 2, {REG_GPR|BITS16,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39611, 0},
+ /* 599 */ {I_MOV, 2, {REG_GPR|BITS32,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39616, 5},
+ /* 600 */ {I_MOV, 2, {RM_GPR|BITS64,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+39626, 7},
+ /* 601 */ {I_MOV, 2, {REG_SREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39647, 72},
+ /* 602 */ {I_MOV, 2, {REG_SREG,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39636, 0},
+ /* 603 */ {I_MOV, 2, {REG_SREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39641, 5},
+ /* 604 */ {I_MOV, 2, {REG_SREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39646, 7},
+ /* 605 */ {I_MOV, 2, {REG_AL,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+41178, 8},
+ /* 606 */ {I_MOV, 2, {REG_AX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39651, 8},
+ /* 607 */ {I_MOV, 2, {REG_EAX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39656, 9},
+ /* 608 */ {I_MOV, 2, {REG_RAX,MEM_OFFS,0,0,0}, NO_DECORATOR, nasm_bytecodes+39661, 10},
+ /* 609 */ {I_MOV, 2, {MEM_OFFS,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41182, 76},
+ /* 610 */ {I_MOV, 2, {MEM_OFFS,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39666, 76},
+ /* 611 */ {I_MOV, 2, {MEM_OFFS,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39671, 77},
+ /* 612 */ {I_MOV, 2, {MEM_OFFS,REG_RAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39676, 78},
+ /* 613 */ {I_MOV, 2, {REG_GPR|BITS32,REG_CREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35536, 79},
+ /* 614 */ {I_MOV, 2, {REG_GPR|BITS64,REG_CREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35542, 80},
+ /* 615 */ {I_MOV, 2, {REG_CREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35548, 79},
+ /* 616 */ {I_MOV, 2, {REG_CREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35554, 80},
+ /* 617 */ {I_MOV, 2, {REG_GPR|BITS32,REG_DREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35561, 79},
+ /* 618 */ {I_MOV, 2, {REG_GPR|BITS64,REG_DREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35560, 80},
+ /* 619 */ {I_MOV, 2, {REG_DREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35567, 79},
+ /* 620 */ {I_MOV, 2, {REG_DREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35566, 80},
+ /* 621 */ {I_MOV, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39691, 8},
+ /* 622 */ {I_MOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39692, 0},
+ /* 623 */ {I_MOV, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35572, 8},
+ /* 624 */ {I_MOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35573, 0},
+ /* 625 */ {I_MOV, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35578, 9},
+ /* 626 */ {I_MOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35579, 5},
+ /* 627 */ {I_MOV, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35584, 10},
+ /* 628 */ {I_MOV, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35585, 7},
+ /* 629 */ {I_MOV, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41186, 8},
+ /* 630 */ {I_MOV, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41186, 0},
+ /* 631 */ {I_MOV, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39696, 8},
+ /* 632 */ {I_MOV, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39696, 0},
+ /* 633 */ {I_MOV, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39701, 9},
+ /* 634 */ {I_MOV, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39701, 5},
+ /* 635 */ {I_MOV, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39706, 10},
+ /* 636 */ {I_MOV, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39706, 7},
+ /* 637 */ {I_MOV, 2, {REG_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41190, 8},
+ /* 638 */ {I_MOV, 2, {REG_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39711, 8},
+ /* 639 */ {I_MOV, 2, {REG_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39716, 9},
+ /* 640 */ {I_MOV, 2, {REG_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39726, 10},
+ /* 641 */ {I_MOV, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35590, 8},
+ /* 642 */ {I_MOV, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26062, 8},
+ /* 643 */ {I_MOV, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26069, 9},
+ /* 644 */ {I_MOV, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26076, 10},
+ /* 645 */ {I_MOV, 2, {RM_GPR|BITS64,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26076, 7},
+ /* 646 */ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35590, 8},
+ /* 647 */ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26062, 8},
+ /* 648 */ {I_MOV, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26069, 9},
+ /* 649 */ {I_MOVD, 2, {MMXREG,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35596, 82},
+ /* 650 */ {I_MOVD, 2, {RM_GPR|BITS32,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35602, 82},
+ /* 651 */ {I_MOVQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35608, 84},
+ /* 652 */ {I_MOVQ, 2, {RM_MMX,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+35614, 84},
+ /* 653 */ {I_MOVQ, 2, {MMXREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26083, 85},
+ /* 654 */ {I_MOVQ, 2, {RM_GPR|BITS64,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+26090, 85},
+ /* 655 */ {I_MOVSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8473, 0},
+ /* 656 */ {I_MOVSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41194, 5},
+ /* 657 */ {I_MOVSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41198, 7},
+ /* 658 */ {I_MOVSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41202, 0},
+ /* 659 */ {I_MOVSX, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35620, 21},
+ /* 660 */ {I_MOVSX, 2, {REG_GPR|BITS16,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35620, 5},
+ /* 661 */ {I_MOVSX, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35626, 5},
+ /* 662 */ {I_MOVSX, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35632, 5},
+ /* 663 */ {I_MOVSX, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35638, 7},
+ /* 664 */ {I_MOVSX, 2, {REG_GPR|BITS64,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35644, 7},
+ /* 665 */ {I_MOVSXD, 2, {REG_GPR|BITS64,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39731, 7},
+ /* 666 */ {I_MOVZX, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+35650, 21},
+ /* 667 */ {I_MOVZX, 2, {REG_GPR|BITS16,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35650, 5},
+ /* 668 */ {I_MOVZX, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35656, 5},
+ /* 669 */ {I_MOVZX, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35662, 5},
+ /* 670 */ {I_MOVZX, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35668, 7},
+ /* 671 */ {I_MOVZX, 2, {REG_GPR|BITS64,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35674, 7},
+ /* 672 */ {I_MUL, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41206, 0},
+ /* 673 */ {I_MUL, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39736, 0},
+ /* 674 */ {I_MUL, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39741, 5},
+ /* 675 */ {I_MUL, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39746, 7},
+ /* 676 */ {I_MWAIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39751, 69},
+ /* 677 */ {I_MWAITX, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39756, 71},
+ /* 678 */ {I_NEG, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39761, 11},
+ /* 679 */ {I_NEG, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35680, 11},
+ /* 680 */ {I_NEG, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35686, 12},
+ /* 681 */ {I_NEG, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35692, 13},
+ /* 682 */ {I_NOP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39766, 0},
+ /* 683 */ {I_NOP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35698, 86},
+ /* 684 */ {I_NOP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35704, 86},
+ /* 685 */ {I_NOP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35710, 7},
+ /* 686 */ {I_NOT, 1, {RM_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39771, 11},
+ /* 687 */ {I_NOT, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35716, 11},
+ /* 688 */ {I_NOT, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35722, 12},
+ /* 689 */ {I_NOT, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35728, 13},
+ /* 690 */ {I_OR, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39776, 3},
+ /* 691 */ {I_OR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39777, 0},
+ /* 692 */ {I_OR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35734, 3},
+ /* 693 */ {I_OR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35735, 0},
+ /* 694 */ {I_OR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35740, 4},
+ /* 695 */ {I_OR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35741, 5},
+ /* 696 */ {I_OR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35746, 6},
+ /* 697 */ {I_OR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35747, 7},
+ /* 698 */ {I_OR, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33499, 8},
+ /* 699 */ {I_OR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33499, 0},
+ /* 700 */ {I_OR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39781, 8},
+ /* 701 */ {I_OR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+39781, 0},
+ /* 702 */ {I_OR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39786, 9},
+ /* 703 */ {I_OR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+39786, 5},
+ /* 704 */ {I_OR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39791, 10},
+ /* 705 */ {I_OR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+39791, 7},
+ /* 706 */ {I_OR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26097, 11},
+ /* 707 */ {I_OR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26104, 12},
+ /* 708 */ {I_OR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26111, 13},
+ /* 709 */ {I_OR, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41210, 8},
+ /* 710 */ {I_OR, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39796, 8},
+ /* 711 */ {I_OR, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39801, 9},
+ /* 712 */ {I_OR, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+39806, 10},
+ /* 713 */ {I_OR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35752, 3},
+ /* 714 */ {I_OR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26118, 3},
+ /* 715 */ {I_OR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26125, 4},
+ /* 716 */ {I_OR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26132, 6},
+ /* 717 */ {I_OR, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35752, 3},
+ /* 718 */ {I_OR, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26118, 3},
+ /* 719 */ {I_OR, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26125, 4},
+ /* 720 */ {I_OUT, 2, {IMMEDIATE,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41214, 53},
+ /* 721 */ {I_OUT, 2, {IMMEDIATE,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39811, 53},
+ /* 722 */ {I_OUT, 2, {IMMEDIATE,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+39816, 21},
+ /* 723 */ {I_OUT, 2, {REG_DX,REG_AL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40508, 0},
+ /* 724 */ {I_OUT, 2, {REG_DX,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41218, 0},
+ /* 725 */ {I_OUT, 2, {REG_DX,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41222, 5},
+ /* 726 */ {I_OUTSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41565, 39},
+ /* 727 */ {I_OUTSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41226, 5},
+ /* 728 */ {I_OUTSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41230, 39},
+ /* 729 */ {I_PACKSSDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26139, 84},
+ /* 730 */ {I_PACKSSWB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26146, 84},
+ /* 731 */ {I_PACKUSWB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26153, 84},
+ /* 732 */ {I_PADDB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26160, 84},
+ /* 733 */ {I_PADDD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26167, 84},
+ /* 734 */ {I_PADDSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26174, 84},
+ /* 735 */ {I_PADDSIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35764, 87},
+ /* 736 */ {I_PADDSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26181, 84},
+ /* 737 */ {I_PADDUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26188, 84},
+ /* 738 */ {I_PADDUSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26195, 84},
+ /* 739 */ {I_PADDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26202, 84},
+ /* 740 */ {I_PAND, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26209, 84},
+ /* 741 */ {I_PANDN, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26216, 84},
+ /* 742 */ {I_PAUSE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41234, 0},
+ /* 743 */ {I_PAVEB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35770, 87},
+ /* 744 */ {I_PAVGUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8412, 88},
+ /* 745 */ {I_PCMPEQB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26223, 84},
+ /* 746 */ {I_PCMPEQD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26230, 84},
+ /* 747 */ {I_PCMPEQW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26237, 84},
+ /* 748 */ {I_PCMPGTB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26244, 84},
+ /* 749 */ {I_PCMPGTD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26251, 84},
+ /* 750 */ {I_PCMPGTW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26258, 84},
+ /* 751 */ {I_PDISTIB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36971, 89},
+ /* 752 */ {I_PF2ID, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8420, 88},
+ /* 753 */ {I_PFACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8428, 88},
+ /* 754 */ {I_PFADD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8436, 88},
+ /* 755 */ {I_PFCMPEQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8444, 88},
+ /* 756 */ {I_PFCMPGE, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8452, 88},
+ /* 757 */ {I_PFCMPGT, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8460, 88},
+ /* 758 */ {I_PFMAX, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8468, 88},
+ /* 759 */ {I_PFMIN, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8476, 88},
+ /* 760 */ {I_PFMUL, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8484, 88},
+ /* 761 */ {I_PFRCP, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8492, 88},
+ /* 762 */ {I_PFRCPIT1, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8500, 88},
+ /* 763 */ {I_PFRCPIT2, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8508, 88},
+ /* 764 */ {I_PFRSQIT1, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8516, 88},
+ /* 765 */ {I_PFRSQRT, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8524, 88},
+ /* 766 */ {I_PFSUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8532, 88},
+ /* 767 */ {I_PFSUBR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8540, 88},
+ /* 768 */ {I_PI2FD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8548, 88},
+ /* 769 */ {I_PMACHRIW, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37067, 89},
+ /* 770 */ {I_PMADDWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26265, 84},
+ /* 771 */ {I_PMAGW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35776, 87},
+ /* 772 */ {I_PMULHRIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35782, 87},
+ /* 773 */ {I_PMULHRWA, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8556, 88},
+ /* 774 */ {I_PMULHRWC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35788, 87},
+ /* 775 */ {I_PMULHW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26272, 84},
+ /* 776 */ {I_PMULLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26279, 84},
+ /* 777 */ {I_PMVGEZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37199, 87},
+ /* 778 */ {I_PMVLZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37055, 87},
+ /* 779 */ {I_PMVNZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37037, 87},
+ /* 780 */ {I_PMVZB, 2, {MMXREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36959, 87},
+ /* 781 */ {I_POP, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41238, 0},
+ /* 782 */ {I_POP, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41242, 19},
+ /* 783 */ {I_POP, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41246, 7},
+ /* 784 */ {I_POP, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39821, 0},
+ /* 785 */ {I_POP, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39826, 19},
+ /* 786 */ {I_POP, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39831, 7},
+ /* 787 */ {I_POP, 1, {REG_ES,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8849, 1},
+ /* 788 */ {I_POP, 1, {REG_SS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3621, 1},
+ /* 789 */ {I_POP, 1, {REG_DS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3765, 1},
+ /* 790 */ {I_POP, 1, {REG_FS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41250, 5},
+ /* 791 */ {I_POP, 1, {REG_GS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41254, 5},
+ /* 792 */ {I_POPA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41258, 18},
+ /* 793 */ {I_POPAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41262, 19},
+ /* 794 */ {I_POPAW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41266, 18},
+ /* 795 */ {I_POPF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41270, 0},
+ /* 796 */ {I_POPFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41274, 19},
+ /* 797 */ {I_POPFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41274, 7},
+ /* 798 */ {I_POPFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41278, 0},
+ /* 799 */ {I_POR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26286, 84},
+ /* 800 */ {I_PREFETCH, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39836, 88},
+ /* 801 */ {I_PREFETCHW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39841, 88},
+ /* 802 */ {I_PSLLD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26293, 84},
+ /* 803 */ {I_PSLLD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26300, 38},
+ /* 804 */ {I_PSLLQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26307, 84},
+ /* 805 */ {I_PSLLQ, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26314, 38},
+ /* 806 */ {I_PSLLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26321, 84},
+ /* 807 */ {I_PSLLW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26328, 38},
+ /* 808 */ {I_PSRAD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26335, 84},
+ /* 809 */ {I_PSRAD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26342, 38},
+ /* 810 */ {I_PSRAW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26349, 84},
+ /* 811 */ {I_PSRAW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26356, 38},
+ /* 812 */ {I_PSRLD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26363, 84},
+ /* 813 */ {I_PSRLD, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26370, 38},
+ /* 814 */ {I_PSRLQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26377, 84},
+ /* 815 */ {I_PSRLQ, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26384, 38},
+ /* 816 */ {I_PSRLW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26391, 84},
+ /* 817 */ {I_PSRLW, 2, {MMXREG,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26398, 38},
+ /* 818 */ {I_PSUBB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26405, 84},
+ /* 819 */ {I_PSUBD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26412, 84},
+ /* 820 */ {I_PSUBSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26419, 84},
+ /* 821 */ {I_PSUBSIW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+35794, 87},
+ /* 822 */ {I_PSUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26426, 84},
+ /* 823 */ {I_PSUBUSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26433, 84},
+ /* 824 */ {I_PSUBUSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26440, 84},
+ /* 825 */ {I_PSUBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26447, 84},
+ /* 826 */ {I_PUNPCKHBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26454, 84},
+ /* 827 */ {I_PUNPCKHDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26461, 84},
+ /* 828 */ {I_PUNPCKHWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26468, 84},
+ /* 829 */ {I_PUNPCKLBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26475, 84},
+ /* 830 */ {I_PUNPCKLDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26482, 84},
+ /* 831 */ {I_PUNPCKLWD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26489, 84},
+ /* 832 */ {I_PUSH, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41282, 0},
+ /* 833 */ {I_PUSH, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41286, 19},
+ /* 834 */ {I_PUSH, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41290, 7},
+ /* 835 */ {I_PUSH, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39846, 0},
+ /* 836 */ {I_PUSH, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39851, 19},
+ /* 837 */ {I_PUSH, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39856, 7},
+ /* 838 */ {I_PUSH, 1, {REG_ES,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8817, 1},
+ /* 839 */ {I_PUSH, 1, {REG_CS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3477, 1},
+ /* 840 */ {I_PUSH, 1, {REG_SS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3603, 1},
+ /* 841 */ {I_PUSH, 1, {REG_DS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+3747, 1},
+ /* 842 */ {I_PUSH, 1, {REG_FS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41294, 5},
+ /* 843 */ {I_PUSH, 1, {REG_GS,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41298, 5},
+ /* 844 */ {I_PUSH, 1, {IMMEDIATE|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39882, 39},
+ /* 845 */ {I_PUSH, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39866, 91},
+ /* 846 */ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39876, 92},
+ /* 847 */ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39876, 93},
+ /* 848 */ {I_PUSH, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39886, 94},
+ /* 849 */ {I_PUSH, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39886, 94},
+ /* 850 */ {I_PUSHA, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41302, 18},
+ /* 851 */ {I_PUSHAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41306, 19},
+ /* 852 */ {I_PUSHAW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41310, 18},
+ /* 853 */ {I_PUSHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41314, 0},
+ /* 854 */ {I_PUSHFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41318, 19},
+ /* 855 */ {I_PUSHFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41318, 7},
+ /* 856 */ {I_PUSHFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41322, 0},
+ /* 857 */ {I_PXOR, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26496, 84},
+ /* 858 */ {I_RCL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41326, 0},
+ /* 859 */ {I_RCL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41330, 0},
+ /* 860 */ {I_RCL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39891, 39},
+ /* 861 */ {I_RCL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39896, 0},
+ /* 862 */ {I_RCL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39901, 0},
+ /* 863 */ {I_RCL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35800, 39},
+ /* 864 */ {I_RCL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39906, 5},
+ /* 865 */ {I_RCL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39911, 5},
+ /* 866 */ {I_RCL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35806, 5},
+ /* 867 */ {I_RCL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39916, 7},
+ /* 868 */ {I_RCL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39921, 7},
+ /* 869 */ {I_RCL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35812, 7},
+ /* 870 */ {I_RCR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41334, 0},
+ /* 871 */ {I_RCR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41338, 0},
+ /* 872 */ {I_RCR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39926, 39},
+ /* 873 */ {I_RCR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39931, 0},
+ /* 874 */ {I_RCR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39936, 0},
+ /* 875 */ {I_RCR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35818, 39},
+ /* 876 */ {I_RCR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39941, 5},
+ /* 877 */ {I_RCR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39946, 5},
+ /* 878 */ {I_RCR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35824, 5},
+ /* 879 */ {I_RCR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+39951, 7},
+ /* 880 */ {I_RCR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+39956, 7},
+ /* 881 */ {I_RCR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35830, 7},
+ /* 882 */ {I_RDSHR, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35836, 95},
+ /* 883 */ {I_RDMSR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41342, 96},
+ /* 884 */ {I_RDPMC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41346, 86},
+ /* 885 */ {I_RDTSC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41350, 32},
+ /* 886 */ {I_RDTSCP, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39961, 97},
+ /* 887 */ {I_RET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41371, 25},
+ /* 888 */ {I_RET, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ /* 889 */ {I_RETF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41375, 0},
+ /* 890 */ {I_RETF, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39992, 72},
+ /* 891 */ {I_RETN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41371, 25},
+ /* 892 */ {I_RETN, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ /* 893 */ {I_RETW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41354, 25},
+ /* 894 */ {I_RETW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39987, 98},
+ /* 895 */ {I_RETFW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41358, 0},
+ /* 896 */ {I_RETFW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39966, 72},
+ /* 897 */ {I_RETNW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41354, 25},
+ /* 898 */ {I_RETNW, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39971, 98},
+ /* 899 */ {I_RETD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41362, 26},
+ /* 900 */ {I_RETD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39976, 99},
+ /* 901 */ {I_RETFD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41366, 0},
+ /* 902 */ {I_RETFD, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39981, 72},
+ /* 903 */ {I_RETND, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41362, 26},
+ /* 904 */ {I_RETND, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39976, 99},
+ /* 905 */ {I_RETQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41370, 28},
+ /* 906 */ {I_RETQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39986, 100},
+ /* 907 */ {I_RETFQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41374, 7},
+ /* 908 */ {I_RETFQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39991, 101},
+ /* 909 */ {I_RETNQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41370, 28},
+ /* 910 */ {I_RETNQ, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39986, 100},
+ /* 911 */ {I_ROL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41378, 0},
+ /* 912 */ {I_ROL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41382, 0},
+ /* 913 */ {I_ROL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+39996, 39},
+ /* 914 */ {I_ROL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40001, 0},
+ /* 915 */ {I_ROL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40006, 0},
+ /* 916 */ {I_ROL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35842, 39},
+ /* 917 */ {I_ROL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40011, 5},
+ /* 918 */ {I_ROL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40016, 5},
+ /* 919 */ {I_ROL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35848, 5},
+ /* 920 */ {I_ROL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40021, 7},
+ /* 921 */ {I_ROL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40026, 7},
+ /* 922 */ {I_ROL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35854, 7},
+ /* 923 */ {I_ROR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41386, 0},
+ /* 924 */ {I_ROR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41390, 0},
+ /* 925 */ {I_ROR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40031, 39},
+ /* 926 */ {I_ROR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40036, 0},
+ /* 927 */ {I_ROR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40041, 0},
+ /* 928 */ {I_ROR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35860, 39},
+ /* 929 */ {I_ROR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40046, 5},
+ /* 930 */ {I_ROR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40051, 5},
+ /* 931 */ {I_ROR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35866, 5},
+ /* 932 */ {I_ROR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40056, 7},
+ /* 933 */ {I_ROR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40061, 7},
+ /* 934 */ {I_ROR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35872, 7},
+ /* 935 */ {I_RSDC, 2, {REG_SREG,MEMORY|BITS80,0,0,0}, NO_DECORATOR, nasm_bytecodes+37319, 102},
+ /* 936 */ {I_RSLDT, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40066, 102},
+ /* 937 */ {I_RSM, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41394, 103},
+ /* 938 */ {I_RSTS, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40071, 102},
+ /* 939 */ {I_SAHF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8441, 0},
+ /* 940 */ {I_SALC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40498, 104},
+ /* 941 */ {I_SAR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41406, 0},
+ /* 942 */ {I_SAR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41410, 0},
+ /* 943 */ {I_SAR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40111, 39},
+ /* 944 */ {I_SAR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40116, 0},
+ /* 945 */ {I_SAR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40121, 0},
+ /* 946 */ {I_SAR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35896, 39},
+ /* 947 */ {I_SAR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40126, 5},
+ /* 948 */ {I_SAR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40131, 5},
+ /* 949 */ {I_SAR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35902, 5},
+ /* 950 */ {I_SAR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40136, 7},
+ /* 951 */ {I_SAR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40141, 7},
+ /* 952 */ {I_SAR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35908, 7},
+ /* 953 */ {I_SBB, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40146, 3},
+ /* 954 */ {I_SBB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40147, 0},
+ /* 955 */ {I_SBB, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35914, 3},
+ /* 956 */ {I_SBB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+35915, 0},
+ /* 957 */ {I_SBB, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35920, 4},
+ /* 958 */ {I_SBB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+35921, 5},
+ /* 959 */ {I_SBB, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35926, 6},
+ /* 960 */ {I_SBB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+35927, 7},
+ /* 961 */ {I_SBB, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+28088, 8},
+ /* 962 */ {I_SBB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+28088, 0},
+ /* 963 */ {I_SBB, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40151, 8},
+ /* 964 */ {I_SBB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40151, 0},
+ /* 965 */ {I_SBB, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40156, 9},
+ /* 966 */ {I_SBB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40156, 5},
+ /* 967 */ {I_SBB, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40161, 10},
+ /* 968 */ {I_SBB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40161, 7},
+ /* 969 */ {I_SBB, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26503, 11},
+ /* 970 */ {I_SBB, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26510, 12},
+ /* 971 */ {I_SBB, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26517, 13},
+ /* 972 */ {I_SBB, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41414, 8},
+ /* 973 */ {I_SBB, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40166, 8},
+ /* 974 */ {I_SBB, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40171, 9},
+ /* 975 */ {I_SBB, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40176, 10},
+ /* 976 */ {I_SBB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+35932, 3},
+ /* 977 */ {I_SBB, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26524, 3},
+ /* 978 */ {I_SBB, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26531, 4},
+ /* 979 */ {I_SBB, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26538, 6},
+ /* 980 */ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35932, 3},
+ /* 981 */ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26524, 3},
+ /* 982 */ {I_SBB, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26531, 4},
+ /* 983 */ {I_SCASB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41418, 0},
+ /* 984 */ {I_SCASD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40181, 5},
+ /* 985 */ {I_SCASQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40186, 7},
+ /* 986 */ {I_SCASW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40191, 0},
+ /* 987 */ {I_SFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35944, 59},
+ /* 988 */ {I_SGDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40196, 105},
+ /* 989 */ {I_SHL, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41398, 0},
+ /* 990 */ {I_SHL, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41402, 0},
+ /* 991 */ {I_SHL, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40076, 39},
+ /* 992 */ {I_SHL, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40081, 0},
+ /* 993 */ {I_SHL, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40086, 0},
+ /* 994 */ {I_SHL, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35878, 39},
+ /* 995 */ {I_SHL, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40091, 5},
+ /* 996 */ {I_SHL, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40096, 5},
+ /* 997 */ {I_SHL, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35884, 5},
+ /* 998 */ {I_SHL, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40101, 7},
+ /* 999 */ {I_SHL, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40106, 7},
+ /* 1000 */ {I_SHL, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35890, 7},
+ /* 1001 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26545, 106},
+ /* 1002 */ {I_SHLD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26545, 106},
+ /* 1003 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26552, 106},
+ /* 1004 */ {I_SHLD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26552, 106},
+ /* 1005 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26559, 107},
+ /* 1006 */ {I_SHLD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26559, 107},
+ /* 1007 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35950, 9},
+ /* 1008 */ {I_SHLD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35950, 5},
+ /* 1009 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35956, 9},
+ /* 1010 */ {I_SHLD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35956, 5},
+ /* 1011 */ {I_SHLD, 3, {MEMORY,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35962, 10},
+ /* 1012 */ {I_SHLD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35962, 7},
+ /* 1013 */ {I_SHR, 2, {RM_GPR|BITS8,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41422, 0},
+ /* 1014 */ {I_SHR, 2, {RM_GPR|BITS8,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+41426, 0},
+ /* 1015 */ {I_SHR, 2, {RM_GPR|BITS8,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40201, 39},
+ /* 1016 */ {I_SHR, 2, {RM_GPR|BITS16,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40206, 0},
+ /* 1017 */ {I_SHR, 2, {RM_GPR|BITS16,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40211, 0},
+ /* 1018 */ {I_SHR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35968, 39},
+ /* 1019 */ {I_SHR, 2, {RM_GPR|BITS32,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40216, 5},
+ /* 1020 */ {I_SHR, 2, {RM_GPR|BITS32,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40221, 5},
+ /* 1021 */ {I_SHR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35974, 5},
+ /* 1022 */ {I_SHR, 2, {RM_GPR|BITS64,UNITY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40226, 7},
+ /* 1023 */ {I_SHR, 2, {RM_GPR|BITS64,REG_CL,0,0,0}, NO_DECORATOR, nasm_bytecodes+40231, 7},
+ /* 1024 */ {I_SHR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+35980, 7},
+ /* 1025 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26566, 106},
+ /* 1026 */ {I_SHRD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26566, 106},
+ /* 1027 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26573, 106},
+ /* 1028 */ {I_SHRD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26573, 106},
+ /* 1029 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26580, 107},
+ /* 1030 */ {I_SHRD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26580, 107},
+ /* 1031 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35986, 9},
+ /* 1032 */ {I_SHRD, 3, {REG_GPR|BITS16,REG_GPR|BITS16,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35986, 5},
+ /* 1033 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35992, 9},
+ /* 1034 */ {I_SHRD, 3, {REG_GPR|BITS32,REG_GPR|BITS32,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35992, 5},
+ /* 1035 */ {I_SHRD, 3, {MEMORY,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35998, 10},
+ /* 1036 */ {I_SHRD, 3, {REG_GPR|BITS64,REG_GPR|BITS64,REG_CL,0,0}, NO_DECORATOR, nasm_bytecodes+35998, 7},
+ /* 1037 */ {I_SIDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40236, 105},
+ /* 1038 */ {I_SLDT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36023, 105},
+ /* 1039 */ {I_SLDT, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36023, 105},
+ /* 1040 */ {I_SLDT, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36004, 105},
+ /* 1041 */ {I_SLDT, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36010, 5},
+ /* 1042 */ {I_SLDT, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36022, 7},
+ /* 1043 */ {I_SKINIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40241, 7},
+ /* 1044 */ {I_SMI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41544, 108},
+ /* 1045 */ {I_SMSW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36041, 105},
+ /* 1046 */ {I_SMSW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36041, 105},
+ /* 1047 */ {I_SMSW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36028, 105},
+ /* 1048 */ {I_SMSW, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36034, 5},
+ /* 1049 */ {I_SMSW, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36040, 7},
+ /* 1050 */ {I_STC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39963, 0},
+ /* 1051 */ {I_STD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41568, 0},
+ /* 1052 */ {I_STI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+39758, 0},
+ /* 1053 */ {I_STOSB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+8545, 0},
+ /* 1054 */ {I_STOSD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41438, 5},
+ /* 1055 */ {I_STOSQ, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41442, 7},
+ /* 1056 */ {I_STOSW, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41446, 0},
+ /* 1057 */ {I_STR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36059, 62},
+ /* 1058 */ {I_STR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36059, 62},
+ /* 1059 */ {I_STR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36046, 62},
+ /* 1060 */ {I_STR, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36052, 63},
+ /* 1061 */ {I_STR, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36058, 7},
+ /* 1062 */ {I_SUB, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40246, 3},
+ /* 1063 */ {I_SUB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40247, 0},
+ /* 1064 */ {I_SUB, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36064, 3},
+ /* 1065 */ {I_SUB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36065, 0},
+ /* 1066 */ {I_SUB, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36070, 4},
+ /* 1067 */ {I_SUB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36071, 5},
+ /* 1068 */ {I_SUB, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36076, 6},
+ /* 1069 */ {I_SUB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36077, 7},
+ /* 1070 */ {I_SUB, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33856, 8},
+ /* 1071 */ {I_SUB, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33856, 0},
+ /* 1072 */ {I_SUB, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40251, 8},
+ /* 1073 */ {I_SUB, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40251, 0},
+ /* 1074 */ {I_SUB, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40256, 9},
+ /* 1075 */ {I_SUB, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40256, 5},
+ /* 1076 */ {I_SUB, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40261, 10},
+ /* 1077 */ {I_SUB, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40261, 7},
+ /* 1078 */ {I_SUB, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26587, 11},
+ /* 1079 */ {I_SUB, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26594, 12},
+ /* 1080 */ {I_SUB, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26601, 13},
+ /* 1081 */ {I_SUB, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41450, 8},
+ /* 1082 */ {I_SUB, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40266, 8},
+ /* 1083 */ {I_SUB, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40271, 9},
+ /* 1084 */ {I_SUB, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40276, 10},
+ /* 1085 */ {I_SUB, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36082, 3},
+ /* 1086 */ {I_SUB, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26608, 3},
+ /* 1087 */ {I_SUB, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26615, 4},
+ /* 1088 */ {I_SUB, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26622, 6},
+ /* 1089 */ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36082, 3},
+ /* 1090 */ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26608, 3},
+ /* 1091 */ {I_SUB, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26615, 4},
+ /* 1092 */ {I_SVDC, 2, {MEMORY|BITS80,REG_SREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+27177, 102},
+ /* 1093 */ {I_SVTS, 1, {MEMORY|BITS80,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40286, 102},
+ /* 1094 */ {I_SWAPGS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40291, 7},
+ /* 1095 */ {I_SYSCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41162, 110},
+ /* 1096 */ {I_SYSENTER, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41454, 86},
+ /* 1097 */ {I_SYSEXIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41458, 111},
+ /* 1098 */ {I_SYSRET, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41158, 112},
+ /* 1099 */ {I_TEST, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41462, 8},
+ /* 1100 */ {I_TEST, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+41462, 0},
+ /* 1101 */ {I_TEST, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40296, 8},
+ /* 1102 */ {I_TEST, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40296, 0},
+ /* 1103 */ {I_TEST, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40301, 9},
+ /* 1104 */ {I_TEST, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40301, 5},
+ /* 1105 */ {I_TEST, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40306, 10},
+ /* 1106 */ {I_TEST, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40306, 7},
+ /* 1107 */ {I_TEST, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+41466, 8},
+ /* 1108 */ {I_TEST, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40311, 8},
+ /* 1109 */ {I_TEST, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40316, 9},
+ /* 1110 */ {I_TEST, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40321, 10},
+ /* 1111 */ {I_TEST, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41470, 8},
+ /* 1112 */ {I_TEST, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40326, 8},
+ /* 1113 */ {I_TEST, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40331, 9},
+ /* 1114 */ {I_TEST, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40336, 10},
+ /* 1115 */ {I_TEST, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40341, 8},
+ /* 1116 */ {I_TEST, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36094, 8},
+ /* 1117 */ {I_TEST, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36100, 9},
+ /* 1118 */ {I_TEST, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36106, 10},
+ /* 1119 */ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40341, 8},
+ /* 1120 */ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36094, 8},
+ /* 1121 */ {I_TEST, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36100, 9},
+ /* 1122 */ {I_UD0, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41474, 113},
+ /* 1123 */ {I_UD0, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36112, 39},
+ /* 1124 */ {I_UD0, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36118, 39},
+ /* 1125 */ {I_UD0, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36124, 39},
+ /* 1126 */ {I_UD1, 2, {REG_GPR,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36130, 39},
+ /* 1127 */ {I_UD1, 2, {REG_GPR,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36136, 39},
+ /* 1128 */ {I_UD1, 2, {REG_GPR,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36142, 39},
+ /* 1129 */ {I_UD2, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41482, 39},
+ /* 1130 */ {I_VERR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ /* 1131 */ {I_VERR, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ /* 1132 */ {I_VERR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40346, 62},
+ /* 1133 */ {I_VERW, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ /* 1134 */ {I_VERW, 1, {MEMORY|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ /* 1135 */ {I_VERW, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40351, 62},
+ /* 1136 */ {I_FWAIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41060, 0},
+ /* 1137 */ {I_WBINVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40522, 54},
+ /* 1138 */ {I_WRSHR, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36160, 95},
+ /* 1139 */ {I_WRMSR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41486, 96},
+ /* 1140 */ {I_XADD, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36166, 115},
+ /* 1141 */ {I_XADD, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36167, 20},
+ /* 1142 */ {I_XADD, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26657, 115},
+ /* 1143 */ {I_XADD, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26658, 20},
+ /* 1144 */ {I_XADD, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26664, 115},
+ /* 1145 */ {I_XADD, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26665, 20},
+ /* 1146 */ {I_XADD, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26671, 6},
+ /* 1147 */ {I_XADD, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26672, 7},
+ /* 1148 */ {I_XCHG, 2, {REG_AX,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+41490, 0},
+ /* 1149 */ {I_XCHG, 2, {REG_EAX,REG32NA,0,0,0}, NO_DECORATOR, nasm_bytecodes+41494, 5},
+ /* 1150 */ {I_XCHG, 2, {REG_RAX,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+41498, 7},
+ /* 1151 */ {I_XCHG, 2, {REG_GPR|BITS16,REG_AX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41502, 0},
+ /* 1152 */ {I_XCHG, 2, {REG32NA,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41506, 5},
+ /* 1153 */ {I_XCHG, 2, {REG_GPR|BITS64,REG_RAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41510, 7},
+ /* 1154 */ {I_XCHG, 2, {REG_EAX,REG_EAX,0,0,0}, NO_DECORATOR, nasm_bytecodes+41514, 19},
+ /* 1155 */ {I_XCHG, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40356, 3},
+ /* 1156 */ {I_XCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40357, 0},
+ /* 1157 */ {I_XCHG, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36184, 3},
+ /* 1158 */ {I_XCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36185, 0},
+ /* 1159 */ {I_XCHG, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36190, 4},
+ /* 1160 */ {I_XCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36191, 5},
+ /* 1161 */ {I_XCHG, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36196, 6},
+ /* 1162 */ {I_XCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36197, 7},
+ /* 1163 */ {I_XCHG, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40361, 3},
+ /* 1164 */ {I_XCHG, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40362, 0},
+ /* 1165 */ {I_XCHG, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36202, 3},
+ /* 1166 */ {I_XCHG, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36203, 0},
+ /* 1167 */ {I_XCHG, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36208, 4},
+ /* 1168 */ {I_XCHG, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36209, 5},
+ /* 1169 */ {I_XCHG, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36214, 6},
+ /* 1170 */ {I_XCHG, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36215, 7},
+ /* 1171 */ {I_XLATB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37573, 0},
+ /* 1172 */ {I_XLAT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37573, 0},
+ /* 1173 */ {I_XOR, 2, {MEMORY,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40366, 3},
+ /* 1174 */ {I_XOR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+40367, 0},
+ /* 1175 */ {I_XOR, 2, {MEMORY,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36220, 3},
+ /* 1176 */ {I_XOR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36221, 0},
+ /* 1177 */ {I_XOR, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36226, 4},
+ /* 1178 */ {I_XOR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36227, 5},
+ /* 1179 */ {I_XOR, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36232, 6},
+ /* 1180 */ {I_XOR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36233, 7},
+ /* 1181 */ {I_XOR, 2, {REG_GPR|BITS8,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+33296, 8},
+ /* 1182 */ {I_XOR, 2, {REG_GPR|BITS8,REG_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33296, 0},
+ /* 1183 */ {I_XOR, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40371, 8},
+ /* 1184 */ {I_XOR, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+40371, 0},
+ /* 1185 */ {I_XOR, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40376, 9},
+ /* 1186 */ {I_XOR, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+40376, 5},
+ /* 1187 */ {I_XOR, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+40381, 10},
+ /* 1188 */ {I_XOR, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+40381, 7},
+ /* 1189 */ {I_XOR, 2, {RM_GPR|BITS16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26678, 11},
+ /* 1190 */ {I_XOR, 2, {RM_GPR|BITS32,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26685, 12},
+ /* 1191 */ {I_XOR, 2, {RM_GPR|BITS64,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+26692, 13},
+ /* 1192 */ {I_XOR, 2, {REG_AL,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+41518, 8},
+ /* 1193 */ {I_XOR, 2, {REG_AX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40386, 8},
+ /* 1194 */ {I_XOR, 2, {REG_EAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40391, 9},
+ /* 1195 */ {I_XOR, 2, {REG_RAX,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+40396, 10},
+ /* 1196 */ {I_XOR, 2, {RM_GPR|BITS8,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+36238, 3},
+ /* 1197 */ {I_XOR, 2, {RM_GPR|BITS16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26699, 3},
+ /* 1198 */ {I_XOR, 2, {RM_GPR|BITS32,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26706, 4},
+ /* 1199 */ {I_XOR, 2, {RM_GPR|BITS64,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+26713, 6},
+ /* 1200 */ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+36238, 3},
+ /* 1201 */ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26699, 3},
+ /* 1202 */ {I_XOR, 2, {MEMORY,IMMEDIATE|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26706, 4},
+ /* 1203 */ {I_CMOVcc, 2, {REG_GPR|BITS16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26720, 118},
+ /* 1204 */ {I_CMOVcc, 2, {REG_GPR|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26720, 86},
+ /* 1205 */ {I_CMOVcc, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26727, 118},
+ /* 1206 */ {I_CMOVcc, 2, {REG_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26727, 86},
+ /* 1207 */ {I_CMOVcc, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26734, 10},
+ /* 1208 */ {I_CMOVcc, 2, {REG_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26734, 7},
+ /* 1209 */ {I_Jcc, 1, {IMMEDIATE|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26741, 119},
+ /* 1210 */ {I_Jcc, 1, {IMMEDIATE|BITS16|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26748, 27},
+ /* 1211 */ {I_Jcc, 1, {IMMEDIATE|BITS32|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26755, 27},
+ /* 1212 */ {I_Jcc, 1, {IMMEDIATE|BITS64|NEAR,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26762, 28},
+ /* 1213 */ {I_Jcc, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40402, 25},
+ /* 1214 */ {I_SETcc, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36250, 21},
+ /* 1215 */ {I_SETcc, 1, {REG_GPR|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36250, 5},
+ /* 1216 */ {I_ADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36256, 120},
+ /* 1217 */ {I_ADDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36262, 120},
+ /* 1218 */ {I_ANDNPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36268, 120},
+ /* 1219 */ {I_ANDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36274, 120},
+ /* 1220 */ {I_CMPEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8564, 120},
+ /* 1221 */ {I_CMPEQSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8572, 120},
+ /* 1222 */ {I_CMPLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8580, 120},
+ /* 1223 */ {I_CMPLESS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8588, 120},
+ /* 1224 */ {I_CMPLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8596, 120},
+ /* 1225 */ {I_CMPLTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8604, 120},
+ /* 1226 */ {I_CMPNEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8612, 120},
+ /* 1227 */ {I_CMPNEQSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8620, 120},
+ /* 1228 */ {I_CMPNLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8628, 120},
+ /* 1229 */ {I_CMPNLESS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8636, 120},
+ /* 1230 */ {I_CMPNLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8644, 120},
+ /* 1231 */ {I_CMPNLTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8652, 120},
+ /* 1232 */ {I_CMPORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8660, 120},
+ /* 1233 */ {I_CMPORDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8668, 120},
+ /* 1234 */ {I_CMPUNORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+8676, 120},
+ /* 1235 */ {I_CMPUNORDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+8684, 120},
+ /* 1236 */ {I_CMPPS, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26776, 121},
+ /* 1237 */ {I_CMPPS, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26776, 121},
+ /* 1238 */ {I_CMPSS, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26783, 121},
+ /* 1239 */ {I_CMPSS, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26783, 121},
+ /* 1240 */ {I_COMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36280, 120},
+ /* 1241 */ {I_CVTPI2PS, 2, {XMM_L16,RM_MMX|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36286, 122},
+ /* 1242 */ {I_CVTPS2PI, 2, {MMXREG,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36292, 122},
+ /* 1243 */ {I_CVTSI2SS, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26791, 123},
+ /* 1244 */ {I_CVTSI2SS, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26790, 124},
+ /* 1245 */ {I_CVTSS2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26798, 123},
+ /* 1246 */ {I_CVTSS2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26798, 123},
+ /* 1247 */ {I_CVTSS2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26797, 125},
+ /* 1248 */ {I_CVTSS2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26797, 125},
+ /* 1249 */ {I_CVTTPS2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36298, 126},
+ /* 1250 */ {I_CVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26805, 123},
+ /* 1251 */ {I_CVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26804, 125},
+ /* 1252 */ {I_DIVPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36304, 120},
+ /* 1253 */ {I_DIVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36310, 120},
+ /* 1254 */ {I_LDMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36316, 120},
+ /* 1255 */ {I_MAXPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36322, 120},
+ /* 1256 */ {I_MAXSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36328, 120},
+ /* 1257 */ {I_MINPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36334, 120},
+ /* 1258 */ {I_MINSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36340, 120},
+ /* 1259 */ {I_MOVAPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36346, 120},
+ /* 1260 */ {I_MOVAPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36352, 120},
+ /* 1261 */ {I_MOVHPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36358, 120},
+ /* 1262 */ {I_MOVHPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36364, 120},
+ /* 1263 */ {I_MOVLHPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36358, 120},
+ /* 1264 */ {I_MOVLPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 120},
+ /* 1265 */ {I_MOVLPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36370, 120},
+ /* 1266 */ {I_MOVHLPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36154, 120},
+ /* 1267 */ {I_MOVMSKPS, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36376, 120},
+ /* 1268 */ {I_MOVMSKPS, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26811, 127},
+ /* 1269 */ {I_MOVNTPS, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36382, 120},
+ /* 1270 */ {I_MOVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36388, 120},
+ /* 1271 */ {I_MOVSS, 2, {MEMORY|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36394, 120},
+ /* 1272 */ {I_MOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36388, 120},
+ /* 1273 */ {I_MOVUPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36400, 120},
+ /* 1274 */ {I_MOVUPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36406, 120},
+ /* 1275 */ {I_MULPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36412, 120},
+ /* 1276 */ {I_MULSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36418, 120},
+ /* 1277 */ {I_ORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36424, 120},
+ /* 1278 */ {I_RCPPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36430, 120},
+ /* 1279 */ {I_RCPSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36436, 120},
+ /* 1280 */ {I_RSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36442, 120},
+ /* 1281 */ {I_RSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36448, 120},
+ /* 1282 */ {I_SHUFPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+26818, 120},
+ /* 1283 */ {I_SQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36454, 120},
+ /* 1284 */ {I_SQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36460, 120},
+ /* 1285 */ {I_STMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36466, 120},
+ /* 1286 */ {I_SUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36472, 120},
+ /* 1287 */ {I_SUBSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36478, 120},
+ /* 1288 */ {I_UCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+36484, 120},
+ /* 1289 */ {I_UNPCKHPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36490, 120},
+ /* 1290 */ {I_UNPCKLPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36496, 120},
+ /* 1291 */ {I_XORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+36502, 120},
+ /* 1292 */ {I_FXRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26826, 128},
+ /* 1293 */ {I_FXRSTOR64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26825, 129},
+ /* 1294 */ {I_FXSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26833, 128},
+ /* 1295 */ {I_FXSAVE64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26832, 129},
+ /* 1296 */ {I_XGETBV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40406, 130},
+ /* 1297 */ {I_XSETBV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40411, 131},
+ /* 1298 */ {I_XSAVE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26840, 130},
+ /* 1299 */ {I_XSAVE64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26839, 132},
+ /* 1300 */ {I_XSAVEC, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26847, 133},
+ /* 1301 */ {I_XSAVEC64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26846, 134},
+ /* 1302 */ {I_XSAVEOPT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26854, 133},
+ /* 1303 */ {I_XSAVEOPT64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26853, 134},
+ /* 1304 */ {I_XSAVES, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26861, 133},
+ /* 1305 */ {I_XSAVES64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26860, 134},
+ /* 1306 */ {I_XRSTOR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26868, 130},
+ /* 1307 */ {I_XRSTOR64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26867, 132},
+ /* 1308 */ {I_XRSTORS, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26875, 133},
+ /* 1309 */ {I_XRSTORS64, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26874, 134},
+ /* 1310 */ {I_PREFETCHNTA, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37595, 135},
+ /* 1311 */ {I_PREFETCHT0, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37613, 135},
+ /* 1312 */ {I_PREFETCHT1, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37631, 135},
+ /* 1313 */ {I_PREFETCHT2, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37649, 135},
+ /* 1314 */ {I_SFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35944, 135},
+ /* 1315 */ {I_MASKMOVQ, 2, {MMXREG,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36508, 136},
+ /* 1316 */ {I_MOVNTQ, 2, {MEMORY,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36514, 137},
+ /* 1317 */ {I_PAVGB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26881, 137},
+ /* 1318 */ {I_PAVGW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26888, 137},
+ /* 1319 */ {I_PEXTRW, 3, {REG_GPR|BITS32,MMXREG,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26895, 138},
+ /* 1320 */ {I_PINSRW, 3, {MMXREG,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ /* 1321 */ {I_PINSRW, 3, {MMXREG,RM_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ /* 1322 */ {I_PINSRW, 3, {MMXREG,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26902, 138},
+ /* 1323 */ {I_PMAXSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26909, 137},
+ /* 1324 */ {I_PMAXUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26916, 137},
+ /* 1325 */ {I_PMINSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26923, 137},
+ /* 1326 */ {I_PMINUB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26930, 137},
+ /* 1327 */ {I_PMOVMSKB, 2, {REG_GPR|BITS32,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36520, 136},
+ /* 1328 */ {I_PMULHUW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26937, 137},
+ /* 1329 */ {I_PSADBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+26944, 137},
+ /* 1330 */ {I_PSHUFW, 3, {MMXREG,RM_MMX,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8692, 139},
+ /* 1331 */ {I_PF2IW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8700, 88},
+ /* 1332 */ {I_PFNACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8708, 88},
+ /* 1333 */ {I_PFPNACC, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8716, 88},
+ /* 1334 */ {I_PI2FW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8724, 88},
+ /* 1335 */ {I_PSWAPD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+8732, 88},
+ /* 1336 */ {I_MASKMOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36526, 140},
+ /* 1337 */ {I_CLFLUSH, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+36532, 140},
+ /* 1338 */ {I_MOVNTDQ, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36538, 141},
+ /* 1339 */ {I_MOVNTI, 2, {MEMORY,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26952, 142},
+ /* 1340 */ {I_MOVNTI, 2, {MEMORY,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26951, 143},
+ /* 1341 */ {I_MOVNTPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36544, 141},
+ /* 1342 */ {I_LFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35452, 140},
+ /* 1343 */ {I_MFENCE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35530, 140},
+ /* 1344 */ {I_MOVD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26958, 144},
+ /* 1345 */ {I_MOVD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+26965, 144},
+ /* 1346 */ {I_MOVD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+26965, 140},
+ /* 1347 */ {I_MOVD, 2, {RM_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26958, 140},
+ /* 1348 */ {I_MOVDQA, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36550, 140},
+ /* 1349 */ {I_MOVDQA, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36556, 141},
+ /* 1350 */ {I_MOVDQA, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36550, 141},
+ /* 1351 */ {I_MOVDQA, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36556, 140},
+ /* 1352 */ {I_MOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36562, 140},
+ /* 1353 */ {I_MOVDQU, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36568, 141},
+ /* 1354 */ {I_MOVDQU, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36562, 141},
+ /* 1355 */ {I_MOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36568, 140},
+ /* 1356 */ {I_MOVDQ2Q, 2, {MMXREG,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36574, 140},
+ /* 1357 */ {I_MOVQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36580, 140},
+ /* 1358 */ {I_MOVQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36586, 140},
+ /* 1359 */ {I_MOVQ, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36586, 145},
+ /* 1360 */ {I_MOVQ, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+36580, 145},
+ /* 1361 */ {I_MOVQ, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+26972, 146},
+ /* 1362 */ {I_MOVQ, 2, {RM_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+26979, 146},
+ /* 1363 */ {I_MOVQ2DQ, 2, {XMM_L16,MMXREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+36592, 140},
+ /* 1364 */ {I_PACKSSWB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36598, 141},
+ /* 1365 */ {I_PACKSSDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36604, 141},
+ /* 1366 */ {I_PACKUSWB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36610, 141},
+ /* 1367 */ {I_PADDB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36616, 141},
+ /* 1368 */ {I_PADDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36622, 141},
+ /* 1369 */ {I_PADDD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36628, 141},
+ /* 1370 */ {I_PADDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+36634, 147},
+ /* 1371 */ {I_PADDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36640, 141},
+ /* 1372 */ {I_PADDSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36646, 141},
+ /* 1373 */ {I_PADDSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36652, 141},
+ /* 1374 */ {I_PADDUSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36658, 141},
+ /* 1375 */ {I_PADDUSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36664, 141},
+ /* 1376 */ {I_PAND, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36670, 141},
+ /* 1377 */ {I_PANDN, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36676, 141},
+ /* 1378 */ {I_PAVGB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36682, 141},
+ /* 1379 */ {I_PAVGW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36688, 141},
+ /* 1380 */ {I_PCMPEQB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36694, 141},
+ /* 1381 */ {I_PCMPEQW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36700, 141},
+ /* 1382 */ {I_PCMPEQD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36706, 141},
+ /* 1383 */ {I_PCMPGTB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36712, 141},
+ /* 1384 */ {I_PCMPGTW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36718, 141},
+ /* 1385 */ {I_PCMPGTD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36724, 141},
+ /* 1386 */ {I_PEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26986, 148},
+ /* 1387 */ {I_PINSRW, 3, {XMM_L16,REG_GPR|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ /* 1388 */ {I_PINSRW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ /* 1389 */ {I_PINSRW, 3, {XMM_L16,MEMORY|BITS16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+26993, 148},
+ /* 1390 */ {I_PMADDWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36730, 141},
+ /* 1391 */ {I_PMAXSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36736, 141},
+ /* 1392 */ {I_PMAXUB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36742, 141},
+ /* 1393 */ {I_PMINSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36748, 141},
+ /* 1394 */ {I_PMINUB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36754, 141},
+ /* 1395 */ {I_PMOVMSKB, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36760, 140},
+ /* 1396 */ {I_PMULHUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36766, 141},
+ /* 1397 */ {I_PMULHW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36772, 141},
+ /* 1398 */ {I_PMULLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36778, 141},
+ /* 1399 */ {I_PMULUDQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27000, 141},
+ /* 1400 */ {I_PMULUDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36784, 141},
+ /* 1401 */ {I_POR, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36790, 141},
+ /* 1402 */ {I_PSADBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36796, 141},
+ /* 1403 */ {I_PSHUFD, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27007, 148},
+ /* 1404 */ {I_PSHUFD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27007, 150},
+ /* 1405 */ {I_PSHUFHW, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27014, 148},
+ /* 1406 */ {I_PSHUFHW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27014, 150},
+ /* 1407 */ {I_PSHUFLW, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27021, 148},
+ /* 1408 */ {I_PSHUFLW, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27021, 150},
+ /* 1409 */ {I_PSLLDQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27028, 151},
+ /* 1410 */ {I_PSLLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36802, 141},
+ /* 1411 */ {I_PSLLW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27035, 151},
+ /* 1412 */ {I_PSLLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36808, 141},
+ /* 1413 */ {I_PSLLD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27042, 151},
+ /* 1414 */ {I_PSLLQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36814, 141},
+ /* 1415 */ {I_PSLLQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27049, 151},
+ /* 1416 */ {I_PSRAW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36820, 141},
+ /* 1417 */ {I_PSRAW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27056, 151},
+ /* 1418 */ {I_PSRAD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36826, 141},
+ /* 1419 */ {I_PSRAD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27063, 151},
+ /* 1420 */ {I_PSRLDQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27070, 151},
+ /* 1421 */ {I_PSRLW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36832, 141},
+ /* 1422 */ {I_PSRLW, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27077, 151},
+ /* 1423 */ {I_PSRLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36838, 141},
+ /* 1424 */ {I_PSRLD, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27084, 151},
+ /* 1425 */ {I_PSRLQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36844, 141},
+ /* 1426 */ {I_PSRLQ, 2, {XMM_L16,IMMEDIATE,0,0,0}, NO_DECORATOR, nasm_bytecodes+27091, 151},
+ /* 1427 */ {I_PSUBB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36850, 141},
+ /* 1428 */ {I_PSUBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36856, 141},
+ /* 1429 */ {I_PSUBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36862, 141},
+ /* 1430 */ {I_PSUBQ, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27098, 141},
+ /* 1431 */ {I_PSUBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36868, 141},
+ /* 1432 */ {I_PSUBSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36874, 141},
+ /* 1433 */ {I_PSUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36880, 141},
+ /* 1434 */ {I_PSUBUSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36886, 141},
+ /* 1435 */ {I_PSUBUSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36892, 141},
+ /* 1436 */ {I_PUNPCKHBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36898, 141},
+ /* 1437 */ {I_PUNPCKHWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36904, 141},
+ /* 1438 */ {I_PUNPCKHDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36910, 141},
+ /* 1439 */ {I_PUNPCKHQDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36916, 141},
+ /* 1440 */ {I_PUNPCKLBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36922, 141},
+ /* 1441 */ {I_PUNPCKLWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36928, 141},
+ /* 1442 */ {I_PUNPCKLDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36934, 141},
+ /* 1443 */ {I_PUNPCKLQDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36940, 141},
+ /* 1444 */ {I_PXOR, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36946, 141},
+ /* 1445 */ {I_ADDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36952, 141},
+ /* 1446 */ {I_ADDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36958, 145},
+ /* 1447 */ {I_ANDNPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36964, 141},
+ /* 1448 */ {I_ANDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36970, 141},
+ /* 1449 */ {I_CMPEQPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8740, 141},
+ /* 1450 */ {I_CMPEQSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8748, 140},
+ /* 1451 */ {I_CMPLEPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8756, 141},
+ /* 1452 */ {I_CMPLESD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8764, 140},
+ /* 1453 */ {I_CMPLTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8772, 141},
+ /* 1454 */ {I_CMPLTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8780, 140},
+ /* 1455 */ {I_CMPNEQPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8788, 141},
+ /* 1456 */ {I_CMPNEQSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8796, 140},
+ /* 1457 */ {I_CMPNLEPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8804, 141},
+ /* 1458 */ {I_CMPNLESD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8812, 140},
+ /* 1459 */ {I_CMPNLTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8820, 141},
+ /* 1460 */ {I_CMPNLTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8828, 140},
+ /* 1461 */ {I_CMPORDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8836, 141},
+ /* 1462 */ {I_CMPORDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8844, 140},
+ /* 1463 */ {I_CMPUNORDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8852, 141},
+ /* 1464 */ {I_CMPUNORDSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+8860, 140},
+ /* 1465 */ {I_CMPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+27105, 140},
+ /* 1466 */ {I_CMPSD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+27112, 140},
+ /* 1467 */ {I_COMISD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36976, 140},
+ /* 1468 */ {I_CVTDQ2PD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36982, 145},
+ /* 1469 */ {I_CVTDQ2PS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36988, 141},
+ /* 1470 */ {I_CVTPD2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+36994, 141},
+ /* 1471 */ {I_CVTPD2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37000, 141},
+ /* 1472 */ {I_CVTPD2PS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37006, 141},
+ /* 1473 */ {I_CVTPI2PD, 2, {XMM_L16,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+37012, 145},
+ /* 1474 */ {I_CVTPS2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37018, 141},
+ /* 1475 */ {I_CVTPS2PD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37024, 145},
+ /* 1476 */ {I_CVTSD2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27119, 152},
+ /* 1477 */ {I_CVTSD2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27119, 152},
+ /* 1478 */ {I_CVTSD2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27126, 153},
+ /* 1479 */ {I_CVTSD2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27126, 153},
+ /* 1480 */ {I_CVTSD2SS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37030, 145},
+ /* 1481 */ {I_CVTSI2SD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27133, 154},
+ /* 1482 */ {I_CVTSI2SD, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27140, 153},
+ /* 1483 */ {I_CVTSS2SD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37036, 144},
+ /* 1484 */ {I_CVTTPD2PI, 2, {MMXREG,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37042, 141},
+ /* 1485 */ {I_CVTTPD2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37048, 141},
+ /* 1486 */ {I_CVTTPS2DQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37054, 141},
+ /* 1487 */ {I_CVTTSD2SI, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27147, 152},
+ /* 1488 */ {I_CVTTSD2SI, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27147, 152},
+ /* 1489 */ {I_CVTTSD2SI, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27154, 153},
+ /* 1490 */ {I_CVTTSD2SI, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+27154, 153},
+ /* 1491 */ {I_DIVPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37060, 141},
+ /* 1492 */ {I_DIVSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37066, 140},
+ /* 1493 */ {I_MAXPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37072, 141},
+ /* 1494 */ {I_MAXSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37078, 140},
+ /* 1495 */ {I_MINPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37084, 141},
+ /* 1496 */ {I_MINSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37090, 140},
+ /* 1497 */ {I_MOVAPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37096, 140},
+ /* 1498 */ {I_MOVAPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37102, 140},
+ /* 1499 */ {I_MOVAPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37102, 141},
+ /* 1500 */ {I_MOVAPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37096, 141},
+ /* 1501 */ {I_MOVHPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37108, 140},
+ /* 1502 */ {I_MOVHPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37114, 140},
+ /* 1503 */ {I_MOVLPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37120, 140},
+ /* 1504 */ {I_MOVLPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+37126, 140},
+ /* 1505 */ {I_MOVMSKPD, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37132, 140},
+ /* 1506 */ {I_MOVMSKPD, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27161, 146},
+ /* 1507 */ {I_MOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37138, 140},
+ /* 1508 */ {I_MOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37144, 140},
+ /* 1509 */ {I_MOVSD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37144, 140},
+ /* 1510 */ {I_MOVSD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+37138, 140},
+ /* 1511 */ {I_MOVUPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37150, 140},
+ /* 1512 */ {I_MOVUPD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37156, 140},
+ /* 1513 */ {I_MOVUPD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37156, 141},
+ /* 1514 */ {I_MOVUPD, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37150, 141},
+ /* 1515 */ {I_MULPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37162, 141},
+ /* 1516 */ {I_MULSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37168, 140},
+ /* 1517 */ {I_ORPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37174, 141},
+ /* 1518 */ {I_SHUFPD, 3, {XMM_L16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27168, 148},
+ /* 1519 */ {I_SHUFPD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+27168, 155},
+ /* 1520 */ {I_SQRTPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37180, 141},
+ /* 1521 */ {I_SQRTSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37186, 140},
+ /* 1522 */ {I_SUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37192, 141},
+ /* 1523 */ {I_SUBSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37198, 140},
+ /* 1524 */ {I_UCOMISD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37204, 140},
+ /* 1525 */ {I_UNPCKHPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37210, 140},
+ /* 1526 */ {I_UNPCKLPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37216, 140},
+ /* 1527 */ {I_XORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37222, 140},
+ /* 1528 */ {I_ADDSUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37228, 156},
+ /* 1529 */ {I_ADDSUBPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37234, 156},
+ /* 1530 */ {I_HADDPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37240, 156},
+ /* 1531 */ {I_HADDPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37246, 156},
+ /* 1532 */ {I_HSUBPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37252, 156},
+ /* 1533 */ {I_HSUBPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37258, 156},
+ /* 1534 */ {I_LDDQU, 2, {XMM_L16,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37264, 156},
+ /* 1535 */ {I_MOVDDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37270, 157},
+ /* 1536 */ {I_MOVSHDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37276, 157},
+ /* 1537 */ {I_MOVSLDUP, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37282, 157},
+ /* 1538 */ {I_CLGI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40416, 158},
+ /* 1539 */ {I_STGI, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40421, 158},
+ /* 1540 */ {I_VMCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40426, 159},
+ /* 1541 */ {I_VMCLEAR, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37288, 159},
+ /* 1542 */ {I_VMFUNC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40431, 159},
+ /* 1543 */ {I_VMLAUNCH, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40436, 159},
+ /* 1544 */ {I_VMLOAD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40441, 158},
+ /* 1545 */ {I_VMMCALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40446, 158},
+ /* 1546 */ {I_VMPTRLD, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37294, 159},
+ /* 1547 */ {I_VMPTRST, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37300, 159},
+ /* 1548 */ {I_VMREAD, 2, {RM_GPR|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27176, 160},
+ /* 1549 */ {I_VMREAD, 2, {RM_GPR|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27175, 161},
+ /* 1550 */ {I_VMRESUME, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40451, 159},
+ /* 1551 */ {I_VMRUN, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40456, 158},
+ /* 1552 */ {I_VMSAVE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40461, 158},
+ /* 1553 */ {I_VMWRITE, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27183, 160},
+ /* 1554 */ {I_VMWRITE, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27182, 161},
+ /* 1555 */ {I_VMXOFF, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40466, 159},
+ /* 1556 */ {I_VMXON, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37306, 159},
+ /* 1557 */ {I_INVEPT, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8869, 162},
+ /* 1558 */ {I_INVEPT, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8868, 163},
+ /* 1559 */ {I_INVVPID, 2, {REG_GPR|BITS32,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8877, 162},
+ /* 1560 */ {I_INVVPID, 2, {REG_GPR|BITS64,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+8876, 163},
+ /* 1561 */ {I_PABSB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27189, 164},
+ /* 1562 */ {I_PABSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27196, 165},
+ /* 1563 */ {I_PABSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27203, 164},
+ /* 1564 */ {I_PABSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27210, 165},
+ /* 1565 */ {I_PABSD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27217, 164},
+ /* 1566 */ {I_PABSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27224, 165},
+ /* 1567 */ {I_PALIGNR, 3, {MMXREG,RM_MMX,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8884, 164},
+ /* 1568 */ {I_PALIGNR, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8892, 165},
+ /* 1569 */ {I_PHADDW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27231, 164},
+ /* 1570 */ {I_PHADDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27238, 165},
+ /* 1571 */ {I_PHADDD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27245, 164},
+ /* 1572 */ {I_PHADDD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27252, 165},
+ /* 1573 */ {I_PHADDSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27259, 164},
+ /* 1574 */ {I_PHADDSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27266, 165},
+ /* 1575 */ {I_PHSUBW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27273, 164},
+ /* 1576 */ {I_PHSUBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27280, 165},
+ /* 1577 */ {I_PHSUBD, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27287, 164},
+ /* 1578 */ {I_PHSUBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27294, 165},
+ /* 1579 */ {I_PHSUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27301, 164},
+ /* 1580 */ {I_PHSUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27308, 165},
+ /* 1581 */ {I_PMADDUBSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27315, 164},
+ /* 1582 */ {I_PMADDUBSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27322, 165},
+ /* 1583 */ {I_PMULHRSW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27329, 164},
+ /* 1584 */ {I_PMULHRSW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27336, 165},
+ /* 1585 */ {I_PSHUFB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27343, 164},
+ /* 1586 */ {I_PSHUFB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27350, 165},
+ /* 1587 */ {I_PSIGNB, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27357, 164},
+ /* 1588 */ {I_PSIGNB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27364, 165},
+ /* 1589 */ {I_PSIGNW, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27371, 164},
+ /* 1590 */ {I_PSIGNW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27378, 165},
+ /* 1591 */ {I_PSIGND, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+27385, 164},
+ /* 1592 */ {I_PSIGND, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27392, 165},
+ /* 1593 */ {I_EXTRQ, 3, {XMM_L16,IMMEDIATE,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8900, 166},
+ /* 1594 */ {I_EXTRQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37312, 166},
+ /* 1595 */ {I_INSERTQ, 4, {XMM_L16,XMM_L16,IMMEDIATE,IMMEDIATE,0}, NO_DECORATOR, nasm_bytecodes+8908, 166},
+ /* 1596 */ {I_INSERTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37318, 166},
+ /* 1597 */ {I_MOVNTSD, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37324, 167},
+ /* 1598 */ {I_MOVNTSS, 2, {MEMORY,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+37330, 168},
+ /* 1599 */ {I_LZCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27399, 110},
+ /* 1600 */ {I_LZCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27406, 110},
+ /* 1601 */ {I_LZCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27413, 59},
+ /* 1602 */ {I_BLENDPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8916, 169},
+ /* 1603 */ {I_BLENDPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8924, 169},
+ /* 1604 */ {I_BLENDVPD, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27420, 169},
+ /* 1605 */ {I_BLENDVPD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27420, 169},
+ /* 1606 */ {I_BLENDVPS, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27427, 169},
+ /* 1607 */ {I_BLENDVPS, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27427, 169},
+ /* 1608 */ {I_DPPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8932, 169},
+ /* 1609 */ {I_DPPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8940, 169},
+ /* 1610 */ {I_EXTRACTPS, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+241, 169},
+ /* 1611 */ {I_EXTRACTPS, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+240, 170},
+ /* 1612 */ {I_INSERTPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8948, 171},
+ /* 1613 */ {I_MOVNTDQA, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27434, 169},
+ /* 1614 */ {I_MPSADBW, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8956, 169},
+ /* 1615 */ {I_PACKUSDW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27441, 169},
+ /* 1616 */ {I_PBLENDVB, 3, {XMM_L16,RM_XMM_L16,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+27448, 169},
+ /* 1617 */ {I_PBLENDVB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27448, 169},
+ /* 1618 */ {I_PBLENDW, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8964, 169},
+ /* 1619 */ {I_PCMPEQQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27455, 169},
+ /* 1620 */ {I_PEXTRB, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+250, 169},
+ /* 1621 */ {I_PEXTRB, 3, {MEMORY|BITS8,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+250, 169},
+ /* 1622 */ {I_PEXTRB, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+249, 170},
+ /* 1623 */ {I_PEXTRD, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+258, 169},
+ /* 1624 */ {I_PEXTRQ, 3, {RM_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+267, 170},
+ /* 1625 */ {I_PEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+277, 169},
+ /* 1626 */ {I_PEXTRW, 3, {MEMORY|BITS16,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+277, 169},
+ /* 1627 */ {I_PEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+276, 170},
+ /* 1628 */ {I_PHMINPOSUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27462, 169},
+ /* 1629 */ {I_PINSRB, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+286, 172},
+ /* 1630 */ {I_PINSRB, 3, {XMM_L16,RM_GPR|BITS8,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+285, 172},
+ /* 1631 */ {I_PINSRB, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+286, 172},
+ /* 1632 */ {I_PINSRD, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+294, 172},
+ /* 1633 */ {I_PINSRD, 3, {XMM_L16,RM_GPR|BITS32,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+294, 172},
+ /* 1634 */ {I_PINSRQ, 3, {XMM_L16,MEMORY,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+303, 173},
+ /* 1635 */ {I_PINSRQ, 3, {XMM_L16,RM_GPR|BITS64,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+303, 173},
+ /* 1636 */ {I_PMAXSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27469, 169},
+ /* 1637 */ {I_PMAXSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27476, 169},
+ /* 1638 */ {I_PMAXUD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27483, 169},
+ /* 1639 */ {I_PMAXUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27490, 169},
+ /* 1640 */ {I_PMINSB, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27497, 169},
+ /* 1641 */ {I_PMINSD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27504, 169},
+ /* 1642 */ {I_PMINUD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27511, 169},
+ /* 1643 */ {I_PMINUW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27518, 169},
+ /* 1644 */ {I_PMOVSXBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27525, 174},
+ /* 1645 */ {I_PMOVSXBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27532, 171},
+ /* 1646 */ {I_PMOVSXBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27539, 175},
+ /* 1647 */ {I_PMOVSXWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27546, 174},
+ /* 1648 */ {I_PMOVSXWQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27553, 171},
+ /* 1649 */ {I_PMOVSXDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27560, 174},
+ /* 1650 */ {I_PMOVZXBW, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27567, 174},
+ /* 1651 */ {I_PMOVZXBD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27574, 171},
+ /* 1652 */ {I_PMOVZXBQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27581, 175},
+ /* 1653 */ {I_PMOVZXWD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27588, 174},
+ /* 1654 */ {I_PMOVZXWQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27595, 171},
+ /* 1655 */ {I_PMOVZXDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27602, 174},
+ /* 1656 */ {I_PMULDQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27609, 169},
+ /* 1657 */ {I_PMULLD, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27616, 169},
+ /* 1658 */ {I_PTEST, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27623, 169},
+ /* 1659 */ {I_ROUNDPD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8972, 169},
+ /* 1660 */ {I_ROUNDPS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8980, 169},
+ /* 1661 */ {I_ROUNDSD, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8988, 169},
+ /* 1662 */ {I_ROUNDSS, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+8996, 169},
+ /* 1663 */ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9021, 176},
+ /* 1664 */ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9004, 176},
+ /* 1665 */ {I_CRC32, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9012, 176},
+ /* 1666 */ {I_CRC32, 2, {REG_GPR|BITS64,RM_GPR|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9020, 177},
+ /* 1667 */ {I_CRC32, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9028, 177},
+ /* 1668 */ {I_PCMPESTRI, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9036, 176},
+ /* 1669 */ {I_PCMPESTRM, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9044, 176},
+ /* 1670 */ {I_PCMPISTRI, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9052, 176},
+ /* 1671 */ {I_PCMPISTRM, 3, {XMM_L16,RM_XMM_L16,IMMEDIATE,0,0}, NO_DECORATOR, nasm_bytecodes+9060, 176},
+ /* 1672 */ {I_PCMPGTQ, 2, {XMM_L16,RM_XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27630, 176},
+ /* 1673 */ {I_POPCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+27637, 178},
+ /* 1674 */ {I_POPCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27644, 179},
+ /* 1675 */ {I_POPCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27651, 180},
+ /* 1676 */ {I_GETSEC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+41522, 135},
+ /* 1677 */ {I_PFRCPV, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+9068, 181},
+ /* 1678 */ {I_PFRSQRTV, 2, {MMXREG,RM_MMX,0,0,0}, NO_DECORATOR, nasm_bytecodes+9076, 181},
+ /* 1679 */ {I_MOVBE, 2, {REG_GPR|BITS16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9084, 182},
+ /* 1680 */ {I_MOVBE, 2, {REG_GPR|BITS32,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9092, 182},
+ /* 1681 */ {I_MOVBE, 2, {REG_GPR|BITS64,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9100, 182},
+ /* 1682 */ {I_MOVBE, 2, {MEMORY|BITS16,REG_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+9108, 182},
+ /* 1683 */ {I_MOVBE, 2, {MEMORY|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+9116, 182},
+ /* 1684 */ {I_MOVBE, 2, {MEMORY|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+9124, 182},
+ /* 1685 */ {I_AESENC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27658, 183},
+ /* 1686 */ {I_AESENCLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27665, 183},
+ /* 1687 */ {I_AESDEC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27672, 183},
+ /* 1688 */ {I_AESDECLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27679, 183},
+ /* 1689 */ {I_AESIMC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27686, 183},
+ /* 1690 */ {I_AESKEYGENASSIST, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9132, 183},
+ /* 1691 */ {I_VAESENC, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27693, 184},
+ /* 1692 */ {I_VAESENC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27700, 184},
+ /* 1693 */ {I_VAESENCLAST, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27707, 184},
+ /* 1694 */ {I_VAESENCLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27714, 184},
+ /* 1695 */ {I_VAESDEC, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27721, 184},
+ /* 1696 */ {I_VAESDEC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27728, 184},
+ /* 1697 */ {I_VAESDECLAST, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27735, 184},
+ /* 1698 */ {I_VAESDECLAST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27742, 184},
+ /* 1699 */ {I_VAESIMC, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27749, 184},
+ /* 1700 */ {I_VAESKEYGENASSIST, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9140, 184},
+ /* 1701 */ {I_VAESENC, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27756, 185},
+ /* 1702 */ {I_VAESENC, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27763, 185},
+ /* 1703 */ {I_VAESENCLAST, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27770, 185},
+ /* 1704 */ {I_VAESENCLAST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27777, 185},
+ /* 1705 */ {I_VAESDEC, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27784, 185},
+ /* 1706 */ {I_VAESDEC, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27791, 185},
+ /* 1707 */ {I_VAESDECLAST, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27798, 185},
+ /* 1708 */ {I_VAESDECLAST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27805, 185},
+ /* 1709 */ {I_VAESENC, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9148, 186},
+ /* 1710 */ {I_VAESENC, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9156, 186},
+ /* 1711 */ {I_VAESENC, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9164, 186},
+ /* 1712 */ {I_VAESENC, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9172, 186},
+ /* 1713 */ {I_VAESENCLAST, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9180, 186},
+ /* 1714 */ {I_VAESENCLAST, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9188, 186},
+ /* 1715 */ {I_VAESENCLAST, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9196, 186},
+ /* 1716 */ {I_VAESENCLAST, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9204, 186},
+ /* 1717 */ {I_VAESDEC, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9212, 186},
+ /* 1718 */ {I_VAESDEC, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9220, 186},
+ /* 1719 */ {I_VAESDEC, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9228, 186},
+ /* 1720 */ {I_VAESDEC, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9236, 186},
+ /* 1721 */ {I_VAESDECLAST, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+9244, 186},
+ /* 1722 */ {I_VAESDECLAST, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+9252, 186},
+ /* 1723 */ {I_VAESDECLAST, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+9260, 186},
+ /* 1724 */ {I_VAESDECLAST, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+9268, 186},
+ /* 1725 */ {I_VAESENC, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9276, 187},
+ /* 1726 */ {I_VAESENC, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9284, 187},
+ /* 1727 */ {I_VAESENCLAST, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9292, 187},
+ /* 1728 */ {I_VAESENCLAST, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9300, 187},
+ /* 1729 */ {I_VAESDEC, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9308, 187},
+ /* 1730 */ {I_VAESDEC, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9316, 187},
+ /* 1731 */ {I_VAESDECLAST, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+9324, 187},
+ /* 1732 */ {I_VAESDECLAST, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+9332, 187},
+ /* 1733 */ {I_VADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27812, 184},
+ /* 1734 */ {I_VADDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27819, 184},
+ /* 1735 */ {I_VADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27826, 184},
+ /* 1736 */ {I_VADDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27833, 184},
+ /* 1737 */ {I_VADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27840, 184},
+ /* 1738 */ {I_VADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27847, 184},
+ /* 1739 */ {I_VADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27854, 184},
+ /* 1740 */ {I_VADDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27861, 184},
+ /* 1741 */ {I_VADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+27868, 184},
+ /* 1742 */ {I_VADDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+27875, 184},
+ /* 1743 */ {I_VADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+27882, 184},
+ /* 1744 */ {I_VADDSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+27889, 184},
+ /* 1745 */ {I_VADDSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27896, 184},
+ /* 1746 */ {I_VADDSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27903, 184},
+ /* 1747 */ {I_VADDSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27910, 184},
+ /* 1748 */ {I_VADDSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27917, 184},
+ /* 1749 */ {I_VADDSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27924, 184},
+ /* 1750 */ {I_VADDSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27931, 184},
+ /* 1751 */ {I_VADDSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27938, 184},
+ /* 1752 */ {I_VADDSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27945, 184},
+ /* 1753 */ {I_VANDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27952, 184},
+ /* 1754 */ {I_VANDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27959, 184},
+ /* 1755 */ {I_VANDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27966, 184},
+ /* 1756 */ {I_VANDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+27973, 184},
+ /* 1757 */ {I_VANDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+27980, 184},
+ /* 1758 */ {I_VANDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+27987, 184},
+ /* 1759 */ {I_VANDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+27994, 184},
+ /* 1760 */ {I_VANDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28001, 184},
+ /* 1761 */ {I_VANDNPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28008, 184},
+ /* 1762 */ {I_VANDNPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28015, 184},
+ /* 1763 */ {I_VANDNPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28022, 184},
+ /* 1764 */ {I_VANDNPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28029, 184},
+ /* 1765 */ {I_VANDNPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28036, 184},
+ /* 1766 */ {I_VANDNPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28043, 184},
+ /* 1767 */ {I_VANDNPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28050, 184},
+ /* 1768 */ {I_VANDNPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28057, 184},
+ /* 1769 */ {I_VBLENDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9340, 184},
+ /* 1770 */ {I_VBLENDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9348, 184},
+ /* 1771 */ {I_VBLENDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9356, 184},
+ /* 1772 */ {I_VBLENDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9364, 184},
+ /* 1773 */ {I_VBLENDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9372, 184},
+ /* 1774 */ {I_VBLENDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9380, 184},
+ /* 1775 */ {I_VBLENDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9388, 184},
+ /* 1776 */ {I_VBLENDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9396, 184},
+ /* 1777 */ {I_VBLENDVPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9404, 184},
+ /* 1778 */ {I_VBLENDVPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9412, 184},
+ /* 1779 */ {I_VBLENDVPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9420, 184},
+ /* 1780 */ {I_VBLENDVPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9428, 184},
+ /* 1781 */ {I_VBLENDVPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9436, 184},
+ /* 1782 */ {I_VBLENDVPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9444, 184},
+ /* 1783 */ {I_VBLENDVPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9452, 184},
+ /* 1784 */ {I_VBLENDVPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9460, 184},
+ /* 1785 */ {I_VBROADCASTSS, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28064, 184},
+ /* 1786 */ {I_VBROADCASTSS, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28071, 184},
+ /* 1787 */ {I_VBROADCASTSD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28078, 184},
+ /* 1788 */ {I_VBROADCASTF128, 2, {YMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28085, 184},
+ /* 1789 */ {I_VCMPEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+312, 184},
+ /* 1790 */ {I_VCMPEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+321, 184},
+ /* 1791 */ {I_VCMPEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+330, 184},
+ /* 1792 */ {I_VCMPEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+339, 184},
+ /* 1793 */ {I_VCMPEQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+348, 184},
+ /* 1794 */ {I_VCMPEQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+357, 184},
+ /* 1795 */ {I_VCMPEQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+366, 184},
+ /* 1796 */ {I_VCMPEQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+375, 184},
+ /* 1797 */ {I_VCMPLT_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+384, 184},
+ /* 1798 */ {I_VCMPLT_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+393, 184},
+ /* 1799 */ {I_VCMPLT_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+402, 184},
+ /* 1800 */ {I_VCMPLT_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+411, 184},
+ /* 1801 */ {I_VCMPLTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+384, 184},
+ /* 1802 */ {I_VCMPLTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+393, 184},
+ /* 1803 */ {I_VCMPLTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+402, 184},
+ /* 1804 */ {I_VCMPLTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+411, 184},
+ /* 1805 */ {I_VCMPLE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+420, 184},
+ /* 1806 */ {I_VCMPLE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+429, 184},
+ /* 1807 */ {I_VCMPLE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+438, 184},
+ /* 1808 */ {I_VCMPLE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+447, 184},
+ /* 1809 */ {I_VCMPLEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+420, 184},
+ /* 1810 */ {I_VCMPLEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+429, 184},
+ /* 1811 */ {I_VCMPLEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+438, 184},
+ /* 1812 */ {I_VCMPLEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+447, 184},
+ /* 1813 */ {I_VCMPUNORD_QPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+456, 184},
+ /* 1814 */ {I_VCMPUNORD_QPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+465, 184},
+ /* 1815 */ {I_VCMPUNORD_QPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+474, 184},
+ /* 1816 */ {I_VCMPUNORD_QPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+483, 184},
+ /* 1817 */ {I_VCMPUNORDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+456, 184},
+ /* 1818 */ {I_VCMPUNORDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+465, 184},
+ /* 1819 */ {I_VCMPUNORDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+474, 184},
+ /* 1820 */ {I_VCMPUNORDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+483, 184},
+ /* 1821 */ {I_VCMPNEQ_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+492, 184},
+ /* 1822 */ {I_VCMPNEQ_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+501, 184},
+ /* 1823 */ {I_VCMPNEQ_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+510, 184},
+ /* 1824 */ {I_VCMPNEQ_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+519, 184},
+ /* 1825 */ {I_VCMPNEQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+492, 184},
+ /* 1826 */ {I_VCMPNEQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+501, 184},
+ /* 1827 */ {I_VCMPNEQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+510, 184},
+ /* 1828 */ {I_VCMPNEQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+519, 184},
+ /* 1829 */ {I_VCMPNLT_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+528, 184},
+ /* 1830 */ {I_VCMPNLT_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+537, 184},
+ /* 1831 */ {I_VCMPNLT_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+546, 184},
+ /* 1832 */ {I_VCMPNLT_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+555, 184},
+ /* 1833 */ {I_VCMPNLTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+528, 184},
+ /* 1834 */ {I_VCMPNLTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+537, 184},
+ /* 1835 */ {I_VCMPNLTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+546, 184},
+ /* 1836 */ {I_VCMPNLTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+555, 184},
+ /* 1837 */ {I_VCMPNLE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+564, 184},
+ /* 1838 */ {I_VCMPNLE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+573, 184},
+ /* 1839 */ {I_VCMPNLE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+582, 184},
+ /* 1840 */ {I_VCMPNLE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+591, 184},
+ /* 1841 */ {I_VCMPNLEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+564, 184},
+ /* 1842 */ {I_VCMPNLEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+573, 184},
+ /* 1843 */ {I_VCMPNLEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+582, 184},
+ /* 1844 */ {I_VCMPNLEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+591, 184},
+ /* 1845 */ {I_VCMPORD_QPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+600, 184},
+ /* 1846 */ {I_VCMPORD_QPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+609, 184},
+ /* 1847 */ {I_VCMPORD_QPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+618, 184},
+ /* 1848 */ {I_VCMPORD_QPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+627, 184},
+ /* 1849 */ {I_VCMPORDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+600, 184},
+ /* 1850 */ {I_VCMPORDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+609, 184},
+ /* 1851 */ {I_VCMPORDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+618, 184},
+ /* 1852 */ {I_VCMPORDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+627, 184},
+ /* 1853 */ {I_VCMPEQ_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+636, 184},
+ /* 1854 */ {I_VCMPEQ_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+645, 184},
+ /* 1855 */ {I_VCMPEQ_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+654, 184},
+ /* 1856 */ {I_VCMPEQ_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+663, 184},
+ /* 1857 */ {I_VCMPNGE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+672, 184},
+ /* 1858 */ {I_VCMPNGE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+681, 184},
+ /* 1859 */ {I_VCMPNGE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+690, 184},
+ /* 1860 */ {I_VCMPNGE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+699, 184},
+ /* 1861 */ {I_VCMPNGEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+672, 184},
+ /* 1862 */ {I_VCMPNGEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+681, 184},
+ /* 1863 */ {I_VCMPNGEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+690, 184},
+ /* 1864 */ {I_VCMPNGEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+699, 184},
+ /* 1865 */ {I_VCMPNGT_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+708, 184},
+ /* 1866 */ {I_VCMPNGT_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+717, 184},
+ /* 1867 */ {I_VCMPNGT_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+726, 184},
+ /* 1868 */ {I_VCMPNGT_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+735, 184},
+ /* 1869 */ {I_VCMPNGTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+708, 184},
+ /* 1870 */ {I_VCMPNGTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+717, 184},
+ /* 1871 */ {I_VCMPNGTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+726, 184},
+ /* 1872 */ {I_VCMPNGTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+735, 184},
+ /* 1873 */ {I_VCMPFALSE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+744, 184},
+ /* 1874 */ {I_VCMPFALSE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+753, 184},
+ /* 1875 */ {I_VCMPFALSE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+762, 184},
+ /* 1876 */ {I_VCMPFALSE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+771, 184},
+ /* 1877 */ {I_VCMPFALSEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+744, 184},
+ /* 1878 */ {I_VCMPFALSEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+753, 184},
+ /* 1879 */ {I_VCMPFALSEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+762, 184},
+ /* 1880 */ {I_VCMPFALSEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+771, 184},
+ /* 1881 */ {I_VCMPNEQ_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+780, 184},
+ /* 1882 */ {I_VCMPNEQ_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+789, 184},
+ /* 1883 */ {I_VCMPNEQ_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+798, 184},
+ /* 1884 */ {I_VCMPNEQ_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+807, 184},
+ /* 1885 */ {I_VCMPGE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+816, 184},
+ /* 1886 */ {I_VCMPGE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+825, 184},
+ /* 1887 */ {I_VCMPGE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+834, 184},
+ /* 1888 */ {I_VCMPGE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+843, 184},
+ /* 1889 */ {I_VCMPGEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+816, 184},
+ /* 1890 */ {I_VCMPGEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+825, 184},
+ /* 1891 */ {I_VCMPGEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+834, 184},
+ /* 1892 */ {I_VCMPGEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+843, 184},
+ /* 1893 */ {I_VCMPGT_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+852, 184},
+ /* 1894 */ {I_VCMPGT_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+861, 184},
+ /* 1895 */ {I_VCMPGT_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+870, 184},
+ /* 1896 */ {I_VCMPGT_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+879, 184},
+ /* 1897 */ {I_VCMPGTPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+852, 184},
+ /* 1898 */ {I_VCMPGTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+861, 184},
+ /* 1899 */ {I_VCMPGTPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+870, 184},
+ /* 1900 */ {I_VCMPGTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+879, 184},
+ /* 1901 */ {I_VCMPTRUE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+888, 184},
+ /* 1902 */ {I_VCMPTRUE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+897, 184},
+ /* 1903 */ {I_VCMPTRUE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+906, 184},
+ /* 1904 */ {I_VCMPTRUE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+915, 184},
+ /* 1905 */ {I_VCMPTRUEPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+888, 184},
+ /* 1906 */ {I_VCMPTRUEPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+897, 184},
+ /* 1907 */ {I_VCMPTRUEPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+906, 184},
+ /* 1908 */ {I_VCMPTRUEPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+915, 184},
+ /* 1909 */ {I_VCMPEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+312, 184},
+ /* 1910 */ {I_VCMPEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+321, 184},
+ /* 1911 */ {I_VCMPEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+330, 184},
+ /* 1912 */ {I_VCMPEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+339, 184},
+ /* 1913 */ {I_VCMPLT_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+924, 184},
+ /* 1914 */ {I_VCMPLT_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+933, 184},
+ /* 1915 */ {I_VCMPLT_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+942, 184},
+ /* 1916 */ {I_VCMPLT_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+951, 184},
+ /* 1917 */ {I_VCMPLE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+960, 184},
+ /* 1918 */ {I_VCMPLE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+969, 184},
+ /* 1919 */ {I_VCMPLE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+978, 184},
+ /* 1920 */ {I_VCMPLE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+987, 184},
+ /* 1921 */ {I_VCMPUNORD_SPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+996, 184},
+ /* 1922 */ {I_VCMPUNORD_SPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1005, 184},
+ /* 1923 */ {I_VCMPUNORD_SPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1014, 184},
+ /* 1924 */ {I_VCMPUNORD_SPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1023, 184},
+ /* 1925 */ {I_VCMPNEQ_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1032, 184},
+ /* 1926 */ {I_VCMPNEQ_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1041, 184},
+ /* 1927 */ {I_VCMPNEQ_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1050, 184},
+ /* 1928 */ {I_VCMPNEQ_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1059, 184},
+ /* 1929 */ {I_VCMPNLT_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1068, 184},
+ /* 1930 */ {I_VCMPNLT_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1077, 184},
+ /* 1931 */ {I_VCMPNLT_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1086, 184},
+ /* 1932 */ {I_VCMPNLT_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1095, 184},
+ /* 1933 */ {I_VCMPNLE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1104, 184},
+ /* 1934 */ {I_VCMPNLE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1113, 184},
+ /* 1935 */ {I_VCMPNLE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1122, 184},
+ /* 1936 */ {I_VCMPNLE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1131, 184},
+ /* 1937 */ {I_VCMPORD_SPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1140, 184},
+ /* 1938 */ {I_VCMPORD_SPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1149, 184},
+ /* 1939 */ {I_VCMPORD_SPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1158, 184},
+ /* 1940 */ {I_VCMPORD_SPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1167, 184},
+ /* 1941 */ {I_VCMPEQ_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1176, 184},
+ /* 1942 */ {I_VCMPEQ_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1185, 184},
+ /* 1943 */ {I_VCMPEQ_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1194, 184},
+ /* 1944 */ {I_VCMPEQ_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1203, 184},
+ /* 1945 */ {I_VCMPNGE_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1212, 184},
+ /* 1946 */ {I_VCMPNGE_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1221, 184},
+ /* 1947 */ {I_VCMPNGE_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1230, 184},
+ /* 1948 */ {I_VCMPNGE_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1239, 184},
+ /* 1949 */ {I_VCMPNGT_UQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1248, 184},
+ /* 1950 */ {I_VCMPNGT_UQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1257, 184},
+ /* 1951 */ {I_VCMPNGT_UQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1266, 184},
+ /* 1952 */ {I_VCMPNGT_UQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1275, 184},
+ /* 1953 */ {I_VCMPFALSE_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1284, 184},
+ /* 1954 */ {I_VCMPFALSE_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1293, 184},
+ /* 1955 */ {I_VCMPFALSE_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1302, 184},
+ /* 1956 */ {I_VCMPFALSE_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1311, 184},
+ /* 1957 */ {I_VCMPNEQ_OSPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1320, 184},
+ /* 1958 */ {I_VCMPNEQ_OSPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1329, 184},
+ /* 1959 */ {I_VCMPNEQ_OSPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1338, 184},
+ /* 1960 */ {I_VCMPNEQ_OSPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1347, 184},
+ /* 1961 */ {I_VCMPGE_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1356, 184},
+ /* 1962 */ {I_VCMPGE_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1365, 184},
+ /* 1963 */ {I_VCMPGE_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1374, 184},
+ /* 1964 */ {I_VCMPGE_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1383, 184},
+ /* 1965 */ {I_VCMPGT_OQPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1392, 184},
+ /* 1966 */ {I_VCMPGT_OQPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1401, 184},
+ /* 1967 */ {I_VCMPGT_OQPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1410, 184},
+ /* 1968 */ {I_VCMPGT_OQPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1419, 184},
+ /* 1969 */ {I_VCMPTRUE_USPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1428, 184},
+ /* 1970 */ {I_VCMPTRUE_USPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1437, 184},
+ /* 1971 */ {I_VCMPTRUE_USPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1446, 184},
+ /* 1972 */ {I_VCMPTRUE_USPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1455, 184},
+ /* 1973 */ {I_VCMPPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9468, 184},
+ /* 1974 */ {I_VCMPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9476, 184},
+ /* 1975 */ {I_VCMPPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9484, 184},
+ /* 1976 */ {I_VCMPPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9492, 184},
+ /* 1977 */ {I_VCMPEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1464, 184},
+ /* 1978 */ {I_VCMPEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1473, 184},
+ /* 1979 */ {I_VCMPEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1482, 184},
+ /* 1980 */ {I_VCMPEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1491, 184},
+ /* 1981 */ {I_VCMPEQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1500, 184},
+ /* 1982 */ {I_VCMPEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1509, 184},
+ /* 1983 */ {I_VCMPEQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1518, 184},
+ /* 1984 */ {I_VCMPEQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1527, 184},
+ /* 1985 */ {I_VCMPLT_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1536, 184},
+ /* 1986 */ {I_VCMPLT_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1545, 184},
+ /* 1987 */ {I_VCMPLT_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1554, 184},
+ /* 1988 */ {I_VCMPLT_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1563, 184},
+ /* 1989 */ {I_VCMPLTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1536, 184},
+ /* 1990 */ {I_VCMPLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1545, 184},
+ /* 1991 */ {I_VCMPLTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1554, 184},
+ /* 1992 */ {I_VCMPLTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1563, 184},
+ /* 1993 */ {I_VCMPLE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1572, 184},
+ /* 1994 */ {I_VCMPLE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1581, 184},
+ /* 1995 */ {I_VCMPLE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1590, 184},
+ /* 1996 */ {I_VCMPLE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1599, 184},
+ /* 1997 */ {I_VCMPLEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1572, 184},
+ /* 1998 */ {I_VCMPLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1581, 184},
+ /* 1999 */ {I_VCMPLEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1590, 184},
+ /* 2000 */ {I_VCMPLEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1599, 184},
+ /* 2001 */ {I_VCMPUNORD_QPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1608, 184},
+ /* 2002 */ {I_VCMPUNORD_QPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1617, 184},
+ /* 2003 */ {I_VCMPUNORD_QPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1626, 184},
+ /* 2004 */ {I_VCMPUNORD_QPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1635, 184},
+ /* 2005 */ {I_VCMPUNORDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1608, 184},
+ /* 2006 */ {I_VCMPUNORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1617, 184},
+ /* 2007 */ {I_VCMPUNORDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1626, 184},
+ /* 2008 */ {I_VCMPUNORDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1635, 184},
+ /* 2009 */ {I_VCMPNEQ_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1644, 184},
+ /* 2010 */ {I_VCMPNEQ_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1653, 184},
+ /* 2011 */ {I_VCMPNEQ_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1662, 184},
+ /* 2012 */ {I_VCMPNEQ_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1671, 184},
+ /* 2013 */ {I_VCMPNEQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1644, 184},
+ /* 2014 */ {I_VCMPNEQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1653, 184},
+ /* 2015 */ {I_VCMPNEQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1662, 184},
+ /* 2016 */ {I_VCMPNEQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1671, 184},
+ /* 2017 */ {I_VCMPNLT_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1680, 184},
+ /* 2018 */ {I_VCMPNLT_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1689, 184},
+ /* 2019 */ {I_VCMPNLT_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1698, 184},
+ /* 2020 */ {I_VCMPNLT_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1707, 184},
+ /* 2021 */ {I_VCMPNLTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1680, 184},
+ /* 2022 */ {I_VCMPNLTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1689, 184},
+ /* 2023 */ {I_VCMPNLTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1698, 184},
+ /* 2024 */ {I_VCMPNLTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1707, 184},
+ /* 2025 */ {I_VCMPNLE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1716, 184},
+ /* 2026 */ {I_VCMPNLE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1725, 184},
+ /* 2027 */ {I_VCMPNLE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1734, 184},
+ /* 2028 */ {I_VCMPNLE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1743, 184},
+ /* 2029 */ {I_VCMPNLEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1716, 184},
+ /* 2030 */ {I_VCMPNLEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1725, 184},
+ /* 2031 */ {I_VCMPNLEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1734, 184},
+ /* 2032 */ {I_VCMPNLEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1743, 184},
+ /* 2033 */ {I_VCMPORD_QPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1752, 184},
+ /* 2034 */ {I_VCMPORD_QPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1761, 184},
+ /* 2035 */ {I_VCMPORD_QPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1770, 184},
+ /* 2036 */ {I_VCMPORD_QPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1779, 184},
+ /* 2037 */ {I_VCMPORDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1752, 184},
+ /* 2038 */ {I_VCMPORDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1761, 184},
+ /* 2039 */ {I_VCMPORDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1770, 184},
+ /* 2040 */ {I_VCMPORDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1779, 184},
+ /* 2041 */ {I_VCMPEQ_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1788, 184},
+ /* 2042 */ {I_VCMPEQ_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1797, 184},
+ /* 2043 */ {I_VCMPEQ_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1806, 184},
+ /* 2044 */ {I_VCMPEQ_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1815, 184},
+ /* 2045 */ {I_VCMPNGE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1824, 184},
+ /* 2046 */ {I_VCMPNGE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1833, 184},
+ /* 2047 */ {I_VCMPNGE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1842, 184},
+ /* 2048 */ {I_VCMPNGE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1851, 184},
+ /* 2049 */ {I_VCMPNGEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1824, 184},
+ /* 2050 */ {I_VCMPNGEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1833, 184},
+ /* 2051 */ {I_VCMPNGEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1842, 184},
+ /* 2052 */ {I_VCMPNGEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1851, 184},
+ /* 2053 */ {I_VCMPNGT_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1860, 184},
+ /* 2054 */ {I_VCMPNGT_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1869, 184},
+ /* 2055 */ {I_VCMPNGT_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1878, 184},
+ /* 2056 */ {I_VCMPNGT_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1887, 184},
+ /* 2057 */ {I_VCMPNGTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1860, 184},
+ /* 2058 */ {I_VCMPNGTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1869, 184},
+ /* 2059 */ {I_VCMPNGTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1878, 184},
+ /* 2060 */ {I_VCMPNGTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1887, 184},
+ /* 2061 */ {I_VCMPFALSE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1896, 184},
+ /* 2062 */ {I_VCMPFALSE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1905, 184},
+ /* 2063 */ {I_VCMPFALSE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1914, 184},
+ /* 2064 */ {I_VCMPFALSE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1923, 184},
+ /* 2065 */ {I_VCMPFALSEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1896, 184},
+ /* 2066 */ {I_VCMPFALSEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1905, 184},
+ /* 2067 */ {I_VCMPFALSEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1914, 184},
+ /* 2068 */ {I_VCMPFALSEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1923, 184},
+ /* 2069 */ {I_VCMPNEQ_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1932, 184},
+ /* 2070 */ {I_VCMPNEQ_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1941, 184},
+ /* 2071 */ {I_VCMPNEQ_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1950, 184},
+ /* 2072 */ {I_VCMPNEQ_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1959, 184},
+ /* 2073 */ {I_VCMPGE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1968, 184},
+ /* 2074 */ {I_VCMPGE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1977, 184},
+ /* 2075 */ {I_VCMPGE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1986, 184},
+ /* 2076 */ {I_VCMPGE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1995, 184},
+ /* 2077 */ {I_VCMPGEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1968, 184},
+ /* 2078 */ {I_VCMPGEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1977, 184},
+ /* 2079 */ {I_VCMPGEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1986, 184},
+ /* 2080 */ {I_VCMPGEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1995, 184},
+ /* 2081 */ {I_VCMPGT_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2004, 184},
+ /* 2082 */ {I_VCMPGT_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2013, 184},
+ /* 2083 */ {I_VCMPGT_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2022, 184},
+ /* 2084 */ {I_VCMPGT_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2031, 184},
+ /* 2085 */ {I_VCMPGTPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2004, 184},
+ /* 2086 */ {I_VCMPGTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2013, 184},
+ /* 2087 */ {I_VCMPGTPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2022, 184},
+ /* 2088 */ {I_VCMPGTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2031, 184},
+ /* 2089 */ {I_VCMPTRUE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2040, 184},
+ /* 2090 */ {I_VCMPTRUE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2049, 184},
+ /* 2091 */ {I_VCMPTRUE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2058, 184},
+ /* 2092 */ {I_VCMPTRUE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2067, 184},
+ /* 2093 */ {I_VCMPTRUEPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2040, 184},
+ /* 2094 */ {I_VCMPTRUEPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2049, 184},
+ /* 2095 */ {I_VCMPTRUEPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2058, 184},
+ /* 2096 */ {I_VCMPTRUEPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2067, 184},
+ /* 2097 */ {I_VCMPEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+1464, 184},
+ /* 2098 */ {I_VCMPEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+1473, 184},
+ /* 2099 */ {I_VCMPEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+1482, 184},
+ /* 2100 */ {I_VCMPEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+1491, 184},
+ /* 2101 */ {I_VCMPLT_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2076, 184},
+ /* 2102 */ {I_VCMPLT_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2085, 184},
+ /* 2103 */ {I_VCMPLT_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2094, 184},
+ /* 2104 */ {I_VCMPLT_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2103, 184},
+ /* 2105 */ {I_VCMPLE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2112, 184},
+ /* 2106 */ {I_VCMPLE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2121, 184},
+ /* 2107 */ {I_VCMPLE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2130, 184},
+ /* 2108 */ {I_VCMPLE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2139, 184},
+ /* 2109 */ {I_VCMPUNORD_SPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2148, 184},
+ /* 2110 */ {I_VCMPUNORD_SPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2157, 184},
+ /* 2111 */ {I_VCMPUNORD_SPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2166, 184},
+ /* 2112 */ {I_VCMPUNORD_SPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2175, 184},
+ /* 2113 */ {I_VCMPNEQ_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2184, 184},
+ /* 2114 */ {I_VCMPNEQ_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2193, 184},
+ /* 2115 */ {I_VCMPNEQ_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2202, 184},
+ /* 2116 */ {I_VCMPNEQ_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2211, 184},
+ /* 2117 */ {I_VCMPNLT_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2220, 184},
+ /* 2118 */ {I_VCMPNLT_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2229, 184},
+ /* 2119 */ {I_VCMPNLT_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2238, 184},
+ /* 2120 */ {I_VCMPNLT_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2247, 184},
+ /* 2121 */ {I_VCMPNLE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2256, 184},
+ /* 2122 */ {I_VCMPNLE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2265, 184},
+ /* 2123 */ {I_VCMPNLE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2274, 184},
+ /* 2124 */ {I_VCMPNLE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2283, 184},
+ /* 2125 */ {I_VCMPORD_SPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2292, 184},
+ /* 2126 */ {I_VCMPORD_SPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2301, 184},
+ /* 2127 */ {I_VCMPORD_SPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2310, 184},
+ /* 2128 */ {I_VCMPORD_SPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2319, 184},
+ /* 2129 */ {I_VCMPEQ_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2328, 184},
+ /* 2130 */ {I_VCMPEQ_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2337, 184},
+ /* 2131 */ {I_VCMPEQ_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2346, 184},
+ /* 2132 */ {I_VCMPEQ_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2355, 184},
+ /* 2133 */ {I_VCMPNGE_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2364, 184},
+ /* 2134 */ {I_VCMPNGE_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2373, 184},
+ /* 2135 */ {I_VCMPNGE_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2382, 184},
+ /* 2136 */ {I_VCMPNGE_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2391, 184},
+ /* 2137 */ {I_VCMPNGT_UQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2400, 184},
+ /* 2138 */ {I_VCMPNGT_UQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2409, 184},
+ /* 2139 */ {I_VCMPNGT_UQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2418, 184},
+ /* 2140 */ {I_VCMPNGT_UQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2427, 184},
+ /* 2141 */ {I_VCMPFALSE_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2436, 184},
+ /* 2142 */ {I_VCMPFALSE_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2445, 184},
+ /* 2143 */ {I_VCMPFALSE_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2454, 184},
+ /* 2144 */ {I_VCMPFALSE_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2463, 184},
+ /* 2145 */ {I_VCMPNEQ_OSPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2472, 184},
+ /* 2146 */ {I_VCMPNEQ_OSPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2481, 184},
+ /* 2147 */ {I_VCMPNEQ_OSPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2490, 184},
+ /* 2148 */ {I_VCMPNEQ_OSPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2499, 184},
+ /* 2149 */ {I_VCMPGE_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2508, 184},
+ /* 2150 */ {I_VCMPGE_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2517, 184},
+ /* 2151 */ {I_VCMPGE_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2526, 184},
+ /* 2152 */ {I_VCMPGE_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2535, 184},
+ /* 2153 */ {I_VCMPGT_OQPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2544, 184},
+ /* 2154 */ {I_VCMPGT_OQPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2553, 184},
+ /* 2155 */ {I_VCMPGT_OQPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2562, 184},
+ /* 2156 */ {I_VCMPGT_OQPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2571, 184},
+ /* 2157 */ {I_VCMPTRUE_USPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+2580, 184},
+ /* 2158 */ {I_VCMPTRUE_USPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+2589, 184},
+ /* 2159 */ {I_VCMPTRUE_USPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+2598, 184},
+ /* 2160 */ {I_VCMPTRUE_USPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+2607, 184},
+ /* 2161 */ {I_VCMPPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9500, 184},
+ /* 2162 */ {I_VCMPPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9508, 184},
+ /* 2163 */ {I_VCMPPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9516, 184},
+ /* 2164 */ {I_VCMPPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9524, 184},
+ /* 2165 */ {I_VCMPEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2616, 184},
+ /* 2166 */ {I_VCMPEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2625, 184},
+ /* 2167 */ {I_VCMPEQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2634, 184},
+ /* 2168 */ {I_VCMPEQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2643, 184},
+ /* 2169 */ {I_VCMPLT_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2652, 184},
+ /* 2170 */ {I_VCMPLT_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2661, 184},
+ /* 2171 */ {I_VCMPLTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2652, 184},
+ /* 2172 */ {I_VCMPLTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2661, 184},
+ /* 2173 */ {I_VCMPLE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2670, 184},
+ /* 2174 */ {I_VCMPLE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2679, 184},
+ /* 2175 */ {I_VCMPLESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2670, 184},
+ /* 2176 */ {I_VCMPLESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2679, 184},
+ /* 2177 */ {I_VCMPUNORD_QSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2688, 184},
+ /* 2178 */ {I_VCMPUNORD_QSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2697, 184},
+ /* 2179 */ {I_VCMPUNORDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2688, 184},
+ /* 2180 */ {I_VCMPUNORDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2697, 184},
+ /* 2181 */ {I_VCMPNEQ_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2706, 184},
+ /* 2182 */ {I_VCMPNEQ_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2715, 184},
+ /* 2183 */ {I_VCMPNEQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2706, 184},
+ /* 2184 */ {I_VCMPNEQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2715, 184},
+ /* 2185 */ {I_VCMPNLT_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2724, 184},
+ /* 2186 */ {I_VCMPNLT_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2733, 184},
+ /* 2187 */ {I_VCMPNLTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2724, 184},
+ /* 2188 */ {I_VCMPNLTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2733, 184},
+ /* 2189 */ {I_VCMPNLE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2742, 184},
+ /* 2190 */ {I_VCMPNLE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2751, 184},
+ /* 2191 */ {I_VCMPNLESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2742, 184},
+ /* 2192 */ {I_VCMPNLESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2751, 184},
+ /* 2193 */ {I_VCMPORD_QSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2760, 184},
+ /* 2194 */ {I_VCMPORD_QSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2769, 184},
+ /* 2195 */ {I_VCMPORDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2760, 184},
+ /* 2196 */ {I_VCMPORDSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2769, 184},
+ /* 2197 */ {I_VCMPEQ_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2778, 184},
+ /* 2198 */ {I_VCMPEQ_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2787, 184},
+ /* 2199 */ {I_VCMPNGE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2796, 184},
+ /* 2200 */ {I_VCMPNGE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2805, 184},
+ /* 2201 */ {I_VCMPNGESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2796, 184},
+ /* 2202 */ {I_VCMPNGESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2805, 184},
+ /* 2203 */ {I_VCMPNGT_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2814, 184},
+ /* 2204 */ {I_VCMPNGT_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2823, 184},
+ /* 2205 */ {I_VCMPNGTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2814, 184},
+ /* 2206 */ {I_VCMPNGTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2823, 184},
+ /* 2207 */ {I_VCMPFALSE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2832, 184},
+ /* 2208 */ {I_VCMPFALSE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2841, 184},
+ /* 2209 */ {I_VCMPFALSESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2832, 184},
+ /* 2210 */ {I_VCMPFALSESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2841, 184},
+ /* 2211 */ {I_VCMPNEQ_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2850, 184},
+ /* 2212 */ {I_VCMPNEQ_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2859, 184},
+ /* 2213 */ {I_VCMPGE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2868, 184},
+ /* 2214 */ {I_VCMPGE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2877, 184},
+ /* 2215 */ {I_VCMPGESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2868, 184},
+ /* 2216 */ {I_VCMPGESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2877, 184},
+ /* 2217 */ {I_VCMPGT_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2886, 184},
+ /* 2218 */ {I_VCMPGT_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2895, 184},
+ /* 2219 */ {I_VCMPGTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2886, 184},
+ /* 2220 */ {I_VCMPGTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2895, 184},
+ /* 2221 */ {I_VCMPTRUE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2904, 184},
+ /* 2222 */ {I_VCMPTRUE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2913, 184},
+ /* 2223 */ {I_VCMPTRUESD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2904, 184},
+ /* 2224 */ {I_VCMPTRUESD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2913, 184},
+ /* 2225 */ {I_VCMPEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2616, 184},
+ /* 2226 */ {I_VCMPEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2625, 184},
+ /* 2227 */ {I_VCMPLT_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2922, 184},
+ /* 2228 */ {I_VCMPLT_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2931, 184},
+ /* 2229 */ {I_VCMPLE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2940, 184},
+ /* 2230 */ {I_VCMPLE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2949, 184},
+ /* 2231 */ {I_VCMPUNORD_SSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2958, 184},
+ /* 2232 */ {I_VCMPUNORD_SSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2967, 184},
+ /* 2233 */ {I_VCMPNEQ_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2976, 184},
+ /* 2234 */ {I_VCMPNEQ_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+2985, 184},
+ /* 2235 */ {I_VCMPNLT_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+2994, 184},
+ /* 2236 */ {I_VCMPNLT_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3003, 184},
+ /* 2237 */ {I_VCMPNLE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3012, 184},
+ /* 2238 */ {I_VCMPNLE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3021, 184},
+ /* 2239 */ {I_VCMPORD_SSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3030, 184},
+ /* 2240 */ {I_VCMPORD_SSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3039, 184},
+ /* 2241 */ {I_VCMPEQ_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3048, 184},
+ /* 2242 */ {I_VCMPEQ_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3057, 184},
+ /* 2243 */ {I_VCMPNGE_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3066, 184},
+ /* 2244 */ {I_VCMPNGE_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3075, 184},
+ /* 2245 */ {I_VCMPNGT_UQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3084, 184},
+ /* 2246 */ {I_VCMPNGT_UQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3093, 184},
+ /* 2247 */ {I_VCMPFALSE_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3102, 184},
+ /* 2248 */ {I_VCMPFALSE_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3111, 184},
+ /* 2249 */ {I_VCMPNEQ_OSSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3120, 184},
+ /* 2250 */ {I_VCMPNEQ_OSSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3129, 184},
+ /* 2251 */ {I_VCMPGE_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3138, 184},
+ /* 2252 */ {I_VCMPGE_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3147, 184},
+ /* 2253 */ {I_VCMPGT_OQSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3156, 184},
+ /* 2254 */ {I_VCMPGT_OQSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3165, 184},
+ /* 2255 */ {I_VCMPTRUE_USSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3174, 184},
+ /* 2256 */ {I_VCMPTRUE_USSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3183, 184},
+ /* 2257 */ {I_VCMPSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9532, 184},
+ /* 2258 */ {I_VCMPSD, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9540, 184},
+ /* 2259 */ {I_VCMPEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3192, 184},
+ /* 2260 */ {I_VCMPEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3201, 184},
+ /* 2261 */ {I_VCMPEQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3210, 184},
+ /* 2262 */ {I_VCMPEQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3219, 184},
+ /* 2263 */ {I_VCMPLT_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3228, 184},
+ /* 2264 */ {I_VCMPLT_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3237, 184},
+ /* 2265 */ {I_VCMPLTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3228, 184},
+ /* 2266 */ {I_VCMPLTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3237, 184},
+ /* 2267 */ {I_VCMPLE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3246, 184},
+ /* 2268 */ {I_VCMPLE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3255, 184},
+ /* 2269 */ {I_VCMPLESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3246, 184},
+ /* 2270 */ {I_VCMPLESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3255, 184},
+ /* 2271 */ {I_VCMPUNORD_QSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3264, 184},
+ /* 2272 */ {I_VCMPUNORD_QSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3273, 184},
+ /* 2273 */ {I_VCMPUNORDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3264, 184},
+ /* 2274 */ {I_VCMPUNORDSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3273, 184},
+ /* 2275 */ {I_VCMPNEQ_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3282, 184},
+ /* 2276 */ {I_VCMPNEQ_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3291, 184},
+ /* 2277 */ {I_VCMPNEQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3282, 184},
+ /* 2278 */ {I_VCMPNEQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3291, 184},
+ /* 2279 */ {I_VCMPNLT_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3300, 184},
+ /* 2280 */ {I_VCMPNLT_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3309, 184},
+ /* 2281 */ {I_VCMPNLTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3300, 184},
+ /* 2282 */ {I_VCMPNLTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3309, 184},
+ /* 2283 */ {I_VCMPNLE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3318, 184},
+ /* 2284 */ {I_VCMPNLE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3327, 184},
+ /* 2285 */ {I_VCMPNLESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3318, 184},
+ /* 2286 */ {I_VCMPNLESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3327, 184},
+ /* 2287 */ {I_VCMPORD_QSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3336, 184},
+ /* 2288 */ {I_VCMPORD_QSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3345, 184},
+ /* 2289 */ {I_VCMPORDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3336, 184},
+ /* 2290 */ {I_VCMPORDSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3345, 184},
+ /* 2291 */ {I_VCMPEQ_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3354, 184},
+ /* 2292 */ {I_VCMPEQ_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3363, 184},
+ /* 2293 */ {I_VCMPNGE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3372, 184},
+ /* 2294 */ {I_VCMPNGE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3381, 184},
+ /* 2295 */ {I_VCMPNGESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3372, 184},
+ /* 2296 */ {I_VCMPNGESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3381, 184},
+ /* 2297 */ {I_VCMPNGT_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3390, 184},
+ /* 2298 */ {I_VCMPNGT_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3399, 184},
+ /* 2299 */ {I_VCMPNGTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3390, 184},
+ /* 2300 */ {I_VCMPNGTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3399, 184},
+ /* 2301 */ {I_VCMPFALSE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3408, 184},
+ /* 2302 */ {I_VCMPFALSE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3417, 184},
+ /* 2303 */ {I_VCMPFALSESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3408, 184},
+ /* 2304 */ {I_VCMPFALSESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3417, 184},
+ /* 2305 */ {I_VCMPNEQ_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3426, 184},
+ /* 2306 */ {I_VCMPNEQ_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3435, 184},
+ /* 2307 */ {I_VCMPGE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3444, 184},
+ /* 2308 */ {I_VCMPGE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3453, 184},
+ /* 2309 */ {I_VCMPGESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3444, 184},
+ /* 2310 */ {I_VCMPGESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3453, 184},
+ /* 2311 */ {I_VCMPGT_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3462, 184},
+ /* 2312 */ {I_VCMPGT_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3471, 184},
+ /* 2313 */ {I_VCMPGTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3462, 184},
+ /* 2314 */ {I_VCMPGTSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3471, 184},
+ /* 2315 */ {I_VCMPTRUE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3480, 184},
+ /* 2316 */ {I_VCMPTRUE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3489, 184},
+ /* 2317 */ {I_VCMPTRUESS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3480, 184},
+ /* 2318 */ {I_VCMPTRUESS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3489, 184},
+ /* 2319 */ {I_VCMPEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3192, 184},
+ /* 2320 */ {I_VCMPEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3201, 184},
+ /* 2321 */ {I_VCMPLT_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3498, 184},
+ /* 2322 */ {I_VCMPLT_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3507, 184},
+ /* 2323 */ {I_VCMPLE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3516, 184},
+ /* 2324 */ {I_VCMPLE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3525, 184},
+ /* 2325 */ {I_VCMPUNORD_SSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3534, 184},
+ /* 2326 */ {I_VCMPUNORD_SSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3543, 184},
+ /* 2327 */ {I_VCMPNEQ_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3552, 184},
+ /* 2328 */ {I_VCMPNEQ_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3561, 184},
+ /* 2329 */ {I_VCMPNLT_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3570, 184},
+ /* 2330 */ {I_VCMPNLT_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3579, 184},
+ /* 2331 */ {I_VCMPNLE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3588, 184},
+ /* 2332 */ {I_VCMPNLE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3597, 184},
+ /* 2333 */ {I_VCMPORD_SSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3606, 184},
+ /* 2334 */ {I_VCMPORD_SSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3615, 184},
+ /* 2335 */ {I_VCMPEQ_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3624, 184},
+ /* 2336 */ {I_VCMPEQ_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3633, 184},
+ /* 2337 */ {I_VCMPNGE_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3642, 184},
+ /* 2338 */ {I_VCMPNGE_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3651, 184},
+ /* 2339 */ {I_VCMPNGT_UQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3660, 184},
+ /* 2340 */ {I_VCMPNGT_UQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3669, 184},
+ /* 2341 */ {I_VCMPFALSE_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3678, 184},
+ /* 2342 */ {I_VCMPFALSE_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3687, 184},
+ /* 2343 */ {I_VCMPNEQ_OSSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3696, 184},
+ /* 2344 */ {I_VCMPNEQ_OSSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3705, 184},
+ /* 2345 */ {I_VCMPGE_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3714, 184},
+ /* 2346 */ {I_VCMPGE_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3723, 184},
+ /* 2347 */ {I_VCMPGT_OQSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3732, 184},
+ /* 2348 */ {I_VCMPGT_OQSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3741, 184},
+ /* 2349 */ {I_VCMPTRUE_USSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+3750, 184},
+ /* 2350 */ {I_VCMPTRUE_USSS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+3759, 184},
+ /* 2351 */ {I_VCMPSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9548, 184},
+ /* 2352 */ {I_VCMPSS, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9556, 184},
+ /* 2353 */ {I_VCOMISD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28092, 184},
+ /* 2354 */ {I_VCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28099, 184},
+ /* 2355 */ {I_VCVTDQ2PD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28106, 184},
+ /* 2356 */ {I_VCVTDQ2PD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28113, 184},
+ /* 2357 */ {I_VCVTDQ2PS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28120, 184},
+ /* 2358 */ {I_VCVTDQ2PS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28127, 184},
+ /* 2359 */ {I_VCVTPD2DQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28134, 184},
+ /* 2360 */ {I_VCVTPD2DQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28134, 188},
+ /* 2361 */ {I_VCVTPD2DQ, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28141, 184},
+ /* 2362 */ {I_VCVTPD2DQ, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28141, 189},
+ /* 2363 */ {I_VCVTPD2PS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28148, 184},
+ /* 2364 */ {I_VCVTPD2PS, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28148, 188},
+ /* 2365 */ {I_VCVTPD2PS, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28155, 184},
+ /* 2366 */ {I_VCVTPD2PS, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28155, 189},
+ /* 2367 */ {I_VCVTPS2DQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28162, 184},
+ /* 2368 */ {I_VCVTPS2DQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28169, 184},
+ /* 2369 */ {I_VCVTPS2PD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28176, 184},
+ /* 2370 */ {I_VCVTPS2PD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28183, 184},
+ /* 2371 */ {I_VCVTSD2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28190, 184},
+ /* 2372 */ {I_VCVTSD2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28197, 190},
+ /* 2373 */ {I_VCVTSD2SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28204, 184},
+ /* 2374 */ {I_VCVTSD2SS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28211, 184},
+ /* 2375 */ {I_VCVTSI2SD, 3, {XMM_L16,XMM_L16,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28218, 191},
+ /* 2376 */ {I_VCVTSI2SD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28225, 191},
+ /* 2377 */ {I_VCVTSI2SD, 3, {XMM_L16,XMM_L16,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28232, 192},
+ /* 2378 */ {I_VCVTSI2SD, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28239, 192},
+ /* 2379 */ {I_VCVTSI2SS, 3, {XMM_L16,XMM_L16,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28246, 191},
+ /* 2380 */ {I_VCVTSI2SS, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28253, 191},
+ /* 2381 */ {I_VCVTSI2SS, 3, {XMM_L16,XMM_L16,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28260, 192},
+ /* 2382 */ {I_VCVTSI2SS, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28267, 192},
+ /* 2383 */ {I_VCVTSS2SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28274, 184},
+ /* 2384 */ {I_VCVTSS2SD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28281, 184},
+ /* 2385 */ {I_VCVTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28288, 184},
+ /* 2386 */ {I_VCVTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28295, 190},
+ /* 2387 */ {I_VCVTTPD2DQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28302, 184},
+ /* 2388 */ {I_VCVTTPD2DQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28302, 188},
+ /* 2389 */ {I_VCVTTPD2DQ, 2, {XMM_L16,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28309, 184},
+ /* 2390 */ {I_VCVTTPD2DQ, 2, {XMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28309, 189},
+ /* 2391 */ {I_VCVTTPS2DQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28316, 184},
+ /* 2392 */ {I_VCVTTPS2DQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28323, 184},
+ /* 2393 */ {I_VCVTTSD2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28330, 184},
+ /* 2394 */ {I_VCVTTSD2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28337, 190},
+ /* 2395 */ {I_VCVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28344, 184},
+ /* 2396 */ {I_VCVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28351, 190},
+ /* 2397 */ {I_VDIVPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28358, 184},
+ /* 2398 */ {I_VDIVPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28365, 184},
+ /* 2399 */ {I_VDIVPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28372, 184},
+ /* 2400 */ {I_VDIVPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28379, 184},
+ /* 2401 */ {I_VDIVPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28386, 184},
+ /* 2402 */ {I_VDIVPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28393, 184},
+ /* 2403 */ {I_VDIVPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28400, 184},
+ /* 2404 */ {I_VDIVPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28407, 184},
+ /* 2405 */ {I_VDIVSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28414, 184},
+ /* 2406 */ {I_VDIVSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28421, 184},
+ /* 2407 */ {I_VDIVSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28428, 184},
+ /* 2408 */ {I_VDIVSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28435, 184},
+ /* 2409 */ {I_VDPPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9564, 184},
+ /* 2410 */ {I_VDPPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9572, 184},
+ /* 2411 */ {I_VDPPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9580, 184},
+ /* 2412 */ {I_VDPPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9588, 184},
+ /* 2413 */ {I_VDPPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9596, 184},
+ /* 2414 */ {I_VDPPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9604, 184},
+ /* 2415 */ {I_VEXTRACTF128, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9612, 184},
+ /* 2416 */ {I_VEXTRACTPS, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9620, 184},
+ /* 2417 */ {I_VHADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28442, 184},
+ /* 2418 */ {I_VHADDPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28449, 184},
+ /* 2419 */ {I_VHADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28456, 184},
+ /* 2420 */ {I_VHADDPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28463, 184},
+ /* 2421 */ {I_VHADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28470, 184},
+ /* 2422 */ {I_VHADDPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28477, 184},
+ /* 2423 */ {I_VHADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28484, 184},
+ /* 2424 */ {I_VHADDPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28491, 184},
+ /* 2425 */ {I_VHSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28498, 184},
+ /* 2426 */ {I_VHSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28505, 184},
+ /* 2427 */ {I_VHSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28512, 184},
+ /* 2428 */ {I_VHSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28519, 184},
+ /* 2429 */ {I_VHSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28526, 184},
+ /* 2430 */ {I_VHSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28533, 184},
+ /* 2431 */ {I_VHSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28540, 184},
+ /* 2432 */ {I_VHSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28547, 184},
+ /* 2433 */ {I_VINSERTF128, 4, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9628, 184},
+ /* 2434 */ {I_VINSERTF128, 3, {YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9636, 184},
+ /* 2435 */ {I_VINSERTPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9644, 184},
+ /* 2436 */ {I_VINSERTPS, 3, {XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9652, 184},
+ /* 2437 */ {I_VLDDQU, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28554, 184},
+ /* 2438 */ {I_VLDQQU, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28561, 184},
+ /* 2439 */ {I_VLDDQU, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28561, 184},
+ /* 2440 */ {I_VLDMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+28568, 184},
+ /* 2441 */ {I_VMASKMOVDQU, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28575, 184},
+ /* 2442 */ {I_VMASKMOVPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28582, 184},
+ /* 2443 */ {I_VMASKMOVPS, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28589, 184},
+ /* 2444 */ {I_VMASKMOVPS, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28596, 188},
+ /* 2445 */ {I_VMASKMOVPS, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28603, 189},
+ /* 2446 */ {I_VMASKMOVPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28610, 184},
+ /* 2447 */ {I_VMASKMOVPD, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28617, 184},
+ /* 2448 */ {I_VMASKMOVPD, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28624, 184},
+ /* 2449 */ {I_VMASKMOVPD, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28631, 184},
+ /* 2450 */ {I_VMAXPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28638, 184},
+ /* 2451 */ {I_VMAXPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28645, 184},
+ /* 2452 */ {I_VMAXPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28652, 184},
+ /* 2453 */ {I_VMAXPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28659, 184},
+ /* 2454 */ {I_VMAXPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28666, 184},
+ /* 2455 */ {I_VMAXPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28673, 184},
+ /* 2456 */ {I_VMAXPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28680, 184},
+ /* 2457 */ {I_VMAXPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28687, 184},
+ /* 2458 */ {I_VMAXSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28694, 184},
+ /* 2459 */ {I_VMAXSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28701, 184},
+ /* 2460 */ {I_VMAXSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28708, 184},
+ /* 2461 */ {I_VMAXSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28715, 184},
+ /* 2462 */ {I_VMINPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28722, 184},
+ /* 2463 */ {I_VMINPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28729, 184},
+ /* 2464 */ {I_VMINPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28736, 184},
+ /* 2465 */ {I_VMINPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28743, 184},
+ /* 2466 */ {I_VMINPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+28750, 184},
+ /* 2467 */ {I_VMINPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28757, 184},
+ /* 2468 */ {I_VMINPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+28764, 184},
+ /* 2469 */ {I_VMINPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28771, 184},
+ /* 2470 */ {I_VMINSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28778, 184},
+ /* 2471 */ {I_VMINSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28785, 184},
+ /* 2472 */ {I_VMINSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+28792, 184},
+ /* 2473 */ {I_VMINSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28799, 184},
+ /* 2474 */ {I_VMOVAPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28806, 184},
+ /* 2475 */ {I_VMOVAPD, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28813, 184},
+ /* 2476 */ {I_VMOVAPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28820, 184},
+ /* 2477 */ {I_VMOVAPD, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28827, 184},
+ /* 2478 */ {I_VMOVAPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28834, 184},
+ /* 2479 */ {I_VMOVAPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28841, 184},
+ /* 2480 */ {I_VMOVAPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28848, 184},
+ /* 2481 */ {I_VMOVAPS, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28855, 184},
+ /* 2482 */ {I_VMOVD, 2, {XMM_L16,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+28862, 184},
+ /* 2483 */ {I_VMOVD, 2, {RM_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28869, 184},
+ /* 2484 */ {I_VMOVQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28876, 193},
+ /* 2485 */ {I_VMOVQ, 2, {RM_XMM_L16|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28883, 193},
+ /* 2486 */ {I_VMOVQ, 2, {XMM_L16,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28890, 192},
+ /* 2487 */ {I_VMOVQ, 2, {RM_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28897, 192},
+ /* 2488 */ {I_VMOVDDUP, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28904, 184},
+ /* 2489 */ {I_VMOVDDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28911, 184},
+ /* 2490 */ {I_VMOVDQA, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28918, 184},
+ /* 2491 */ {I_VMOVDQA, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28925, 184},
+ /* 2492 */ {I_VMOVQQA, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28932, 184},
+ /* 2493 */ {I_VMOVQQA, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28939, 184},
+ /* 2494 */ {I_VMOVDQA, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28932, 184},
+ /* 2495 */ {I_VMOVDQA, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28939, 184},
+ /* 2496 */ {I_VMOVDQU, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+28946, 184},
+ /* 2497 */ {I_VMOVDQU, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28953, 184},
+ /* 2498 */ {I_VMOVQQU, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28960, 184},
+ /* 2499 */ {I_VMOVQQU, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28967, 184},
+ /* 2500 */ {I_VMOVDQU, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+28960, 184},
+ /* 2501 */ {I_VMOVDQU, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28967, 184},
+ /* 2502 */ {I_VMOVHLPS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+28974, 184},
+ /* 2503 */ {I_VMOVHLPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28981, 184},
+ /* 2504 */ {I_VMOVHPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28988, 184},
+ /* 2505 */ {I_VMOVHPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28995, 184},
+ /* 2506 */ {I_VMOVHPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29002, 184},
+ /* 2507 */ {I_VMOVHPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29009, 184},
+ /* 2508 */ {I_VMOVHPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29016, 184},
+ /* 2509 */ {I_VMOVHPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29023, 184},
+ /* 2510 */ {I_VMOVLHPS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29009, 184},
+ /* 2511 */ {I_VMOVLHPS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29016, 184},
+ /* 2512 */ {I_VMOVLPD, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29030, 184},
+ /* 2513 */ {I_VMOVLPD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29037, 184},
+ /* 2514 */ {I_VMOVLPD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29044, 184},
+ /* 2515 */ {I_VMOVLPS, 3, {XMM_L16,XMM_L16,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+28974, 184},
+ /* 2516 */ {I_VMOVLPS, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+28981, 184},
+ /* 2517 */ {I_VMOVLPS, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29051, 184},
+ /* 2518 */ {I_VMOVMSKPD, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29058, 190},
+ /* 2519 */ {I_VMOVMSKPD, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29058, 184},
+ /* 2520 */ {I_VMOVMSKPD, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29065, 190},
+ /* 2521 */ {I_VMOVMSKPD, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29065, 184},
+ /* 2522 */ {I_VMOVMSKPS, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29072, 190},
+ /* 2523 */ {I_VMOVMSKPS, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29072, 184},
+ /* 2524 */ {I_VMOVMSKPS, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29079, 190},
+ /* 2525 */ {I_VMOVMSKPS, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29079, 184},
+ /* 2526 */ {I_VMOVNTDQ, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29086, 184},
+ /* 2527 */ {I_VMOVNTQQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29093, 184},
+ /* 2528 */ {I_VMOVNTDQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29093, 184},
+ /* 2529 */ {I_VMOVNTDQA, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29100, 184},
+ /* 2530 */ {I_VMOVNTPD, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29107, 184},
+ /* 2531 */ {I_VMOVNTPD, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29114, 184},
+ /* 2532 */ {I_VMOVNTPS, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29121, 184},
+ /* 2533 */ {I_VMOVNTPS, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29128, 184},
+ /* 2534 */ {I_VMOVSD, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29135, 184},
+ /* 2535 */ {I_VMOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29142, 184},
+ /* 2536 */ {I_VMOVSD, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29149, 184},
+ /* 2537 */ {I_VMOVSD, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29156, 184},
+ /* 2538 */ {I_VMOVSD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29163, 184},
+ /* 2539 */ {I_VMOVSD, 2, {MEMORY|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29170, 184},
+ /* 2540 */ {I_VMOVSHDUP, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29177, 184},
+ /* 2541 */ {I_VMOVSHDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29184, 184},
+ /* 2542 */ {I_VMOVSLDUP, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29191, 184},
+ /* 2543 */ {I_VMOVSLDUP, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29198, 184},
+ /* 2544 */ {I_VMOVSS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29205, 184},
+ /* 2545 */ {I_VMOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29212, 184},
+ /* 2546 */ {I_VMOVSS, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+29219, 184},
+ /* 2547 */ {I_VMOVSS, 3, {XMM_L16,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+29226, 184},
+ /* 2548 */ {I_VMOVSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29233, 184},
+ /* 2549 */ {I_VMOVSS, 2, {MEMORY|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29240, 184},
+ /* 2550 */ {I_VMOVUPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29247, 184},
+ /* 2551 */ {I_VMOVUPD, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29254, 184},
+ /* 2552 */ {I_VMOVUPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29261, 184},
+ /* 2553 */ {I_VMOVUPD, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29268, 184},
+ /* 2554 */ {I_VMOVUPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29275, 184},
+ /* 2555 */ {I_VMOVUPS, 2, {RM_XMM_L16|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29282, 184},
+ /* 2556 */ {I_VMOVUPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29289, 184},
+ /* 2557 */ {I_VMOVUPS, 2, {RM_YMM_L16|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+29296, 184},
+ /* 2558 */ {I_VMPSADBW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9660, 184},
+ /* 2559 */ {I_VMPSADBW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9668, 184},
+ /* 2560 */ {I_VMULPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29303, 184},
+ /* 2561 */ {I_VMULPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29310, 184},
+ /* 2562 */ {I_VMULPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29317, 184},
+ /* 2563 */ {I_VMULPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29324, 184},
+ /* 2564 */ {I_VMULPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29331, 184},
+ /* 2565 */ {I_VMULPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29338, 184},
+ /* 2566 */ {I_VMULPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29345, 184},
+ /* 2567 */ {I_VMULPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29352, 184},
+ /* 2568 */ {I_VMULSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+29359, 184},
+ /* 2569 */ {I_VMULSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+29366, 184},
+ /* 2570 */ {I_VMULSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+29373, 184},
+ /* 2571 */ {I_VMULSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+29380, 184},
+ /* 2572 */ {I_VORPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29387, 184},
+ /* 2573 */ {I_VORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29394, 184},
+ /* 2574 */ {I_VORPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29401, 184},
+ /* 2575 */ {I_VORPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29408, 184},
+ /* 2576 */ {I_VORPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29415, 184},
+ /* 2577 */ {I_VORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29422, 184},
+ /* 2578 */ {I_VORPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29429, 184},
+ /* 2579 */ {I_VORPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29436, 184},
+ /* 2580 */ {I_VPABSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29443, 184},
+ /* 2581 */ {I_VPABSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29450, 184},
+ /* 2582 */ {I_VPABSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29457, 184},
+ /* 2583 */ {I_VPACKSSWB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29464, 184},
+ /* 2584 */ {I_VPACKSSWB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29471, 184},
+ /* 2585 */ {I_VPACKSSDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29478, 184},
+ /* 2586 */ {I_VPACKSSDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29485, 184},
+ /* 2587 */ {I_VPACKUSWB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29492, 184},
+ /* 2588 */ {I_VPACKUSWB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29499, 184},
+ /* 2589 */ {I_VPACKUSDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29506, 184},
+ /* 2590 */ {I_VPACKUSDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29513, 184},
+ /* 2591 */ {I_VPADDB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29520, 184},
+ /* 2592 */ {I_VPADDB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29527, 184},
+ /* 2593 */ {I_VPADDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29534, 184},
+ /* 2594 */ {I_VPADDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29541, 184},
+ /* 2595 */ {I_VPADDD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29548, 184},
+ /* 2596 */ {I_VPADDD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29555, 184},
+ /* 2597 */ {I_VPADDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29562, 184},
+ /* 2598 */ {I_VPADDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29569, 184},
+ /* 2599 */ {I_VPADDSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29576, 184},
+ /* 2600 */ {I_VPADDSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29583, 184},
+ /* 2601 */ {I_VPADDSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29590, 184},
+ /* 2602 */ {I_VPADDSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29597, 184},
+ /* 2603 */ {I_VPADDUSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29604, 184},
+ /* 2604 */ {I_VPADDUSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29611, 184},
+ /* 2605 */ {I_VPADDUSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29618, 184},
+ /* 2606 */ {I_VPADDUSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29625, 184},
+ /* 2607 */ {I_VPALIGNR, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9676, 184},
+ /* 2608 */ {I_VPALIGNR, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9684, 184},
+ /* 2609 */ {I_VPAND, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29632, 184},
+ /* 2610 */ {I_VPAND, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29639, 184},
+ /* 2611 */ {I_VPANDN, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29646, 184},
+ /* 2612 */ {I_VPANDN, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29653, 184},
+ /* 2613 */ {I_VPAVGB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29660, 184},
+ /* 2614 */ {I_VPAVGB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29667, 184},
+ /* 2615 */ {I_VPAVGW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29674, 184},
+ /* 2616 */ {I_VPAVGW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29681, 184},
+ /* 2617 */ {I_VPBLENDVB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+9692, 184},
+ /* 2618 */ {I_VPBLENDVB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+9700, 184},
+ /* 2619 */ {I_VPBLENDW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9708, 184},
+ /* 2620 */ {I_VPBLENDW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9716, 184},
+ /* 2621 */ {I_VPCMPESTRI, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9724, 184},
+ /* 2622 */ {I_VPCMPESTRM, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9732, 184},
+ /* 2623 */ {I_VPCMPISTRI, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9740, 184},
+ /* 2624 */ {I_VPCMPISTRM, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9748, 184},
+ /* 2625 */ {I_VPCMPEQB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29688, 184},
+ /* 2626 */ {I_VPCMPEQB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29695, 184},
+ /* 2627 */ {I_VPCMPEQW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29702, 184},
+ /* 2628 */ {I_VPCMPEQW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29709, 184},
+ /* 2629 */ {I_VPCMPEQD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29716, 184},
+ /* 2630 */ {I_VPCMPEQD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29723, 184},
+ /* 2631 */ {I_VPCMPEQQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29730, 184},
+ /* 2632 */ {I_VPCMPEQQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29737, 184},
+ /* 2633 */ {I_VPCMPGTB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29744, 184},
+ /* 2634 */ {I_VPCMPGTB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29751, 184},
+ /* 2635 */ {I_VPCMPGTW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29758, 184},
+ /* 2636 */ {I_VPCMPGTW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29765, 184},
+ /* 2637 */ {I_VPCMPGTD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29772, 184},
+ /* 2638 */ {I_VPCMPGTD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29779, 184},
+ /* 2639 */ {I_VPCMPGTQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29786, 184},
+ /* 2640 */ {I_VPCMPGTQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29793, 184},
+ /* 2641 */ {I_VPERMILPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29800, 184},
+ /* 2642 */ {I_VPERMILPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29807, 184},
+ /* 2643 */ {I_VPERMILPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29814, 184},
+ /* 2644 */ {I_VPERMILPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29821, 184},
+ /* 2645 */ {I_VPERMILPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9756, 184},
+ /* 2646 */ {I_VPERMILPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9764, 184},
+ /* 2647 */ {I_VPERMILPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29828, 184},
+ /* 2648 */ {I_VPERMILPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29835, 184},
+ /* 2649 */ {I_VPERMILPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+29842, 184},
+ /* 2650 */ {I_VPERMILPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+29849, 184},
+ /* 2651 */ {I_VPERMILPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9772, 184},
+ /* 2652 */ {I_VPERMILPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9780, 184},
+ /* 2653 */ {I_VPERM2F128, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9788, 184},
+ /* 2654 */ {I_VPERM2F128, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9796, 184},
+ /* 2655 */ {I_VPEXTRB, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 190},
+ /* 2656 */ {I_VPEXTRB, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 184},
+ /* 2657 */ {I_VPEXTRB, 3, {MEMORY|BITS8,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9804, 184},
+ /* 2658 */ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9812, 190},
+ /* 2659 */ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9812, 184},
+ /* 2660 */ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 190},
+ /* 2661 */ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 184},
+ /* 2662 */ {I_VPEXTRW, 3, {MEMORY|BITS16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9820, 184},
+ /* 2663 */ {I_VPEXTRD, 3, {REG_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9828, 190},
+ /* 2664 */ {I_VPEXTRD, 3, {RM_GPR|BITS32,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9828, 184},
+ /* 2665 */ {I_VPEXTRQ, 3, {RM_GPR|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9836, 190},
+ /* 2666 */ {I_VPHADDW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29856, 184},
+ /* 2667 */ {I_VPHADDW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29863, 184},
+ /* 2668 */ {I_VPHADDD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29870, 184},
+ /* 2669 */ {I_VPHADDD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29877, 184},
+ /* 2670 */ {I_VPHADDSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29884, 184},
+ /* 2671 */ {I_VPHADDSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29891, 184},
+ /* 2672 */ {I_VPHMINPOSUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29898, 184},
+ /* 2673 */ {I_VPHSUBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29905, 184},
+ /* 2674 */ {I_VPHSUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29912, 184},
+ /* 2675 */ {I_VPHSUBD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29919, 184},
+ /* 2676 */ {I_VPHSUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29926, 184},
+ /* 2677 */ {I_VPHSUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29933, 184},
+ /* 2678 */ {I_VPHSUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29940, 184},
+ /* 2679 */ {I_VPINSRB, 4, {XMM_L16,XMM_L16,MEMORY|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ /* 2680 */ {I_VPINSRB, 3, {XMM_L16,MEMORY|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ /* 2681 */ {I_VPINSRB, 4, {XMM_L16,XMM_L16,RM_GPR|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ /* 2682 */ {I_VPINSRB, 3, {XMM_L16,RM_GPR|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ /* 2683 */ {I_VPINSRB, 4, {XMM_L16,XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9844, 184},
+ /* 2684 */ {I_VPINSRB, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9852, 184},
+ /* 2685 */ {I_VPINSRW, 4, {XMM_L16,XMM_L16,MEMORY|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ /* 2686 */ {I_VPINSRW, 3, {XMM_L16,MEMORY|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ /* 2687 */ {I_VPINSRW, 4, {XMM_L16,XMM_L16,RM_GPR|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ /* 2688 */ {I_VPINSRW, 3, {XMM_L16,RM_GPR|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ /* 2689 */ {I_VPINSRW, 4, {XMM_L16,XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9860, 184},
+ /* 2690 */ {I_VPINSRW, 3, {XMM_L16,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9868, 184},
+ /* 2691 */ {I_VPINSRD, 4, {XMM_L16,XMM_L16,MEMORY|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9876, 184},
+ /* 2692 */ {I_VPINSRD, 3, {XMM_L16,MEMORY|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9884, 184},
+ /* 2693 */ {I_VPINSRD, 4, {XMM_L16,XMM_L16,RM_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9876, 184},
+ /* 2694 */ {I_VPINSRD, 3, {XMM_L16,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9884, 184},
+ /* 2695 */ {I_VPINSRQ, 4, {XMM_L16,XMM_L16,MEMORY|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9892, 190},
+ /* 2696 */ {I_VPINSRQ, 3, {XMM_L16,MEMORY|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9900, 190},
+ /* 2697 */ {I_VPINSRQ, 4, {XMM_L16,XMM_L16,RM_GPR|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+9892, 190},
+ /* 2698 */ {I_VPINSRQ, 3, {XMM_L16,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9900, 190},
+ /* 2699 */ {I_VPMADDWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29947, 184},
+ /* 2700 */ {I_VPMADDWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29954, 184},
+ /* 2701 */ {I_VPMADDUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29961, 184},
+ /* 2702 */ {I_VPMADDUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29968, 184},
+ /* 2703 */ {I_VPMAXSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29975, 184},
+ /* 2704 */ {I_VPMAXSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29982, 184},
+ /* 2705 */ {I_VPMAXSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+29989, 184},
+ /* 2706 */ {I_VPMAXSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+29996, 184},
+ /* 2707 */ {I_VPMAXSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30003, 184},
+ /* 2708 */ {I_VPMAXSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30010, 184},
+ /* 2709 */ {I_VPMAXUB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30017, 184},
+ /* 2710 */ {I_VPMAXUB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30024, 184},
+ /* 2711 */ {I_VPMAXUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30031, 184},
+ /* 2712 */ {I_VPMAXUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30038, 184},
+ /* 2713 */ {I_VPMAXUD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30045, 184},
+ /* 2714 */ {I_VPMAXUD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30052, 184},
+ /* 2715 */ {I_VPMINSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30059, 184},
+ /* 2716 */ {I_VPMINSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30066, 184},
+ /* 2717 */ {I_VPMINSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30073, 184},
+ /* 2718 */ {I_VPMINSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30080, 184},
+ /* 2719 */ {I_VPMINSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30087, 184},
+ /* 2720 */ {I_VPMINSD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30094, 184},
+ /* 2721 */ {I_VPMINUB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30101, 184},
+ /* 2722 */ {I_VPMINUB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30108, 184},
+ /* 2723 */ {I_VPMINUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30115, 184},
+ /* 2724 */ {I_VPMINUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30122, 184},
+ /* 2725 */ {I_VPMINUD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30129, 184},
+ /* 2726 */ {I_VPMINUD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30136, 184},
+ /* 2727 */ {I_VPMOVMSKB, 2, {REG_GPR|BITS64,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30143, 190},
+ /* 2728 */ {I_VPMOVMSKB, 2, {REG_GPR|BITS32,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30143, 184},
+ /* 2729 */ {I_VPMOVSXBW, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30150, 184},
+ /* 2730 */ {I_VPMOVSXBD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30157, 184},
+ /* 2731 */ {I_VPMOVSXBQ, 2, {XMM_L16,RM_XMM_L16|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30164, 184},
+ /* 2732 */ {I_VPMOVSXWD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30171, 184},
+ /* 2733 */ {I_VPMOVSXWQ, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30178, 184},
+ /* 2734 */ {I_VPMOVSXDQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30185, 184},
+ /* 2735 */ {I_VPMOVZXBW, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30192, 184},
+ /* 2736 */ {I_VPMOVZXBD, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30199, 184},
+ /* 2737 */ {I_VPMOVZXBQ, 2, {XMM_L16,RM_XMM_L16|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+30206, 184},
+ /* 2738 */ {I_VPMOVZXWD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30213, 184},
+ /* 2739 */ {I_VPMOVZXWQ, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30220, 184},
+ /* 2740 */ {I_VPMOVZXDQ, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30227, 184},
+ /* 2741 */ {I_VPMULHUW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30234, 184},
+ /* 2742 */ {I_VPMULHUW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30241, 184},
+ /* 2743 */ {I_VPMULHRSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30248, 184},
+ /* 2744 */ {I_VPMULHRSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30255, 184},
+ /* 2745 */ {I_VPMULHW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30262, 184},
+ /* 2746 */ {I_VPMULHW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30269, 184},
+ /* 2747 */ {I_VPMULLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30276, 184},
+ /* 2748 */ {I_VPMULLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30283, 184},
+ /* 2749 */ {I_VPMULLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30290, 184},
+ /* 2750 */ {I_VPMULLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30297, 184},
+ /* 2751 */ {I_VPMULUDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30304, 184},
+ /* 2752 */ {I_VPMULUDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30311, 184},
+ /* 2753 */ {I_VPMULDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30318, 184},
+ /* 2754 */ {I_VPMULDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30325, 184},
+ /* 2755 */ {I_VPOR, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30332, 184},
+ /* 2756 */ {I_VPOR, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30339, 184},
+ /* 2757 */ {I_VPSADBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30346, 184},
+ /* 2758 */ {I_VPSADBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30353, 184},
+ /* 2759 */ {I_VPSHUFB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30360, 184},
+ /* 2760 */ {I_VPSHUFB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30367, 184},
+ /* 2761 */ {I_VPSHUFD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9908, 184},
+ /* 2762 */ {I_VPSHUFHW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9916, 184},
+ /* 2763 */ {I_VPSHUFLW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9924, 184},
+ /* 2764 */ {I_VPSIGNB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30374, 184},
+ /* 2765 */ {I_VPSIGNB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30381, 184},
+ /* 2766 */ {I_VPSIGNW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30388, 184},
+ /* 2767 */ {I_VPSIGNW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30395, 184},
+ /* 2768 */ {I_VPSIGND, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30402, 184},
+ /* 2769 */ {I_VPSIGND, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30409, 184},
+ /* 2770 */ {I_VPSLLDQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9932, 184},
+ /* 2771 */ {I_VPSLLDQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9940, 184},
+ /* 2772 */ {I_VPSRLDQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9948, 184},
+ /* 2773 */ {I_VPSRLDQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9956, 184},
+ /* 2774 */ {I_VPSLLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30416, 184},
+ /* 2775 */ {I_VPSLLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30423, 184},
+ /* 2776 */ {I_VPSLLW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9964, 184},
+ /* 2777 */ {I_VPSLLW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9972, 184},
+ /* 2778 */ {I_VPSLLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30430, 184},
+ /* 2779 */ {I_VPSLLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30437, 184},
+ /* 2780 */ {I_VPSLLD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9980, 184},
+ /* 2781 */ {I_VPSLLD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+9988, 184},
+ /* 2782 */ {I_VPSLLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30444, 184},
+ /* 2783 */ {I_VPSLLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30451, 184},
+ /* 2784 */ {I_VPSLLQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+9996, 184},
+ /* 2785 */ {I_VPSLLQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10004, 184},
+ /* 2786 */ {I_VPSRAW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30458, 184},
+ /* 2787 */ {I_VPSRAW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30465, 184},
+ /* 2788 */ {I_VPSRAW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10012, 184},
+ /* 2789 */ {I_VPSRAW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10020, 184},
+ /* 2790 */ {I_VPSRAD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30472, 184},
+ /* 2791 */ {I_VPSRAD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30479, 184},
+ /* 2792 */ {I_VPSRAD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10028, 184},
+ /* 2793 */ {I_VPSRAD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10036, 184},
+ /* 2794 */ {I_VPSRLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30486, 184},
+ /* 2795 */ {I_VPSRLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30493, 184},
+ /* 2796 */ {I_VPSRLW, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10044, 184},
+ /* 2797 */ {I_VPSRLW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10052, 184},
+ /* 2798 */ {I_VPSRLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30500, 184},
+ /* 2799 */ {I_VPSRLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30507, 184},
+ /* 2800 */ {I_VPSRLD, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10060, 184},
+ /* 2801 */ {I_VPSRLD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10068, 184},
+ /* 2802 */ {I_VPSRLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30514, 184},
+ /* 2803 */ {I_VPSRLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30521, 184},
+ /* 2804 */ {I_VPSRLQ, 3, {XMM_L16,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10076, 184},
+ /* 2805 */ {I_VPSRLQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+10084, 184},
+ /* 2806 */ {I_VPTEST, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30528, 184},
+ /* 2807 */ {I_VPTEST, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30535, 184},
+ /* 2808 */ {I_VPSUBB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30542, 184},
+ /* 2809 */ {I_VPSUBB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30549, 184},
+ /* 2810 */ {I_VPSUBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30556, 184},
+ /* 2811 */ {I_VPSUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30563, 184},
+ /* 2812 */ {I_VPSUBD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30570, 184},
+ /* 2813 */ {I_VPSUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30577, 184},
+ /* 2814 */ {I_VPSUBQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30584, 184},
+ /* 2815 */ {I_VPSUBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30591, 184},
+ /* 2816 */ {I_VPSUBSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30598, 184},
+ /* 2817 */ {I_VPSUBSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30605, 184},
+ /* 2818 */ {I_VPSUBSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30612, 184},
+ /* 2819 */ {I_VPSUBSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30619, 184},
+ /* 2820 */ {I_VPSUBUSB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30626, 184},
+ /* 2821 */ {I_VPSUBUSB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30633, 184},
+ /* 2822 */ {I_VPSUBUSW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30640, 184},
+ /* 2823 */ {I_VPSUBUSW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30647, 184},
+ /* 2824 */ {I_VPUNPCKHBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30654, 184},
+ /* 2825 */ {I_VPUNPCKHBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30661, 184},
+ /* 2826 */ {I_VPUNPCKHWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30668, 184},
+ /* 2827 */ {I_VPUNPCKHWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30675, 184},
+ /* 2828 */ {I_VPUNPCKHDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30682, 184},
+ /* 2829 */ {I_VPUNPCKHDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30689, 184},
+ /* 2830 */ {I_VPUNPCKHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30696, 184},
+ /* 2831 */ {I_VPUNPCKHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30703, 184},
+ /* 2832 */ {I_VPUNPCKLBW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30710, 184},
+ /* 2833 */ {I_VPUNPCKLBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30717, 184},
+ /* 2834 */ {I_VPUNPCKLWD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30724, 184},
+ /* 2835 */ {I_VPUNPCKLWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30731, 184},
+ /* 2836 */ {I_VPUNPCKLDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30738, 184},
+ /* 2837 */ {I_VPUNPCKLDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30745, 184},
+ /* 2838 */ {I_VPUNPCKLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30752, 184},
+ /* 2839 */ {I_VPUNPCKLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30759, 184},
+ /* 2840 */ {I_VPXOR, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30766, 184},
+ /* 2841 */ {I_VPXOR, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30773, 184},
+ /* 2842 */ {I_VRCPPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30780, 184},
+ /* 2843 */ {I_VRCPPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30787, 184},
+ /* 2844 */ {I_VRCPSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30794, 184},
+ /* 2845 */ {I_VRCPSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30801, 184},
+ /* 2846 */ {I_VRSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30808, 184},
+ /* 2847 */ {I_VRSQRTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30815, 184},
+ /* 2848 */ {I_VRSQRTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30822, 184},
+ /* 2849 */ {I_VRSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30829, 184},
+ /* 2850 */ {I_VROUNDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10092, 184},
+ /* 2851 */ {I_VROUNDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10100, 184},
+ /* 2852 */ {I_VROUNDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10108, 184},
+ /* 2853 */ {I_VROUNDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10116, 184},
+ /* 2854 */ {I_VROUNDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10124, 184},
+ /* 2855 */ {I_VROUNDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10132, 184},
+ /* 2856 */ {I_VROUNDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10140, 184},
+ /* 2857 */ {I_VROUNDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10148, 184},
+ /* 2858 */ {I_VSHUFPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10156, 184},
+ /* 2859 */ {I_VSHUFPD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10164, 184},
+ /* 2860 */ {I_VSHUFPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10172, 184},
+ /* 2861 */ {I_VSHUFPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10180, 184},
+ /* 2862 */ {I_VSHUFPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10188, 184},
+ /* 2863 */ {I_VSHUFPS, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10196, 184},
+ /* 2864 */ {I_VSHUFPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10204, 184},
+ /* 2865 */ {I_VSHUFPS, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10212, 184},
+ /* 2866 */ {I_VSQRTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30836, 184},
+ /* 2867 */ {I_VSQRTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30843, 184},
+ /* 2868 */ {I_VSQRTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30850, 184},
+ /* 2869 */ {I_VSQRTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30857, 184},
+ /* 2870 */ {I_VSQRTSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+30864, 184},
+ /* 2871 */ {I_VSQRTSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30871, 184},
+ /* 2872 */ {I_VSQRTSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30878, 184},
+ /* 2873 */ {I_VSQRTSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30885, 184},
+ /* 2874 */ {I_VSTMXCSR, 1, {MEMORY|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+30892, 184},
+ /* 2875 */ {I_VSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30899, 184},
+ /* 2876 */ {I_VSUBPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30906, 184},
+ /* 2877 */ {I_VSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+30913, 184},
+ /* 2878 */ {I_VSUBPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30920, 184},
+ /* 2879 */ {I_VSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+30927, 184},
+ /* 2880 */ {I_VSUBPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30934, 184},
+ /* 2881 */ {I_VSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+30941, 184},
+ /* 2882 */ {I_VSUBPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30948, 184},
+ /* 2883 */ {I_VSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+30955, 184},
+ /* 2884 */ {I_VSUBSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+30962, 184},
+ /* 2885 */ {I_VSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+30969, 184},
+ /* 2886 */ {I_VSUBSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+30976, 184},
+ /* 2887 */ {I_VTESTPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30983, 184},
+ /* 2888 */ {I_VTESTPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+30990, 184},
+ /* 2889 */ {I_VTESTPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30997, 184},
+ /* 2890 */ {I_VTESTPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31004, 184},
+ /* 2891 */ {I_VUCOMISD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+31011, 184},
+ /* 2892 */ {I_VUCOMISS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+31018, 184},
+ /* 2893 */ {I_VUNPCKHPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31025, 184},
+ /* 2894 */ {I_VUNPCKHPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31032, 184},
+ /* 2895 */ {I_VUNPCKHPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31039, 184},
+ /* 2896 */ {I_VUNPCKHPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31046, 184},
+ /* 2897 */ {I_VUNPCKHPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31053, 184},
+ /* 2898 */ {I_VUNPCKHPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31060, 184},
+ /* 2899 */ {I_VUNPCKHPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31067, 184},
+ /* 2900 */ {I_VUNPCKHPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31074, 184},
+ /* 2901 */ {I_VUNPCKLPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31081, 184},
+ /* 2902 */ {I_VUNPCKLPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31088, 184},
+ /* 2903 */ {I_VUNPCKLPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31095, 184},
+ /* 2904 */ {I_VUNPCKLPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31102, 184},
+ /* 2905 */ {I_VUNPCKLPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31109, 184},
+ /* 2906 */ {I_VUNPCKLPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31116, 184},
+ /* 2907 */ {I_VUNPCKLPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31123, 184},
+ /* 2908 */ {I_VUNPCKLPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31130, 184},
+ /* 2909 */ {I_VXORPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31137, 184},
+ /* 2910 */ {I_VXORPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31144, 184},
+ /* 2911 */ {I_VXORPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31151, 184},
+ /* 2912 */ {I_VXORPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31158, 184},
+ /* 2913 */ {I_VXORPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31165, 184},
+ /* 2914 */ {I_VXORPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31172, 184},
+ /* 2915 */ {I_VXORPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31179, 184},
+ /* 2916 */ {I_VXORPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31186, 184},
+ /* 2917 */ {I_VZEROALL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37336, 184},
+ /* 2918 */ {I_VZEROUPPER, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37342, 184},
+ /* 2919 */ {I_PCLMULLQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3768, 183},
+ /* 2920 */ {I_PCLMULHQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3777, 183},
+ /* 2921 */ {I_PCLMULLQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3786, 183},
+ /* 2922 */ {I_PCLMULHQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3795, 183},
+ /* 2923 */ {I_PCLMULQDQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10220, 183},
+ /* 2924 */ {I_VPCLMULLQLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3804, 184},
+ /* 2925 */ {I_VPCLMULLQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3813, 184},
+ /* 2926 */ {I_VPCLMULHQLQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3822, 184},
+ /* 2927 */ {I_VPCLMULHQLQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3831, 184},
+ /* 2928 */ {I_VPCLMULLQHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3840, 184},
+ /* 2929 */ {I_VPCLMULLQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3849, 184},
+ /* 2930 */ {I_VPCLMULHQHQDQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+3858, 184},
+ /* 2931 */ {I_VPCLMULHQHQDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+3867, 184},
+ /* 2932 */ {I_VPCLMULQDQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10228, 184},
+ /* 2933 */ {I_VPCLMULQDQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10236, 184},
+ /* 2934 */ {I_VPCLMULLQLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3876, 194},
+ /* 2935 */ {I_VPCLMULLQLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3885, 194},
+ /* 2936 */ {I_VPCLMULHQLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3894, 194},
+ /* 2937 */ {I_VPCLMULHQLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3903, 194},
+ /* 2938 */ {I_VPCLMULLQHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3912, 194},
+ /* 2939 */ {I_VPCLMULLQHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3921, 194},
+ /* 2940 */ {I_VPCLMULHQHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+3930, 194},
+ /* 2941 */ {I_VPCLMULHQHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+3939, 194},
+ /* 2942 */ {I_VPCLMULQDQ, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+10244, 194},
+ /* 2943 */ {I_VPCLMULQDQ, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10252, 194},
+ /* 2944 */ {I_VPCLMULLQLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+0, 195},
+ /* 2945 */ {I_VPCLMULLQLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+10, 195},
+ /* 2946 */ {I_VPCLMULHQLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+20, 195},
+ /* 2947 */ {I_VPCLMULHQLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+30, 195},
+ /* 2948 */ {I_VPCLMULLQHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+40, 195},
+ /* 2949 */ {I_VPCLMULLQHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+50, 195},
+ /* 2950 */ {I_VPCLMULHQHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+60, 195},
+ /* 2951 */ {I_VPCLMULHQHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+70, 195},
+ /* 2952 */ {I_VPCLMULQDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3948, 195},
+ /* 2953 */ {I_VPCLMULQDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3957, 195},
+ /* 2954 */ {I_VPCLMULLQLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+80, 195},
+ /* 2955 */ {I_VPCLMULLQLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+90, 195},
+ /* 2956 */ {I_VPCLMULHQLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+100, 195},
+ /* 2957 */ {I_VPCLMULHQLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+110, 195},
+ /* 2958 */ {I_VPCLMULLQHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+120, 195},
+ /* 2959 */ {I_VPCLMULLQHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+130, 195},
+ /* 2960 */ {I_VPCLMULHQHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+140, 195},
+ /* 2961 */ {I_VPCLMULHQHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+150, 195},
+ /* 2962 */ {I_VPCLMULQDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3966, 195},
+ /* 2963 */ {I_VPCLMULQDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3975, 195},
+ /* 2964 */ {I_VPCLMULLQLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+160, 196},
+ /* 2965 */ {I_VPCLMULLQLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+170, 196},
+ /* 2966 */ {I_VPCLMULHQLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+180, 196},
+ /* 2967 */ {I_VPCLMULHQLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+190, 196},
+ /* 2968 */ {I_VPCLMULLQHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+200, 196},
+ /* 2969 */ {I_VPCLMULLQHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+210, 196},
+ /* 2970 */ {I_VPCLMULHQHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+220, 196},
+ /* 2971 */ {I_VPCLMULHQHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+230, 196},
+ /* 2972 */ {I_VPCLMULQDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+3984, 196},
+ /* 2973 */ {I_VPCLMULQDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+3993, 196},
+ /* 2974 */ {I_VFMADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31193, 197},
+ /* 2975 */ {I_VFMADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31200, 197},
+ /* 2976 */ {I_VFMADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31207, 197},
+ /* 2977 */ {I_VFMADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31214, 197},
+ /* 2978 */ {I_VFMADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31193, 197},
+ /* 2979 */ {I_VFMADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31200, 197},
+ /* 2980 */ {I_VFMADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31207, 197},
+ /* 2981 */ {I_VFMADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31214, 197},
+ /* 2982 */ {I_VFMADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31221, 197},
+ /* 2983 */ {I_VFMADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31228, 197},
+ /* 2984 */ {I_VFMADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31235, 197},
+ /* 2985 */ {I_VFMADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31242, 197},
+ /* 2986 */ {I_VFMADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31221, 197},
+ /* 2987 */ {I_VFMADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31228, 197},
+ /* 2988 */ {I_VFMADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31235, 197},
+ /* 2989 */ {I_VFMADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31242, 197},
+ /* 2990 */ {I_VFMADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31249, 197},
+ /* 2991 */ {I_VFMADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31256, 197},
+ /* 2992 */ {I_VFMADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31263, 197},
+ /* 2993 */ {I_VFMADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31270, 197},
+ /* 2994 */ {I_VFMADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31249, 197},
+ /* 2995 */ {I_VFMADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31256, 197},
+ /* 2996 */ {I_VFMADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31263, 197},
+ /* 2997 */ {I_VFMADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31270, 197},
+ /* 2998 */ {I_VFMADDSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31277, 197},
+ /* 2999 */ {I_VFMADDSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31284, 197},
+ /* 3000 */ {I_VFMADDSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31291, 197},
+ /* 3001 */ {I_VFMADDSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31298, 197},
+ /* 3002 */ {I_VFMADDSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31277, 197},
+ /* 3003 */ {I_VFMADDSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31284, 197},
+ /* 3004 */ {I_VFMADDSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31291, 197},
+ /* 3005 */ {I_VFMADDSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31298, 197},
+ /* 3006 */ {I_VFMADDSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31305, 197},
+ /* 3007 */ {I_VFMADDSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31312, 197},
+ /* 3008 */ {I_VFMADDSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31319, 197},
+ /* 3009 */ {I_VFMADDSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31326, 197},
+ /* 3010 */ {I_VFMADDSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31305, 197},
+ /* 3011 */ {I_VFMADDSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31312, 197},
+ /* 3012 */ {I_VFMADDSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31319, 197},
+ /* 3013 */ {I_VFMADDSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31326, 197},
+ /* 3014 */ {I_VFMADDSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31333, 197},
+ /* 3015 */ {I_VFMADDSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31340, 197},
+ /* 3016 */ {I_VFMADDSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31347, 197},
+ /* 3017 */ {I_VFMADDSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31354, 197},
+ /* 3018 */ {I_VFMADDSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31333, 197},
+ /* 3019 */ {I_VFMADDSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31340, 197},
+ /* 3020 */ {I_VFMADDSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31347, 197},
+ /* 3021 */ {I_VFMADDSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31354, 197},
+ /* 3022 */ {I_VFMSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31361, 197},
+ /* 3023 */ {I_VFMSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31368, 197},
+ /* 3024 */ {I_VFMSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31375, 197},
+ /* 3025 */ {I_VFMSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31382, 197},
+ /* 3026 */ {I_VFMSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31361, 197},
+ /* 3027 */ {I_VFMSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31368, 197},
+ /* 3028 */ {I_VFMSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31375, 197},
+ /* 3029 */ {I_VFMSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31382, 197},
+ /* 3030 */ {I_VFMSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31389, 197},
+ /* 3031 */ {I_VFMSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31396, 197},
+ /* 3032 */ {I_VFMSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31403, 197},
+ /* 3033 */ {I_VFMSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31410, 197},
+ /* 3034 */ {I_VFMSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31389, 197},
+ /* 3035 */ {I_VFMSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31396, 197},
+ /* 3036 */ {I_VFMSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31403, 197},
+ /* 3037 */ {I_VFMSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31410, 197},
+ /* 3038 */ {I_VFMSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31417, 197},
+ /* 3039 */ {I_VFMSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31424, 197},
+ /* 3040 */ {I_VFMSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31431, 197},
+ /* 3041 */ {I_VFMSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31438, 197},
+ /* 3042 */ {I_VFMSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31417, 197},
+ /* 3043 */ {I_VFMSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31424, 197},
+ /* 3044 */ {I_VFMSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31431, 197},
+ /* 3045 */ {I_VFMSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31438, 197},
+ /* 3046 */ {I_VFMSUBADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31445, 197},
+ /* 3047 */ {I_VFMSUBADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31452, 197},
+ /* 3048 */ {I_VFMSUBADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31459, 197},
+ /* 3049 */ {I_VFMSUBADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31466, 197},
+ /* 3050 */ {I_VFMSUBADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31445, 197},
+ /* 3051 */ {I_VFMSUBADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31452, 197},
+ /* 3052 */ {I_VFMSUBADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31459, 197},
+ /* 3053 */ {I_VFMSUBADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31466, 197},
+ /* 3054 */ {I_VFMSUBADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31473, 197},
+ /* 3055 */ {I_VFMSUBADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31480, 197},
+ /* 3056 */ {I_VFMSUBADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31487, 197},
+ /* 3057 */ {I_VFMSUBADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31494, 197},
+ /* 3058 */ {I_VFMSUBADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31473, 197},
+ /* 3059 */ {I_VFMSUBADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31480, 197},
+ /* 3060 */ {I_VFMSUBADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31487, 197},
+ /* 3061 */ {I_VFMSUBADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31494, 197},
+ /* 3062 */ {I_VFMSUBADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31501, 197},
+ /* 3063 */ {I_VFMSUBADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31508, 197},
+ /* 3064 */ {I_VFMSUBADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31515, 197},
+ /* 3065 */ {I_VFMSUBADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31522, 197},
+ /* 3066 */ {I_VFMSUBADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31501, 197},
+ /* 3067 */ {I_VFMSUBADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31508, 197},
+ /* 3068 */ {I_VFMSUBADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31515, 197},
+ /* 3069 */ {I_VFMSUBADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31522, 197},
+ /* 3070 */ {I_VFNMADD132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31529, 197},
+ /* 3071 */ {I_VFNMADD132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31536, 197},
+ /* 3072 */ {I_VFNMADD132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31543, 197},
+ /* 3073 */ {I_VFNMADD132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31550, 197},
+ /* 3074 */ {I_VFNMADD312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31529, 197},
+ /* 3075 */ {I_VFNMADD312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31536, 197},
+ /* 3076 */ {I_VFNMADD312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31543, 197},
+ /* 3077 */ {I_VFNMADD312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31550, 197},
+ /* 3078 */ {I_VFNMADD213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31557, 197},
+ /* 3079 */ {I_VFNMADD213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31564, 197},
+ /* 3080 */ {I_VFNMADD213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31571, 197},
+ /* 3081 */ {I_VFNMADD213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31578, 197},
+ /* 3082 */ {I_VFNMADD123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31557, 197},
+ /* 3083 */ {I_VFNMADD123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31564, 197},
+ /* 3084 */ {I_VFNMADD123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31571, 197},
+ /* 3085 */ {I_VFNMADD123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31578, 197},
+ /* 3086 */ {I_VFNMADD231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31585, 197},
+ /* 3087 */ {I_VFNMADD231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31592, 197},
+ /* 3088 */ {I_VFNMADD231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31599, 197},
+ /* 3089 */ {I_VFNMADD231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31606, 197},
+ /* 3090 */ {I_VFNMADD321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31585, 197},
+ /* 3091 */ {I_VFNMADD321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31592, 197},
+ /* 3092 */ {I_VFNMADD321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31599, 197},
+ /* 3093 */ {I_VFNMADD321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31606, 197},
+ /* 3094 */ {I_VFNMSUB132PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31613, 197},
+ /* 3095 */ {I_VFNMSUB132PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31620, 197},
+ /* 3096 */ {I_VFNMSUB132PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31627, 197},
+ /* 3097 */ {I_VFNMSUB132PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31634, 197},
+ /* 3098 */ {I_VFNMSUB312PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31613, 197},
+ /* 3099 */ {I_VFNMSUB312PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31620, 197},
+ /* 3100 */ {I_VFNMSUB312PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31627, 197},
+ /* 3101 */ {I_VFNMSUB312PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31634, 197},
+ /* 3102 */ {I_VFNMSUB213PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31641, 197},
+ /* 3103 */ {I_VFNMSUB213PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31648, 197},
+ /* 3104 */ {I_VFNMSUB213PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31655, 197},
+ /* 3105 */ {I_VFNMSUB213PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31662, 197},
+ /* 3106 */ {I_VFNMSUB123PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31641, 197},
+ /* 3107 */ {I_VFNMSUB123PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31648, 197},
+ /* 3108 */ {I_VFNMSUB123PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31655, 197},
+ /* 3109 */ {I_VFNMSUB123PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31662, 197},
+ /* 3110 */ {I_VFNMSUB231PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31669, 197},
+ /* 3111 */ {I_VFNMSUB231PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31676, 197},
+ /* 3112 */ {I_VFNMSUB231PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31683, 197},
+ /* 3113 */ {I_VFNMSUB231PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31690, 197},
+ /* 3114 */ {I_VFNMSUB321PS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31669, 197},
+ /* 3115 */ {I_VFNMSUB321PS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31676, 197},
+ /* 3116 */ {I_VFNMSUB321PD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+31683, 197},
+ /* 3117 */ {I_VFNMSUB321PD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+31690, 197},
+ /* 3118 */ {I_VFMADD132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31697, 197},
+ /* 3119 */ {I_VFMADD132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31704, 197},
+ /* 3120 */ {I_VFMADD312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31697, 197},
+ /* 3121 */ {I_VFMADD312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31704, 197},
+ /* 3122 */ {I_VFMADD213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31711, 197},
+ /* 3123 */ {I_VFMADD213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31718, 197},
+ /* 3124 */ {I_VFMADD123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31711, 197},
+ /* 3125 */ {I_VFMADD123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31718, 197},
+ /* 3126 */ {I_VFMADD231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31725, 197},
+ /* 3127 */ {I_VFMADD231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31732, 197},
+ /* 3128 */ {I_VFMADD321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31725, 197},
+ /* 3129 */ {I_VFMADD321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31732, 197},
+ /* 3130 */ {I_VFMSUB132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31739, 197},
+ /* 3131 */ {I_VFMSUB132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31746, 197},
+ /* 3132 */ {I_VFMSUB312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31739, 197},
+ /* 3133 */ {I_VFMSUB312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31746, 197},
+ /* 3134 */ {I_VFMSUB213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31753, 197},
+ /* 3135 */ {I_VFMSUB213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31760, 197},
+ /* 3136 */ {I_VFMSUB123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31753, 197},
+ /* 3137 */ {I_VFMSUB123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31760, 197},
+ /* 3138 */ {I_VFMSUB231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31767, 197},
+ /* 3139 */ {I_VFMSUB231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31774, 197},
+ /* 3140 */ {I_VFMSUB321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31767, 197},
+ /* 3141 */ {I_VFMSUB321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31774, 197},
+ /* 3142 */ {I_VFNMADD132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31781, 197},
+ /* 3143 */ {I_VFNMADD132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31788, 197},
+ /* 3144 */ {I_VFNMADD312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31781, 197},
+ /* 3145 */ {I_VFNMADD312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31788, 197},
+ /* 3146 */ {I_VFNMADD213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31795, 197},
+ /* 3147 */ {I_VFNMADD213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31802, 197},
+ /* 3148 */ {I_VFNMADD123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31795, 197},
+ /* 3149 */ {I_VFNMADD123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31802, 197},
+ /* 3150 */ {I_VFNMADD231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31809, 197},
+ /* 3151 */ {I_VFNMADD231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31816, 197},
+ /* 3152 */ {I_VFNMADD321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31809, 197},
+ /* 3153 */ {I_VFNMADD321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31816, 197},
+ /* 3154 */ {I_VFNMSUB132SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31823, 197},
+ /* 3155 */ {I_VFNMSUB132SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31830, 197},
+ /* 3156 */ {I_VFNMSUB312SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31823, 197},
+ /* 3157 */ {I_VFNMSUB312SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31830, 197},
+ /* 3158 */ {I_VFNMSUB213SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31837, 197},
+ /* 3159 */ {I_VFNMSUB213SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31844, 197},
+ /* 3160 */ {I_VFNMSUB123SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31837, 197},
+ /* 3161 */ {I_VFNMSUB123SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31844, 197},
+ /* 3162 */ {I_VFNMSUB231SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31851, 197},
+ /* 3163 */ {I_VFNMSUB231SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31858, 197},
+ /* 3164 */ {I_VFNMSUB321SS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+31851, 197},
+ /* 3165 */ {I_VFNMSUB321SD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+31858, 197},
+ /* 3166 */ {I_RDFSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31865, 134},
+ /* 3167 */ {I_RDFSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31872, 134},
+ /* 3168 */ {I_RDGSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31879, 134},
+ /* 3169 */ {I_RDGSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31886, 134},
+ /* 3170 */ {I_RDRAND, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37348, 133},
+ /* 3171 */ {I_RDRAND, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37354, 133},
+ /* 3172 */ {I_RDRAND, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37360, 134},
+ /* 3173 */ {I_WRFSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31893, 134},
+ /* 3174 */ {I_WRFSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31900, 134},
+ /* 3175 */ {I_WRGSBASE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31907, 134},
+ /* 3176 */ {I_WRGSBASE, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31914, 134},
+ /* 3177 */ {I_VCVTPH2PS, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31921, 198},
+ /* 3178 */ {I_VCVTPH2PS, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+31928, 198},
+ /* 3179 */ {I_VCVTPS2PH, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10260, 198},
+ /* 3180 */ {I_VCVTPS2PH, 3, {RM_XMM_L16|BITS64,XMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+10268, 198},
+ /* 3181 */ {I_ADCX, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+10276, 133},
+ /* 3182 */ {I_ADCX, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+10284, 134},
+ /* 3183 */ {I_ADOX, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+10292, 133},
+ /* 3184 */ {I_ADOX, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+10300, 134},
+ /* 3185 */ {I_RDSEED, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37366, 133},
+ /* 3186 */ {I_RDSEED, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37372, 133},
+ /* 3187 */ {I_RDSEED, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37378, 134},
+ /* 3188 */ {I_CLAC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40471, 199},
+ /* 3189 */ {I_STAC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40476, 199},
+ /* 3190 */ {I_XSTORE, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40481, 36},
+ /* 3191 */ {I_XCRYPTECB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37384, 36},
+ /* 3192 */ {I_XCRYPTCBC, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37390, 36},
+ /* 3193 */ {I_XCRYPTCTR, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37396, 36},
+ /* 3194 */ {I_XCRYPTCFB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37402, 36},
+ /* 3195 */ {I_XCRYPTOFB, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37408, 36},
+ /* 3196 */ {I_MONTMUL, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37414, 36},
+ /* 3197 */ {I_XSHA1, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37420, 36},
+ /* 3198 */ {I_XSHA256, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37426, 36},
+ /* 3199 */ {I_LLWPCB, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31935, 200},
+ /* 3200 */ {I_LLWPCB, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31942, 201},
+ /* 3201 */ {I_SLWPCB, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31949, 200},
+ /* 3202 */ {I_SLWPCB, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31956, 201},
+ /* 3203 */ {I_LWPVAL, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10308, 200},
+ /* 3204 */ {I_LWPVAL, 3, {REG_GPR|BITS64,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10316, 201},
+ /* 3205 */ {I_LWPINS, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10324, 200},
+ /* 3206 */ {I_LWPINS, 3, {REG_GPR|BITS64,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10332, 201},
+ /* 3207 */ {I_VFMADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10340, 202},
+ /* 3208 */ {I_VFMADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10348, 202},
+ /* 3209 */ {I_VFMADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10356, 202},
+ /* 3210 */ {I_VFMADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10364, 202},
+ /* 3211 */ {I_VFMADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10372, 202},
+ /* 3212 */ {I_VFMADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10380, 202},
+ /* 3213 */ {I_VFMADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10388, 202},
+ /* 3214 */ {I_VFMADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10396, 202},
+ /* 3215 */ {I_VFMADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10404, 202},
+ /* 3216 */ {I_VFMADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10412, 202},
+ /* 3217 */ {I_VFMADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10420, 202},
+ /* 3218 */ {I_VFMADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10428, 202},
+ /* 3219 */ {I_VFMADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10436, 202},
+ /* 3220 */ {I_VFMADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10444, 202},
+ /* 3221 */ {I_VFMADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10452, 202},
+ /* 3222 */ {I_VFMADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10460, 202},
+ /* 3223 */ {I_VFMADDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10468, 202},
+ /* 3224 */ {I_VFMADDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10476, 202},
+ /* 3225 */ {I_VFMADDSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+10484, 202},
+ /* 3226 */ {I_VFMADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+10492, 202},
+ /* 3227 */ {I_VFMADDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10500, 202},
+ /* 3228 */ {I_VFMADDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10508, 202},
+ /* 3229 */ {I_VFMADDSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+10516, 202},
+ /* 3230 */ {I_VFMADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10524, 202},
+ /* 3231 */ {I_VFMADDSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10532, 202},
+ /* 3232 */ {I_VFMADDSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10540, 202},
+ /* 3233 */ {I_VFMADDSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10548, 202},
+ /* 3234 */ {I_VFMADDSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10556, 202},
+ /* 3235 */ {I_VFMADDSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10564, 202},
+ /* 3236 */ {I_VFMADDSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10572, 202},
+ /* 3237 */ {I_VFMADDSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10580, 202},
+ /* 3238 */ {I_VFMADDSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10588, 202},
+ /* 3239 */ {I_VFMADDSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10596, 202},
+ /* 3240 */ {I_VFMADDSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10604, 202},
+ /* 3241 */ {I_VFMADDSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10612, 202},
+ /* 3242 */ {I_VFMADDSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10620, 202},
+ /* 3243 */ {I_VFMADDSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10628, 202},
+ /* 3244 */ {I_VFMADDSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10636, 202},
+ /* 3245 */ {I_VFMADDSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10644, 202},
+ /* 3246 */ {I_VFMADDSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10652, 202},
+ /* 3247 */ {I_VFMSUBADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10660, 202},
+ /* 3248 */ {I_VFMSUBADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10668, 202},
+ /* 3249 */ {I_VFMSUBADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10676, 202},
+ /* 3250 */ {I_VFMSUBADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10684, 202},
+ /* 3251 */ {I_VFMSUBADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10692, 202},
+ /* 3252 */ {I_VFMSUBADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10700, 202},
+ /* 3253 */ {I_VFMSUBADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10708, 202},
+ /* 3254 */ {I_VFMSUBADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10716, 202},
+ /* 3255 */ {I_VFMSUBADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10724, 202},
+ /* 3256 */ {I_VFMSUBADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10732, 202},
+ /* 3257 */ {I_VFMSUBADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10740, 202},
+ /* 3258 */ {I_VFMSUBADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10748, 202},
+ /* 3259 */ {I_VFMSUBADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10756, 202},
+ /* 3260 */ {I_VFMSUBADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10764, 202},
+ /* 3261 */ {I_VFMSUBADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10772, 202},
+ /* 3262 */ {I_VFMSUBADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10780, 202},
+ /* 3263 */ {I_VFMSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10788, 202},
+ /* 3264 */ {I_VFMSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10796, 202},
+ /* 3265 */ {I_VFMSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10804, 202},
+ /* 3266 */ {I_VFMSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10812, 202},
+ /* 3267 */ {I_VFMSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10820, 202},
+ /* 3268 */ {I_VFMSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10828, 202},
+ /* 3269 */ {I_VFMSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10836, 202},
+ /* 3270 */ {I_VFMSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10844, 202},
+ /* 3271 */ {I_VFMSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10852, 202},
+ /* 3272 */ {I_VFMSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10860, 202},
+ /* 3273 */ {I_VFMSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10868, 202},
+ /* 3274 */ {I_VFMSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10876, 202},
+ /* 3275 */ {I_VFMSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+10884, 202},
+ /* 3276 */ {I_VFMSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+10892, 202},
+ /* 3277 */ {I_VFMSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+10900, 202},
+ /* 3278 */ {I_VFMSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+10908, 202},
+ /* 3279 */ {I_VFMSUBSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10916, 202},
+ /* 3280 */ {I_VFMSUBSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10924, 202},
+ /* 3281 */ {I_VFMSUBSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+10932, 202},
+ /* 3282 */ {I_VFMSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+10940, 202},
+ /* 3283 */ {I_VFMSUBSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10948, 202},
+ /* 3284 */ {I_VFMSUBSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10956, 202},
+ /* 3285 */ {I_VFMSUBSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+10964, 202},
+ /* 3286 */ {I_VFMSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+10972, 202},
+ /* 3287 */ {I_VFNMADDPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10980, 202},
+ /* 3288 */ {I_VFNMADDPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+10988, 202},
+ /* 3289 */ {I_VFNMADDPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+10996, 202},
+ /* 3290 */ {I_VFNMADDPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11004, 202},
+ /* 3291 */ {I_VFNMADDPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11012, 202},
+ /* 3292 */ {I_VFNMADDPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11020, 202},
+ /* 3293 */ {I_VFNMADDPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11028, 202},
+ /* 3294 */ {I_VFNMADDPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11036, 202},
+ /* 3295 */ {I_VFNMADDPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11044, 202},
+ /* 3296 */ {I_VFNMADDPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11052, 202},
+ /* 3297 */ {I_VFNMADDPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11060, 202},
+ /* 3298 */ {I_VFNMADDPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11068, 202},
+ /* 3299 */ {I_VFNMADDPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11076, 202},
+ /* 3300 */ {I_VFNMADDPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11084, 202},
+ /* 3301 */ {I_VFNMADDPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11092, 202},
+ /* 3302 */ {I_VFNMADDPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11100, 202},
+ /* 3303 */ {I_VFNMADDSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11108, 202},
+ /* 3304 */ {I_VFNMADDSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11116, 202},
+ /* 3305 */ {I_VFNMADDSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+11124, 202},
+ /* 3306 */ {I_VFNMADDSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+11132, 202},
+ /* 3307 */ {I_VFNMADDSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11140, 202},
+ /* 3308 */ {I_VFNMADDSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11148, 202},
+ /* 3309 */ {I_VFNMADDSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+11156, 202},
+ /* 3310 */ {I_VFNMADDSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+11164, 202},
+ /* 3311 */ {I_VFNMSUBPD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11172, 202},
+ /* 3312 */ {I_VFNMSUBPD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11180, 202},
+ /* 3313 */ {I_VFNMSUBPD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11188, 202},
+ /* 3314 */ {I_VFNMSUBPD, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11196, 202},
+ /* 3315 */ {I_VFNMSUBPD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11204, 202},
+ /* 3316 */ {I_VFNMSUBPD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11212, 202},
+ /* 3317 */ {I_VFNMSUBPD, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11220, 202},
+ /* 3318 */ {I_VFNMSUBPD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11228, 202},
+ /* 3319 */ {I_VFNMSUBPS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11236, 202},
+ /* 3320 */ {I_VFNMSUBPS, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11244, 202},
+ /* 3321 */ {I_VFNMSUBPS, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11252, 202},
+ /* 3322 */ {I_VFNMSUBPS, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11260, 202},
+ /* 3323 */ {I_VFNMSUBPS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11268, 202},
+ /* 3324 */ {I_VFNMSUBPS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11276, 202},
+ /* 3325 */ {I_VFNMSUBPS, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11284, 202},
+ /* 3326 */ {I_VFNMSUBPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11292, 202},
+ /* 3327 */ {I_VFNMSUBSD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11300, 202},
+ /* 3328 */ {I_VFNMSUBSD, 3, {XMM_L16,RM_XMM_L16|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11308, 202},
+ /* 3329 */ {I_VFNMSUBSD, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0}, NO_DECORATOR, nasm_bytecodes+11316, 202},
+ /* 3330 */ {I_VFNMSUBSD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+11324, 202},
+ /* 3331 */ {I_VFNMSUBSS, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11332, 202},
+ /* 3332 */ {I_VFNMSUBSS, 3, {XMM_L16,RM_XMM_L16|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11340, 202},
+ /* 3333 */ {I_VFNMSUBSS, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0}, NO_DECORATOR, nasm_bytecodes+11348, 202},
+ /* 3334 */ {I_VFNMSUBSS, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+11356, 202},
+ /* 3335 */ {I_VFRCZPD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31963, 202},
+ /* 3336 */ {I_VFRCZPD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31970, 202},
+ /* 3337 */ {I_VFRCZPD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+31977, 202},
+ /* 3338 */ {I_VFRCZPD, 1, {YMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31984, 202},
+ /* 3339 */ {I_VFRCZPS, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+31991, 202},
+ /* 3340 */ {I_VFRCZPS, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+31998, 202},
+ /* 3341 */ {I_VFRCZPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32005, 202},
+ /* 3342 */ {I_VFRCZPS, 1, {YMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32012, 202},
+ /* 3343 */ {I_VFRCZSD, 2, {XMM_L16,RM_XMM_L16|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+32019, 202},
+ /* 3344 */ {I_VFRCZSD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32026, 202},
+ /* 3345 */ {I_VFRCZSS, 2, {XMM_L16,RM_XMM_L16|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+32033, 202},
+ /* 3346 */ {I_VFRCZSS, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32040, 202},
+ /* 3347 */ {I_VPCMOV, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11364, 202},
+ /* 3348 */ {I_VPCMOV, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11372, 202},
+ /* 3349 */ {I_VPCMOV, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11380, 202},
+ /* 3350 */ {I_VPCMOV, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11388, 202},
+ /* 3351 */ {I_VPCMOV, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11396, 202},
+ /* 3352 */ {I_VPCMOV, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11404, 202},
+ /* 3353 */ {I_VPCMOV, 4, {YMM_L16,YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0}, NO_DECORATOR, nasm_bytecodes+11412, 202},
+ /* 3354 */ {I_VPCMOV, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+11420, 202},
+ /* 3355 */ {I_VPCOMB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11428, 202},
+ /* 3356 */ {I_VPCOMB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11436, 202},
+ /* 3357 */ {I_VPCOMD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11444, 202},
+ /* 3358 */ {I_VPCOMD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11452, 202},
+ /* 3359 */ {I_VPCOMQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11460, 202},
+ /* 3360 */ {I_VPCOMQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11468, 202},
+ /* 3361 */ {I_VPCOMUB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11476, 202},
+ /* 3362 */ {I_VPCOMUB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11484, 202},
+ /* 3363 */ {I_VPCOMUD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11492, 202},
+ /* 3364 */ {I_VPCOMUD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11500, 202},
+ /* 3365 */ {I_VPCOMUQ, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11508, 202},
+ /* 3366 */ {I_VPCOMUQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11516, 202},
+ /* 3367 */ {I_VPCOMUW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11524, 202},
+ /* 3368 */ {I_VPCOMUW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11532, 202},
+ /* 3369 */ {I_VPCOMW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11540, 202},
+ /* 3370 */ {I_VPCOMW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11548, 202},
+ /* 3371 */ {I_VPHADDBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32047, 202},
+ /* 3372 */ {I_VPHADDBD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32054, 202},
+ /* 3373 */ {I_VPHADDBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32061, 202},
+ /* 3374 */ {I_VPHADDBQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32068, 202},
+ /* 3375 */ {I_VPHADDBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32075, 202},
+ /* 3376 */ {I_VPHADDBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32082, 202},
+ /* 3377 */ {I_VPHADDDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32089, 202},
+ /* 3378 */ {I_VPHADDDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32096, 202},
+ /* 3379 */ {I_VPHADDUBD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32103, 202},
+ /* 3380 */ {I_VPHADDUBD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32110, 202},
+ /* 3381 */ {I_VPHADDUBQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32117, 202},
+ /* 3382 */ {I_VPHADDUBQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32124, 202},
+ /* 3383 */ {I_VPHADDUBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32131, 202},
+ /* 3384 */ {I_VPHADDUBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32138, 202},
+ /* 3385 */ {I_VPHADDUDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32145, 202},
+ /* 3386 */ {I_VPHADDUDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32152, 202},
+ /* 3387 */ {I_VPHADDUWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32159, 202},
+ /* 3388 */ {I_VPHADDUWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32166, 202},
+ /* 3389 */ {I_VPHADDUWQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32173, 202},
+ /* 3390 */ {I_VPHADDUWQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32180, 202},
+ /* 3391 */ {I_VPHADDWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32187, 202},
+ /* 3392 */ {I_VPHADDWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32194, 202},
+ /* 3393 */ {I_VPHADDWQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32201, 202},
+ /* 3394 */ {I_VPHADDWQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32208, 202},
+ /* 3395 */ {I_VPHSUBBW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32215, 202},
+ /* 3396 */ {I_VPHSUBBW, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32222, 202},
+ /* 3397 */ {I_VPHSUBDQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32229, 202},
+ /* 3398 */ {I_VPHSUBDQ, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32236, 202},
+ /* 3399 */ {I_VPHSUBWD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32243, 202},
+ /* 3400 */ {I_VPHSUBWD, 1, {XMM_L16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+32250, 202},
+ /* 3401 */ {I_VPMACSDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11556, 202},
+ /* 3402 */ {I_VPMACSDD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11564, 202},
+ /* 3403 */ {I_VPMACSDQH, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11572, 202},
+ /* 3404 */ {I_VPMACSDQH, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11580, 202},
+ /* 3405 */ {I_VPMACSDQL, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11588, 202},
+ /* 3406 */ {I_VPMACSDQL, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11596, 202},
+ /* 3407 */ {I_VPMACSSDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11604, 202},
+ /* 3408 */ {I_VPMACSSDD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11612, 202},
+ /* 3409 */ {I_VPMACSSDQH, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11620, 202},
+ /* 3410 */ {I_VPMACSSDQH, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11628, 202},
+ /* 3411 */ {I_VPMACSSDQL, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11636, 202},
+ /* 3412 */ {I_VPMACSSDQL, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11644, 202},
+ /* 3413 */ {I_VPMACSSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11652, 202},
+ /* 3414 */ {I_VPMACSSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11660, 202},
+ /* 3415 */ {I_VPMACSSWW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11668, 202},
+ /* 3416 */ {I_VPMACSSWW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11676, 202},
+ /* 3417 */ {I_VPMACSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11684, 202},
+ /* 3418 */ {I_VPMACSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11692, 202},
+ /* 3419 */ {I_VPMACSWW, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11700, 202},
+ /* 3420 */ {I_VPMACSWW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11708, 202},
+ /* 3421 */ {I_VPMADCSSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11716, 202},
+ /* 3422 */ {I_VPMADCSSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11724, 202},
+ /* 3423 */ {I_VPMADCSWD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11732, 202},
+ /* 3424 */ {I_VPMADCSWD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11740, 202},
+ /* 3425 */ {I_VPPERM, 4, {XMM_L16,XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0}, NO_DECORATOR, nasm_bytecodes+11748, 202},
+ /* 3426 */ {I_VPPERM, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+11756, 202},
+ /* 3427 */ {I_VPPERM, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11764, 202},
+ /* 3428 */ {I_VPPERM, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11772, 202},
+ /* 3429 */ {I_VPROTB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32257, 202},
+ /* 3430 */ {I_VPROTB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32264, 202},
+ /* 3431 */ {I_VPROTB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32271, 202},
+ /* 3432 */ {I_VPROTB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32278, 202},
+ /* 3433 */ {I_VPROTB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11780, 202},
+ /* 3434 */ {I_VPROTB, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11788, 202},
+ /* 3435 */ {I_VPROTD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32285, 202},
+ /* 3436 */ {I_VPROTD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32292, 202},
+ /* 3437 */ {I_VPROTD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32299, 202},
+ /* 3438 */ {I_VPROTD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32306, 202},
+ /* 3439 */ {I_VPROTD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11796, 202},
+ /* 3440 */ {I_VPROTD, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11804, 202},
+ /* 3441 */ {I_VPROTQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32313, 202},
+ /* 3442 */ {I_VPROTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32320, 202},
+ /* 3443 */ {I_VPROTQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32327, 202},
+ /* 3444 */ {I_VPROTQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32334, 202},
+ /* 3445 */ {I_VPROTQ, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11812, 202},
+ /* 3446 */ {I_VPROTQ, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11820, 202},
+ /* 3447 */ {I_VPROTW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32341, 202},
+ /* 3448 */ {I_VPROTW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32348, 202},
+ /* 3449 */ {I_VPROTW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32355, 202},
+ /* 3450 */ {I_VPROTW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32362, 202},
+ /* 3451 */ {I_VPROTW, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11828, 202},
+ /* 3452 */ {I_VPROTW, 2, {XMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11836, 202},
+ /* 3453 */ {I_VPSHAB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32369, 202},
+ /* 3454 */ {I_VPSHAB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32376, 202},
+ /* 3455 */ {I_VPSHAB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32383, 202},
+ /* 3456 */ {I_VPSHAB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32390, 202},
+ /* 3457 */ {I_VPSHAD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32397, 202},
+ /* 3458 */ {I_VPSHAD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32404, 202},
+ /* 3459 */ {I_VPSHAD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32411, 202},
+ /* 3460 */ {I_VPSHAD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32418, 202},
+ /* 3461 */ {I_VPSHAQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32425, 202},
+ /* 3462 */ {I_VPSHAQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32432, 202},
+ /* 3463 */ {I_VPSHAQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32439, 202},
+ /* 3464 */ {I_VPSHAQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32446, 202},
+ /* 3465 */ {I_VPSHAW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32453, 202},
+ /* 3466 */ {I_VPSHAW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32460, 202},
+ /* 3467 */ {I_VPSHAW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32467, 202},
+ /* 3468 */ {I_VPSHAW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32474, 202},
+ /* 3469 */ {I_VPSHLB, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32481, 202},
+ /* 3470 */ {I_VPSHLB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32488, 202},
+ /* 3471 */ {I_VPSHLB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32495, 202},
+ /* 3472 */ {I_VPSHLB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32502, 202},
+ /* 3473 */ {I_VPSHLD, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32509, 202},
+ /* 3474 */ {I_VPSHLD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32516, 202},
+ /* 3475 */ {I_VPSHLD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32523, 202},
+ /* 3476 */ {I_VPSHLD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32530, 202},
+ /* 3477 */ {I_VPSHLQ, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32537, 202},
+ /* 3478 */ {I_VPSHLQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32544, 202},
+ /* 3479 */ {I_VPSHLQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32551, 202},
+ /* 3480 */ {I_VPSHLQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32558, 202},
+ /* 3481 */ {I_VPSHLW, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+32565, 202},
+ /* 3482 */ {I_VPSHLW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+32572, 202},
+ /* 3483 */ {I_VPSHLW, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+32579, 202},
+ /* 3484 */ {I_VPSHLW, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+32586, 202},
+ /* 3485 */ {I_VMPSADBW, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11844, 203},
+ /* 3486 */ {I_VMPSADBW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11852, 203},
+ /* 3487 */ {I_VPABSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32593, 203},
+ /* 3488 */ {I_VPABSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32600, 203},
+ /* 3489 */ {I_VPABSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32607, 203},
+ /* 3490 */ {I_VPACKSSWB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32614, 203},
+ /* 3491 */ {I_VPACKSSWB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32621, 203},
+ /* 3492 */ {I_VPACKSSDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32628, 203},
+ /* 3493 */ {I_VPACKSSDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32635, 203},
+ /* 3494 */ {I_VPACKUSDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32642, 203},
+ /* 3495 */ {I_VPACKUSDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32649, 203},
+ /* 3496 */ {I_VPACKUSWB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32656, 203},
+ /* 3497 */ {I_VPACKUSWB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32663, 203},
+ /* 3498 */ {I_VPADDB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32670, 203},
+ /* 3499 */ {I_VPADDB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32677, 203},
+ /* 3500 */ {I_VPADDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32684, 203},
+ /* 3501 */ {I_VPADDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32691, 203},
+ /* 3502 */ {I_VPADDD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32698, 203},
+ /* 3503 */ {I_VPADDD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32705, 203},
+ /* 3504 */ {I_VPADDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32712, 203},
+ /* 3505 */ {I_VPADDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32719, 203},
+ /* 3506 */ {I_VPADDSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32726, 203},
+ /* 3507 */ {I_VPADDSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32733, 203},
+ /* 3508 */ {I_VPADDSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32740, 203},
+ /* 3509 */ {I_VPADDSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32747, 203},
+ /* 3510 */ {I_VPADDUSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32754, 203},
+ /* 3511 */ {I_VPADDUSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32761, 203},
+ /* 3512 */ {I_VPADDUSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32768, 203},
+ /* 3513 */ {I_VPADDUSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32775, 203},
+ /* 3514 */ {I_VPALIGNR, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11860, 203},
+ /* 3515 */ {I_VPALIGNR, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11868, 203},
+ /* 3516 */ {I_VPAND, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32782, 203},
+ /* 3517 */ {I_VPAND, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32789, 203},
+ /* 3518 */ {I_VPANDN, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32796, 203},
+ /* 3519 */ {I_VPANDN, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32803, 203},
+ /* 3520 */ {I_VPAVGB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32810, 203},
+ /* 3521 */ {I_VPAVGB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32817, 203},
+ /* 3522 */ {I_VPAVGW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32824, 203},
+ /* 3523 */ {I_VPAVGW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32831, 203},
+ /* 3524 */ {I_VPBLENDVB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0}, NO_DECORATOR, nasm_bytecodes+11876, 203},
+ /* 3525 */ {I_VPBLENDVB, 3, {YMM_L16,RM_YMM_L16|BITS256,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+11884, 203},
+ /* 3526 */ {I_VPBLENDW, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+11892, 203},
+ /* 3527 */ {I_VPBLENDW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11900, 203},
+ /* 3528 */ {I_VPCMPEQB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32838, 203},
+ /* 3529 */ {I_VPCMPEQB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32845, 203},
+ /* 3530 */ {I_VPCMPEQW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32852, 203},
+ /* 3531 */ {I_VPCMPEQW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32859, 203},
+ /* 3532 */ {I_VPCMPEQD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32866, 203},
+ /* 3533 */ {I_VPCMPEQD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32873, 203},
+ /* 3534 */ {I_VPCMPEQQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32880, 203},
+ /* 3535 */ {I_VPCMPEQQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32887, 203},
+ /* 3536 */ {I_VPCMPGTB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32894, 203},
+ /* 3537 */ {I_VPCMPGTB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32901, 203},
+ /* 3538 */ {I_VPCMPGTW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32908, 203},
+ /* 3539 */ {I_VPCMPGTW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32915, 203},
+ /* 3540 */ {I_VPCMPGTD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32922, 203},
+ /* 3541 */ {I_VPCMPGTD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32929, 203},
+ /* 3542 */ {I_VPCMPGTQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32936, 203},
+ /* 3543 */ {I_VPCMPGTQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32943, 203},
+ /* 3544 */ {I_VPHADDW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32950, 203},
+ /* 3545 */ {I_VPHADDW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32957, 203},
+ /* 3546 */ {I_VPHADDD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32964, 203},
+ /* 3547 */ {I_VPHADDD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32971, 203},
+ /* 3548 */ {I_VPHADDSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32978, 203},
+ /* 3549 */ {I_VPHADDSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32985, 203},
+ /* 3550 */ {I_VPHSUBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+32992, 203},
+ /* 3551 */ {I_VPHSUBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+32999, 203},
+ /* 3552 */ {I_VPHSUBD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33006, 203},
+ /* 3553 */ {I_VPHSUBD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33013, 203},
+ /* 3554 */ {I_VPHSUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33020, 203},
+ /* 3555 */ {I_VPHSUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33027, 203},
+ /* 3556 */ {I_VPMADDUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33034, 203},
+ /* 3557 */ {I_VPMADDUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33041, 203},
+ /* 3558 */ {I_VPMADDWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33048, 203},
+ /* 3559 */ {I_VPMADDWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33055, 203},
+ /* 3560 */ {I_VPMAXSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33062, 203},
+ /* 3561 */ {I_VPMAXSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33069, 203},
+ /* 3562 */ {I_VPMAXSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33076, 203},
+ /* 3563 */ {I_VPMAXSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33083, 203},
+ /* 3564 */ {I_VPMAXSD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33090, 203},
+ /* 3565 */ {I_VPMAXSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33097, 203},
+ /* 3566 */ {I_VPMAXUB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33104, 203},
+ /* 3567 */ {I_VPMAXUB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33111, 203},
+ /* 3568 */ {I_VPMAXUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33118, 203},
+ /* 3569 */ {I_VPMAXUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33125, 203},
+ /* 3570 */ {I_VPMAXUD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33132, 203},
+ /* 3571 */ {I_VPMAXUD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33139, 203},
+ /* 3572 */ {I_VPMINSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33146, 203},
+ /* 3573 */ {I_VPMINSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33153, 203},
+ /* 3574 */ {I_VPMINSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33160, 203},
+ /* 3575 */ {I_VPMINSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33167, 203},
+ /* 3576 */ {I_VPMINSD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33174, 203},
+ /* 3577 */ {I_VPMINSD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33181, 203},
+ /* 3578 */ {I_VPMINUB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33188, 203},
+ /* 3579 */ {I_VPMINUB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33195, 203},
+ /* 3580 */ {I_VPMINUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33202, 203},
+ /* 3581 */ {I_VPMINUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33209, 203},
+ /* 3582 */ {I_VPMINUD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33216, 203},
+ /* 3583 */ {I_VPMINUD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33223, 203},
+ /* 3584 */ {I_VPMOVMSKB, 2, {REG_GPR|BITS32,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33230, 203},
+ /* 3585 */ {I_VPMOVMSKB, 2, {REG_GPR|BITS64,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33230, 203},
+ /* 3586 */ {I_VPMOVSXBW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33237, 203},
+ /* 3587 */ {I_VPMOVSXBD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33244, 203},
+ /* 3588 */ {I_VPMOVSXBD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33244, 203},
+ /* 3589 */ {I_VPMOVSXBQ, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33251, 203},
+ /* 3590 */ {I_VPMOVSXBQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33251, 203},
+ /* 3591 */ {I_VPMOVSXWD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33258, 203},
+ /* 3592 */ {I_VPMOVSXWQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33265, 203},
+ /* 3593 */ {I_VPMOVSXWQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33265, 203},
+ /* 3594 */ {I_VPMOVSXDQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33272, 203},
+ /* 3595 */ {I_VPMOVZXBW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33279, 203},
+ /* 3596 */ {I_VPMOVZXBD, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33286, 203},
+ /* 3597 */ {I_VPMOVZXBD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33286, 203},
+ /* 3598 */ {I_VPMOVZXBQ, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33293, 203},
+ /* 3599 */ {I_VPMOVZXBQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33293, 203},
+ /* 3600 */ {I_VPMOVZXWD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33300, 203},
+ /* 3601 */ {I_VPMOVZXWQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33307, 203},
+ /* 3602 */ {I_VPMOVZXWQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33307, 203},
+ /* 3603 */ {I_VPMOVZXDQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33314, 203},
+ /* 3604 */ {I_VPMULDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33321, 203},
+ /* 3605 */ {I_VPMULDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33328, 203},
+ /* 3606 */ {I_VPMULHRSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33335, 203},
+ /* 3607 */ {I_VPMULHRSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33342, 203},
+ /* 3608 */ {I_VPMULHUW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33349, 203},
+ /* 3609 */ {I_VPMULHUW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33356, 203},
+ /* 3610 */ {I_VPMULHW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33363, 203},
+ /* 3611 */ {I_VPMULHW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33370, 203},
+ /* 3612 */ {I_VPMULLW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33377, 203},
+ /* 3613 */ {I_VPMULLW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33384, 203},
+ /* 3614 */ {I_VPMULLD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33391, 203},
+ /* 3615 */ {I_VPMULLD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33398, 203},
+ /* 3616 */ {I_VPMULUDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33405, 203},
+ /* 3617 */ {I_VPMULUDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33412, 203},
+ /* 3618 */ {I_VPOR, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33419, 203},
+ /* 3619 */ {I_VPOR, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33426, 203},
+ /* 3620 */ {I_VPSADBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33433, 203},
+ /* 3621 */ {I_VPSADBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33440, 203},
+ /* 3622 */ {I_VPSHUFB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33447, 203},
+ /* 3623 */ {I_VPSHUFB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33454, 203},
+ /* 3624 */ {I_VPSHUFD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11908, 203},
+ /* 3625 */ {I_VPSHUFHW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11916, 203},
+ /* 3626 */ {I_VPSHUFLW, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11924, 203},
+ /* 3627 */ {I_VPSIGNB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33461, 203},
+ /* 3628 */ {I_VPSIGNB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33468, 203},
+ /* 3629 */ {I_VPSIGNW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33475, 203},
+ /* 3630 */ {I_VPSIGNW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33482, 203},
+ /* 3631 */ {I_VPSIGND, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33489, 203},
+ /* 3632 */ {I_VPSIGND, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33496, 203},
+ /* 3633 */ {I_VPSLLDQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11932, 203},
+ /* 3634 */ {I_VPSLLDQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11940, 203},
+ /* 3635 */ {I_VPSLLW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33503, 203},
+ /* 3636 */ {I_VPSLLW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33510, 203},
+ /* 3637 */ {I_VPSLLW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11948, 203},
+ /* 3638 */ {I_VPSLLW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11956, 203},
+ /* 3639 */ {I_VPSLLD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33517, 203},
+ /* 3640 */ {I_VPSLLD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33524, 203},
+ /* 3641 */ {I_VPSLLD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11964, 203},
+ /* 3642 */ {I_VPSLLD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11972, 203},
+ /* 3643 */ {I_VPSLLQ, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33531, 203},
+ /* 3644 */ {I_VPSLLQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33538, 203},
+ /* 3645 */ {I_VPSLLQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11980, 203},
+ /* 3646 */ {I_VPSLLQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+11988, 203},
+ /* 3647 */ {I_VPSRAW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33545, 203},
+ /* 3648 */ {I_VPSRAW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33552, 203},
+ /* 3649 */ {I_VPSRAW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+11996, 203},
+ /* 3650 */ {I_VPSRAW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12004, 203},
+ /* 3651 */ {I_VPSRAD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33559, 203},
+ /* 3652 */ {I_VPSRAD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33566, 203},
+ /* 3653 */ {I_VPSRAD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12012, 203},
+ /* 3654 */ {I_VPSRAD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12020, 203},
+ /* 3655 */ {I_VPSRLDQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12028, 203},
+ /* 3656 */ {I_VPSRLDQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12036, 203},
+ /* 3657 */ {I_VPSRLW, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33573, 203},
+ /* 3658 */ {I_VPSRLW, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33580, 203},
+ /* 3659 */ {I_VPSRLW, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12044, 203},
+ /* 3660 */ {I_VPSRLW, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12052, 203},
+ /* 3661 */ {I_VPSRLD, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33587, 203},
+ /* 3662 */ {I_VPSRLD, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33594, 203},
+ /* 3663 */ {I_VPSRLD, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12060, 203},
+ /* 3664 */ {I_VPSRLD, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12068, 203},
+ /* 3665 */ {I_VPSRLQ, 3, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33601, 203},
+ /* 3666 */ {I_VPSRLQ, 2, {YMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33608, 203},
+ /* 3667 */ {I_VPSRLQ, 3, {YMM_L16,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12076, 203},
+ /* 3668 */ {I_VPSRLQ, 2, {YMM_L16,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+12084, 203},
+ /* 3669 */ {I_VPSUBB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33615, 203},
+ /* 3670 */ {I_VPSUBB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33622, 203},
+ /* 3671 */ {I_VPSUBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33629, 203},
+ /* 3672 */ {I_VPSUBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33636, 203},
+ /* 3673 */ {I_VPSUBD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33643, 203},
+ /* 3674 */ {I_VPSUBD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33650, 203},
+ /* 3675 */ {I_VPSUBQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33657, 203},
+ /* 3676 */ {I_VPSUBQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33664, 203},
+ /* 3677 */ {I_VPSUBSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33671, 203},
+ /* 3678 */ {I_VPSUBSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33678, 203},
+ /* 3679 */ {I_VPSUBSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33685, 203},
+ /* 3680 */ {I_VPSUBSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33692, 203},
+ /* 3681 */ {I_VPSUBUSB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33699, 203},
+ /* 3682 */ {I_VPSUBUSB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33706, 203},
+ /* 3683 */ {I_VPSUBUSW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33713, 203},
+ /* 3684 */ {I_VPSUBUSW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33720, 203},
+ /* 3685 */ {I_VPUNPCKHBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33727, 203},
+ /* 3686 */ {I_VPUNPCKHBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33734, 203},
+ /* 3687 */ {I_VPUNPCKHWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33741, 203},
+ /* 3688 */ {I_VPUNPCKHWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33748, 203},
+ /* 3689 */ {I_VPUNPCKHDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33755, 203},
+ /* 3690 */ {I_VPUNPCKHDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33762, 203},
+ /* 3691 */ {I_VPUNPCKHQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33769, 203},
+ /* 3692 */ {I_VPUNPCKHQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33776, 203},
+ /* 3693 */ {I_VPUNPCKLBW, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33783, 203},
+ /* 3694 */ {I_VPUNPCKLBW, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33790, 203},
+ /* 3695 */ {I_VPUNPCKLWD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33797, 203},
+ /* 3696 */ {I_VPUNPCKLWD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33804, 203},
+ /* 3697 */ {I_VPUNPCKLDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33811, 203},
+ /* 3698 */ {I_VPUNPCKLDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33818, 203},
+ /* 3699 */ {I_VPUNPCKLQDQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33825, 203},
+ /* 3700 */ {I_VPUNPCKLQDQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33832, 203},
+ /* 3701 */ {I_VPXOR, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33839, 203},
+ /* 3702 */ {I_VPXOR, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33846, 203},
+ /* 3703 */ {I_VMOVNTDQA, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33853, 203},
+ /* 3704 */ {I_VBROADCASTSS, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28064, 203},
+ /* 3705 */ {I_VBROADCASTSS, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28071, 203},
+ /* 3706 */ {I_VBROADCASTSD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+28078, 203},
+ /* 3707 */ {I_VBROADCASTI128, 2, {YMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33860, 203},
+ /* 3708 */ {I_VPBLENDD, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12092, 203},
+ /* 3709 */ {I_VPBLENDD, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12100, 203},
+ /* 3710 */ {I_VPBLENDD, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12108, 203},
+ /* 3711 */ {I_VPBLENDD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12116, 203},
+ /* 3712 */ {I_VPBROADCASTB, 2, {XMM_L16,MEMORY|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33867, 203},
+ /* 3713 */ {I_VPBROADCASTB, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33867, 203},
+ /* 3714 */ {I_VPBROADCASTB, 2, {YMM_L16,MEMORY|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+33874, 203},
+ /* 3715 */ {I_VPBROADCASTB, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33874, 203},
+ /* 3716 */ {I_VPBROADCASTW, 2, {XMM_L16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33881, 203},
+ /* 3717 */ {I_VPBROADCASTW, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33881, 203},
+ /* 3718 */ {I_VPBROADCASTW, 2, {YMM_L16,MEMORY|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33888, 203},
+ /* 3719 */ {I_VPBROADCASTW, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33888, 203},
+ /* 3720 */ {I_VPBROADCASTD, 2, {XMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33895, 203},
+ /* 3721 */ {I_VPBROADCASTD, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33895, 203},
+ /* 3722 */ {I_VPBROADCASTD, 2, {YMM_L16,MEMORY|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+33902, 203},
+ /* 3723 */ {I_VPBROADCASTD, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33902, 203},
+ /* 3724 */ {I_VPBROADCASTQ, 2, {XMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33909, 203},
+ /* 3725 */ {I_VPBROADCASTQ, 2, {XMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33909, 203},
+ /* 3726 */ {I_VPBROADCASTQ, 2, {YMM_L16,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+33916, 203},
+ /* 3727 */ {I_VPBROADCASTQ, 2, {YMM_L16,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+33916, 203},
+ /* 3728 */ {I_VPERMD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33923, 203},
+ /* 3729 */ {I_VPERMD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33930, 203},
+ /* 3730 */ {I_VPERMPD, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12124, 203},
+ /* 3731 */ {I_VPERMPS, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33937, 203},
+ /* 3732 */ {I_VPERMPS, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33944, 203},
+ /* 3733 */ {I_VPERMQ, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12132, 203},
+ /* 3734 */ {I_VPERM2I128, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12140, 203},
+ /* 3735 */ {I_VPERM2I128, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12148, 203},
+ /* 3736 */ {I_VEXTRACTI128, 3, {RM_XMM_L16|BITS128,YMM_L16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12156, 203},
+ /* 3737 */ {I_VINSERTI128, 4, {YMM_L16,YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+12164, 203},
+ /* 3738 */ {I_VINSERTI128, 3, {YMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12172, 203},
+ /* 3739 */ {I_VPMASKMOVD, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33951, 203},
+ /* 3740 */ {I_VPMASKMOVD, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33958, 203},
+ /* 3741 */ {I_VPMASKMOVD, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33965, 203},
+ /* 3742 */ {I_VPMASKMOVD, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+33972, 203},
+ /* 3743 */ {I_VPMASKMOVQ, 3, {XMM_L16,XMM_L16,MEMORY|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+33979, 203},
+ /* 3744 */ {I_VPMASKMOVQ, 2, {XMM_L16,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+33986, 203},
+ /* 3745 */ {I_VPMASKMOVQ, 3, {YMM_L16,YMM_L16,MEMORY|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+33993, 203},
+ /* 3746 */ {I_VPMASKMOVQ, 2, {YMM_L16,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34000, 203},
+ /* 3747 */ {I_VPMASKMOVD, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34007, 203},
+ /* 3748 */ {I_VPMASKMOVD, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34014, 203},
+ /* 3749 */ {I_VPMASKMOVD, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34021, 203},
+ /* 3750 */ {I_VPMASKMOVD, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34028, 203},
+ /* 3751 */ {I_VPMASKMOVQ, 3, {MEMORY|BITS128,XMM_L16,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34035, 203},
+ /* 3752 */ {I_VPMASKMOVQ, 2, {MEMORY|BITS128,XMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34042, 203},
+ /* 3753 */ {I_VPMASKMOVQ, 3, {MEMORY|BITS256,YMM_L16,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+34049, 203},
+ /* 3754 */ {I_VPMASKMOVQ, 2, {MEMORY|BITS256,YMM_L16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34056, 203},
+ /* 3755 */ {I_VPSLLVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34063, 203},
+ /* 3756 */ {I_VPSLLVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34070, 203},
+ /* 3757 */ {I_VPSLLVQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34077, 203},
+ /* 3758 */ {I_VPSLLVQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34084, 203},
+ /* 3759 */ {I_VPSLLVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34091, 203},
+ /* 3760 */ {I_VPSLLVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34098, 203},
+ /* 3761 */ {I_VPSLLVQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34105, 203},
+ /* 3762 */ {I_VPSLLVQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34112, 203},
+ /* 3763 */ {I_VPSRAVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34119, 203},
+ /* 3764 */ {I_VPSRAVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34126, 203},
+ /* 3765 */ {I_VPSRAVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34133, 203},
+ /* 3766 */ {I_VPSRAVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34140, 203},
+ /* 3767 */ {I_VPSRLVD, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34147, 203},
+ /* 3768 */ {I_VPSRLVD, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34154, 203},
+ /* 3769 */ {I_VPSRLVQ, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34161, 203},
+ /* 3770 */ {I_VPSRLVQ, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34168, 203},
+ /* 3771 */ {I_VPSRLVD, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34175, 203},
+ /* 3772 */ {I_VPSRLVD, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34182, 203},
+ /* 3773 */ {I_VPSRLVQ, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34189, 203},
+ /* 3774 */ {I_VPSRLVQ, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+34196, 203},
+ /* 3775 */ {I_VGATHERDPD, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12180, 203},
+ /* 3776 */ {I_VGATHERQPD, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12188, 203},
+ /* 3777 */ {I_VGATHERDPD, 3, {YMM_L16,XMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12196, 203},
+ /* 3778 */ {I_VGATHERQPD, 3, {YMM_L16,YMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12204, 203},
+ /* 3779 */ {I_VGATHERDPS, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12212, 203},
+ /* 3780 */ {I_VGATHERQPS, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12220, 203},
+ /* 3781 */ {I_VGATHERDPS, 3, {YMM_L16,YMEM|BITS32,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12228, 203},
+ /* 3782 */ {I_VGATHERQPS, 3, {XMM_L16,YMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12236, 203},
+ /* 3783 */ {I_VPGATHERDD, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12244, 203},
+ /* 3784 */ {I_VPGATHERQD, 3, {XMM_L16,XMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12252, 203},
+ /* 3785 */ {I_VPGATHERDD, 3, {YMM_L16,YMEM|BITS32,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12260, 203},
+ /* 3786 */ {I_VPGATHERQD, 3, {XMM_L16,YMEM|BITS32,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12268, 203},
+ /* 3787 */ {I_VPGATHERDQ, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12276, 203},
+ /* 3788 */ {I_VPGATHERQQ, 3, {XMM_L16,XMEM|BITS64,XMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12284, 203},
+ /* 3789 */ {I_VPGATHERDQ, 3, {YMM_L16,XMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12292, 203},
+ /* 3790 */ {I_VPGATHERQQ, 3, {YMM_L16,YMEM|BITS64,YMM_L16,0,0}, NO_DECORATOR, nasm_bytecodes+12300, 203},
+ /* 3791 */ {I_XABORT, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40486, 204},
+ /* 3792 */ {I_XABORT, 1, {IMMEDIATE|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40486, 204},
+ /* 3793 */ {I_XBEGIN, 1, {IMMEDIATE,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37432, 204},
+ /* 3794 */ {I_XBEGIN, 1, {IMMEDIATE|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37438, 205},
+ /* 3795 */ {I_XBEGIN, 1, {IMMEDIATE|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37444, 205},
+ /* 3796 */ {I_XBEGIN, 1, {IMMEDIATE|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37450, 206},
+ /* 3797 */ {I_XEND, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40491, 204},
+ /* 3798 */ {I_XTEST, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40496, 207},
+ /* 3799 */ {I_ANDN, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34203, 208},
+ /* 3800 */ {I_ANDN, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34210, 209},
+ /* 3801 */ {I_BEXTR, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34217, 208},
+ /* 3802 */ {I_BEXTR, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34224, 209},
+ /* 3803 */ {I_BEXTR, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+12308, 210},
+ /* 3804 */ {I_BEXTR, 3, {REG_GPR|BITS64,RM_GPR|BITS64,IMMEDIATE|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+12316, 211},
+ /* 3805 */ {I_BLCI, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34231, 210},
+ /* 3806 */ {I_BLCI, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34238, 211},
+ /* 3807 */ {I_BLCIC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34245, 210},
+ /* 3808 */ {I_BLCIC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34252, 211},
+ /* 3809 */ {I_BLSI, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34259, 208},
+ /* 3810 */ {I_BLSI, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34266, 209},
+ /* 3811 */ {I_BLSIC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34273, 210},
+ /* 3812 */ {I_BLSIC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34280, 211},
+ /* 3813 */ {I_BLCFILL, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34287, 210},
+ /* 3814 */ {I_BLCFILL, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34294, 211},
+ /* 3815 */ {I_BLSFILL, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34301, 210},
+ /* 3816 */ {I_BLSFILL, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34308, 211},
+ /* 3817 */ {I_BLCMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34315, 210},
+ /* 3818 */ {I_BLCMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34322, 211},
+ /* 3819 */ {I_BLSMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34329, 208},
+ /* 3820 */ {I_BLSMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34336, 209},
+ /* 3821 */ {I_BLSR, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34343, 208},
+ /* 3822 */ {I_BLSR, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34350, 209},
+ /* 3823 */ {I_BLCS, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34357, 210},
+ /* 3824 */ {I_BLCS, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34364, 211},
+ /* 3825 */ {I_BZHI, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34371, 212},
+ /* 3826 */ {I_BZHI, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34378, 213},
+ /* 3827 */ {I_MULX, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34385, 212},
+ /* 3828 */ {I_MULX, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34392, 213},
+ /* 3829 */ {I_PDEP, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34399, 212},
+ /* 3830 */ {I_PDEP, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34406, 213},
+ /* 3831 */ {I_PEXT, 3, {REG_GPR|BITS32,REG_GPR|BITS32,RM_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34413, 212},
+ /* 3832 */ {I_PEXT, 3, {REG_GPR|BITS64,REG_GPR|BITS64,RM_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34420, 213},
+ /* 3833 */ {I_RORX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12324, 212},
+ /* 3834 */ {I_RORX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12332, 213},
+ /* 3835 */ {I_SARX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34427, 212},
+ /* 3836 */ {I_SARX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34434, 213},
+ /* 3837 */ {I_SHLX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34441, 212},
+ /* 3838 */ {I_SHLX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34448, 213},
+ /* 3839 */ {I_SHRX, 3, {REG_GPR|BITS32,RM_GPR|BITS32,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+34455, 212},
+ /* 3840 */ {I_SHRX, 3, {REG_GPR|BITS64,RM_GPR|BITS64,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+34462, 213},
+ /* 3841 */ {I_TZCNT, 2, {REG_GPR|BITS16,RM_GPR|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34469, 214},
+ /* 3842 */ {I_TZCNT, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34476, 214},
+ /* 3843 */ {I_TZCNT, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34483, 215},
+ /* 3844 */ {I_TZMSK, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34490, 210},
+ /* 3845 */ {I_TZMSK, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34497, 211},
+ /* 3846 */ {I_T1MSKC, 2, {REG_GPR|BITS32,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34504, 210},
+ /* 3847 */ {I_T1MSKC, 2, {REG_GPR|BITS64,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34511, 211},
+ /* 3848 */ {I_PREFETCHWT1, 1, {MEMORY|BITS8,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40501, 216},
+ /* 3849 */ {I_BNDMK, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37456, 217},
+ /* 3850 */ {I_BNDCL, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34519, 218},
+ /* 3851 */ {I_BNDCL, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34519, 219},
+ /* 3852 */ {I_BNDCL, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34518, 220},
+ /* 3853 */ {I_BNDCU, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34526, 218},
+ /* 3854 */ {I_BNDCU, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34526, 219},
+ /* 3855 */ {I_BNDCU, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34525, 220},
+ /* 3856 */ {I_BNDCN, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+34533, 218},
+ /* 3857 */ {I_BNDCN, 2, {BNDREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34533, 219},
+ /* 3858 */ {I_BNDCN, 2, {BNDREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34532, 220},
+ /* 3859 */ {I_BNDMOV, 2, {BNDREG,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37462, 218},
+ /* 3860 */ {I_BNDMOV, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37462, 218},
+ /* 3861 */ {I_BNDMOV, 2, {BNDREG,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37468, 218},
+ /* 3862 */ {I_BNDMOV, 2, {MEMORY,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37468, 218},
+ /* 3863 */ {I_BNDLDX, 2, {BNDREG,MEMORY,0,0,0}, NO_DECORATOR, nasm_bytecodes+37463, 217},
+ /* 3864 */ {I_BNDLDX, 3, {BNDREG,MEMORY,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+37474, 221},
+ /* 3865 */ {I_BNDLDX, 3, {BNDREG,MEMORY,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+37474, 222},
+ /* 3866 */ {I_BNDSTX, 2, {MEMORY,BNDREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+37469, 217},
+ /* 3867 */ {I_BNDSTX, 3, {MEMORY,REG_GPR|BITS32,BNDREG,0,0}, NO_DECORATOR, nasm_bytecodes+37480, 221},
+ /* 3868 */ {I_BNDSTX, 3, {MEMORY,REG_GPR|BITS64,BNDREG,0,0}, NO_DECORATOR, nasm_bytecodes+37480, 222},
+ /* 3869 */ {I_BNDSTX, 3, {MEMORY,BNDREG,REG_GPR|BITS32,0,0}, NO_DECORATOR, nasm_bytecodes+37486, 221},
+ /* 3870 */ {I_BNDSTX, 3, {MEMORY,BNDREG,REG_GPR|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+37486, 222},
+ /* 3871 */ {I_SHA1MSG1, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37492, 223},
+ /* 3872 */ {I_SHA1MSG2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37498, 223},
+ /* 3873 */ {I_SHA1NEXTE, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37504, 223},
+ /* 3874 */ {I_SHA1RNDS4, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+34539, 223},
+ /* 3875 */ {I_SHA256MSG1, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37510, 223},
+ /* 3876 */ {I_SHA256MSG2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37516, 223},
+ /* 3877 */ {I_SHA256RNDS2, 3, {XMM_L16,RM_XMM_L16|BITS128,XMM0,0,0}, NO_DECORATOR, nasm_bytecodes+37522, 223},
+ /* 3878 */ {I_SHA256RNDS2, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+37522, 223},
+ /* 3879 */ {I_KADDB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34546, 224},
+ /* 3880 */ {I_KADDD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34553, 224},
+ /* 3881 */ {I_KADDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34560, 224},
+ /* 3882 */ {I_KADDW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34567, 224},
+ /* 3883 */ {I_KANDB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34574, 224},
+ /* 3884 */ {I_KANDD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34581, 224},
+ /* 3885 */ {I_KANDNB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34588, 224},
+ /* 3886 */ {I_KANDND, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34595, 224},
+ /* 3887 */ {I_KANDNQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34602, 224},
+ /* 3888 */ {I_KANDNW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34609, 224},
+ /* 3889 */ {I_KANDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34616, 224},
+ /* 3890 */ {I_KANDW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34623, 224},
+ /* 3891 */ {I_KMOVB, 2, {KREG,RM_K|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+34630, 224},
+ /* 3892 */ {I_KMOVB, 2, {MEMORY|BITS8,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34637, 224},
+ /* 3893 */ {I_KMOVB, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34644, 224},
+ /* 3894 */ {I_KMOVB, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34651, 224},
+ /* 3895 */ {I_KMOVD, 2, {KREG,RM_K|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34658, 224},
+ /* 3896 */ {I_KMOVD, 2, {MEMORY|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34665, 224},
+ /* 3897 */ {I_KMOVD, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34672, 224},
+ /* 3898 */ {I_KMOVD, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34679, 224},
+ /* 3899 */ {I_KMOVQ, 2, {KREG,RM_K|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34686, 224},
+ /* 3900 */ {I_KMOVQ, 2, {MEMORY|BITS64,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34693, 224},
+ /* 3901 */ {I_KMOVQ, 2, {KREG,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34700, 224},
+ /* 3902 */ {I_KMOVQ, 2, {REG_GPR|BITS64,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34707, 224},
+ /* 3903 */ {I_KMOVW, 2, {KREG,RM_K|BITS16,0,0,0}, NO_DECORATOR, nasm_bytecodes+34714, 224},
+ /* 3904 */ {I_KMOVW, 2, {MEMORY|BITS16,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34721, 224},
+ /* 3905 */ {I_KMOVW, 2, {KREG,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34728, 224},
+ /* 3906 */ {I_KMOVW, 2, {REG_GPR|BITS32,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34735, 224},
+ /* 3907 */ {I_KNOTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34742, 224},
+ /* 3908 */ {I_KNOTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34749, 224},
+ /* 3909 */ {I_KNOTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34756, 224},
+ /* 3910 */ {I_KNOTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34763, 224},
+ /* 3911 */ {I_KORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34770, 224},
+ /* 3912 */ {I_KORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34777, 224},
+ /* 3913 */ {I_KORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34784, 224},
+ /* 3914 */ {I_KORTESTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34791, 224},
+ /* 3915 */ {I_KORTESTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34798, 224},
+ /* 3916 */ {I_KORTESTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34805, 224},
+ /* 3917 */ {I_KORTESTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34812, 224},
+ /* 3918 */ {I_KORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34819, 224},
+ /* 3919 */ {I_KSHIFTLB, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12340, 224},
+ /* 3920 */ {I_KSHIFTLD, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12348, 224},
+ /* 3921 */ {I_KSHIFTLQ, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12356, 224},
+ /* 3922 */ {I_KSHIFTLW, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12364, 224},
+ /* 3923 */ {I_KSHIFTRB, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12372, 224},
+ /* 3924 */ {I_KSHIFTRD, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12380, 224},
+ /* 3925 */ {I_KSHIFTRQ, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12388, 224},
+ /* 3926 */ {I_KSHIFTRW, 3, {KREG,KREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+12396, 224},
+ /* 3927 */ {I_KTESTB, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34826, 224},
+ /* 3928 */ {I_KTESTD, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34833, 224},
+ /* 3929 */ {I_KTESTQ, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34840, 224},
+ /* 3930 */ {I_KTESTW, 2, {KREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+34847, 224},
+ /* 3931 */ {I_KUNPCKBW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34854, 224},
+ /* 3932 */ {I_KUNPCKDQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34861, 224},
+ /* 3933 */ {I_KUNPCKWD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34868, 224},
+ /* 3934 */ {I_KXNORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34875, 224},
+ /* 3935 */ {I_KXNORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34882, 224},
+ /* 3936 */ {I_KXNORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34889, 224},
+ /* 3937 */ {I_KXNORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34896, 224},
+ /* 3938 */ {I_KXORB, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34903, 224},
+ /* 3939 */ {I_KXORD, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34910, 224},
+ /* 3940 */ {I_KXORQ, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34917, 224},
+ /* 3941 */ {I_KXORW, 3, {KREG,KREG,KREG,0,0}, NO_DECORATOR, nasm_bytecodes+34924, 224},
+ /* 3942 */ {I_VADDPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12404, 225},
+ /* 3943 */ {I_VADDPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12412, 225},
+ /* 3944 */ {I_VADDPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12420, 225},
+ /* 3945 */ {I_VADDPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12428, 225},
+ /* 3946 */ {I_VADDPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+12436, 226},
+ /* 3947 */ {I_VADDPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+12444, 226},
+ /* 3948 */ {I_VADDPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12452, 225},
+ /* 3949 */ {I_VADDPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12460, 225},
+ /* 3950 */ {I_VADDPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12468, 225},
+ /* 3951 */ {I_VADDPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12476, 225},
+ /* 3952 */ {I_VADDPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+12484, 226},
+ /* 3953 */ {I_VADDPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+12492, 226},
+ /* 3954 */ {I_VADDSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+12500, 226},
+ /* 3955 */ {I_VADDSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+12508, 226},
+ /* 3956 */ {I_VADDSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+12516, 226},
+ /* 3957 */ {I_VADDSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+12524, 226},
+ /* 3958 */ {I_VALIGND, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4002, 225},
+ /* 3959 */ {I_VALIGND, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4011, 225},
+ /* 3960 */ {I_VALIGND, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4020, 225},
+ /* 3961 */ {I_VALIGND, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4029, 225},
+ /* 3962 */ {I_VALIGND, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4038, 226},
+ /* 3963 */ {I_VALIGND, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4047, 226},
+ /* 3964 */ {I_VALIGNQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4056, 225},
+ /* 3965 */ {I_VALIGNQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4065, 225},
+ /* 3966 */ {I_VALIGNQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4074, 225},
+ /* 3967 */ {I_VALIGNQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4083, 225},
+ /* 3968 */ {I_VALIGNQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4092, 226},
+ /* 3969 */ {I_VALIGNQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4101, 226},
+ /* 3970 */ {I_VANDNPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12532, 227},
+ /* 3971 */ {I_VANDNPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12540, 227},
+ /* 3972 */ {I_VANDNPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12548, 227},
+ /* 3973 */ {I_VANDNPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12556, 227},
+ /* 3974 */ {I_VANDNPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12564, 228},
+ /* 3975 */ {I_VANDNPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12572, 228},
+ /* 3976 */ {I_VANDNPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12580, 227},
+ /* 3977 */ {I_VANDNPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12588, 227},
+ /* 3978 */ {I_VANDNPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12596, 227},
+ /* 3979 */ {I_VANDNPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12604, 227},
+ /* 3980 */ {I_VANDNPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12612, 228},
+ /* 3981 */ {I_VANDNPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12620, 228},
+ /* 3982 */ {I_VANDPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12628, 227},
+ /* 3983 */ {I_VANDPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12636, 227},
+ /* 3984 */ {I_VANDPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12644, 227},
+ /* 3985 */ {I_VANDPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12652, 227},
+ /* 3986 */ {I_VANDPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12660, 228},
+ /* 3987 */ {I_VANDPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+12668, 228},
+ /* 3988 */ {I_VANDPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12676, 227},
+ /* 3989 */ {I_VANDPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12684, 227},
+ /* 3990 */ {I_VANDPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12692, 227},
+ /* 3991 */ {I_VANDPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12700, 227},
+ /* 3992 */ {I_VANDPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12708, 228},
+ /* 3993 */ {I_VANDPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+12716, 228},
+ /* 3994 */ {I_VBLENDMPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12724, 225},
+ /* 3995 */ {I_VBLENDMPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12732, 225},
+ /* 3996 */ {I_VBLENDMPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+12740, 226},
+ /* 3997 */ {I_VBLENDMPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12748, 225},
+ /* 3998 */ {I_VBLENDMPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12756, 225},
+ /* 3999 */ {I_VBLENDMPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+12764, 226},
+ /* 4000 */ {I_VBROADCASTF32X2, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12772, 227},
+ /* 4001 */ {I_VBROADCASTF32X2, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12780, 228},
+ /* 4002 */ {I_VBROADCASTF32X4, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12788, 225},
+ /* 4003 */ {I_VBROADCASTF32X4, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12796, 226},
+ /* 4004 */ {I_VBROADCASTF32X8, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12804, 228},
+ /* 4005 */ {I_VBROADCASTF64X2, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12812, 227},
+ /* 4006 */ {I_VBROADCASTF64X2, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12820, 228},
+ /* 4007 */ {I_VBROADCASTF64X4, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12828, 226},
+ /* 4008 */ {I_VBROADCASTI32X2, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12836, 227},
+ /* 4009 */ {I_VBROADCASTI32X2, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12844, 227},
+ /* 4010 */ {I_VBROADCASTI32X2, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12852, 228},
+ /* 4011 */ {I_VBROADCASTI32X4, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12860, 225},
+ /* 4012 */ {I_VBROADCASTI32X4, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12868, 226},
+ /* 4013 */ {I_VBROADCASTI32X8, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12876, 228},
+ /* 4014 */ {I_VBROADCASTI64X2, 2, {YMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12884, 227},
+ /* 4015 */ {I_VBROADCASTI64X2, 2, {ZMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12892, 228},
+ /* 4016 */ {I_VBROADCASTI64X4, 2, {ZMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12900, 226},
+ /* 4017 */ {I_VBROADCASTSD, 2, {YMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12908, 225},
+ /* 4018 */ {I_VBROADCASTSD, 2, {ZMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12916, 226},
+ /* 4019 */ {I_VBROADCASTSD, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12924, 225},
+ /* 4020 */ {I_VBROADCASTSD, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12932, 226},
+ /* 4021 */ {I_VBROADCASTSS, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12940, 225},
+ /* 4022 */ {I_VBROADCASTSS, 2, {YMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12948, 225},
+ /* 4023 */ {I_VBROADCASTSS, 2, {ZMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12956, 226},
+ /* 4024 */ {I_VBROADCASTSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12964, 225},
+ /* 4025 */ {I_VBROADCASTSS, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12972, 225},
+ /* 4026 */ {I_VBROADCASTSS, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+12980, 226},
+ /* 4027 */ {I_VCMPPD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+4110, 225},
+ /* 4028 */ {I_VCMPPD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+4119, 225},
+ /* 4029 */ {I_VCMPPD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64|SAE,0,0}, nasm_bytecodes+4128, 226},
+ /* 4030 */ {I_VCMPPS, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+4137, 225},
+ /* 4031 */ {I_VCMPPS, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+4146, 225},
+ /* 4032 */ {I_VCMPPS, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32|SAE,0,0}, nasm_bytecodes+4155, 226},
+ /* 4033 */ {I_VCMPSD, 4, {KREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK,0,SAE,0,0}, nasm_bytecodes+4164, 226},
+ /* 4034 */ {I_VCMPSS, 4, {KREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK,0,SAE,0,0}, nasm_bytecodes+4173, 226},
+ /* 4035 */ {I_VCOMISD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+12988, 226},
+ /* 4036 */ {I_VCOMISS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+12996, 226},
+ /* 4037 */ {I_VCOMPRESSPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13004, 225},
+ /* 4038 */ {I_VCOMPRESSPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13012, 225},
+ /* 4039 */ {I_VCOMPRESSPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13020, 226},
+ /* 4040 */ {I_VCOMPRESSPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13028, 225},
+ /* 4041 */ {I_VCOMPRESSPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13036, 225},
+ /* 4042 */ {I_VCOMPRESSPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13044, 226},
+ /* 4043 */ {I_VCOMPRESSPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13052, 225},
+ /* 4044 */ {I_VCOMPRESSPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13060, 225},
+ /* 4045 */ {I_VCOMPRESSPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+13068, 226},
+ /* 4046 */ {I_VCOMPRESSPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13076, 225},
+ /* 4047 */ {I_VCOMPRESSPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13084, 225},
+ /* 4048 */ {I_VCOMPRESSPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13092, 226},
+ /* 4049 */ {I_VCVTDQ2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13100, 225},
+ /* 4050 */ {I_VCVTDQ2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13108, 225},
+ /* 4051 */ {I_VCVTDQ2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13116, 226},
+ /* 4052 */ {I_VCVTDQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13124, 225},
+ /* 4053 */ {I_VCVTDQ2PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13132, 225},
+ /* 4054 */ {I_VCVTDQ2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13140, 226},
+ /* 4055 */ {I_VCVTPD2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13148, 225},
+ /* 4056 */ {I_VCVTPD2DQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13156, 225},
+ /* 4057 */ {I_VCVTPD2DQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13164, 226},
+ /* 4058 */ {I_VCVTPD2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13172, 225},
+ /* 4059 */ {I_VCVTPD2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13180, 225},
+ /* 4060 */ {I_VCVTPD2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13188, 226},
+ /* 4061 */ {I_VCVTPD2QQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13196, 227},
+ /* 4062 */ {I_VCVTPD2QQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13204, 227},
+ /* 4063 */ {I_VCVTPD2QQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13212, 228},
+ /* 4064 */ {I_VCVTPD2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13220, 225},
+ /* 4065 */ {I_VCVTPD2UDQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13228, 225},
+ /* 4066 */ {I_VCVTPD2UDQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13236, 226},
+ /* 4067 */ {I_VCVTPD2UQQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13244, 227},
+ /* 4068 */ {I_VCVTPD2UQQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13252, 227},
+ /* 4069 */ {I_VCVTPD2UQQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13260, 228},
+ /* 4070 */ {I_VCVTPH2PS, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13268, 225},
+ /* 4071 */ {I_VCVTPH2PS, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+13276, 225},
+ /* 4072 */ {I_VCVTPH2PS, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+13284, 226},
+ /* 4073 */ {I_VCVTPS2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13292, 225},
+ /* 4074 */ {I_VCVTPS2DQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13300, 225},
+ /* 4075 */ {I_VCVTPS2DQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13308, 226},
+ /* 4076 */ {I_VCVTPS2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13316, 225},
+ /* 4077 */ {I_VCVTPS2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13324, 225},
+ /* 4078 */ {I_VCVTPS2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13332, 226},
+ /* 4079 */ {I_VCVTPS2PH, 3, {XMMREG,XMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4182, 225},
+ /* 4080 */ {I_VCVTPS2PH, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4191, 225},
+ /* 4081 */ {I_VCVTPS2PH, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4200, 226},
+ /* 4082 */ {I_VCVTPS2PH, 3, {MEMORY|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4182, 225},
+ /* 4083 */ {I_VCVTPS2PH, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4191, 225},
+ /* 4084 */ {I_VCVTPS2PH, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,SAE,0,0,0}, nasm_bytecodes+4200, 226},
+ /* 4085 */ {I_VCVTPS2QQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13340, 227},
+ /* 4086 */ {I_VCVTPS2QQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13348, 227},
+ /* 4087 */ {I_VCVTPS2QQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13356, 228},
+ /* 4088 */ {I_VCVTPS2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13364, 225},
+ /* 4089 */ {I_VCVTPS2UDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13372, 225},
+ /* 4090 */ {I_VCVTPS2UDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13380, 226},
+ /* 4091 */ {I_VCVTPS2UQQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13388, 227},
+ /* 4092 */ {I_VCVTPS2UQQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13396, 227},
+ /* 4093 */ {I_VCVTPS2UQQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13404, 228},
+ /* 4094 */ {I_VCVTQQ2PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13412, 227},
+ /* 4095 */ {I_VCVTQQ2PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13420, 227},
+ /* 4096 */ {I_VCVTQQ2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13428, 228},
+ /* 4097 */ {I_VCVTQQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13436, 227},
+ /* 4098 */ {I_VCVTQQ2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13444, 227},
+ /* 4099 */ {I_VCVTQQ2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13452, 228},
+ /* 4100 */ {I_VCVTSD2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13460, 226},
+ /* 4101 */ {I_VCVTSD2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13468, 226},
+ /* 4102 */ {I_VCVTSD2SS, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+13476, 226},
+ /* 4103 */ {I_VCVTSD2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13484, 226},
+ /* 4104 */ {I_VCVTSD2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13492, 226},
+ /* 4105 */ {I_VCVTSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13500, 226},
+ /* 4106 */ {I_VCVTSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13508, 226},
+ /* 4107 */ {I_VCVTSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13516, 226},
+ /* 4108 */ {I_VCVTSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13524, 226},
+ /* 4109 */ {I_VCVTSS2SD, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+13532, 226},
+ /* 4110 */ {I_VCVTSS2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13540, 226},
+ /* 4111 */ {I_VCVTSS2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13548, 226},
+ /* 4112 */ {I_VCVTSS2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13556, 226},
+ /* 4113 */ {I_VCVTSS2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13564, 226},
+ /* 4114 */ {I_VCVTTPD2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13572, 225},
+ /* 4115 */ {I_VCVTTPD2DQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13580, 225},
+ /* 4116 */ {I_VCVTTPD2DQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13588, 226},
+ /* 4117 */ {I_VCVTTPD2QQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13596, 227},
+ /* 4118 */ {I_VCVTTPD2QQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13604, 227},
+ /* 4119 */ {I_VCVTTPD2QQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13612, 228},
+ /* 4120 */ {I_VCVTTPD2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13620, 225},
+ /* 4121 */ {I_VCVTTPD2UDQ, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13628, 225},
+ /* 4122 */ {I_VCVTTPD2UDQ, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13636, 226},
+ /* 4123 */ {I_VCVTTPD2UQQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13644, 227},
+ /* 4124 */ {I_VCVTTPD2UQQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13652, 227},
+ /* 4125 */ {I_VCVTTPD2UQQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+13660, 228},
+ /* 4126 */ {I_VCVTTPS2DQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13668, 225},
+ /* 4127 */ {I_VCVTTPS2DQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13676, 225},
+ /* 4128 */ {I_VCVTTPS2DQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13684, 226},
+ /* 4129 */ {I_VCVTTPS2QQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13692, 227},
+ /* 4130 */ {I_VCVTTPS2QQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13700, 227},
+ /* 4131 */ {I_VCVTTPS2QQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13708, 228},
+ /* 4132 */ {I_VCVTTPS2UDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13716, 225},
+ /* 4133 */ {I_VCVTTPS2UDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13724, 225},
+ /* 4134 */ {I_VCVTTPS2UDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13732, 226},
+ /* 4135 */ {I_VCVTTPS2UQQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13740, 227},
+ /* 4136 */ {I_VCVTTPS2UQQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13748, 227},
+ /* 4137 */ {I_VCVTTPS2UQQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+13756, 228},
+ /* 4138 */ {I_VCVTTSD2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13764, 226},
+ /* 4139 */ {I_VCVTTSD2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13772, 226},
+ /* 4140 */ {I_VCVTTSD2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13780, 226},
+ /* 4141 */ {I_VCVTTSD2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13788, 226},
+ /* 4142 */ {I_VCVTTSS2SI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13796, 226},
+ /* 4143 */ {I_VCVTTSS2SI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13804, 226},
+ /* 4144 */ {I_VCVTTSS2USI, 2, {REG_GPR|BITS32,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13812, 226},
+ /* 4145 */ {I_VCVTTSS2USI, 2, {REG_GPR|BITS64,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+13820, 226},
+ /* 4146 */ {I_VCVTUDQ2PD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13828, 225},
+ /* 4147 */ {I_VCVTUDQ2PD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13836, 225},
+ /* 4148 */ {I_VCVTUDQ2PD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13844, 226},
+ /* 4149 */ {I_VCVTUDQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13852, 225},
+ /* 4150 */ {I_VCVTUDQ2PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+13860, 225},
+ /* 4151 */ {I_VCVTUDQ2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+13868, 226},
+ /* 4152 */ {I_VCVTUQQ2PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13876, 227},
+ /* 4153 */ {I_VCVTUQQ2PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13884, 227},
+ /* 4154 */ {I_VCVTUQQ2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13892, 228},
+ /* 4155 */ {I_VCVTUQQ2PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13900, 227},
+ /* 4156 */ {I_VCVTUQQ2PS, 2, {XMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13908, 227},
+ /* 4157 */ {I_VCVTUQQ2PS, 2, {YMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13916, 228},
+ /* 4158 */ {I_VCVTUSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13924, 226},
+ /* 4159 */ {I_VCVTUSI2SD, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13932, 226},
+ /* 4160 */ {I_VCVTUSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS32,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13940, 226},
+ /* 4161 */ {I_VCVTUSI2SS, 3, {XMMREG,XMMREG,RM_GPR|BITS64,0,0}, {0,ER,0,0,0}, nasm_bytecodes+13948, 226},
+ /* 4162 */ {I_VDBPSADBW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4209, 229},
+ /* 4163 */ {I_VDBPSADBW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4218, 229},
+ /* 4164 */ {I_VDBPSADBW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4227, 229},
+ /* 4165 */ {I_VDBPSADBW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4236, 229},
+ /* 4166 */ {I_VDBPSADBW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4245, 230},
+ /* 4167 */ {I_VDBPSADBW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4254, 230},
+ /* 4168 */ {I_VDIVPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+13956, 225},
+ /* 4169 */ {I_VDIVPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13964, 225},
+ /* 4170 */ {I_VDIVPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+13972, 225},
+ /* 4171 */ {I_VDIVPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+13980, 225},
+ /* 4172 */ {I_VDIVPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+13988, 226},
+ /* 4173 */ {I_VDIVPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+13996, 226},
+ /* 4174 */ {I_VDIVPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14004, 225},
+ /* 4175 */ {I_VDIVPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+14012, 225},
+ /* 4176 */ {I_VDIVPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14020, 225},
+ /* 4177 */ {I_VDIVPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+14028, 225},
+ /* 4178 */ {I_VDIVPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14036, 226},
+ /* 4179 */ {I_VDIVPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+14044, 226},
+ /* 4180 */ {I_VDIVSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14052, 226},
+ /* 4181 */ {I_VDIVSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+14060, 226},
+ /* 4182 */ {I_VDIVSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14068, 226},
+ /* 4183 */ {I_VDIVSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+14076, 226},
+ /* 4184 */ {I_VEXP2PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+14084, 231},
+ /* 4185 */ {I_VEXP2PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+14092, 231},
+ /* 4186 */ {I_VEXPANDPD, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14100, 225},
+ /* 4187 */ {I_VEXPANDPD, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14108, 225},
+ /* 4188 */ {I_VEXPANDPD, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14116, 226},
+ /* 4189 */ {I_VEXPANDPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14100, 225},
+ /* 4190 */ {I_VEXPANDPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14108, 225},
+ /* 4191 */ {I_VEXPANDPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14116, 226},
+ /* 4192 */ {I_VEXPANDPS, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14124, 225},
+ /* 4193 */ {I_VEXPANDPS, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14132, 225},
+ /* 4194 */ {I_VEXPANDPS, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14140, 226},
+ /* 4195 */ {I_VEXPANDPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14124, 225},
+ /* 4196 */ {I_VEXPANDPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14132, 225},
+ /* 4197 */ {I_VEXPANDPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+14140, 226},
+ /* 4198 */ {I_VEXTRACTF32X4, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4263, 225},
+ /* 4199 */ {I_VEXTRACTF32X4, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4272, 226},
+ /* 4200 */ {I_VEXTRACTF32X4, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4281, 225},
+ /* 4201 */ {I_VEXTRACTF32X4, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4290, 226},
+ /* 4202 */ {I_VEXTRACTF32X8, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4299, 228},
+ /* 4203 */ {I_VEXTRACTF32X8, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4308, 228},
+ /* 4204 */ {I_VEXTRACTF64X2, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4317, 227},
+ /* 4205 */ {I_VEXTRACTF64X2, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4326, 228},
+ /* 4206 */ {I_VEXTRACTF64X2, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4335, 227},
+ /* 4207 */ {I_VEXTRACTF64X2, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4344, 228},
+ /* 4208 */ {I_VEXTRACTF64X4, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4353, 226},
+ /* 4209 */ {I_VEXTRACTF64X4, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4362, 226},
+ /* 4210 */ {I_VEXTRACTI32X4, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4371, 225},
+ /* 4211 */ {I_VEXTRACTI32X4, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4380, 226},
+ /* 4212 */ {I_VEXTRACTI32X4, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4389, 225},
+ /* 4213 */ {I_VEXTRACTI32X4, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4398, 226},
+ /* 4214 */ {I_VEXTRACTI32X8, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4407, 228},
+ /* 4215 */ {I_VEXTRACTI32X8, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4416, 228},
+ /* 4216 */ {I_VEXTRACTI64X2, 3, {XMMREG,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4425, 227},
+ /* 4217 */ {I_VEXTRACTI64X2, 3, {XMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4434, 228},
+ /* 4218 */ {I_VEXTRACTI64X2, 3, {MEMORY|BITS128,YMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4443, 227},
+ /* 4219 */ {I_VEXTRACTI64X2, 3, {MEMORY|BITS128,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4452, 228},
+ /* 4220 */ {I_VEXTRACTI64X4, 3, {YMMREG,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4461, 226},
+ /* 4221 */ {I_VEXTRACTI64X4, 3, {MEMORY|BITS256,ZMMREG,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4470, 226},
+ /* 4222 */ {I_VEXTRACTPS, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ /* 4223 */ {I_VEXTRACTPS, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ /* 4224 */ {I_VEXTRACTPS, 3, {MEMORY|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+4479, 226},
+ /* 4225 */ {I_VFIXUPIMMPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4488, 225},
+ /* 4226 */ {I_VFIXUPIMMPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4497, 225},
+ /* 4227 */ {I_VFIXUPIMMPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+4506, 225},
+ /* 4228 */ {I_VFIXUPIMMPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4515, 225},
+ /* 4229 */ {I_VFIXUPIMMPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+4524, 226},
+ /* 4230 */ {I_VFIXUPIMMPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+4533, 226},
+ /* 4231 */ {I_VFIXUPIMMPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4542, 225},
+ /* 4232 */ {I_VFIXUPIMMPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4551, 225},
+ /* 4233 */ {I_VFIXUPIMMPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+4560, 225},
+ /* 4234 */ {I_VFIXUPIMMPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4569, 225},
+ /* 4235 */ {I_VFIXUPIMMPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+4578, 226},
+ /* 4236 */ {I_VFIXUPIMMPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+4587, 226},
+ /* 4237 */ {I_VFIXUPIMMSD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4596, 226},
+ /* 4238 */ {I_VFIXUPIMMSD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4605, 226},
+ /* 4239 */ {I_VFIXUPIMMSS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4614, 226},
+ /* 4240 */ {I_VFIXUPIMMSS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+4623, 226},
+ /* 4241 */ {I_VFMADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14148, 225},
+ /* 4242 */ {I_VFMADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14156, 225},
+ /* 4243 */ {I_VFMADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14164, 226},
+ /* 4244 */ {I_VFMADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14172, 225},
+ /* 4245 */ {I_VFMADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14180, 225},
+ /* 4246 */ {I_VFMADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14188, 226},
+ /* 4247 */ {I_VFMADD132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14196, 226},
+ /* 4248 */ {I_VFMADD132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14204, 226},
+ /* 4249 */ {I_VFMADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14212, 225},
+ /* 4250 */ {I_VFMADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14220, 225},
+ /* 4251 */ {I_VFMADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14228, 226},
+ /* 4252 */ {I_VFMADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14236, 225},
+ /* 4253 */ {I_VFMADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14244, 225},
+ /* 4254 */ {I_VFMADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14252, 226},
+ /* 4255 */ {I_VFMADD213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14260, 226},
+ /* 4256 */ {I_VFMADD213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14268, 226},
+ /* 4257 */ {I_VFMADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14276, 225},
+ /* 4258 */ {I_VFMADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14284, 225},
+ /* 4259 */ {I_VFMADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14292, 226},
+ /* 4260 */ {I_VFMADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14300, 225},
+ /* 4261 */ {I_VFMADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14308, 225},
+ /* 4262 */ {I_VFMADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14316, 226},
+ /* 4263 */ {I_VFMADD231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14324, 226},
+ /* 4264 */ {I_VFMADD231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14332, 226},
+ /* 4265 */ {I_VFMADDSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14340, 225},
+ /* 4266 */ {I_VFMADDSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14348, 225},
+ /* 4267 */ {I_VFMADDSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14356, 226},
+ /* 4268 */ {I_VFMADDSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14364, 225},
+ /* 4269 */ {I_VFMADDSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14372, 225},
+ /* 4270 */ {I_VFMADDSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14380, 226},
+ /* 4271 */ {I_VFMADDSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14388, 225},
+ /* 4272 */ {I_VFMADDSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14396, 225},
+ /* 4273 */ {I_VFMADDSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14404, 226},
+ /* 4274 */ {I_VFMADDSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14412, 225},
+ /* 4275 */ {I_VFMADDSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14420, 225},
+ /* 4276 */ {I_VFMADDSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14428, 226},
+ /* 4277 */ {I_VFMADDSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14436, 225},
+ /* 4278 */ {I_VFMADDSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14444, 225},
+ /* 4279 */ {I_VFMADDSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14452, 226},
+ /* 4280 */ {I_VFMADDSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14460, 225},
+ /* 4281 */ {I_VFMADDSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14468, 225},
+ /* 4282 */ {I_VFMADDSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14476, 226},
+ /* 4283 */ {I_VFMSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14484, 225},
+ /* 4284 */ {I_VFMSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14492, 225},
+ /* 4285 */ {I_VFMSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14500, 226},
+ /* 4286 */ {I_VFMSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14508, 225},
+ /* 4287 */ {I_VFMSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14516, 225},
+ /* 4288 */ {I_VFMSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14524, 226},
+ /* 4289 */ {I_VFMSUB132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14532, 226},
+ /* 4290 */ {I_VFMSUB132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14540, 226},
+ /* 4291 */ {I_VFMSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14548, 225},
+ /* 4292 */ {I_VFMSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14556, 225},
+ /* 4293 */ {I_VFMSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14564, 226},
+ /* 4294 */ {I_VFMSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14572, 225},
+ /* 4295 */ {I_VFMSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14580, 225},
+ /* 4296 */ {I_VFMSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14588, 226},
+ /* 4297 */ {I_VFMSUB213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14596, 226},
+ /* 4298 */ {I_VFMSUB213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14604, 226},
+ /* 4299 */ {I_VFMSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14612, 225},
+ /* 4300 */ {I_VFMSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14620, 225},
+ /* 4301 */ {I_VFMSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14628, 226},
+ /* 4302 */ {I_VFMSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14636, 225},
+ /* 4303 */ {I_VFMSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14644, 225},
+ /* 4304 */ {I_VFMSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14652, 226},
+ /* 4305 */ {I_VFMSUB231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14660, 226},
+ /* 4306 */ {I_VFMSUB231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14668, 226},
+ /* 4307 */ {I_VFMSUBADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14676, 225},
+ /* 4308 */ {I_VFMSUBADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14684, 225},
+ /* 4309 */ {I_VFMSUBADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14692, 226},
+ /* 4310 */ {I_VFMSUBADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14700, 225},
+ /* 4311 */ {I_VFMSUBADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14708, 225},
+ /* 4312 */ {I_VFMSUBADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14716, 226},
+ /* 4313 */ {I_VFMSUBADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14724, 225},
+ /* 4314 */ {I_VFMSUBADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14732, 225},
+ /* 4315 */ {I_VFMSUBADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14740, 226},
+ /* 4316 */ {I_VFMSUBADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14748, 225},
+ /* 4317 */ {I_VFMSUBADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14756, 225},
+ /* 4318 */ {I_VFMSUBADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14764, 226},
+ /* 4319 */ {I_VFMSUBADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14772, 225},
+ /* 4320 */ {I_VFMSUBADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14780, 225},
+ /* 4321 */ {I_VFMSUBADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14788, 226},
+ /* 4322 */ {I_VFMSUBADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14796, 225},
+ /* 4323 */ {I_VFMSUBADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14804, 225},
+ /* 4324 */ {I_VFMSUBADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14812, 226},
+ /* 4325 */ {I_VFNMADD132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14820, 225},
+ /* 4326 */ {I_VFNMADD132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14828, 225},
+ /* 4327 */ {I_VFNMADD132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14836, 226},
+ /* 4328 */ {I_VFNMADD132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14844, 225},
+ /* 4329 */ {I_VFNMADD132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14852, 225},
+ /* 4330 */ {I_VFNMADD132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14860, 226},
+ /* 4331 */ {I_VFNMADD132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14868, 226},
+ /* 4332 */ {I_VFNMADD132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14876, 226},
+ /* 4333 */ {I_VFNMADD213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14884, 225},
+ /* 4334 */ {I_VFNMADD213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14892, 225},
+ /* 4335 */ {I_VFNMADD213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14900, 226},
+ /* 4336 */ {I_VFNMADD213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14908, 225},
+ /* 4337 */ {I_VFNMADD213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14916, 225},
+ /* 4338 */ {I_VFNMADD213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14924, 226},
+ /* 4339 */ {I_VFNMADD213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14932, 226},
+ /* 4340 */ {I_VFNMADD213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14940, 226},
+ /* 4341 */ {I_VFNMADD231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14948, 225},
+ /* 4342 */ {I_VFNMADD231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+14956, 225},
+ /* 4343 */ {I_VFNMADD231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+14964, 226},
+ /* 4344 */ {I_VFNMADD231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14972, 225},
+ /* 4345 */ {I_VFNMADD231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+14980, 225},
+ /* 4346 */ {I_VFNMADD231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+14988, 226},
+ /* 4347 */ {I_VFNMADD231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+14996, 226},
+ /* 4348 */ {I_VFNMADD231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15004, 226},
+ /* 4349 */ {I_VFNMSUB132PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15012, 225},
+ /* 4350 */ {I_VFNMSUB132PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15020, 225},
+ /* 4351 */ {I_VFNMSUB132PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15028, 226},
+ /* 4352 */ {I_VFNMSUB132PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15036, 225},
+ /* 4353 */ {I_VFNMSUB132PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15044, 225},
+ /* 4354 */ {I_VFNMSUB132PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15052, 226},
+ /* 4355 */ {I_VFNMSUB132SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15060, 226},
+ /* 4356 */ {I_VFNMSUB132SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15068, 226},
+ /* 4357 */ {I_VFNMSUB213PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15076, 225},
+ /* 4358 */ {I_VFNMSUB213PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15084, 225},
+ /* 4359 */ {I_VFNMSUB213PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15092, 226},
+ /* 4360 */ {I_VFNMSUB213PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15100, 225},
+ /* 4361 */ {I_VFNMSUB213PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15108, 225},
+ /* 4362 */ {I_VFNMSUB213PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15116, 226},
+ /* 4363 */ {I_VFNMSUB213SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15124, 226},
+ /* 4364 */ {I_VFNMSUB213SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15132, 226},
+ /* 4365 */ {I_VFNMSUB231PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15140, 225},
+ /* 4366 */ {I_VFNMSUB231PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15148, 225},
+ /* 4367 */ {I_VFNMSUB231PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+15156, 226},
+ /* 4368 */ {I_VFNMSUB231PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15164, 225},
+ /* 4369 */ {I_VFNMSUB231PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15172, 225},
+ /* 4370 */ {I_VFNMSUB231PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+15180, 226},
+ /* 4371 */ {I_VFNMSUB231SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15188, 226},
+ /* 4372 */ {I_VFNMSUB231SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+15196, 226},
+ /* 4373 */ {I_VFPCLASSPD, 3, {KREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4632, 227},
+ /* 4374 */ {I_VFPCLASSPD, 3, {KREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4641, 227},
+ /* 4375 */ {I_VFPCLASSPD, 3, {KREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK,B64,0,0,0}, nasm_bytecodes+4650, 228},
+ /* 4376 */ {I_VFPCLASSPS, 3, {KREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4659, 227},
+ /* 4377 */ {I_VFPCLASSPS, 3, {KREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4668, 227},
+ /* 4378 */ {I_VFPCLASSPS, 3, {KREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK,B32,0,0,0}, nasm_bytecodes+4677, 228},
+ /* 4379 */ {I_VFPCLASSSD, 3, {KREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4686, 228},
+ /* 4380 */ {I_VFPCLASSSS, 3, {KREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4695, 228},
+ /* 4381 */ {I_VGATHERDPD, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4704, 225},
+ /* 4382 */ {I_VGATHERDPD, 2, {YMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4713, 225},
+ /* 4383 */ {I_VGATHERDPD, 2, {ZMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4722, 226},
+ /* 4384 */ {I_VGATHERDPS, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4731, 225},
+ /* 4385 */ {I_VGATHERDPS, 2, {YMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4740, 225},
+ /* 4386 */ {I_VGATHERDPS, 2, {ZMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4749, 226},
+ /* 4387 */ {I_VGATHERPF0DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4758, 232},
+ /* 4388 */ {I_VGATHERPF0DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4767, 232},
+ /* 4389 */ {I_VGATHERPF0QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4776, 232},
+ /* 4390 */ {I_VGATHERPF0QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4785, 232},
+ /* 4391 */ {I_VGATHERPF1DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4794, 232},
+ /* 4392 */ {I_VGATHERPF1DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4803, 232},
+ /* 4393 */ {I_VGATHERPF1QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4812, 232},
+ /* 4394 */ {I_VGATHERPF1QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4821, 232},
+ /* 4395 */ {I_VGATHERQPD, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4830, 225},
+ /* 4396 */ {I_VGATHERQPD, 2, {YMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4839, 225},
+ /* 4397 */ {I_VGATHERQPD, 2, {ZMMREG,ZMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4848, 226},
+ /* 4398 */ {I_VGATHERQPS, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4857, 225},
+ /* 4399 */ {I_VGATHERQPS, 2, {XMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4866, 225},
+ /* 4400 */ {I_VGATHERQPS, 2, {YMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+4875, 226},
+ /* 4401 */ {I_VGETEXPPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15204, 225},
+ /* 4402 */ {I_VGETEXPPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15212, 225},
+ /* 4403 */ {I_VGETEXPPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15220, 226},
+ /* 4404 */ {I_VGETEXPPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15228, 225},
+ /* 4405 */ {I_VGETEXPPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15236, 225},
+ /* 4406 */ {I_VGETEXPPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15244, 226},
+ /* 4407 */ {I_VGETEXPSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15252, 226},
+ /* 4408 */ {I_VGETEXPSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15260, 226},
+ /* 4409 */ {I_VGETMANTPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4884, 225},
+ /* 4410 */ {I_VGETMANTPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+4893, 225},
+ /* 4411 */ {I_VGETMANTPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+4902, 226},
+ /* 4412 */ {I_VGETMANTPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4911, 225},
+ /* 4413 */ {I_VGETMANTPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+4920, 225},
+ /* 4414 */ {I_VGETMANTPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+4929, 226},
+ /* 4415 */ {I_VGETMANTSD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4938, 226},
+ /* 4416 */ {I_VGETMANTSS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+4947, 226},
+ /* 4417 */ {I_VINSERTF32X4, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4956, 225},
+ /* 4418 */ {I_VINSERTF32X4, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4965, 225},
+ /* 4419 */ {I_VINSERTF32X4, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4974, 226},
+ /* 4420 */ {I_VINSERTF32X4, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4983, 226},
+ /* 4421 */ {I_VINSERTF32X8, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+4992, 228},
+ /* 4422 */ {I_VINSERTF32X8, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5001, 228},
+ /* 4423 */ {I_VINSERTF64X2, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5010, 227},
+ /* 4424 */ {I_VINSERTF64X2, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5019, 227},
+ /* 4425 */ {I_VINSERTF64X2, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5028, 228},
+ /* 4426 */ {I_VINSERTF64X2, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5037, 228},
+ /* 4427 */ {I_VINSERTF64X4, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5046, 226},
+ /* 4428 */ {I_VINSERTF64X4, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5055, 226},
+ /* 4429 */ {I_VINSERTI32X4, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5064, 225},
+ /* 4430 */ {I_VINSERTI32X4, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5073, 225},
+ /* 4431 */ {I_VINSERTI32X4, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5082, 226},
+ /* 4432 */ {I_VINSERTI32X4, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5091, 226},
+ /* 4433 */ {I_VINSERTI32X8, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5100, 228},
+ /* 4434 */ {I_VINSERTI32X8, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5109, 228},
+ /* 4435 */ {I_VINSERTI64X2, 4, {YMMREG,YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5118, 227},
+ /* 4436 */ {I_VINSERTI64X2, 3, {YMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5127, 227},
+ /* 4437 */ {I_VINSERTI64X2, 4, {ZMMREG,ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5136, 228},
+ /* 4438 */ {I_VINSERTI64X2, 3, {ZMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5145, 228},
+ /* 4439 */ {I_VINSERTI64X4, 4, {ZMMREG,ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5154, 226},
+ /* 4440 */ {I_VINSERTI64X4, 3, {ZMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5163, 226},
+ /* 4441 */ {I_VINSERTPS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5172, 226},
+ /* 4442 */ {I_VINSERTPS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5181, 226},
+ /* 4443 */ {I_VMAXPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15268, 225},
+ /* 4444 */ {I_VMAXPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15276, 225},
+ /* 4445 */ {I_VMAXPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15284, 225},
+ /* 4446 */ {I_VMAXPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15292, 225},
+ /* 4447 */ {I_VMAXPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+15300, 226},
+ /* 4448 */ {I_VMAXPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15308, 226},
+ /* 4449 */ {I_VMAXPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15316, 225},
+ /* 4450 */ {I_VMAXPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15324, 225},
+ /* 4451 */ {I_VMAXPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15332, 225},
+ /* 4452 */ {I_VMAXPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15340, 225},
+ /* 4453 */ {I_VMAXPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+15348, 226},
+ /* 4454 */ {I_VMAXPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15356, 226},
+ /* 4455 */ {I_VMAXSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15364, 226},
+ /* 4456 */ {I_VMAXSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15372, 226},
+ /* 4457 */ {I_VMAXSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15380, 226},
+ /* 4458 */ {I_VMAXSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15388, 226},
+ /* 4459 */ {I_VMINPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15396, 225},
+ /* 4460 */ {I_VMINPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15404, 225},
+ /* 4461 */ {I_VMINPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+15412, 225},
+ /* 4462 */ {I_VMINPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+15420, 225},
+ /* 4463 */ {I_VMINPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+15428, 226},
+ /* 4464 */ {I_VMINPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+15436, 226},
+ /* 4465 */ {I_VMINPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15444, 225},
+ /* 4466 */ {I_VMINPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15452, 225},
+ /* 4467 */ {I_VMINPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+15460, 225},
+ /* 4468 */ {I_VMINPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+15468, 225},
+ /* 4469 */ {I_VMINPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+15476, 226},
+ /* 4470 */ {I_VMINPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+15484, 226},
+ /* 4471 */ {I_VMINSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15492, 226},
+ /* 4472 */ {I_VMINSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15500, 226},
+ /* 4473 */ {I_VMINSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+15508, 226},
+ /* 4474 */ {I_VMINSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+15516, 226},
+ /* 4475 */ {I_VMOVAPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15524, 225},
+ /* 4476 */ {I_VMOVAPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15532, 225},
+ /* 4477 */ {I_VMOVAPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15540, 226},
+ /* 4478 */ {I_VMOVAPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15548, 225},
+ /* 4479 */ {I_VMOVAPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15556, 225},
+ /* 4480 */ {I_VMOVAPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15564, 226},
+ /* 4481 */ {I_VMOVAPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15572, 225},
+ /* 4482 */ {I_VMOVAPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15580, 225},
+ /* 4483 */ {I_VMOVAPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15588, 226},
+ /* 4484 */ {I_VMOVAPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15596, 225},
+ /* 4485 */ {I_VMOVAPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15604, 225},
+ /* 4486 */ {I_VMOVAPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15612, 226},
+ /* 4487 */ {I_VMOVAPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15620, 225},
+ /* 4488 */ {I_VMOVAPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15628, 225},
+ /* 4489 */ {I_VMOVAPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15636, 226},
+ /* 4490 */ {I_VMOVAPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15644, 225},
+ /* 4491 */ {I_VMOVAPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15652, 225},
+ /* 4492 */ {I_VMOVAPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+15660, 226},
+ /* 4493 */ {I_VMOVD, 2, {XMMREG,RM_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+15668, 226},
+ /* 4494 */ {I_VMOVD, 2, {RM_GPR|BITS32,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+15676, 226},
+ /* 4495 */ {I_VMOVDDUP, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15684, 225},
+ /* 4496 */ {I_VMOVDDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15692, 225},
+ /* 4497 */ {I_VMOVDDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15700, 226},
+ /* 4498 */ {I_VMOVDQA32, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15708, 225},
+ /* 4499 */ {I_VMOVDQA32, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15716, 225},
+ /* 4500 */ {I_VMOVDQA32, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15724, 226},
+ /* 4501 */ {I_VMOVDQA32, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15732, 225},
+ /* 4502 */ {I_VMOVDQA32, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15740, 225},
+ /* 4503 */ {I_VMOVDQA32, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15748, 226},
+ /* 4504 */ {I_VMOVDQA64, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15756, 225},
+ /* 4505 */ {I_VMOVDQA64, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15764, 225},
+ /* 4506 */ {I_VMOVDQA64, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15772, 226},
+ /* 4507 */ {I_VMOVDQA64, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15780, 225},
+ /* 4508 */ {I_VMOVDQA64, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15788, 225},
+ /* 4509 */ {I_VMOVDQA64, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15796, 226},
+ /* 4510 */ {I_VMOVDQU16, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15804, 229},
+ /* 4511 */ {I_VMOVDQU16, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15812, 229},
+ /* 4512 */ {I_VMOVDQU16, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15820, 230},
+ /* 4513 */ {I_VMOVDQU16, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15828, 229},
+ /* 4514 */ {I_VMOVDQU16, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15836, 229},
+ /* 4515 */ {I_VMOVDQU16, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15844, 230},
+ /* 4516 */ {I_VMOVDQU32, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15852, 225},
+ /* 4517 */ {I_VMOVDQU32, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15860, 225},
+ /* 4518 */ {I_VMOVDQU32, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15868, 226},
+ /* 4519 */ {I_VMOVDQU32, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15876, 225},
+ /* 4520 */ {I_VMOVDQU32, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15884, 225},
+ /* 4521 */ {I_VMOVDQU32, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15892, 226},
+ /* 4522 */ {I_VMOVDQU64, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15900, 225},
+ /* 4523 */ {I_VMOVDQU64, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15908, 225},
+ /* 4524 */ {I_VMOVDQU64, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15916, 226},
+ /* 4525 */ {I_VMOVDQU64, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15924, 225},
+ /* 4526 */ {I_VMOVDQU64, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15932, 225},
+ /* 4527 */ {I_VMOVDQU64, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15940, 226},
+ /* 4528 */ {I_VMOVDQU8, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15948, 229},
+ /* 4529 */ {I_VMOVDQU8, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15956, 229},
+ /* 4530 */ {I_VMOVDQU8, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15964, 230},
+ /* 4531 */ {I_VMOVDQU8, 2, {RM_XMM|BITS128,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15972, 229},
+ /* 4532 */ {I_VMOVDQU8, 2, {RM_YMM|BITS256,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15980, 229},
+ /* 4533 */ {I_VMOVDQU8, 2, {RM_ZMM|BITS512,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+15988, 230},
+ /* 4534 */ {I_VMOVHLPS, 3, {XMMREG,XMMREG,XMMREG,0,0}, NO_DECORATOR, nasm_bytecodes+15996, 226},
+ /* 4535 */ {I_VMOVHLPS, 2, {XMMREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16004, 226},
+ /* 4536 */ {I_VMOVHPD, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16012, 226},
+ /* 4537 */ {I_VMOVHPD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16020, 226},
+ /* 4538 */ {I_VMOVHPD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16028, 226},
+ /* 4539 */ {I_VMOVHPS, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16036, 226},
+ /* 4540 */ {I_VMOVHPS, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16044, 226},
+ /* 4541 */ {I_VMOVHPS, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16052, 226},
+ /* 4542 */ {I_VMOVLHPS, 3, {XMMREG,XMMREG,XMMREG,0,0}, NO_DECORATOR, nasm_bytecodes+16060, 226},
+ /* 4543 */ {I_VMOVLHPS, 2, {XMMREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16068, 226},
+ /* 4544 */ {I_VMOVLPD, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16076, 226},
+ /* 4545 */ {I_VMOVLPD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16084, 226},
+ /* 4546 */ {I_VMOVLPD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16092, 226},
+ /* 4547 */ {I_VMOVLPS, 3, {XMMREG,XMMREG,MEMORY|BITS64,0,0}, NO_DECORATOR, nasm_bytecodes+16100, 226},
+ /* 4548 */ {I_VMOVLPS, 2, {XMMREG,MEMORY|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16108, 226},
+ /* 4549 */ {I_VMOVLPS, 2, {MEMORY|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16116, 226},
+ /* 4550 */ {I_VMOVNTDQ, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16124, 225},
+ /* 4551 */ {I_VMOVNTDQ, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16132, 225},
+ /* 4552 */ {I_VMOVNTDQ, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16140, 226},
+ /* 4553 */ {I_VMOVNTDQA, 2, {XMMREG,MEMORY|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+16148, 225},
+ /* 4554 */ {I_VMOVNTDQA, 2, {YMMREG,MEMORY|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+16156, 225},
+ /* 4555 */ {I_VMOVNTDQA, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+16164, 226},
+ /* 4556 */ {I_VMOVNTPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16172, 225},
+ /* 4557 */ {I_VMOVNTPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16180, 225},
+ /* 4558 */ {I_VMOVNTPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16188, 226},
+ /* 4559 */ {I_VMOVNTPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16196, 225},
+ /* 4560 */ {I_VMOVNTPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16204, 225},
+ /* 4561 */ {I_VMOVNTPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16212, 226},
+ /* 4562 */ {I_VMOVQ, 2, {XMMREG,RM_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16220, 226},
+ /* 4563 */ {I_VMOVQ, 2, {RM_GPR|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16228, 226},
+ /* 4564 */ {I_VMOVQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+16236, 226},
+ /* 4565 */ {I_VMOVQ, 2, {RM_XMM|BITS64,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+16244, 226},
+ /* 4566 */ {I_VMOVSD, 2, {XMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16252, 226},
+ /* 4567 */ {I_VMOVSD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16260, 226},
+ /* 4568 */ {I_VMOVSD, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16268, 226},
+ /* 4569 */ {I_VMOVSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16276, 226},
+ /* 4570 */ {I_VMOVSD, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16284, 226},
+ /* 4571 */ {I_VMOVSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16292, 226},
+ /* 4572 */ {I_VMOVSHDUP, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16300, 225},
+ /* 4573 */ {I_VMOVSHDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16308, 225},
+ /* 4574 */ {I_VMOVSHDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16316, 226},
+ /* 4575 */ {I_VMOVSLDUP, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16324, 225},
+ /* 4576 */ {I_VMOVSLDUP, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16332, 225},
+ /* 4577 */ {I_VMOVSLDUP, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16340, 226},
+ /* 4578 */ {I_VMOVSS, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16348, 226},
+ /* 4579 */ {I_VMOVSS, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16356, 226},
+ /* 4580 */ {I_VMOVSS, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16364, 226},
+ /* 4581 */ {I_VMOVSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16372, 226},
+ /* 4582 */ {I_VMOVSS, 3, {XMMREG,XMMREG,XMMREG,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16380, 226},
+ /* 4583 */ {I_VMOVSS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16388, 226},
+ /* 4584 */ {I_VMOVUPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16396, 225},
+ /* 4585 */ {I_VMOVUPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16404, 225},
+ /* 4586 */ {I_VMOVUPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16412, 226},
+ /* 4587 */ {I_VMOVUPD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16420, 225},
+ /* 4588 */ {I_VMOVUPD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16428, 225},
+ /* 4589 */ {I_VMOVUPD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16436, 226},
+ /* 4590 */ {I_VMOVUPD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16444, 225},
+ /* 4591 */ {I_VMOVUPD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16452, 225},
+ /* 4592 */ {I_VMOVUPD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16460, 226},
+ /* 4593 */ {I_VMOVUPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16468, 225},
+ /* 4594 */ {I_VMOVUPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16476, 225},
+ /* 4595 */ {I_VMOVUPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16484, 226},
+ /* 4596 */ {I_VMOVUPS, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16492, 225},
+ /* 4597 */ {I_VMOVUPS, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16500, 225},
+ /* 4598 */ {I_VMOVUPS, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16508, 226},
+ /* 4599 */ {I_VMOVUPS, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16516, 225},
+ /* 4600 */ {I_VMOVUPS, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16524, 225},
+ /* 4601 */ {I_VMOVUPS, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+16532, 226},
+ /* 4602 */ {I_VMULPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16540, 225},
+ /* 4603 */ {I_VMULPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16548, 225},
+ /* 4604 */ {I_VMULPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16556, 225},
+ /* 4605 */ {I_VMULPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16564, 225},
+ /* 4606 */ {I_VMULPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+16572, 226},
+ /* 4607 */ {I_VMULPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+16580, 226},
+ /* 4608 */ {I_VMULPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16588, 225},
+ /* 4609 */ {I_VMULPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16596, 225},
+ /* 4610 */ {I_VMULPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16604, 225},
+ /* 4611 */ {I_VMULPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16612, 225},
+ /* 4612 */ {I_VMULPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+16620, 226},
+ /* 4613 */ {I_VMULPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+16628, 226},
+ /* 4614 */ {I_VMULSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+16636, 226},
+ /* 4615 */ {I_VMULSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+16644, 226},
+ /* 4616 */ {I_VMULSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+16652, 226},
+ /* 4617 */ {I_VMULSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+16660, 226},
+ /* 4618 */ {I_VORPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16668, 227},
+ /* 4619 */ {I_VORPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16676, 227},
+ /* 4620 */ {I_VORPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16684, 227},
+ /* 4621 */ {I_VORPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16692, 227},
+ /* 4622 */ {I_VORPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+16700, 228},
+ /* 4623 */ {I_VORPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16708, 228},
+ /* 4624 */ {I_VORPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16716, 227},
+ /* 4625 */ {I_VORPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16724, 227},
+ /* 4626 */ {I_VORPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16732, 227},
+ /* 4627 */ {I_VORPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16740, 227},
+ /* 4628 */ {I_VORPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16748, 228},
+ /* 4629 */ {I_VORPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16756, 228},
+ /* 4630 */ {I_VPABSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16764, 229},
+ /* 4631 */ {I_VPABSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16772, 229},
+ /* 4632 */ {I_VPABSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16780, 230},
+ /* 4633 */ {I_VPABSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16788, 225},
+ /* 4634 */ {I_VPABSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16796, 225},
+ /* 4635 */ {I_VPABSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16804, 226},
+ /* 4636 */ {I_VPABSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16812, 225},
+ /* 4637 */ {I_VPABSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16820, 225},
+ /* 4638 */ {I_VPABSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+16828, 226},
+ /* 4639 */ {I_VPABSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16836, 229},
+ /* 4640 */ {I_VPABSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16844, 229},
+ /* 4641 */ {I_VPABSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16852, 230},
+ /* 4642 */ {I_VPACKSSDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16860, 229},
+ /* 4643 */ {I_VPACKSSDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16868, 229},
+ /* 4644 */ {I_VPACKSSDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16876, 229},
+ /* 4645 */ {I_VPACKSSDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16884, 229},
+ /* 4646 */ {I_VPACKSSDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16892, 230},
+ /* 4647 */ {I_VPACKSSDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16900, 230},
+ /* 4648 */ {I_VPACKSSWB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16908, 229},
+ /* 4649 */ {I_VPACKSSWB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16916, 229},
+ /* 4650 */ {I_VPACKSSWB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16924, 229},
+ /* 4651 */ {I_VPACKSSWB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16932, 229},
+ /* 4652 */ {I_VPACKSSWB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16940, 230},
+ /* 4653 */ {I_VPACKSSWB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+16948, 230},
+ /* 4654 */ {I_VPACKUSDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16956, 229},
+ /* 4655 */ {I_VPACKUSDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16964, 229},
+ /* 4656 */ {I_VPACKUSDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16972, 229},
+ /* 4657 */ {I_VPACKUSDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16980, 229},
+ /* 4658 */ {I_VPACKUSDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+16988, 230},
+ /* 4659 */ {I_VPACKUSDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+16996, 230},
+ /* 4660 */ {I_VPACKUSWB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17004, 229},
+ /* 4661 */ {I_VPACKUSWB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17012, 229},
+ /* 4662 */ {I_VPACKUSWB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17020, 229},
+ /* 4663 */ {I_VPACKUSWB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17028, 229},
+ /* 4664 */ {I_VPACKUSWB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17036, 230},
+ /* 4665 */ {I_VPACKUSWB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17044, 230},
+ /* 4666 */ {I_VPADDB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17052, 229},
+ /* 4667 */ {I_VPADDB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17060, 229},
+ /* 4668 */ {I_VPADDB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17068, 229},
+ /* 4669 */ {I_VPADDB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17076, 229},
+ /* 4670 */ {I_VPADDB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17084, 230},
+ /* 4671 */ {I_VPADDB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17092, 230},
+ /* 4672 */ {I_VPADDD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17100, 225},
+ /* 4673 */ {I_VPADDD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17108, 225},
+ /* 4674 */ {I_VPADDD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17116, 225},
+ /* 4675 */ {I_VPADDD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17124, 225},
+ /* 4676 */ {I_VPADDD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17132, 226},
+ /* 4677 */ {I_VPADDD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17140, 226},
+ /* 4678 */ {I_VPADDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17148, 225},
+ /* 4679 */ {I_VPADDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17156, 225},
+ /* 4680 */ {I_VPADDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17164, 225},
+ /* 4681 */ {I_VPADDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17172, 225},
+ /* 4682 */ {I_VPADDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17180, 226},
+ /* 4683 */ {I_VPADDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17188, 226},
+ /* 4684 */ {I_VPADDSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17196, 229},
+ /* 4685 */ {I_VPADDSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17204, 229},
+ /* 4686 */ {I_VPADDSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17212, 229},
+ /* 4687 */ {I_VPADDSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17220, 229},
+ /* 4688 */ {I_VPADDSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17228, 230},
+ /* 4689 */ {I_VPADDSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17236, 230},
+ /* 4690 */ {I_VPADDSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17244, 229},
+ /* 4691 */ {I_VPADDSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17252, 229},
+ /* 4692 */ {I_VPADDSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17260, 229},
+ /* 4693 */ {I_VPADDSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17268, 229},
+ /* 4694 */ {I_VPADDSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17276, 230},
+ /* 4695 */ {I_VPADDSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17284, 230},
+ /* 4696 */ {I_VPADDUSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17292, 229},
+ /* 4697 */ {I_VPADDUSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17300, 229},
+ /* 4698 */ {I_VPADDUSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17308, 229},
+ /* 4699 */ {I_VPADDUSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17316, 229},
+ /* 4700 */ {I_VPADDUSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17324, 230},
+ /* 4701 */ {I_VPADDUSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17332, 230},
+ /* 4702 */ {I_VPADDUSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17340, 229},
+ /* 4703 */ {I_VPADDUSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17348, 229},
+ /* 4704 */ {I_VPADDUSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17356, 229},
+ /* 4705 */ {I_VPADDUSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17364, 229},
+ /* 4706 */ {I_VPADDUSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17372, 230},
+ /* 4707 */ {I_VPADDUSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17380, 230},
+ /* 4708 */ {I_VPADDW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17388, 229},
+ /* 4709 */ {I_VPADDW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17396, 229},
+ /* 4710 */ {I_VPADDW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17404, 229},
+ /* 4711 */ {I_VPADDW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17412, 229},
+ /* 4712 */ {I_VPADDW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17420, 230},
+ /* 4713 */ {I_VPADDW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17428, 230},
+ /* 4714 */ {I_VPALIGNR, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5190, 229},
+ /* 4715 */ {I_VPALIGNR, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5199, 229},
+ /* 4716 */ {I_VPALIGNR, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5208, 229},
+ /* 4717 */ {I_VPALIGNR, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5217, 229},
+ /* 4718 */ {I_VPALIGNR, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5226, 230},
+ /* 4719 */ {I_VPALIGNR, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5235, 230},
+ /* 4720 */ {I_VPANDD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17436, 225},
+ /* 4721 */ {I_VPANDD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17444, 225},
+ /* 4722 */ {I_VPANDD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17452, 225},
+ /* 4723 */ {I_VPANDD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17460, 225},
+ /* 4724 */ {I_VPANDD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17468, 226},
+ /* 4725 */ {I_VPANDD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17476, 226},
+ /* 4726 */ {I_VPANDND, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17484, 225},
+ /* 4727 */ {I_VPANDND, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17492, 225},
+ /* 4728 */ {I_VPANDND, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17500, 225},
+ /* 4729 */ {I_VPANDND, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17508, 225},
+ /* 4730 */ {I_VPANDND, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17516, 226},
+ /* 4731 */ {I_VPANDND, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+17524, 226},
+ /* 4732 */ {I_VPANDNQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17532, 225},
+ /* 4733 */ {I_VPANDNQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17540, 225},
+ /* 4734 */ {I_VPANDNQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17548, 225},
+ /* 4735 */ {I_VPANDNQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17556, 225},
+ /* 4736 */ {I_VPANDNQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17564, 226},
+ /* 4737 */ {I_VPANDNQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17572, 226},
+ /* 4738 */ {I_VPANDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17580, 225},
+ /* 4739 */ {I_VPANDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17588, 225},
+ /* 4740 */ {I_VPANDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17596, 225},
+ /* 4741 */ {I_VPANDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17604, 225},
+ /* 4742 */ {I_VPANDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17612, 226},
+ /* 4743 */ {I_VPANDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+17620, 226},
+ /* 4744 */ {I_VPAVGB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17628, 229},
+ /* 4745 */ {I_VPAVGB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17636, 229},
+ /* 4746 */ {I_VPAVGB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17644, 229},
+ /* 4747 */ {I_VPAVGB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17652, 229},
+ /* 4748 */ {I_VPAVGB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17660, 230},
+ /* 4749 */ {I_VPAVGB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17668, 230},
+ /* 4750 */ {I_VPAVGW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17676, 229},
+ /* 4751 */ {I_VPAVGW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17684, 229},
+ /* 4752 */ {I_VPAVGW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17692, 229},
+ /* 4753 */ {I_VPAVGW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17700, 229},
+ /* 4754 */ {I_VPAVGW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17708, 230},
+ /* 4755 */ {I_VPAVGW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17716, 230},
+ /* 4756 */ {I_VPBLENDMB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17724, 229},
+ /* 4757 */ {I_VPBLENDMB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17732, 229},
+ /* 4758 */ {I_VPBLENDMB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17740, 230},
+ /* 4759 */ {I_VPBLENDMD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17748, 225},
+ /* 4760 */ {I_VPBLENDMD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17756, 225},
+ /* 4761 */ {I_VPBLENDMD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+17764, 226},
+ /* 4762 */ {I_VPBLENDMQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17772, 225},
+ /* 4763 */ {I_VPBLENDMQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17780, 225},
+ /* 4764 */ {I_VPBLENDMQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+17788, 226},
+ /* 4765 */ {I_VPBLENDMW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17796, 229},
+ /* 4766 */ {I_VPBLENDMW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17804, 229},
+ /* 4767 */ {I_VPBLENDMW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17812, 230},
+ /* 4768 */ {I_VPBROADCASTB, 2, {XMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17820, 229},
+ /* 4769 */ {I_VPBROADCASTB, 2, {YMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17828, 229},
+ /* 4770 */ {I_VPBROADCASTB, 2, {ZMMREG,RM_XMM|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17836, 230},
+ /* 4771 */ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ /* 4772 */ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ /* 4773 */ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ /* 4774 */ {I_VPBROADCASTB, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17844, 229},
+ /* 4775 */ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ /* 4776 */ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ /* 4777 */ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ /* 4778 */ {I_VPBROADCASTB, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17852, 229},
+ /* 4779 */ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ /* 4780 */ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ /* 4781 */ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ /* 4782 */ {I_VPBROADCASTB, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17860, 230},
+ /* 4783 */ {I_VPBROADCASTD, 2, {XMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17868, 225},
+ /* 4784 */ {I_VPBROADCASTD, 2, {YMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17876, 225},
+ /* 4785 */ {I_VPBROADCASTD, 2, {ZMMREG,MEMORY|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17884, 226},
+ /* 4786 */ {I_VPBROADCASTD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17892, 225},
+ /* 4787 */ {I_VPBROADCASTD, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17900, 225},
+ /* 4788 */ {I_VPBROADCASTD, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17908, 226},
+ /* 4789 */ {I_VPBROADCASTD, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17916, 225},
+ /* 4790 */ {I_VPBROADCASTD, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17924, 225},
+ /* 4791 */ {I_VPBROADCASTD, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17932, 226},
+ /* 4792 */ {I_VPBROADCASTMB2Q, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17940, 233},
+ /* 4793 */ {I_VPBROADCASTMB2Q, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17948, 233},
+ /* 4794 */ {I_VPBROADCASTMB2Q, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17956, 234},
+ /* 4795 */ {I_VPBROADCASTMW2D, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17964, 233},
+ /* 4796 */ {I_VPBROADCASTMW2D, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17972, 233},
+ /* 4797 */ {I_VPBROADCASTMW2D, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+17980, 234},
+ /* 4798 */ {I_VPBROADCASTQ, 2, {XMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17988, 225},
+ /* 4799 */ {I_VPBROADCASTQ, 2, {YMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+17996, 225},
+ /* 4800 */ {I_VPBROADCASTQ, 2, {ZMMREG,MEMORY|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18004, 226},
+ /* 4801 */ {I_VPBROADCASTQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18012, 225},
+ /* 4802 */ {I_VPBROADCASTQ, 2, {YMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18020, 225},
+ /* 4803 */ {I_VPBROADCASTQ, 2, {ZMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18028, 226},
+ /* 4804 */ {I_VPBROADCASTQ, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18036, 225},
+ /* 4805 */ {I_VPBROADCASTQ, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18044, 225},
+ /* 4806 */ {I_VPBROADCASTQ, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18052, 226},
+ /* 4807 */ {I_VPBROADCASTW, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18060, 229},
+ /* 4808 */ {I_VPBROADCASTW, 2, {YMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18068, 229},
+ /* 4809 */ {I_VPBROADCASTW, 2, {ZMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18076, 230},
+ /* 4810 */ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ /* 4811 */ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ /* 4812 */ {I_VPBROADCASTW, 2, {XMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18084, 229},
+ /* 4813 */ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ /* 4814 */ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ /* 4815 */ {I_VPBROADCASTW, 2, {YMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18092, 229},
+ /* 4816 */ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ /* 4817 */ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ /* 4818 */ {I_VPBROADCASTW, 2, {ZMMREG,REG_GPR|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18100, 230},
+ /* 4819 */ {I_VPCMPB, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5244, 229},
+ /* 4820 */ {I_VPCMPB, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5253, 229},
+ /* 4821 */ {I_VPCMPB, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5262, 230},
+ /* 4822 */ {I_VPCMPD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5271, 225},
+ /* 4823 */ {I_VPCMPD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5280, 225},
+ /* 4824 */ {I_VPCMPD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5289, 226},
+ /* 4825 */ {I_VPCMPEQB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18108, 229},
+ /* 4826 */ {I_VPCMPEQB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18116, 229},
+ /* 4827 */ {I_VPCMPEQB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18124, 230},
+ /* 4828 */ {I_VPCMPEQD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18132, 225},
+ /* 4829 */ {I_VPCMPEQD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18140, 225},
+ /* 4830 */ {I_VPCMPEQD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18148, 226},
+ /* 4831 */ {I_VPCMPEQQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18156, 225},
+ /* 4832 */ {I_VPCMPEQQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18164, 225},
+ /* 4833 */ {I_VPCMPEQQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18172, 226},
+ /* 4834 */ {I_VPCMPEQW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18180, 229},
+ /* 4835 */ {I_VPCMPEQW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18188, 229},
+ /* 4836 */ {I_VPCMPEQW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18196, 230},
+ /* 4837 */ {I_VPCMPGTB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18204, 229},
+ /* 4838 */ {I_VPCMPGTB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18212, 229},
+ /* 4839 */ {I_VPCMPGTB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18220, 230},
+ /* 4840 */ {I_VPCMPGTD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18228, 225},
+ /* 4841 */ {I_VPCMPGTD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18236, 225},
+ /* 4842 */ {I_VPCMPGTD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+18244, 226},
+ /* 4843 */ {I_VPCMPGTQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18252, 225},
+ /* 4844 */ {I_VPCMPGTQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18260, 225},
+ /* 4845 */ {I_VPCMPGTQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+18268, 226},
+ /* 4846 */ {I_VPCMPGTW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18276, 229},
+ /* 4847 */ {I_VPCMPGTW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18284, 229},
+ /* 4848 */ {I_VPCMPGTW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18292, 230},
+ /* 4849 */ {I_VPCMPQ, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5298, 225},
+ /* 4850 */ {I_VPCMPQ, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5307, 225},
+ /* 4851 */ {I_VPCMPQ, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5316, 226},
+ /* 4852 */ {I_VPCMPUB, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5325, 229},
+ /* 4853 */ {I_VPCMPUB, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5334, 229},
+ /* 4854 */ {I_VPCMPUB, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5343, 230},
+ /* 4855 */ {I_VPCMPUD, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5352, 225},
+ /* 4856 */ {I_VPCMPUD, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5361, 225},
+ /* 4857 */ {I_VPCMPUD, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B32,0,0}, nasm_bytecodes+5370, 226},
+ /* 4858 */ {I_VPCMPUQ, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5379, 225},
+ /* 4859 */ {I_VPCMPUQ, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5388, 225},
+ /* 4860 */ {I_VPCMPUQ, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,B64,0,0}, nasm_bytecodes+5397, 226},
+ /* 4861 */ {I_VPCMPUW, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5406, 229},
+ /* 4862 */ {I_VPCMPUW, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5415, 229},
+ /* 4863 */ {I_VPCMPUW, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5424, 230},
+ /* 4864 */ {I_VPCMPW, 4, {KREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5433, 229},
+ /* 4865 */ {I_VPCMPW, 4, {KREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5442, 229},
+ /* 4866 */ {I_VPCMPW, 4, {KREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK,0,0,0,0}, nasm_bytecodes+5451, 230},
+ /* 4867 */ {I_VPCOMPRESSD, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18300, 225},
+ /* 4868 */ {I_VPCOMPRESSD, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18308, 225},
+ /* 4869 */ {I_VPCOMPRESSD, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18316, 226},
+ /* 4870 */ {I_VPCOMPRESSD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18324, 225},
+ /* 4871 */ {I_VPCOMPRESSD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18332, 225},
+ /* 4872 */ {I_VPCOMPRESSD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18340, 226},
+ /* 4873 */ {I_VPCOMPRESSQ, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18348, 225},
+ /* 4874 */ {I_VPCOMPRESSQ, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18356, 225},
+ /* 4875 */ {I_VPCOMPRESSQ, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+18364, 226},
+ /* 4876 */ {I_VPCOMPRESSQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18372, 225},
+ /* 4877 */ {I_VPCOMPRESSQ, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18380, 225},
+ /* 4878 */ {I_VPCOMPRESSQ, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18388, 226},
+ /* 4879 */ {I_VPCONFLICTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18396, 233},
+ /* 4880 */ {I_VPCONFLICTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18404, 233},
+ /* 4881 */ {I_VPCONFLICTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18412, 234},
+ /* 4882 */ {I_VPCONFLICTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18420, 233},
+ /* 4883 */ {I_VPCONFLICTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18428, 233},
+ /* 4884 */ {I_VPCONFLICTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18436, 234},
+ /* 4885 */ {I_VPERMB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18444, 235},
+ /* 4886 */ {I_VPERMB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18452, 235},
+ /* 4887 */ {I_VPERMB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18460, 235},
+ /* 4888 */ {I_VPERMB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18468, 235},
+ /* 4889 */ {I_VPERMB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18476, 236},
+ /* 4890 */ {I_VPERMB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18484, 236},
+ /* 4891 */ {I_VPERMD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18492, 225},
+ /* 4892 */ {I_VPERMD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18500, 225},
+ /* 4893 */ {I_VPERMD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18508, 226},
+ /* 4894 */ {I_VPERMD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18516, 226},
+ /* 4895 */ {I_VPERMI2B, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18524, 235},
+ /* 4896 */ {I_VPERMI2B, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18532, 235},
+ /* 4897 */ {I_VPERMI2B, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18540, 236},
+ /* 4898 */ {I_VPERMI2D, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18548, 225},
+ /* 4899 */ {I_VPERMI2D, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18556, 225},
+ /* 4900 */ {I_VPERMI2D, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18564, 226},
+ /* 4901 */ {I_VPERMI2PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18572, 225},
+ /* 4902 */ {I_VPERMI2PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18580, 225},
+ /* 4903 */ {I_VPERMI2PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18588, 226},
+ /* 4904 */ {I_VPERMI2PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18596, 225},
+ /* 4905 */ {I_VPERMI2PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18604, 225},
+ /* 4906 */ {I_VPERMI2PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18612, 226},
+ /* 4907 */ {I_VPERMI2Q, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18620, 225},
+ /* 4908 */ {I_VPERMI2Q, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18628, 225},
+ /* 4909 */ {I_VPERMI2Q, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18636, 226},
+ /* 4910 */ {I_VPERMI2W, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18644, 229},
+ /* 4911 */ {I_VPERMI2W, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18652, 229},
+ /* 4912 */ {I_VPERMI2W, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18660, 230},
+ /* 4913 */ {I_VPERMILPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5460, 225},
+ /* 4914 */ {I_VPERMILPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5469, 225},
+ /* 4915 */ {I_VPERMILPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5478, 226},
+ /* 4916 */ {I_VPERMILPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18668, 225},
+ /* 4917 */ {I_VPERMILPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18676, 225},
+ /* 4918 */ {I_VPERMILPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18684, 225},
+ /* 4919 */ {I_VPERMILPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18692, 225},
+ /* 4920 */ {I_VPERMILPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18700, 226},
+ /* 4921 */ {I_VPERMILPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18708, 226},
+ /* 4922 */ {I_VPERMILPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5487, 225},
+ /* 4923 */ {I_VPERMILPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5496, 225},
+ /* 4924 */ {I_VPERMILPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5505, 226},
+ /* 4925 */ {I_VPERMILPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18716, 225},
+ /* 4926 */ {I_VPERMILPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18724, 225},
+ /* 4927 */ {I_VPERMILPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18732, 225},
+ /* 4928 */ {I_VPERMILPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18740, 225},
+ /* 4929 */ {I_VPERMILPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18748, 226},
+ /* 4930 */ {I_VPERMILPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18756, 226},
+ /* 4931 */ {I_VPERMPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5514, 225},
+ /* 4932 */ {I_VPERMPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5523, 226},
+ /* 4933 */ {I_VPERMPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18764, 225},
+ /* 4934 */ {I_VPERMPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18772, 225},
+ /* 4935 */ {I_VPERMPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18780, 226},
+ /* 4936 */ {I_VPERMPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18788, 226},
+ /* 4937 */ {I_VPERMPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18796, 225},
+ /* 4938 */ {I_VPERMPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18804, 225},
+ /* 4939 */ {I_VPERMPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18812, 226},
+ /* 4940 */ {I_VPERMPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+18820, 226},
+ /* 4941 */ {I_VPERMQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5532, 225},
+ /* 4942 */ {I_VPERMQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5541, 226},
+ /* 4943 */ {I_VPERMQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18828, 225},
+ /* 4944 */ {I_VPERMQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18836, 225},
+ /* 4945 */ {I_VPERMQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18844, 226},
+ /* 4946 */ {I_VPERMQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+18852, 226},
+ /* 4947 */ {I_VPERMT2B, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18860, 235},
+ /* 4948 */ {I_VPERMT2B, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18868, 235},
+ /* 4949 */ {I_VPERMT2B, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18876, 236},
+ /* 4950 */ {I_VPERMT2D, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18884, 225},
+ /* 4951 */ {I_VPERMT2D, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18892, 225},
+ /* 4952 */ {I_VPERMT2D, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18900, 226},
+ /* 4953 */ {I_VPERMT2PD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18908, 225},
+ /* 4954 */ {I_VPERMT2PD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18916, 225},
+ /* 4955 */ {I_VPERMT2PD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18924, 226},
+ /* 4956 */ {I_VPERMT2PS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18932, 225},
+ /* 4957 */ {I_VPERMT2PS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18940, 225},
+ /* 4958 */ {I_VPERMT2PS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+18948, 226},
+ /* 4959 */ {I_VPERMT2Q, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18956, 225},
+ /* 4960 */ {I_VPERMT2Q, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18964, 225},
+ /* 4961 */ {I_VPERMT2Q, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+18972, 226},
+ /* 4962 */ {I_VPERMT2W, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18980, 229},
+ /* 4963 */ {I_VPERMT2W, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18988, 229},
+ /* 4964 */ {I_VPERMT2W, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+18996, 230},
+ /* 4965 */ {I_VPERMW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19004, 229},
+ /* 4966 */ {I_VPERMW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19012, 229},
+ /* 4967 */ {I_VPERMW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19020, 229},
+ /* 4968 */ {I_VPERMW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19028, 229},
+ /* 4969 */ {I_VPERMW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19036, 230},
+ /* 4970 */ {I_VPERMW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19044, 230},
+ /* 4971 */ {I_VPEXPANDD, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19052, 225},
+ /* 4972 */ {I_VPEXPANDD, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19060, 225},
+ /* 4973 */ {I_VPEXPANDD, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19068, 226},
+ /* 4974 */ {I_VPEXPANDD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19052, 225},
+ /* 4975 */ {I_VPEXPANDD, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19060, 225},
+ /* 4976 */ {I_VPEXPANDD, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19068, 226},
+ /* 4977 */ {I_VPEXPANDQ, 2, {XMMREG,MEMORY|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19076, 225},
+ /* 4978 */ {I_VPEXPANDQ, 2, {YMMREG,MEMORY|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19084, 225},
+ /* 4979 */ {I_VPEXPANDQ, 2, {ZMMREG,MEMORY|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19092, 226},
+ /* 4980 */ {I_VPEXPANDQ, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19076, 225},
+ /* 4981 */ {I_VPEXPANDQ, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19084, 225},
+ /* 4982 */ {I_VPEXPANDQ, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19092, 226},
+ /* 4983 */ {I_VPEXTRB, 3, {REG_GPR|BITS8,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ /* 4984 */ {I_VPEXTRB, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ /* 4985 */ {I_VPEXTRB, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ /* 4986 */ {I_VPEXTRB, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ /* 4987 */ {I_VPEXTRB, 3, {MEMORY|BITS8,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5550, 230},
+ /* 4988 */ {I_VPEXTRD, 3, {RM_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5559, 228},
+ /* 4989 */ {I_VPEXTRQ, 3, {RM_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5568, 228},
+ /* 4990 */ {I_VPEXTRW, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ /* 4991 */ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ /* 4992 */ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ /* 4993 */ {I_VPEXTRW, 3, {MEMORY|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5577, 230},
+ /* 4994 */ {I_VPEXTRW, 3, {REG_GPR|BITS16,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ /* 4995 */ {I_VPEXTRW, 3, {REG_GPR|BITS32,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ /* 4996 */ {I_VPEXTRW, 3, {REG_GPR|BITS64,XMMREG,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5586, 230},
+ /* 4997 */ {I_VPGATHERDD, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5595, 225},
+ /* 4998 */ {I_VPGATHERDD, 2, {YMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5604, 225},
+ /* 4999 */ {I_VPGATHERDD, 2, {ZMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5613, 226},
+ /* 5000 */ {I_VPGATHERDQ, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5622, 225},
+ /* 5001 */ {I_VPGATHERDQ, 2, {YMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5631, 225},
+ /* 5002 */ {I_VPGATHERDQ, 2, {ZMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5640, 226},
+ /* 5003 */ {I_VPGATHERQD, 2, {XMMREG,XMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5649, 225},
+ /* 5004 */ {I_VPGATHERQD, 2, {XMMREG,YMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5658, 225},
+ /* 5005 */ {I_VPGATHERQD, 2, {YMMREG,ZMEM|BITS32,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5667, 226},
+ /* 5006 */ {I_VPGATHERQQ, 2, {XMMREG,XMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5676, 225},
+ /* 5007 */ {I_VPGATHERQQ, 2, {YMMREG,YMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5685, 225},
+ /* 5008 */ {I_VPGATHERQQ, 2, {ZMMREG,ZMEM|BITS64,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5694, 226},
+ /* 5009 */ {I_VPINSRB, 4, {XMMREG,XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5703, 230},
+ /* 5010 */ {I_VPINSRB, 3, {XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5712, 230},
+ /* 5011 */ {I_VPINSRB, 4, {XMMREG,XMMREG,MEMORY|BITS8,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5703, 230},
+ /* 5012 */ {I_VPINSRB, 3, {XMMREG,MEMORY|BITS8,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5712, 230},
+ /* 5013 */ {I_VPINSRD, 4, {XMMREG,XMMREG,RM_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5721, 228},
+ /* 5014 */ {I_VPINSRD, 3, {XMMREG,RM_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5730, 228},
+ /* 5015 */ {I_VPINSRQ, 4, {XMMREG,XMMREG,RM_GPR|BITS64,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5739, 228},
+ /* 5016 */ {I_VPINSRQ, 3, {XMMREG,RM_GPR|BITS64,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5748, 228},
+ /* 5017 */ {I_VPINSRW, 4, {XMMREG,XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5757, 230},
+ /* 5018 */ {I_VPINSRW, 3, {XMMREG,REG_GPR|BITS32,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5766, 230},
+ /* 5019 */ {I_VPINSRW, 4, {XMMREG,XMMREG,MEMORY|BITS16,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+5757, 230},
+ /* 5020 */ {I_VPINSRW, 3, {XMMREG,MEMORY|BITS16,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+5766, 230},
+ /* 5021 */ {I_VPLZCNTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19100, 233},
+ /* 5022 */ {I_VPLZCNTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19108, 233},
+ /* 5023 */ {I_VPLZCNTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19116, 234},
+ /* 5024 */ {I_VPLZCNTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19124, 233},
+ /* 5025 */ {I_VPLZCNTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19132, 233},
+ /* 5026 */ {I_VPLZCNTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19140, 234},
+ /* 5027 */ {I_VPMADD52HUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19148, 237},
+ /* 5028 */ {I_VPMADD52HUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19156, 237},
+ /* 5029 */ {I_VPMADD52HUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19164, 238},
+ /* 5030 */ {I_VPMADD52LUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19172, 237},
+ /* 5031 */ {I_VPMADD52LUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19180, 237},
+ /* 5032 */ {I_VPMADD52LUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19188, 238},
+ /* 5033 */ {I_VPMADDUBSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19196, 229},
+ /* 5034 */ {I_VPMADDUBSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19204, 229},
+ /* 5035 */ {I_VPMADDUBSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19212, 229},
+ /* 5036 */ {I_VPMADDUBSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19220, 229},
+ /* 5037 */ {I_VPMADDUBSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19228, 230},
+ /* 5038 */ {I_VPMADDUBSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19236, 230},
+ /* 5039 */ {I_VPMADDWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19244, 229},
+ /* 5040 */ {I_VPMADDWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19252, 229},
+ /* 5041 */ {I_VPMADDWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19260, 229},
+ /* 5042 */ {I_VPMADDWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19268, 229},
+ /* 5043 */ {I_VPMADDWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19276, 230},
+ /* 5044 */ {I_VPMADDWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19284, 230},
+ /* 5045 */ {I_VPMAXSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19292, 229},
+ /* 5046 */ {I_VPMAXSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19300, 229},
+ /* 5047 */ {I_VPMAXSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19308, 229},
+ /* 5048 */ {I_VPMAXSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19316, 229},
+ /* 5049 */ {I_VPMAXSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19324, 230},
+ /* 5050 */ {I_VPMAXSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19332, 230},
+ /* 5051 */ {I_VPMAXSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19340, 225},
+ /* 5052 */ {I_VPMAXSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19348, 225},
+ /* 5053 */ {I_VPMAXSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19356, 225},
+ /* 5054 */ {I_VPMAXSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19364, 225},
+ /* 5055 */ {I_VPMAXSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19372, 226},
+ /* 5056 */ {I_VPMAXSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19380, 226},
+ /* 5057 */ {I_VPMAXSQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19388, 225},
+ /* 5058 */ {I_VPMAXSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19396, 225},
+ /* 5059 */ {I_VPMAXSQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19404, 225},
+ /* 5060 */ {I_VPMAXSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19412, 225},
+ /* 5061 */ {I_VPMAXSQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19420, 226},
+ /* 5062 */ {I_VPMAXSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19428, 226},
+ /* 5063 */ {I_VPMAXSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19436, 229},
+ /* 5064 */ {I_VPMAXSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19444, 229},
+ /* 5065 */ {I_VPMAXSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19452, 229},
+ /* 5066 */ {I_VPMAXSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19460, 229},
+ /* 5067 */ {I_VPMAXSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19468, 230},
+ /* 5068 */ {I_VPMAXSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19476, 230},
+ /* 5069 */ {I_VPMAXUB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19484, 229},
+ /* 5070 */ {I_VPMAXUB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19492, 229},
+ /* 5071 */ {I_VPMAXUB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19500, 229},
+ /* 5072 */ {I_VPMAXUB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19508, 229},
+ /* 5073 */ {I_VPMAXUB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19516, 230},
+ /* 5074 */ {I_VPMAXUB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19524, 230},
+ /* 5075 */ {I_VPMAXUD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19532, 225},
+ /* 5076 */ {I_VPMAXUD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19540, 225},
+ /* 5077 */ {I_VPMAXUD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19548, 225},
+ /* 5078 */ {I_VPMAXUD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19556, 225},
+ /* 5079 */ {I_VPMAXUD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19564, 226},
+ /* 5080 */ {I_VPMAXUD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19572, 226},
+ /* 5081 */ {I_VPMAXUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19580, 225},
+ /* 5082 */ {I_VPMAXUQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19588, 225},
+ /* 5083 */ {I_VPMAXUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19596, 225},
+ /* 5084 */ {I_VPMAXUQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19604, 225},
+ /* 5085 */ {I_VPMAXUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19612, 226},
+ /* 5086 */ {I_VPMAXUQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19620, 226},
+ /* 5087 */ {I_VPMAXUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19628, 229},
+ /* 5088 */ {I_VPMAXUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19636, 229},
+ /* 5089 */ {I_VPMAXUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19644, 229},
+ /* 5090 */ {I_VPMAXUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19652, 229},
+ /* 5091 */ {I_VPMAXUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19660, 230},
+ /* 5092 */ {I_VPMAXUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19668, 230},
+ /* 5093 */ {I_VPMINSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19676, 229},
+ /* 5094 */ {I_VPMINSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19684, 229},
+ /* 5095 */ {I_VPMINSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19692, 229},
+ /* 5096 */ {I_VPMINSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19700, 229},
+ /* 5097 */ {I_VPMINSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19708, 230},
+ /* 5098 */ {I_VPMINSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19716, 230},
+ /* 5099 */ {I_VPMINSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19724, 225},
+ /* 5100 */ {I_VPMINSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19732, 225},
+ /* 5101 */ {I_VPMINSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19740, 225},
+ /* 5102 */ {I_VPMINSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19748, 225},
+ /* 5103 */ {I_VPMINSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19756, 226},
+ /* 5104 */ {I_VPMINSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19764, 226},
+ /* 5105 */ {I_VPMINSQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19772, 225},
+ /* 5106 */ {I_VPMINSQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19780, 225},
+ /* 5107 */ {I_VPMINSQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19788, 225},
+ /* 5108 */ {I_VPMINSQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19796, 225},
+ /* 5109 */ {I_VPMINSQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19804, 226},
+ /* 5110 */ {I_VPMINSQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19812, 226},
+ /* 5111 */ {I_VPMINSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19820, 229},
+ /* 5112 */ {I_VPMINSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19828, 229},
+ /* 5113 */ {I_VPMINSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19836, 229},
+ /* 5114 */ {I_VPMINSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19844, 229},
+ /* 5115 */ {I_VPMINSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19852, 230},
+ /* 5116 */ {I_VPMINSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19860, 230},
+ /* 5117 */ {I_VPMINUB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19868, 229},
+ /* 5118 */ {I_VPMINUB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19876, 229},
+ /* 5119 */ {I_VPMINUB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19884, 229},
+ /* 5120 */ {I_VPMINUB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19892, 229},
+ /* 5121 */ {I_VPMINUB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19900, 230},
+ /* 5122 */ {I_VPMINUB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+19908, 230},
+ /* 5123 */ {I_VPMINUD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19916, 225},
+ /* 5124 */ {I_VPMINUD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19924, 225},
+ /* 5125 */ {I_VPMINUD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19932, 225},
+ /* 5126 */ {I_VPMINUD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19940, 225},
+ /* 5127 */ {I_VPMINUD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+19948, 226},
+ /* 5128 */ {I_VPMINUD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+19956, 226},
+ /* 5129 */ {I_VPMINUQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19964, 225},
+ /* 5130 */ {I_VPMINUQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19972, 225},
+ /* 5131 */ {I_VPMINUQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19980, 225},
+ /* 5132 */ {I_VPMINUQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+19988, 225},
+ /* 5133 */ {I_VPMINUQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+19996, 226},
+ /* 5134 */ {I_VPMINUQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+20004, 226},
+ /* 5135 */ {I_VPMINUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20012, 229},
+ /* 5136 */ {I_VPMINUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20020, 229},
+ /* 5137 */ {I_VPMINUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20028, 229},
+ /* 5138 */ {I_VPMINUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20036, 229},
+ /* 5139 */ {I_VPMINUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20044, 230},
+ /* 5140 */ {I_VPMINUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20052, 230},
+ /* 5141 */ {I_VPMOVB2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20060, 229},
+ /* 5142 */ {I_VPMOVB2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20068, 229},
+ /* 5143 */ {I_VPMOVB2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20076, 230},
+ /* 5144 */ {I_VPMOVD2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20084, 227},
+ /* 5145 */ {I_VPMOVD2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20092, 227},
+ /* 5146 */ {I_VPMOVD2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20100, 228},
+ /* 5147 */ {I_VPMOVDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20108, 225},
+ /* 5148 */ {I_VPMOVDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20116, 225},
+ /* 5149 */ {I_VPMOVDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20124, 226},
+ /* 5150 */ {I_VPMOVDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20132, 225},
+ /* 5151 */ {I_VPMOVDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20140, 225},
+ /* 5152 */ {I_VPMOVDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20148, 226},
+ /* 5153 */ {I_VPMOVDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20156, 225},
+ /* 5154 */ {I_VPMOVDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20164, 225},
+ /* 5155 */ {I_VPMOVDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20172, 226},
+ /* 5156 */ {I_VPMOVDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20180, 225},
+ /* 5157 */ {I_VPMOVDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20188, 225},
+ /* 5158 */ {I_VPMOVDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20196, 226},
+ /* 5159 */ {I_VPMOVM2B, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20204, 229},
+ /* 5160 */ {I_VPMOVM2B, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20212, 229},
+ /* 5161 */ {I_VPMOVM2B, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20220, 230},
+ /* 5162 */ {I_VPMOVM2D, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20228, 227},
+ /* 5163 */ {I_VPMOVM2D, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20236, 227},
+ /* 5164 */ {I_VPMOVM2D, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20244, 228},
+ /* 5165 */ {I_VPMOVM2Q, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20252, 227},
+ /* 5166 */ {I_VPMOVM2Q, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20260, 227},
+ /* 5167 */ {I_VPMOVM2Q, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20268, 228},
+ /* 5168 */ {I_VPMOVM2W, 2, {XMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20276, 229},
+ /* 5169 */ {I_VPMOVM2W, 2, {YMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20284, 229},
+ /* 5170 */ {I_VPMOVM2W, 2, {ZMMREG,KREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20292, 230},
+ /* 5171 */ {I_VPMOVQ2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20300, 227},
+ /* 5172 */ {I_VPMOVQ2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20308, 227},
+ /* 5173 */ {I_VPMOVQ2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+20316, 228},
+ /* 5174 */ {I_VPMOVQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20324, 225},
+ /* 5175 */ {I_VPMOVQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20332, 225},
+ /* 5176 */ {I_VPMOVQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20340, 226},
+ /* 5177 */ {I_VPMOVQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20348, 225},
+ /* 5178 */ {I_VPMOVQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20356, 225},
+ /* 5179 */ {I_VPMOVQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20364, 226},
+ /* 5180 */ {I_VPMOVQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20372, 225},
+ /* 5181 */ {I_VPMOVQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20380, 225},
+ /* 5182 */ {I_VPMOVQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20388, 226},
+ /* 5183 */ {I_VPMOVQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20396, 225},
+ /* 5184 */ {I_VPMOVQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20404, 225},
+ /* 5185 */ {I_VPMOVQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20412, 226},
+ /* 5186 */ {I_VPMOVQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20420, 225},
+ /* 5187 */ {I_VPMOVQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20428, 225},
+ /* 5188 */ {I_VPMOVQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20436, 226},
+ /* 5189 */ {I_VPMOVQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20444, 225},
+ /* 5190 */ {I_VPMOVQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20452, 225},
+ /* 5191 */ {I_VPMOVQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20460, 226},
+ /* 5192 */ {I_VPMOVSDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20468, 225},
+ /* 5193 */ {I_VPMOVSDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20476, 225},
+ /* 5194 */ {I_VPMOVSDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20484, 226},
+ /* 5195 */ {I_VPMOVSDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20492, 225},
+ /* 5196 */ {I_VPMOVSDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20500, 225},
+ /* 5197 */ {I_VPMOVSDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20508, 226},
+ /* 5198 */ {I_VPMOVSDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20516, 225},
+ /* 5199 */ {I_VPMOVSDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20524, 225},
+ /* 5200 */ {I_VPMOVSDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20532, 226},
+ /* 5201 */ {I_VPMOVSDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20540, 225},
+ /* 5202 */ {I_VPMOVSDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20548, 225},
+ /* 5203 */ {I_VPMOVSDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20556, 226},
+ /* 5204 */ {I_VPMOVSQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20564, 225},
+ /* 5205 */ {I_VPMOVSQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20572, 225},
+ /* 5206 */ {I_VPMOVSQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20580, 226},
+ /* 5207 */ {I_VPMOVSQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20588, 225},
+ /* 5208 */ {I_VPMOVSQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20596, 225},
+ /* 5209 */ {I_VPMOVSQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20604, 226},
+ /* 5210 */ {I_VPMOVSQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20612, 225},
+ /* 5211 */ {I_VPMOVSQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20620, 225},
+ /* 5212 */ {I_VPMOVSQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20628, 226},
+ /* 5213 */ {I_VPMOVSQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20636, 225},
+ /* 5214 */ {I_VPMOVSQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20644, 225},
+ /* 5215 */ {I_VPMOVSQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20652, 226},
+ /* 5216 */ {I_VPMOVSQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20660, 225},
+ /* 5217 */ {I_VPMOVSQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20668, 225},
+ /* 5218 */ {I_VPMOVSQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20676, 226},
+ /* 5219 */ {I_VPMOVSQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20684, 225},
+ /* 5220 */ {I_VPMOVSQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20692, 225},
+ /* 5221 */ {I_VPMOVSQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20700, 226},
+ /* 5222 */ {I_VPMOVSWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20708, 229},
+ /* 5223 */ {I_VPMOVSWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20716, 229},
+ /* 5224 */ {I_VPMOVSWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20724, 230},
+ /* 5225 */ {I_VPMOVSWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20732, 229},
+ /* 5226 */ {I_VPMOVSWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20740, 229},
+ /* 5227 */ {I_VPMOVSWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20748, 230},
+ /* 5228 */ {I_VPMOVSXBD, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20756, 225},
+ /* 5229 */ {I_VPMOVSXBD, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20764, 225},
+ /* 5230 */ {I_VPMOVSXBD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20772, 226},
+ /* 5231 */ {I_VPMOVSXBQ, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20780, 225},
+ /* 5232 */ {I_VPMOVSXBQ, 2, {YMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20788, 225},
+ /* 5233 */ {I_VPMOVSXBQ, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20796, 226},
+ /* 5234 */ {I_VPMOVSXBW, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20804, 229},
+ /* 5235 */ {I_VPMOVSXBW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20812, 229},
+ /* 5236 */ {I_VPMOVSXBW, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20820, 230},
+ /* 5237 */ {I_VPMOVSXDQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20828, 225},
+ /* 5238 */ {I_VPMOVSXDQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20836, 225},
+ /* 5239 */ {I_VPMOVSXDQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20844, 226},
+ /* 5240 */ {I_VPMOVSXWD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20852, 225},
+ /* 5241 */ {I_VPMOVSXWD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20860, 225},
+ /* 5242 */ {I_VPMOVSXWD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20868, 226},
+ /* 5243 */ {I_VPMOVSXWQ, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20876, 225},
+ /* 5244 */ {I_VPMOVSXWQ, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20884, 225},
+ /* 5245 */ {I_VPMOVSXWQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20892, 226},
+ /* 5246 */ {I_VPMOVUSDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20900, 225},
+ /* 5247 */ {I_VPMOVUSDB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20908, 225},
+ /* 5248 */ {I_VPMOVUSDB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20916, 226},
+ /* 5249 */ {I_VPMOVUSDB, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20924, 225},
+ /* 5250 */ {I_VPMOVUSDB, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20932, 225},
+ /* 5251 */ {I_VPMOVUSDB, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20940, 226},
+ /* 5252 */ {I_VPMOVUSDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20948, 225},
+ /* 5253 */ {I_VPMOVUSDW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20956, 225},
+ /* 5254 */ {I_VPMOVUSDW, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20964, 226},
+ /* 5255 */ {I_VPMOVUSDW, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20972, 225},
+ /* 5256 */ {I_VPMOVUSDW, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20980, 225},
+ /* 5257 */ {I_VPMOVUSDW, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+20988, 226},
+ /* 5258 */ {I_VPMOVUSQB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+20996, 225},
+ /* 5259 */ {I_VPMOVUSQB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21004, 225},
+ /* 5260 */ {I_VPMOVUSQB, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21012, 226},
+ /* 5261 */ {I_VPMOVUSQB, 2, {MEMORY|BITS16,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21020, 225},
+ /* 5262 */ {I_VPMOVUSQB, 2, {MEMORY|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21028, 225},
+ /* 5263 */ {I_VPMOVUSQB, 2, {MEMORY|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21036, 226},
+ /* 5264 */ {I_VPMOVUSQD, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21044, 225},
+ /* 5265 */ {I_VPMOVUSQD, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21052, 225},
+ /* 5266 */ {I_VPMOVUSQD, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21060, 226},
+ /* 5267 */ {I_VPMOVUSQD, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21068, 225},
+ /* 5268 */ {I_VPMOVUSQD, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21076, 225},
+ /* 5269 */ {I_VPMOVUSQD, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21084, 226},
+ /* 5270 */ {I_VPMOVUSQW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21092, 225},
+ /* 5271 */ {I_VPMOVUSQW, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21100, 225},
+ /* 5272 */ {I_VPMOVUSQW, 2, {XMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21108, 226},
+ /* 5273 */ {I_VPMOVUSQW, 2, {MEMORY|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21116, 225},
+ /* 5274 */ {I_VPMOVUSQW, 2, {MEMORY|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21124, 225},
+ /* 5275 */ {I_VPMOVUSQW, 2, {MEMORY|BITS128,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21132, 226},
+ /* 5276 */ {I_VPMOVUSWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21140, 229},
+ /* 5277 */ {I_VPMOVUSWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21148, 229},
+ /* 5278 */ {I_VPMOVUSWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21156, 230},
+ /* 5279 */ {I_VPMOVUSWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21164, 229},
+ /* 5280 */ {I_VPMOVUSWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21172, 229},
+ /* 5281 */ {I_VPMOVUSWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21180, 230},
+ /* 5282 */ {I_VPMOVW2M, 2, {KREG,XMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21188, 229},
+ /* 5283 */ {I_VPMOVW2M, 2, {KREG,YMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21196, 229},
+ /* 5284 */ {I_VPMOVW2M, 2, {KREG,ZMMREG,0,0,0}, NO_DECORATOR, nasm_bytecodes+21204, 230},
+ /* 5285 */ {I_VPMOVWB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21212, 229},
+ /* 5286 */ {I_VPMOVWB, 2, {XMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21220, 229},
+ /* 5287 */ {I_VPMOVWB, 2, {YMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21228, 230},
+ /* 5288 */ {I_VPMOVWB, 2, {MEMORY|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21236, 229},
+ /* 5289 */ {I_VPMOVWB, 2, {MEMORY|BITS128,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21244, 229},
+ /* 5290 */ {I_VPMOVWB, 2, {MEMORY|BITS256,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+21252, 230},
+ /* 5291 */ {I_VPMOVZXBD, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21260, 225},
+ /* 5292 */ {I_VPMOVZXBD, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21268, 225},
+ /* 5293 */ {I_VPMOVZXBD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21276, 226},
+ /* 5294 */ {I_VPMOVZXBQ, 2, {XMMREG,RM_XMM|BITS16,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21284, 225},
+ /* 5295 */ {I_VPMOVZXBQ, 2, {YMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21292, 225},
+ /* 5296 */ {I_VPMOVZXBQ, 2, {ZMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21300, 226},
+ /* 5297 */ {I_VPMOVZXBW, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21308, 229},
+ /* 5298 */ {I_VPMOVZXBW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21316, 229},
+ /* 5299 */ {I_VPMOVZXBW, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21324, 230},
+ /* 5300 */ {I_VPMOVZXDQ, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21332, 225},
+ /* 5301 */ {I_VPMOVZXDQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21340, 225},
+ /* 5302 */ {I_VPMOVZXDQ, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21348, 226},
+ /* 5303 */ {I_VPMOVZXWD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21356, 225},
+ /* 5304 */ {I_VPMOVZXWD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21364, 225},
+ /* 5305 */ {I_VPMOVZXWD, 2, {ZMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21372, 226},
+ /* 5306 */ {I_VPMOVZXWQ, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21380, 225},
+ /* 5307 */ {I_VPMOVZXWQ, 2, {YMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21388, 225},
+ /* 5308 */ {I_VPMOVZXWQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21396, 226},
+ /* 5309 */ {I_VPMULDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21404, 225},
+ /* 5310 */ {I_VPMULDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21412, 225},
+ /* 5311 */ {I_VPMULDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21420, 225},
+ /* 5312 */ {I_VPMULDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21428, 225},
+ /* 5313 */ {I_VPMULDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21436, 226},
+ /* 5314 */ {I_VPMULDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21444, 226},
+ /* 5315 */ {I_VPMULHRSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21452, 229},
+ /* 5316 */ {I_VPMULHRSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21460, 229},
+ /* 5317 */ {I_VPMULHRSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21468, 229},
+ /* 5318 */ {I_VPMULHRSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21476, 229},
+ /* 5319 */ {I_VPMULHRSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21484, 230},
+ /* 5320 */ {I_VPMULHRSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21492, 230},
+ /* 5321 */ {I_VPMULHUW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21500, 229},
+ /* 5322 */ {I_VPMULHUW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21508, 229},
+ /* 5323 */ {I_VPMULHUW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21516, 229},
+ /* 5324 */ {I_VPMULHUW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21524, 229},
+ /* 5325 */ {I_VPMULHUW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21532, 230},
+ /* 5326 */ {I_VPMULHUW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21540, 230},
+ /* 5327 */ {I_VPMULHW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21548, 229},
+ /* 5328 */ {I_VPMULHW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21556, 229},
+ /* 5329 */ {I_VPMULHW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21564, 229},
+ /* 5330 */ {I_VPMULHW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21572, 229},
+ /* 5331 */ {I_VPMULHW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21580, 230},
+ /* 5332 */ {I_VPMULHW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21588, 230},
+ /* 5333 */ {I_VPMULLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21596, 225},
+ /* 5334 */ {I_VPMULLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21604, 225},
+ /* 5335 */ {I_VPMULLD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21612, 225},
+ /* 5336 */ {I_VPMULLD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21620, 225},
+ /* 5337 */ {I_VPMULLD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21628, 226},
+ /* 5338 */ {I_VPMULLD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21636, 226},
+ /* 5339 */ {I_VPMULLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21644, 227},
+ /* 5340 */ {I_VPMULLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21652, 227},
+ /* 5341 */ {I_VPMULLQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21660, 227},
+ /* 5342 */ {I_VPMULLQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21668, 227},
+ /* 5343 */ {I_VPMULLQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21676, 228},
+ /* 5344 */ {I_VPMULLQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21684, 228},
+ /* 5345 */ {I_VPMULLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21692, 229},
+ /* 5346 */ {I_VPMULLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21700, 229},
+ /* 5347 */ {I_VPMULLW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21708, 229},
+ /* 5348 */ {I_VPMULLW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21716, 229},
+ /* 5349 */ {I_VPMULLW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21724, 230},
+ /* 5350 */ {I_VPMULLW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+21732, 230},
+ /* 5351 */ {I_VPMULTISHIFTQB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21740, 235},
+ /* 5352 */ {I_VPMULTISHIFTQB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21748, 235},
+ /* 5353 */ {I_VPMULTISHIFTQB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21756, 235},
+ /* 5354 */ {I_VPMULTISHIFTQB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21764, 235},
+ /* 5355 */ {I_VPMULTISHIFTQB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21772, 236},
+ /* 5356 */ {I_VPMULTISHIFTQB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21780, 236},
+ /* 5357 */ {I_VPMULUDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21788, 225},
+ /* 5358 */ {I_VPMULUDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21796, 225},
+ /* 5359 */ {I_VPMULUDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21804, 225},
+ /* 5360 */ {I_VPMULUDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21812, 225},
+ /* 5361 */ {I_VPMULUDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21820, 226},
+ /* 5362 */ {I_VPMULUDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21828, 226},
+ /* 5363 */ {I_VPORD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21836, 225},
+ /* 5364 */ {I_VPORD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21844, 225},
+ /* 5365 */ {I_VPORD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21852, 225},
+ /* 5366 */ {I_VPORD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21860, 225},
+ /* 5367 */ {I_VPORD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21868, 226},
+ /* 5368 */ {I_VPORD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21876, 226},
+ /* 5369 */ {I_VPORQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21884, 225},
+ /* 5370 */ {I_VPORQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21892, 225},
+ /* 5371 */ {I_VPORQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21900, 225},
+ /* 5372 */ {I_VPORQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21908, 225},
+ /* 5373 */ {I_VPORQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21916, 226},
+ /* 5374 */ {I_VPORQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21924, 226},
+ /* 5375 */ {I_VPROLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5775, 225},
+ /* 5376 */ {I_VPROLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5784, 225},
+ /* 5377 */ {I_VPROLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5793, 225},
+ /* 5378 */ {I_VPROLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5802, 225},
+ /* 5379 */ {I_VPROLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5811, 226},
+ /* 5380 */ {I_VPROLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5820, 226},
+ /* 5381 */ {I_VPROLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5829, 225},
+ /* 5382 */ {I_VPROLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5838, 225},
+ /* 5383 */ {I_VPROLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5847, 225},
+ /* 5384 */ {I_VPROLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5856, 225},
+ /* 5385 */ {I_VPROLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5865, 226},
+ /* 5386 */ {I_VPROLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5874, 226},
+ /* 5387 */ {I_VPROLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21932, 225},
+ /* 5388 */ {I_VPROLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21940, 225},
+ /* 5389 */ {I_VPROLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21948, 225},
+ /* 5390 */ {I_VPROLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21956, 225},
+ /* 5391 */ {I_VPROLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+21964, 226},
+ /* 5392 */ {I_VPROLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+21972, 226},
+ /* 5393 */ {I_VPROLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21980, 225},
+ /* 5394 */ {I_VPROLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+21988, 225},
+ /* 5395 */ {I_VPROLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+21996, 225},
+ /* 5396 */ {I_VPROLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22004, 225},
+ /* 5397 */ {I_VPROLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22012, 226},
+ /* 5398 */ {I_VPROLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22020, 226},
+ /* 5399 */ {I_VPRORD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5883, 225},
+ /* 5400 */ {I_VPRORD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5892, 225},
+ /* 5401 */ {I_VPRORD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5901, 225},
+ /* 5402 */ {I_VPRORD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5910, 225},
+ /* 5403 */ {I_VPRORD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+5919, 226},
+ /* 5404 */ {I_VPRORD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5928, 226},
+ /* 5405 */ {I_VPRORQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5937, 225},
+ /* 5406 */ {I_VPRORQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5946, 225},
+ /* 5407 */ {I_VPRORQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5955, 225},
+ /* 5408 */ {I_VPRORQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5964, 225},
+ /* 5409 */ {I_VPRORQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+5973, 226},
+ /* 5410 */ {I_VPRORQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+5982, 226},
+ /* 5411 */ {I_VPRORVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22028, 225},
+ /* 5412 */ {I_VPRORVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22036, 225},
+ /* 5413 */ {I_VPRORVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22044, 225},
+ /* 5414 */ {I_VPRORVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22052, 225},
+ /* 5415 */ {I_VPRORVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22060, 226},
+ /* 5416 */ {I_VPRORVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22068, 226},
+ /* 5417 */ {I_VPRORVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22076, 225},
+ /* 5418 */ {I_VPRORVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22084, 225},
+ /* 5419 */ {I_VPRORVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22092, 225},
+ /* 5420 */ {I_VPRORVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22100, 225},
+ /* 5421 */ {I_VPRORVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22108, 226},
+ /* 5422 */ {I_VPRORVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22116, 226},
+ /* 5423 */ {I_VPSADBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+22124, 229},
+ /* 5424 */ {I_VPSADBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+22132, 229},
+ /* 5425 */ {I_VPSADBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+22140, 229},
+ /* 5426 */ {I_VPSADBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+22148, 229},
+ /* 5427 */ {I_VPSADBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, NO_DECORATOR, nasm_bytecodes+22156, 230},
+ /* 5428 */ {I_VPSADBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+22164, 230},
+ /* 5429 */ {I_VPSCATTERDD, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+5991, 225},
+ /* 5430 */ {I_VPSCATTERDD, 2, {YMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6000, 225},
+ /* 5431 */ {I_VPSCATTERDD, 2, {ZMEM|BITS32,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6009, 226},
+ /* 5432 */ {I_VPSCATTERDQ, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6018, 225},
+ /* 5433 */ {I_VPSCATTERDQ, 2, {XMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6027, 225},
+ /* 5434 */ {I_VPSCATTERDQ, 2, {YMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6036, 226},
+ /* 5435 */ {I_VPSCATTERQD, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6045, 225},
+ /* 5436 */ {I_VPSCATTERQD, 2, {YMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6054, 225},
+ /* 5437 */ {I_VPSCATTERQD, 2, {ZMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6063, 226},
+ /* 5438 */ {I_VPSCATTERQQ, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6072, 225},
+ /* 5439 */ {I_VPSCATTERQQ, 2, {YMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6081, 225},
+ /* 5440 */ {I_VPSCATTERQQ, 2, {ZMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+6090, 226},
+ /* 5441 */ {I_VPSHUFB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22172, 229},
+ /* 5442 */ {I_VPSHUFB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22180, 229},
+ /* 5443 */ {I_VPSHUFB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22188, 229},
+ /* 5444 */ {I_VPSHUFB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22196, 229},
+ /* 5445 */ {I_VPSHUFB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22204, 230},
+ /* 5446 */ {I_VPSHUFB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22212, 230},
+ /* 5447 */ {I_VPSHUFD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6099, 225},
+ /* 5448 */ {I_VPSHUFD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6108, 225},
+ /* 5449 */ {I_VPSHUFD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6117, 226},
+ /* 5450 */ {I_VPSHUFHW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6126, 229},
+ /* 5451 */ {I_VPSHUFHW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6135, 229},
+ /* 5452 */ {I_VPSHUFHW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6144, 230},
+ /* 5453 */ {I_VPSHUFLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6153, 229},
+ /* 5454 */ {I_VPSHUFLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6162, 229},
+ /* 5455 */ {I_VPSHUFLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6171, 230},
+ /* 5456 */ {I_VPSLLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22220, 225},
+ /* 5457 */ {I_VPSLLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22228, 225},
+ /* 5458 */ {I_VPSLLD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22236, 225},
+ /* 5459 */ {I_VPSLLD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22244, 225},
+ /* 5460 */ {I_VPSLLD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22252, 226},
+ /* 5461 */ {I_VPSLLD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22260, 226},
+ /* 5462 */ {I_VPSLLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6180, 225},
+ /* 5463 */ {I_VPSLLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6189, 225},
+ /* 5464 */ {I_VPSLLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6198, 225},
+ /* 5465 */ {I_VPSLLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6207, 225},
+ /* 5466 */ {I_VPSLLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6216, 226},
+ /* 5467 */ {I_VPSLLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6225, 226},
+ /* 5468 */ {I_VPSLLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6234, 229},
+ /* 5469 */ {I_VPSLLDQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6243, 229},
+ /* 5470 */ {I_VPSLLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6252, 229},
+ /* 5471 */ {I_VPSLLDQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6261, 229},
+ /* 5472 */ {I_VPSLLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6270, 230},
+ /* 5473 */ {I_VPSLLDQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6279, 230},
+ /* 5474 */ {I_VPSLLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22268, 225},
+ /* 5475 */ {I_VPSLLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22276, 225},
+ /* 5476 */ {I_VPSLLQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22284, 225},
+ /* 5477 */ {I_VPSLLQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22292, 225},
+ /* 5478 */ {I_VPSLLQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22300, 226},
+ /* 5479 */ {I_VPSLLQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22308, 226},
+ /* 5480 */ {I_VPSLLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6288, 225},
+ /* 5481 */ {I_VPSLLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6297, 225},
+ /* 5482 */ {I_VPSLLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6306, 225},
+ /* 5483 */ {I_VPSLLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6315, 225},
+ /* 5484 */ {I_VPSLLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6324, 226},
+ /* 5485 */ {I_VPSLLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6333, 226},
+ /* 5486 */ {I_VPSLLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22316, 225},
+ /* 5487 */ {I_VPSLLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22324, 225},
+ /* 5488 */ {I_VPSLLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22332, 225},
+ /* 5489 */ {I_VPSLLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22340, 225},
+ /* 5490 */ {I_VPSLLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22348, 226},
+ /* 5491 */ {I_VPSLLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22356, 226},
+ /* 5492 */ {I_VPSLLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22364, 225},
+ /* 5493 */ {I_VPSLLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22372, 225},
+ /* 5494 */ {I_VPSLLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22380, 225},
+ /* 5495 */ {I_VPSLLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22388, 225},
+ /* 5496 */ {I_VPSLLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22396, 226},
+ /* 5497 */ {I_VPSLLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22404, 226},
+ /* 5498 */ {I_VPSLLVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22412, 229},
+ /* 5499 */ {I_VPSLLVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22420, 229},
+ /* 5500 */ {I_VPSLLVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22428, 229},
+ /* 5501 */ {I_VPSLLVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22436, 229},
+ /* 5502 */ {I_VPSLLVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22444, 230},
+ /* 5503 */ {I_VPSLLVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22452, 230},
+ /* 5504 */ {I_VPSLLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22460, 229},
+ /* 5505 */ {I_VPSLLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22468, 229},
+ /* 5506 */ {I_VPSLLW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22476, 229},
+ /* 5507 */ {I_VPSLLW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22484, 229},
+ /* 5508 */ {I_VPSLLW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22492, 230},
+ /* 5509 */ {I_VPSLLW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22500, 230},
+ /* 5510 */ {I_VPSLLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6342, 229},
+ /* 5511 */ {I_VPSLLW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6351, 229},
+ /* 5512 */ {I_VPSLLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6360, 229},
+ /* 5513 */ {I_VPSLLW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6369, 229},
+ /* 5514 */ {I_VPSLLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6378, 230},
+ /* 5515 */ {I_VPSLLW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6387, 230},
+ /* 5516 */ {I_VPSRAD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22508, 225},
+ /* 5517 */ {I_VPSRAD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22516, 225},
+ /* 5518 */ {I_VPSRAD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22524, 225},
+ /* 5519 */ {I_VPSRAD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22532, 225},
+ /* 5520 */ {I_VPSRAD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22540, 226},
+ /* 5521 */ {I_VPSRAD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22548, 226},
+ /* 5522 */ {I_VPSRAD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6396, 225},
+ /* 5523 */ {I_VPSRAD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6405, 225},
+ /* 5524 */ {I_VPSRAD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6414, 225},
+ /* 5525 */ {I_VPSRAD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6423, 225},
+ /* 5526 */ {I_VPSRAD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6432, 226},
+ /* 5527 */ {I_VPSRAD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6441, 226},
+ /* 5528 */ {I_VPSRAQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22556, 225},
+ /* 5529 */ {I_VPSRAQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22564, 225},
+ /* 5530 */ {I_VPSRAQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22572, 225},
+ /* 5531 */ {I_VPSRAQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22580, 225},
+ /* 5532 */ {I_VPSRAQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22588, 226},
+ /* 5533 */ {I_VPSRAQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22596, 226},
+ /* 5534 */ {I_VPSRAQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6450, 225},
+ /* 5535 */ {I_VPSRAQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6459, 225},
+ /* 5536 */ {I_VPSRAQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6468, 225},
+ /* 5537 */ {I_VPSRAQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6477, 225},
+ /* 5538 */ {I_VPSRAQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6486, 226},
+ /* 5539 */ {I_VPSRAQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6495, 226},
+ /* 5540 */ {I_VPSRAVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22604, 225},
+ /* 5541 */ {I_VPSRAVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22612, 225},
+ /* 5542 */ {I_VPSRAVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22620, 225},
+ /* 5543 */ {I_VPSRAVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22628, 225},
+ /* 5544 */ {I_VPSRAVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22636, 226},
+ /* 5545 */ {I_VPSRAVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22644, 226},
+ /* 5546 */ {I_VPSRAVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22652, 225},
+ /* 5547 */ {I_VPSRAVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22660, 225},
+ /* 5548 */ {I_VPSRAVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22668, 225},
+ /* 5549 */ {I_VPSRAVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22676, 225},
+ /* 5550 */ {I_VPSRAVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22684, 226},
+ /* 5551 */ {I_VPSRAVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22692, 226},
+ /* 5552 */ {I_VPSRAVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22700, 229},
+ /* 5553 */ {I_VPSRAVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22708, 229},
+ /* 5554 */ {I_VPSRAVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22716, 229},
+ /* 5555 */ {I_VPSRAVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22724, 229},
+ /* 5556 */ {I_VPSRAVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22732, 230},
+ /* 5557 */ {I_VPSRAVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22740, 230},
+ /* 5558 */ {I_VPSRAW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22748, 229},
+ /* 5559 */ {I_VPSRAW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22756, 229},
+ /* 5560 */ {I_VPSRAW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22764, 229},
+ /* 5561 */ {I_VPSRAW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22772, 229},
+ /* 5562 */ {I_VPSRAW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22780, 230},
+ /* 5563 */ {I_VPSRAW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22788, 230},
+ /* 5564 */ {I_VPSRAW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6504, 229},
+ /* 5565 */ {I_VPSRAW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6513, 229},
+ /* 5566 */ {I_VPSRAW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6522, 229},
+ /* 5567 */ {I_VPSRAW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6531, 229},
+ /* 5568 */ {I_VPSRAW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6540, 230},
+ /* 5569 */ {I_VPSRAW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6549, 230},
+ /* 5570 */ {I_VPSRLD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22796, 225},
+ /* 5571 */ {I_VPSRLD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22804, 225},
+ /* 5572 */ {I_VPSRLD, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22812, 225},
+ /* 5573 */ {I_VPSRLD, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22820, 225},
+ /* 5574 */ {I_VPSRLD, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22828, 226},
+ /* 5575 */ {I_VPSRLD, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22836, 226},
+ /* 5576 */ {I_VPSRLD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6558, 225},
+ /* 5577 */ {I_VPSRLD, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6567, 225},
+ /* 5578 */ {I_VPSRLD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6576, 225},
+ /* 5579 */ {I_VPSRLD, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6585, 225},
+ /* 5580 */ {I_VPSRLD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6594, 226},
+ /* 5581 */ {I_VPSRLD, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6603, 226},
+ /* 5582 */ {I_VPSRLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6612, 229},
+ /* 5583 */ {I_VPSRLDQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6621, 229},
+ /* 5584 */ {I_VPSRLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6630, 229},
+ /* 5585 */ {I_VPSRLDQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6639, 229},
+ /* 5586 */ {I_VPSRLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+6648, 230},
+ /* 5587 */ {I_VPSRLDQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, NO_DECORATOR, nasm_bytecodes+6657, 230},
+ /* 5588 */ {I_VPSRLQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22844, 225},
+ /* 5589 */ {I_VPSRLQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22852, 225},
+ /* 5590 */ {I_VPSRLQ, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22860, 225},
+ /* 5591 */ {I_VPSRLQ, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22868, 225},
+ /* 5592 */ {I_VPSRLQ, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22876, 226},
+ /* 5593 */ {I_VPSRLQ, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22884, 226},
+ /* 5594 */ {I_VPSRLQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6666, 225},
+ /* 5595 */ {I_VPSRLQ, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6675, 225},
+ /* 5596 */ {I_VPSRLQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6684, 225},
+ /* 5597 */ {I_VPSRLQ, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6693, 225},
+ /* 5598 */ {I_VPSRLQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6702, 226},
+ /* 5599 */ {I_VPSRLQ, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6711, 226},
+ /* 5600 */ {I_VPSRLVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22892, 225},
+ /* 5601 */ {I_VPSRLVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22900, 225},
+ /* 5602 */ {I_VPSRLVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22908, 225},
+ /* 5603 */ {I_VPSRLVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22916, 225},
+ /* 5604 */ {I_VPSRLVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+22924, 226},
+ /* 5605 */ {I_VPSRLVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+22932, 226},
+ /* 5606 */ {I_VPSRLVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22940, 225},
+ /* 5607 */ {I_VPSRLVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22948, 225},
+ /* 5608 */ {I_VPSRLVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22956, 225},
+ /* 5609 */ {I_VPSRLVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22964, 225},
+ /* 5610 */ {I_VPSRLVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+22972, 226},
+ /* 5611 */ {I_VPSRLVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+22980, 226},
+ /* 5612 */ {I_VPSRLVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22988, 229},
+ /* 5613 */ {I_VPSRLVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+22996, 229},
+ /* 5614 */ {I_VPSRLVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23004, 229},
+ /* 5615 */ {I_VPSRLVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23012, 229},
+ /* 5616 */ {I_VPSRLVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23020, 230},
+ /* 5617 */ {I_VPSRLVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23028, 230},
+ /* 5618 */ {I_VPSRLW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23036, 229},
+ /* 5619 */ {I_VPSRLW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23044, 229},
+ /* 5620 */ {I_VPSRLW, 3, {YMMREG,YMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23052, 229},
+ /* 5621 */ {I_VPSRLW, 2, {YMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23060, 229},
+ /* 5622 */ {I_VPSRLW, 3, {ZMMREG,ZMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23068, 230},
+ /* 5623 */ {I_VPSRLW, 2, {ZMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23076, 230},
+ /* 5624 */ {I_VPSRLW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6720, 229},
+ /* 5625 */ {I_VPSRLW, 2, {XMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6729, 229},
+ /* 5626 */ {I_VPSRLW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6738, 229},
+ /* 5627 */ {I_VPSRLW, 2, {YMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6747, 229},
+ /* 5628 */ {I_VPSRLW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6756, 230},
+ /* 5629 */ {I_VPSRLW, 2, {ZMMREG,IMMEDIATE|BITS8,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+6765, 230},
+ /* 5630 */ {I_VPSUBB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23084, 229},
+ /* 5631 */ {I_VPSUBB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23092, 229},
+ /* 5632 */ {I_VPSUBB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23100, 229},
+ /* 5633 */ {I_VPSUBB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23108, 229},
+ /* 5634 */ {I_VPSUBB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23116, 230},
+ /* 5635 */ {I_VPSUBB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23124, 230},
+ /* 5636 */ {I_VPSUBD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23132, 225},
+ /* 5637 */ {I_VPSUBD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23140, 225},
+ /* 5638 */ {I_VPSUBD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23148, 225},
+ /* 5639 */ {I_VPSUBD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23156, 225},
+ /* 5640 */ {I_VPSUBD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23164, 226},
+ /* 5641 */ {I_VPSUBD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23172, 226},
+ /* 5642 */ {I_VPSUBQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23180, 225},
+ /* 5643 */ {I_VPSUBQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23188, 225},
+ /* 5644 */ {I_VPSUBQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23196, 225},
+ /* 5645 */ {I_VPSUBQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23204, 225},
+ /* 5646 */ {I_VPSUBQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23212, 226},
+ /* 5647 */ {I_VPSUBQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23220, 226},
+ /* 5648 */ {I_VPSUBSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23228, 229},
+ /* 5649 */ {I_VPSUBSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23236, 229},
+ /* 5650 */ {I_VPSUBSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23244, 229},
+ /* 5651 */ {I_VPSUBSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23252, 229},
+ /* 5652 */ {I_VPSUBSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23260, 230},
+ /* 5653 */ {I_VPSUBSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23268, 230},
+ /* 5654 */ {I_VPSUBSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23276, 229},
+ /* 5655 */ {I_VPSUBSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23284, 229},
+ /* 5656 */ {I_VPSUBSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23292, 229},
+ /* 5657 */ {I_VPSUBSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23300, 229},
+ /* 5658 */ {I_VPSUBSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23308, 230},
+ /* 5659 */ {I_VPSUBSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23316, 230},
+ /* 5660 */ {I_VPSUBUSB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23324, 229},
+ /* 5661 */ {I_VPSUBUSB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23332, 229},
+ /* 5662 */ {I_VPSUBUSB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23340, 229},
+ /* 5663 */ {I_VPSUBUSB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23348, 229},
+ /* 5664 */ {I_VPSUBUSB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23356, 230},
+ /* 5665 */ {I_VPSUBUSB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23364, 230},
+ /* 5666 */ {I_VPSUBUSW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23372, 229},
+ /* 5667 */ {I_VPSUBUSW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23380, 229},
+ /* 5668 */ {I_VPSUBUSW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23388, 229},
+ /* 5669 */ {I_VPSUBUSW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23396, 229},
+ /* 5670 */ {I_VPSUBUSW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23404, 230},
+ /* 5671 */ {I_VPSUBUSW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23412, 230},
+ /* 5672 */ {I_VPSUBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23420, 229},
+ /* 5673 */ {I_VPSUBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23428, 229},
+ /* 5674 */ {I_VPSUBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23436, 229},
+ /* 5675 */ {I_VPSUBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23444, 229},
+ /* 5676 */ {I_VPSUBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23452, 230},
+ /* 5677 */ {I_VPSUBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23460, 230},
+ /* 5678 */ {I_VPTERNLOGD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6774, 225},
+ /* 5679 */ {I_VPTERNLOGD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6783, 225},
+ /* 5680 */ {I_VPTERNLOGD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6792, 226},
+ /* 5681 */ {I_VPTERNLOGQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6801, 225},
+ /* 5682 */ {I_VPTERNLOGQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6810, 225},
+ /* 5683 */ {I_VPTERNLOGQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6819, 226},
+ /* 5684 */ {I_VPTESTMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23468, 229},
+ /* 5685 */ {I_VPTESTMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23476, 229},
+ /* 5686 */ {I_VPTESTMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23484, 230},
+ /* 5687 */ {I_VPTESTMD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23492, 225},
+ /* 5688 */ {I_VPTESTMD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23500, 225},
+ /* 5689 */ {I_VPTESTMD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23508, 226},
+ /* 5690 */ {I_VPTESTMQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23516, 225},
+ /* 5691 */ {I_VPTESTMQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23524, 225},
+ /* 5692 */ {I_VPTESTMQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23532, 226},
+ /* 5693 */ {I_VPTESTMW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23540, 229},
+ /* 5694 */ {I_VPTESTMW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23548, 229},
+ /* 5695 */ {I_VPTESTMW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23556, 230},
+ /* 5696 */ {I_VPTESTNMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23564, 229},
+ /* 5697 */ {I_VPTESTNMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23572, 229},
+ /* 5698 */ {I_VPTESTNMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23580, 230},
+ /* 5699 */ {I_VPTESTNMD, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23588, 225},
+ /* 5700 */ {I_VPTESTNMD, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23596, 225},
+ /* 5701 */ {I_VPTESTNMD, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B32,0,0}, nasm_bytecodes+23604, 226},
+ /* 5702 */ {I_VPTESTNMQ, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23612, 225},
+ /* 5703 */ {I_VPTESTNMQ, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23620, 225},
+ /* 5704 */ {I_VPTESTNMQ, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,B64,0,0}, nasm_bytecodes+23628, 226},
+ /* 5705 */ {I_VPTESTNMW, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23636, 229},
+ /* 5706 */ {I_VPTESTNMW, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23644, 229},
+ /* 5707 */ {I_VPTESTNMW, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+23652, 230},
+ /* 5708 */ {I_VPUNPCKHBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23660, 229},
+ /* 5709 */ {I_VPUNPCKHBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23668, 229},
+ /* 5710 */ {I_VPUNPCKHBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23676, 229},
+ /* 5711 */ {I_VPUNPCKHBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23684, 229},
+ /* 5712 */ {I_VPUNPCKHBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23692, 230},
+ /* 5713 */ {I_VPUNPCKHBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23700, 230},
+ /* 5714 */ {I_VPUNPCKHDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23708, 225},
+ /* 5715 */ {I_VPUNPCKHDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23716, 225},
+ /* 5716 */ {I_VPUNPCKHDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23724, 225},
+ /* 5717 */ {I_VPUNPCKHDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23732, 225},
+ /* 5718 */ {I_VPUNPCKHDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23740, 226},
+ /* 5719 */ {I_VPUNPCKHDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23748, 226},
+ /* 5720 */ {I_VPUNPCKHQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23756, 225},
+ /* 5721 */ {I_VPUNPCKHQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23764, 225},
+ /* 5722 */ {I_VPUNPCKHQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23772, 225},
+ /* 5723 */ {I_VPUNPCKHQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23780, 225},
+ /* 5724 */ {I_VPUNPCKHQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23788, 226},
+ /* 5725 */ {I_VPUNPCKHQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23796, 226},
+ /* 5726 */ {I_VPUNPCKHWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23804, 229},
+ /* 5727 */ {I_VPUNPCKHWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23812, 229},
+ /* 5728 */ {I_VPUNPCKHWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23820, 229},
+ /* 5729 */ {I_VPUNPCKHWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23828, 229},
+ /* 5730 */ {I_VPUNPCKHWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23836, 230},
+ /* 5731 */ {I_VPUNPCKHWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23844, 230},
+ /* 5732 */ {I_VPUNPCKLBW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23852, 229},
+ /* 5733 */ {I_VPUNPCKLBW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23860, 229},
+ /* 5734 */ {I_VPUNPCKLBW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23868, 229},
+ /* 5735 */ {I_VPUNPCKLBW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23876, 229},
+ /* 5736 */ {I_VPUNPCKLBW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23884, 230},
+ /* 5737 */ {I_VPUNPCKLBW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23892, 230},
+ /* 5738 */ {I_VPUNPCKLDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23900, 225},
+ /* 5739 */ {I_VPUNPCKLDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23908, 225},
+ /* 5740 */ {I_VPUNPCKLDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23916, 225},
+ /* 5741 */ {I_VPUNPCKLDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23924, 225},
+ /* 5742 */ {I_VPUNPCKLDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+23932, 226},
+ /* 5743 */ {I_VPUNPCKLDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+23940, 226},
+ /* 5744 */ {I_VPUNPCKLQDQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23948, 225},
+ /* 5745 */ {I_VPUNPCKLQDQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23956, 225},
+ /* 5746 */ {I_VPUNPCKLQDQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23964, 225},
+ /* 5747 */ {I_VPUNPCKLQDQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23972, 225},
+ /* 5748 */ {I_VPUNPCKLQDQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+23980, 226},
+ /* 5749 */ {I_VPUNPCKLQDQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+23988, 226},
+ /* 5750 */ {I_VPUNPCKLWD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+23996, 229},
+ /* 5751 */ {I_VPUNPCKLWD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24004, 229},
+ /* 5752 */ {I_VPUNPCKLWD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24012, 229},
+ /* 5753 */ {I_VPUNPCKLWD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24020, 229},
+ /* 5754 */ {I_VPUNPCKLWD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24028, 230},
+ /* 5755 */ {I_VPUNPCKLWD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24036, 230},
+ /* 5756 */ {I_VPXORD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24044, 225},
+ /* 5757 */ {I_VPXORD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24052, 225},
+ /* 5758 */ {I_VPXORD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24060, 225},
+ /* 5759 */ {I_VPXORD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24068, 225},
+ /* 5760 */ {I_VPXORD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24076, 226},
+ /* 5761 */ {I_VPXORD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24084, 226},
+ /* 5762 */ {I_VPXORQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24092, 225},
+ /* 5763 */ {I_VPXORQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24100, 225},
+ /* 5764 */ {I_VPXORQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24108, 225},
+ /* 5765 */ {I_VPXORQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24116, 225},
+ /* 5766 */ {I_VPXORQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24124, 226},
+ /* 5767 */ {I_VPXORQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24132, 226},
+ /* 5768 */ {I_VRANGEPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6828, 227},
+ /* 5769 */ {I_VRANGEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6837, 227},
+ /* 5770 */ {I_VRANGEPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+6846, 227},
+ /* 5771 */ {I_VRANGEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6855, 227},
+ /* 5772 */ {I_VRANGEPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64|SAE,0,0}, nasm_bytecodes+6864, 228},
+ /* 5773 */ {I_VRANGEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+6873, 228},
+ /* 5774 */ {I_VRANGEPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6882, 227},
+ /* 5775 */ {I_VRANGEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6891, 227},
+ /* 5776 */ {I_VRANGEPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+6900, 227},
+ /* 5777 */ {I_VRANGEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6909, 227},
+ /* 5778 */ {I_VRANGEPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32|SAE,0,0}, nasm_bytecodes+6918, 228},
+ /* 5779 */ {I_VRANGEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+6927, 228},
+ /* 5780 */ {I_VRANGESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+6936, 228},
+ /* 5781 */ {I_VRANGESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+6945, 228},
+ /* 5782 */ {I_VRANGESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+6954, 228},
+ /* 5783 */ {I_VRANGESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+6963, 228},
+ /* 5784 */ {I_VRCP14PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24140, 225},
+ /* 5785 */ {I_VRCP14PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24148, 225},
+ /* 5786 */ {I_VRCP14PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24156, 226},
+ /* 5787 */ {I_VRCP14PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24164, 225},
+ /* 5788 */ {I_VRCP14PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24172, 225},
+ /* 5789 */ {I_VRCP14PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24180, 226},
+ /* 5790 */ {I_VRCP14SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24188, 226},
+ /* 5791 */ {I_VRCP14SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24196, 226},
+ /* 5792 */ {I_VRCP14SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24204, 226},
+ /* 5793 */ {I_VRCP14SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24212, 226},
+ /* 5794 */ {I_VRCP28PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+24220, 231},
+ /* 5795 */ {I_VRCP28PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+24228, 231},
+ /* 5796 */ {I_VRCP28SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24236, 231},
+ /* 5797 */ {I_VRCP28SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24244, 231},
+ /* 5798 */ {I_VRCP28SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24252, 231},
+ /* 5799 */ {I_VRCP28SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24260, 231},
+ /* 5800 */ {I_VREDUCEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6972, 227},
+ /* 5801 */ {I_VREDUCEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+6981, 227},
+ /* 5802 */ {I_VREDUCEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+6990, 228},
+ /* 5803 */ {I_VREDUCEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+6999, 227},
+ /* 5804 */ {I_VREDUCEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7008, 227},
+ /* 5805 */ {I_VREDUCEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+7017, 228},
+ /* 5806 */ {I_VREDUCESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7026, 228},
+ /* 5807 */ {I_VREDUCESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7035, 228},
+ /* 5808 */ {I_VREDUCESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7044, 228},
+ /* 5809 */ {I_VREDUCESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7053, 228},
+ /* 5810 */ {I_VRNDSCALEPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7062, 225},
+ /* 5811 */ {I_VRNDSCALEPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7071, 225},
+ /* 5812 */ {I_VRNDSCALEPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+7080, 226},
+ /* 5813 */ {I_VRNDSCALEPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7089, 225},
+ /* 5814 */ {I_VRNDSCALEPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7098, 225},
+ /* 5815 */ {I_VRNDSCALEPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+7107, 226},
+ /* 5816 */ {I_VRNDSCALESD, 4, {XMMREG,XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7116, 226},
+ /* 5817 */ {I_VRNDSCALESD, 3, {XMMREG,RM_XMM|BITS64,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7125, 226},
+ /* 5818 */ {I_VRNDSCALESS, 4, {XMMREG,XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+7134, 226},
+ /* 5819 */ {I_VRNDSCALESS, 3, {XMMREG,RM_XMM|BITS32,IMMEDIATE|BITS8,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+7143, 226},
+ /* 5820 */ {I_VRSQRT14PD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24268, 225},
+ /* 5821 */ {I_VRSQRT14PD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24276, 225},
+ /* 5822 */ {I_VRSQRT14PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24284, 226},
+ /* 5823 */ {I_VRSQRT14PS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24292, 225},
+ /* 5824 */ {I_VRSQRT14PS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24300, 225},
+ /* 5825 */ {I_VRSQRT14PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24308, 226},
+ /* 5826 */ {I_VRSQRT14SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24316, 226},
+ /* 5827 */ {I_VRSQRT14SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24324, 226},
+ /* 5828 */ {I_VRSQRT14SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24332, 226},
+ /* 5829 */ {I_VRSQRT14SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+24340, 226},
+ /* 5830 */ {I_VRSQRT28PD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|SAE,0,0,0}, nasm_bytecodes+24348, 231},
+ /* 5831 */ {I_VRSQRT28PS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|SAE,0,0,0}, nasm_bytecodes+24356, 231},
+ /* 5832 */ {I_VRSQRT28SD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24364, 231},
+ /* 5833 */ {I_VRSQRT28SD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24372, 231},
+ /* 5834 */ {I_VRSQRT28SS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,SAE,0,0}, nasm_bytecodes+24380, 231},
+ /* 5835 */ {I_VRSQRT28SS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,SAE,0,0,0}, nasm_bytecodes+24388, 231},
+ /* 5836 */ {I_VSCALEFPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24396, 225},
+ /* 5837 */ {I_VSCALEFPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24404, 225},
+ /* 5838 */ {I_VSCALEFPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24412, 225},
+ /* 5839 */ {I_VSCALEFPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24420, 225},
+ /* 5840 */ {I_VSCALEFPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+24428, 226},
+ /* 5841 */ {I_VSCALEFPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24436, 226},
+ /* 5842 */ {I_VSCALEFPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24444, 225},
+ /* 5843 */ {I_VSCALEFPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24452, 225},
+ /* 5844 */ {I_VSCALEFPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24460, 225},
+ /* 5845 */ {I_VSCALEFPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24468, 225},
+ /* 5846 */ {I_VSCALEFPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+24476, 226},
+ /* 5847 */ {I_VSCALEFPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24484, 226},
+ /* 5848 */ {I_VSCALEFSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24492, 226},
+ /* 5849 */ {I_VSCALEFSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24500, 226},
+ /* 5850 */ {I_VSCALEFSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24508, 226},
+ /* 5851 */ {I_VSCALEFSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24516, 226},
+ /* 5852 */ {I_VSCATTERDPD, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7152, 225},
+ /* 5853 */ {I_VSCATTERDPD, 2, {XMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7161, 225},
+ /* 5854 */ {I_VSCATTERDPD, 2, {YMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7170, 226},
+ /* 5855 */ {I_VSCATTERDPS, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7179, 225},
+ /* 5856 */ {I_VSCATTERDPS, 2, {YMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7188, 225},
+ /* 5857 */ {I_VSCATTERDPS, 2, {ZMEM|BITS32,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7197, 226},
+ /* 5858 */ {I_VSCATTERPF0DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7206, 232},
+ /* 5859 */ {I_VSCATTERPF0DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7215, 232},
+ /* 5860 */ {I_VSCATTERPF0QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7224, 232},
+ /* 5861 */ {I_VSCATTERPF0QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7233, 232},
+ /* 5862 */ {I_VSCATTERPF1DPD, 1, {YMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7242, 232},
+ /* 5863 */ {I_VSCATTERPF1DPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7251, 232},
+ /* 5864 */ {I_VSCATTERPF1QPD, 1, {ZMEM|BITS64,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7260, 232},
+ /* 5865 */ {I_VSCATTERPF1QPS, 1, {ZMEM|BITS32,0,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7269, 232},
+ /* 5866 */ {I_VSCATTERQPD, 2, {XMEM|BITS64,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7278, 225},
+ /* 5867 */ {I_VSCATTERQPD, 2, {YMEM|BITS64,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7287, 225},
+ /* 5868 */ {I_VSCATTERQPD, 2, {ZMEM|BITS64,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7296, 226},
+ /* 5869 */ {I_VSCATTERQPS, 2, {XMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7305, 225},
+ /* 5870 */ {I_VSCATTERQPS, 2, {YMEM|BITS32,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7314, 225},
+ /* 5871 */ {I_VSCATTERQPS, 2, {ZMEM|BITS32,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+7323, 226},
+ /* 5872 */ {I_VSHUFF32X4, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7332, 225},
+ /* 5873 */ {I_VSHUFF32X4, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7341, 225},
+ /* 5874 */ {I_VSHUFF32X4, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7350, 226},
+ /* 5875 */ {I_VSHUFF32X4, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7359, 226},
+ /* 5876 */ {I_VSHUFF64X2, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7368, 225},
+ /* 5877 */ {I_VSHUFF64X2, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7377, 225},
+ /* 5878 */ {I_VSHUFF64X2, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7386, 226},
+ /* 5879 */ {I_VSHUFF64X2, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7395, 226},
+ /* 5880 */ {I_VSHUFI32X4, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7404, 225},
+ /* 5881 */ {I_VSHUFI32X4, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7413, 225},
+ /* 5882 */ {I_VSHUFI32X4, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7422, 226},
+ /* 5883 */ {I_VSHUFI32X4, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7431, 226},
+ /* 5884 */ {I_VSHUFI64X2, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7440, 225},
+ /* 5885 */ {I_VSHUFI64X2, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7449, 225},
+ /* 5886 */ {I_VSHUFI64X2, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7458, 226},
+ /* 5887 */ {I_VSHUFI64X2, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7467, 226},
+ /* 5888 */ {I_VSHUFPD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7476, 225},
+ /* 5889 */ {I_VSHUFPD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7485, 225},
+ /* 5890 */ {I_VSHUFPD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7494, 225},
+ /* 5891 */ {I_VSHUFPD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7503, 225},
+ /* 5892 */ {I_VSHUFPD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7512, 226},
+ /* 5893 */ {I_VSHUFPD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7521, 226},
+ /* 5894 */ {I_VSHUFPS, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7530, 225},
+ /* 5895 */ {I_VSHUFPS, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7539, 225},
+ /* 5896 */ {I_VSHUFPS, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7548, 225},
+ /* 5897 */ {I_VSHUFPS, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7557, 225},
+ /* 5898 */ {I_VSHUFPS, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7566, 226},
+ /* 5899 */ {I_VSHUFPS, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7575, 226},
+ /* 5900 */ {I_VSQRTPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24524, 225},
+ /* 5901 */ {I_VSQRTPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24532, 225},
+ /* 5902 */ {I_VSQRTPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24540, 226},
+ /* 5903 */ {I_VSQRTPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24548, 225},
+ /* 5904 */ {I_VSQRTPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24556, 225},
+ /* 5905 */ {I_VSQRTPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24564, 226},
+ /* 5906 */ {I_VSQRTSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24572, 226},
+ /* 5907 */ {I_VSQRTSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24580, 226},
+ /* 5908 */ {I_VSQRTSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24588, 226},
+ /* 5909 */ {I_VSQRTSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24596, 226},
+ /* 5910 */ {I_VSUBPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24604, 225},
+ /* 5911 */ {I_VSUBPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24612, 225},
+ /* 5912 */ {I_VSUBPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24620, 225},
+ /* 5913 */ {I_VSUBPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24628, 225},
+ /* 5914 */ {I_VSUBPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64|ER,0,0}, nasm_bytecodes+24636, 226},
+ /* 5915 */ {I_VSUBPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64|ER,0,0,0}, nasm_bytecodes+24644, 226},
+ /* 5916 */ {I_VSUBPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24652, 225},
+ /* 5917 */ {I_VSUBPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24660, 225},
+ /* 5918 */ {I_VSUBPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24668, 225},
+ /* 5919 */ {I_VSUBPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24676, 225},
+ /* 5920 */ {I_VSUBPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32|ER,0,0}, nasm_bytecodes+24684, 226},
+ /* 5921 */ {I_VSUBPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32|ER,0,0,0}, nasm_bytecodes+24692, 226},
+ /* 5922 */ {I_VSUBSD, 3, {XMMREG,XMMREG,RM_XMM|BITS64,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24700, 226},
+ /* 5923 */ {I_VSUBSD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24708, 226},
+ /* 5924 */ {I_VSUBSS, 3, {XMMREG,XMMREG,RM_XMM|BITS32,0,0}, {MASK|Z,0,ER,0,0}, nasm_bytecodes+24716, 226},
+ /* 5925 */ {I_VSUBSS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {MASK|Z,ER,0,0,0}, nasm_bytecodes+24724, 226},
+ /* 5926 */ {I_VUCOMISD, 2, {XMMREG,RM_XMM|BITS64,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+24732, 226},
+ /* 5927 */ {I_VUCOMISS, 2, {XMMREG,RM_XMM|BITS32,0,0,0}, {0,SAE,0,0,0}, nasm_bytecodes+24740, 226},
+ /* 5928 */ {I_VUNPCKHPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24748, 225},
+ /* 5929 */ {I_VUNPCKHPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24756, 225},
+ /* 5930 */ {I_VUNPCKHPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24764, 225},
+ /* 5931 */ {I_VUNPCKHPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24772, 225},
+ /* 5932 */ {I_VUNPCKHPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24780, 226},
+ /* 5933 */ {I_VUNPCKHPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24788, 226},
+ /* 5934 */ {I_VUNPCKHPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24796, 225},
+ /* 5935 */ {I_VUNPCKHPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24804, 225},
+ /* 5936 */ {I_VUNPCKHPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24812, 225},
+ /* 5937 */ {I_VUNPCKHPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24820, 225},
+ /* 5938 */ {I_VUNPCKHPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24828, 226},
+ /* 5939 */ {I_VUNPCKHPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24836, 226},
+ /* 5940 */ {I_VUNPCKLPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24844, 225},
+ /* 5941 */ {I_VUNPCKLPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24852, 225},
+ /* 5942 */ {I_VUNPCKLPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24860, 225},
+ /* 5943 */ {I_VUNPCKLPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24868, 225},
+ /* 5944 */ {I_VUNPCKLPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24876, 226},
+ /* 5945 */ {I_VUNPCKLPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24884, 226},
+ /* 5946 */ {I_VUNPCKLPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24892, 225},
+ /* 5947 */ {I_VUNPCKLPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24900, 225},
+ /* 5948 */ {I_VUNPCKLPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24908, 225},
+ /* 5949 */ {I_VUNPCKLPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24916, 225},
+ /* 5950 */ {I_VUNPCKLPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24924, 226},
+ /* 5951 */ {I_VUNPCKLPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24932, 226},
+ /* 5952 */ {I_VXORPD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24940, 227},
+ /* 5953 */ {I_VXORPD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24948, 227},
+ /* 5954 */ {I_VXORPD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24956, 227},
+ /* 5955 */ {I_VXORPD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24964, 227},
+ /* 5956 */ {I_VXORPD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+24972, 228},
+ /* 5957 */ {I_VXORPD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+24980, 228},
+ /* 5958 */ {I_VXORPS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+24988, 227},
+ /* 5959 */ {I_VXORPS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+24996, 227},
+ /* 5960 */ {I_VXORPS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25004, 227},
+ /* 5961 */ {I_VXORPS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25012, 227},
+ /* 5962 */ {I_VXORPS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25020, 228},
+ /* 5963 */ {I_VXORPS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25028, 228},
+ /* 5964 */ {I_RDPKRU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40506, 239},
+ /* 5965 */ {I_WRPKRU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40511, 239},
+ /* 5966 */ {I_RDPID, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34932, 240},
+ /* 5967 */ {I_RDPID, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34931, 239},
+ /* 5968 */ {I_RDPID, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34932, 241},
+ /* 5969 */ {I_CLFLUSHOPT, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37528, 133},
+ /* 5970 */ {I_CLWB, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37534, 133},
+ /* 5971 */ {I_PCOMMIT, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37540, 242},
+ /* 5972 */ {I_CLZERO, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40516, 243},
+ /* 5973 */ {I_PTWRITE, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26840, 133},
+ /* 5974 */ {I_PTWRITE, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+26839, 239},
+ /* 5975 */ {I_CLDEMOTE, 1, {MEMORY,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37546, 133},
+ /* 5976 */ {I_MOVDIRI, 2, {MEMORY|BITS32,REG_GPR|BITS32,0,0,0}, NO_DECORATOR, nasm_bytecodes+34938, 244},
+ /* 5977 */ {I_MOVDIRI, 2, {MEMORY|BITS64,REG_GPR|BITS64,0,0,0}, NO_DECORATOR, nasm_bytecodes+34945, 245},
+ /* 5978 */ {I_MOVDIR64B, 2, {REG_GPR|BITS16,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25036, 240},
+ /* 5979 */ {I_MOVDIR64B, 2, {REG_GPR|BITS32,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25044, 133},
+ /* 5980 */ {I_MOVDIR64B, 2, {REG_GPR|BITS64,MEMORY|BITS512,0,0,0}, NO_DECORATOR, nasm_bytecodes+25052, 239},
+ /* 5981 */ {I_PCONFIG, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37552, 133},
+ /* 5982 */ {I_TPAUSE, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37534, 133},
+ /* 5983 */ {I_UMONITOR, 1, {REG_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34952, 240},
+ /* 5984 */ {I_UMONITOR, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34959, 133},
+ /* 5985 */ {I_UMONITOR, 1, {REG_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+34966, 239},
+ /* 5986 */ {I_UMWAIT, 1, {REG_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37558, 133},
+ /* 5987 */ {I_WBNOINVD, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+40521, 133},
+ /* 5988 */ {I_GF2P8AFFINEINVQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25060, 246},
+ /* 5989 */ {I_VGF2P8AFFINEINVQB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25068, 247},
+ /* 5990 */ {I_VGF2P8AFFINEINVQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25076, 247},
+ /* 5991 */ {I_VGF2P8AFFINEINVQB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25084, 247},
+ /* 5992 */ {I_VGF2P8AFFINEINVQB, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25092, 247},
+ /* 5993 */ {I_VGF2P8AFFINEINVQB, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7584, 248},
+ /* 5994 */ {I_VGF2P8AFFINEINVQB, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7593, 248},
+ /* 5995 */ {I_VGF2P8AFFINEINVQB, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7602, 248},
+ /* 5996 */ {I_VGF2P8AFFINEINVQB, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7611, 248},
+ /* 5997 */ {I_VGF2P8AFFINEINVQB, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7620, 249},
+ /* 5998 */ {I_VGF2P8AFFINEINVQB, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7629, 249},
+ /* 5999 */ {I_GF2P8AFFINEQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25100, 246},
+ /* 6000 */ {I_VGF2P8AFFINEQB, 4, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25108, 247},
+ /* 6001 */ {I_VGF2P8AFFINEQB, 3, {XMM_L16,RM_XMM_L16|BITS128,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25116, 247},
+ /* 6002 */ {I_VGF2P8AFFINEQB, 4, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0}, NO_DECORATOR, nasm_bytecodes+25124, 247},
+ /* 6003 */ {I_VGF2P8AFFINEQB, 3, {YMM_L16,RM_YMM_L16|BITS256,IMMEDIATE|BITS8,0,0}, NO_DECORATOR, nasm_bytecodes+25132, 247},
+ /* 6004 */ {I_VGF2P8AFFINEQB, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7638, 248},
+ /* 6005 */ {I_VGF2P8AFFINEQB, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7647, 248},
+ /* 6006 */ {I_VGF2P8AFFINEQB, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7656, 248},
+ /* 6007 */ {I_VGF2P8AFFINEQB, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7665, 248},
+ /* 6008 */ {I_VGF2P8AFFINEQB, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7674, 249},
+ /* 6009 */ {I_VGF2P8AFFINEQB, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7683, 249},
+ /* 6010 */ {I_GF2P8MULB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34973, 246},
+ /* 6011 */ {I_VGF2P8MULB, 3, {XMM_L16,XMM_L16,RM_XMM_L16|BITS128,0,0}, NO_DECORATOR, nasm_bytecodes+34980, 247},
+ /* 6012 */ {I_VGF2P8MULB, 2, {XMM_L16,RM_XMM_L16|BITS128,0,0,0}, NO_DECORATOR, nasm_bytecodes+34987, 247},
+ /* 6013 */ {I_VGF2P8MULB, 3, {YMM_L16,YMM_L16,RM_YMM_L16|BITS256,0,0}, NO_DECORATOR, nasm_bytecodes+34994, 247},
+ /* 6014 */ {I_VGF2P8MULB, 2, {YMM_L16,RM_YMM_L16|BITS256,0,0,0}, NO_DECORATOR, nasm_bytecodes+35001, 247},
+ /* 6015 */ {I_VGF2P8MULB, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25140, 248},
+ /* 6016 */ {I_VGF2P8MULB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25148, 248},
+ /* 6017 */ {I_VGF2P8MULB, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25156, 248},
+ /* 6018 */ {I_VGF2P8MULB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25164, 248},
+ /* 6019 */ {I_VGF2P8MULB, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25172, 249},
+ /* 6020 */ {I_VGF2P8MULB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25180, 249},
+ /* 6021 */ {I_VPCOMPRESSB, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25188, 250},
+ /* 6022 */ {I_VPCOMPRESSB, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25196, 250},
+ /* 6023 */ {I_VPCOMPRESSB, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25204, 251},
+ /* 6024 */ {I_VPCOMPRESSB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25212, 250},
+ /* 6025 */ {I_VPCOMPRESSB, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25220, 250},
+ /* 6026 */ {I_VPCOMPRESSB, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25228, 251},
+ /* 6027 */ {I_VPCOMPRESSW, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25236, 250},
+ /* 6028 */ {I_VPCOMPRESSW, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25244, 250},
+ /* 6029 */ {I_VPCOMPRESSW, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25252, 251},
+ /* 6030 */ {I_VPCOMPRESSW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25260, 250},
+ /* 6031 */ {I_VPCOMPRESSW, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25268, 250},
+ /* 6032 */ {I_VPCOMPRESSW, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25276, 251},
+ /* 6033 */ {I_VPEXPANDB, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25284, 250},
+ /* 6034 */ {I_VPEXPANDB, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25292, 250},
+ /* 6035 */ {I_VPEXPANDB, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25300, 251},
+ /* 6036 */ {I_VPEXPANDB, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25308, 250},
+ /* 6037 */ {I_VPEXPANDB, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25316, 250},
+ /* 6038 */ {I_VPEXPANDB, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25324, 251},
+ /* 6039 */ {I_VPEXPANDW, 2, {MEMORY|BITS128,XMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25332, 250},
+ /* 6040 */ {I_VPEXPANDW, 2, {MEMORY|BITS256,YMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25340, 250},
+ /* 6041 */ {I_VPEXPANDW, 2, {MEMORY|BITS512,ZMMREG,0,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25348, 251},
+ /* 6042 */ {I_VPEXPANDW, 2, {XMMREG,XMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25356, 250},
+ /* 6043 */ {I_VPEXPANDW, 2, {YMMREG,YMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25364, 250},
+ /* 6044 */ {I_VPEXPANDW, 2, {ZMMREG,ZMMREG,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25372, 251},
+ /* 6045 */ {I_VPSHLDW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7692, 250},
+ /* 6046 */ {I_VPSHLDW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7701, 250},
+ /* 6047 */ {I_VPSHLDW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7710, 250},
+ /* 6048 */ {I_VPSHLDW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7719, 250},
+ /* 6049 */ {I_VPSHLDW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7728, 251},
+ /* 6050 */ {I_VPSHLDW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7737, 251},
+ /* 6051 */ {I_VPSHLDD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7746, 250},
+ /* 6052 */ {I_VPSHLDD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7755, 250},
+ /* 6053 */ {I_VPSHLDD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7764, 250},
+ /* 6054 */ {I_VPSHLDD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7773, 250},
+ /* 6055 */ {I_VPSHLDD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7782, 251},
+ /* 6056 */ {I_VPSHLDD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7791, 251},
+ /* 6057 */ {I_VPSHLDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7800, 250},
+ /* 6058 */ {I_VPSHLDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7809, 250},
+ /* 6059 */ {I_VPSHLDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7818, 250},
+ /* 6060 */ {I_VPSHLDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7827, 250},
+ /* 6061 */ {I_VPSHLDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7836, 251},
+ /* 6062 */ {I_VPSHLDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7845, 251},
+ /* 6063 */ {I_VPSHLDVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7854, 250},
+ /* 6064 */ {I_VPSHLDVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7863, 250},
+ /* 6065 */ {I_VPSHLDVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7872, 250},
+ /* 6066 */ {I_VPSHLDVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7881, 250},
+ /* 6067 */ {I_VPSHLDVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7890, 251},
+ /* 6068 */ {I_VPSHLDVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+7899, 251},
+ /* 6069 */ {I_VPSHLDVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7908, 250},
+ /* 6070 */ {I_VPSHLDVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7917, 250},
+ /* 6071 */ {I_VPSHLDVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7926, 250},
+ /* 6072 */ {I_VPSHLDVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7935, 250},
+ /* 6073 */ {I_VPSHLDVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+7944, 251},
+ /* 6074 */ {I_VPSHLDVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+7953, 251},
+ /* 6075 */ {I_VPSHLDVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7962, 250},
+ /* 6076 */ {I_VPSHLDVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7971, 250},
+ /* 6077 */ {I_VPSHLDVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7980, 250},
+ /* 6078 */ {I_VPSHLDVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+7989, 250},
+ /* 6079 */ {I_VPSHLDVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+7998, 251},
+ /* 6080 */ {I_VPSHLDVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8007, 251},
+ /* 6081 */ {I_VPSHRDW, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8016, 250},
+ /* 6082 */ {I_VPSHRDW, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8025, 250},
+ /* 6083 */ {I_VPSHRDW, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8034, 250},
+ /* 6084 */ {I_VPSHRDW, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8043, 250},
+ /* 6085 */ {I_VPSHRDW, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8052, 251},
+ /* 6086 */ {I_VPSHRDW, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8061, 251},
+ /* 6087 */ {I_VPSHRDD, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8070, 250},
+ /* 6088 */ {I_VPSHRDD, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8079, 250},
+ /* 6089 */ {I_VPSHRDD, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8088, 250},
+ /* 6090 */ {I_VPSHRDD, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8097, 250},
+ /* 6091 */ {I_VPSHRDD, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8106, 251},
+ /* 6092 */ {I_VPSHRDD, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8115, 251},
+ /* 6093 */ {I_VPSHRDQ, 4, {XMMREG,XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8124, 250},
+ /* 6094 */ {I_VPSHRDQ, 3, {XMMREG,RM_XMM|BITS128,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8133, 250},
+ /* 6095 */ {I_VPSHRDQ, 4, {YMMREG,YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8142, 250},
+ /* 6096 */ {I_VPSHRDQ, 3, {YMMREG,RM_YMM|BITS256,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8151, 250},
+ /* 6097 */ {I_VPSHRDQ, 4, {ZMMREG,ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8160, 251},
+ /* 6098 */ {I_VPSHRDQ, 3, {ZMMREG,RM_ZMM|BITS512,IMMEDIATE|BITS8,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8169, 251},
+ /* 6099 */ {I_VPSHRDVW, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8178, 250},
+ /* 6100 */ {I_VPSHRDVW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8187, 250},
+ /* 6101 */ {I_VPSHRDVW, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8196, 250},
+ /* 6102 */ {I_VPSHRDVW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8205, 250},
+ /* 6103 */ {I_VPSHRDVW, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8214, 251},
+ /* 6104 */ {I_VPSHRDVW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+8223, 251},
+ /* 6105 */ {I_VPSHRDVD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8232, 250},
+ /* 6106 */ {I_VPSHRDVD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8241, 250},
+ /* 6107 */ {I_VPSHRDVD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8250, 250},
+ /* 6108 */ {I_VPSHRDVD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8259, 250},
+ /* 6109 */ {I_VPSHRDVD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+8268, 251},
+ /* 6110 */ {I_VPSHRDVD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+8277, 251},
+ /* 6111 */ {I_VPSHRDVQ, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8286, 250},
+ /* 6112 */ {I_VPSHRDVQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8295, 250},
+ /* 6113 */ {I_VPSHRDVQ, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8304, 250},
+ /* 6114 */ {I_VPSHRDVQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8313, 250},
+ /* 6115 */ {I_VPSHRDVQ, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B64,0,0}, nasm_bytecodes+8322, 251},
+ /* 6116 */ {I_VPSHRDVQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B64,0,0,0}, nasm_bytecodes+8331, 251},
+ /* 6117 */ {I_VPDPBUSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25380, 252},
+ /* 6118 */ {I_VPDPBUSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25388, 252},
+ /* 6119 */ {I_VPDPBUSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25396, 252},
+ /* 6120 */ {I_VPDPBUSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25404, 252},
+ /* 6121 */ {I_VPDPBUSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25412, 253},
+ /* 6122 */ {I_VPDPBUSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25420, 253},
+ /* 6123 */ {I_VPDPBUSDS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25428, 252},
+ /* 6124 */ {I_VPDPBUSDS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25436, 252},
+ /* 6125 */ {I_VPDPBUSDS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25444, 252},
+ /* 6126 */ {I_VPDPBUSDS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25452, 252},
+ /* 6127 */ {I_VPDPBUSDS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25460, 253},
+ /* 6128 */ {I_VPDPBUSDS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25468, 253},
+ /* 6129 */ {I_VPDPWSSD, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25476, 252},
+ /* 6130 */ {I_VPDPWSSD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25484, 252},
+ /* 6131 */ {I_VPDPWSSD, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25492, 252},
+ /* 6132 */ {I_VPDPWSSD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25500, 252},
+ /* 6133 */ {I_VPDPWSSD, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25508, 253},
+ /* 6134 */ {I_VPDPWSSD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25516, 253},
+ /* 6135 */ {I_VPDPWSSDS, 3, {XMMREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25524, 252},
+ /* 6136 */ {I_VPDPWSSDS, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25532, 252},
+ /* 6137 */ {I_VPDPWSSDS, 3, {YMMREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25540, 252},
+ /* 6138 */ {I_VPDPWSSDS, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25548, 252},
+ /* 6139 */ {I_VPDPWSSDS, 3, {ZMMREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK|Z,0,B32,0,0}, nasm_bytecodes+25556, 253},
+ /* 6140 */ {I_VPDPWSSDS, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,B32,0,0,0}, nasm_bytecodes+25564, 253},
+ /* 6141 */ {I_VPOPCNTB, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25572, 254},
+ /* 6142 */ {I_VPOPCNTB, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25580, 254},
+ /* 6143 */ {I_VPOPCNTB, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25588, 255},
+ /* 6144 */ {I_VPOPCNTW, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25596, 254},
+ /* 6145 */ {I_VPOPCNTW, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25604, 254},
+ /* 6146 */ {I_VPOPCNTW, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25612, 255},
+ /* 6147 */ {I_VPOPCNTD, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25620, 256},
+ /* 6148 */ {I_VPOPCNTD, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25628, 256},
+ /* 6149 */ {I_VPOPCNTD, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25636, 257},
+ /* 6150 */ {I_VPOPCNTQ, 2, {XMMREG,RM_XMM|BITS128,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25644, 256},
+ /* 6151 */ {I_VPOPCNTQ, 2, {YMMREG,RM_YMM|BITS256,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25652, 256},
+ /* 6152 */ {I_VPOPCNTQ, 2, {ZMMREG,RM_ZMM|BITS512,0,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25660, 257},
+ /* 6153 */ {I_VPSHUFBITQMB, 3, {KREG,XMMREG,RM_XMM|BITS128,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25668, 254},
+ /* 6154 */ {I_VPSHUFBITQMB, 3, {KREG,YMMREG,RM_YMM|BITS256,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25676, 254},
+ /* 6155 */ {I_VPSHUFBITQMB, 3, {KREG,ZMMREG,RM_ZMM|BITS512,0,0}, {MASK,0,0,0,0}, nasm_bytecodes+25684, 255},
+ /* 6156 */ {I_V4FMADDPS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25692, 258},
+ /* 6157 */ {I_V4FNMADDPS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25700, 258},
+ /* 6158 */ {I_V4FMADDSS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25708, 258},
+ /* 6159 */ {I_V4FNMADDSS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25716, 258},
+ /* 6160 */ {I_V4DPWSSDS, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25724, 259},
+ /* 6161 */ {I_V4DPWSSD, 3, {ZMM_L16,ZMM_L16|RS4,MEMORY,0,0}, {MASK|Z,0,0,0,0}, nasm_bytecodes+25732, 259},
+ /* 6162 */ {I_ENCLS, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37564, 260},
+ /* 6163 */ {I_ENCLU, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37570, 260},
+ /* 6164 */ {I_ENCLV, 0, {0,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37576, 260},
+ /* 6165 */ {I_HINT_NOP0, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37582, 261},
+ /* 6166 */ {I_HINT_NOP0, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37588, 261},
+ /* 6167 */ {I_HINT_NOP0, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37594, 262},
+ /* 6168 */ {I_HINT_NOP1, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37600, 261},
+ /* 6169 */ {I_HINT_NOP1, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37606, 261},
+ /* 6170 */ {I_HINT_NOP1, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37612, 262},
+ /* 6171 */ {I_HINT_NOP2, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37618, 261},
+ /* 6172 */ {I_HINT_NOP2, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37624, 261},
+ /* 6173 */ {I_HINT_NOP2, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37630, 262},
+ /* 6174 */ {I_HINT_NOP3, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37636, 261},
+ /* 6175 */ {I_HINT_NOP3, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37642, 261},
+ /* 6176 */ {I_HINT_NOP3, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37648, 262},
+ /* 6177 */ {I_HINT_NOP4, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37654, 261},
+ /* 6178 */ {I_HINT_NOP4, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37660, 261},
+ /* 6179 */ {I_HINT_NOP4, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37666, 262},
+ /* 6180 */ {I_HINT_NOP5, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37672, 261},
+ /* 6181 */ {I_HINT_NOP5, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37678, 261},
+ /* 6182 */ {I_HINT_NOP5, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37684, 262},
+ /* 6183 */ {I_HINT_NOP6, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37690, 261},
+ /* 6184 */ {I_HINT_NOP6, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37696, 261},
+ /* 6185 */ {I_HINT_NOP6, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37702, 262},
+ /* 6186 */ {I_HINT_NOP7, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37708, 261},
+ /* 6187 */ {I_HINT_NOP7, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37714, 261},
+ /* 6188 */ {I_HINT_NOP7, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37720, 262},
+ /* 6189 */ {I_HINT_NOP8, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37726, 261},
+ /* 6190 */ {I_HINT_NOP8, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37732, 261},
+ /* 6191 */ {I_HINT_NOP8, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37738, 262},
+ /* 6192 */ {I_HINT_NOP9, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37744, 261},
+ /* 6193 */ {I_HINT_NOP9, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37750, 261},
+ /* 6194 */ {I_HINT_NOP9, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37756, 262},
+ /* 6195 */ {I_HINT_NOP10, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37762, 261},
+ /* 6196 */ {I_HINT_NOP10, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37768, 261},
+ /* 6197 */ {I_HINT_NOP10, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37774, 262},
+ /* 6198 */ {I_HINT_NOP11, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37780, 261},
+ /* 6199 */ {I_HINT_NOP11, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37786, 261},
+ /* 6200 */ {I_HINT_NOP11, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37792, 262},
+ /* 6201 */ {I_HINT_NOP12, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37798, 261},
+ /* 6202 */ {I_HINT_NOP12, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37804, 261},
+ /* 6203 */ {I_HINT_NOP12, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37810, 262},
+ /* 6204 */ {I_HINT_NOP13, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37816, 261},
+ /* 6205 */ {I_HINT_NOP13, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37822, 261},
+ /* 6206 */ {I_HINT_NOP13, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37828, 262},
+ /* 6207 */ {I_HINT_NOP14, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37834, 261},
+ /* 6208 */ {I_HINT_NOP14, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37840, 261},
+ /* 6209 */ {I_HINT_NOP14, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37846, 262},
+ /* 6210 */ {I_HINT_NOP15, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37852, 261},
+ /* 6211 */ {I_HINT_NOP15, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37858, 261},
+ /* 6212 */ {I_HINT_NOP15, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37864, 262},
+ /* 6213 */ {I_HINT_NOP16, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37870, 261},
+ /* 6214 */ {I_HINT_NOP16, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37876, 261},
+ /* 6215 */ {I_HINT_NOP16, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37882, 262},
+ /* 6216 */ {I_HINT_NOP17, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37888, 261},
+ /* 6217 */ {I_HINT_NOP17, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37894, 261},
+ /* 6218 */ {I_HINT_NOP17, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37900, 262},
+ /* 6219 */ {I_HINT_NOP18, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37906, 261},
+ /* 6220 */ {I_HINT_NOP18, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37912, 261},
+ /* 6221 */ {I_HINT_NOP18, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37918, 262},
+ /* 6222 */ {I_HINT_NOP19, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37924, 261},
+ /* 6223 */ {I_HINT_NOP19, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37930, 261},
+ /* 6224 */ {I_HINT_NOP19, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37936, 262},
+ /* 6225 */ {I_HINT_NOP20, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37942, 261},
+ /* 6226 */ {I_HINT_NOP20, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37948, 261},
+ /* 6227 */ {I_HINT_NOP20, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37954, 262},
+ /* 6228 */ {I_HINT_NOP21, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37960, 261},
+ /* 6229 */ {I_HINT_NOP21, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37966, 261},
+ /* 6230 */ {I_HINT_NOP21, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37972, 262},
+ /* 6231 */ {I_HINT_NOP22, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37978, 261},
+ /* 6232 */ {I_HINT_NOP22, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37984, 261},
+ /* 6233 */ {I_HINT_NOP22, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37990, 262},
+ /* 6234 */ {I_HINT_NOP23, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+37996, 261},
+ /* 6235 */ {I_HINT_NOP23, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38002, 261},
+ /* 6236 */ {I_HINT_NOP23, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38008, 262},
+ /* 6237 */ {I_HINT_NOP24, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38014, 261},
+ /* 6238 */ {I_HINT_NOP24, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38020, 261},
+ /* 6239 */ {I_HINT_NOP24, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38026, 262},
+ /* 6240 */ {I_HINT_NOP25, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38032, 261},
+ /* 6241 */ {I_HINT_NOP25, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38038, 261},
+ /* 6242 */ {I_HINT_NOP25, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38044, 262},
+ /* 6243 */ {I_HINT_NOP26, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38050, 261},
+ /* 6244 */ {I_HINT_NOP26, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38056, 261},
+ /* 6245 */ {I_HINT_NOP26, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38062, 262},
+ /* 6246 */ {I_HINT_NOP27, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38068, 261},
+ /* 6247 */ {I_HINT_NOP27, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38074, 261},
+ /* 6248 */ {I_HINT_NOP27, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38080, 262},
+ /* 6249 */ {I_HINT_NOP28, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38086, 261},
+ /* 6250 */ {I_HINT_NOP28, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38092, 261},
+ /* 6251 */ {I_HINT_NOP28, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38098, 262},
+ /* 6252 */ {I_HINT_NOP29, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38104, 261},
+ /* 6253 */ {I_HINT_NOP29, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38110, 261},
+ /* 6254 */ {I_HINT_NOP29, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38116, 262},
+ /* 6255 */ {I_HINT_NOP30, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38122, 261},
+ /* 6256 */ {I_HINT_NOP30, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38128, 261},
+ /* 6257 */ {I_HINT_NOP30, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38134, 262},
+ /* 6258 */ {I_HINT_NOP31, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38140, 261},
+ /* 6259 */ {I_HINT_NOP31, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38146, 261},
+ /* 6260 */ {I_HINT_NOP31, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38152, 262},
+ /* 6261 */ {I_HINT_NOP32, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38158, 261},
+ /* 6262 */ {I_HINT_NOP32, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38164, 261},
+ /* 6263 */ {I_HINT_NOP32, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38170, 262},
+ /* 6264 */ {I_HINT_NOP33, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38176, 261},
+ /* 6265 */ {I_HINT_NOP33, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38182, 261},
+ /* 6266 */ {I_HINT_NOP33, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38188, 262},
+ /* 6267 */ {I_HINT_NOP34, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38194, 261},
+ /* 6268 */ {I_HINT_NOP34, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38200, 261},
+ /* 6269 */ {I_HINT_NOP34, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38206, 262},
+ /* 6270 */ {I_HINT_NOP35, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38212, 261},
+ /* 6271 */ {I_HINT_NOP35, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38218, 261},
+ /* 6272 */ {I_HINT_NOP35, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38224, 262},
+ /* 6273 */ {I_HINT_NOP36, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38230, 261},
+ /* 6274 */ {I_HINT_NOP36, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38236, 261},
+ /* 6275 */ {I_HINT_NOP36, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38242, 262},
+ /* 6276 */ {I_HINT_NOP37, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38248, 261},
+ /* 6277 */ {I_HINT_NOP37, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38254, 261},
+ /* 6278 */ {I_HINT_NOP37, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38260, 262},
+ /* 6279 */ {I_HINT_NOP38, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38266, 261},
+ /* 6280 */ {I_HINT_NOP38, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38272, 261},
+ /* 6281 */ {I_HINT_NOP38, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38278, 262},
+ /* 6282 */ {I_HINT_NOP39, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38284, 261},
+ /* 6283 */ {I_HINT_NOP39, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38290, 261},
+ /* 6284 */ {I_HINT_NOP39, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38296, 262},
+ /* 6285 */ {I_HINT_NOP40, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38302, 261},
+ /* 6286 */ {I_HINT_NOP40, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38308, 261},
+ /* 6287 */ {I_HINT_NOP40, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38314, 262},
+ /* 6288 */ {I_HINT_NOP41, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38320, 261},
+ /* 6289 */ {I_HINT_NOP41, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38326, 261},
+ /* 6290 */ {I_HINT_NOP41, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38332, 262},
+ /* 6291 */ {I_HINT_NOP42, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38338, 261},
+ /* 6292 */ {I_HINT_NOP42, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38344, 261},
+ /* 6293 */ {I_HINT_NOP42, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38350, 262},
+ /* 6294 */ {I_HINT_NOP43, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38356, 261},
+ /* 6295 */ {I_HINT_NOP43, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38362, 261},
+ /* 6296 */ {I_HINT_NOP43, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38368, 262},
+ /* 6297 */ {I_HINT_NOP44, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38374, 261},
+ /* 6298 */ {I_HINT_NOP44, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38380, 261},
+ /* 6299 */ {I_HINT_NOP44, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38386, 262},
+ /* 6300 */ {I_HINT_NOP45, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38392, 261},
+ /* 6301 */ {I_HINT_NOP45, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38398, 261},
+ /* 6302 */ {I_HINT_NOP45, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38404, 262},
+ /* 6303 */ {I_HINT_NOP46, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38410, 261},
+ /* 6304 */ {I_HINT_NOP46, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38416, 261},
+ /* 6305 */ {I_HINT_NOP46, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38422, 262},
+ /* 6306 */ {I_HINT_NOP47, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38428, 261},
+ /* 6307 */ {I_HINT_NOP47, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38434, 261},
+ /* 6308 */ {I_HINT_NOP47, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38440, 262},
+ /* 6309 */ {I_HINT_NOP48, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38446, 261},
+ /* 6310 */ {I_HINT_NOP48, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38452, 261},
+ /* 6311 */ {I_HINT_NOP48, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38458, 262},
+ /* 6312 */ {I_HINT_NOP49, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38464, 261},
+ /* 6313 */ {I_HINT_NOP49, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38470, 261},
+ /* 6314 */ {I_HINT_NOP49, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38476, 262},
+ /* 6315 */ {I_HINT_NOP50, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38482, 261},
+ /* 6316 */ {I_HINT_NOP50, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38488, 261},
+ /* 6317 */ {I_HINT_NOP50, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38494, 262},
+ /* 6318 */ {I_HINT_NOP51, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38500, 261},
+ /* 6319 */ {I_HINT_NOP51, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38506, 261},
+ /* 6320 */ {I_HINT_NOP51, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38512, 262},
+ /* 6321 */ {I_HINT_NOP52, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38518, 261},
+ /* 6322 */ {I_HINT_NOP52, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38524, 261},
+ /* 6323 */ {I_HINT_NOP52, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38530, 262},
+ /* 6324 */ {I_HINT_NOP53, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38536, 261},
+ /* 6325 */ {I_HINT_NOP53, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38542, 261},
+ /* 6326 */ {I_HINT_NOP53, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38548, 262},
+ /* 6327 */ {I_HINT_NOP54, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38554, 261},
+ /* 6328 */ {I_HINT_NOP54, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38560, 261},
+ /* 6329 */ {I_HINT_NOP54, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38566, 262},
+ /* 6330 */ {I_HINT_NOP55, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38572, 261},
+ /* 6331 */ {I_HINT_NOP55, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38578, 261},
+ /* 6332 */ {I_HINT_NOP55, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38584, 262},
+ /* 6333 */ {I_HINT_NOP56, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35698, 261},
+ /* 6334 */ {I_HINT_NOP56, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35704, 261},
+ /* 6335 */ {I_HINT_NOP56, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+35710, 262},
+ /* 6336 */ {I_HINT_NOP57, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38590, 261},
+ /* 6337 */ {I_HINT_NOP57, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38596, 261},
+ /* 6338 */ {I_HINT_NOP57, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38602, 262},
+ /* 6339 */ {I_HINT_NOP58, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38608, 261},
+ /* 6340 */ {I_HINT_NOP58, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38614, 261},
+ /* 6341 */ {I_HINT_NOP58, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38620, 262},
+ /* 6342 */ {I_HINT_NOP59, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38626, 261},
+ /* 6343 */ {I_HINT_NOP59, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38632, 261},
+ /* 6344 */ {I_HINT_NOP59, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38638, 262},
+ /* 6345 */ {I_HINT_NOP60, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38644, 261},
+ /* 6346 */ {I_HINT_NOP60, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38650, 261},
+ /* 6347 */ {I_HINT_NOP60, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38656, 262},
+ /* 6348 */ {I_HINT_NOP61, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38662, 261},
+ /* 6349 */ {I_HINT_NOP61, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38668, 261},
+ /* 6350 */ {I_HINT_NOP61, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38674, 262},
+ /* 6351 */ {I_HINT_NOP62, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38680, 261},
+ /* 6352 */ {I_HINT_NOP62, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38686, 261},
+ /* 6353 */ {I_HINT_NOP62, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38692, 262},
+ /* 6354 */ {I_HINT_NOP63, 1, {RM_GPR|BITS16,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38698, 261},
+ /* 6355 */ {I_HINT_NOP63, 1, {RM_GPR|BITS32,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38704, 261},
+ /* 6356 */ {I_HINT_NOP63, 1, {RM_GPR|BITS64,0,0,0,0}, NO_DECORATOR, nasm_bytecodes+38710, 262},
+};
+
+static const struct itemplate * const itable_00[] = {
+ instrux + 36,
+ instrux + 37,
+};
+
+static const struct itemplate * const itable_01[] = {
+ instrux + 38,
+ instrux + 39,
+ instrux + 40,
+ instrux + 41,
+ instrux + 42,
+ instrux + 43,
+};
+
+static const struct itemplate * const itable_02[] = {
+ instrux + 44,
+ instrux + 45,
+};
+
+static const struct itemplate * const itable_03[] = {
+ instrux + 46,
+ instrux + 47,
+ instrux + 48,
+ instrux + 49,
+ instrux + 50,
+ instrux + 51,
+};
+
+static const struct itemplate * const itable_04[] = {
+ instrux + 55,
+};
+
+static const struct itemplate * const itable_05[] = {
+ instrux + 56,
+ instrux + 57,
+ instrux + 58,
+};
+
+static const struct itemplate * const itable_06[] = {
+ instrux + 838,
+};
+
+static const struct itemplate * const itable_07[] = {
+ instrux + 787,
+};
+
+static const struct itemplate * const itable_08[] = {
+ instrux + 690,
+ instrux + 691,
+};
+
+static const struct itemplate * const itable_09[] = {
+ instrux + 692,
+ instrux + 693,
+ instrux + 694,
+ instrux + 695,
+ instrux + 696,
+ instrux + 697,
+};
+
+static const struct itemplate * const itable_0A[] = {
+ instrux + 698,
+ instrux + 699,
+};
+
+static const struct itemplate * const itable_0B[] = {
+ instrux + 700,
+ instrux + 701,
+ instrux + 702,
+ instrux + 703,
+ instrux + 704,
+ instrux + 705,
+};
+
+static const struct itemplate * const itable_0C[] = {
+ instrux + 709,
+};
+
+static const struct itemplate * const itable_0D[] = {
+ instrux + 710,
+ instrux + 711,
+ instrux + 712,
+};
+
+static const struct itemplate * const itable_0E[] = {
+ instrux + 839,
+};
+
+static const struct itemplate * const itable_0F00[] = {
+ instrux + 518,
+ instrux + 519,
+ instrux + 548,
+ instrux + 549,
+ instrux + 550,
+ instrux + 591,
+ instrux + 592,
+ instrux + 593,
+ instrux + 1038,
+ instrux + 1039,
+ instrux + 1040,
+ instrux + 1041,
+ instrux + 1042,
+ instrux + 1057,
+ instrux + 1058,
+ instrux + 1059,
+ instrux + 1060,
+ instrux + 1061,
+ instrux + 1130,
+ instrux + 1131,
+ instrux + 1132,
+ instrux + 1133,
+ instrux + 1134,
+ instrux + 1135,
+};
+
+static const struct itemplate * const itable_0F01[] = {
+ instrux + 484,
+ instrux + 485,
+ instrux + 486,
+ instrux + 487,
+ instrux + 488,
+ instrux + 543,
+ instrux + 547,
+ instrux + 551,
+ instrux + 552,
+ instrux + 553,
+ instrux + 595,
+ instrux + 596,
+ instrux + 676,
+ instrux + 677,
+ instrux + 886,
+ instrux + 988,
+ instrux + 1037,
+ instrux + 1043,
+ instrux + 1045,
+ instrux + 1046,
+ instrux + 1047,
+ instrux + 1048,
+ instrux + 1049,
+ instrux + 1094,
+ instrux + 1296,
+ instrux + 1297,
+ instrux + 1538,
+ instrux + 1539,
+ instrux + 1540,
+ instrux + 1542,
+ instrux + 1543,
+ instrux + 1544,
+ instrux + 1545,
+ instrux + 1550,
+ instrux + 1551,
+ instrux + 1552,
+ instrux + 1555,
+ instrux + 3188,
+ instrux + 3189,
+ instrux + 3797,
+ instrux + 3798,
+ instrux + 5964,
+ instrux + 5965,
+ instrux + 5972,
+ instrux + 5981,
+ instrux + 6162,
+ instrux + 6163,
+ instrux + 6164,
+};
+
+static const struct itemplate * const itable_0F02[] = {
+ instrux + 521,
+ instrux + 522,
+ instrux + 523,
+ instrux + 524,
+ instrux + 525,
+ instrux + 526,
+ instrux + 527,
+ instrux + 528,
+ instrux + 529,
+ instrux + 530,
+};
+
+static const struct itemplate * const itable_0F03[] = {
+ instrux + 578,
+ instrux + 579,
+ instrux + 580,
+ instrux + 581,
+ instrux + 582,
+ instrux + 583,
+ instrux + 584,
+ instrux + 585,
+ instrux + 586,
+ instrux + 587,
+};
+
+static const struct itemplate * const itable_0F05[] = {
+ instrux + 1095,
+};
+
+static const struct itemplate * const itable_0F06[] = {
+ instrux + 174,
+};
+
+static const struct itemplate * const itable_0F07[] = {
+ instrux + 1098,
+};
+
+static const struct itemplate * const itable_0F08[] = {
+ instrux + 481,
+};
+
+static const struct itemplate * const itable_0F09[] = {
+ instrux + 1137,
+ instrux + 5987,
+};
+
+static const struct itemplate * const itable_0F0B[] = {
+ instrux + 1129,
+};
+
+static const struct itemplate * const itable_0F0D[] = {
+ instrux + 800,
+ instrux + 801,
+ instrux + 3848,
+};
+
+static const struct itemplate * const itable_0F0E[] = {
+ instrux + 307,
+};
+
+static const struct itemplate * const itable_0F0F[] = {
+ instrux + 744,
+ instrux + 752,
+ instrux + 753,
+ instrux + 754,
+ instrux + 755,
+ instrux + 756,
+ instrux + 757,
+ instrux + 758,
+ instrux + 759,
+ instrux + 760,
+ instrux + 761,
+ instrux + 762,
+ instrux + 763,
+ instrux + 764,
+ instrux + 765,
+ instrux + 766,
+ instrux + 767,
+ instrux + 768,
+ instrux + 773,
+ instrux + 1331,
+ instrux + 1332,
+ instrux + 1333,
+ instrux + 1334,
+ instrux + 1335,
+ instrux + 1677,
+ instrux + 1678,
+};
+
+static const struct itemplate * const itable_0F10[] = {
+ instrux + 1270,
+ instrux + 1272,
+ instrux + 1273,
+ instrux + 1507,
+ instrux + 1510,
+ instrux + 1511,
+ instrux + 1514,
+};
+
+static const struct itemplate * const itable_0F11[] = {
+ instrux + 1271,
+ instrux + 1274,
+ instrux + 1508,
+ instrux + 1509,
+ instrux + 1512,
+ instrux + 1513,
+};
+
+static const struct itemplate * const itable_0F12[] = {
+ instrux + 1264,
+ instrux + 1266,
+ instrux + 1504,
+ instrux + 1535,
+ instrux + 1537,
+};
+
+static const struct itemplate * const itable_0F13[] = {
+ instrux + 1265,
+ instrux + 1503,
+};
+
+static const struct itemplate * const itable_0F14[] = {
+ instrux + 1290,
+ instrux + 1526,
+};
+
+static const struct itemplate * const itable_0F15[] = {
+ instrux + 1289,
+ instrux + 1525,
+};
+
+static const struct itemplate * const itable_0F16[] = {
+ instrux + 1261,
+ instrux + 1263,
+ instrux + 1502,
+ instrux + 1536,
+};
+
+static const struct itemplate * const itable_0F17[] = {
+ instrux + 1262,
+ instrux + 1501,
+};
+
+static const struct itemplate * const itable_0F18[] = {
+ instrux + 1310,
+ instrux + 1311,
+ instrux + 1312,
+ instrux + 1313,
+ instrux + 6165,
+ instrux + 6166,
+ instrux + 6167,
+ instrux + 6168,
+ instrux + 6169,
+ instrux + 6170,
+ instrux + 6171,
+ instrux + 6172,
+ instrux + 6173,
+ instrux + 6174,
+ instrux + 6175,
+ instrux + 6176,
+ instrux + 6177,
+ instrux + 6178,
+ instrux + 6179,
+ instrux + 6180,
+ instrux + 6181,
+ instrux + 6182,
+ instrux + 6183,
+ instrux + 6184,
+ instrux + 6185,
+ instrux + 6186,
+ instrux + 6187,
+ instrux + 6188,
+};
+
+static const struct itemplate * const itable_0F19[] = {
+ instrux + 6189,
+ instrux + 6190,
+ instrux + 6191,
+ instrux + 6192,
+ instrux + 6193,
+ instrux + 6194,
+ instrux + 6195,
+ instrux + 6196,
+ instrux + 6197,
+ instrux + 6198,
+ instrux + 6199,
+ instrux + 6200,
+ instrux + 6201,
+ instrux + 6202,
+ instrux + 6203,
+ instrux + 6204,
+ instrux + 6205,
+ instrux + 6206,
+ instrux + 6207,
+ instrux + 6208,
+ instrux + 6209,
+ instrux + 6210,
+ instrux + 6211,
+ instrux + 6212,
+};
+
+static const struct itemplate * const itable_0F1A[] = {
+ instrux + 3850,
+ instrux + 3851,
+ instrux + 3852,
+ instrux + 3853,
+ instrux + 3854,
+ instrux + 3855,
+ instrux + 3859,
+ instrux + 3860,
+ instrux + 3863,
+ instrux + 3864,
+ instrux + 3865,
+ instrux + 6213,
+ instrux + 6214,
+ instrux + 6215,
+ instrux + 6216,
+ instrux + 6217,
+ instrux + 6218,
+ instrux + 6219,
+ instrux + 6220,
+ instrux + 6221,
+ instrux + 6222,
+ instrux + 6223,
+ instrux + 6224,
+ instrux + 6225,
+ instrux + 6226,
+ instrux + 6227,
+ instrux + 6228,
+ instrux + 6229,
+ instrux + 6230,
+ instrux + 6231,
+ instrux + 6232,
+ instrux + 6233,
+ instrux + 6234,
+ instrux + 6235,
+ instrux + 6236,
+};
+
+static const struct itemplate * const itable_0F1B[] = {
+ instrux + 3849,
+ instrux + 3856,
+ instrux + 3857,
+ instrux + 3858,
+ instrux + 3861,
+ instrux + 3862,
+ instrux + 3866,
+ instrux + 3867,
+ instrux + 3868,
+ instrux + 3869,
+ instrux + 3870,
+ instrux + 6237,
+ instrux + 6238,
+ instrux + 6239,
+ instrux + 6240,
+ instrux + 6241,
+ instrux + 6242,
+ instrux + 6243,
+ instrux + 6244,
+ instrux + 6245,
+ instrux + 6246,
+ instrux + 6247,
+ instrux + 6248,
+ instrux + 6249,
+ instrux + 6250,
+ instrux + 6251,
+ instrux + 6252,
+ instrux + 6253,
+ instrux + 6254,
+ instrux + 6255,
+ instrux + 6256,
+ instrux + 6257,
+ instrux + 6258,
+ instrux + 6259,
+ instrux + 6260,
+};
+
+static const struct itemplate * const itable_0F1C[] = {
+ instrux + 5975,
+ instrux + 6261,
+ instrux + 6262,
+ instrux + 6263,
+ instrux + 6264,
+ instrux + 6265,
+ instrux + 6266,
+ instrux + 6267,
+ instrux + 6268,
+ instrux + 6269,
+ instrux + 6270,
+ instrux + 6271,
+ instrux + 6272,
+ instrux + 6273,
+ instrux + 6274,
+ instrux + 6275,
+ instrux + 6276,
+ instrux + 6277,
+ instrux + 6278,
+ instrux + 6279,
+ instrux + 6280,
+ instrux + 6281,
+ instrux + 6282,
+ instrux + 6283,
+ instrux + 6284,
+};
+
+static const struct itemplate * const itable_0F1D[] = {
+ instrux + 6285,
+ instrux + 6286,
+ instrux + 6287,
+ instrux + 6288,
+ instrux + 6289,
+ instrux + 6290,
+ instrux + 6291,
+ instrux + 6292,
+ instrux + 6293,
+ instrux + 6294,
+ instrux + 6295,
+ instrux + 6296,
+ instrux + 6297,
+ instrux + 6298,
+ instrux + 6299,
+ instrux + 6300,
+ instrux + 6301,
+ instrux + 6302,
+ instrux + 6303,
+ instrux + 6304,
+ instrux + 6305,
+ instrux + 6306,
+ instrux + 6307,
+ instrux + 6308,
+};
+
+static const struct itemplate * const itable_0F1E[] = {
+ instrux + 6309,
+ instrux + 6310,
+ instrux + 6311,
+ instrux + 6312,
+ instrux + 6313,
+ instrux + 6314,
+ instrux + 6315,
+ instrux + 6316,
+ instrux + 6317,
+ instrux + 6318,
+ instrux + 6319,
+ instrux + 6320,
+ instrux + 6321,
+ instrux + 6322,
+ instrux + 6323,
+ instrux + 6324,
+ instrux + 6325,
+ instrux + 6326,
+ instrux + 6327,
+ instrux + 6328,
+ instrux + 6329,
+ instrux + 6330,
+ instrux + 6331,
+ instrux + 6332,
+};
+
+static const struct itemplate * const itable_0F1F[] = {
+ instrux + 683,
+ instrux + 684,
+ instrux + 685,
+ instrux + 6333,
+ instrux + 6334,
+ instrux + 6335,
+ instrux + 6336,
+ instrux + 6337,
+ instrux + 6338,
+ instrux + 6339,
+ instrux + 6340,
+ instrux + 6341,
+ instrux + 6342,
+ instrux + 6343,
+ instrux + 6344,
+ instrux + 6345,
+ instrux + 6346,
+ instrux + 6347,
+ instrux + 6348,
+ instrux + 6349,
+ instrux + 6350,
+ instrux + 6351,
+ instrux + 6352,
+ instrux + 6353,
+ instrux + 6354,
+ instrux + 6355,
+ instrux + 6356,
+};
+
+static const struct itemplate * const itable_0F20[] = {
+ instrux + 613,
+ instrux + 614,
+};
+
+static const struct itemplate * const itable_0F21[] = {
+ instrux + 617,
+ instrux + 618,
+};
+
+static const struct itemplate * const itable_0F22[] = {
+ instrux + 615,
+ instrux + 616,
+};
+
+static const struct itemplate * const itable_0F23[] = {
+ instrux + 619,
+ instrux + 620,
+};
+
+static const struct itemplate * const itable_0F28[] = {
+ instrux + 1259,
+ instrux + 1497,
+ instrux + 1500,
+};
+
+static const struct itemplate * const itable_0F29[] = {
+ instrux + 1260,
+ instrux + 1498,
+ instrux + 1499,
+};
+
+static const struct itemplate * const itable_0F2A[] = {
+ instrux + 1241,
+ instrux + 1243,
+ instrux + 1244,
+ instrux + 1473,
+ instrux + 1481,
+ instrux + 1482,
+};
+
+static const struct itemplate * const itable_0F2B[] = {
+ instrux + 1269,
+ instrux + 1341,
+ instrux + 1597,
+ instrux + 1598,
+};
+
+static const struct itemplate * const itable_0F2C[] = {
+ instrux + 1249,
+ instrux + 1250,
+ instrux + 1251,
+ instrux + 1484,
+ instrux + 1487,
+ instrux + 1488,
+ instrux + 1489,
+ instrux + 1490,
+};
+
+static const struct itemplate * const itable_0F2D[] = {
+ instrux + 1242,
+ instrux + 1245,
+ instrux + 1246,
+ instrux + 1247,
+ instrux + 1248,
+ instrux + 1471,
+ instrux + 1476,
+ instrux + 1477,
+ instrux + 1478,
+ instrux + 1479,
+};
+
+static const struct itemplate * const itable_0F2E[] = {
+ instrux + 1288,
+ instrux + 1524,
+};
+
+static const struct itemplate * const itable_0F2F[] = {
+ instrux + 1240,
+ instrux + 1467,
+};
+
+static const struct itemplate * const itable_0F30[] = {
+ instrux + 1139,
+};
+
+static const struct itemplate * const itable_0F31[] = {
+ instrux + 885,
+};
+
+static const struct itemplate * const itable_0F32[] = {
+ instrux + 883,
+};
+
+static const struct itemplate * const itable_0F33[] = {
+ instrux + 884,
+};
+
+static const struct itemplate * const itable_0F34[] = {
+ instrux + 1096,
+};
+
+static const struct itemplate * const itable_0F35[] = {
+ instrux + 1097,
+};
+
+static const struct itemplate * const itable_0F36[] = {
+ instrux + 882,
+};
+
+static const struct itemplate * const itable_0F37[] = {
+ instrux + 1138,
+ instrux + 1676,
+};
+
+static const struct itemplate * const itable_0F3800[] = {
+ instrux + 1585,
+ instrux + 1586,
+};
+
+static const struct itemplate * const itable_0F3801[] = {
+ instrux + 1569,
+ instrux + 1570,
+};
+
+static const struct itemplate * const itable_0F3802[] = {
+ instrux + 1571,
+ instrux + 1572,
+};
+
+static const struct itemplate * const itable_0F3803[] = {
+ instrux + 1573,
+ instrux + 1574,
+};
+
+static const struct itemplate * const itable_0F3804[] = {
+ instrux + 1581,
+ instrux + 1582,
+};
+
+static const struct itemplate * const itable_0F3805[] = {
+ instrux + 1575,
+ instrux + 1576,
+};
+
+static const struct itemplate * const itable_0F3806[] = {
+ instrux + 1577,
+ instrux + 1578,
+};
+
+static const struct itemplate * const itable_0F3807[] = {
+ instrux + 1579,
+ instrux + 1580,
+};
+
+static const struct itemplate * const itable_0F3808[] = {
+ instrux + 1587,
+ instrux + 1588,
+};
+
+static const struct itemplate * const itable_0F3809[] = {
+ instrux + 1589,
+ instrux + 1590,
+};
+
+static const struct itemplate * const itable_0F380A[] = {
+ instrux + 1591,
+ instrux + 1592,
+};
+
+static const struct itemplate * const itable_0F380B[] = {
+ instrux + 1583,
+ instrux + 1584,
+};
+
+static const struct itemplate * const itable_0F3810[] = {
+ instrux + 1616,
+ instrux + 1617,
+};
+
+static const struct itemplate * const itable_0F3814[] = {
+ instrux + 1606,
+ instrux + 1607,
+};
+
+static const struct itemplate * const itable_0F3815[] = {
+ instrux + 1604,
+ instrux + 1605,
+};
+
+static const struct itemplate * const itable_0F3817[] = {
+ instrux + 1658,
+};
+
+static const struct itemplate * const itable_0F381C[] = {
+ instrux + 1561,
+ instrux + 1562,
+};
+
+static const struct itemplate * const itable_0F381D[] = {
+ instrux + 1563,
+ instrux + 1564,
+};
+
+static const struct itemplate * const itable_0F381E[] = {
+ instrux + 1565,
+ instrux + 1566,
+};
+
+static const struct itemplate * const itable_0F3820[] = {
+ instrux + 1644,
+};
+
+static const struct itemplate * const itable_0F3821[] = {
+ instrux + 1645,
+};
+
+static const struct itemplate * const itable_0F3822[] = {
+ instrux + 1646,
+};
+
+static const struct itemplate * const itable_0F3823[] = {
+ instrux + 1647,
+};
+
+static const struct itemplate * const itable_0F3824[] = {
+ instrux + 1648,
+};
+
+static const struct itemplate * const itable_0F3825[] = {
+ instrux + 1649,
+};
+
+static const struct itemplate * const itable_0F3828[] = {
+ instrux + 1656,
+};
+
+static const struct itemplate * const itable_0F3829[] = {
+ instrux + 1619,
+};
+
+static const struct itemplate * const itable_0F382A[] = {
+ instrux + 1613,
+};
+
+static const struct itemplate * const itable_0F382B[] = {
+ instrux + 1615,
+};
+
+static const struct itemplate * const itable_0F3830[] = {
+ instrux + 1650,
+};
+
+static const struct itemplate * const itable_0F3831[] = {
+ instrux + 1651,
+};
+
+static const struct itemplate * const itable_0F3832[] = {
+ instrux + 1652,
+};
+
+static const struct itemplate * const itable_0F3833[] = {
+ instrux + 1653,
+};
+
+static const struct itemplate * const itable_0F3834[] = {
+ instrux + 1654,
+};
+
+static const struct itemplate * const itable_0F3835[] = {
+ instrux + 1655,
+};
+
+static const struct itemplate * const itable_0F3837[] = {
+ instrux + 1672,
+};
+
+static const struct itemplate * const itable_0F3838[] = {
+ instrux + 1640,
+};
+
+static const struct itemplate * const itable_0F3839[] = {
+ instrux + 1641,
+};
+
+static const struct itemplate * const itable_0F383A[] = {
+ instrux + 1643,
+};
+
+static const struct itemplate * const itable_0F383B[] = {
+ instrux + 1642,
+};
+
+static const struct itemplate * const itable_0F383C[] = {
+ instrux + 1636,
+};
+
+static const struct itemplate * const itable_0F383D[] = {
+ instrux + 1637,
+};
+
+static const struct itemplate * const itable_0F383E[] = {
+ instrux + 1639,
+};
+
+static const struct itemplate * const itable_0F383F[] = {
+ instrux + 1638,
+};
+
+static const struct itemplate * const itable_0F3840[] = {
+ instrux + 1657,
+};
+
+static const struct itemplate * const itable_0F3841[] = {
+ instrux + 1628,
+};
+
+static const struct itemplate * const itable_0F3880[] = {
+ instrux + 1557,
+ instrux + 1558,
+};
+
+static const struct itemplate * const itable_0F3881[] = {
+ instrux + 1559,
+ instrux + 1560,
+};
+
+static const struct itemplate * const itable_0F3882[] = {
+ instrux + 482,
+ instrux + 483,
+};
+
+static const struct itemplate * const itable_0F38C8[] = {
+ instrux + 3873,
+};
+
+static const struct itemplate * const itable_0F38C9[] = {
+ instrux + 3871,
+};
+
+static const struct itemplate * const itable_0F38CA[] = {
+ instrux + 3872,
+};
+
+static const struct itemplate * const itable_0F38CB[] = {
+ instrux + 3877,
+ instrux + 3878,
+};
+
+static const struct itemplate * const itable_0F38CC[] = {
+ instrux + 3875,
+};
+
+static const struct itemplate * const itable_0F38CD[] = {
+ instrux + 3876,
+};
+
+static const struct itemplate * const itable_0F38CF[] = {
+ instrux + 6010,
+};
+
+static const struct itemplate * const itable_0F38DB[] = {
+ instrux + 1689,
+};
+
+static const struct itemplate * const itable_0F38DC[] = {
+ instrux + 1685,
+};
+
+static const struct itemplate * const itable_0F38DD[] = {
+ instrux + 1686,
+};
+
+static const struct itemplate * const itable_0F38DE[] = {
+ instrux + 1687,
+};
+
+static const struct itemplate * const itable_0F38DF[] = {
+ instrux + 1688,
+};
+
+static const struct itemplate * const itable_0F38F0[] = {
+ instrux + 1663,
+ instrux + 1666,
+ instrux + 1679,
+ instrux + 1680,
+ instrux + 1681,
+};
+
+static const struct itemplate * const itable_0F38F1[] = {
+ instrux + 1664,
+ instrux + 1665,
+ instrux + 1667,
+ instrux + 1682,
+ instrux + 1683,
+ instrux + 1684,
+};
+
+static const struct itemplate * const itable_0F38F6[] = {
+ instrux + 3181,
+ instrux + 3182,
+ instrux + 3183,
+ instrux + 3184,
+};
+
+static const struct itemplate * const itable_0F38F8[] = {
+ instrux + 5978,
+ instrux + 5979,
+ instrux + 5980,
+};
+
+static const struct itemplate * const itable_0F38F9[] = {
+ instrux + 5976,
+ instrux + 5977,
+};
+
+static const struct itemplate * const itable_0F39[] = {
+ instrux + 238,
+};
+
+static const struct itemplate * const itable_0F3A08[] = {
+ instrux + 1660,
+};
+
+static const struct itemplate * const itable_0F3A09[] = {
+ instrux + 1659,
+};
+
+static const struct itemplate * const itable_0F3A0A[] = {
+ instrux + 1662,
+};
+
+static const struct itemplate * const itable_0F3A0B[] = {
+ instrux + 1661,
+};
+
+static const struct itemplate * const itable_0F3A0C[] = {
+ instrux + 1603,
+};
+
+static const struct itemplate * const itable_0F3A0D[] = {
+ instrux + 1602,
+};
+
+static const struct itemplate * const itable_0F3A0E[] = {
+ instrux + 1618,
+};
+
+static const struct itemplate * const itable_0F3A0F[] = {
+ instrux + 1567,
+ instrux + 1568,
+};
+
+static const struct itemplate * const itable_0F3A14[] = {
+ instrux + 1620,
+ instrux + 1621,
+ instrux + 1622,
+};
+
+static const struct itemplate * const itable_0F3A15[] = {
+ instrux + 1625,
+ instrux + 1626,
+ instrux + 1627,
+};
+
+static const struct itemplate * const itable_0F3A16[] = {
+ instrux + 1623,
+ instrux + 1624,
+};
+
+static const struct itemplate * const itable_0F3A17[] = {
+ instrux + 1610,
+ instrux + 1611,
+};
+
+static const struct itemplate * const itable_0F3A20[] = {
+ instrux + 1629,
+ instrux + 1630,
+ instrux + 1631,
+};
+
+static const struct itemplate * const itable_0F3A21[] = {
+ instrux + 1612,
+};
+
+static const struct itemplate * const itable_0F3A22[] = {
+ instrux + 1632,
+ instrux + 1633,
+ instrux + 1634,
+ instrux + 1635,
+};
+
+static const struct itemplate * const itable_0F3A40[] = {
+ instrux + 1609,
+};
+
+static const struct itemplate * const itable_0F3A41[] = {
+ instrux + 1608,
+};
+
+static const struct itemplate * const itable_0F3A42[] = {
+ instrux + 1614,
+};
+
+static const struct itemplate * const itable_0F3A44[] = {
+ instrux + 2919,
+ instrux + 2920,
+ instrux + 2921,
+ instrux + 2922,
+ instrux + 2923,
+};
+
+static const struct itemplate * const itable_0F3A60[] = {
+ instrux + 1669,
+};
+
+static const struct itemplate * const itable_0F3A61[] = {
+ instrux + 1668,
+};
+
+static const struct itemplate * const itable_0F3A62[] = {
+ instrux + 1671,
+};
+
+static const struct itemplate * const itable_0F3A63[] = {
+ instrux + 1670,
+};
+
+static const struct itemplate * const itable_0F3ACC[] = {
+ instrux + 3874,
+};
+
+static const struct itemplate * const itable_0F3ACE[] = {
+ instrux + 5999,
+};
+
+static const struct itemplate * const itable_0F3ACF[] = {
+ instrux + 5988,
+};
+
+static const struct itemplate * const itable_0F3ADF[] = {
+ instrux + 1690,
+};
+
+static const struct itemplate * const itable_0F3C[] = {
+ instrux + 222,
+};
+
+static const struct itemplate * const itable_0F3D[] = {
+ instrux + 221,
+};
+
+static const struct itemplate * const itable_0F40[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F41[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F42[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F43[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F44[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F45[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F46[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F47[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F48[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F49[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4A[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4B[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4C[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4D[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4E[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F4F[] = {
+ instrux + 1203,
+ instrux + 1204,
+ instrux + 1205,
+ instrux + 1206,
+ instrux + 1207,
+ instrux + 1208,
+};
+
+static const struct itemplate * const itable_0F50[] = {
+ instrux + 743,
+ instrux + 1267,
+ instrux + 1268,
+ instrux + 1505,
+ instrux + 1506,
+};
+
+static const struct itemplate * const itable_0F51[] = {
+ instrux + 735,
+ instrux + 1283,
+ instrux + 1284,
+ instrux + 1520,
+ instrux + 1521,
+};
+
+static const struct itemplate * const itable_0F52[] = {
+ instrux + 771,
+ instrux + 1280,
+ instrux + 1281,
+};
+
+static const struct itemplate * const itable_0F53[] = {
+ instrux + 1278,
+ instrux + 1279,
+};
+
+static const struct itemplate * const itable_0F54[] = {
+ instrux + 751,
+ instrux + 1219,
+ instrux + 1448,
+};
+
+static const struct itemplate * const itable_0F55[] = {
+ instrux + 821,
+ instrux + 1218,
+ instrux + 1447,
+};
+
+static const struct itemplate * const itable_0F56[] = {
+ instrux + 1277,
+ instrux + 1517,
+};
+
+static const struct itemplate * const itable_0F57[] = {
+ instrux + 1291,
+ instrux + 1527,
+};
+
+static const struct itemplate * const itable_0F58[] = {
+ instrux + 780,
+ instrux + 1216,
+ instrux + 1217,
+ instrux + 1445,
+ instrux + 1446,
+};
+
+static const struct itemplate * const itable_0F59[] = {
+ instrux + 774,
+ instrux + 1275,
+ instrux + 1276,
+ instrux + 1515,
+ instrux + 1516,
+};
+
+static const struct itemplate * const itable_0F5A[] = {
+ instrux + 779,
+ instrux + 1472,
+ instrux + 1475,
+ instrux + 1480,
+ instrux + 1483,
+};
+
+static const struct itemplate * const itable_0F5B[] = {
+ instrux + 778,
+ instrux + 1469,
+ instrux + 1474,
+ instrux + 1486,
+};
+
+static const struct itemplate * const itable_0F5C[] = {
+ instrux + 777,
+ instrux + 1286,
+ instrux + 1287,
+ instrux + 1522,
+ instrux + 1523,
+};
+
+static const struct itemplate * const itable_0F5D[] = {
+ instrux + 772,
+ instrux + 1257,
+ instrux + 1258,
+ instrux + 1495,
+ instrux + 1496,
+};
+
+static const struct itemplate * const itable_0F5E[] = {
+ instrux + 769,
+ instrux + 1252,
+ instrux + 1253,
+ instrux + 1491,
+ instrux + 1492,
+};
+
+static const struct itemplate * const itable_0F5F[] = {
+ instrux + 1255,
+ instrux + 1256,
+ instrux + 1493,
+ instrux + 1494,
+};
+
+static const struct itemplate * const itable_0F60[] = {
+ instrux + 829,
+ instrux + 1440,
+};
+
+static const struct itemplate * const itable_0F61[] = {
+ instrux + 831,
+ instrux + 1441,
+};
+
+static const struct itemplate * const itable_0F62[] = {
+ instrux + 830,
+ instrux + 1442,
+};
+
+static const struct itemplate * const itable_0F63[] = {
+ instrux + 730,
+ instrux + 1364,
+};
+
+static const struct itemplate * const itable_0F64[] = {
+ instrux + 748,
+ instrux + 1383,
+};
+
+static const struct itemplate * const itable_0F65[] = {
+ instrux + 750,
+ instrux + 1384,
+};
+
+static const struct itemplate * const itable_0F66[] = {
+ instrux + 749,
+ instrux + 1385,
+};
+
+static const struct itemplate * const itable_0F67[] = {
+ instrux + 731,
+ instrux + 1366,
+};
+
+static const struct itemplate * const itable_0F68[] = {
+ instrux + 826,
+ instrux + 1436,
+};
+
+static const struct itemplate * const itable_0F69[] = {
+ instrux + 828,
+ instrux + 1437,
+};
+
+static const struct itemplate * const itable_0F6A[] = {
+ instrux + 827,
+ instrux + 1438,
+};
+
+static const struct itemplate * const itable_0F6B[] = {
+ instrux + 729,
+ instrux + 1365,
+};
+
+static const struct itemplate * const itable_0F6C[] = {
+ instrux + 1443,
+};
+
+static const struct itemplate * const itable_0F6D[] = {
+ instrux + 1439,
+};
+
+static const struct itemplate * const itable_0F6E[] = {
+ instrux + 649,
+ instrux + 653,
+ instrux + 1345,
+ instrux + 1346,
+ instrux + 1361,
+};
+
+static const struct itemplate * const itable_0F6F[] = {
+ instrux + 651,
+ instrux + 1348,
+ instrux + 1350,
+ instrux + 1352,
+ instrux + 1354,
+};
+
+static const struct itemplate * const itable_0F70[] = {
+ instrux + 1330,
+ instrux + 1403,
+ instrux + 1404,
+ instrux + 1405,
+ instrux + 1406,
+ instrux + 1407,
+ instrux + 1408,
+};
+
+static const struct itemplate * const itable_0F71[] = {
+ instrux + 807,
+ instrux + 811,
+ instrux + 817,
+ instrux + 1411,
+ instrux + 1417,
+ instrux + 1422,
+};
+
+static const struct itemplate * const itable_0F72[] = {
+ instrux + 803,
+ instrux + 809,
+ instrux + 813,
+ instrux + 1413,
+ instrux + 1419,
+ instrux + 1424,
+};
+
+static const struct itemplate * const itable_0F73[] = {
+ instrux + 805,
+ instrux + 815,
+ instrux + 1409,
+ instrux + 1415,
+ instrux + 1420,
+ instrux + 1426,
+};
+
+static const struct itemplate * const itable_0F74[] = {
+ instrux + 745,
+ instrux + 1380,
+};
+
+static const struct itemplate * const itable_0F75[] = {
+ instrux + 747,
+ instrux + 1381,
+};
+
+static const struct itemplate * const itable_0F76[] = {
+ instrux + 746,
+ instrux + 1382,
+};
+
+static const struct itemplate * const itable_0F77[] = {
+ instrux + 239,
+};
+
+static const struct itemplate * const itable_0F78[] = {
+ instrux + 1092,
+ instrux + 1548,
+ instrux + 1549,
+ instrux + 1593,
+ instrux + 1595,
+};
+
+static const struct itemplate * const itable_0F79[] = {
+ instrux + 935,
+ instrux + 1553,
+ instrux + 1554,
+ instrux + 1594,
+ instrux + 1596,
+};
+
+static const struct itemplate * const itable_0F7B[] = {
+ instrux + 936,
+};
+
+static const struct itemplate * const itable_0F7C[] = {
+ instrux + 1093,
+ instrux + 1530,
+ instrux + 1531,
+};
+
+static const struct itemplate * const itable_0F7D[] = {
+ instrux + 938,
+ instrux + 1532,
+ instrux + 1533,
+};
+
+static const struct itemplate * const itable_0F7E[] = {
+ instrux + 650,
+ instrux + 654,
+ instrux + 1344,
+ instrux + 1347,
+ instrux + 1357,
+ instrux + 1360,
+ instrux + 1362,
+};
+
+static const struct itemplate * const itable_0F7F[] = {
+ instrux + 652,
+ instrux + 1349,
+ instrux + 1351,
+ instrux + 1353,
+ instrux + 1355,
+};
+
+static const struct itemplate * const itable_0F80[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F81[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F82[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F83[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F84[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F85[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F86[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F87[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F88[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F89[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8A[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8B[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8C[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8D[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8E[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F8F[] = {
+ instrux + 1209,
+ instrux + 1210,
+ instrux + 1211,
+ instrux + 1212,
+};
+
+static const struct itemplate * const itable_0F90[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F91[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F92[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F93[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F94[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F95[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F96[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F97[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F98[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F99[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9A[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9B[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9C[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9D[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9E[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0F9F[] = {
+ instrux + 1214,
+ instrux + 1215,
+};
+
+static const struct itemplate * const itable_0FA0[] = {
+ instrux + 842,
+};
+
+static const struct itemplate * const itable_0FA1[] = {
+ instrux + 790,
+};
+
+static const struct itemplate * const itable_0FA2[] = {
+ instrux + 220,
+};
+
+static const struct itemplate * const itable_0FA3[] = {
+ instrux + 114,
+ instrux + 115,
+ instrux + 116,
+ instrux + 117,
+ instrux + 118,
+ instrux + 119,
+};
+
+static const struct itemplate * const itable_0FA4[] = {
+ instrux + 1001,
+ instrux + 1002,
+ instrux + 1003,
+ instrux + 1004,
+ instrux + 1005,
+ instrux + 1006,
+};
+
+static const struct itemplate * const itable_0FA5[] = {
+ instrux + 1007,
+ instrux + 1008,
+ instrux + 1009,
+ instrux + 1010,
+ instrux + 1011,
+ instrux + 1012,
+};
+
+static const struct itemplate * const itable_0FA6C0[] = {
+ instrux + 3196,
+};
+
+static const struct itemplate * const itable_0FA6C8[] = {
+ instrux + 3197,
+};
+
+static const struct itemplate * const itable_0FA6D0[] = {
+ instrux + 3198,
+};
+
+static const struct itemplate * const itable_0FA7C0[] = {
+ instrux + 3190,
+};
+
+static const struct itemplate * const itable_0FA7C8[] = {
+ instrux + 3191,
+};
+
+static const struct itemplate * const itable_0FA7D0[] = {
+ instrux + 3192,
+};
+
+static const struct itemplate * const itable_0FA7D8[] = {
+ instrux + 3193,
+};
+
+static const struct itemplate * const itable_0FA7E0[] = {
+ instrux + 3194,
+};
+
+static const struct itemplate * const itable_0FA7E8[] = {
+ instrux + 3195,
+};
+
+static const struct itemplate * const itable_0FA8[] = {
+ instrux + 843,
+};
+
+static const struct itemplate * const itable_0FA9[] = {
+ instrux + 791,
+};
+
+static const struct itemplate * const itable_0FAA[] = {
+ instrux + 937,
+};
+
+static const struct itemplate * const itable_0FAB[] = {
+ instrux + 141,
+ instrux + 142,
+ instrux + 143,
+ instrux + 144,
+ instrux + 145,
+ instrux + 146,
+};
+
+static const struct itemplate * const itable_0FAC[] = {
+ instrux + 1025,
+ instrux + 1026,
+ instrux + 1027,
+ instrux + 1028,
+ instrux + 1029,
+ instrux + 1030,
+};
+
+static const struct itemplate * const itable_0FAD[] = {
+ instrux + 1031,
+ instrux + 1032,
+ instrux + 1033,
+ instrux + 1034,
+ instrux + 1035,
+ instrux + 1036,
+};
+
+static const struct itemplate * const itable_0FAE[] = {
+ instrux + 539,
+ instrux + 594,
+ instrux + 987,
+ instrux + 1254,
+ instrux + 1285,
+ instrux + 1292,
+ instrux + 1293,
+ instrux + 1294,
+ instrux + 1295,
+ instrux + 1298,
+ instrux + 1299,
+ instrux + 1302,
+ instrux + 1303,
+ instrux + 1306,
+ instrux + 1307,
+ instrux + 1314,
+ instrux + 1337,
+ instrux + 1342,
+ instrux + 1343,
+ instrux + 3166,
+ instrux + 3167,
+ instrux + 3168,
+ instrux + 3169,
+ instrux + 3173,
+ instrux + 3174,
+ instrux + 3175,
+ instrux + 3176,
+ instrux + 5969,
+ instrux + 5970,
+ instrux + 5971,
+ instrux + 5973,
+ instrux + 5974,
+ instrux + 5982,
+ instrux + 5983,
+ instrux + 5984,
+ instrux + 5985,
+ instrux + 5986,
+};
+
+static const struct itemplate * const itable_0FAF[] = {
+ instrux + 438,
+ instrux + 439,
+ instrux + 440,
+ instrux + 441,
+ instrux + 442,
+ instrux + 443,
+};
+
+static const struct itemplate * const itable_0FB0[] = {
+ instrux + 210,
+ instrux + 211,
+};
+
+static const struct itemplate * const itable_0FB1[] = {
+ instrux + 212,
+ instrux + 213,
+ instrux + 214,
+ instrux + 215,
+ instrux + 216,
+ instrux + 217,
+};
+
+static const struct itemplate * const itable_0FB2[] = {
+ instrux + 588,
+ instrux + 589,
+ instrux + 590,
+};
+
+static const struct itemplate * const itable_0FB3[] = {
+ instrux + 132,
+ instrux + 133,
+ instrux + 134,
+ instrux + 135,
+ instrux + 136,
+ instrux + 137,
+};
+
+static const struct itemplate * const itable_0FB4[] = {
+ instrux + 540,
+ instrux + 541,
+ instrux + 542,
+};
+
+static const struct itemplate * const itable_0FB5[] = {
+ instrux + 544,
+ instrux + 545,
+ instrux + 546,
+};
+
+static const struct itemplate * const itable_0FB6[] = {
+ instrux + 666,
+ instrux + 667,
+ instrux + 668,
+ instrux + 670,
+};
+
+static const struct itemplate * const itable_0FB7[] = {
+ instrux + 669,
+ instrux + 671,
+};
+
+static const struct itemplate * const itable_0FB8[] = {
+ instrux + 515,
+ instrux + 516,
+ instrux + 517,
+ instrux + 1673,
+ instrux + 1674,
+ instrux + 1675,
+};
+
+static const struct itemplate * const itable_0FB9[] = {
+ instrux + 1126,
+ instrux + 1127,
+ instrux + 1128,
+};
+
+static const struct itemplate * const itable_0FBA[] = {
+ instrux + 120,
+ instrux + 121,
+ instrux + 122,
+ instrux + 129,
+ instrux + 130,
+ instrux + 131,
+ instrux + 138,
+ instrux + 139,
+ instrux + 140,
+ instrux + 147,
+ instrux + 148,
+ instrux + 149,
+};
+
+static const struct itemplate * const itable_0FBB[] = {
+ instrux + 123,
+ instrux + 124,
+ instrux + 125,
+ instrux + 126,
+ instrux + 127,
+ instrux + 128,
+};
+
+static const struct itemplate * const itable_0FBC[] = {
+ instrux + 100,
+ instrux + 101,
+ instrux + 102,
+ instrux + 103,
+ instrux + 104,
+ instrux + 105,
+ instrux + 3841,
+ instrux + 3842,
+ instrux + 3843,
+};
+
+static const struct itemplate * const itable_0FBD[] = {
+ instrux + 106,
+ instrux + 107,
+ instrux + 108,
+ instrux + 109,
+ instrux + 110,
+ instrux + 111,
+ instrux + 1599,
+ instrux + 1600,
+ instrux + 1601,
+};
+
+static const struct itemplate * const itable_0FBE[] = {
+ instrux + 659,
+ instrux + 660,
+ instrux + 661,
+ instrux + 663,
+};
+
+static const struct itemplate * const itable_0FBF[] = {
+ instrux + 662,
+ instrux + 664,
+};
+
+static const struct itemplate * const itable_0FC0[] = {
+ instrux + 1140,
+ instrux + 1141,
+};
+
+static const struct itemplate * const itable_0FC1[] = {
+ instrux + 1142,
+ instrux + 1143,
+ instrux + 1144,
+ instrux + 1145,
+ instrux + 1146,
+ instrux + 1147,
+};
+
+static const struct itemplate * const itable_0FC2[] = {
+ instrux + 1220,
+ instrux + 1221,
+ instrux + 1222,
+ instrux + 1223,
+ instrux + 1224,
+ instrux + 1225,
+ instrux + 1226,
+ instrux + 1227,
+ instrux + 1228,
+ instrux + 1229,
+ instrux + 1230,
+ instrux + 1231,
+ instrux + 1232,
+ instrux + 1233,
+ instrux + 1234,
+ instrux + 1235,
+ instrux + 1236,
+ instrux + 1237,
+ instrux + 1238,
+ instrux + 1239,
+ instrux + 1449,
+ instrux + 1450,
+ instrux + 1451,
+ instrux + 1452,
+ instrux + 1453,
+ instrux + 1454,
+ instrux + 1455,
+ instrux + 1456,
+ instrux + 1457,
+ instrux + 1458,
+ instrux + 1459,
+ instrux + 1460,
+ instrux + 1461,
+ instrux + 1462,
+ instrux + 1463,
+ instrux + 1464,
+ instrux + 1465,
+ instrux + 1466,
+};
+
+static const struct itemplate * const itable_0FC3[] = {
+ instrux + 1339,
+ instrux + 1340,
+};
+
+static const struct itemplate * const itable_0FC4[] = {
+ instrux + 1320,
+ instrux + 1321,
+ instrux + 1322,
+ instrux + 1387,
+ instrux + 1388,
+ instrux + 1389,
+};
+
+static const struct itemplate * const itable_0FC5[] = {
+ instrux + 1319,
+ instrux + 1386,
+};
+
+static const struct itemplate * const itable_0FC6[] = {
+ instrux + 1282,
+ instrux + 1518,
+ instrux + 1519,
+};
+
+static const struct itemplate * const itable_0FC7[] = {
+ instrux + 218,
+ instrux + 219,
+ instrux + 1300,
+ instrux + 1301,
+ instrux + 1304,
+ instrux + 1305,
+ instrux + 1308,
+ instrux + 1309,
+ instrux + 1541,
+ instrux + 1546,
+ instrux + 1547,
+ instrux + 1556,
+ instrux + 3170,
+ instrux + 3171,
+ instrux + 3172,
+ instrux + 3185,
+ instrux + 3186,
+ instrux + 3187,
+ instrux + 5966,
+ instrux + 5967,
+ instrux + 5968,
+};
+
+static const struct itemplate * const itable_0FC8[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FC9[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCA[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCB[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCC[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCD[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCE[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FCF[] = {
+ instrux + 112,
+ instrux + 113,
+};
+
+static const struct itemplate * const itable_0FD0[] = {
+ instrux + 1528,
+ instrux + 1529,
+};
+
+static const struct itemplate * const itable_0FD1[] = {
+ instrux + 816,
+ instrux + 1421,
+};
+
+static const struct itemplate * const itable_0FD2[] = {
+ instrux + 812,
+ instrux + 1423,
+};
+
+static const struct itemplate * const itable_0FD3[] = {
+ instrux + 814,
+ instrux + 1425,
+};
+
+static const struct itemplate * const itable_0FD4[] = {
+ instrux + 1370,
+ instrux + 1371,
+};
+
+static const struct itemplate * const itable_0FD5[] = {
+ instrux + 776,
+ instrux + 1398,
+};
+
+static const struct itemplate * const itable_0FD6[] = {
+ instrux + 1356,
+ instrux + 1358,
+ instrux + 1359,
+ instrux + 1363,
+};
+
+static const struct itemplate * const itable_0FD7[] = {
+ instrux + 1327,
+ instrux + 1395,
+};
+
+static const struct itemplate * const itable_0FD8[] = {
+ instrux + 823,
+ instrux + 1434,
+};
+
+static const struct itemplate * const itable_0FD9[] = {
+ instrux + 824,
+ instrux + 1435,
+};
+
+static const struct itemplate * const itable_0FDA[] = {
+ instrux + 1326,
+ instrux + 1394,
+};
+
+static const struct itemplate * const itable_0FDB[] = {
+ instrux + 740,
+ instrux + 1376,
+};
+
+static const struct itemplate * const itable_0FDC[] = {
+ instrux + 737,
+ instrux + 1374,
+};
+
+static const struct itemplate * const itable_0FDD[] = {
+ instrux + 738,
+ instrux + 1375,
+};
+
+static const struct itemplate * const itable_0FDE[] = {
+ instrux + 1324,
+ instrux + 1392,
+};
+
+static const struct itemplate * const itable_0FDF[] = {
+ instrux + 741,
+ instrux + 1377,
+};
+
+static const struct itemplate * const itable_0FE0[] = {
+ instrux + 1317,
+ instrux + 1378,
+};
+
+static const struct itemplate * const itable_0FE1[] = {
+ instrux + 810,
+ instrux + 1416,
+};
+
+static const struct itemplate * const itable_0FE2[] = {
+ instrux + 808,
+ instrux + 1418,
+};
+
+static const struct itemplate * const itable_0FE3[] = {
+ instrux + 1318,
+ instrux + 1379,
+};
+
+static const struct itemplate * const itable_0FE4[] = {
+ instrux + 1328,
+ instrux + 1396,
+};
+
+static const struct itemplate * const itable_0FE5[] = {
+ instrux + 775,
+ instrux + 1397,
+};
+
+static const struct itemplate * const itable_0FE6[] = {
+ instrux + 1468,
+ instrux + 1470,
+ instrux + 1485,
+};
+
+static const struct itemplate * const itable_0FE7[] = {
+ instrux + 1316,
+ instrux + 1338,
+};
+
+static const struct itemplate * const itable_0FE8[] = {
+ instrux + 820,
+ instrux + 1432,
+};
+
+static const struct itemplate * const itable_0FE9[] = {
+ instrux + 822,
+ instrux + 1433,
+};
+
+static const struct itemplate * const itable_0FEA[] = {
+ instrux + 1325,
+ instrux + 1393,
+};
+
+static const struct itemplate * const itable_0FEB[] = {
+ instrux + 799,
+ instrux + 1401,
+};
+
+static const struct itemplate * const itable_0FEC[] = {
+ instrux + 734,
+ instrux + 1372,
+};
+
+static const struct itemplate * const itable_0FED[] = {
+ instrux + 736,
+ instrux + 1373,
+};
+
+static const struct itemplate * const itable_0FEE[] = {
+ instrux + 1323,
+ instrux + 1391,
+};
+
+static const struct itemplate * const itable_0FEF[] = {
+ instrux + 857,
+ instrux + 1444,
+};
+
+static const struct itemplate * const itable_0FF0[] = {
+ instrux + 1534,
+};
+
+static const struct itemplate * const itable_0FF1[] = {
+ instrux + 806,
+ instrux + 1410,
+};
+
+static const struct itemplate * const itable_0FF2[] = {
+ instrux + 802,
+ instrux + 1412,
+};
+
+static const struct itemplate * const itable_0FF3[] = {
+ instrux + 804,
+ instrux + 1414,
+};
+
+static const struct itemplate * const itable_0FF4[] = {
+ instrux + 1399,
+ instrux + 1400,
+};
+
+static const struct itemplate * const itable_0FF5[] = {
+ instrux + 770,
+ instrux + 1390,
+};
+
+static const struct itemplate * const itable_0FF6[] = {
+ instrux + 1329,
+ instrux + 1402,
+};
+
+static const struct itemplate * const itable_0FF7[] = {
+ instrux + 1315,
+ instrux + 1336,
+};
+
+static const struct itemplate * const itable_0FF8[] = {
+ instrux + 818,
+ instrux + 1427,
+};
+
+static const struct itemplate * const itable_0FF9[] = {
+ instrux + 825,
+ instrux + 1428,
+};
+
+static const struct itemplate * const itable_0FFA[] = {
+ instrux + 819,
+ instrux + 1429,
+};
+
+static const struct itemplate * const itable_0FFB[] = {
+ instrux + 1430,
+ instrux + 1431,
+};
+
+static const struct itemplate * const itable_0FFC[] = {
+ instrux + 732,
+ instrux + 1367,
+};
+
+static const struct itemplate * const itable_0FFD[] = {
+ instrux + 739,
+ instrux + 1368,
+};
+
+static const struct itemplate * const itable_0FFE[] = {
+ instrux + 733,
+ instrux + 1369,
+};
+
+static const struct itemplate * const itable_0FFF[] = {
+ instrux + 1122,
+ instrux + 1123,
+ instrux + 1124,
+ instrux + 1125,
+};
+
+static const struct itemplate * const itable_10[] = {
+ instrux + 7,
+ instrux + 8,
+};
+
+static const struct itemplate * const itable_11[] = {
+ instrux + 9,
+ instrux + 10,
+ instrux + 11,
+ instrux + 12,
+ instrux + 13,
+ instrux + 14,
+};
+
+static const struct itemplate * const itable_12[] = {
+ instrux + 15,
+ instrux + 16,
+};
+
+static const struct itemplate * const itable_13[] = {
+ instrux + 17,
+ instrux + 18,
+ instrux + 19,
+ instrux + 20,
+ instrux + 21,
+ instrux + 22,
+};
+
+static const struct itemplate * const itable_14[] = {
+ instrux + 26,
+};
+
+static const struct itemplate * const itable_15[] = {
+ instrux + 27,
+ instrux + 28,
+ instrux + 29,
+};
+
+static const struct itemplate * const itable_16[] = {
+ instrux + 840,
+};
+
+static const struct itemplate * const itable_17[] = {
+ instrux + 788,
+};
+
+static const struct itemplate * const itable_18[] = {
+ instrux + 953,
+ instrux + 954,
+};
+
+static const struct itemplate * const itable_19[] = {
+ instrux + 955,
+ instrux + 956,
+ instrux + 957,
+ instrux + 958,
+ instrux + 959,
+ instrux + 960,
+};
+
+static const struct itemplate * const itable_1A[] = {
+ instrux + 961,
+ instrux + 962,
+};
+
+static const struct itemplate * const itable_1B[] = {
+ instrux + 963,
+ instrux + 964,
+ instrux + 965,
+ instrux + 966,
+ instrux + 967,
+ instrux + 968,
+};
+
+static const struct itemplate * const itable_1C[] = {
+ instrux + 972,
+};
+
+static const struct itemplate * const itable_1D[] = {
+ instrux + 973,
+ instrux + 974,
+ instrux + 975,
+};
+
+static const struct itemplate * const itable_1E[] = {
+ instrux + 841,
+};
+
+static const struct itemplate * const itable_1F[] = {
+ instrux + 789,
+};
+
+static const struct itemplate * const itable_20[] = {
+ instrux + 66,
+ instrux + 67,
+};
+
+static const struct itemplate * const itable_21[] = {
+ instrux + 68,
+ instrux + 69,
+ instrux + 70,
+ instrux + 71,
+ instrux + 72,
+ instrux + 73,
+};
+
+static const struct itemplate * const itable_22[] = {
+ instrux + 74,
+ instrux + 75,
+};
+
+static const struct itemplate * const itable_23[] = {
+ instrux + 76,
+ instrux + 77,
+ instrux + 78,
+ instrux + 79,
+ instrux + 80,
+ instrux + 81,
+};
+
+static const struct itemplate * const itable_24[] = {
+ instrux + 85,
+};
+
+static const struct itemplate * const itable_25[] = {
+ instrux + 86,
+ instrux + 87,
+ instrux + 88,
+};
+
+static const struct itemplate * const itable_27[] = {
+ instrux + 226,
+};
+
+static const struct itemplate * const itable_28[] = {
+ instrux + 1062,
+ instrux + 1063,
+};
+
+static const struct itemplate * const itable_29[] = {
+ instrux + 1064,
+ instrux + 1065,
+ instrux + 1066,
+ instrux + 1067,
+ instrux + 1068,
+ instrux + 1069,
+};
+
+static const struct itemplate * const itable_2A[] = {
+ instrux + 1070,
+ instrux + 1071,
+};
+
+static const struct itemplate * const itable_2B[] = {
+ instrux + 1072,
+ instrux + 1073,
+ instrux + 1074,
+ instrux + 1075,
+ instrux + 1076,
+ instrux + 1077,
+};
+
+static const struct itemplate * const itable_2C[] = {
+ instrux + 1081,
+};
+
+static const struct itemplate * const itable_2D[] = {
+ instrux + 1082,
+ instrux + 1083,
+ instrux + 1084,
+};
+
+static const struct itemplate * const itable_2F[] = {
+ instrux + 227,
+};
+
+static const struct itemplate * const itable_30[] = {
+ instrux + 1173,
+ instrux + 1174,
+};
+
+static const struct itemplate * const itable_31[] = {
+ instrux + 1175,
+ instrux + 1176,
+ instrux + 1177,
+ instrux + 1178,
+ instrux + 1179,
+ instrux + 1180,
+};
+
+static const struct itemplate * const itable_32[] = {
+ instrux + 1181,
+ instrux + 1182,
+};
+
+static const struct itemplate * const itable_33[] = {
+ instrux + 1183,
+ instrux + 1184,
+ instrux + 1185,
+ instrux + 1186,
+ instrux + 1187,
+ instrux + 1188,
+};
+
+static const struct itemplate * const itable_34[] = {
+ instrux + 1192,
+};
+
+static const struct itemplate * const itable_35[] = {
+ instrux + 1193,
+ instrux + 1194,
+ instrux + 1195,
+};
+
+static const struct itemplate * const itable_37[] = {
+ instrux + 1,
+};
+
+static const struct itemplate * const itable_38[] = {
+ instrux + 176,
+ instrux + 177,
+};
+
+static const struct itemplate * const itable_39[] = {
+ instrux + 178,
+ instrux + 179,
+ instrux + 180,
+ instrux + 181,
+ instrux + 182,
+ instrux + 183,
+};
+
+static const struct itemplate * const itable_3A[] = {
+ instrux + 184,
+ instrux + 185,
+};
+
+static const struct itemplate * const itable_3B[] = {
+ instrux + 186,
+ instrux + 187,
+ instrux + 188,
+ instrux + 189,
+ instrux + 190,
+ instrux + 191,
+};
+
+static const struct itemplate * const itable_3C[] = {
+ instrux + 195,
+};
+
+static const struct itemplate * const itable_3D[] = {
+ instrux + 196,
+ instrux + 197,
+ instrux + 198,
+};
+
+static const struct itemplate * const itable_3F[] = {
+ instrux + 6,
+};
+
+static const struct itemplate * const itable_40[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_41[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_42[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_43[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_44[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_45[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_46[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_47[] = {
+ instrux + 468,
+ instrux + 469,
+};
+
+static const struct itemplate * const itable_48[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_49[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4A[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4B[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4C[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4D[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4E[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_4F[] = {
+ instrux + 228,
+ instrux + 229,
+};
+
+static const struct itemplate * const itable_50[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_51[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_52[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_53[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_54[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_55[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_56[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_57[] = {
+ instrux + 832,
+ instrux + 833,
+ instrux + 834,
+};
+
+static const struct itemplate * const itable_58[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_59[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5A[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5B[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5C[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5D[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5E[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_5F[] = {
+ instrux + 781,
+ instrux + 782,
+ instrux + 783,
+};
+
+static const struct itemplate * const itable_60[] = {
+ instrux + 850,
+ instrux + 851,
+ instrux + 852,
+};
+
+static const struct itemplate * const itable_61[] = {
+ instrux + 792,
+ instrux + 793,
+ instrux + 794,
+};
+
+static const struct itemplate * const itable_62[] = {
+ instrux + 98,
+ instrux + 99,
+};
+
+static const struct itemplate * const itable_63[] = {
+ instrux + 96,
+ instrux + 97,
+ instrux + 665,
+};
+
+static const struct itemplate * const itable_68[] = {
+ instrux + 845,
+ instrux + 846,
+ instrux + 847,
+ instrux + 848,
+ instrux + 849,
+};
+
+static const struct itemplate * const itable_69[] = {
+ instrux + 445,
+ instrux + 447,
+ instrux + 449,
+ instrux + 451,
+ instrux + 453,
+ instrux + 455,
+ instrux + 457,
+ instrux + 459,
+ instrux + 461,
+};
+
+static const struct itemplate * const itable_6A[] = {
+ instrux + 844,
+};
+
+static const struct itemplate * const itable_6B[] = {
+ instrux + 444,
+ instrux + 446,
+ instrux + 448,
+ instrux + 450,
+ instrux + 452,
+ instrux + 454,
+ instrux + 456,
+ instrux + 458,
+ instrux + 460,
+};
+
+static const struct itemplate * const itable_6C[] = {
+ instrux + 474,
+};
+
+static const struct itemplate * const itable_6D[] = {
+ instrux + 475,
+ instrux + 476,
+};
+
+static const struct itemplate * const itable_6E[] = {
+ instrux + 726,
+};
+
+static const struct itemplate * const itable_6F[] = {
+ instrux + 727,
+ instrux + 728,
+};
+
+static const struct itemplate * const itable_70[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_71[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_72[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_73[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_74[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_75[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_76[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_77[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_78[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_79[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7A[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7B[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7C[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7D[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7E[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_7F[] = {
+ instrux + 1213,
+};
+
+static const struct itemplate * const itable_80[] = {
+ instrux + 30,
+ instrux + 59,
+ instrux + 63,
+ instrux + 89,
+ instrux + 93,
+ instrux + 199,
+ instrux + 203,
+ instrux + 713,
+ instrux + 717,
+ instrux + 976,
+ instrux + 980,
+ instrux + 1085,
+ instrux + 1089,
+ instrux + 1196,
+ instrux + 1200,
+};
+
+static const struct itemplate * const itable_81[] = {
+ instrux + 31,
+ instrux + 32,
+ instrux + 33,
+ instrux + 34,
+ instrux + 35,
+ instrux + 60,
+ instrux + 61,
+ instrux + 62,
+ instrux + 64,
+ instrux + 65,
+ instrux + 90,
+ instrux + 91,
+ instrux + 92,
+ instrux + 94,
+ instrux + 95,
+ instrux + 200,
+ instrux + 201,
+ instrux + 202,
+ instrux + 204,
+ instrux + 205,
+ instrux + 714,
+ instrux + 715,
+ instrux + 716,
+ instrux + 718,
+ instrux + 719,
+ instrux + 977,
+ instrux + 978,
+ instrux + 979,
+ instrux + 981,
+ instrux + 982,
+ instrux + 1086,
+ instrux + 1087,
+ instrux + 1088,
+ instrux + 1090,
+ instrux + 1091,
+ instrux + 1197,
+ instrux + 1198,
+ instrux + 1199,
+ instrux + 1201,
+ instrux + 1202,
+};
+
+static const struct itemplate * const itable_83[] = {
+ instrux + 23,
+ instrux + 24,
+ instrux + 25,
+ instrux + 52,
+ instrux + 53,
+ instrux + 54,
+ instrux + 82,
+ instrux + 83,
+ instrux + 84,
+ instrux + 192,
+ instrux + 193,
+ instrux + 194,
+ instrux + 706,
+ instrux + 707,
+ instrux + 708,
+ instrux + 969,
+ instrux + 970,
+ instrux + 971,
+ instrux + 1078,
+ instrux + 1079,
+ instrux + 1080,
+ instrux + 1189,
+ instrux + 1190,
+ instrux + 1191,
+};
+
+static const struct itemplate * const itable_84[] = {
+ instrux + 1099,
+ instrux + 1100,
+ instrux + 1107,
+};
+
+static const struct itemplate * const itable_85[] = {
+ instrux + 1101,
+ instrux + 1102,
+ instrux + 1103,
+ instrux + 1104,
+ instrux + 1105,
+ instrux + 1106,
+ instrux + 1108,
+ instrux + 1109,
+ instrux + 1110,
+};
+
+static const struct itemplate * const itable_86[] = {
+ instrux + 1155,
+ instrux + 1156,
+ instrux + 1163,
+ instrux + 1164,
+};
+
+static const struct itemplate * const itable_87[] = {
+ instrux + 1157,
+ instrux + 1158,
+ instrux + 1159,
+ instrux + 1160,
+ instrux + 1161,
+ instrux + 1162,
+ instrux + 1165,
+ instrux + 1166,
+ instrux + 1167,
+ instrux + 1168,
+ instrux + 1169,
+ instrux + 1170,
+};
+
+static const struct itemplate * const itable_88[] = {
+ instrux + 621,
+ instrux + 622,
+};
+
+static const struct itemplate * const itable_89[] = {
+ instrux + 623,
+ instrux + 624,
+ instrux + 625,
+ instrux + 626,
+ instrux + 627,
+ instrux + 628,
+};
+
+static const struct itemplate * const itable_8A[] = {
+ instrux + 629,
+ instrux + 630,
+};
+
+static const struct itemplate * const itable_8B[] = {
+ instrux + 631,
+ instrux + 632,
+ instrux + 633,
+ instrux + 634,
+ instrux + 635,
+ instrux + 636,
+};
+
+static const struct itemplate * const itable_8C[] = {
+ instrux + 597,
+ instrux + 598,
+ instrux + 599,
+ instrux + 600,
+};
+
+static const struct itemplate * const itable_8D[] = {
+ instrux + 533,
+ instrux + 534,
+ instrux + 535,
+};
+
+static const struct itemplate * const itable_8E[] = {
+ instrux + 601,
+ instrux + 602,
+ instrux + 603,
+ instrux + 604,
+};
+
+static const struct itemplate * const itable_8F[] = {
+ instrux + 784,
+ instrux + 785,
+ instrux + 786,
+};
+
+static const struct itemplate * const itable_90[] = {
+ instrux + 682,
+ instrux + 742,
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+ instrux + 1154,
+};
+
+static const struct itemplate * const itable_91[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_92[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_93[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_94[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_95[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_96[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_97[] = {
+ instrux + 1148,
+ instrux + 1149,
+ instrux + 1150,
+ instrux + 1151,
+ instrux + 1152,
+ instrux + 1153,
+};
+
+static const struct itemplate * const itable_98[] = {
+ instrux + 168,
+ instrux + 170,
+ instrux + 225,
+};
+
+static const struct itemplate * const itable_99[] = {
+ instrux + 169,
+ instrux + 223,
+ instrux + 224,
+};
+
+static const struct itemplate * const itable_9A[] = {
+ instrux + 154,
+ instrux + 155,
+ instrux + 156,
+ instrux + 157,
+ instrux + 158,
+};
+
+static const struct itemplate * const itable_9C[] = {
+ instrux + 853,
+ instrux + 854,
+ instrux + 855,
+ instrux + 856,
+};
+
+static const struct itemplate * const itable_9D[] = {
+ instrux + 795,
+ instrux + 796,
+ instrux + 797,
+ instrux + 798,
+};
+
+static const struct itemplate * const itable_9E[] = {
+ instrux + 939,
+};
+
+static const struct itemplate * const itable_9F[] = {
+ instrux + 520,
+};
+
+static const struct itemplate * const itable_A0[] = {
+ instrux + 605,
+};
+
+static const struct itemplate * const itable_A1[] = {
+ instrux + 606,
+ instrux + 607,
+ instrux + 608,
+};
+
+static const struct itemplate * const itable_A2[] = {
+ instrux + 609,
+};
+
+static const struct itemplate * const itable_A3[] = {
+ instrux + 610,
+ instrux + 611,
+ instrux + 612,
+};
+
+static const struct itemplate * const itable_A4[] = {
+ instrux + 655,
+};
+
+static const struct itemplate * const itable_A5[] = {
+ instrux + 656,
+ instrux + 657,
+ instrux + 658,
+};
+
+static const struct itemplate * const itable_A6[] = {
+ instrux + 206,
+};
+
+static const struct itemplate * const itable_A7[] = {
+ instrux + 207,
+ instrux + 208,
+ instrux + 209,
+};
+
+static const struct itemplate * const itable_A8[] = {
+ instrux + 1111,
+};
+
+static const struct itemplate * const itable_A9[] = {
+ instrux + 1112,
+ instrux + 1113,
+ instrux + 1114,
+};
+
+static const struct itemplate * const itable_AA[] = {
+ instrux + 1053,
+};
+
+static const struct itemplate * const itable_AB[] = {
+ instrux + 1054,
+ instrux + 1055,
+ instrux + 1056,
+};
+
+static const struct itemplate * const itable_AC[] = {
+ instrux + 554,
+};
+
+static const struct itemplate * const itable_AD[] = {
+ instrux + 555,
+ instrux + 556,
+ instrux + 557,
+};
+
+static const struct itemplate * const itable_AE[] = {
+ instrux + 983,
+};
+
+static const struct itemplate * const itable_AF[] = {
+ instrux + 984,
+ instrux + 985,
+ instrux + 986,
+};
+
+static const struct itemplate * const itable_B0[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B1[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B2[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B3[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B4[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B5[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B6[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B7[] = {
+ instrux + 637,
+};
+
+static const struct itemplate * const itable_B8[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_B9[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BA[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BB[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BC[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BD[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BE[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_BF[] = {
+ instrux + 638,
+ instrux + 639,
+ instrux + 640,
+};
+
+static const struct itemplate * const itable_C0[] = {
+ instrux + 860,
+ instrux + 872,
+ instrux + 913,
+ instrux + 925,
+ instrux + 943,
+ instrux + 991,
+ instrux + 1015,
+};
+
+static const struct itemplate * const itable_C1[] = {
+ instrux + 863,
+ instrux + 866,
+ instrux + 869,
+ instrux + 875,
+ instrux + 878,
+ instrux + 881,
+ instrux + 916,
+ instrux + 919,
+ instrux + 922,
+ instrux + 928,
+ instrux + 931,
+ instrux + 934,
+ instrux + 946,
+ instrux + 949,
+ instrux + 952,
+ instrux + 994,
+ instrux + 997,
+ instrux + 1000,
+ instrux + 1018,
+ instrux + 1021,
+ instrux + 1024,
+};
+
+static const struct itemplate * const itable_C2[] = {
+ instrux + 888,
+ instrux + 892,
+ instrux + 894,
+ instrux + 898,
+ instrux + 900,
+ instrux + 904,
+ instrux + 906,
+ instrux + 910,
+};
+
+static const struct itemplate * const itable_C3[] = {
+ instrux + 887,
+ instrux + 891,
+ instrux + 893,
+ instrux + 897,
+ instrux + 899,
+ instrux + 903,
+ instrux + 905,
+ instrux + 909,
+};
+
+static const struct itemplate * const itable_C4[] = {
+ instrux + 537,
+ instrux + 538,
+};
+
+static const struct itemplate * const itable_C5[] = {
+ instrux + 531,
+ instrux + 532,
+};
+
+static const struct itemplate * const itable_C6[] = {
+ instrux + 641,
+ instrux + 646,
+ instrux + 3791,
+ instrux + 3792,
+};
+
+static const struct itemplate * const itable_C7[] = {
+ instrux + 642,
+ instrux + 643,
+ instrux + 644,
+ instrux + 645,
+ instrux + 647,
+ instrux + 648,
+ instrux + 3793,
+ instrux + 3794,
+ instrux + 3795,
+ instrux + 3796,
+};
+
+static const struct itemplate * const itable_C8[] = {
+ instrux + 240,
+};
+
+static const struct itemplate * const itable_C9[] = {
+ instrux + 536,
+};
+
+static const struct itemplate * const itable_CA[] = {
+ instrux + 890,
+ instrux + 896,
+ instrux + 902,
+ instrux + 908,
+};
+
+static const struct itemplate * const itable_CB[] = {
+ instrux + 889,
+ instrux + 895,
+ instrux + 901,
+ instrux + 907,
+};
+
+static const struct itemplate * const itable_CC[] = {
+ instrux + 479,
+};
+
+static const struct itemplate * const itable_CD[] = {
+ instrux + 477,
+};
+
+static const struct itemplate * const itable_CE[] = {
+ instrux + 480,
+};
+
+static const struct itemplate * const itable_CF[] = {
+ instrux + 489,
+ instrux + 490,
+ instrux + 491,
+ instrux + 492,
+};
+
+static const struct itemplate * const itable_D0[] = {
+ instrux + 858,
+ instrux + 870,
+ instrux + 911,
+ instrux + 923,
+ instrux + 941,
+ instrux + 989,
+ instrux + 1013,
+};
+
+static const struct itemplate * const itable_D1[] = {
+ instrux + 861,
+ instrux + 864,
+ instrux + 867,
+ instrux + 873,
+ instrux + 876,
+ instrux + 879,
+ instrux + 914,
+ instrux + 917,
+ instrux + 920,
+ instrux + 926,
+ instrux + 929,
+ instrux + 932,
+ instrux + 944,
+ instrux + 947,
+ instrux + 950,
+ instrux + 992,
+ instrux + 995,
+ instrux + 998,
+ instrux + 1016,
+ instrux + 1019,
+ instrux + 1022,
+};
+
+static const struct itemplate * const itable_D2[] = {
+ instrux + 859,
+ instrux + 871,
+ instrux + 912,
+ instrux + 924,
+ instrux + 942,
+ instrux + 990,
+ instrux + 1014,
+};
+
+static const struct itemplate * const itable_D3[] = {
+ instrux + 862,
+ instrux + 865,
+ instrux + 868,
+ instrux + 874,
+ instrux + 877,
+ instrux + 880,
+ instrux + 915,
+ instrux + 918,
+ instrux + 921,
+ instrux + 927,
+ instrux + 930,
+ instrux + 933,
+ instrux + 945,
+ instrux + 948,
+ instrux + 951,
+ instrux + 993,
+ instrux + 996,
+ instrux + 999,
+ instrux + 1017,
+ instrux + 1020,
+ instrux + 1023,
+};
+
+static const struct itemplate * const itable_D4[] = {
+ instrux + 4,
+ instrux + 5,
+};
+
+static const struct itemplate * const itable_D5[] = {
+ instrux + 2,
+ instrux + 3,
+};
+
+static const struct itemplate * const itable_D6[] = {
+ instrux + 940,
+};
+
+static const struct itemplate * const itable_D7[] = {
+ instrux + 1171,
+ instrux + 1172,
+};
+
+static const struct itemplate * const itable_D8[] = {
+ instrux + 245,
+ instrux + 248,
+ instrux + 250,
+ instrux + 275,
+ instrux + 277,
+ instrux + 278,
+ instrux + 283,
+ instrux + 285,
+ instrux + 286,
+ instrux + 291,
+ instrux + 294,
+ instrux + 296,
+ instrux + 299,
+ instrux + 303,
+ instrux + 304,
+ instrux + 355,
+ instrux + 359,
+ instrux + 360,
+ instrux + 396,
+ instrux + 400,
+ instrux + 401,
+ instrux + 404,
+ instrux + 408,
+ instrux + 409,
+};
+
+static const struct itemplate * const itable_D9[] = {
+ instrux + 243,
+ instrux + 244,
+ instrux + 257,
+ instrux + 288,
+ instrux + 289,
+ instrux + 328,
+ instrux + 342,
+ instrux + 345,
+ instrux + 346,
+ instrux + 347,
+ instrux + 348,
+ instrux + 349,
+ instrux + 350,
+ instrux + 351,
+ instrux + 352,
+ instrux + 353,
+ instrux + 354,
+ instrux + 367,
+ instrux + 369,
+ instrux + 370,
+ instrux + 373,
+ instrux + 374,
+ instrux + 375,
+ instrux + 376,
+ instrux + 377,
+ instrux + 380,
+ instrux + 382,
+ instrux + 383,
+ instrux + 384,
+ instrux + 385,
+ instrux + 388,
+ instrux + 389,
+ instrux + 390,
+ instrux + 412,
+ instrux + 422,
+ instrux + 423,
+ instrux + 424,
+ instrux + 425,
+ instrux + 426,
+ instrux + 427,
+ instrux + 428,
+};
+
+static const struct itemplate * const itable_DA[] = {
+ instrux + 259,
+ instrux + 260,
+ instrux + 261,
+ instrux + 262,
+ instrux + 263,
+ instrux + 264,
+ instrux + 273,
+ instrux + 274,
+ instrux + 313,
+ instrux + 315,
+ instrux + 317,
+ instrux + 319,
+ instrux + 321,
+ instrux + 326,
+ instrux + 338,
+ instrux + 340,
+ instrux + 421,
+};
+
+static const struct itemplate * const itable_DB[] = {
+ instrux + 258,
+ instrux + 265,
+ instrux + 266,
+ instrux + 267,
+ instrux + 268,
+ instrux + 269,
+ instrux + 270,
+ instrux + 271,
+ instrux + 272,
+ instrux + 279,
+ instrux + 280,
+ instrux + 290,
+ instrux + 308,
+ instrux + 323,
+ instrux + 329,
+ instrux + 330,
+ instrux + 332,
+ instrux + 336,
+ instrux + 344,
+ instrux + 363,
+ instrux + 364,
+ instrux + 365,
+ instrux + 366,
+ instrux + 381,
+ instrux + 392,
+ instrux + 415,
+ instrux + 416,
+};
+
+static const struct itemplate * const itable_DC[] = {
+ instrux + 246,
+ instrux + 247,
+ instrux + 249,
+ instrux + 276,
+ instrux + 284,
+ instrux + 292,
+ instrux + 293,
+ instrux + 295,
+ instrux + 300,
+ instrux + 301,
+ instrux + 302,
+ instrux + 356,
+ instrux + 357,
+ instrux + 358,
+ instrux + 397,
+ instrux + 398,
+ instrux + 399,
+ instrux + 405,
+ instrux + 406,
+ instrux + 407,
+};
+
+static const struct itemplate * const itable_DD[] = {
+ instrux + 309,
+ instrux + 310,
+ instrux + 337,
+ instrux + 343,
+ instrux + 368,
+ instrux + 371,
+ instrux + 378,
+ instrux + 379,
+ instrux + 386,
+ instrux + 387,
+ instrux + 391,
+ instrux + 393,
+ instrux + 394,
+ instrux + 413,
+ instrux + 414,
+ instrux + 419,
+ instrux + 420,
+};
+
+static const struct itemplate * const itable_DE[] = {
+ instrux + 251,
+ instrux + 252,
+ instrux + 287,
+ instrux + 297,
+ instrux + 298,
+ instrux + 305,
+ instrux + 306,
+ instrux + 314,
+ instrux + 316,
+ instrux + 318,
+ instrux + 320,
+ instrux + 322,
+ instrux + 327,
+ instrux + 339,
+ instrux + 341,
+ instrux + 361,
+ instrux + 362,
+ instrux + 402,
+ instrux + 403,
+ instrux + 410,
+ instrux + 411,
+};
+
+static const struct itemplate * const itable_DF[] = {
+ instrux + 253,
+ instrux + 254,
+ instrux + 255,
+ instrux + 256,
+ instrux + 281,
+ instrux + 282,
+ instrux + 311,
+ instrux + 312,
+ instrux + 324,
+ instrux + 325,
+ instrux + 331,
+ instrux + 333,
+ instrux + 334,
+ instrux + 335,
+ instrux + 372,
+ instrux + 395,
+ instrux + 417,
+ instrux + 418,
+};
+
+static const struct itemplate * const itable_E0[] = {
+ instrux + 566,
+ instrux + 567,
+ instrux + 568,
+ instrux + 569,
+ instrux + 570,
+ instrux + 571,
+ instrux + 572,
+ instrux + 573,
+};
+
+static const struct itemplate * const itable_E1[] = {
+ instrux + 562,
+ instrux + 563,
+ instrux + 564,
+ instrux + 565,
+ instrux + 574,
+ instrux + 575,
+ instrux + 576,
+ instrux + 577,
+};
+
+static const struct itemplate * const itable_E2[] = {
+ instrux + 558,
+ instrux + 559,
+ instrux + 560,
+ instrux + 561,
+};
+
+static const struct itemplate * const itable_E3[] = {
+ instrux + 493,
+ instrux + 494,
+ instrux + 495,
+};
+
+static const struct itemplate * const itable_E4[] = {
+ instrux + 462,
+};
+
+static const struct itemplate * const itable_E5[] = {
+ instrux + 463,
+ instrux + 464,
+};
+
+static const struct itemplate * const itable_E6[] = {
+ instrux + 720,
+};
+
+static const struct itemplate * const itable_E7[] = {
+ instrux + 721,
+ instrux + 722,
+};
+
+static const struct itemplate * const itable_E8[] = {
+ instrux + 150,
+ instrux + 151,
+ instrux + 152,
+ instrux + 153,
+};
+
+static const struct itemplate * const itable_E9[] = {
+ instrux + 497,
+ instrux + 498,
+ instrux + 499,
+ instrux + 500,
+};
+
+static const struct itemplate * const itable_EA[] = {
+ instrux + 501,
+ instrux + 502,
+ instrux + 503,
+ instrux + 504,
+ instrux + 505,
+};
+
+static const struct itemplate * const itable_EB[] = {
+ instrux + 496,
+};
+
+static const struct itemplate * const itable_EC[] = {
+ instrux + 465,
+};
+
+static const struct itemplate * const itable_ED[] = {
+ instrux + 466,
+ instrux + 467,
+};
+
+static const struct itemplate * const itable_EE[] = {
+ instrux + 723,
+};
+
+static const struct itemplate * const itable_EF[] = {
+ instrux + 724,
+ instrux + 725,
+};
+
+static const struct itemplate * const itable_F1[] = {
+ instrux + 478,
+ instrux + 1044,
+};
+
+static const struct itemplate * const itable_F4[] = {
+ instrux + 429,
+};
+
+static const struct itemplate * const itable_F5[] = {
+ instrux + 175,
+};
+
+static const struct itemplate * const itable_F6[] = {
+ instrux + 234,
+ instrux + 430,
+ instrux + 434,
+ instrux + 672,
+ instrux + 678,
+ instrux + 686,
+ instrux + 1115,
+ instrux + 1119,
+};
+
+static const struct itemplate * const itable_F7[] = {
+ instrux + 235,
+ instrux + 236,
+ instrux + 237,
+ instrux + 431,
+ instrux + 432,
+ instrux + 433,
+ instrux + 435,
+ instrux + 436,
+ instrux + 437,
+ instrux + 673,
+ instrux + 674,
+ instrux + 675,
+ instrux + 679,
+ instrux + 680,
+ instrux + 681,
+ instrux + 687,
+ instrux + 688,
+ instrux + 689,
+ instrux + 1116,
+ instrux + 1117,
+ instrux + 1118,
+ instrux + 1120,
+ instrux + 1121,
+};
+
+static const struct itemplate * const itable_F8[] = {
+ instrux + 171,
+};
+
+static const struct itemplate * const itable_F9[] = {
+ instrux + 1050,
+};
+
+static const struct itemplate * const itable_FA[] = {
+ instrux + 173,
+};
+
+static const struct itemplate * const itable_FB[] = {
+ instrux + 1052,
+};
+
+static const struct itemplate * const itable_FC[] = {
+ instrux + 172,
+};
+
+static const struct itemplate * const itable_FD[] = {
+ instrux + 1051,
+};
+
+static const struct itemplate * const itable_FE[] = {
+ instrux + 230,
+ instrux + 470,
+};
+
+static const struct itemplate * const itable_FF[] = {
+ instrux + 159,
+ instrux + 160,
+ instrux + 161,
+ instrux + 162,
+ instrux + 163,
+ instrux + 164,
+ instrux + 165,
+ instrux + 166,
+ instrux + 167,
+ instrux + 231,
+ instrux + 232,
+ instrux + 233,
+ instrux + 471,
+ instrux + 472,
+ instrux + 473,
+ instrux + 506,
+ instrux + 507,
+ instrux + 508,
+ instrux + 509,
+ instrux + 510,
+ instrux + 511,
+ instrux + 512,
+ instrux + 513,
+ instrux + 514,
+ instrux + 835,
+ instrux + 836,
+ instrux + 837,
+};
+
+static const struct itemplate * const itable_evex01010[] = {
+ instrux + 4593,
+ instrux + 4594,
+ instrux + 4595,
+};
+
+static const struct itemplate * const itable_evex01011[] = {
+ instrux + 4596,
+ instrux + 4597,
+ instrux + 4598,
+ instrux + 4599,
+ instrux + 4600,
+ instrux + 4601,
+};
+
+static const struct itemplate * const itable_evex01012[] = {
+ instrux + 4534,
+ instrux + 4535,
+ instrux + 4547,
+ instrux + 4548,
+};
+
+static const struct itemplate * const itable_evex01013[] = {
+ instrux + 4549,
+};
+
+static const struct itemplate * const itable_evex01014[] = {
+ instrux + 5946,
+ instrux + 5947,
+ instrux + 5948,
+ instrux + 5949,
+ instrux + 5950,
+ instrux + 5951,
+};
+
+static const struct itemplate * const itable_evex01015[] = {
+ instrux + 5934,
+ instrux + 5935,
+ instrux + 5936,
+ instrux + 5937,
+ instrux + 5938,
+ instrux + 5939,
+};
+
+static const struct itemplate * const itable_evex01016[] = {
+ instrux + 4539,
+ instrux + 4540,
+ instrux + 4542,
+ instrux + 4543,
+};
+
+static const struct itemplate * const itable_evex01017[] = {
+ instrux + 4541,
+};
+
+static const struct itemplate * const itable_evex01028[] = {
+ instrux + 4484,
+ instrux + 4485,
+ instrux + 4486,
+};
+
+static const struct itemplate * const itable_evex01029[] = {
+ instrux + 4487,
+ instrux + 4488,
+ instrux + 4489,
+ instrux + 4490,
+ instrux + 4491,
+ instrux + 4492,
+};
+
+static const struct itemplate * const itable_evex0102B[] = {
+ instrux + 4559,
+ instrux + 4560,
+ instrux + 4561,
+};
+
+static const struct itemplate * const itable_evex0102E[] = {
+ instrux + 5927,
+};
+
+static const struct itemplate * const itable_evex0102F[] = {
+ instrux + 4036,
+};
+
+static const struct itemplate * const itable_evex01051[] = {
+ instrux + 5903,
+ instrux + 5904,
+ instrux + 5905,
+};
+
+static const struct itemplate * const itable_evex01054[] = {
+ instrux + 3988,
+ instrux + 3989,
+ instrux + 3990,
+ instrux + 3991,
+ instrux + 3992,
+ instrux + 3993,
+};
+
+static const struct itemplate * const itable_evex01055[] = {
+ instrux + 3976,
+ instrux + 3977,
+ instrux + 3978,
+ instrux + 3979,
+ instrux + 3980,
+ instrux + 3981,
+};
+
+static const struct itemplate * const itable_evex01056[] = {
+ instrux + 4624,
+ instrux + 4625,
+ instrux + 4626,
+ instrux + 4627,
+ instrux + 4628,
+ instrux + 4629,
+};
+
+static const struct itemplate * const itable_evex01057[] = {
+ instrux + 5958,
+ instrux + 5959,
+ instrux + 5960,
+ instrux + 5961,
+ instrux + 5962,
+ instrux + 5963,
+};
+
+static const struct itemplate * const itable_evex01058[] = {
+ instrux + 3948,
+ instrux + 3949,
+ instrux + 3950,
+ instrux + 3951,
+ instrux + 3952,
+ instrux + 3953,
+};
+
+static const struct itemplate * const itable_evex01059[] = {
+ instrux + 4608,
+ instrux + 4609,
+ instrux + 4610,
+ instrux + 4611,
+ instrux + 4612,
+ instrux + 4613,
+};
+
+static const struct itemplate * const itable_evex0105A[] = {
+ instrux + 4076,
+ instrux + 4077,
+ instrux + 4078,
+};
+
+static const struct itemplate * const itable_evex0105B[] = {
+ instrux + 4052,
+ instrux + 4053,
+ instrux + 4054,
+ instrux + 4097,
+ instrux + 4098,
+ instrux + 4099,
+};
+
+static const struct itemplate * const itable_evex0105C[] = {
+ instrux + 5916,
+ instrux + 5917,
+ instrux + 5918,
+ instrux + 5919,
+ instrux + 5920,
+ instrux + 5921,
+};
+
+static const struct itemplate * const itable_evex0105D[] = {
+ instrux + 4465,
+ instrux + 4466,
+ instrux + 4467,
+ instrux + 4468,
+ instrux + 4469,
+ instrux + 4470,
+};
+
+static const struct itemplate * const itable_evex0105E[] = {
+ instrux + 4174,
+ instrux + 4175,
+ instrux + 4176,
+ instrux + 4177,
+ instrux + 4178,
+ instrux + 4179,
+};
+
+static const struct itemplate * const itable_evex0105F[] = {
+ instrux + 4449,
+ instrux + 4450,
+ instrux + 4451,
+ instrux + 4452,
+ instrux + 4453,
+ instrux + 4454,
+};
+
+static const struct itemplate * const itable_evex01078[] = {
+ instrux + 4120,
+ instrux + 4121,
+ instrux + 4122,
+ instrux + 4132,
+ instrux + 4133,
+ instrux + 4134,
+};
+
+static const struct itemplate * const itable_evex01079[] = {
+ instrux + 4064,
+ instrux + 4065,
+ instrux + 4066,
+ instrux + 4088,
+ instrux + 4089,
+ instrux + 4090,
+};
+
+static const struct itemplate * const itable_evex010C2[] = {
+ instrux + 4030,
+ instrux + 4031,
+ instrux + 4032,
+};
+
+static const struct itemplate * const itable_evex010C6[] = {
+ instrux + 5894,
+ instrux + 5895,
+ instrux + 5896,
+ instrux + 5897,
+ instrux + 5898,
+ instrux + 5899,
+};
+
+static const struct itemplate * const itable_evex01110[] = {
+ instrux + 4584,
+ instrux + 4585,
+ instrux + 4586,
+};
+
+static const struct itemplate * const itable_evex01111[] = {
+ instrux + 4587,
+ instrux + 4588,
+ instrux + 4589,
+ instrux + 4590,
+ instrux + 4591,
+ instrux + 4592,
+};
+
+static const struct itemplate * const itable_evex01112[] = {
+ instrux + 4544,
+ instrux + 4545,
+};
+
+static const struct itemplate * const itable_evex01113[] = {
+ instrux + 4546,
+};
+
+static const struct itemplate * const itable_evex01114[] = {
+ instrux + 5940,
+ instrux + 5941,
+ instrux + 5942,
+ instrux + 5943,
+ instrux + 5944,
+ instrux + 5945,
+};
+
+static const struct itemplate * const itable_evex01115[] = {
+ instrux + 5928,
+ instrux + 5929,
+ instrux + 5930,
+ instrux + 5931,
+ instrux + 5932,
+ instrux + 5933,
+};
+
+static const struct itemplate * const itable_evex01116[] = {
+ instrux + 4536,
+ instrux + 4537,
+};
+
+static const struct itemplate * const itable_evex01117[] = {
+ instrux + 4538,
+};
+
+static const struct itemplate * const itable_evex01128[] = {
+ instrux + 4475,
+ instrux + 4476,
+ instrux + 4477,
+};
+
+static const struct itemplate * const itable_evex01129[] = {
+ instrux + 4478,
+ instrux + 4479,
+ instrux + 4480,
+ instrux + 4481,
+ instrux + 4482,
+ instrux + 4483,
+};
+
+static const struct itemplate * const itable_evex0112B[] = {
+ instrux + 4556,
+ instrux + 4557,
+ instrux + 4558,
+};
+
+static const struct itemplate * const itable_evex0112E[] = {
+ instrux + 5926,
+};
+
+static const struct itemplate * const itable_evex0112F[] = {
+ instrux + 4035,
+};
+
+static const struct itemplate * const itable_evex01151[] = {
+ instrux + 5900,
+ instrux + 5901,
+ instrux + 5902,
+};
+
+static const struct itemplate * const itable_evex01154[] = {
+ instrux + 3982,
+ instrux + 3983,
+ instrux + 3984,
+ instrux + 3985,
+ instrux + 3986,
+ instrux + 3987,
+};
+
+static const struct itemplate * const itable_evex01155[] = {
+ instrux + 3970,
+ instrux + 3971,
+ instrux + 3972,
+ instrux + 3973,
+ instrux + 3974,
+ instrux + 3975,
+};
+
+static const struct itemplate * const itable_evex01156[] = {
+ instrux + 4618,
+ instrux + 4619,
+ instrux + 4620,
+ instrux + 4621,
+ instrux + 4622,
+ instrux + 4623,
+};
+
+static const struct itemplate * const itable_evex01157[] = {
+ instrux + 5952,
+ instrux + 5953,
+ instrux + 5954,
+ instrux + 5955,
+ instrux + 5956,
+ instrux + 5957,
+};
+
+static const struct itemplate * const itable_evex01158[] = {
+ instrux + 3942,
+ instrux + 3943,
+ instrux + 3944,
+ instrux + 3945,
+ instrux + 3946,
+ instrux + 3947,
+};
+
+static const struct itemplate * const itable_evex01159[] = {
+ instrux + 4602,
+ instrux + 4603,
+ instrux + 4604,
+ instrux + 4605,
+ instrux + 4606,
+ instrux + 4607,
+};
+
+static const struct itemplate * const itable_evex0115A[] = {
+ instrux + 4058,
+ instrux + 4059,
+ instrux + 4060,
+};
+
+static const struct itemplate * const itable_evex0115B[] = {
+ instrux + 4073,
+ instrux + 4074,
+ instrux + 4075,
+};
+
+static const struct itemplate * const itable_evex0115C[] = {
+ instrux + 5910,
+ instrux + 5911,
+ instrux + 5912,
+ instrux + 5913,
+ instrux + 5914,
+ instrux + 5915,
+};
+
+static const struct itemplate * const itable_evex0115D[] = {
+ instrux + 4459,
+ instrux + 4460,
+ instrux + 4461,
+ instrux + 4462,
+ instrux + 4463,
+ instrux + 4464,
+};
+
+static const struct itemplate * const itable_evex0115E[] = {
+ instrux + 4168,
+ instrux + 4169,
+ instrux + 4170,
+ instrux + 4171,
+ instrux + 4172,
+ instrux + 4173,
+};
+
+static const struct itemplate * const itable_evex0115F[] = {
+ instrux + 4443,
+ instrux + 4444,
+ instrux + 4445,
+ instrux + 4446,
+ instrux + 4447,
+ instrux + 4448,
+};
+
+static const struct itemplate * const itable_evex01160[] = {
+ instrux + 5732,
+ instrux + 5733,
+ instrux + 5734,
+ instrux + 5735,
+ instrux + 5736,
+ instrux + 5737,
+};
+
+static const struct itemplate * const itable_evex01161[] = {
+ instrux + 5750,
+ instrux + 5751,
+ instrux + 5752,
+ instrux + 5753,
+ instrux + 5754,
+ instrux + 5755,
+};
+
+static const struct itemplate * const itable_evex01162[] = {
+ instrux + 5738,
+ instrux + 5739,
+ instrux + 5740,
+ instrux + 5741,
+ instrux + 5742,
+ instrux + 5743,
+};
+
+static const struct itemplate * const itable_evex01163[] = {
+ instrux + 4648,
+ instrux + 4649,
+ instrux + 4650,
+ instrux + 4651,
+ instrux + 4652,
+ instrux + 4653,
+};
+
+static const struct itemplate * const itable_evex01164[] = {
+ instrux + 4837,
+ instrux + 4838,
+ instrux + 4839,
+};
+
+static const struct itemplate * const itable_evex01165[] = {
+ instrux + 4846,
+ instrux + 4847,
+ instrux + 4848,
+};
+
+static const struct itemplate * const itable_evex01166[] = {
+ instrux + 4840,
+ instrux + 4841,
+ instrux + 4842,
+};
+
+static const struct itemplate * const itable_evex01167[] = {
+ instrux + 4660,
+ instrux + 4661,
+ instrux + 4662,
+ instrux + 4663,
+ instrux + 4664,
+ instrux + 4665,
+};
+
+static const struct itemplate * const itable_evex01168[] = {
+ instrux + 5708,
+ instrux + 5709,
+ instrux + 5710,
+ instrux + 5711,
+ instrux + 5712,
+ instrux + 5713,
+};
+
+static const struct itemplate * const itable_evex01169[] = {
+ instrux + 5726,
+ instrux + 5727,
+ instrux + 5728,
+ instrux + 5729,
+ instrux + 5730,
+ instrux + 5731,
+};
+
+static const struct itemplate * const itable_evex0116A[] = {
+ instrux + 5714,
+ instrux + 5715,
+ instrux + 5716,
+ instrux + 5717,
+ instrux + 5718,
+ instrux + 5719,
+};
+
+static const struct itemplate * const itable_evex0116B[] = {
+ instrux + 4642,
+ instrux + 4643,
+ instrux + 4644,
+ instrux + 4645,
+ instrux + 4646,
+ instrux + 4647,
+};
+
+static const struct itemplate * const itable_evex0116C[] = {
+ instrux + 5744,
+ instrux + 5745,
+ instrux + 5746,
+ instrux + 5747,
+ instrux + 5748,
+ instrux + 5749,
+};
+
+static const struct itemplate * const itable_evex0116D[] = {
+ instrux + 5720,
+ instrux + 5721,
+ instrux + 5722,
+ instrux + 5723,
+ instrux + 5724,
+ instrux + 5725,
+};
+
+static const struct itemplate * const itable_evex0116E[] = {
+ instrux + 4493,
+ instrux + 4562,
+};
+
+static const struct itemplate * const itable_evex0116F[] = {
+ instrux + 4498,
+ instrux + 4499,
+ instrux + 4500,
+ instrux + 4504,
+ instrux + 4505,
+ instrux + 4506,
+};
+
+static const struct itemplate * const itable_evex01170[] = {
+ instrux + 5447,
+ instrux + 5448,
+ instrux + 5449,
+};
+
+static const struct itemplate * const itable_evex01171[] = {
+ instrux + 5510,
+ instrux + 5511,
+ instrux + 5512,
+ instrux + 5513,
+ instrux + 5514,
+ instrux + 5515,
+ instrux + 5564,
+ instrux + 5565,
+ instrux + 5566,
+ instrux + 5567,
+ instrux + 5568,
+ instrux + 5569,
+ instrux + 5624,
+ instrux + 5625,
+ instrux + 5626,
+ instrux + 5627,
+ instrux + 5628,
+ instrux + 5629,
+};
+
+static const struct itemplate * const itable_evex01172[] = {
+ instrux + 5375,
+ instrux + 5376,
+ instrux + 5377,
+ instrux + 5378,
+ instrux + 5379,
+ instrux + 5380,
+ instrux + 5381,
+ instrux + 5382,
+ instrux + 5383,
+ instrux + 5384,
+ instrux + 5385,
+ instrux + 5386,
+ instrux + 5399,
+ instrux + 5400,
+ instrux + 5401,
+ instrux + 5402,
+ instrux + 5403,
+ instrux + 5404,
+ instrux + 5405,
+ instrux + 5406,
+ instrux + 5407,
+ instrux + 5408,
+ instrux + 5409,
+ instrux + 5410,
+ instrux + 5462,
+ instrux + 5463,
+ instrux + 5464,
+ instrux + 5465,
+ instrux + 5466,
+ instrux + 5467,
+ instrux + 5522,
+ instrux + 5523,
+ instrux + 5524,
+ instrux + 5525,
+ instrux + 5526,
+ instrux + 5527,
+ instrux + 5534,
+ instrux + 5535,
+ instrux + 5536,
+ instrux + 5537,
+ instrux + 5538,
+ instrux + 5539,
+ instrux + 5576,
+ instrux + 5577,
+ instrux + 5578,
+ instrux + 5579,
+ instrux + 5580,
+ instrux + 5581,
+};
+
+static const struct itemplate * const itable_evex01173[] = {
+ instrux + 5468,
+ instrux + 5469,
+ instrux + 5470,
+ instrux + 5471,
+ instrux + 5472,
+ instrux + 5473,
+ instrux + 5480,
+ instrux + 5481,
+ instrux + 5482,
+ instrux + 5483,
+ instrux + 5484,
+ instrux + 5485,
+ instrux + 5582,
+ instrux + 5583,
+ instrux + 5584,
+ instrux + 5585,
+ instrux + 5586,
+ instrux + 5587,
+ instrux + 5594,
+ instrux + 5595,
+ instrux + 5596,
+ instrux + 5597,
+ instrux + 5598,
+ instrux + 5599,
+};
+
+static const struct itemplate * const itable_evex01174[] = {
+ instrux + 4825,
+ instrux + 4826,
+ instrux + 4827,
+};
+
+static const struct itemplate * const itable_evex01175[] = {
+ instrux + 4834,
+ instrux + 4835,
+ instrux + 4836,
+};
+
+static const struct itemplate * const itable_evex01176[] = {
+ instrux + 4828,
+ instrux + 4829,
+ instrux + 4830,
+};
+
+static const struct itemplate * const itable_evex01178[] = {
+ instrux + 4123,
+ instrux + 4124,
+ instrux + 4125,
+ instrux + 4135,
+ instrux + 4136,
+ instrux + 4137,
+};
+
+static const struct itemplate * const itable_evex01179[] = {
+ instrux + 4067,
+ instrux + 4068,
+ instrux + 4069,
+ instrux + 4091,
+ instrux + 4092,
+ instrux + 4093,
+};
+
+static const struct itemplate * const itable_evex0117A[] = {
+ instrux + 4117,
+ instrux + 4118,
+ instrux + 4119,
+ instrux + 4129,
+ instrux + 4130,
+ instrux + 4131,
+};
+
+static const struct itemplate * const itable_evex0117B[] = {
+ instrux + 4061,
+ instrux + 4062,
+ instrux + 4063,
+ instrux + 4085,
+ instrux + 4086,
+ instrux + 4087,
+};
+
+static const struct itemplate * const itable_evex0117E[] = {
+ instrux + 4494,
+ instrux + 4563,
+};
+
+static const struct itemplate * const itable_evex0117F[] = {
+ instrux + 4501,
+ instrux + 4502,
+ instrux + 4503,
+ instrux + 4507,
+ instrux + 4508,
+ instrux + 4509,
+};
+
+static const struct itemplate * const itable_evex011C2[] = {
+ instrux + 4027,
+ instrux + 4028,
+ instrux + 4029,
+};
+
+static const struct itemplate * const itable_evex011C4[] = {
+ instrux + 5017,
+ instrux + 5018,
+ instrux + 5019,
+ instrux + 5020,
+};
+
+static const struct itemplate * const itable_evex011C5[] = {
+ instrux + 4994,
+ instrux + 4995,
+ instrux + 4996,
+};
+
+static const struct itemplate * const itable_evex011C6[] = {
+ instrux + 5888,
+ instrux + 5889,
+ instrux + 5890,
+ instrux + 5891,
+ instrux + 5892,
+ instrux + 5893,
+};
+
+static const struct itemplate * const itable_evex011D1[] = {
+ instrux + 5618,
+ instrux + 5619,
+ instrux + 5620,
+ instrux + 5621,
+ instrux + 5622,
+ instrux + 5623,
+};
+
+static const struct itemplate * const itable_evex011D2[] = {
+ instrux + 5570,
+ instrux + 5571,
+ instrux + 5572,
+ instrux + 5573,
+ instrux + 5574,
+ instrux + 5575,
+};
+
+static const struct itemplate * const itable_evex011D3[] = {
+ instrux + 5588,
+ instrux + 5589,
+ instrux + 5590,
+ instrux + 5591,
+ instrux + 5592,
+ instrux + 5593,
+};
+
+static const struct itemplate * const itable_evex011D4[] = {
+ instrux + 4678,
+ instrux + 4679,
+ instrux + 4680,
+ instrux + 4681,
+ instrux + 4682,
+ instrux + 4683,
+};
+
+static const struct itemplate * const itable_evex011D5[] = {
+ instrux + 5345,
+ instrux + 5346,
+ instrux + 5347,
+ instrux + 5348,
+ instrux + 5349,
+ instrux + 5350,
+};
+
+static const struct itemplate * const itable_evex011D6[] = {
+ instrux + 4565,
+};
+
+static const struct itemplate * const itable_evex011D8[] = {
+ instrux + 5660,
+ instrux + 5661,
+ instrux + 5662,
+ instrux + 5663,
+ instrux + 5664,
+ instrux + 5665,
+};
+
+static const struct itemplate * const itable_evex011D9[] = {
+ instrux + 5666,
+ instrux + 5667,
+ instrux + 5668,
+ instrux + 5669,
+ instrux + 5670,
+ instrux + 5671,
+};
+
+static const struct itemplate * const itable_evex011DA[] = {
+ instrux + 5117,
+ instrux + 5118,
+ instrux + 5119,
+ instrux + 5120,
+ instrux + 5121,
+ instrux + 5122,
+};
+
+static const struct itemplate * const itable_evex011DB[] = {
+ instrux + 4720,
+ instrux + 4721,
+ instrux + 4722,
+ instrux + 4723,
+ instrux + 4724,
+ instrux + 4725,
+ instrux + 4738,
+ instrux + 4739,
+ instrux + 4740,
+ instrux + 4741,
+ instrux + 4742,
+ instrux + 4743,
+};
+
+static const struct itemplate * const itable_evex011DC[] = {
+ instrux + 4696,
+ instrux + 4697,
+ instrux + 4698,
+ instrux + 4699,
+ instrux + 4700,
+ instrux + 4701,
+};
+
+static const struct itemplate * const itable_evex011DD[] = {
+ instrux + 4702,
+ instrux + 4703,
+ instrux + 4704,
+ instrux + 4705,
+ instrux + 4706,
+ instrux + 4707,
+};
+
+static const struct itemplate * const itable_evex011DE[] = {
+ instrux + 5069,
+ instrux + 5070,
+ instrux + 5071,
+ instrux + 5072,
+ instrux + 5073,
+ instrux + 5074,
+};
+
+static const struct itemplate * const itable_evex011DF[] = {
+ instrux + 4726,
+ instrux + 4727,
+ instrux + 4728,
+ instrux + 4729,
+ instrux + 4730,
+ instrux + 4731,
+ instrux + 4732,
+ instrux + 4733,
+ instrux + 4734,
+ instrux + 4735,
+ instrux + 4736,
+ instrux + 4737,
+};
+
+static const struct itemplate * const itable_evex011E0[] = {
+ instrux + 4744,
+ instrux + 4745,
+ instrux + 4746,
+ instrux + 4747,
+ instrux + 4748,
+ instrux + 4749,
+};
+
+static const struct itemplate * const itable_evex011E1[] = {
+ instrux + 5558,
+ instrux + 5559,
+ instrux + 5560,
+ instrux + 5561,
+ instrux + 5562,
+ instrux + 5563,
+};
+
+static const struct itemplate * const itable_evex011E2[] = {
+ instrux + 5516,
+ instrux + 5517,
+ instrux + 5518,
+ instrux + 5519,
+ instrux + 5520,
+ instrux + 5521,
+ instrux + 5528,
+ instrux + 5529,
+ instrux + 5530,
+ instrux + 5531,
+ instrux + 5532,
+ instrux + 5533,
+};
+
+static const struct itemplate * const itable_evex011E3[] = {
+ instrux + 4750,
+ instrux + 4751,
+ instrux + 4752,
+ instrux + 4753,
+ instrux + 4754,
+ instrux + 4755,
+};
+
+static const struct itemplate * const itable_evex011E4[] = {
+ instrux + 5321,
+ instrux + 5322,
+ instrux + 5323,
+ instrux + 5324,
+ instrux + 5325,
+ instrux + 5326,
+};
+
+static const struct itemplate * const itable_evex011E5[] = {
+ instrux + 5327,
+ instrux + 5328,
+ instrux + 5329,
+ instrux + 5330,
+ instrux + 5331,
+ instrux + 5332,
+};
+
+static const struct itemplate * const itable_evex011E6[] = {
+ instrux + 4114,
+ instrux + 4115,
+ instrux + 4116,
+};
+
+static const struct itemplate * const itable_evex011E7[] = {
+ instrux + 4550,
+ instrux + 4551,
+ instrux + 4552,
+};
+
+static const struct itemplate * const itable_evex011E8[] = {
+ instrux + 5648,
+ instrux + 5649,
+ instrux + 5650,
+ instrux + 5651,
+ instrux + 5652,
+ instrux + 5653,
+};
+
+static const struct itemplate * const itable_evex011E9[] = {
+ instrux + 5654,
+ instrux + 5655,
+ instrux + 5656,
+ instrux + 5657,
+ instrux + 5658,
+ instrux + 5659,
+};
+
+static const struct itemplate * const itable_evex011EA[] = {
+ instrux + 5111,
+ instrux + 5112,
+ instrux + 5113,
+ instrux + 5114,
+ instrux + 5115,
+ instrux + 5116,
+};
+
+static const struct itemplate * const itable_evex011EB[] = {
+ instrux + 5363,
+ instrux + 5364,
+ instrux + 5365,
+ instrux + 5366,
+ instrux + 5367,
+ instrux + 5368,
+ instrux + 5369,
+ instrux + 5370,
+ instrux + 5371,
+ instrux + 5372,
+ instrux + 5373,
+ instrux + 5374,
+};
+
+static const struct itemplate * const itable_evex011EC[] = {
+ instrux + 4684,
+ instrux + 4685,
+ instrux + 4686,
+ instrux + 4687,
+ instrux + 4688,
+ instrux + 4689,
+};
+
+static const struct itemplate * const itable_evex011ED[] = {
+ instrux + 4690,
+ instrux + 4691,
+ instrux + 4692,
+ instrux + 4693,
+ instrux + 4694,
+ instrux + 4695,
+};
+
+static const struct itemplate * const itable_evex011EE[] = {
+ instrux + 5063,
+ instrux + 5064,
+ instrux + 5065,
+ instrux + 5066,
+ instrux + 5067,
+ instrux + 5068,
+};
+
+static const struct itemplate * const itable_evex011EF[] = {
+ instrux + 5756,
+ instrux + 5757,
+ instrux + 5758,
+ instrux + 5759,
+ instrux + 5760,
+ instrux + 5761,
+ instrux + 5762,
+ instrux + 5763,
+ instrux + 5764,
+ instrux + 5765,
+ instrux + 5766,
+ instrux + 5767,
+};
+
+static const struct itemplate * const itable_evex011F1[] = {
+ instrux + 5504,
+ instrux + 5505,
+ instrux + 5506,
+ instrux + 5507,
+ instrux + 5508,
+ instrux + 5509,
+};
+
+static const struct itemplate * const itable_evex011F2[] = {
+ instrux + 5456,
+ instrux + 5457,
+ instrux + 5458,
+ instrux + 5459,
+ instrux + 5460,
+ instrux + 5461,
+};
+
+static const struct itemplate * const itable_evex011F3[] = {
+ instrux + 5474,
+ instrux + 5475,
+ instrux + 5476,
+ instrux + 5477,
+ instrux + 5478,
+ instrux + 5479,
+};
+
+static const struct itemplate * const itable_evex011F4[] = {
+ instrux + 5357,
+ instrux + 5358,
+ instrux + 5359,
+ instrux + 5360,
+ instrux + 5361,
+ instrux + 5362,
+};
+
+static const struct itemplate * const itable_evex011F5[] = {
+ instrux + 5039,
+ instrux + 5040,
+ instrux + 5041,
+ instrux + 5042,
+ instrux + 5043,
+ instrux + 5044,
+};
+
+static const struct itemplate * const itable_evex011F6[] = {
+ instrux + 5423,
+ instrux + 5424,
+ instrux + 5425,
+ instrux + 5426,
+ instrux + 5427,
+ instrux + 5428,
+};
+
+static const struct itemplate * const itable_evex011F8[] = {
+ instrux + 5630,
+ instrux + 5631,
+ instrux + 5632,
+ instrux + 5633,
+ instrux + 5634,
+ instrux + 5635,
+};
+
+static const struct itemplate * const itable_evex011F9[] = {
+ instrux + 5672,
+ instrux + 5673,
+ instrux + 5674,
+ instrux + 5675,
+ instrux + 5676,
+ instrux + 5677,
+};
+
+static const struct itemplate * const itable_evex011FA[] = {
+ instrux + 5636,
+ instrux + 5637,
+ instrux + 5638,
+ instrux + 5639,
+ instrux + 5640,
+ instrux + 5641,
+};
+
+static const struct itemplate * const itable_evex011FB[] = {
+ instrux + 5642,
+ instrux + 5643,
+ instrux + 5644,
+ instrux + 5645,
+ instrux + 5646,
+ instrux + 5647,
+};
+
+static const struct itemplate * const itable_evex011FC[] = {
+ instrux + 4666,
+ instrux + 4667,
+ instrux + 4668,
+ instrux + 4669,
+ instrux + 4670,
+ instrux + 4671,
+};
+
+static const struct itemplate * const itable_evex011FD[] = {
+ instrux + 4708,
+ instrux + 4709,
+ instrux + 4710,
+ instrux + 4711,
+ instrux + 4712,
+ instrux + 4713,
+};
+
+static const struct itemplate * const itable_evex011FE[] = {
+ instrux + 4672,
+ instrux + 4673,
+ instrux + 4674,
+ instrux + 4675,
+ instrux + 4676,
+ instrux + 4677,
+};
+
+static const struct itemplate * const itable_evex01210[] = {
+ instrux + 4578,
+ instrux + 4580,
+ instrux + 4581,
+};
+
+static const struct itemplate * const itable_evex01211[] = {
+ instrux + 4579,
+ instrux + 4582,
+ instrux + 4583,
+};
+
+static const struct itemplate * const itable_evex01212[] = {
+ instrux + 4575,
+ instrux + 4576,
+ instrux + 4577,
+};
+
+static const struct itemplate * const itable_evex01216[] = {
+ instrux + 4572,
+ instrux + 4573,
+ instrux + 4574,
+};
+
+static const struct itemplate * const itable_evex0122A[] = {
+ instrux + 4107,
+ instrux + 4108,
+};
+
+static const struct itemplate * const itable_evex0122C[] = {
+ instrux + 4142,
+ instrux + 4143,
+};
+
+static const struct itemplate * const itable_evex0122D[] = {
+ instrux + 4110,
+ instrux + 4111,
+};
+
+static const struct itemplate * const itable_evex01251[] = {
+ instrux + 5908,
+ instrux + 5909,
+};
+
+static const struct itemplate * const itable_evex01258[] = {
+ instrux + 3956,
+ instrux + 3957,
+};
+
+static const struct itemplate * const itable_evex01259[] = {
+ instrux + 4616,
+ instrux + 4617,
+};
+
+static const struct itemplate * const itable_evex0125A[] = {
+ instrux + 4109,
+};
+
+static const struct itemplate * const itable_evex0125B[] = {
+ instrux + 4126,
+ instrux + 4127,
+ instrux + 4128,
+};
+
+static const struct itemplate * const itable_evex0125C[] = {
+ instrux + 5924,
+ instrux + 5925,
+};
+
+static const struct itemplate * const itable_evex0125D[] = {
+ instrux + 4473,
+ instrux + 4474,
+};
+
+static const struct itemplate * const itable_evex0125E[] = {
+ instrux + 4182,
+ instrux + 4183,
+};
+
+static const struct itemplate * const itable_evex0125F[] = {
+ instrux + 4457,
+ instrux + 4458,
+};
+
+static const struct itemplate * const itable_evex0126F[] = {
+ instrux + 4516,
+ instrux + 4517,
+ instrux + 4518,
+ instrux + 4522,
+ instrux + 4523,
+ instrux + 4524,
+};
+
+static const struct itemplate * const itable_evex01270[] = {
+ instrux + 5450,
+ instrux + 5451,
+ instrux + 5452,
+};
+
+static const struct itemplate * const itable_evex01278[] = {
+ instrux + 4144,
+ instrux + 4145,
+};
+
+static const struct itemplate * const itable_evex01279[] = {
+ instrux + 4112,
+ instrux + 4113,
+};
+
+static const struct itemplate * const itable_evex0127A[] = {
+ instrux + 4146,
+ instrux + 4147,
+ instrux + 4148,
+ instrux + 4152,
+ instrux + 4153,
+ instrux + 4154,
+};
+
+static const struct itemplate * const itable_evex0127B[] = {
+ instrux + 4160,
+ instrux + 4161,
+};
+
+static const struct itemplate * const itable_evex0127E[] = {
+ instrux + 4564,
+};
+
+static const struct itemplate * const itable_evex0127F[] = {
+ instrux + 4519,
+ instrux + 4520,
+ instrux + 4521,
+ instrux + 4525,
+ instrux + 4526,
+ instrux + 4527,
+};
+
+static const struct itemplate * const itable_evex012C2[] = {
+ instrux + 4034,
+};
+
+static const struct itemplate * const itable_evex012E6[] = {
+ instrux + 4049,
+ instrux + 4050,
+ instrux + 4051,
+ instrux + 4094,
+ instrux + 4095,
+ instrux + 4096,
+};
+
+static const struct itemplate * const itable_evex01310[] = {
+ instrux + 4566,
+ instrux + 4568,
+ instrux + 4569,
+};
+
+static const struct itemplate * const itable_evex01311[] = {
+ instrux + 4567,
+ instrux + 4570,
+ instrux + 4571,
+};
+
+static const struct itemplate * const itable_evex01312[] = {
+ instrux + 4495,
+ instrux + 4496,
+ instrux + 4497,
+};
+
+static const struct itemplate * const itable_evex0132A[] = {
+ instrux + 4105,
+ instrux + 4106,
+};
+
+static const struct itemplate * const itable_evex0132C[] = {
+ instrux + 4138,
+ instrux + 4139,
+};
+
+static const struct itemplate * const itable_evex0132D[] = {
+ instrux + 4100,
+ instrux + 4101,
+};
+
+static const struct itemplate * const itable_evex01351[] = {
+ instrux + 5906,
+ instrux + 5907,
+};
+
+static const struct itemplate * const itable_evex01358[] = {
+ instrux + 3954,
+ instrux + 3955,
+};
+
+static const struct itemplate * const itable_evex01359[] = {
+ instrux + 4614,
+ instrux + 4615,
+};
+
+static const struct itemplate * const itable_evex0135A[] = {
+ instrux + 4102,
+};
+
+static const struct itemplate * const itable_evex0135C[] = {
+ instrux + 5922,
+ instrux + 5923,
+};
+
+static const struct itemplate * const itable_evex0135D[] = {
+ instrux + 4471,
+ instrux + 4472,
+};
+
+static const struct itemplate * const itable_evex0135E[] = {
+ instrux + 4180,
+ instrux + 4181,
+};
+
+static const struct itemplate * const itable_evex0135F[] = {
+ instrux + 4455,
+ instrux + 4456,
+};
+
+static const struct itemplate * const itable_evex0136F[] = {
+ instrux + 4510,
+ instrux + 4511,
+ instrux + 4512,
+ instrux + 4528,
+ instrux + 4529,
+ instrux + 4530,
+};
+
+static const struct itemplate * const itable_evex01370[] = {
+ instrux + 5453,
+ instrux + 5454,
+ instrux + 5455,
+};
+
+static const struct itemplate * const itable_evex01378[] = {
+ instrux + 4140,
+ instrux + 4141,
+};
+
+static const struct itemplate * const itable_evex01379[] = {
+ instrux + 4103,
+ instrux + 4104,
+};
+
+static const struct itemplate * const itable_evex0137A[] = {
+ instrux + 4149,
+ instrux + 4150,
+ instrux + 4151,
+ instrux + 4155,
+ instrux + 4156,
+ instrux + 4157,
+};
+
+static const struct itemplate * const itable_evex0137B[] = {
+ instrux + 4158,
+ instrux + 4159,
+};
+
+static const struct itemplate * const itable_evex0137F[] = {
+ instrux + 4513,
+ instrux + 4514,
+ instrux + 4515,
+ instrux + 4531,
+ instrux + 4532,
+ instrux + 4533,
+};
+
+static const struct itemplate * const itable_evex013C2[] = {
+ instrux + 4033,
+};
+
+static const struct itemplate * const itable_evex013E6[] = {
+ instrux + 4055,
+ instrux + 4056,
+ instrux + 4057,
+};
+
+static const struct itemplate * const itable_evex02100[] = {
+ instrux + 5441,
+ instrux + 5442,
+ instrux + 5443,
+ instrux + 5444,
+ instrux + 5445,
+ instrux + 5446,
+};
+
+static const struct itemplate * const itable_evex02104[] = {
+ instrux + 5033,
+ instrux + 5034,
+ instrux + 5035,
+ instrux + 5036,
+ instrux + 5037,
+ instrux + 5038,
+};
+
+static const struct itemplate * const itable_evex0210B[] = {
+ instrux + 5315,
+ instrux + 5316,
+ instrux + 5317,
+ instrux + 5318,
+ instrux + 5319,
+ instrux + 5320,
+};
+
+static const struct itemplate * const itable_evex0210C[] = {
+ instrux + 4925,
+ instrux + 4926,
+ instrux + 4927,
+ instrux + 4928,
+ instrux + 4929,
+ instrux + 4930,
+};
+
+static const struct itemplate * const itable_evex0210D[] = {
+ instrux + 4916,
+ instrux + 4917,
+ instrux + 4918,
+ instrux + 4919,
+ instrux + 4920,
+ instrux + 4921,
+};
+
+static const struct itemplate * const itable_evex02110[] = {
+ instrux + 5612,
+ instrux + 5613,
+ instrux + 5614,
+ instrux + 5615,
+ instrux + 5616,
+ instrux + 5617,
+};
+
+static const struct itemplate * const itable_evex02111[] = {
+ instrux + 5552,
+ instrux + 5553,
+ instrux + 5554,
+ instrux + 5555,
+ instrux + 5556,
+ instrux + 5557,
+};
+
+static const struct itemplate * const itable_evex02112[] = {
+ instrux + 5498,
+ instrux + 5499,
+ instrux + 5500,
+ instrux + 5501,
+ instrux + 5502,
+ instrux + 5503,
+};
+
+static const struct itemplate * const itable_evex02113[] = {
+ instrux + 4070,
+ instrux + 4071,
+ instrux + 4072,
+};
+
+static const struct itemplate * const itable_evex02114[] = {
+ instrux + 5411,
+ instrux + 5412,
+ instrux + 5413,
+ instrux + 5414,
+ instrux + 5415,
+ instrux + 5416,
+ instrux + 5417,
+ instrux + 5418,
+ instrux + 5419,
+ instrux + 5420,
+ instrux + 5421,
+ instrux + 5422,
+};
+
+static const struct itemplate * const itable_evex02115[] = {
+ instrux + 5387,
+ instrux + 5388,
+ instrux + 5389,
+ instrux + 5390,
+ instrux + 5391,
+ instrux + 5392,
+ instrux + 5393,
+ instrux + 5394,
+ instrux + 5395,
+ instrux + 5396,
+ instrux + 5397,
+ instrux + 5398,
+};
+
+static const struct itemplate * const itable_evex02116[] = {
+ instrux + 4933,
+ instrux + 4934,
+ instrux + 4935,
+ instrux + 4936,
+ instrux + 4937,
+ instrux + 4938,
+ instrux + 4939,
+ instrux + 4940,
+};
+
+static const struct itemplate * const itable_evex02118[] = {
+ instrux + 4021,
+ instrux + 4022,
+ instrux + 4023,
+ instrux + 4024,
+ instrux + 4025,
+ instrux + 4026,
+};
+
+static const struct itemplate * const itable_evex02119[] = {
+ instrux + 4000,
+ instrux + 4001,
+ instrux + 4017,
+ instrux + 4018,
+ instrux + 4019,
+ instrux + 4020,
+};
+
+static const struct itemplate * const itable_evex0211A[] = {
+ instrux + 4002,
+ instrux + 4003,
+ instrux + 4005,
+ instrux + 4006,
+};
+
+static const struct itemplate * const itable_evex0211B[] = {
+ instrux + 4004,
+ instrux + 4007,
+};
+
+static const struct itemplate * const itable_evex0211C[] = {
+ instrux + 4630,
+ instrux + 4631,
+ instrux + 4632,
+};
+
+static const struct itemplate * const itable_evex0211D[] = {
+ instrux + 4639,
+ instrux + 4640,
+ instrux + 4641,
+};
+
+static const struct itemplate * const itable_evex0211E[] = {
+ instrux + 4633,
+ instrux + 4634,
+ instrux + 4635,
+};
+
+static const struct itemplate * const itable_evex0211F[] = {
+ instrux + 4636,
+ instrux + 4637,
+ instrux + 4638,
+};
+
+static const struct itemplate * const itable_evex02120[] = {
+ instrux + 5234,
+ instrux + 5235,
+ instrux + 5236,
+};
+
+static const struct itemplate * const itable_evex02121[] = {
+ instrux + 5228,
+ instrux + 5229,
+ instrux + 5230,
+};
+
+static const struct itemplate * const itable_evex02122[] = {
+ instrux + 5231,
+ instrux + 5232,
+ instrux + 5233,
+};
+
+static const struct itemplate * const itable_evex02123[] = {
+ instrux + 5240,
+ instrux + 5241,
+ instrux + 5242,
+};
+
+static const struct itemplate * const itable_evex02124[] = {
+ instrux + 5243,
+ instrux + 5244,
+ instrux + 5245,
+};
+
+static const struct itemplate * const itable_evex02125[] = {
+ instrux + 5237,
+ instrux + 5238,
+ instrux + 5239,
+};
+
+static const struct itemplate * const itable_evex02126[] = {
+ instrux + 5684,
+ instrux + 5685,
+ instrux + 5686,
+ instrux + 5693,
+ instrux + 5694,
+ instrux + 5695,
+};
+
+static const struct itemplate * const itable_evex02127[] = {
+ instrux + 5687,
+ instrux + 5688,
+ instrux + 5689,
+ instrux + 5690,
+ instrux + 5691,
+ instrux + 5692,
+};
+
+static const struct itemplate * const itable_evex02128[] = {
+ instrux + 5309,
+ instrux + 5310,
+ instrux + 5311,
+ instrux + 5312,
+ instrux + 5313,
+ instrux + 5314,
+};
+
+static const struct itemplate * const itable_evex02129[] = {
+ instrux + 4831,
+ instrux + 4832,
+ instrux + 4833,
+};
+
+static const struct itemplate * const itable_evex0212A[] = {
+ instrux + 4553,
+ instrux + 4554,
+ instrux + 4555,
+};
+
+static const struct itemplate * const itable_evex0212B[] = {
+ instrux + 4654,
+ instrux + 4655,
+ instrux + 4656,
+ instrux + 4657,
+ instrux + 4658,
+ instrux + 4659,
+};
+
+static const struct itemplate * const itable_evex0212C[] = {
+ instrux + 5836,
+ instrux + 5837,
+ instrux + 5838,
+ instrux + 5839,
+ instrux + 5840,
+ instrux + 5841,
+ instrux + 5842,
+ instrux + 5843,
+ instrux + 5844,
+ instrux + 5845,
+ instrux + 5846,
+ instrux + 5847,
+};
+
+static const struct itemplate * const itable_evex0212D[] = {
+ instrux + 5848,
+ instrux + 5849,
+ instrux + 5850,
+ instrux + 5851,
+};
+
+static const struct itemplate * const itable_evex02130[] = {
+ instrux + 5297,
+ instrux + 5298,
+ instrux + 5299,
+};
+
+static const struct itemplate * const itable_evex02131[] = {
+ instrux + 5291,
+ instrux + 5292,
+ instrux + 5293,
+};
+
+static const struct itemplate * const itable_evex02132[] = {
+ instrux + 5294,
+ instrux + 5295,
+ instrux + 5296,
+};
+
+static const struct itemplate * const itable_evex02133[] = {
+ instrux + 5303,
+ instrux + 5304,
+ instrux + 5305,
+};
+
+static const struct itemplate * const itable_evex02134[] = {
+ instrux + 5306,
+ instrux + 5307,
+ instrux + 5308,
+};
+
+static const struct itemplate * const itable_evex02135[] = {
+ instrux + 5300,
+ instrux + 5301,
+ instrux + 5302,
+};
+
+static const struct itemplate * const itable_evex02136[] = {
+ instrux + 4891,
+ instrux + 4892,
+ instrux + 4893,
+ instrux + 4894,
+ instrux + 4943,
+ instrux + 4944,
+ instrux + 4945,
+ instrux + 4946,
+};
+
+static const struct itemplate * const itable_evex02137[] = {
+ instrux + 4843,
+ instrux + 4844,
+ instrux + 4845,
+};
+
+static const struct itemplate * const itable_evex02138[] = {
+ instrux + 5093,
+ instrux + 5094,
+ instrux + 5095,
+ instrux + 5096,
+ instrux + 5097,
+ instrux + 5098,
+};
+
+static const struct itemplate * const itable_evex02139[] = {
+ instrux + 5099,
+ instrux + 5100,
+ instrux + 5101,
+ instrux + 5102,
+ instrux + 5103,
+ instrux + 5104,
+ instrux + 5105,
+ instrux + 5106,
+ instrux + 5107,
+ instrux + 5108,
+ instrux + 5109,
+ instrux + 5110,
+};
+
+static const struct itemplate * const itable_evex0213A[] = {
+ instrux + 5135,
+ instrux + 5136,
+ instrux + 5137,
+ instrux + 5138,
+ instrux + 5139,
+ instrux + 5140,
+};
+
+static const struct itemplate * const itable_evex0213B[] = {
+ instrux + 5123,
+ instrux + 5124,
+ instrux + 5125,
+ instrux + 5126,
+ instrux + 5127,
+ instrux + 5128,
+ instrux + 5129,
+ instrux + 5130,
+ instrux + 5131,
+ instrux + 5132,
+ instrux + 5133,
+ instrux + 5134,
+};
+
+static const struct itemplate * const itable_evex0213C[] = {
+ instrux + 5045,
+ instrux + 5046,
+ instrux + 5047,
+ instrux + 5048,
+ instrux + 5049,
+ instrux + 5050,
+};
+
+static const struct itemplate * const itable_evex0213D[] = {
+ instrux + 5051,
+ instrux + 5052,
+ instrux + 5053,
+ instrux + 5054,
+ instrux + 5055,
+ instrux + 5056,
+ instrux + 5057,
+ instrux + 5058,
+ instrux + 5059,
+ instrux + 5060,
+ instrux + 5061,
+ instrux + 5062,
+};
+
+static const struct itemplate * const itable_evex0213E[] = {
+ instrux + 5087,
+ instrux + 5088,
+ instrux + 5089,
+ instrux + 5090,
+ instrux + 5091,
+ instrux + 5092,
+};
+
+static const struct itemplate * const itable_evex0213F[] = {
+ instrux + 5075,
+ instrux + 5076,
+ instrux + 5077,
+ instrux + 5078,
+ instrux + 5079,
+ instrux + 5080,
+ instrux + 5081,
+ instrux + 5082,
+ instrux + 5083,
+ instrux + 5084,
+ instrux + 5085,
+ instrux + 5086,
+};
+
+static const struct itemplate * const itable_evex02140[] = {
+ instrux + 5333,
+ instrux + 5334,
+ instrux + 5335,
+ instrux + 5336,
+ instrux + 5337,
+ instrux + 5338,
+ instrux + 5339,
+ instrux + 5340,
+ instrux + 5341,
+ instrux + 5342,
+ instrux + 5343,
+ instrux + 5344,
+};
+
+static const struct itemplate * const itable_evex02142[] = {
+ instrux + 4401,
+ instrux + 4402,
+ instrux + 4403,
+ instrux + 4404,
+ instrux + 4405,
+ instrux + 4406,
+};
+
+static const struct itemplate * const itable_evex02143[] = {
+ instrux + 4407,
+ instrux + 4408,
+};
+
+static const struct itemplate * const itable_evex02144[] = {
+ instrux + 5021,
+ instrux + 5022,
+ instrux + 5023,
+ instrux + 5024,
+ instrux + 5025,
+ instrux + 5026,
+};
+
+static const struct itemplate * const itable_evex02145[] = {
+ instrux + 5600,
+ instrux + 5601,
+ instrux + 5602,
+ instrux + 5603,
+ instrux + 5604,
+ instrux + 5605,
+ instrux + 5606,
+ instrux + 5607,
+ instrux + 5608,
+ instrux + 5609,
+ instrux + 5610,
+ instrux + 5611,
+};
+
+static const struct itemplate * const itable_evex02146[] = {
+ instrux + 5540,
+ instrux + 5541,
+ instrux + 5542,
+ instrux + 5543,
+ instrux + 5544,
+ instrux + 5545,
+ instrux + 5546,
+ instrux + 5547,
+ instrux + 5548,
+ instrux + 5549,
+ instrux + 5550,
+ instrux + 5551,
+};
+
+static const struct itemplate * const itable_evex02147[] = {
+ instrux + 5486,
+ instrux + 5487,
+ instrux + 5488,
+ instrux + 5489,
+ instrux + 5490,
+ instrux + 5491,
+ instrux + 5492,
+ instrux + 5493,
+ instrux + 5494,
+ instrux + 5495,
+ instrux + 5496,
+ instrux + 5497,
+};
+
+static const struct itemplate * const itable_evex0214C[] = {
+ instrux + 5784,
+ instrux + 5785,
+ instrux + 5786,
+ instrux + 5787,
+ instrux + 5788,
+ instrux + 5789,
+};
+
+static const struct itemplate * const itable_evex0214D[] = {
+ instrux + 5790,
+ instrux + 5791,
+ instrux + 5792,
+ instrux + 5793,
+};
+
+static const struct itemplate * const itable_evex0214E[] = {
+ instrux + 5820,
+ instrux + 5821,
+ instrux + 5822,
+ instrux + 5823,
+ instrux + 5824,
+ instrux + 5825,
+};
+
+static const struct itemplate * const itable_evex0214F[] = {
+ instrux + 5826,
+ instrux + 5827,
+ instrux + 5828,
+ instrux + 5829,
+};
+
+static const struct itemplate * const itable_evex02150[] = {
+ instrux + 6117,
+ instrux + 6118,
+ instrux + 6119,
+ instrux + 6120,
+ instrux + 6121,
+ instrux + 6122,
+};
+
+static const struct itemplate * const itable_evex02151[] = {
+ instrux + 6123,
+ instrux + 6124,
+ instrux + 6125,
+ instrux + 6126,
+ instrux + 6127,
+ instrux + 6128,
+};
+
+static const struct itemplate * const itable_evex02152[] = {
+ instrux + 6129,
+ instrux + 6130,
+ instrux + 6131,
+ instrux + 6132,
+ instrux + 6133,
+ instrux + 6134,
+};
+
+static const struct itemplate * const itable_evex02153[] = {
+ instrux + 6135,
+ instrux + 6136,
+ instrux + 6137,
+ instrux + 6138,
+ instrux + 6139,
+ instrux + 6140,
+};
+
+static const struct itemplate * const itable_evex02154[] = {
+ instrux + 6141,
+ instrux + 6142,
+ instrux + 6143,
+ instrux + 6144,
+ instrux + 6145,
+ instrux + 6146,
+};
+
+static const struct itemplate * const itable_evex02155[] = {
+ instrux + 6147,
+ instrux + 6148,
+ instrux + 6149,
+ instrux + 6150,
+ instrux + 6151,
+ instrux + 6152,
+};
+
+static const struct itemplate * const itable_evex02158[] = {
+ instrux + 4783,
+ instrux + 4784,
+ instrux + 4785,
+ instrux + 4786,
+ instrux + 4787,
+ instrux + 4788,
+};
+
+static const struct itemplate * const itable_evex02159[] = {
+ instrux + 4008,
+ instrux + 4009,
+ instrux + 4010,
+ instrux + 4798,
+ instrux + 4799,
+ instrux + 4800,
+ instrux + 4801,
+ instrux + 4802,
+ instrux + 4803,
+};
+
+static const struct itemplate * const itable_evex0215A[] = {
+ instrux + 4011,
+ instrux + 4012,
+ instrux + 4014,
+ instrux + 4015,
+};
+
+static const struct itemplate * const itable_evex0215B[] = {
+ instrux + 4013,
+ instrux + 4016,
+};
+
+static const struct itemplate * const itable_evex02162[] = {
+ instrux + 6033,
+ instrux + 6034,
+ instrux + 6035,
+ instrux + 6036,
+ instrux + 6037,
+ instrux + 6038,
+ instrux + 6039,
+ instrux + 6040,
+ instrux + 6041,
+ instrux + 6042,
+ instrux + 6043,
+ instrux + 6044,
+};
+
+static const struct itemplate * const itable_evex02163[] = {
+ instrux + 6021,
+ instrux + 6022,
+ instrux + 6023,
+ instrux + 6024,
+ instrux + 6025,
+ instrux + 6026,
+ instrux + 6027,
+ instrux + 6028,
+ instrux + 6029,
+ instrux + 6030,
+ instrux + 6031,
+ instrux + 6032,
+};
+
+static const struct itemplate * const itable_evex02164[] = {
+ instrux + 4759,
+ instrux + 4760,
+ instrux + 4761,
+ instrux + 4762,
+ instrux + 4763,
+ instrux + 4764,
+};
+
+static const struct itemplate * const itable_evex02165[] = {
+ instrux + 3994,
+ instrux + 3995,
+ instrux + 3996,
+ instrux + 3997,
+ instrux + 3998,
+ instrux + 3999,
+};
+
+static const struct itemplate * const itable_evex02166[] = {
+ instrux + 4756,
+ instrux + 4757,
+ instrux + 4758,
+ instrux + 4765,
+ instrux + 4766,
+ instrux + 4767,
+};
+
+static const struct itemplate * const itable_evex02170[] = {
+ instrux + 6063,
+ instrux + 6064,
+ instrux + 6065,
+ instrux + 6066,
+ instrux + 6067,
+ instrux + 6068,
+};
+
+static const struct itemplate * const itable_evex02171[] = {
+ instrux + 6069,
+ instrux + 6070,
+ instrux + 6071,
+ instrux + 6072,
+ instrux + 6073,
+ instrux + 6074,
+ instrux + 6075,
+ instrux + 6076,
+ instrux + 6077,
+ instrux + 6078,
+ instrux + 6079,
+ instrux + 6080,
+};
+
+static const struct itemplate * const itable_evex02172[] = {
+ instrux + 6099,
+ instrux + 6100,
+ instrux + 6101,
+ instrux + 6102,
+ instrux + 6103,
+ instrux + 6104,
+};
+
+static const struct itemplate * const itable_evex02173[] = {
+ instrux + 6105,
+ instrux + 6106,
+ instrux + 6107,
+ instrux + 6108,
+ instrux + 6109,
+ instrux + 6110,
+ instrux + 6111,
+ instrux + 6112,
+ instrux + 6113,
+ instrux + 6114,
+ instrux + 6115,
+ instrux + 6116,
+};
+
+static const struct itemplate * const itable_evex02175[] = {
+ instrux + 4895,
+ instrux + 4896,
+ instrux + 4897,
+ instrux + 4910,
+ instrux + 4911,
+ instrux + 4912,
+};
+
+static const struct itemplate * const itable_evex02176[] = {
+ instrux + 4898,
+ instrux + 4899,
+ instrux + 4900,
+ instrux + 4907,
+ instrux + 4908,
+ instrux + 4909,
+};
+
+static const struct itemplate * const itable_evex02177[] = {
+ instrux + 4901,
+ instrux + 4902,
+ instrux + 4903,
+ instrux + 4904,
+ instrux + 4905,
+ instrux + 4906,
+};
+
+static const struct itemplate * const itable_evex02178[] = {
+ instrux + 4768,
+ instrux + 4769,
+ instrux + 4770,
+};
+
+static const struct itemplate * const itable_evex02179[] = {
+ instrux + 4807,
+ instrux + 4808,
+ instrux + 4809,
+};
+
+static const struct itemplate * const itable_evex0217A[] = {
+ instrux + 4771,
+ instrux + 4772,
+ instrux + 4773,
+ instrux + 4774,
+ instrux + 4775,
+ instrux + 4776,
+ instrux + 4777,
+ instrux + 4778,
+ instrux + 4779,
+ instrux + 4780,
+ instrux + 4781,
+ instrux + 4782,
+};
+
+static const struct itemplate * const itable_evex0217B[] = {
+ instrux + 4810,
+ instrux + 4811,
+ instrux + 4812,
+ instrux + 4813,
+ instrux + 4814,
+ instrux + 4815,
+ instrux + 4816,
+ instrux + 4817,
+ instrux + 4818,
+};
+
+static const struct itemplate * const itable_evex0217C[] = {
+ instrux + 4789,
+ instrux + 4790,
+ instrux + 4791,
+ instrux + 4804,
+ instrux + 4805,
+ instrux + 4806,
+};
+
+static const struct itemplate * const itable_evex0217D[] = {
+ instrux + 4947,
+ instrux + 4948,
+ instrux + 4949,
+ instrux + 4962,
+ instrux + 4963,
+ instrux + 4964,
+};
+
+static const struct itemplate * const itable_evex0217E[] = {
+ instrux + 4950,
+ instrux + 4951,
+ instrux + 4952,
+ instrux + 4959,
+ instrux + 4960,
+ instrux + 4961,
+};
+
+static const struct itemplate * const itable_evex0217F[] = {
+ instrux + 4953,
+ instrux + 4954,
+ instrux + 4955,
+ instrux + 4956,
+ instrux + 4957,
+ instrux + 4958,
+};
+
+static const struct itemplate * const itable_evex02183[] = {
+ instrux + 5351,
+ instrux + 5352,
+ instrux + 5353,
+ instrux + 5354,
+ instrux + 5355,
+ instrux + 5356,
+};
+
+static const struct itemplate * const itable_evex02188[] = {
+ instrux + 4186,
+ instrux + 4187,
+ instrux + 4188,
+ instrux + 4189,
+ instrux + 4190,
+ instrux + 4191,
+ instrux + 4192,
+ instrux + 4193,
+ instrux + 4194,
+ instrux + 4195,
+ instrux + 4196,
+ instrux + 4197,
+};
+
+static const struct itemplate * const itable_evex02189[] = {
+ instrux + 4971,
+ instrux + 4972,
+ instrux + 4973,
+ instrux + 4974,
+ instrux + 4975,
+ instrux + 4976,
+ instrux + 4977,
+ instrux + 4978,
+ instrux + 4979,
+ instrux + 4980,
+ instrux + 4981,
+ instrux + 4982,
+};
+
+static const struct itemplate * const itable_evex0218A[] = {
+ instrux + 4037,
+ instrux + 4038,
+ instrux + 4039,
+ instrux + 4040,
+ instrux + 4041,
+ instrux + 4042,
+ instrux + 4043,
+ instrux + 4044,
+ instrux + 4045,
+ instrux + 4046,
+ instrux + 4047,
+ instrux + 4048,
+};
+
+static const struct itemplate * const itable_evex0218B[] = {
+ instrux + 4867,
+ instrux + 4868,
+ instrux + 4869,
+ instrux + 4870,
+ instrux + 4871,
+ instrux + 4872,
+ instrux + 4873,
+ instrux + 4874,
+ instrux + 4875,
+ instrux + 4876,
+ instrux + 4877,
+ instrux + 4878,
+};
+
+static const struct itemplate * const itable_evex0218D[] = {
+ instrux + 4885,
+ instrux + 4886,
+ instrux + 4887,
+ instrux + 4888,
+ instrux + 4889,
+ instrux + 4890,
+ instrux + 4965,
+ instrux + 4966,
+ instrux + 4967,
+ instrux + 4968,
+ instrux + 4969,
+ instrux + 4970,
+};
+
+static const struct itemplate * const itable_evex0218F[] = {
+ instrux + 6153,
+ instrux + 6154,
+ instrux + 6155,
+};
+
+static const struct itemplate * const itable_evex02190[] = {
+ instrux + 4997,
+ instrux + 4998,
+ instrux + 4999,
+ instrux + 5000,
+ instrux + 5001,
+ instrux + 5002,
+};
+
+static const struct itemplate * const itable_evex02191[] = {
+ instrux + 5003,
+ instrux + 5004,
+ instrux + 5005,
+ instrux + 5006,
+ instrux + 5007,
+ instrux + 5008,
+};
+
+static const struct itemplate * const itable_evex02192[] = {
+ instrux + 4381,
+ instrux + 4382,
+ instrux + 4383,
+ instrux + 4384,
+ instrux + 4385,
+ instrux + 4386,
+};
+
+static const struct itemplate * const itable_evex02193[] = {
+ instrux + 4395,
+ instrux + 4396,
+ instrux + 4397,
+ instrux + 4398,
+ instrux + 4399,
+ instrux + 4400,
+};
+
+static const struct itemplate * const itable_evex02196[] = {
+ instrux + 4265,
+ instrux + 4266,
+ instrux + 4267,
+ instrux + 4268,
+ instrux + 4269,
+ instrux + 4270,
+};
+
+static const struct itemplate * const itable_evex02197[] = {
+ instrux + 4307,
+ instrux + 4308,
+ instrux + 4309,
+ instrux + 4310,
+ instrux + 4311,
+ instrux + 4312,
+};
+
+static const struct itemplate * const itable_evex02198[] = {
+ instrux + 4241,
+ instrux + 4242,
+ instrux + 4243,
+ instrux + 4244,
+ instrux + 4245,
+ instrux + 4246,
+};
+
+static const struct itemplate * const itable_evex02199[] = {
+ instrux + 4247,
+ instrux + 4248,
+};
+
+static const struct itemplate * const itable_evex0219A[] = {
+ instrux + 4283,
+ instrux + 4284,
+ instrux + 4285,
+ instrux + 4286,
+ instrux + 4287,
+ instrux + 4288,
+};
+
+static const struct itemplate * const itable_evex0219B[] = {
+ instrux + 4289,
+ instrux + 4290,
+};
+
+static const struct itemplate * const itable_evex0219C[] = {
+ instrux + 4325,
+ instrux + 4326,
+ instrux + 4327,
+ instrux + 4328,
+ instrux + 4329,
+ instrux + 4330,
+};
+
+static const struct itemplate * const itable_evex0219D[] = {
+ instrux + 4331,
+ instrux + 4332,
+};
+
+static const struct itemplate * const itable_evex0219E[] = {
+ instrux + 4349,
+ instrux + 4350,
+ instrux + 4351,
+ instrux + 4352,
+ instrux + 4353,
+ instrux + 4354,
+};
+
+static const struct itemplate * const itable_evex0219F[] = {
+ instrux + 4355,
+ instrux + 4356,
+};
+
+static const struct itemplate * const itable_evex021A0[] = {
+ instrux + 5429,
+ instrux + 5430,
+ instrux + 5431,
+ instrux + 5432,
+ instrux + 5433,
+ instrux + 5434,
+};
+
+static const struct itemplate * const itable_evex021A1[] = {
+ instrux + 5435,
+ instrux + 5436,
+ instrux + 5437,
+ instrux + 5438,
+ instrux + 5439,
+ instrux + 5440,
+};
+
+static const struct itemplate * const itable_evex021A2[] = {
+ instrux + 5852,
+ instrux + 5853,
+ instrux + 5854,
+ instrux + 5855,
+ instrux + 5856,
+ instrux + 5857,
+};
+
+static const struct itemplate * const itable_evex021A3[] = {
+ instrux + 5866,
+ instrux + 5867,
+ instrux + 5868,
+ instrux + 5869,
+ instrux + 5870,
+ instrux + 5871,
+};
+
+static const struct itemplate * const itable_evex021A6[] = {
+ instrux + 4271,
+ instrux + 4272,
+ instrux + 4273,
+ instrux + 4274,
+ instrux + 4275,
+ instrux + 4276,
+};
+
+static const struct itemplate * const itable_evex021A7[] = {
+ instrux + 4313,
+ instrux + 4314,
+ instrux + 4315,
+ instrux + 4316,
+ instrux + 4317,
+ instrux + 4318,
+};
+
+static const struct itemplate * const itable_evex021A8[] = {
+ instrux + 4249,
+ instrux + 4250,
+ instrux + 4251,
+ instrux + 4252,
+ instrux + 4253,
+ instrux + 4254,
+};
+
+static const struct itemplate * const itable_evex021A9[] = {
+ instrux + 4255,
+ instrux + 4256,
+};
+
+static const struct itemplate * const itable_evex021AA[] = {
+ instrux + 4291,
+ instrux + 4292,
+ instrux + 4293,
+ instrux + 4294,
+ instrux + 4295,
+ instrux + 4296,
+};
+
+static const struct itemplate * const itable_evex021AB[] = {
+ instrux + 4297,
+ instrux + 4298,
+};
+
+static const struct itemplate * const itable_evex021AC[] = {
+ instrux + 4333,
+ instrux + 4334,
+ instrux + 4335,
+ instrux + 4336,
+ instrux + 4337,
+ instrux + 4338,
+};
+
+static const struct itemplate * const itable_evex021AD[] = {
+ instrux + 4339,
+ instrux + 4340,
+};
+
+static const struct itemplate * const itable_evex021AE[] = {
+ instrux + 4357,
+ instrux + 4358,
+ instrux + 4359,
+ instrux + 4360,
+ instrux + 4361,
+ instrux + 4362,
+};
+
+static const struct itemplate * const itable_evex021AF[] = {
+ instrux + 4363,
+ instrux + 4364,
+};
+
+static const struct itemplate * const itable_evex021B4[] = {
+ instrux + 5030,
+ instrux + 5031,
+ instrux + 5032,
+};
+
+static const struct itemplate * const itable_evex021B5[] = {
+ instrux + 5027,
+ instrux + 5028,
+ instrux + 5029,
+};
+
+static const struct itemplate * const itable_evex021B6[] = {
+ instrux + 4277,
+ instrux + 4278,
+ instrux + 4279,
+ instrux + 4280,
+ instrux + 4281,
+ instrux + 4282,
+};
+
+static const struct itemplate * const itable_evex021B7[] = {
+ instrux + 4319,
+ instrux + 4320,
+ instrux + 4321,
+ instrux + 4322,
+ instrux + 4323,
+ instrux + 4324,
+};
+
+static const struct itemplate * const itable_evex021B8[] = {
+ instrux + 4257,
+ instrux + 4258,
+ instrux + 4259,
+ instrux + 4260,
+ instrux + 4261,
+ instrux + 4262,
+};
+
+static const struct itemplate * const itable_evex021B9[] = {
+ instrux + 4263,
+ instrux + 4264,
+};
+
+static const struct itemplate * const itable_evex021BA[] = {
+ instrux + 4299,
+ instrux + 4300,
+ instrux + 4301,
+ instrux + 4302,
+ instrux + 4303,
+ instrux + 4304,
+};
+
+static const struct itemplate * const itable_evex021BB[] = {
+ instrux + 4305,
+ instrux + 4306,
+};
+
+static const struct itemplate * const itable_evex021BC[] = {
+ instrux + 4341,
+ instrux + 4342,
+ instrux + 4343,
+ instrux + 4344,
+ instrux + 4345,
+ instrux + 4346,
+};
+
+static const struct itemplate * const itable_evex021BD[] = {
+ instrux + 4347,
+ instrux + 4348,
+};
+
+static const struct itemplate * const itable_evex021BE[] = {
+ instrux + 4365,
+ instrux + 4366,
+ instrux + 4367,
+ instrux + 4368,
+ instrux + 4369,
+ instrux + 4370,
+};
+
+static const struct itemplate * const itable_evex021BF[] = {
+ instrux + 4371,
+ instrux + 4372,
+};
+
+static const struct itemplate * const itable_evex021C4[] = {
+ instrux + 4879,
+ instrux + 4880,
+ instrux + 4881,
+ instrux + 4882,
+ instrux + 4883,
+ instrux + 4884,
+};
+
+static const struct itemplate * const itable_evex021C6[] = {
+ instrux + 4387,
+ instrux + 4388,
+ instrux + 4391,
+ instrux + 4392,
+ instrux + 5858,
+ instrux + 5859,
+ instrux + 5862,
+ instrux + 5863,
+};
+
+static const struct itemplate * const itable_evex021C7[] = {
+ instrux + 4389,
+ instrux + 4390,
+ instrux + 4393,
+ instrux + 4394,
+ instrux + 5860,
+ instrux + 5861,
+ instrux + 5864,
+ instrux + 5865,
+};
+
+static const struct itemplate * const itable_evex021C8[] = {
+ instrux + 4184,
+ instrux + 4185,
+};
+
+static const struct itemplate * const itable_evex021CA[] = {
+ instrux + 5794,
+ instrux + 5795,
+};
+
+static const struct itemplate * const itable_evex021CB[] = {
+ instrux + 5796,
+ instrux + 5797,
+ instrux + 5798,
+ instrux + 5799,
+};
+
+static const struct itemplate * const itable_evex021CC[] = {
+ instrux + 5830,
+ instrux + 5831,
+};
+
+static const struct itemplate * const itable_evex021CD[] = {
+ instrux + 5832,
+ instrux + 5833,
+ instrux + 5834,
+ instrux + 5835,
+};
+
+static const struct itemplate * const itable_evex021CF[] = {
+ instrux + 6015,
+ instrux + 6016,
+ instrux + 6017,
+ instrux + 6018,
+ instrux + 6019,
+ instrux + 6020,
+};
+
+static const struct itemplate * const itable_evex021DC[] = {
+ instrux + 1709,
+ instrux + 1710,
+ instrux + 1711,
+ instrux + 1712,
+ instrux + 1725,
+ instrux + 1726,
+};
+
+static const struct itemplate * const itable_evex021DD[] = {
+ instrux + 1713,
+ instrux + 1714,
+ instrux + 1715,
+ instrux + 1716,
+ instrux + 1727,
+ instrux + 1728,
+};
+
+static const struct itemplate * const itable_evex021DE[] = {
+ instrux + 1717,
+ instrux + 1718,
+ instrux + 1719,
+ instrux + 1720,
+ instrux + 1729,
+ instrux + 1730,
+};
+
+static const struct itemplate * const itable_evex021DF[] = {
+ instrux + 1721,
+ instrux + 1722,
+ instrux + 1723,
+ instrux + 1724,
+ instrux + 1731,
+ instrux + 1732,
+};
+
+static const struct itemplate * const itable_evex02210[] = {
+ instrux + 5276,
+ instrux + 5277,
+ instrux + 5278,
+ instrux + 5279,
+ instrux + 5280,
+ instrux + 5281,
+};
+
+static const struct itemplate * const itable_evex02211[] = {
+ instrux + 5246,
+ instrux + 5247,
+ instrux + 5248,
+ instrux + 5249,
+ instrux + 5250,
+ instrux + 5251,
+};
+
+static const struct itemplate * const itable_evex02212[] = {
+ instrux + 5258,
+ instrux + 5259,
+ instrux + 5260,
+ instrux + 5261,
+ instrux + 5262,
+ instrux + 5263,
+};
+
+static const struct itemplate * const itable_evex02213[] = {
+ instrux + 5252,
+ instrux + 5253,
+ instrux + 5254,
+ instrux + 5255,
+ instrux + 5256,
+ instrux + 5257,
+};
+
+static const struct itemplate * const itable_evex02214[] = {
+ instrux + 5270,
+ instrux + 5271,
+ instrux + 5272,
+ instrux + 5273,
+ instrux + 5274,
+ instrux + 5275,
+};
+
+static const struct itemplate * const itable_evex02215[] = {
+ instrux + 5264,
+ instrux + 5265,
+ instrux + 5266,
+ instrux + 5267,
+ instrux + 5268,
+ instrux + 5269,
+};
+
+static const struct itemplate * const itable_evex02220[] = {
+ instrux + 5222,
+ instrux + 5223,
+ instrux + 5224,
+ instrux + 5225,
+ instrux + 5226,
+ instrux + 5227,
+};
+
+static const struct itemplate * const itable_evex02221[] = {
+ instrux + 5192,
+ instrux + 5193,
+ instrux + 5194,
+ instrux + 5195,
+ instrux + 5196,
+ instrux + 5197,
+};
+
+static const struct itemplate * const itable_evex02222[] = {
+ instrux + 5204,
+ instrux + 5205,
+ instrux + 5206,
+ instrux + 5207,
+ instrux + 5208,
+ instrux + 5209,
+};
+
+static const struct itemplate * const itable_evex02223[] = {
+ instrux + 5198,
+ instrux + 5199,
+ instrux + 5200,
+ instrux + 5201,
+ instrux + 5202,
+ instrux + 5203,
+};
+
+static const struct itemplate * const itable_evex02224[] = {
+ instrux + 5216,
+ instrux + 5217,
+ instrux + 5218,
+ instrux + 5219,
+ instrux + 5220,
+ instrux + 5221,
+};
+
+static const struct itemplate * const itable_evex02225[] = {
+ instrux + 5210,
+ instrux + 5211,
+ instrux + 5212,
+ instrux + 5213,
+ instrux + 5214,
+ instrux + 5215,
+};
+
+static const struct itemplate * const itable_evex02226[] = {
+ instrux + 5696,
+ instrux + 5697,
+ instrux + 5698,
+ instrux + 5705,
+ instrux + 5706,
+ instrux + 5707,
+};
+
+static const struct itemplate * const itable_evex02227[] = {
+ instrux + 5699,
+ instrux + 5700,
+ instrux + 5701,
+ instrux + 5702,
+ instrux + 5703,
+ instrux + 5704,
+};
+
+static const struct itemplate * const itable_evex02228[] = {
+ instrux + 5159,
+ instrux + 5160,
+ instrux + 5161,
+ instrux + 5168,
+ instrux + 5169,
+ instrux + 5170,
+};
+
+static const struct itemplate * const itable_evex02229[] = {
+ instrux + 5141,
+ instrux + 5142,
+ instrux + 5143,
+ instrux + 5282,
+ instrux + 5283,
+ instrux + 5284,
+};
+
+static const struct itemplate * const itable_evex0222A[] = {
+ instrux + 4792,
+ instrux + 4793,
+ instrux + 4794,
+};
+
+static const struct itemplate * const itable_evex02230[] = {
+ instrux + 5285,
+ instrux + 5286,
+ instrux + 5287,
+ instrux + 5288,
+ instrux + 5289,
+ instrux + 5290,
+};
+
+static const struct itemplate * const itable_evex02231[] = {
+ instrux + 5147,
+ instrux + 5148,
+ instrux + 5149,
+ instrux + 5150,
+ instrux + 5151,
+ instrux + 5152,
+};
+
+static const struct itemplate * const itable_evex02232[] = {
+ instrux + 5174,
+ instrux + 5175,
+ instrux + 5176,
+ instrux + 5177,
+ instrux + 5178,
+ instrux + 5179,
+};
+
+static const struct itemplate * const itable_evex02233[] = {
+ instrux + 5153,
+ instrux + 5154,
+ instrux + 5155,
+ instrux + 5156,
+ instrux + 5157,
+ instrux + 5158,
+};
+
+static const struct itemplate * const itable_evex02234[] = {
+ instrux + 5186,
+ instrux + 5187,
+ instrux + 5188,
+ instrux + 5189,
+ instrux + 5190,
+ instrux + 5191,
+};
+
+static const struct itemplate * const itable_evex02235[] = {
+ instrux + 5180,
+ instrux + 5181,
+ instrux + 5182,
+ instrux + 5183,
+ instrux + 5184,
+ instrux + 5185,
+};
+
+static const struct itemplate * const itable_evex02238[] = {
+ instrux + 5162,
+ instrux + 5163,
+ instrux + 5164,
+ instrux + 5165,
+ instrux + 5166,
+ instrux + 5167,
+};
+
+static const struct itemplate * const itable_evex02239[] = {
+ instrux + 5144,
+ instrux + 5145,
+ instrux + 5146,
+ instrux + 5171,
+ instrux + 5172,
+ instrux + 5173,
+};
+
+static const struct itemplate * const itable_evex0223A[] = {
+ instrux + 4795,
+ instrux + 4796,
+ instrux + 4797,
+};
+
+static const struct itemplate * const itable_evex02352[] = {
+ instrux + 6161,
+};
+
+static const struct itemplate * const itable_evex02353[] = {
+ instrux + 6160,
+};
+
+static const struct itemplate * const itable_evex0239A[] = {
+ instrux + 6156,
+};
+
+static const struct itemplate * const itable_evex0239B[] = {
+ instrux + 6158,
+};
+
+static const struct itemplate * const itable_evex023AA[] = {
+ instrux + 6157,
+};
+
+static const struct itemplate * const itable_evex023AB[] = {
+ instrux + 6159,
+};
+
+static const struct itemplate * const itable_evex03100[] = {
+ instrux + 4941,
+ instrux + 4942,
+};
+
+static const struct itemplate * const itable_evex03101[] = {
+ instrux + 4931,
+ instrux + 4932,
+};
+
+static const struct itemplate * const itable_evex03103[] = {
+ instrux + 3958,
+ instrux + 3959,
+ instrux + 3960,
+ instrux + 3961,
+ instrux + 3962,
+ instrux + 3963,
+ instrux + 3964,
+ instrux + 3965,
+ instrux + 3966,
+ instrux + 3967,
+ instrux + 3968,
+ instrux + 3969,
+};
+
+static const struct itemplate * const itable_evex03104[] = {
+ instrux + 4922,
+ instrux + 4923,
+ instrux + 4924,
+};
+
+static const struct itemplate * const itable_evex03105[] = {
+ instrux + 4913,
+ instrux + 4914,
+ instrux + 4915,
+};
+
+static const struct itemplate * const itable_evex03108[] = {
+ instrux + 5813,
+ instrux + 5814,
+ instrux + 5815,
+};
+
+static const struct itemplate * const itable_evex03109[] = {
+ instrux + 5810,
+ instrux + 5811,
+ instrux + 5812,
+};
+
+static const struct itemplate * const itable_evex0310A[] = {
+ instrux + 5818,
+ instrux + 5819,
+};
+
+static const struct itemplate * const itable_evex0310B[] = {
+ instrux + 5816,
+ instrux + 5817,
+};
+
+static const struct itemplate * const itable_evex0310F[] = {
+ instrux + 4714,
+ instrux + 4715,
+ instrux + 4716,
+ instrux + 4717,
+ instrux + 4718,
+ instrux + 4719,
+};
+
+static const struct itemplate * const itable_evex03114[] = {
+ instrux + 4983,
+ instrux + 4984,
+ instrux + 4985,
+ instrux + 4986,
+ instrux + 4987,
+};
+
+static const struct itemplate * const itable_evex03115[] = {
+ instrux + 4990,
+ instrux + 4991,
+ instrux + 4992,
+ instrux + 4993,
+};
+
+static const struct itemplate * const itable_evex03116[] = {
+ instrux + 4988,
+ instrux + 4989,
+};
+
+static const struct itemplate * const itable_evex03117[] = {
+ instrux + 4222,
+ instrux + 4223,
+ instrux + 4224,
+};
+
+static const struct itemplate * const itable_evex03118[] = {
+ instrux + 4417,
+ instrux + 4418,
+ instrux + 4419,
+ instrux + 4420,
+ instrux + 4423,
+ instrux + 4424,
+ instrux + 4425,
+ instrux + 4426,
+};
+
+static const struct itemplate * const itable_evex03119[] = {
+ instrux + 4198,
+ instrux + 4199,
+ instrux + 4200,
+ instrux + 4201,
+ instrux + 4204,
+ instrux + 4205,
+ instrux + 4206,
+ instrux + 4207,
+};
+
+static const struct itemplate * const itable_evex0311A[] = {
+ instrux + 4421,
+ instrux + 4422,
+ instrux + 4427,
+ instrux + 4428,
+};
+
+static const struct itemplate * const itable_evex0311B[] = {
+ instrux + 4202,
+ instrux + 4203,
+ instrux + 4208,
+ instrux + 4209,
+};
+
+static const struct itemplate * const itable_evex0311D[] = {
+ instrux + 4079,
+ instrux + 4080,
+ instrux + 4081,
+ instrux + 4082,
+ instrux + 4083,
+ instrux + 4084,
+};
+
+static const struct itemplate * const itable_evex0311E[] = {
+ instrux + 4855,
+ instrux + 4856,
+ instrux + 4857,
+ instrux + 4858,
+ instrux + 4859,
+ instrux + 4860,
+};
+
+static const struct itemplate * const itable_evex0311F[] = {
+ instrux + 4822,
+ instrux + 4823,
+ instrux + 4824,
+ instrux + 4849,
+ instrux + 4850,
+ instrux + 4851,
+};
+
+static const struct itemplate * const itable_evex03120[] = {
+ instrux + 5009,
+ instrux + 5010,
+ instrux + 5011,
+ instrux + 5012,
+};
+
+static const struct itemplate * const itable_evex03121[] = {
+ instrux + 4441,
+ instrux + 4442,
+};
+
+static const struct itemplate * const itable_evex03122[] = {
+ instrux + 5013,
+ instrux + 5014,
+ instrux + 5015,
+ instrux + 5016,
+};
+
+static const struct itemplate * const itable_evex03123[] = {
+ instrux + 5872,
+ instrux + 5873,
+ instrux + 5874,
+ instrux + 5875,
+ instrux + 5876,
+ instrux + 5877,
+ instrux + 5878,
+ instrux + 5879,
+};
+
+static const struct itemplate * const itable_evex03125[] = {
+ instrux + 5678,
+ instrux + 5679,
+ instrux + 5680,
+ instrux + 5681,
+ instrux + 5682,
+ instrux + 5683,
+};
+
+static const struct itemplate * const itable_evex03126[] = {
+ instrux + 4409,
+ instrux + 4410,
+ instrux + 4411,
+ instrux + 4412,
+ instrux + 4413,
+ instrux + 4414,
+};
+
+static const struct itemplate * const itable_evex03127[] = {
+ instrux + 4415,
+ instrux + 4416,
+};
+
+static const struct itemplate * const itable_evex03138[] = {
+ instrux + 4429,
+ instrux + 4430,
+ instrux + 4431,
+ instrux + 4432,
+ instrux + 4435,
+ instrux + 4436,
+ instrux + 4437,
+ instrux + 4438,
+};
+
+static const struct itemplate * const itable_evex03139[] = {
+ instrux + 4210,
+ instrux + 4211,
+ instrux + 4212,
+ instrux + 4213,
+ instrux + 4216,
+ instrux + 4217,
+ instrux + 4218,
+ instrux + 4219,
+};
+
+static const struct itemplate * const itable_evex0313A[] = {
+ instrux + 4433,
+ instrux + 4434,
+ instrux + 4439,
+ instrux + 4440,
+};
+
+static const struct itemplate * const itable_evex0313B[] = {
+ instrux + 4214,
+ instrux + 4215,
+ instrux + 4220,
+ instrux + 4221,
+};
+
+static const struct itemplate * const itable_evex0313E[] = {
+ instrux + 4852,
+ instrux + 4853,
+ instrux + 4854,
+ instrux + 4861,
+ instrux + 4862,
+ instrux + 4863,
+};
+
+static const struct itemplate * const itable_evex0313F[] = {
+ instrux + 4819,
+ instrux + 4820,
+ instrux + 4821,
+ instrux + 4864,
+ instrux + 4865,
+ instrux + 4866,
+};
+
+static const struct itemplate * const itable_evex03142[] = {
+ instrux + 4162,
+ instrux + 4163,
+ instrux + 4164,
+ instrux + 4165,
+ instrux + 4166,
+ instrux + 4167,
+};
+
+static const struct itemplate * const itable_evex03143[] = {
+ instrux + 5880,
+ instrux + 5881,
+ instrux + 5882,
+ instrux + 5883,
+ instrux + 5884,
+ instrux + 5885,
+ instrux + 5886,
+ instrux + 5887,
+};
+
+static const struct itemplate * const itable_evex03144[] = {
+ instrux + 2944,
+ instrux + 2945,
+ instrux + 2946,
+ instrux + 2947,
+ instrux + 2948,
+ instrux + 2949,
+ instrux + 2950,
+ instrux + 2951,
+ instrux + 2952,
+ instrux + 2953,
+ instrux + 2954,
+ instrux + 2955,
+ instrux + 2956,
+ instrux + 2957,
+ instrux + 2958,
+ instrux + 2959,
+ instrux + 2960,
+ instrux + 2961,
+ instrux + 2962,
+ instrux + 2963,
+ instrux + 2964,
+ instrux + 2965,
+ instrux + 2966,
+ instrux + 2967,
+ instrux + 2968,
+ instrux + 2969,
+ instrux + 2970,
+ instrux + 2971,
+ instrux + 2972,
+ instrux + 2973,
+};
+
+static const struct itemplate * const itable_evex03150[] = {
+ instrux + 5768,
+ instrux + 5769,
+ instrux + 5770,
+ instrux + 5771,
+ instrux + 5772,
+ instrux + 5773,
+ instrux + 5774,
+ instrux + 5775,
+ instrux + 5776,
+ instrux + 5777,
+ instrux + 5778,
+ instrux + 5779,
+};
+
+static const struct itemplate * const itable_evex03151[] = {
+ instrux + 5780,
+ instrux + 5781,
+ instrux + 5782,
+ instrux + 5783,
+};
+
+static const struct itemplate * const itable_evex03154[] = {
+ instrux + 4225,
+ instrux + 4226,
+ instrux + 4227,
+ instrux + 4228,
+ instrux + 4229,
+ instrux + 4230,
+ instrux + 4231,
+ instrux + 4232,
+ instrux + 4233,
+ instrux + 4234,
+ instrux + 4235,
+ instrux + 4236,
+};
+
+static const struct itemplate * const itable_evex03155[] = {
+ instrux + 4237,
+ instrux + 4238,
+ instrux + 4239,
+ instrux + 4240,
+};
+
+static const struct itemplate * const itable_evex03156[] = {
+ instrux + 5800,
+ instrux + 5801,
+ instrux + 5802,
+ instrux + 5803,
+ instrux + 5804,
+ instrux + 5805,
+};
+
+static const struct itemplate * const itable_evex03157[] = {
+ instrux + 5806,
+ instrux + 5807,
+ instrux + 5808,
+ instrux + 5809,
+};
+
+static const struct itemplate * const itable_evex03166[] = {
+ instrux + 4373,
+ instrux + 4374,
+ instrux + 4375,
+ instrux + 4376,
+ instrux + 4377,
+ instrux + 4378,
+};
+
+static const struct itemplate * const itable_evex03167[] = {
+ instrux + 4379,
+ instrux + 4380,
+};
+
+static const struct itemplate * const itable_evex03170[] = {
+ instrux + 6045,
+ instrux + 6046,
+ instrux + 6047,
+ instrux + 6048,
+ instrux + 6049,
+ instrux + 6050,
+};
+
+static const struct itemplate * const itable_evex03171[] = {
+ instrux + 6051,
+ instrux + 6052,
+ instrux + 6053,
+ instrux + 6054,
+ instrux + 6055,
+ instrux + 6056,
+ instrux + 6057,
+ instrux + 6058,
+ instrux + 6059,
+ instrux + 6060,
+ instrux + 6061,
+ instrux + 6062,
+};
+
+static const struct itemplate * const itable_evex03172[] = {
+ instrux + 6081,
+ instrux + 6082,
+ instrux + 6083,
+ instrux + 6084,
+ instrux + 6085,
+ instrux + 6086,
+};
+
+static const struct itemplate * const itable_evex03173[] = {
+ instrux + 6087,
+ instrux + 6088,
+ instrux + 6089,
+ instrux + 6090,
+ instrux + 6091,
+ instrux + 6092,
+ instrux + 6093,
+ instrux + 6094,
+ instrux + 6095,
+ instrux + 6096,
+ instrux + 6097,
+ instrux + 6098,
+};
+
+static const struct itemplate * const itable_evex031CE[] = {
+ instrux + 6004,
+ instrux + 6005,
+ instrux + 6006,
+ instrux + 6007,
+ instrux + 6008,
+ instrux + 6009,
+};
+
+static const struct itemplate * const itable_evex031CF[] = {
+ instrux + 5993,
+ instrux + 5994,
+ instrux + 5995,
+ instrux + 5996,
+ instrux + 5997,
+ instrux + 5998,
+};
+
+static const struct itemplate * const itable_vex01010[] = {
+ instrux + 2554,
+ instrux + 2556,
+};
+
+static const struct itemplate * const itable_vex01011[] = {
+ instrux + 2555,
+ instrux + 2557,
+};
+
+static const struct itemplate * const itable_vex01012[] = {
+ instrux + 2502,
+ instrux + 2503,
+ instrux + 2515,
+ instrux + 2516,
+};
+
+static const struct itemplate * const itable_vex01013[] = {
+ instrux + 2517,
+};
+
+static const struct itemplate * const itable_vex01014[] = {
+ instrux + 2905,
+ instrux + 2906,
+ instrux + 2907,
+ instrux + 2908,
+};
+
+static const struct itemplate * const itable_vex01015[] = {
+ instrux + 2897,
+ instrux + 2898,
+ instrux + 2899,
+ instrux + 2900,
+};
+
+static const struct itemplate * const itable_vex01016[] = {
+ instrux + 2507,
+ instrux + 2508,
+ instrux + 2510,
+ instrux + 2511,
+};
+
+static const struct itemplate * const itable_vex01017[] = {
+ instrux + 2509,
+};
+
+static const struct itemplate * const itable_vex01028[] = {
+ instrux + 2478,
+ instrux + 2480,
+};
+
+static const struct itemplate * const itable_vex01029[] = {
+ instrux + 2479,
+ instrux + 2481,
+};
+
+static const struct itemplate * const itable_vex0102B[] = {
+ instrux + 2532,
+ instrux + 2533,
+};
+
+static const struct itemplate * const itable_vex0102E[] = {
+ instrux + 2892,
+};
+
+static const struct itemplate * const itable_vex0102F[] = {
+ instrux + 2354,
+};
+
+static const struct itemplate * const itable_vex01041[] = {
+ instrux + 3889,
+ instrux + 3890,
+};
+
+static const struct itemplate * const itable_vex01042[] = {
+ instrux + 3887,
+ instrux + 3888,
+};
+
+static const struct itemplate * const itable_vex01044[] = {
+ instrux + 3909,
+ instrux + 3910,
+};
+
+static const struct itemplate * const itable_vex01045[] = {
+ instrux + 3913,
+ instrux + 3918,
+};
+
+static const struct itemplate * const itable_vex01046[] = {
+ instrux + 3936,
+ instrux + 3937,
+};
+
+static const struct itemplate * const itable_vex01047[] = {
+ instrux + 3940,
+ instrux + 3941,
+};
+
+static const struct itemplate * const itable_vex0104A[] = {
+ instrux + 3881,
+ instrux + 3882,
+};
+
+static const struct itemplate * const itable_vex0104B[] = {
+ instrux + 3932,
+ instrux + 3933,
+};
+
+static const struct itemplate * const itable_vex01050[] = {
+ instrux + 2522,
+ instrux + 2523,
+ instrux + 2524,
+ instrux + 2525,
+};
+
+static const struct itemplate * const itable_vex01051[] = {
+ instrux + 2868,
+ instrux + 2869,
+};
+
+static const struct itemplate * const itable_vex01052[] = {
+ instrux + 2846,
+ instrux + 2847,
+};
+
+static const struct itemplate * const itable_vex01053[] = {
+ instrux + 2842,
+ instrux + 2843,
+};
+
+static const struct itemplate * const itable_vex01054[] = {
+ instrux + 1757,
+ instrux + 1758,
+ instrux + 1759,
+ instrux + 1760,
+};
+
+static const struct itemplate * const itable_vex01055[] = {
+ instrux + 1765,
+ instrux + 1766,
+ instrux + 1767,
+ instrux + 1768,
+};
+
+static const struct itemplate * const itable_vex01056[] = {
+ instrux + 2576,
+ instrux + 2577,
+ instrux + 2578,
+ instrux + 2579,
+};
+
+static const struct itemplate * const itable_vex01057[] = {
+ instrux + 2913,
+ instrux + 2914,
+ instrux + 2915,
+ instrux + 2916,
+};
+
+static const struct itemplate * const itable_vex01058[] = {
+ instrux + 1737,
+ instrux + 1738,
+ instrux + 1739,
+ instrux + 1740,
+};
+
+static const struct itemplate * const itable_vex01059[] = {
+ instrux + 2564,
+ instrux + 2565,
+ instrux + 2566,
+ instrux + 2567,
+};
+
+static const struct itemplate * const itable_vex0105A[] = {
+ instrux + 2369,
+ instrux + 2370,
+};
+
+static const struct itemplate * const itable_vex0105B[] = {
+ instrux + 2357,
+ instrux + 2358,
+};
+
+static const struct itemplate * const itable_vex0105C[] = {
+ instrux + 2879,
+ instrux + 2880,
+ instrux + 2881,
+ instrux + 2882,
+};
+
+static const struct itemplate * const itable_vex0105D[] = {
+ instrux + 2466,
+ instrux + 2467,
+ instrux + 2468,
+ instrux + 2469,
+};
+
+static const struct itemplate * const itable_vex0105E[] = {
+ instrux + 2401,
+ instrux + 2402,
+ instrux + 2403,
+ instrux + 2404,
+};
+
+static const struct itemplate * const itable_vex0105F[] = {
+ instrux + 2454,
+ instrux + 2455,
+ instrux + 2456,
+ instrux + 2457,
+};
+
+static const struct itemplate * const itable_vex01077[] = {
+ instrux + 2917,
+ instrux + 2918,
+};
+
+static const struct itemplate * const itable_vex01090[] = {
+ instrux + 3899,
+ instrux + 3903,
+};
+
+static const struct itemplate * const itable_vex01091[] = {
+ instrux + 3900,
+ instrux + 3904,
+};
+
+static const struct itemplate * const itable_vex01092[] = {
+ instrux + 3905,
+};
+
+static const struct itemplate * const itable_vex01093[] = {
+ instrux + 3906,
+};
+
+static const struct itemplate * const itable_vex01098[] = {
+ instrux + 3916,
+ instrux + 3917,
+};
+
+static const struct itemplate * const itable_vex01099[] = {
+ instrux + 3929,
+ instrux + 3930,
+};
+
+static const struct itemplate * const itable_vex010AE[] = {
+ instrux + 2440,
+ instrux + 2874,
+};
+
+static const struct itemplate * const itable_vex010C2[] = {
+ instrux + 1977,
+ instrux + 1978,
+ instrux + 1979,
+ instrux + 1980,
+ instrux + 1981,
+ instrux + 1982,
+ instrux + 1983,
+ instrux + 1984,
+ instrux + 1985,
+ instrux + 1986,
+ instrux + 1987,
+ instrux + 1988,
+ instrux + 1989,
+ instrux + 1990,
+ instrux + 1991,
+ instrux + 1992,
+ instrux + 1993,
+ instrux + 1994,
+ instrux + 1995,
+ instrux + 1996,
+ instrux + 1997,
+ instrux + 1998,
+ instrux + 1999,
+ instrux + 2000,
+ instrux + 2001,
+ instrux + 2002,
+ instrux + 2003,
+ instrux + 2004,
+ instrux + 2005,
+ instrux + 2006,
+ instrux + 2007,
+ instrux + 2008,
+ instrux + 2009,
+ instrux + 2010,
+ instrux + 2011,
+ instrux + 2012,
+ instrux + 2013,
+ instrux + 2014,
+ instrux + 2015,
+ instrux + 2016,
+ instrux + 2017,
+ instrux + 2018,
+ instrux + 2019,
+ instrux + 2020,
+ instrux + 2021,
+ instrux + 2022,
+ instrux + 2023,
+ instrux + 2024,
+ instrux + 2025,
+ instrux + 2026,
+ instrux + 2027,
+ instrux + 2028,
+ instrux + 2029,
+ instrux + 2030,
+ instrux + 2031,
+ instrux + 2032,
+ instrux + 2033,
+ instrux + 2034,
+ instrux + 2035,
+ instrux + 2036,
+ instrux + 2037,
+ instrux + 2038,
+ instrux + 2039,
+ instrux + 2040,
+ instrux + 2041,
+ instrux + 2042,
+ instrux + 2043,
+ instrux + 2044,
+ instrux + 2045,
+ instrux + 2046,
+ instrux + 2047,
+ instrux + 2048,
+ instrux + 2049,
+ instrux + 2050,
+ instrux + 2051,
+ instrux + 2052,
+ instrux + 2053,
+ instrux + 2054,
+ instrux + 2055,
+ instrux + 2056,
+ instrux + 2057,
+ instrux + 2058,
+ instrux + 2059,
+ instrux + 2060,
+ instrux + 2061,
+ instrux + 2062,
+ instrux + 2063,
+ instrux + 2064,
+ instrux + 2065,
+ instrux + 2066,
+ instrux + 2067,
+ instrux + 2068,
+ instrux + 2069,
+ instrux + 2070,
+ instrux + 2071,
+ instrux + 2072,
+ instrux + 2073,
+ instrux + 2074,
+ instrux + 2075,
+ instrux + 2076,
+ instrux + 2077,
+ instrux + 2078,
+ instrux + 2079,
+ instrux + 2080,
+ instrux + 2081,
+ instrux + 2082,
+ instrux + 2083,
+ instrux + 2084,
+ instrux + 2085,
+ instrux + 2086,
+ instrux + 2087,
+ instrux + 2088,
+ instrux + 2089,
+ instrux + 2090,
+ instrux + 2091,
+ instrux + 2092,
+ instrux + 2093,
+ instrux + 2094,
+ instrux + 2095,
+ instrux + 2096,
+ instrux + 2097,
+ instrux + 2098,
+ instrux + 2099,
+ instrux + 2100,
+ instrux + 2101,
+ instrux + 2102,
+ instrux + 2103,
+ instrux + 2104,
+ instrux + 2105,
+ instrux + 2106,
+ instrux + 2107,
+ instrux + 2108,
+ instrux + 2109,
+ instrux + 2110,
+ instrux + 2111,
+ instrux + 2112,
+ instrux + 2113,
+ instrux + 2114,
+ instrux + 2115,
+ instrux + 2116,
+ instrux + 2117,
+ instrux + 2118,
+ instrux + 2119,
+ instrux + 2120,
+ instrux + 2121,
+ instrux + 2122,
+ instrux + 2123,
+ instrux + 2124,
+ instrux + 2125,
+ instrux + 2126,
+ instrux + 2127,
+ instrux + 2128,
+ instrux + 2129,
+ instrux + 2130,
+ instrux + 2131,
+ instrux + 2132,
+ instrux + 2133,
+ instrux + 2134,
+ instrux + 2135,
+ instrux + 2136,
+ instrux + 2137,
+ instrux + 2138,
+ instrux + 2139,
+ instrux + 2140,
+ instrux + 2141,
+ instrux + 2142,
+ instrux + 2143,
+ instrux + 2144,
+ instrux + 2145,
+ instrux + 2146,
+ instrux + 2147,
+ instrux + 2148,
+ instrux + 2149,
+ instrux + 2150,
+ instrux + 2151,
+ instrux + 2152,
+ instrux + 2153,
+ instrux + 2154,
+ instrux + 2155,
+ instrux + 2156,
+ instrux + 2157,
+ instrux + 2158,
+ instrux + 2159,
+ instrux + 2160,
+ instrux + 2161,
+ instrux + 2162,
+ instrux + 2163,
+ instrux + 2164,
+};
+
+static const struct itemplate * const itable_vex010C6[] = {
+ instrux + 2862,
+ instrux + 2863,
+ instrux + 2864,
+ instrux + 2865,
+};
+
+static const struct itemplate * const itable_vex01110[] = {
+ instrux + 2550,
+ instrux + 2552,
+};
+
+static const struct itemplate * const itable_vex01111[] = {
+ instrux + 2551,
+ instrux + 2553,
+};
+
+static const struct itemplate * const itable_vex01112[] = {
+ instrux + 2512,
+ instrux + 2513,
+};
+
+static const struct itemplate * const itable_vex01113[] = {
+ instrux + 2514,
+};
+
+static const struct itemplate * const itable_vex01114[] = {
+ instrux + 2901,
+ instrux + 2902,
+ instrux + 2903,
+ instrux + 2904,
+};
+
+static const struct itemplate * const itable_vex01115[] = {
+ instrux + 2893,
+ instrux + 2894,
+ instrux + 2895,
+ instrux + 2896,
+};
+
+static const struct itemplate * const itable_vex01116[] = {
+ instrux + 2504,
+ instrux + 2505,
+};
+
+static const struct itemplate * const itable_vex01117[] = {
+ instrux + 2506,
+};
+
+static const struct itemplate * const itable_vex01128[] = {
+ instrux + 2474,
+ instrux + 2476,
+};
+
+static const struct itemplate * const itable_vex01129[] = {
+ instrux + 2475,
+ instrux + 2477,
+};
+
+static const struct itemplate * const itable_vex0112B[] = {
+ instrux + 2530,
+ instrux + 2531,
+};
+
+static const struct itemplate * const itable_vex0112E[] = {
+ instrux + 2891,
+};
+
+static const struct itemplate * const itable_vex0112F[] = {
+ instrux + 2353,
+};
+
+static const struct itemplate * const itable_vex01141[] = {
+ instrux + 3883,
+ instrux + 3884,
+};
+
+static const struct itemplate * const itable_vex01142[] = {
+ instrux + 3885,
+ instrux + 3886,
+};
+
+static const struct itemplate * const itable_vex01144[] = {
+ instrux + 3907,
+ instrux + 3908,
+};
+
+static const struct itemplate * const itable_vex01145[] = {
+ instrux + 3911,
+ instrux + 3912,
+};
+
+static const struct itemplate * const itable_vex01146[] = {
+ instrux + 3934,
+ instrux + 3935,
+};
+
+static const struct itemplate * const itable_vex01147[] = {
+ instrux + 3938,
+ instrux + 3939,
+};
+
+static const struct itemplate * const itable_vex0114A[] = {
+ instrux + 3879,
+ instrux + 3880,
+};
+
+static const struct itemplate * const itable_vex0114B[] = {
+ instrux + 3931,
+};
+
+static const struct itemplate * const itable_vex01150[] = {
+ instrux + 2518,
+ instrux + 2519,
+ instrux + 2520,
+ instrux + 2521,
+};
+
+static const struct itemplate * const itable_vex01151[] = {
+ instrux + 2866,
+ instrux + 2867,
+};
+
+static const struct itemplate * const itable_vex01154[] = {
+ instrux + 1753,
+ instrux + 1754,
+ instrux + 1755,
+ instrux + 1756,
+};
+
+static const struct itemplate * const itable_vex01155[] = {
+ instrux + 1761,
+ instrux + 1762,
+ instrux + 1763,
+ instrux + 1764,
+};
+
+static const struct itemplate * const itable_vex01156[] = {
+ instrux + 2572,
+ instrux + 2573,
+ instrux + 2574,
+ instrux + 2575,
+};
+
+static const struct itemplate * const itable_vex01157[] = {
+ instrux + 2909,
+ instrux + 2910,
+ instrux + 2911,
+ instrux + 2912,
+};
+
+static const struct itemplate * const itable_vex01158[] = {
+ instrux + 1733,
+ instrux + 1734,
+ instrux + 1735,
+ instrux + 1736,
+};
+
+static const struct itemplate * const itable_vex01159[] = {
+ instrux + 2560,
+ instrux + 2561,
+ instrux + 2562,
+ instrux + 2563,
+};
+
+static const struct itemplate * const itable_vex0115A[] = {
+ instrux + 2363,
+ instrux + 2364,
+ instrux + 2365,
+ instrux + 2366,
+};
+
+static const struct itemplate * const itable_vex0115B[] = {
+ instrux + 2367,
+ instrux + 2368,
+};
+
+static const struct itemplate * const itable_vex0115C[] = {
+ instrux + 2875,
+ instrux + 2876,
+ instrux + 2877,
+ instrux + 2878,
+};
+
+static const struct itemplate * const itable_vex0115D[] = {
+ instrux + 2462,
+ instrux + 2463,
+ instrux + 2464,
+ instrux + 2465,
+};
+
+static const struct itemplate * const itable_vex0115E[] = {
+ instrux + 2397,
+ instrux + 2398,
+ instrux + 2399,
+ instrux + 2400,
+};
+
+static const struct itemplate * const itable_vex0115F[] = {
+ instrux + 2450,
+ instrux + 2451,
+ instrux + 2452,
+ instrux + 2453,
+};
+
+static const struct itemplate * const itable_vex01160[] = {
+ instrux + 2832,
+ instrux + 2833,
+ instrux + 3693,
+ instrux + 3694,
+};
+
+static const struct itemplate * const itable_vex01161[] = {
+ instrux + 2834,
+ instrux + 2835,
+ instrux + 3695,
+ instrux + 3696,
+};
+
+static const struct itemplate * const itable_vex01162[] = {
+ instrux + 2836,
+ instrux + 2837,
+ instrux + 3697,
+ instrux + 3698,
+};
+
+static const struct itemplate * const itable_vex01163[] = {
+ instrux + 2583,
+ instrux + 2584,
+ instrux + 3490,
+ instrux + 3491,
+};
+
+static const struct itemplate * const itable_vex01164[] = {
+ instrux + 2633,
+ instrux + 2634,
+ instrux + 3536,
+ instrux + 3537,
+};
+
+static const struct itemplate * const itable_vex01165[] = {
+ instrux + 2635,
+ instrux + 2636,
+ instrux + 3538,
+ instrux + 3539,
+};
+
+static const struct itemplate * const itable_vex01166[] = {
+ instrux + 2637,
+ instrux + 2638,
+ instrux + 3540,
+ instrux + 3541,
+};
+
+static const struct itemplate * const itable_vex01167[] = {
+ instrux + 2587,
+ instrux + 2588,
+ instrux + 3496,
+ instrux + 3497,
+};
+
+static const struct itemplate * const itable_vex01168[] = {
+ instrux + 2824,
+ instrux + 2825,
+ instrux + 3685,
+ instrux + 3686,
+};
+
+static const struct itemplate * const itable_vex01169[] = {
+ instrux + 2826,
+ instrux + 2827,
+ instrux + 3687,
+ instrux + 3688,
+};
+
+static const struct itemplate * const itable_vex0116A[] = {
+ instrux + 2828,
+ instrux + 2829,
+ instrux + 3689,
+ instrux + 3690,
+};
+
+static const struct itemplate * const itable_vex0116B[] = {
+ instrux + 2585,
+ instrux + 2586,
+ instrux + 3492,
+ instrux + 3493,
+};
+
+static const struct itemplate * const itable_vex0116C[] = {
+ instrux + 2838,
+ instrux + 2839,
+ instrux + 3699,
+ instrux + 3700,
+};
+
+static const struct itemplate * const itable_vex0116D[] = {
+ instrux + 2830,
+ instrux + 2831,
+ instrux + 3691,
+ instrux + 3692,
+};
+
+static const struct itemplate * const itable_vex0116E[] = {
+ instrux + 2482,
+ instrux + 2486,
+};
+
+static const struct itemplate * const itable_vex0116F[] = {
+ instrux + 2490,
+ instrux + 2492,
+ instrux + 2494,
+};
+
+static const struct itemplate * const itable_vex01170[] = {
+ instrux + 2761,
+ instrux + 3624,
+};
+
+static const struct itemplate * const itable_vex01171[] = {
+ instrux + 2776,
+ instrux + 2777,
+ instrux + 2788,
+ instrux + 2789,
+ instrux + 2796,
+ instrux + 2797,
+ instrux + 3637,
+ instrux + 3638,
+ instrux + 3649,
+ instrux + 3650,
+ instrux + 3659,
+ instrux + 3660,
+};
+
+static const struct itemplate * const itable_vex01172[] = {
+ instrux + 2780,
+ instrux + 2781,
+ instrux + 2792,
+ instrux + 2793,
+ instrux + 2800,
+ instrux + 2801,
+ instrux + 3641,
+ instrux + 3642,
+ instrux + 3653,
+ instrux + 3654,
+ instrux + 3663,
+ instrux + 3664,
+};
+
+static const struct itemplate * const itable_vex01173[] = {
+ instrux + 2770,
+ instrux + 2771,
+ instrux + 2772,
+ instrux + 2773,
+ instrux + 2784,
+ instrux + 2785,
+ instrux + 2804,
+ instrux + 2805,
+ instrux + 3633,
+ instrux + 3634,
+ instrux + 3645,
+ instrux + 3646,
+ instrux + 3655,
+ instrux + 3656,
+ instrux + 3667,
+ instrux + 3668,
+};
+
+static const struct itemplate * const itable_vex01174[] = {
+ instrux + 2625,
+ instrux + 2626,
+ instrux + 3528,
+ instrux + 3529,
+};
+
+static const struct itemplate * const itable_vex01175[] = {
+ instrux + 2627,
+ instrux + 2628,
+ instrux + 3530,
+ instrux + 3531,
+};
+
+static const struct itemplate * const itable_vex01176[] = {
+ instrux + 2629,
+ instrux + 2630,
+ instrux + 3532,
+ instrux + 3533,
+};
+
+static const struct itemplate * const itable_vex0117C[] = {
+ instrux + 2417,
+ instrux + 2418,
+ instrux + 2419,
+ instrux + 2420,
+};
+
+static const struct itemplate * const itable_vex0117D[] = {
+ instrux + 2425,
+ instrux + 2426,
+ instrux + 2427,
+ instrux + 2428,
+};
+
+static const struct itemplate * const itable_vex0117E[] = {
+ instrux + 2483,
+ instrux + 2487,
+};
+
+static const struct itemplate * const itable_vex0117F[] = {
+ instrux + 2491,
+ instrux + 2493,
+ instrux + 2495,
+};
+
+static const struct itemplate * const itable_vex01190[] = {
+ instrux + 3891,
+ instrux + 3895,
+};
+
+static const struct itemplate * const itable_vex01191[] = {
+ instrux + 3892,
+ instrux + 3896,
+};
+
+static const struct itemplate * const itable_vex01192[] = {
+ instrux + 3893,
+};
+
+static const struct itemplate * const itable_vex01193[] = {
+ instrux + 3894,
+};
+
+static const struct itemplate * const itable_vex01198[] = {
+ instrux + 3914,
+ instrux + 3915,
+};
+
+static const struct itemplate * const itable_vex01199[] = {
+ instrux + 3927,
+ instrux + 3928,
+};
+
+static const struct itemplate * const itable_vex011C2[] = {
+ instrux + 1789,
+ instrux + 1790,
+ instrux + 1791,
+ instrux + 1792,
+ instrux + 1793,
+ instrux + 1794,
+ instrux + 1795,
+ instrux + 1796,
+ instrux + 1797,
+ instrux + 1798,
+ instrux + 1799,
+ instrux + 1800,
+ instrux + 1801,
+ instrux + 1802,
+ instrux + 1803,
+ instrux + 1804,
+ instrux + 1805,
+ instrux + 1806,
+ instrux + 1807,
+ instrux + 1808,
+ instrux + 1809,
+ instrux + 1810,
+ instrux + 1811,
+ instrux + 1812,
+ instrux + 1813,
+ instrux + 1814,
+ instrux + 1815,
+ instrux + 1816,
+ instrux + 1817,
+ instrux + 1818,
+ instrux + 1819,
+ instrux + 1820,
+ instrux + 1821,
+ instrux + 1822,
+ instrux + 1823,
+ instrux + 1824,
+ instrux + 1825,
+ instrux + 1826,
+ instrux + 1827,
+ instrux + 1828,
+ instrux + 1829,
+ instrux + 1830,
+ instrux + 1831,
+ instrux + 1832,
+ instrux + 1833,
+ instrux + 1834,
+ instrux + 1835,
+ instrux + 1836,
+ instrux + 1837,
+ instrux + 1838,
+ instrux + 1839,
+ instrux + 1840,
+ instrux + 1841,
+ instrux + 1842,
+ instrux + 1843,
+ instrux + 1844,
+ instrux + 1845,
+ instrux + 1846,
+ instrux + 1847,
+ instrux + 1848,
+ instrux + 1849,
+ instrux + 1850,
+ instrux + 1851,
+ instrux + 1852,
+ instrux + 1853,
+ instrux + 1854,
+ instrux + 1855,
+ instrux + 1856,
+ instrux + 1857,
+ instrux + 1858,
+ instrux + 1859,
+ instrux + 1860,
+ instrux + 1861,
+ instrux + 1862,
+ instrux + 1863,
+ instrux + 1864,
+ instrux + 1865,
+ instrux + 1866,
+ instrux + 1867,
+ instrux + 1868,
+ instrux + 1869,
+ instrux + 1870,
+ instrux + 1871,
+ instrux + 1872,
+ instrux + 1873,
+ instrux + 1874,
+ instrux + 1875,
+ instrux + 1876,
+ instrux + 1877,
+ instrux + 1878,
+ instrux + 1879,
+ instrux + 1880,
+ instrux + 1881,
+ instrux + 1882,
+ instrux + 1883,
+ instrux + 1884,
+ instrux + 1885,
+ instrux + 1886,
+ instrux + 1887,
+ instrux + 1888,
+ instrux + 1889,
+ instrux + 1890,
+ instrux + 1891,
+ instrux + 1892,
+ instrux + 1893,
+ instrux + 1894,
+ instrux + 1895,
+ instrux + 1896,
+ instrux + 1897,
+ instrux + 1898,
+ instrux + 1899,
+ instrux + 1900,
+ instrux + 1901,
+ instrux + 1902,
+ instrux + 1903,
+ instrux + 1904,
+ instrux + 1905,
+ instrux + 1906,
+ instrux + 1907,
+ instrux + 1908,
+ instrux + 1909,
+ instrux + 1910,
+ instrux + 1911,
+ instrux + 1912,
+ instrux + 1913,
+ instrux + 1914,
+ instrux + 1915,
+ instrux + 1916,
+ instrux + 1917,
+ instrux + 1918,
+ instrux + 1919,
+ instrux + 1920,
+ instrux + 1921,
+ instrux + 1922,
+ instrux + 1923,
+ instrux + 1924,
+ instrux + 1925,
+ instrux + 1926,
+ instrux + 1927,
+ instrux + 1928,
+ instrux + 1929,
+ instrux + 1930,
+ instrux + 1931,
+ instrux + 1932,
+ instrux + 1933,
+ instrux + 1934,
+ instrux + 1935,
+ instrux + 1936,
+ instrux + 1937,
+ instrux + 1938,
+ instrux + 1939,
+ instrux + 1940,
+ instrux + 1941,
+ instrux + 1942,
+ instrux + 1943,
+ instrux + 1944,
+ instrux + 1945,
+ instrux + 1946,
+ instrux + 1947,
+ instrux + 1948,
+ instrux + 1949,
+ instrux + 1950,
+ instrux + 1951,
+ instrux + 1952,
+ instrux + 1953,
+ instrux + 1954,
+ instrux + 1955,
+ instrux + 1956,
+ instrux + 1957,
+ instrux + 1958,
+ instrux + 1959,
+ instrux + 1960,
+ instrux + 1961,
+ instrux + 1962,
+ instrux + 1963,
+ instrux + 1964,
+ instrux + 1965,
+ instrux + 1966,
+ instrux + 1967,
+ instrux + 1968,
+ instrux + 1969,
+ instrux + 1970,
+ instrux + 1971,
+ instrux + 1972,
+ instrux + 1973,
+ instrux + 1974,
+ instrux + 1975,
+ instrux + 1976,
+};
+
+static const struct itemplate * const itable_vex011C4[] = {
+ instrux + 2685,
+ instrux + 2686,
+ instrux + 2687,
+ instrux + 2688,
+ instrux + 2689,
+ instrux + 2690,
+};
+
+static const struct itemplate * const itable_vex011C5[] = {
+ instrux + 2658,
+ instrux + 2659,
+};
+
+static const struct itemplate * const itable_vex011C6[] = {
+ instrux + 2858,
+ instrux + 2859,
+ instrux + 2860,
+ instrux + 2861,
+};
+
+static const struct itemplate * const itable_vex011D0[] = {
+ instrux + 1745,
+ instrux + 1746,
+ instrux + 1747,
+ instrux + 1748,
+};
+
+static const struct itemplate * const itable_vex011D1[] = {
+ instrux + 2794,
+ instrux + 2795,
+ instrux + 3657,
+ instrux + 3658,
+};
+
+static const struct itemplate * const itable_vex011D2[] = {
+ instrux + 2798,
+ instrux + 2799,
+ instrux + 3661,
+ instrux + 3662,
+};
+
+static const struct itemplate * const itable_vex011D3[] = {
+ instrux + 2802,
+ instrux + 2803,
+ instrux + 3665,
+ instrux + 3666,
+};
+
+static const struct itemplate * const itable_vex011D4[] = {
+ instrux + 2597,
+ instrux + 2598,
+ instrux + 3504,
+ instrux + 3505,
+};
+
+static const struct itemplate * const itable_vex011D5[] = {
+ instrux + 2747,
+ instrux + 2748,
+ instrux + 3612,
+ instrux + 3613,
+};
+
+static const struct itemplate * const itable_vex011D6[] = {
+ instrux + 2485,
+};
+
+static const struct itemplate * const itable_vex011D7[] = {
+ instrux + 2727,
+ instrux + 2728,
+ instrux + 3584,
+ instrux + 3585,
+};
+
+static const struct itemplate * const itable_vex011D8[] = {
+ instrux + 2820,
+ instrux + 2821,
+ instrux + 3681,
+ instrux + 3682,
+};
+
+static const struct itemplate * const itable_vex011D9[] = {
+ instrux + 2822,
+ instrux + 2823,
+ instrux + 3683,
+ instrux + 3684,
+};
+
+static const struct itemplate * const itable_vex011DA[] = {
+ instrux + 2721,
+ instrux + 2722,
+ instrux + 3578,
+ instrux + 3579,
+};
+
+static const struct itemplate * const itable_vex011DB[] = {
+ instrux + 2609,
+ instrux + 2610,
+ instrux + 3516,
+ instrux + 3517,
+};
+
+static const struct itemplate * const itable_vex011DC[] = {
+ instrux + 2603,
+ instrux + 2604,
+ instrux + 3510,
+ instrux + 3511,
+};
+
+static const struct itemplate * const itable_vex011DD[] = {
+ instrux + 2605,
+ instrux + 2606,
+ instrux + 3512,
+ instrux + 3513,
+};
+
+static const struct itemplate * const itable_vex011DE[] = {
+ instrux + 2709,
+ instrux + 2710,
+ instrux + 3566,
+ instrux + 3567,
+};
+
+static const struct itemplate * const itable_vex011DF[] = {
+ instrux + 2611,
+ instrux + 2612,
+ instrux + 3518,
+ instrux + 3519,
+};
+
+static const struct itemplate * const itable_vex011E0[] = {
+ instrux + 2613,
+ instrux + 2614,
+ instrux + 3520,
+ instrux + 3521,
+};
+
+static const struct itemplate * const itable_vex011E1[] = {
+ instrux + 2786,
+ instrux + 2787,
+ instrux + 3647,
+ instrux + 3648,
+};
+
+static const struct itemplate * const itable_vex011E2[] = {
+ instrux + 2790,
+ instrux + 2791,
+ instrux + 3651,
+ instrux + 3652,
+};
+
+static const struct itemplate * const itable_vex011E3[] = {
+ instrux + 2615,
+ instrux + 2616,
+ instrux + 3522,
+ instrux + 3523,
+};
+
+static const struct itemplate * const itable_vex011E4[] = {
+ instrux + 2741,
+ instrux + 2742,
+ instrux + 3608,
+ instrux + 3609,
+};
+
+static const struct itemplate * const itable_vex011E5[] = {
+ instrux + 2745,
+ instrux + 2746,
+ instrux + 3610,
+ instrux + 3611,
+};
+
+static const struct itemplate * const itable_vex011E6[] = {
+ instrux + 2387,
+ instrux + 2388,
+ instrux + 2389,
+ instrux + 2390,
+};
+
+static const struct itemplate * const itable_vex011E7[] = {
+ instrux + 2526,
+ instrux + 2527,
+ instrux + 2528,
+};
+
+static const struct itemplate * const itable_vex011E8[] = {
+ instrux + 2816,
+ instrux + 2817,
+ instrux + 3677,
+ instrux + 3678,
+};
+
+static const struct itemplate * const itable_vex011E9[] = {
+ instrux + 2818,
+ instrux + 2819,
+ instrux + 3679,
+ instrux + 3680,
+};
+
+static const struct itemplate * const itable_vex011EA[] = {
+ instrux + 2717,
+ instrux + 2718,
+ instrux + 3574,
+ instrux + 3575,
+};
+
+static const struct itemplate * const itable_vex011EB[] = {
+ instrux + 2755,
+ instrux + 2756,
+ instrux + 3618,
+ instrux + 3619,
+};
+
+static const struct itemplate * const itable_vex011EC[] = {
+ instrux + 2599,
+ instrux + 2600,
+ instrux + 3506,
+ instrux + 3507,
+};
+
+static const struct itemplate * const itable_vex011ED[] = {
+ instrux + 2601,
+ instrux + 2602,
+ instrux + 3508,
+ instrux + 3509,
+};
+
+static const struct itemplate * const itable_vex011EE[] = {
+ instrux + 2705,
+ instrux + 2706,
+ instrux + 3562,
+ instrux + 3563,
+};
+
+static const struct itemplate * const itable_vex011EF[] = {
+ instrux + 2840,
+ instrux + 2841,
+ instrux + 3701,
+ instrux + 3702,
+};
+
+static const struct itemplate * const itable_vex011F1[] = {
+ instrux + 2774,
+ instrux + 2775,
+ instrux + 3635,
+ instrux + 3636,
+};
+
+static const struct itemplate * const itable_vex011F2[] = {
+ instrux + 2778,
+ instrux + 2779,
+ instrux + 3639,
+ instrux + 3640,
+};
+
+static const struct itemplate * const itable_vex011F3[] = {
+ instrux + 2782,
+ instrux + 2783,
+ instrux + 3643,
+ instrux + 3644,
+};
+
+static const struct itemplate * const itable_vex011F4[] = {
+ instrux + 2751,
+ instrux + 2752,
+ instrux + 3616,
+ instrux + 3617,
+};
+
+static const struct itemplate * const itable_vex011F5[] = {
+ instrux + 2699,
+ instrux + 2700,
+ instrux + 3558,
+ instrux + 3559,
+};
+
+static const struct itemplate * const itable_vex011F6[] = {
+ instrux + 2757,
+ instrux + 2758,
+ instrux + 3620,
+ instrux + 3621,
+};
+
+static const struct itemplate * const itable_vex011F7[] = {
+ instrux + 2441,
+};
+
+static const struct itemplate * const itable_vex011F8[] = {
+ instrux + 2808,
+ instrux + 2809,
+ instrux + 3669,
+ instrux + 3670,
+};
+
+static const struct itemplate * const itable_vex011F9[] = {
+ instrux + 2810,
+ instrux + 2811,
+ instrux + 3671,
+ instrux + 3672,
+};
+
+static const struct itemplate * const itable_vex011FA[] = {
+ instrux + 2812,
+ instrux + 2813,
+ instrux + 3673,
+ instrux + 3674,
+};
+
+static const struct itemplate * const itable_vex011FB[] = {
+ instrux + 2814,
+ instrux + 2815,
+ instrux + 3675,
+ instrux + 3676,
+};
+
+static const struct itemplate * const itable_vex011FC[] = {
+ instrux + 2591,
+ instrux + 2592,
+ instrux + 3498,
+ instrux + 3499,
+};
+
+static const struct itemplate * const itable_vex011FD[] = {
+ instrux + 2593,
+ instrux + 2594,
+ instrux + 3500,
+ instrux + 3501,
+};
+
+static const struct itemplate * const itable_vex011FE[] = {
+ instrux + 2595,
+ instrux + 2596,
+ instrux + 3502,
+ instrux + 3503,
+};
+
+static const struct itemplate * const itable_vex01210[] = {
+ instrux + 2544,
+ instrux + 2545,
+ instrux + 2546,
+};
+
+static const struct itemplate * const itable_vex01211[] = {
+ instrux + 2547,
+ instrux + 2548,
+ instrux + 2549,
+};
+
+static const struct itemplate * const itable_vex01212[] = {
+ instrux + 2542,
+ instrux + 2543,
+};
+
+static const struct itemplate * const itable_vex01216[] = {
+ instrux + 2540,
+ instrux + 2541,
+};
+
+static const struct itemplate * const itable_vex0122A[] = {
+ instrux + 2379,
+ instrux + 2380,
+ instrux + 2381,
+ instrux + 2382,
+};
+
+static const struct itemplate * const itable_vex0122C[] = {
+ instrux + 2395,
+ instrux + 2396,
+};
+
+static const struct itemplate * const itable_vex0122D[] = {
+ instrux + 2385,
+ instrux + 2386,
+};
+
+static const struct itemplate * const itable_vex01251[] = {
+ instrux + 2872,
+ instrux + 2873,
+};
+
+static const struct itemplate * const itable_vex01252[] = {
+ instrux + 2848,
+ instrux + 2849,
+};
+
+static const struct itemplate * const itable_vex01253[] = {
+ instrux + 2844,
+ instrux + 2845,
+};
+
+static const struct itemplate * const itable_vex01258[] = {
+ instrux + 1743,
+ instrux + 1744,
+};
+
+static const struct itemplate * const itable_vex01259[] = {
+ instrux + 2570,
+ instrux + 2571,
+};
+
+static const struct itemplate * const itable_vex0125A[] = {
+ instrux + 2383,
+ instrux + 2384,
+};
+
+static const struct itemplate * const itable_vex0125B[] = {
+ instrux + 2391,
+ instrux + 2392,
+};
+
+static const struct itemplate * const itable_vex0125C[] = {
+ instrux + 2885,
+ instrux + 2886,
+};
+
+static const struct itemplate * const itable_vex0125D[] = {
+ instrux + 2472,
+ instrux + 2473,
+};
+
+static const struct itemplate * const itable_vex0125E[] = {
+ instrux + 2407,
+ instrux + 2408,
+};
+
+static const struct itemplate * const itable_vex0125F[] = {
+ instrux + 2460,
+ instrux + 2461,
+};
+
+static const struct itemplate * const itable_vex0126F[] = {
+ instrux + 2496,
+ instrux + 2498,
+ instrux + 2500,
+};
+
+static const struct itemplate * const itable_vex01270[] = {
+ instrux + 2762,
+ instrux + 3625,
+};
+
+static const struct itemplate * const itable_vex0127E[] = {
+ instrux + 2484,
+};
+
+static const struct itemplate * const itable_vex0127F[] = {
+ instrux + 2497,
+ instrux + 2499,
+ instrux + 2501,
+};
+
+static const struct itemplate * const itable_vex012C2[] = {
+ instrux + 2259,
+ instrux + 2260,
+ instrux + 2261,
+ instrux + 2262,
+ instrux + 2263,
+ instrux + 2264,
+ instrux + 2265,
+ instrux + 2266,
+ instrux + 2267,
+ instrux + 2268,
+ instrux + 2269,
+ instrux + 2270,
+ instrux + 2271,
+ instrux + 2272,
+ instrux + 2273,
+ instrux + 2274,
+ instrux + 2275,
+ instrux + 2276,
+ instrux + 2277,
+ instrux + 2278,
+ instrux + 2279,
+ instrux + 2280,
+ instrux + 2281,
+ instrux + 2282,
+ instrux + 2283,
+ instrux + 2284,
+ instrux + 2285,
+ instrux + 2286,
+ instrux + 2287,
+ instrux + 2288,
+ instrux + 2289,
+ instrux + 2290,
+ instrux + 2291,
+ instrux + 2292,
+ instrux + 2293,
+ instrux + 2294,
+ instrux + 2295,
+ instrux + 2296,
+ instrux + 2297,
+ instrux + 2298,
+ instrux + 2299,
+ instrux + 2300,
+ instrux + 2301,
+ instrux + 2302,
+ instrux + 2303,
+ instrux + 2304,
+ instrux + 2305,
+ instrux + 2306,
+ instrux + 2307,
+ instrux + 2308,
+ instrux + 2309,
+ instrux + 2310,
+ instrux + 2311,
+ instrux + 2312,
+ instrux + 2313,
+ instrux + 2314,
+ instrux + 2315,
+ instrux + 2316,
+ instrux + 2317,
+ instrux + 2318,
+ instrux + 2319,
+ instrux + 2320,
+ instrux + 2321,
+ instrux + 2322,
+ instrux + 2323,
+ instrux + 2324,
+ instrux + 2325,
+ instrux + 2326,
+ instrux + 2327,
+ instrux + 2328,
+ instrux + 2329,
+ instrux + 2330,
+ instrux + 2331,
+ instrux + 2332,
+ instrux + 2333,
+ instrux + 2334,
+ instrux + 2335,
+ instrux + 2336,
+ instrux + 2337,
+ instrux + 2338,
+ instrux + 2339,
+ instrux + 2340,
+ instrux + 2341,
+ instrux + 2342,
+ instrux + 2343,
+ instrux + 2344,
+ instrux + 2345,
+ instrux + 2346,
+ instrux + 2347,
+ instrux + 2348,
+ instrux + 2349,
+ instrux + 2350,
+ instrux + 2351,
+ instrux + 2352,
+};
+
+static const struct itemplate * const itable_vex012E6[] = {
+ instrux + 2355,
+ instrux + 2356,
+};
+
+static const struct itemplate * const itable_vex01310[] = {
+ instrux + 2534,
+ instrux + 2535,
+ instrux + 2536,
+};
+
+static const struct itemplate * const itable_vex01311[] = {
+ instrux + 2537,
+ instrux + 2538,
+ instrux + 2539,
+};
+
+static const struct itemplate * const itable_vex01312[] = {
+ instrux + 2488,
+ instrux + 2489,
+};
+
+static const struct itemplate * const itable_vex0132A[] = {
+ instrux + 2375,
+ instrux + 2376,
+ instrux + 2377,
+ instrux + 2378,
+};
+
+static const struct itemplate * const itable_vex0132C[] = {
+ instrux + 2393,
+ instrux + 2394,
+};
+
+static const struct itemplate * const itable_vex0132D[] = {
+ instrux + 2371,
+ instrux + 2372,
+};
+
+static const struct itemplate * const itable_vex01351[] = {
+ instrux + 2870,
+ instrux + 2871,
+};
+
+static const struct itemplate * const itable_vex01358[] = {
+ instrux + 1741,
+ instrux + 1742,
+};
+
+static const struct itemplate * const itable_vex01359[] = {
+ instrux + 2568,
+ instrux + 2569,
+};
+
+static const struct itemplate * const itable_vex0135A[] = {
+ instrux + 2373,
+ instrux + 2374,
+};
+
+static const struct itemplate * const itable_vex0135C[] = {
+ instrux + 2883,
+ instrux + 2884,
+};
+
+static const struct itemplate * const itable_vex0135D[] = {
+ instrux + 2470,
+ instrux + 2471,
+};
+
+static const struct itemplate * const itable_vex0135E[] = {
+ instrux + 2405,
+ instrux + 2406,
+};
+
+static const struct itemplate * const itable_vex0135F[] = {
+ instrux + 2458,
+ instrux + 2459,
+};
+
+static const struct itemplate * const itable_vex01370[] = {
+ instrux + 2763,
+ instrux + 3626,
+};
+
+static const struct itemplate * const itable_vex0137C[] = {
+ instrux + 2421,
+ instrux + 2422,
+ instrux + 2423,
+ instrux + 2424,
+};
+
+static const struct itemplate * const itable_vex0137D[] = {
+ instrux + 2429,
+ instrux + 2430,
+ instrux + 2431,
+ instrux + 2432,
+};
+
+static const struct itemplate * const itable_vex01392[] = {
+ instrux + 3897,
+ instrux + 3901,
+};
+
+static const struct itemplate * const itable_vex01393[] = {
+ instrux + 3898,
+ instrux + 3902,
+};
+
+static const struct itemplate * const itable_vex013C2[] = {
+ instrux + 2165,
+ instrux + 2166,
+ instrux + 2167,
+ instrux + 2168,
+ instrux + 2169,
+ instrux + 2170,
+ instrux + 2171,
+ instrux + 2172,
+ instrux + 2173,
+ instrux + 2174,
+ instrux + 2175,
+ instrux + 2176,
+ instrux + 2177,
+ instrux + 2178,
+ instrux + 2179,
+ instrux + 2180,
+ instrux + 2181,
+ instrux + 2182,
+ instrux + 2183,
+ instrux + 2184,
+ instrux + 2185,
+ instrux + 2186,
+ instrux + 2187,
+ instrux + 2188,
+ instrux + 2189,
+ instrux + 2190,
+ instrux + 2191,
+ instrux + 2192,
+ instrux + 2193,
+ instrux + 2194,
+ instrux + 2195,
+ instrux + 2196,
+ instrux + 2197,
+ instrux + 2198,
+ instrux + 2199,
+ instrux + 2200,
+ instrux + 2201,
+ instrux + 2202,
+ instrux + 2203,
+ instrux + 2204,
+ instrux + 2205,
+ instrux + 2206,
+ instrux + 2207,
+ instrux + 2208,
+ instrux + 2209,
+ instrux + 2210,
+ instrux + 2211,
+ instrux + 2212,
+ instrux + 2213,
+ instrux + 2214,
+ instrux + 2215,
+ instrux + 2216,
+ instrux + 2217,
+ instrux + 2218,
+ instrux + 2219,
+ instrux + 2220,
+ instrux + 2221,
+ instrux + 2222,
+ instrux + 2223,
+ instrux + 2224,
+ instrux + 2225,
+ instrux + 2226,
+ instrux + 2227,
+ instrux + 2228,
+ instrux + 2229,
+ instrux + 2230,
+ instrux + 2231,
+ instrux + 2232,
+ instrux + 2233,
+ instrux + 2234,
+ instrux + 2235,
+ instrux + 2236,
+ instrux + 2237,
+ instrux + 2238,
+ instrux + 2239,
+ instrux + 2240,
+ instrux + 2241,
+ instrux + 2242,
+ instrux + 2243,
+ instrux + 2244,
+ instrux + 2245,
+ instrux + 2246,
+ instrux + 2247,
+ instrux + 2248,
+ instrux + 2249,
+ instrux + 2250,
+ instrux + 2251,
+ instrux + 2252,
+ instrux + 2253,
+ instrux + 2254,
+ instrux + 2255,
+ instrux + 2256,
+ instrux + 2257,
+ instrux + 2258,
+};
+
+static const struct itemplate * const itable_vex013D0[] = {
+ instrux + 1749,
+ instrux + 1750,
+ instrux + 1751,
+ instrux + 1752,
+};
+
+static const struct itemplate * const itable_vex013E6[] = {
+ instrux + 2359,
+ instrux + 2360,
+ instrux + 2361,
+ instrux + 2362,
+};
+
+static const struct itemplate * const itable_vex013F0[] = {
+ instrux + 2437,
+ instrux + 2438,
+ instrux + 2439,
+};
+
+static const struct itemplate * const itable_vex020F2[] = {
+ instrux + 3799,
+ instrux + 3800,
+};
+
+static const struct itemplate * const itable_vex020F3[] = {
+ instrux + 3809,
+ instrux + 3810,
+ instrux + 3819,
+ instrux + 3820,
+ instrux + 3821,
+ instrux + 3822,
+};
+
+static const struct itemplate * const itable_vex020F5[] = {
+ instrux + 3825,
+ instrux + 3826,
+};
+
+static const struct itemplate * const itable_vex020F7[] = {
+ instrux + 3801,
+ instrux + 3802,
+};
+
+static const struct itemplate * const itable_vex02100[] = {
+ instrux + 2759,
+ instrux + 2760,
+ instrux + 3622,
+ instrux + 3623,
+};
+
+static const struct itemplate * const itable_vex02101[] = {
+ instrux + 2666,
+ instrux + 2667,
+ instrux + 3544,
+ instrux + 3545,
+};
+
+static const struct itemplate * const itable_vex02102[] = {
+ instrux + 2668,
+ instrux + 2669,
+ instrux + 3546,
+ instrux + 3547,
+};
+
+static const struct itemplate * const itable_vex02103[] = {
+ instrux + 2670,
+ instrux + 2671,
+ instrux + 3548,
+ instrux + 3549,
+};
+
+static const struct itemplate * const itable_vex02104[] = {
+ instrux + 2701,
+ instrux + 2702,
+ instrux + 3556,
+ instrux + 3557,
+};
+
+static const struct itemplate * const itable_vex02105[] = {
+ instrux + 2673,
+ instrux + 2674,
+ instrux + 3550,
+ instrux + 3551,
+};
+
+static const struct itemplate * const itable_vex02106[] = {
+ instrux + 2675,
+ instrux + 2676,
+ instrux + 3552,
+ instrux + 3553,
+};
+
+static const struct itemplate * const itable_vex02107[] = {
+ instrux + 2677,
+ instrux + 2678,
+ instrux + 3554,
+ instrux + 3555,
+};
+
+static const struct itemplate * const itable_vex02108[] = {
+ instrux + 2764,
+ instrux + 2765,
+ instrux + 3627,
+ instrux + 3628,
+};
+
+static const struct itemplate * const itable_vex02109[] = {
+ instrux + 2766,
+ instrux + 2767,
+ instrux + 3629,
+ instrux + 3630,
+};
+
+static const struct itemplate * const itable_vex0210A[] = {
+ instrux + 2768,
+ instrux + 2769,
+ instrux + 3631,
+ instrux + 3632,
+};
+
+static const struct itemplate * const itable_vex0210B[] = {
+ instrux + 2743,
+ instrux + 2744,
+ instrux + 3606,
+ instrux + 3607,
+};
+
+static const struct itemplate * const itable_vex0210C[] = {
+ instrux + 2647,
+ instrux + 2648,
+ instrux + 2649,
+ instrux + 2650,
+};
+
+static const struct itemplate * const itable_vex0210D[] = {
+ instrux + 2641,
+ instrux + 2642,
+ instrux + 2643,
+ instrux + 2644,
+};
+
+static const struct itemplate * const itable_vex0210E[] = {
+ instrux + 2887,
+ instrux + 2888,
+};
+
+static const struct itemplate * const itable_vex0210F[] = {
+ instrux + 2889,
+ instrux + 2890,
+};
+
+static const struct itemplate * const itable_vex02113[] = {
+ instrux + 3177,
+ instrux + 3178,
+};
+
+static const struct itemplate * const itable_vex02116[] = {
+ instrux + 3731,
+ instrux + 3732,
+};
+
+static const struct itemplate * const itable_vex02117[] = {
+ instrux + 2806,
+ instrux + 2807,
+};
+
+static const struct itemplate * const itable_vex02118[] = {
+ instrux + 1785,
+ instrux + 1786,
+ instrux + 3704,
+ instrux + 3705,
+};
+
+static const struct itemplate * const itable_vex02119[] = {
+ instrux + 1787,
+ instrux + 3706,
+};
+
+static const struct itemplate * const itable_vex0211A[] = {
+ instrux + 1788,
+};
+
+static const struct itemplate * const itable_vex0211C[] = {
+ instrux + 2580,
+ instrux + 3487,
+};
+
+static const struct itemplate * const itable_vex0211D[] = {
+ instrux + 2581,
+ instrux + 3488,
+};
+
+static const struct itemplate * const itable_vex0211E[] = {
+ instrux + 2582,
+ instrux + 3489,
+};
+
+static const struct itemplate * const itable_vex02120[] = {
+ instrux + 2729,
+ instrux + 3586,
+};
+
+static const struct itemplate * const itable_vex02121[] = {
+ instrux + 2730,
+ instrux + 3587,
+ instrux + 3588,
+};
+
+static const struct itemplate * const itable_vex02122[] = {
+ instrux + 2731,
+ instrux + 3589,
+ instrux + 3590,
+};
+
+static const struct itemplate * const itable_vex02123[] = {
+ instrux + 2732,
+ instrux + 3591,
+};
+
+static const struct itemplate * const itable_vex02124[] = {
+ instrux + 2733,
+ instrux + 3592,
+ instrux + 3593,
+};
+
+static const struct itemplate * const itable_vex02125[] = {
+ instrux + 2734,
+ instrux + 3594,
+};
+
+static const struct itemplate * const itable_vex02128[] = {
+ instrux + 2753,
+ instrux + 2754,
+ instrux + 3604,
+ instrux + 3605,
+};
+
+static const struct itemplate * const itable_vex02129[] = {
+ instrux + 2631,
+ instrux + 2632,
+ instrux + 3534,
+ instrux + 3535,
+};
+
+static const struct itemplate * const itable_vex0212A[] = {
+ instrux + 2529,
+ instrux + 3703,
+};
+
+static const struct itemplate * const itable_vex0212B[] = {
+ instrux + 2589,
+ instrux + 2590,
+ instrux + 3494,
+ instrux + 3495,
+};
+
+static const struct itemplate * const itable_vex0212C[] = {
+ instrux + 2442,
+ instrux + 2443,
+};
+
+static const struct itemplate * const itable_vex0212D[] = {
+ instrux + 2446,
+ instrux + 2447,
+};
+
+static const struct itemplate * const itable_vex0212E[] = {
+ instrux + 2444,
+ instrux + 2445,
+};
+
+static const struct itemplate * const itable_vex0212F[] = {
+ instrux + 2448,
+ instrux + 2449,
+};
+
+static const struct itemplate * const itable_vex02130[] = {
+ instrux + 2735,
+ instrux + 3595,
+};
+
+static const struct itemplate * const itable_vex02131[] = {
+ instrux + 2736,
+ instrux + 3596,
+ instrux + 3597,
+};
+
+static const struct itemplate * const itable_vex02132[] = {
+ instrux + 2737,
+ instrux + 3598,
+ instrux + 3599,
+};
+
+static const struct itemplate * const itable_vex02133[] = {
+ instrux + 2738,
+ instrux + 3600,
+};
+
+static const struct itemplate * const itable_vex02134[] = {
+ instrux + 2739,
+ instrux + 3601,
+ instrux + 3602,
+};
+
+static const struct itemplate * const itable_vex02135[] = {
+ instrux + 2740,
+ instrux + 3603,
+};
+
+static const struct itemplate * const itable_vex02136[] = {
+ instrux + 3728,
+ instrux + 3729,
+};
+
+static const struct itemplate * const itable_vex02137[] = {
+ instrux + 2639,
+ instrux + 2640,
+ instrux + 3542,
+ instrux + 3543,
+};
+
+static const struct itemplate * const itable_vex02138[] = {
+ instrux + 2715,
+ instrux + 2716,
+ instrux + 3572,
+ instrux + 3573,
+};
+
+static const struct itemplate * const itable_vex02139[] = {
+ instrux + 2719,
+ instrux + 2720,
+ instrux + 3576,
+ instrux + 3577,
+};
+
+static const struct itemplate * const itable_vex0213A[] = {
+ instrux + 2723,
+ instrux + 2724,
+ instrux + 3580,
+ instrux + 3581,
+};
+
+static const struct itemplate * const itable_vex0213B[] = {
+ instrux + 2725,
+ instrux + 2726,
+ instrux + 3582,
+ instrux + 3583,
+};
+
+static const struct itemplate * const itable_vex0213C[] = {
+ instrux + 2703,
+ instrux + 2704,
+ instrux + 3560,
+ instrux + 3561,
+};
+
+static const struct itemplate * const itable_vex0213D[] = {
+ instrux + 2707,
+ instrux + 2708,
+ instrux + 3564,
+ instrux + 3565,
+};
+
+static const struct itemplate * const itable_vex0213E[] = {
+ instrux + 2711,
+ instrux + 2712,
+ instrux + 3568,
+ instrux + 3569,
+};
+
+static const struct itemplate * const itable_vex0213F[] = {
+ instrux + 2713,
+ instrux + 2714,
+ instrux + 3570,
+ instrux + 3571,
+};
+
+static const struct itemplate * const itable_vex02140[] = {
+ instrux + 2749,
+ instrux + 2750,
+ instrux + 3614,
+ instrux + 3615,
+};
+
+static const struct itemplate * const itable_vex02141[] = {
+ instrux + 2672,
+};
+
+static const struct itemplate * const itable_vex02145[] = {
+ instrux + 3767,
+ instrux + 3768,
+ instrux + 3769,
+ instrux + 3770,
+ instrux + 3771,
+ instrux + 3772,
+ instrux + 3773,
+ instrux + 3774,
+};
+
+static const struct itemplate * const itable_vex02146[] = {
+ instrux + 3763,
+ instrux + 3764,
+ instrux + 3765,
+ instrux + 3766,
+};
+
+static const struct itemplate * const itable_vex02147[] = {
+ instrux + 3755,
+ instrux + 3756,
+ instrux + 3757,
+ instrux + 3758,
+ instrux + 3759,
+ instrux + 3760,
+ instrux + 3761,
+ instrux + 3762,
+};
+
+static const struct itemplate * const itable_vex02158[] = {
+ instrux + 3720,
+ instrux + 3721,
+ instrux + 3722,
+ instrux + 3723,
+};
+
+static const struct itemplate * const itable_vex02159[] = {
+ instrux + 3724,
+ instrux + 3725,
+ instrux + 3726,
+ instrux + 3727,
+};
+
+static const struct itemplate * const itable_vex0215A[] = {
+ instrux + 3707,
+};
+
+static const struct itemplate * const itable_vex02178[] = {
+ instrux + 3712,
+ instrux + 3713,
+ instrux + 3714,
+ instrux + 3715,
+};
+
+static const struct itemplate * const itable_vex02179[] = {
+ instrux + 3716,
+ instrux + 3717,
+ instrux + 3718,
+ instrux + 3719,
+};
+
+static const struct itemplate * const itable_vex0218C[] = {
+ instrux + 3739,
+ instrux + 3740,
+ instrux + 3741,
+ instrux + 3742,
+ instrux + 3743,
+ instrux + 3744,
+ instrux + 3745,
+ instrux + 3746,
+};
+
+static const struct itemplate * const itable_vex0218E[] = {
+ instrux + 3747,
+ instrux + 3748,
+ instrux + 3749,
+ instrux + 3750,
+ instrux + 3751,
+ instrux + 3752,
+ instrux + 3753,
+ instrux + 3754,
+};
+
+static const struct itemplate * const itable_vex02190[] = {
+ instrux + 3783,
+ instrux + 3785,
+ instrux + 3787,
+ instrux + 3789,
+};
+
+static const struct itemplate * const itable_vex02191[] = {
+ instrux + 3784,
+ instrux + 3786,
+ instrux + 3788,
+ instrux + 3790,
+};
+
+static const struct itemplate * const itable_vex02192[] = {
+ instrux + 3775,
+ instrux + 3777,
+ instrux + 3779,
+ instrux + 3781,
+};
+
+static const struct itemplate * const itable_vex02193[] = {
+ instrux + 3776,
+ instrux + 3778,
+ instrux + 3780,
+ instrux + 3782,
+};
+
+static const struct itemplate * const itable_vex02196[] = {
+ instrux + 2998,
+ instrux + 2999,
+ instrux + 3000,
+ instrux + 3001,
+ instrux + 3002,
+ instrux + 3003,
+ instrux + 3004,
+ instrux + 3005,
+};
+
+static const struct itemplate * const itable_vex02197[] = {
+ instrux + 3046,
+ instrux + 3047,
+ instrux + 3048,
+ instrux + 3049,
+ instrux + 3050,
+ instrux + 3051,
+ instrux + 3052,
+ instrux + 3053,
+};
+
+static const struct itemplate * const itable_vex02198[] = {
+ instrux + 2974,
+ instrux + 2975,
+ instrux + 2976,
+ instrux + 2977,
+ instrux + 2978,
+ instrux + 2979,
+ instrux + 2980,
+ instrux + 2981,
+};
+
+static const struct itemplate * const itable_vex02199[] = {
+ instrux + 3118,
+ instrux + 3119,
+ instrux + 3120,
+ instrux + 3121,
+};
+
+static const struct itemplate * const itable_vex0219A[] = {
+ instrux + 3022,
+ instrux + 3023,
+ instrux + 3024,
+ instrux + 3025,
+ instrux + 3026,
+ instrux + 3027,
+ instrux + 3028,
+ instrux + 3029,
+};
+
+static const struct itemplate * const itable_vex0219B[] = {
+ instrux + 3130,
+ instrux + 3131,
+ instrux + 3132,
+ instrux + 3133,
+};
+
+static const struct itemplate * const itable_vex0219C[] = {
+ instrux + 3070,
+ instrux + 3071,
+ instrux + 3072,
+ instrux + 3073,
+ instrux + 3074,
+ instrux + 3075,
+ instrux + 3076,
+ instrux + 3077,
+};
+
+static const struct itemplate * const itable_vex0219D[] = {
+ instrux + 3142,
+ instrux + 3143,
+ instrux + 3144,
+ instrux + 3145,
+};
+
+static const struct itemplate * const itable_vex0219E[] = {
+ instrux + 3094,
+ instrux + 3095,
+ instrux + 3096,
+ instrux + 3097,
+ instrux + 3098,
+ instrux + 3099,
+ instrux + 3100,
+ instrux + 3101,
+};
+
+static const struct itemplate * const itable_vex0219F[] = {
+ instrux + 3154,
+ instrux + 3155,
+ instrux + 3156,
+ instrux + 3157,
+};
+
+static const struct itemplate * const itable_vex021A6[] = {
+ instrux + 3006,
+ instrux + 3007,
+ instrux + 3008,
+ instrux + 3009,
+ instrux + 3010,
+ instrux + 3011,
+ instrux + 3012,
+ instrux + 3013,
+};
+
+static const struct itemplate * const itable_vex021A7[] = {
+ instrux + 3054,
+ instrux + 3055,
+ instrux + 3056,
+ instrux + 3057,
+ instrux + 3058,
+ instrux + 3059,
+ instrux + 3060,
+ instrux + 3061,
+};
+
+static const struct itemplate * const itable_vex021A8[] = {
+ instrux + 2982,
+ instrux + 2983,
+ instrux + 2984,
+ instrux + 2985,
+ instrux + 2986,
+ instrux + 2987,
+ instrux + 2988,
+ instrux + 2989,
+};
+
+static const struct itemplate * const itable_vex021A9[] = {
+ instrux + 3122,
+ instrux + 3123,
+ instrux + 3124,
+ instrux + 3125,
+};
+
+static const struct itemplate * const itable_vex021AA[] = {
+ instrux + 3030,
+ instrux + 3031,
+ instrux + 3032,
+ instrux + 3033,
+ instrux + 3034,
+ instrux + 3035,
+ instrux + 3036,
+ instrux + 3037,
+};
+
+static const struct itemplate * const itable_vex021AB[] = {
+ instrux + 3134,
+ instrux + 3135,
+ instrux + 3136,
+ instrux + 3137,
+};
+
+static const struct itemplate * const itable_vex021AC[] = {
+ instrux + 3078,
+ instrux + 3079,
+ instrux + 3080,
+ instrux + 3081,
+ instrux + 3082,
+ instrux + 3083,
+ instrux + 3084,
+ instrux + 3085,
+};
+
+static const struct itemplate * const itable_vex021AD[] = {
+ instrux + 3146,
+ instrux + 3147,
+ instrux + 3148,
+ instrux + 3149,
+};
+
+static const struct itemplate * const itable_vex021AE[] = {
+ instrux + 3102,
+ instrux + 3103,
+ instrux + 3104,
+ instrux + 3105,
+ instrux + 3106,
+ instrux + 3107,
+ instrux + 3108,
+ instrux + 3109,
+};
+
+static const struct itemplate * const itable_vex021AF[] = {
+ instrux + 3158,
+ instrux + 3159,
+ instrux + 3160,
+ instrux + 3161,
+};
+
+static const struct itemplate * const itable_vex021B6[] = {
+ instrux + 3014,
+ instrux + 3015,
+ instrux + 3016,
+ instrux + 3017,
+ instrux + 3018,
+ instrux + 3019,
+ instrux + 3020,
+ instrux + 3021,
+};
+
+static const struct itemplate * const itable_vex021B7[] = {
+ instrux + 3062,
+ instrux + 3063,
+ instrux + 3064,
+ instrux + 3065,
+ instrux + 3066,
+ instrux + 3067,
+ instrux + 3068,
+ instrux + 3069,
+};
+
+static const struct itemplate * const itable_vex021B8[] = {
+ instrux + 2990,
+ instrux + 2991,
+ instrux + 2992,
+ instrux + 2993,
+ instrux + 2994,
+ instrux + 2995,
+ instrux + 2996,
+ instrux + 2997,
+};
+
+static const struct itemplate * const itable_vex021B9[] = {
+ instrux + 3126,
+ instrux + 3127,
+ instrux + 3128,
+ instrux + 3129,
+};
+
+static const struct itemplate * const itable_vex021BA[] = {
+ instrux + 3038,
+ instrux + 3039,
+ instrux + 3040,
+ instrux + 3041,
+ instrux + 3042,
+ instrux + 3043,
+ instrux + 3044,
+ instrux + 3045,
+};
+
+static const struct itemplate * const itable_vex021BB[] = {
+ instrux + 3138,
+ instrux + 3139,
+ instrux + 3140,
+ instrux + 3141,
+};
+
+static const struct itemplate * const itable_vex021BC[] = {
+ instrux + 3086,
+ instrux + 3087,
+ instrux + 3088,
+ instrux + 3089,
+ instrux + 3090,
+ instrux + 3091,
+ instrux + 3092,
+ instrux + 3093,
+};
+
+static const struct itemplate * const itable_vex021BD[] = {
+ instrux + 3150,
+ instrux + 3151,
+ instrux + 3152,
+ instrux + 3153,
+};
+
+static const struct itemplate * const itable_vex021BE[] = {
+ instrux + 3110,
+ instrux + 3111,
+ instrux + 3112,
+ instrux + 3113,
+ instrux + 3114,
+ instrux + 3115,
+ instrux + 3116,
+ instrux + 3117,
+};
+
+static const struct itemplate * const itable_vex021BF[] = {
+ instrux + 3162,
+ instrux + 3163,
+ instrux + 3164,
+ instrux + 3165,
+};
+
+static const struct itemplate * const itable_vex021CF[] = {
+ instrux + 6011,
+ instrux + 6012,
+ instrux + 6013,
+ instrux + 6014,
+};
+
+static const struct itemplate * const itable_vex021DB[] = {
+ instrux + 1699,
+};
+
+static const struct itemplate * const itable_vex021DC[] = {
+ instrux + 1691,
+ instrux + 1692,
+ instrux + 1701,
+ instrux + 1702,
+};
+
+static const struct itemplate * const itable_vex021DD[] = {
+ instrux + 1693,
+ instrux + 1694,
+ instrux + 1703,
+ instrux + 1704,
+};
+
+static const struct itemplate * const itable_vex021DE[] = {
+ instrux + 1695,
+ instrux + 1696,
+ instrux + 1705,
+ instrux + 1706,
+};
+
+static const struct itemplate * const itable_vex021DF[] = {
+ instrux + 1697,
+ instrux + 1698,
+ instrux + 1707,
+ instrux + 1708,
+};
+
+static const struct itemplate * const itable_vex021F7[] = {
+ instrux + 3837,
+ instrux + 3838,
+};
+
+static const struct itemplate * const itable_vex022F5[] = {
+ instrux + 3831,
+ instrux + 3832,
+};
+
+static const struct itemplate * const itable_vex022F7[] = {
+ instrux + 3835,
+ instrux + 3836,
+};
+
+static const struct itemplate * const itable_vex023F5[] = {
+ instrux + 3829,
+ instrux + 3830,
+};
+
+static const struct itemplate * const itable_vex023F6[] = {
+ instrux + 3827,
+ instrux + 3828,
+};
+
+static const struct itemplate * const itable_vex023F7[] = {
+ instrux + 3839,
+ instrux + 3840,
+};
+
+static const struct itemplate * const itable_vex03100[] = {
+ instrux + 3733,
+};
+
+static const struct itemplate * const itable_vex03101[] = {
+ instrux + 3730,
+};
+
+static const struct itemplate * const itable_vex03102[] = {
+ instrux + 3708,
+ instrux + 3709,
+ instrux + 3710,
+ instrux + 3711,
+};
+
+static const struct itemplate * const itable_vex03104[] = {
+ instrux + 2651,
+ instrux + 2652,
+};
+
+static const struct itemplate * const itable_vex03105[] = {
+ instrux + 2645,
+ instrux + 2646,
+};
+
+static const struct itemplate * const itable_vex03106[] = {
+ instrux + 2653,
+ instrux + 2654,
+};
+
+static const struct itemplate * const itable_vex03108[] = {
+ instrux + 2852,
+ instrux + 2853,
+};
+
+static const struct itemplate * const itable_vex03109[] = {
+ instrux + 2850,
+ instrux + 2851,
+};
+
+static const struct itemplate * const itable_vex0310A[] = {
+ instrux + 2856,
+ instrux + 2857,
+};
+
+static const struct itemplate * const itable_vex0310B[] = {
+ instrux + 2854,
+ instrux + 2855,
+};
+
+static const struct itemplate * const itable_vex0310C[] = {
+ instrux + 1773,
+ instrux + 1774,
+ instrux + 1775,
+ instrux + 1776,
+};
+
+static const struct itemplate * const itable_vex0310D[] = {
+ instrux + 1769,
+ instrux + 1770,
+ instrux + 1771,
+ instrux + 1772,
+};
+
+static const struct itemplate * const itable_vex0310E[] = {
+ instrux + 2619,
+ instrux + 2620,
+ instrux + 3526,
+ instrux + 3527,
+};
+
+static const struct itemplate * const itable_vex0310F[] = {
+ instrux + 2607,
+ instrux + 2608,
+ instrux + 3514,
+ instrux + 3515,
+};
+
+static const struct itemplate * const itable_vex03114[] = {
+ instrux + 2655,
+ instrux + 2656,
+ instrux + 2657,
+};
+
+static const struct itemplate * const itable_vex03115[] = {
+ instrux + 2660,
+ instrux + 2661,
+ instrux + 2662,
+};
+
+static const struct itemplate * const itable_vex03116[] = {
+ instrux + 2663,
+ instrux + 2664,
+ instrux + 2665,
+};
+
+static const struct itemplate * const itable_vex03117[] = {
+ instrux + 2416,
+};
+
+static const struct itemplate * const itable_vex03118[] = {
+ instrux + 2433,
+ instrux + 2434,
+};
+
+static const struct itemplate * const itable_vex03119[] = {
+ instrux + 2415,
+};
+
+static const struct itemplate * const itable_vex0311D[] = {
+ instrux + 3179,
+ instrux + 3180,
+};
+
+static const struct itemplate * const itable_vex03120[] = {
+ instrux + 2679,
+ instrux + 2680,
+ instrux + 2681,
+ instrux + 2682,
+ instrux + 2683,
+ instrux + 2684,
+};
+
+static const struct itemplate * const itable_vex03121[] = {
+ instrux + 2435,
+ instrux + 2436,
+};
+
+static const struct itemplate * const itable_vex03122[] = {
+ instrux + 2691,
+ instrux + 2692,
+ instrux + 2693,
+ instrux + 2694,
+ instrux + 2695,
+ instrux + 2696,
+ instrux + 2697,
+ instrux + 2698,
+};
+
+static const struct itemplate * const itable_vex03130[] = {
+ instrux + 3923,
+ instrux + 3926,
+};
+
+static const struct itemplate * const itable_vex03131[] = {
+ instrux + 3924,
+ instrux + 3925,
+};
+
+static const struct itemplate * const itable_vex03132[] = {
+ instrux + 3919,
+ instrux + 3922,
+};
+
+static const struct itemplate * const itable_vex03133[] = {
+ instrux + 3920,
+ instrux + 3921,
+};
+
+static const struct itemplate * const itable_vex03138[] = {
+ instrux + 3737,
+ instrux + 3738,
+};
+
+static const struct itemplate * const itable_vex03139[] = {
+ instrux + 3736,
+};
+
+static const struct itemplate * const itable_vex03140[] = {
+ instrux + 2411,
+ instrux + 2412,
+ instrux + 2413,
+ instrux + 2414,
+};
+
+static const struct itemplate * const itable_vex03141[] = {
+ instrux + 2409,
+ instrux + 2410,
+};
+
+static const struct itemplate * const itable_vex03142[] = {
+ instrux + 2558,
+ instrux + 2559,
+ instrux + 3485,
+ instrux + 3486,
+};
+
+static const struct itemplate * const itable_vex03144[] = {
+ instrux + 2924,
+ instrux + 2925,
+ instrux + 2926,
+ instrux + 2927,
+ instrux + 2928,
+ instrux + 2929,
+ instrux + 2930,
+ instrux + 2931,
+ instrux + 2932,
+ instrux + 2933,
+ instrux + 2934,
+ instrux + 2935,
+ instrux + 2936,
+ instrux + 2937,
+ instrux + 2938,
+ instrux + 2939,
+ instrux + 2940,
+ instrux + 2941,
+ instrux + 2942,
+ instrux + 2943,
+};
+
+static const struct itemplate * const itable_vex03146[] = {
+ instrux + 3734,
+ instrux + 3735,
+};
+
+static const struct itemplate * const itable_vex0314A[] = {
+ instrux + 1781,
+ instrux + 1782,
+ instrux + 1783,
+ instrux + 1784,
+};
+
+static const struct itemplate * const itable_vex0314B[] = {
+ instrux + 1777,
+ instrux + 1778,
+ instrux + 1779,
+ instrux + 1780,
+};
+
+static const struct itemplate * const itable_vex0314C[] = {
+ instrux + 2617,
+ instrux + 2618,
+ instrux + 3524,
+ instrux + 3525,
+};
+
+static const struct itemplate * const itable_vex0315C[] = {
+ instrux + 3239,
+ instrux + 3240,
+ instrux + 3241,
+ instrux + 3242,
+ instrux + 3243,
+ instrux + 3244,
+ instrux + 3245,
+ instrux + 3246,
+};
+
+static const struct itemplate * const itable_vex0315D[] = {
+ instrux + 3231,
+ instrux + 3232,
+ instrux + 3233,
+ instrux + 3234,
+ instrux + 3235,
+ instrux + 3236,
+ instrux + 3237,
+ instrux + 3238,
+};
+
+static const struct itemplate * const itable_vex0315E[] = {
+ instrux + 3255,
+ instrux + 3256,
+ instrux + 3257,
+ instrux + 3258,
+ instrux + 3259,
+ instrux + 3260,
+ instrux + 3261,
+ instrux + 3262,
+};
+
+static const struct itemplate * const itable_vex0315F[] = {
+ instrux + 3247,
+ instrux + 3248,
+ instrux + 3249,
+ instrux + 3250,
+ instrux + 3251,
+ instrux + 3252,
+ instrux + 3253,
+ instrux + 3254,
+};
+
+static const struct itemplate * const itable_vex03160[] = {
+ instrux + 2622,
+};
+
+static const struct itemplate * const itable_vex03161[] = {
+ instrux + 2621,
+};
+
+static const struct itemplate * const itable_vex03162[] = {
+ instrux + 2624,
+};
+
+static const struct itemplate * const itable_vex03163[] = {
+ instrux + 2623,
+};
+
+static const struct itemplate * const itable_vex03168[] = {
+ instrux + 3215,
+ instrux + 3216,
+ instrux + 3217,
+ instrux + 3218,
+ instrux + 3219,
+ instrux + 3220,
+ instrux + 3221,
+ instrux + 3222,
+};
+
+static const struct itemplate * const itable_vex03169[] = {
+ instrux + 3207,
+ instrux + 3208,
+ instrux + 3209,
+ instrux + 3210,
+ instrux + 3211,
+ instrux + 3212,
+ instrux + 3213,
+ instrux + 3214,
+};
+
+static const struct itemplate * const itable_vex0316A[] = {
+ instrux + 3227,
+ instrux + 3228,
+ instrux + 3229,
+ instrux + 3230,
+};
+
+static const struct itemplate * const itable_vex0316B[] = {
+ instrux + 3223,
+ instrux + 3224,
+ instrux + 3225,
+ instrux + 3226,
+};
+
+static const struct itemplate * const itable_vex0316C[] = {
+ instrux + 3271,
+ instrux + 3272,
+ instrux + 3273,
+ instrux + 3274,
+ instrux + 3275,
+ instrux + 3276,
+ instrux + 3277,
+ instrux + 3278,
+};
+
+static const struct itemplate * const itable_vex0316D[] = {
+ instrux + 3263,
+ instrux + 3264,
+ instrux + 3265,
+ instrux + 3266,
+ instrux + 3267,
+ instrux + 3268,
+ instrux + 3269,
+ instrux + 3270,
+};
+
+static const struct itemplate * const itable_vex0316E[] = {
+ instrux + 3283,
+ instrux + 3284,
+ instrux + 3285,
+ instrux + 3286,
+};
+
+static const struct itemplate * const itable_vex0316F[] = {
+ instrux + 3279,
+ instrux + 3280,
+ instrux + 3281,
+ instrux + 3282,
+};
+
+static const struct itemplate * const itable_vex03178[] = {
+ instrux + 3295,
+ instrux + 3296,
+ instrux + 3297,
+ instrux + 3298,
+ instrux + 3299,
+ instrux + 3300,
+ instrux + 3301,
+ instrux + 3302,
+};
+
+static const struct itemplate * const itable_vex03179[] = {
+ instrux + 3287,
+ instrux + 3288,
+ instrux + 3289,
+ instrux + 3290,
+ instrux + 3291,
+ instrux + 3292,
+ instrux + 3293,
+ instrux + 3294,
+};
+
+static const struct itemplate * const itable_vex0317A[] = {
+ instrux + 3307,
+ instrux + 3308,
+ instrux + 3309,
+ instrux + 3310,
+};
+
+static const struct itemplate * const itable_vex0317B[] = {
+ instrux + 3303,
+ instrux + 3304,
+ instrux + 3305,
+ instrux + 3306,
+};
+
+static const struct itemplate * const itable_vex0317C[] = {
+ instrux + 3319,
+ instrux + 3320,
+ instrux + 3321,
+ instrux + 3322,
+ instrux + 3323,
+ instrux + 3324,
+ instrux + 3325,
+ instrux + 3326,
+};
+
+static const struct itemplate * const itable_vex0317D[] = {
+ instrux + 3311,
+ instrux + 3312,
+ instrux + 3313,
+ instrux + 3314,
+ instrux + 3315,
+ instrux + 3316,
+ instrux + 3317,
+ instrux + 3318,
+};
+
+static const struct itemplate * const itable_vex0317E[] = {
+ instrux + 3331,
+ instrux + 3332,
+ instrux + 3333,
+ instrux + 3334,
+};
+
+static const struct itemplate * const itable_vex0317F[] = {
+ instrux + 3327,
+ instrux + 3328,
+ instrux + 3329,
+ instrux + 3330,
+};
+
+static const struct itemplate * const itable_vex031CE[] = {
+ instrux + 6000,
+ instrux + 6001,
+ instrux + 6002,
+ instrux + 6003,
+};
+
+static const struct itemplate * const itable_vex031CF[] = {
+ instrux + 5989,
+ instrux + 5990,
+ instrux + 5991,
+ instrux + 5992,
+};
+
+static const struct itemplate * const itable_vex031DF[] = {
+ instrux + 1700,
+};
+
+static const struct itemplate * const itable_vex033F0[] = {
+ instrux + 3833,
+ instrux + 3834,
+};
+
+static const struct itemplate * const itable_xop08085[] = {
+ instrux + 3415,
+ instrux + 3416,
+};
+
+static const struct itemplate * const itable_xop08086[] = {
+ instrux + 3413,
+ instrux + 3414,
+};
+
+static const struct itemplate * const itable_xop08087[] = {
+ instrux + 3411,
+ instrux + 3412,
+};
+
+static const struct itemplate * const itable_xop0808E[] = {
+ instrux + 3407,
+ instrux + 3408,
+};
+
+static const struct itemplate * const itable_xop0808F[] = {
+ instrux + 3409,
+ instrux + 3410,
+};
+
+static const struct itemplate * const itable_xop08095[] = {
+ instrux + 3419,
+ instrux + 3420,
+};
+
+static const struct itemplate * const itable_xop08096[] = {
+ instrux + 3417,
+ instrux + 3418,
+};
+
+static const struct itemplate * const itable_xop08097[] = {
+ instrux + 3405,
+ instrux + 3406,
+};
+
+static const struct itemplate * const itable_xop0809E[] = {
+ instrux + 3401,
+ instrux + 3402,
+};
+
+static const struct itemplate * const itable_xop0809F[] = {
+ instrux + 3403,
+ instrux + 3404,
+};
+
+static const struct itemplate * const itable_xop080A2[] = {
+ instrux + 3347,
+ instrux + 3348,
+ instrux + 3349,
+ instrux + 3350,
+ instrux + 3351,
+ instrux + 3352,
+ instrux + 3353,
+ instrux + 3354,
+};
+
+static const struct itemplate * const itable_xop080A3[] = {
+ instrux + 3425,
+ instrux + 3426,
+ instrux + 3427,
+ instrux + 3428,
+};
+
+static const struct itemplate * const itable_xop080A6[] = {
+ instrux + 3421,
+ instrux + 3422,
+};
+
+static const struct itemplate * const itable_xop080B6[] = {
+ instrux + 3423,
+ instrux + 3424,
+};
+
+static const struct itemplate * const itable_xop080C0[] = {
+ instrux + 3433,
+ instrux + 3434,
+};
+
+static const struct itemplate * const itable_xop080C1[] = {
+ instrux + 3451,
+ instrux + 3452,
+};
+
+static const struct itemplate * const itable_xop080C2[] = {
+ instrux + 3439,
+ instrux + 3440,
+};
+
+static const struct itemplate * const itable_xop080C3[] = {
+ instrux + 3445,
+ instrux + 3446,
+};
+
+static const struct itemplate * const itable_xop080CC[] = {
+ instrux + 3355,
+ instrux + 3356,
+};
+
+static const struct itemplate * const itable_xop080CD[] = {
+ instrux + 3369,
+ instrux + 3370,
+};
+
+static const struct itemplate * const itable_xop080CE[] = {
+ instrux + 3357,
+ instrux + 3358,
+};
+
+static const struct itemplate * const itable_xop080CF[] = {
+ instrux + 3359,
+ instrux + 3360,
+};
+
+static const struct itemplate * const itable_xop080EC[] = {
+ instrux + 3361,
+ instrux + 3362,
+};
+
+static const struct itemplate * const itable_xop080ED[] = {
+ instrux + 3367,
+ instrux + 3368,
+};
+
+static const struct itemplate * const itable_xop080EE[] = {
+ instrux + 3363,
+ instrux + 3364,
+};
+
+static const struct itemplate * const itable_xop080EF[] = {
+ instrux + 3365,
+ instrux + 3366,
+};
+
+static const struct itemplate * const itable_xop09001[] = {
+ instrux + 3807,
+ instrux + 3808,
+ instrux + 3811,
+ instrux + 3812,
+ instrux + 3813,
+ instrux + 3814,
+ instrux + 3815,
+ instrux + 3816,
+ instrux + 3823,
+ instrux + 3824,
+ instrux + 3844,
+ instrux + 3845,
+ instrux + 3846,
+ instrux + 3847,
+};
+
+static const struct itemplate * const itable_xop09002[] = {
+ instrux + 3805,
+ instrux + 3806,
+ instrux + 3817,
+ instrux + 3818,
+};
+
+static const struct itemplate * const itable_xop09012[] = {
+ instrux + 3199,
+ instrux + 3200,
+ instrux + 3201,
+ instrux + 3202,
+};
+
+static const struct itemplate * const itable_xop09080[] = {
+ instrux + 3339,
+ instrux + 3340,
+ instrux + 3341,
+ instrux + 3342,
+};
+
+static const struct itemplate * const itable_xop09081[] = {
+ instrux + 3335,
+ instrux + 3336,
+ instrux + 3337,
+ instrux + 3338,
+};
+
+static const struct itemplate * const itable_xop09082[] = {
+ instrux + 3345,
+ instrux + 3346,
+};
+
+static const struct itemplate * const itable_xop09083[] = {
+ instrux + 3343,
+ instrux + 3344,
+};
+
+static const struct itemplate * const itable_xop09090[] = {
+ instrux + 3429,
+ instrux + 3430,
+ instrux + 3431,
+ instrux + 3432,
+};
+
+static const struct itemplate * const itable_xop09091[] = {
+ instrux + 3447,
+ instrux + 3448,
+ instrux + 3449,
+ instrux + 3450,
+};
+
+static const struct itemplate * const itable_xop09092[] = {
+ instrux + 3435,
+ instrux + 3436,
+ instrux + 3437,
+ instrux + 3438,
+};
+
+static const struct itemplate * const itable_xop09093[] = {
+ instrux + 3441,
+ instrux + 3442,
+ instrux + 3443,
+ instrux + 3444,
+};
+
+static const struct itemplate * const itable_xop09094[] = {
+ instrux + 3469,
+ instrux + 3470,
+ instrux + 3471,
+ instrux + 3472,
+};
+
+static const struct itemplate * const itable_xop09095[] = {
+ instrux + 3481,
+ instrux + 3482,
+ instrux + 3483,
+ instrux + 3484,
+};
+
+static const struct itemplate * const itable_xop09096[] = {
+ instrux + 3473,
+ instrux + 3474,
+ instrux + 3475,
+ instrux + 3476,
+};
+
+static const struct itemplate * const itable_xop09097[] = {
+ instrux + 3477,
+ instrux + 3478,
+ instrux + 3479,
+ instrux + 3480,
+};
+
+static const struct itemplate * const itable_xop09098[] = {
+ instrux + 3453,
+ instrux + 3454,
+ instrux + 3455,
+ instrux + 3456,
+};
+
+static const struct itemplate * const itable_xop09099[] = {
+ instrux + 3465,
+ instrux + 3466,
+ instrux + 3467,
+ instrux + 3468,
+};
+
+static const struct itemplate * const itable_xop0909A[] = {
+ instrux + 3457,
+ instrux + 3458,
+ instrux + 3459,
+ instrux + 3460,
+};
+
+static const struct itemplate * const itable_xop0909B[] = {
+ instrux + 3461,
+ instrux + 3462,
+ instrux + 3463,
+ instrux + 3464,
+};
+
+static const struct itemplate * const itable_xop090C1[] = {
+ instrux + 3375,
+ instrux + 3376,
+};
+
+static const struct itemplate * const itable_xop090C2[] = {
+ instrux + 3371,
+ instrux + 3372,
+};
+
+static const struct itemplate * const itable_xop090C3[] = {
+ instrux + 3373,
+ instrux + 3374,
+};
+
+static const struct itemplate * const itable_xop090C6[] = {
+ instrux + 3391,
+ instrux + 3392,
+};
+
+static const struct itemplate * const itable_xop090C7[] = {
+ instrux + 3393,
+ instrux + 3394,
+};
+
+static const struct itemplate * const itable_xop090CB[] = {
+ instrux + 3377,
+ instrux + 3378,
+};
+
+static const struct itemplate * const itable_xop090D1[] = {
+ instrux + 3383,
+ instrux + 3384,
+};
+
+static const struct itemplate * const itable_xop090D2[] = {
+ instrux + 3379,
+ instrux + 3380,
+};
+
+static const struct itemplate * const itable_xop090D3[] = {
+ instrux + 3381,
+ instrux + 3382,
+};
+
+static const struct itemplate * const itable_xop090D6[] = {
+ instrux + 3387,
+ instrux + 3388,
+};
+
+static const struct itemplate * const itable_xop090D7[] = {
+ instrux + 3389,
+ instrux + 3390,
+};
+
+static const struct itemplate * const itable_xop090DB[] = {
+ instrux + 3385,
+ instrux + 3386,
+};
+
+static const struct itemplate * const itable_xop090E1[] = {
+ instrux + 3395,
+ instrux + 3396,
+};
+
+static const struct itemplate * const itable_xop090E2[] = {
+ instrux + 3399,
+ instrux + 3400,
+};
+
+static const struct itemplate * const itable_xop090E3[] = {
+ instrux + 3397,
+ instrux + 3398,
+};
+
+static const struct itemplate * const itable_xop0A010[] = {
+ instrux + 3803,
+ instrux + 3804,
+};
+
+static const struct itemplate * const itable_xop0A012[] = {
+ instrux + 3203,
+ instrux + 3204,
+ instrux + 3205,
+ instrux + 3206,
+};
+
+static const struct disasm_index itable_vex010[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_vex01010, 2 },
+ /* 0x11 */ { itable_vex01011, 2 },
+ /* 0x12 */ { itable_vex01012, 4 },
+ /* 0x13 */ { itable_vex01013, 1 },
+ /* 0x14 */ { itable_vex01014, 4 },
+ /* 0x15 */ { itable_vex01015, 4 },
+ /* 0x16 */ { itable_vex01016, 4 },
+ /* 0x17 */ { itable_vex01017, 1 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_vex01028, 2 },
+ /* 0x29 */ { itable_vex01029, 2 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { itable_vex0102B, 2 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { itable_vex0102E, 1 },
+ /* 0x2f */ { itable_vex0102F, 1 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { itable_vex01041, 2 },
+ /* 0x42 */ { itable_vex01042, 2 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { itable_vex01044, 2 },
+ /* 0x45 */ { itable_vex01045, 2 },
+ /* 0x46 */ { itable_vex01046, 2 },
+ /* 0x47 */ { itable_vex01047, 2 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { itable_vex0104A, 2 },
+ /* 0x4b */ { itable_vex0104B, 2 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { itable_vex01050, 4 },
+ /* 0x51 */ { itable_vex01051, 2 },
+ /* 0x52 */ { itable_vex01052, 2 },
+ /* 0x53 */ { itable_vex01053, 2 },
+ /* 0x54 */ { itable_vex01054, 4 },
+ /* 0x55 */ { itable_vex01055, 4 },
+ /* 0x56 */ { itable_vex01056, 4 },
+ /* 0x57 */ { itable_vex01057, 4 },
+ /* 0x58 */ { itable_vex01058, 4 },
+ /* 0x59 */ { itable_vex01059, 4 },
+ /* 0x5a */ { itable_vex0105A, 2 },
+ /* 0x5b */ { itable_vex0105B, 2 },
+ /* 0x5c */ { itable_vex0105C, 4 },
+ /* 0x5d */ { itable_vex0105D, 4 },
+ /* 0x5e */ { itable_vex0105E, 4 },
+ /* 0x5f */ { itable_vex0105F, 4 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { itable_vex01077, 2 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { itable_vex01090, 2 },
+ /* 0x91 */ { itable_vex01091, 2 },
+ /* 0x92 */ { itable_vex01092, 1 },
+ /* 0x93 */ { itable_vex01093, 1 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { itable_vex01098, 2 },
+ /* 0x99 */ { itable_vex01099, 2 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { itable_vex010AE, 2 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_vex010C2, 188 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { itable_vex010C6, 4 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex011[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_vex01110, 2 },
+ /* 0x11 */ { itable_vex01111, 2 },
+ /* 0x12 */ { itable_vex01112, 2 },
+ /* 0x13 */ { itable_vex01113, 1 },
+ /* 0x14 */ { itable_vex01114, 4 },
+ /* 0x15 */ { itable_vex01115, 4 },
+ /* 0x16 */ { itable_vex01116, 2 },
+ /* 0x17 */ { itable_vex01117, 1 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_vex01128, 2 },
+ /* 0x29 */ { itable_vex01129, 2 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { itable_vex0112B, 2 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { itable_vex0112E, 1 },
+ /* 0x2f */ { itable_vex0112F, 1 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { itable_vex01141, 2 },
+ /* 0x42 */ { itable_vex01142, 2 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { itable_vex01144, 2 },
+ /* 0x45 */ { itable_vex01145, 2 },
+ /* 0x46 */ { itable_vex01146, 2 },
+ /* 0x47 */ { itable_vex01147, 2 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { itable_vex0114A, 2 },
+ /* 0x4b */ { itable_vex0114B, 1 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { itable_vex01150, 4 },
+ /* 0x51 */ { itable_vex01151, 2 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { itable_vex01154, 4 },
+ /* 0x55 */ { itable_vex01155, 4 },
+ /* 0x56 */ { itable_vex01156, 4 },
+ /* 0x57 */ { itable_vex01157, 4 },
+ /* 0x58 */ { itable_vex01158, 4 },
+ /* 0x59 */ { itable_vex01159, 4 },
+ /* 0x5a */ { itable_vex0115A, 4 },
+ /* 0x5b */ { itable_vex0115B, 2 },
+ /* 0x5c */ { itable_vex0115C, 4 },
+ /* 0x5d */ { itable_vex0115D, 4 },
+ /* 0x5e */ { itable_vex0115E, 4 },
+ /* 0x5f */ { itable_vex0115F, 4 },
+ /* 0x60 */ { itable_vex01160, 4 },
+ /* 0x61 */ { itable_vex01161, 4 },
+ /* 0x62 */ { itable_vex01162, 4 },
+ /* 0x63 */ { itable_vex01163, 4 },
+ /* 0x64 */ { itable_vex01164, 4 },
+ /* 0x65 */ { itable_vex01165, 4 },
+ /* 0x66 */ { itable_vex01166, 4 },
+ /* 0x67 */ { itable_vex01167, 4 },
+ /* 0x68 */ { itable_vex01168, 4 },
+ /* 0x69 */ { itable_vex01169, 4 },
+ /* 0x6a */ { itable_vex0116A, 4 },
+ /* 0x6b */ { itable_vex0116B, 4 },
+ /* 0x6c */ { itable_vex0116C, 4 },
+ /* 0x6d */ { itable_vex0116D, 4 },
+ /* 0x6e */ { itable_vex0116E, 2 },
+ /* 0x6f */ { itable_vex0116F, 3 },
+ /* 0x70 */ { itable_vex01170, 2 },
+ /* 0x71 */ { itable_vex01171, 12 },
+ /* 0x72 */ { itable_vex01172, 12 },
+ /* 0x73 */ { itable_vex01173, 16 },
+ /* 0x74 */ { itable_vex01174, 4 },
+ /* 0x75 */ { itable_vex01175, 4 },
+ /* 0x76 */ { itable_vex01176, 4 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { itable_vex0117C, 4 },
+ /* 0x7d */ { itable_vex0117D, 4 },
+ /* 0x7e */ { itable_vex0117E, 2 },
+ /* 0x7f */ { itable_vex0117F, 3 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { itable_vex01190, 2 },
+ /* 0x91 */ { itable_vex01191, 2 },
+ /* 0x92 */ { itable_vex01192, 1 },
+ /* 0x93 */ { itable_vex01193, 1 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { itable_vex01198, 2 },
+ /* 0x99 */ { itable_vex01199, 2 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_vex011C2, 188 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { itable_vex011C4, 6 },
+ /* 0xc5 */ { itable_vex011C5, 2 },
+ /* 0xc6 */ { itable_vex011C6, 4 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { itable_vex011D0, 4 },
+ /* 0xd1 */ { itable_vex011D1, 4 },
+ /* 0xd2 */ { itable_vex011D2, 4 },
+ /* 0xd3 */ { itable_vex011D3, 4 },
+ /* 0xd4 */ { itable_vex011D4, 4 },
+ /* 0xd5 */ { itable_vex011D5, 4 },
+ /* 0xd6 */ { itable_vex011D6, 1 },
+ /* 0xd7 */ { itable_vex011D7, 4 },
+ /* 0xd8 */ { itable_vex011D8, 4 },
+ /* 0xd9 */ { itable_vex011D9, 4 },
+ /* 0xda */ { itable_vex011DA, 4 },
+ /* 0xdb */ { itable_vex011DB, 4 },
+ /* 0xdc */ { itable_vex011DC, 4 },
+ /* 0xdd */ { itable_vex011DD, 4 },
+ /* 0xde */ { itable_vex011DE, 4 },
+ /* 0xdf */ { itable_vex011DF, 4 },
+ /* 0xe0 */ { itable_vex011E0, 4 },
+ /* 0xe1 */ { itable_vex011E1, 4 },
+ /* 0xe2 */ { itable_vex011E2, 4 },
+ /* 0xe3 */ { itable_vex011E3, 4 },
+ /* 0xe4 */ { itable_vex011E4, 4 },
+ /* 0xe5 */ { itable_vex011E5, 4 },
+ /* 0xe6 */ { itable_vex011E6, 4 },
+ /* 0xe7 */ { itable_vex011E7, 3 },
+ /* 0xe8 */ { itable_vex011E8, 4 },
+ /* 0xe9 */ { itable_vex011E9, 4 },
+ /* 0xea */ { itable_vex011EA, 4 },
+ /* 0xeb */ { itable_vex011EB, 4 },
+ /* 0xec */ { itable_vex011EC, 4 },
+ /* 0xed */ { itable_vex011ED, 4 },
+ /* 0xee */ { itable_vex011EE, 4 },
+ /* 0xef */ { itable_vex011EF, 4 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { itable_vex011F1, 4 },
+ /* 0xf2 */ { itable_vex011F2, 4 },
+ /* 0xf3 */ { itable_vex011F3, 4 },
+ /* 0xf4 */ { itable_vex011F4, 4 },
+ /* 0xf5 */ { itable_vex011F5, 4 },
+ /* 0xf6 */ { itable_vex011F6, 4 },
+ /* 0xf7 */ { itable_vex011F7, 1 },
+ /* 0xf8 */ { itable_vex011F8, 4 },
+ /* 0xf9 */ { itable_vex011F9, 4 },
+ /* 0xfa */ { itable_vex011FA, 4 },
+ /* 0xfb */ { itable_vex011FB, 4 },
+ /* 0xfc */ { itable_vex011FC, 4 },
+ /* 0xfd */ { itable_vex011FD, 4 },
+ /* 0xfe */ { itable_vex011FE, 4 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex012[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_vex01210, 3 },
+ /* 0x11 */ { itable_vex01211, 3 },
+ /* 0x12 */ { itable_vex01212, 2 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { itable_vex01216, 2 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { itable_vex0122A, 4 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { itable_vex0122C, 2 },
+ /* 0x2d */ { itable_vex0122D, 2 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_vex01251, 2 },
+ /* 0x52 */ { itable_vex01252, 2 },
+ /* 0x53 */ { itable_vex01253, 2 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_vex01258, 2 },
+ /* 0x59 */ { itable_vex01259, 2 },
+ /* 0x5a */ { itable_vex0125A, 2 },
+ /* 0x5b */ { itable_vex0125B, 2 },
+ /* 0x5c */ { itable_vex0125C, 2 },
+ /* 0x5d */ { itable_vex0125D, 2 },
+ /* 0x5e */ { itable_vex0125E, 2 },
+ /* 0x5f */ { itable_vex0125F, 2 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { itable_vex0126F, 3 },
+ /* 0x70 */ { itable_vex01270, 2 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { itable_vex0127E, 1 },
+ /* 0x7f */ { itable_vex0127F, 3 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_vex012C2, 94 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { itable_vex012E6, 2 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex013[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_vex01310, 3 },
+ /* 0x11 */ { itable_vex01311, 3 },
+ /* 0x12 */ { itable_vex01312, 2 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { itable_vex0132A, 4 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { itable_vex0132C, 2 },
+ /* 0x2d */ { itable_vex0132D, 2 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_vex01351, 2 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_vex01358, 2 },
+ /* 0x59 */ { itable_vex01359, 2 },
+ /* 0x5a */ { itable_vex0135A, 2 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { itable_vex0135C, 2 },
+ /* 0x5d */ { itable_vex0135D, 2 },
+ /* 0x5e */ { itable_vex0135E, 2 },
+ /* 0x5f */ { itable_vex0135F, 2 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { itable_vex01370, 2 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { itable_vex0137C, 4 },
+ /* 0x7d */ { itable_vex0137D, 4 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { itable_vex01392, 2 },
+ /* 0x93 */ { itable_vex01393, 2 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_vex013C2, 94 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { itable_vex013D0, 4 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { itable_vex013E6, 4 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { itable_vex013F0, 3 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex020[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { itable_vex020F2, 2 },
+ /* 0xf3 */ { itable_vex020F3, 6 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { itable_vex020F5, 2 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { itable_vex020F7, 2 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex021[256] = {
+ /* 0x00 */ { itable_vex02100, 4 },
+ /* 0x01 */ { itable_vex02101, 4 },
+ /* 0x02 */ { itable_vex02102, 4 },
+ /* 0x03 */ { itable_vex02103, 4 },
+ /* 0x04 */ { itable_vex02104, 4 },
+ /* 0x05 */ { itable_vex02105, 4 },
+ /* 0x06 */ { itable_vex02106, 4 },
+ /* 0x07 */ { itable_vex02107, 4 },
+ /* 0x08 */ { itable_vex02108, 4 },
+ /* 0x09 */ { itable_vex02109, 4 },
+ /* 0x0a */ { itable_vex0210A, 4 },
+ /* 0x0b */ { itable_vex0210B, 4 },
+ /* 0x0c */ { itable_vex0210C, 4 },
+ /* 0x0d */ { itable_vex0210D, 4 },
+ /* 0x0e */ { itable_vex0210E, 2 },
+ /* 0x0f */ { itable_vex0210F, 2 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { itable_vex02113, 2 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { itable_vex02116, 2 },
+ /* 0x17 */ { itable_vex02117, 2 },
+ /* 0x18 */ { itable_vex02118, 4 },
+ /* 0x19 */ { itable_vex02119, 2 },
+ /* 0x1a */ { itable_vex0211A, 1 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { itable_vex0211C, 2 },
+ /* 0x1d */ { itable_vex0211D, 2 },
+ /* 0x1e */ { itable_vex0211E, 2 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { itable_vex02120, 2 },
+ /* 0x21 */ { itable_vex02121, 3 },
+ /* 0x22 */ { itable_vex02122, 3 },
+ /* 0x23 */ { itable_vex02123, 2 },
+ /* 0x24 */ { itable_vex02124, 3 },
+ /* 0x25 */ { itable_vex02125, 2 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_vex02128, 4 },
+ /* 0x29 */ { itable_vex02129, 4 },
+ /* 0x2a */ { itable_vex0212A, 2 },
+ /* 0x2b */ { itable_vex0212B, 4 },
+ /* 0x2c */ { itable_vex0212C, 2 },
+ /* 0x2d */ { itable_vex0212D, 2 },
+ /* 0x2e */ { itable_vex0212E, 2 },
+ /* 0x2f */ { itable_vex0212F, 2 },
+ /* 0x30 */ { itable_vex02130, 2 },
+ /* 0x31 */ { itable_vex02131, 3 },
+ /* 0x32 */ { itable_vex02132, 3 },
+ /* 0x33 */ { itable_vex02133, 2 },
+ /* 0x34 */ { itable_vex02134, 3 },
+ /* 0x35 */ { itable_vex02135, 2 },
+ /* 0x36 */ { itable_vex02136, 2 },
+ /* 0x37 */ { itable_vex02137, 4 },
+ /* 0x38 */ { itable_vex02138, 4 },
+ /* 0x39 */ { itable_vex02139, 4 },
+ /* 0x3a */ { itable_vex0213A, 4 },
+ /* 0x3b */ { itable_vex0213B, 4 },
+ /* 0x3c */ { itable_vex0213C, 4 },
+ /* 0x3d */ { itable_vex0213D, 4 },
+ /* 0x3e */ { itable_vex0213E, 4 },
+ /* 0x3f */ { itable_vex0213F, 4 },
+ /* 0x40 */ { itable_vex02140, 4 },
+ /* 0x41 */ { itable_vex02141, 1 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { itable_vex02145, 8 },
+ /* 0x46 */ { itable_vex02146, 4 },
+ /* 0x47 */ { itable_vex02147, 8 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_vex02158, 4 },
+ /* 0x59 */ { itable_vex02159, 4 },
+ /* 0x5a */ { itable_vex0215A, 1 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_vex02178, 4 },
+ /* 0x79 */ { itable_vex02179, 4 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { itable_vex0218C, 8 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { itable_vex0218E, 8 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { itable_vex02190, 4 },
+ /* 0x91 */ { itable_vex02191, 4 },
+ /* 0x92 */ { itable_vex02192, 4 },
+ /* 0x93 */ { itable_vex02193, 4 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { itable_vex02196, 8 },
+ /* 0x97 */ { itable_vex02197, 8 },
+ /* 0x98 */ { itable_vex02198, 8 },
+ /* 0x99 */ { itable_vex02199, 4 },
+ /* 0x9a */ { itable_vex0219A, 8 },
+ /* 0x9b */ { itable_vex0219B, 4 },
+ /* 0x9c */ { itable_vex0219C, 8 },
+ /* 0x9d */ { itable_vex0219D, 4 },
+ /* 0x9e */ { itable_vex0219E, 8 },
+ /* 0x9f */ { itable_vex0219F, 4 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { itable_vex021A6, 8 },
+ /* 0xa7 */ { itable_vex021A7, 8 },
+ /* 0xa8 */ { itable_vex021A8, 8 },
+ /* 0xa9 */ { itable_vex021A9, 4 },
+ /* 0xaa */ { itable_vex021AA, 8 },
+ /* 0xab */ { itable_vex021AB, 4 },
+ /* 0xac */ { itable_vex021AC, 8 },
+ /* 0xad */ { itable_vex021AD, 4 },
+ /* 0xae */ { itable_vex021AE, 8 },
+ /* 0xaf */ { itable_vex021AF, 4 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { itable_vex021B6, 8 },
+ /* 0xb7 */ { itable_vex021B7, 8 },
+ /* 0xb8 */ { itable_vex021B8, 8 },
+ /* 0xb9 */ { itable_vex021B9, 4 },
+ /* 0xba */ { itable_vex021BA, 8 },
+ /* 0xbb */ { itable_vex021BB, 4 },
+ /* 0xbc */ { itable_vex021BC, 8 },
+ /* 0xbd */ { itable_vex021BD, 4 },
+ /* 0xbe */ { itable_vex021BE, 8 },
+ /* 0xbf */ { itable_vex021BF, 4 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { itable_vex021CF, 4 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { itable_vex021DB, 1 },
+ /* 0xdc */ { itable_vex021DC, 4 },
+ /* 0xdd */ { itable_vex021DD, 4 },
+ /* 0xde */ { itable_vex021DE, 4 },
+ /* 0xdf */ { itable_vex021DF, 4 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { itable_vex021F7, 2 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex022[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { itable_vex022F5, 2 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { itable_vex022F7, 2 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex023[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { itable_vex023F5, 2 },
+ /* 0xf6 */ { itable_vex023F6, 2 },
+ /* 0xf7 */ { itable_vex023F7, 2 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex031[256] = {
+ /* 0x00 */ { itable_vex03100, 1 },
+ /* 0x01 */ { itable_vex03101, 1 },
+ /* 0x02 */ { itable_vex03102, 4 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { itable_vex03104, 2 },
+ /* 0x05 */ { itable_vex03105, 2 },
+ /* 0x06 */ { itable_vex03106, 2 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { itable_vex03108, 2 },
+ /* 0x09 */ { itable_vex03109, 2 },
+ /* 0x0a */ { itable_vex0310A, 2 },
+ /* 0x0b */ { itable_vex0310B, 2 },
+ /* 0x0c */ { itable_vex0310C, 4 },
+ /* 0x0d */ { itable_vex0310D, 4 },
+ /* 0x0e */ { itable_vex0310E, 4 },
+ /* 0x0f */ { itable_vex0310F, 4 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { itable_vex03114, 3 },
+ /* 0x15 */ { itable_vex03115, 3 },
+ /* 0x16 */ { itable_vex03116, 3 },
+ /* 0x17 */ { itable_vex03117, 1 },
+ /* 0x18 */ { itable_vex03118, 2 },
+ /* 0x19 */ { itable_vex03119, 1 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { itable_vex0311D, 2 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { itable_vex03120, 6 },
+ /* 0x21 */ { itable_vex03121, 2 },
+ /* 0x22 */ { itable_vex03122, 8 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { itable_vex03130, 2 },
+ /* 0x31 */ { itable_vex03131, 2 },
+ /* 0x32 */ { itable_vex03132, 2 },
+ /* 0x33 */ { itable_vex03133, 2 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { itable_vex03138, 2 },
+ /* 0x39 */ { itable_vex03139, 1 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { itable_vex03140, 4 },
+ /* 0x41 */ { itable_vex03141, 2 },
+ /* 0x42 */ { itable_vex03142, 4 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { itable_vex03144, 20 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { itable_vex03146, 2 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { itable_vex0314A, 4 },
+ /* 0x4b */ { itable_vex0314B, 4 },
+ /* 0x4c */ { itable_vex0314C, 4 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { itable_vex0315C, 8 },
+ /* 0x5d */ { itable_vex0315D, 8 },
+ /* 0x5e */ { itable_vex0315E, 8 },
+ /* 0x5f */ { itable_vex0315F, 8 },
+ /* 0x60 */ { itable_vex03160, 1 },
+ /* 0x61 */ { itable_vex03161, 1 },
+ /* 0x62 */ { itable_vex03162, 1 },
+ /* 0x63 */ { itable_vex03163, 1 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { itable_vex03168, 8 },
+ /* 0x69 */ { itable_vex03169, 8 },
+ /* 0x6a */ { itable_vex0316A, 4 },
+ /* 0x6b */ { itable_vex0316B, 4 },
+ /* 0x6c */ { itable_vex0316C, 8 },
+ /* 0x6d */ { itable_vex0316D, 8 },
+ /* 0x6e */ { itable_vex0316E, 4 },
+ /* 0x6f */ { itable_vex0316F, 4 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_vex03178, 8 },
+ /* 0x79 */ { itable_vex03179, 8 },
+ /* 0x7a */ { itable_vex0317A, 4 },
+ /* 0x7b */ { itable_vex0317B, 4 },
+ /* 0x7c */ { itable_vex0317C, 8 },
+ /* 0x7d */ { itable_vex0317D, 8 },
+ /* 0x7e */ { itable_vex0317E, 4 },
+ /* 0x7f */ { itable_vex0317F, 4 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { itable_vex031CE, 4 },
+ /* 0xcf */ { itable_vex031CF, 4 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { itable_vex031DF, 1 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_vex033[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { itable_vex033F0, 2 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_xop080[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { itable_xop08085, 2 },
+ /* 0x86 */ { itable_xop08086, 2 },
+ /* 0x87 */ { itable_xop08087, 2 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { itable_xop0808E, 2 },
+ /* 0x8f */ { itable_xop0808F, 2 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { itable_xop08095, 2 },
+ /* 0x96 */ { itable_xop08096, 2 },
+ /* 0x97 */ { itable_xop08097, 2 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { itable_xop0809E, 2 },
+ /* 0x9f */ { itable_xop0809F, 2 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { itable_xop080A2, 8 },
+ /* 0xa3 */ { itable_xop080A3, 4 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { itable_xop080A6, 2 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { itable_xop080B6, 2 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { itable_xop080C0, 2 },
+ /* 0xc1 */ { itable_xop080C1, 2 },
+ /* 0xc2 */ { itable_xop080C2, 2 },
+ /* 0xc3 */ { itable_xop080C3, 2 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { itable_xop080CC, 2 },
+ /* 0xcd */ { itable_xop080CD, 2 },
+ /* 0xce */ { itable_xop080CE, 2 },
+ /* 0xcf */ { itable_xop080CF, 2 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { itable_xop080EC, 2 },
+ /* 0xed */ { itable_xop080ED, 2 },
+ /* 0xee */ { itable_xop080EE, 2 },
+ /* 0xef */ { itable_xop080EF, 2 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_xop090[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { itable_xop09001, 14 },
+ /* 0x02 */ { itable_xop09002, 4 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { itable_xop09012, 4 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { itable_xop09080, 4 },
+ /* 0x81 */ { itable_xop09081, 4 },
+ /* 0x82 */ { itable_xop09082, 2 },
+ /* 0x83 */ { itable_xop09083, 2 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { itable_xop09090, 4 },
+ /* 0x91 */ { itable_xop09091, 4 },
+ /* 0x92 */ { itable_xop09092, 4 },
+ /* 0x93 */ { itable_xop09093, 4 },
+ /* 0x94 */ { itable_xop09094, 4 },
+ /* 0x95 */ { itable_xop09095, 4 },
+ /* 0x96 */ { itable_xop09096, 4 },
+ /* 0x97 */ { itable_xop09097, 4 },
+ /* 0x98 */ { itable_xop09098, 4 },
+ /* 0x99 */ { itable_xop09099, 4 },
+ /* 0x9a */ { itable_xop0909A, 4 },
+ /* 0x9b */ { itable_xop0909B, 4 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { itable_xop090C1, 2 },
+ /* 0xc2 */ { itable_xop090C2, 2 },
+ /* 0xc3 */ { itable_xop090C3, 2 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { itable_xop090C6, 2 },
+ /* 0xc7 */ { itable_xop090C7, 2 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { itable_xop090CB, 2 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { itable_xop090D1, 2 },
+ /* 0xd2 */ { itable_xop090D2, 2 },
+ /* 0xd3 */ { itable_xop090D3, 2 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { itable_xop090D6, 2 },
+ /* 0xd7 */ { itable_xop090D7, 2 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { itable_xop090DB, 2 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { itable_xop090E1, 2 },
+ /* 0xe2 */ { itable_xop090E2, 2 },
+ /* 0xe3 */ { itable_xop090E3, 2 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_xop0A0[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_xop0A010, 2 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { itable_xop0A012, 4 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex010[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex01010, 3 },
+ /* 0x11 */ { itable_evex01011, 6 },
+ /* 0x12 */ { itable_evex01012, 4 },
+ /* 0x13 */ { itable_evex01013, 1 },
+ /* 0x14 */ { itable_evex01014, 6 },
+ /* 0x15 */ { itable_evex01015, 6 },
+ /* 0x16 */ { itable_evex01016, 4 },
+ /* 0x17 */ { itable_evex01017, 1 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_evex01028, 3 },
+ /* 0x29 */ { itable_evex01029, 6 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { itable_evex0102B, 3 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { itable_evex0102E, 1 },
+ /* 0x2f */ { itable_evex0102F, 1 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_evex01051, 3 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { itable_evex01054, 6 },
+ /* 0x55 */ { itable_evex01055, 6 },
+ /* 0x56 */ { itable_evex01056, 6 },
+ /* 0x57 */ { itable_evex01057, 6 },
+ /* 0x58 */ { itable_evex01058, 6 },
+ /* 0x59 */ { itable_evex01059, 6 },
+ /* 0x5a */ { itable_evex0105A, 3 },
+ /* 0x5b */ { itable_evex0105B, 6 },
+ /* 0x5c */ { itable_evex0105C, 6 },
+ /* 0x5d */ { itable_evex0105D, 6 },
+ /* 0x5e */ { itable_evex0105E, 6 },
+ /* 0x5f */ { itable_evex0105F, 6 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_evex01078, 6 },
+ /* 0x79 */ { itable_evex01079, 6 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_evex010C2, 3 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { itable_evex010C6, 6 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex011[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex01110, 3 },
+ /* 0x11 */ { itable_evex01111, 6 },
+ /* 0x12 */ { itable_evex01112, 2 },
+ /* 0x13 */ { itable_evex01113, 1 },
+ /* 0x14 */ { itable_evex01114, 6 },
+ /* 0x15 */ { itable_evex01115, 6 },
+ /* 0x16 */ { itable_evex01116, 2 },
+ /* 0x17 */ { itable_evex01117, 1 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_evex01128, 3 },
+ /* 0x29 */ { itable_evex01129, 6 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { itable_evex0112B, 3 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { itable_evex0112E, 1 },
+ /* 0x2f */ { itable_evex0112F, 1 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_evex01151, 3 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { itable_evex01154, 6 },
+ /* 0x55 */ { itable_evex01155, 6 },
+ /* 0x56 */ { itable_evex01156, 6 },
+ /* 0x57 */ { itable_evex01157, 6 },
+ /* 0x58 */ { itable_evex01158, 6 },
+ /* 0x59 */ { itable_evex01159, 6 },
+ /* 0x5a */ { itable_evex0115A, 3 },
+ /* 0x5b */ { itable_evex0115B, 3 },
+ /* 0x5c */ { itable_evex0115C, 6 },
+ /* 0x5d */ { itable_evex0115D, 6 },
+ /* 0x5e */ { itable_evex0115E, 6 },
+ /* 0x5f */ { itable_evex0115F, 6 },
+ /* 0x60 */ { itable_evex01160, 6 },
+ /* 0x61 */ { itable_evex01161, 6 },
+ /* 0x62 */ { itable_evex01162, 6 },
+ /* 0x63 */ { itable_evex01163, 6 },
+ /* 0x64 */ { itable_evex01164, 3 },
+ /* 0x65 */ { itable_evex01165, 3 },
+ /* 0x66 */ { itable_evex01166, 3 },
+ /* 0x67 */ { itable_evex01167, 6 },
+ /* 0x68 */ { itable_evex01168, 6 },
+ /* 0x69 */ { itable_evex01169, 6 },
+ /* 0x6a */ { itable_evex0116A, 6 },
+ /* 0x6b */ { itable_evex0116B, 6 },
+ /* 0x6c */ { itable_evex0116C, 6 },
+ /* 0x6d */ { itable_evex0116D, 6 },
+ /* 0x6e */ { itable_evex0116E, 2 },
+ /* 0x6f */ { itable_evex0116F, 6 },
+ /* 0x70 */ { itable_evex01170, 3 },
+ /* 0x71 */ { itable_evex01171, 18 },
+ /* 0x72 */ { itable_evex01172, 48 },
+ /* 0x73 */ { itable_evex01173, 24 },
+ /* 0x74 */ { itable_evex01174, 3 },
+ /* 0x75 */ { itable_evex01175, 3 },
+ /* 0x76 */ { itable_evex01176, 3 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_evex01178, 6 },
+ /* 0x79 */ { itable_evex01179, 6 },
+ /* 0x7a */ { itable_evex0117A, 6 },
+ /* 0x7b */ { itable_evex0117B, 6 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { itable_evex0117E, 2 },
+ /* 0x7f */ { itable_evex0117F, 6 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_evex011C2, 3 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { itable_evex011C4, 4 },
+ /* 0xc5 */ { itable_evex011C5, 3 },
+ /* 0xc6 */ { itable_evex011C6, 6 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { itable_evex011D1, 6 },
+ /* 0xd2 */ { itable_evex011D2, 6 },
+ /* 0xd3 */ { itable_evex011D3, 6 },
+ /* 0xd4 */ { itable_evex011D4, 6 },
+ /* 0xd5 */ { itable_evex011D5, 6 },
+ /* 0xd6 */ { itable_evex011D6, 1 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { itable_evex011D8, 6 },
+ /* 0xd9 */ { itable_evex011D9, 6 },
+ /* 0xda */ { itable_evex011DA, 6 },
+ /* 0xdb */ { itable_evex011DB, 12 },
+ /* 0xdc */ { itable_evex011DC, 6 },
+ /* 0xdd */ { itable_evex011DD, 6 },
+ /* 0xde */ { itable_evex011DE, 6 },
+ /* 0xdf */ { itable_evex011DF, 12 },
+ /* 0xe0 */ { itable_evex011E0, 6 },
+ /* 0xe1 */ { itable_evex011E1, 6 },
+ /* 0xe2 */ { itable_evex011E2, 12 },
+ /* 0xe3 */ { itable_evex011E3, 6 },
+ /* 0xe4 */ { itable_evex011E4, 6 },
+ /* 0xe5 */ { itable_evex011E5, 6 },
+ /* 0xe6 */ { itable_evex011E6, 3 },
+ /* 0xe7 */ { itable_evex011E7, 3 },
+ /* 0xe8 */ { itable_evex011E8, 6 },
+ /* 0xe9 */ { itable_evex011E9, 6 },
+ /* 0xea */ { itable_evex011EA, 6 },
+ /* 0xeb */ { itable_evex011EB, 12 },
+ /* 0xec */ { itable_evex011EC, 6 },
+ /* 0xed */ { itable_evex011ED, 6 },
+ /* 0xee */ { itable_evex011EE, 6 },
+ /* 0xef */ { itable_evex011EF, 12 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { itable_evex011F1, 6 },
+ /* 0xf2 */ { itable_evex011F2, 6 },
+ /* 0xf3 */ { itable_evex011F3, 6 },
+ /* 0xf4 */ { itable_evex011F4, 6 },
+ /* 0xf5 */ { itable_evex011F5, 6 },
+ /* 0xf6 */ { itable_evex011F6, 6 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { itable_evex011F8, 6 },
+ /* 0xf9 */ { itable_evex011F9, 6 },
+ /* 0xfa */ { itable_evex011FA, 6 },
+ /* 0xfb */ { itable_evex011FB, 6 },
+ /* 0xfc */ { itable_evex011FC, 6 },
+ /* 0xfd */ { itable_evex011FD, 6 },
+ /* 0xfe */ { itable_evex011FE, 6 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex012[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex01210, 3 },
+ /* 0x11 */ { itable_evex01211, 3 },
+ /* 0x12 */ { itable_evex01212, 3 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { itable_evex01216, 3 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { itable_evex0122A, 2 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { itable_evex0122C, 2 },
+ /* 0x2d */ { itable_evex0122D, 2 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_evex01251, 2 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_evex01258, 2 },
+ /* 0x59 */ { itable_evex01259, 2 },
+ /* 0x5a */ { itable_evex0125A, 1 },
+ /* 0x5b */ { itable_evex0125B, 3 },
+ /* 0x5c */ { itable_evex0125C, 2 },
+ /* 0x5d */ { itable_evex0125D, 2 },
+ /* 0x5e */ { itable_evex0125E, 2 },
+ /* 0x5f */ { itable_evex0125F, 2 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { itable_evex0126F, 6 },
+ /* 0x70 */ { itable_evex01270, 3 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_evex01278, 2 },
+ /* 0x79 */ { itable_evex01279, 2 },
+ /* 0x7a */ { itable_evex0127A, 6 },
+ /* 0x7b */ { itable_evex0127B, 2 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { itable_evex0127E, 1 },
+ /* 0x7f */ { itable_evex0127F, 6 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_evex012C2, 1 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { itable_evex012E6, 6 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex013[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex01310, 3 },
+ /* 0x11 */ { itable_evex01311, 3 },
+ /* 0x12 */ { itable_evex01312, 3 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { itable_evex0132A, 2 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { itable_evex0132C, 2 },
+ /* 0x2d */ { itable_evex0132D, 2 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { itable_evex01351, 2 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_evex01358, 2 },
+ /* 0x59 */ { itable_evex01359, 2 },
+ /* 0x5a */ { itable_evex0135A, 1 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { itable_evex0135C, 2 },
+ /* 0x5d */ { itable_evex0135D, 2 },
+ /* 0x5e */ { itable_evex0135E, 2 },
+ /* 0x5f */ { itable_evex0135F, 2 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { itable_evex0136F, 6 },
+ /* 0x70 */ { itable_evex01370, 3 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { itable_evex01378, 2 },
+ /* 0x79 */ { itable_evex01379, 2 },
+ /* 0x7a */ { itable_evex0137A, 6 },
+ /* 0x7b */ { itable_evex0137B, 2 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { itable_evex0137F, 6 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { itable_evex013C2, 1 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { itable_evex013E6, 3 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex021[256] = {
+ /* 0x00 */ { itable_evex02100, 6 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { itable_evex02104, 6 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { itable_evex0210B, 6 },
+ /* 0x0c */ { itable_evex0210C, 6 },
+ /* 0x0d */ { itable_evex0210D, 6 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex02110, 6 },
+ /* 0x11 */ { itable_evex02111, 6 },
+ /* 0x12 */ { itable_evex02112, 6 },
+ /* 0x13 */ { itable_evex02113, 3 },
+ /* 0x14 */ { itable_evex02114, 12 },
+ /* 0x15 */ { itable_evex02115, 12 },
+ /* 0x16 */ { itable_evex02116, 8 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { itable_evex02118, 6 },
+ /* 0x19 */ { itable_evex02119, 6 },
+ /* 0x1a */ { itable_evex0211A, 4 },
+ /* 0x1b */ { itable_evex0211B, 2 },
+ /* 0x1c */ { itable_evex0211C, 3 },
+ /* 0x1d */ { itable_evex0211D, 3 },
+ /* 0x1e */ { itable_evex0211E, 3 },
+ /* 0x1f */ { itable_evex0211F, 3 },
+ /* 0x20 */ { itable_evex02120, 3 },
+ /* 0x21 */ { itable_evex02121, 3 },
+ /* 0x22 */ { itable_evex02122, 3 },
+ /* 0x23 */ { itable_evex02123, 3 },
+ /* 0x24 */ { itable_evex02124, 3 },
+ /* 0x25 */ { itable_evex02125, 3 },
+ /* 0x26 */ { itable_evex02126, 6 },
+ /* 0x27 */ { itable_evex02127, 6 },
+ /* 0x28 */ { itable_evex02128, 6 },
+ /* 0x29 */ { itable_evex02129, 3 },
+ /* 0x2a */ { itable_evex0212A, 3 },
+ /* 0x2b */ { itable_evex0212B, 6 },
+ /* 0x2c */ { itable_evex0212C, 12 },
+ /* 0x2d */ { itable_evex0212D, 4 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { itable_evex02130, 3 },
+ /* 0x31 */ { itable_evex02131, 3 },
+ /* 0x32 */ { itable_evex02132, 3 },
+ /* 0x33 */ { itable_evex02133, 3 },
+ /* 0x34 */ { itable_evex02134, 3 },
+ /* 0x35 */ { itable_evex02135, 3 },
+ /* 0x36 */ { itable_evex02136, 8 },
+ /* 0x37 */ { itable_evex02137, 3 },
+ /* 0x38 */ { itable_evex02138, 6 },
+ /* 0x39 */ { itable_evex02139, 12 },
+ /* 0x3a */ { itable_evex0213A, 6 },
+ /* 0x3b */ { itable_evex0213B, 12 },
+ /* 0x3c */ { itable_evex0213C, 6 },
+ /* 0x3d */ { itable_evex0213D, 12 },
+ /* 0x3e */ { itable_evex0213E, 6 },
+ /* 0x3f */ { itable_evex0213F, 12 },
+ /* 0x40 */ { itable_evex02140, 12 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { itable_evex02142, 6 },
+ /* 0x43 */ { itable_evex02143, 2 },
+ /* 0x44 */ { itable_evex02144, 6 },
+ /* 0x45 */ { itable_evex02145, 12 },
+ /* 0x46 */ { itable_evex02146, 12 },
+ /* 0x47 */ { itable_evex02147, 12 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { itable_evex0214C, 6 },
+ /* 0x4d */ { itable_evex0214D, 4 },
+ /* 0x4e */ { itable_evex0214E, 6 },
+ /* 0x4f */ { itable_evex0214F, 4 },
+ /* 0x50 */ { itable_evex02150, 6 },
+ /* 0x51 */ { itable_evex02151, 6 },
+ /* 0x52 */ { itable_evex02152, 6 },
+ /* 0x53 */ { itable_evex02153, 6 },
+ /* 0x54 */ { itable_evex02154, 6 },
+ /* 0x55 */ { itable_evex02155, 6 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { itable_evex02158, 6 },
+ /* 0x59 */ { itable_evex02159, 9 },
+ /* 0x5a */ { itable_evex0215A, 4 },
+ /* 0x5b */ { itable_evex0215B, 2 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { itable_evex02162, 12 },
+ /* 0x63 */ { itable_evex02163, 12 },
+ /* 0x64 */ { itable_evex02164, 6 },
+ /* 0x65 */ { itable_evex02165, 6 },
+ /* 0x66 */ { itable_evex02166, 6 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { itable_evex02170, 6 },
+ /* 0x71 */ { itable_evex02171, 12 },
+ /* 0x72 */ { itable_evex02172, 6 },
+ /* 0x73 */ { itable_evex02173, 12 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { itable_evex02175, 6 },
+ /* 0x76 */ { itable_evex02176, 6 },
+ /* 0x77 */ { itable_evex02177, 6 },
+ /* 0x78 */ { itable_evex02178, 3 },
+ /* 0x79 */ { itable_evex02179, 3 },
+ /* 0x7a */ { itable_evex0217A, 12 },
+ /* 0x7b */ { itable_evex0217B, 9 },
+ /* 0x7c */ { itable_evex0217C, 6 },
+ /* 0x7d */ { itable_evex0217D, 6 },
+ /* 0x7e */ { itable_evex0217E, 6 },
+ /* 0x7f */ { itable_evex0217F, 6 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { itable_evex02183, 6 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { itable_evex02188, 12 },
+ /* 0x89 */ { itable_evex02189, 12 },
+ /* 0x8a */ { itable_evex0218A, 12 },
+ /* 0x8b */ { itable_evex0218B, 12 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { itable_evex0218D, 12 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { itable_evex0218F, 3 },
+ /* 0x90 */ { itable_evex02190, 6 },
+ /* 0x91 */ { itable_evex02191, 6 },
+ /* 0x92 */ { itable_evex02192, 6 },
+ /* 0x93 */ { itable_evex02193, 6 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { itable_evex02196, 6 },
+ /* 0x97 */ { itable_evex02197, 6 },
+ /* 0x98 */ { itable_evex02198, 6 },
+ /* 0x99 */ { itable_evex02199, 2 },
+ /* 0x9a */ { itable_evex0219A, 6 },
+ /* 0x9b */ { itable_evex0219B, 2 },
+ /* 0x9c */ { itable_evex0219C, 6 },
+ /* 0x9d */ { itable_evex0219D, 2 },
+ /* 0x9e */ { itable_evex0219E, 6 },
+ /* 0x9f */ { itable_evex0219F, 2 },
+ /* 0xa0 */ { itable_evex021A0, 6 },
+ /* 0xa1 */ { itable_evex021A1, 6 },
+ /* 0xa2 */ { itable_evex021A2, 6 },
+ /* 0xa3 */ { itable_evex021A3, 6 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { itable_evex021A6, 6 },
+ /* 0xa7 */ { itable_evex021A7, 6 },
+ /* 0xa8 */ { itable_evex021A8, 6 },
+ /* 0xa9 */ { itable_evex021A9, 2 },
+ /* 0xaa */ { itable_evex021AA, 6 },
+ /* 0xab */ { itable_evex021AB, 2 },
+ /* 0xac */ { itable_evex021AC, 6 },
+ /* 0xad */ { itable_evex021AD, 2 },
+ /* 0xae */ { itable_evex021AE, 6 },
+ /* 0xaf */ { itable_evex021AF, 2 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { itable_evex021B4, 3 },
+ /* 0xb5 */ { itable_evex021B5, 3 },
+ /* 0xb6 */ { itable_evex021B6, 6 },
+ /* 0xb7 */ { itable_evex021B7, 6 },
+ /* 0xb8 */ { itable_evex021B8, 6 },
+ /* 0xb9 */ { itable_evex021B9, 2 },
+ /* 0xba */ { itable_evex021BA, 6 },
+ /* 0xbb */ { itable_evex021BB, 2 },
+ /* 0xbc */ { itable_evex021BC, 6 },
+ /* 0xbd */ { itable_evex021BD, 2 },
+ /* 0xbe */ { itable_evex021BE, 6 },
+ /* 0xbf */ { itable_evex021BF, 2 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { itable_evex021C4, 6 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { itable_evex021C6, 8 },
+ /* 0xc7 */ { itable_evex021C7, 8 },
+ /* 0xc8 */ { itable_evex021C8, 2 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { itable_evex021CA, 2 },
+ /* 0xcb */ { itable_evex021CB, 4 },
+ /* 0xcc */ { itable_evex021CC, 2 },
+ /* 0xcd */ { itable_evex021CD, 4 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { itable_evex021CF, 6 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { itable_evex021DC, 6 },
+ /* 0xdd */ { itable_evex021DD, 6 },
+ /* 0xde */ { itable_evex021DE, 6 },
+ /* 0xdf */ { itable_evex021DF, 6 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex022[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_evex02210, 6 },
+ /* 0x11 */ { itable_evex02211, 6 },
+ /* 0x12 */ { itable_evex02212, 6 },
+ /* 0x13 */ { itable_evex02213, 6 },
+ /* 0x14 */ { itable_evex02214, 6 },
+ /* 0x15 */ { itable_evex02215, 6 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { itable_evex02220, 6 },
+ /* 0x21 */ { itable_evex02221, 6 },
+ /* 0x22 */ { itable_evex02222, 6 },
+ /* 0x23 */ { itable_evex02223, 6 },
+ /* 0x24 */ { itable_evex02224, 6 },
+ /* 0x25 */ { itable_evex02225, 6 },
+ /* 0x26 */ { itable_evex02226, 6 },
+ /* 0x27 */ { itable_evex02227, 6 },
+ /* 0x28 */ { itable_evex02228, 6 },
+ /* 0x29 */ { itable_evex02229, 6 },
+ /* 0x2a */ { itable_evex0222A, 3 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { itable_evex02230, 6 },
+ /* 0x31 */ { itable_evex02231, 6 },
+ /* 0x32 */ { itable_evex02232, 6 },
+ /* 0x33 */ { itable_evex02233, 6 },
+ /* 0x34 */ { itable_evex02234, 6 },
+ /* 0x35 */ { itable_evex02235, 6 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { itable_evex02238, 6 },
+ /* 0x39 */ { itable_evex02239, 6 },
+ /* 0x3a */ { itable_evex0223A, 3 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex023[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { itable_evex02352, 1 },
+ /* 0x53 */ { itable_evex02353, 1 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { itable_evex0239A, 1 },
+ /* 0x9b */ { itable_evex0239B, 1 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { itable_evex023AA, 1 },
+ /* 0xab */ { itable_evex023AB, 1 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_evex031[256] = {
+ /* 0x00 */ { itable_evex03100, 2 },
+ /* 0x01 */ { itable_evex03101, 2 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { itable_evex03103, 12 },
+ /* 0x04 */ { itable_evex03104, 3 },
+ /* 0x05 */ { itable_evex03105, 3 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { itable_evex03108, 3 },
+ /* 0x09 */ { itable_evex03109, 3 },
+ /* 0x0a */ { itable_evex0310A, 2 },
+ /* 0x0b */ { itable_evex0310B, 2 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { itable_evex0310F, 6 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { itable_evex03114, 5 },
+ /* 0x15 */ { itable_evex03115, 4 },
+ /* 0x16 */ { itable_evex03116, 2 },
+ /* 0x17 */ { itable_evex03117, 3 },
+ /* 0x18 */ { itable_evex03118, 8 },
+ /* 0x19 */ { itable_evex03119, 8 },
+ /* 0x1a */ { itable_evex0311A, 4 },
+ /* 0x1b */ { itable_evex0311B, 4 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { itable_evex0311D, 6 },
+ /* 0x1e */ { itable_evex0311E, 6 },
+ /* 0x1f */ { itable_evex0311F, 6 },
+ /* 0x20 */ { itable_evex03120, 4 },
+ /* 0x21 */ { itable_evex03121, 2 },
+ /* 0x22 */ { itable_evex03122, 4 },
+ /* 0x23 */ { itable_evex03123, 8 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { itable_evex03125, 6 },
+ /* 0x26 */ { itable_evex03126, 6 },
+ /* 0x27 */ { itable_evex03127, 2 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { itable_evex03138, 8 },
+ /* 0x39 */ { itable_evex03139, 8 },
+ /* 0x3a */ { itable_evex0313A, 4 },
+ /* 0x3b */ { itable_evex0313B, 4 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { itable_evex0313E, 6 },
+ /* 0x3f */ { itable_evex0313F, 6 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { itable_evex03142, 6 },
+ /* 0x43 */ { itable_evex03143, 8 },
+ /* 0x44 */ { itable_evex03144, 30 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { itable_evex03150, 12 },
+ /* 0x51 */ { itable_evex03151, 4 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { itable_evex03154, 12 },
+ /* 0x55 */ { itable_evex03155, 4 },
+ /* 0x56 */ { itable_evex03156, 6 },
+ /* 0x57 */ { itable_evex03157, 4 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { itable_evex03166, 6 },
+ /* 0x67 */ { itable_evex03167, 2 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { itable_evex03170, 6 },
+ /* 0x71 */ { itable_evex03171, 12 },
+ /* 0x72 */ { itable_evex03172, 6 },
+ /* 0x73 */ { itable_evex03173, 12 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { itable_evex031CE, 6 },
+ /* 0xcf */ { itable_evex031CF, 6 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_0F38[256] = {
+ /* 0x00 */ { itable_0F3800, 2 },
+ /* 0x01 */ { itable_0F3801, 2 },
+ /* 0x02 */ { itable_0F3802, 2 },
+ /* 0x03 */ { itable_0F3803, 2 },
+ /* 0x04 */ { itable_0F3804, 2 },
+ /* 0x05 */ { itable_0F3805, 2 },
+ /* 0x06 */ { itable_0F3806, 2 },
+ /* 0x07 */ { itable_0F3807, 2 },
+ /* 0x08 */ { itable_0F3808, 2 },
+ /* 0x09 */ { itable_0F3809, 2 },
+ /* 0x0a */ { itable_0F380A, 2 },
+ /* 0x0b */ { itable_0F380B, 2 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { itable_0F3810, 2 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { itable_0F3814, 2 },
+ /* 0x15 */ { itable_0F3815, 2 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { itable_0F3817, 1 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { itable_0F381C, 2 },
+ /* 0x1d */ { itable_0F381D, 2 },
+ /* 0x1e */ { itable_0F381E, 2 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { itable_0F3820, 1 },
+ /* 0x21 */ { itable_0F3821, 1 },
+ /* 0x22 */ { itable_0F3822, 1 },
+ /* 0x23 */ { itable_0F3823, 1 },
+ /* 0x24 */ { itable_0F3824, 1 },
+ /* 0x25 */ { itable_0F3825, 1 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_0F3828, 1 },
+ /* 0x29 */ { itable_0F3829, 1 },
+ /* 0x2a */ { itable_0F382A, 1 },
+ /* 0x2b */ { itable_0F382B, 1 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { itable_0F3830, 1 },
+ /* 0x31 */ { itable_0F3831, 1 },
+ /* 0x32 */ { itable_0F3832, 1 },
+ /* 0x33 */ { itable_0F3833, 1 },
+ /* 0x34 */ { itable_0F3834, 1 },
+ /* 0x35 */ { itable_0F3835, 1 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { itable_0F3837, 1 },
+ /* 0x38 */ { itable_0F3838, 1 },
+ /* 0x39 */ { itable_0F3839, 1 },
+ /* 0x3a */ { itable_0F383A, 1 },
+ /* 0x3b */ { itable_0F383B, 1 },
+ /* 0x3c */ { itable_0F383C, 1 },
+ /* 0x3d */ { itable_0F383D, 1 },
+ /* 0x3e */ { itable_0F383E, 1 },
+ /* 0x3f */ { itable_0F383F, 1 },
+ /* 0x40 */ { itable_0F3840, 1 },
+ /* 0x41 */ { itable_0F3841, 1 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { itable_0F3880, 2 },
+ /* 0x81 */ { itable_0F3881, 2 },
+ /* 0x82 */ { itable_0F3882, 2 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { itable_0F38C8, 1 },
+ /* 0xc9 */ { itable_0F38C9, 1 },
+ /* 0xca */ { itable_0F38CA, 1 },
+ /* 0xcb */ { itable_0F38CB, 2 },
+ /* 0xcc */ { itable_0F38CC, 1 },
+ /* 0xcd */ { itable_0F38CD, 1 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { itable_0F38CF, 1 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { itable_0F38DB, 1 },
+ /* 0xdc */ { itable_0F38DC, 1 },
+ /* 0xdd */ { itable_0F38DD, 1 },
+ /* 0xde */ { itable_0F38DE, 1 },
+ /* 0xdf */ { itable_0F38DF, 1 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { itable_0F38F0, 5 },
+ /* 0xf1 */ { itable_0F38F1, 6 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { itable_0F38F6, 4 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { itable_0F38F8, 3 },
+ /* 0xf9 */ { itable_0F38F9, 2 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_0F3A[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { itable_0F3A08, 1 },
+ /* 0x09 */ { itable_0F3A09, 1 },
+ /* 0x0a */ { itable_0F3A0A, 1 },
+ /* 0x0b */ { itable_0F3A0B, 1 },
+ /* 0x0c */ { itable_0F3A0C, 1 },
+ /* 0x0d */ { itable_0F3A0D, 1 },
+ /* 0x0e */ { itable_0F3A0E, 1 },
+ /* 0x0f */ { itable_0F3A0F, 2 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { itable_0F3A14, 3 },
+ /* 0x15 */ { itable_0F3A15, 3 },
+ /* 0x16 */ { itable_0F3A16, 2 },
+ /* 0x17 */ { itable_0F3A17, 2 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { itable_0F3A20, 3 },
+ /* 0x21 */ { itable_0F3A21, 1 },
+ /* 0x22 */ { itable_0F3A22, 4 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { itable_0F3A40, 1 },
+ /* 0x41 */ { itable_0F3A41, 1 },
+ /* 0x42 */ { itable_0F3A42, 1 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { itable_0F3A44, 5 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { itable_0F3A60, 1 },
+ /* 0x61 */ { itable_0F3A61, 1 },
+ /* 0x62 */ { itable_0F3A62, 1 },
+ /* 0x63 */ { itable_0F3A63, 1 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { NULL, 0 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { NULL, 0 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { itable_0F3ACC, 1 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { itable_0F3ACE, 1 },
+ /* 0xcf */ { itable_0F3ACF, 1 },
+ /* 0xd0 */ { NULL, 0 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { itable_0F3ADF, 1 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_0FA6[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { itable_0FA6C0, 1 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { itable_0FA6C8, 1 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { itable_0FA6D0, 1 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { NULL, 0 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { NULL, 0 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { NULL, 0 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_0FA7[256] = {
+ /* 0x00 */ { NULL, 0 },
+ /* 0x01 */ { NULL, 0 },
+ /* 0x02 */ { NULL, 0 },
+ /* 0x03 */ { NULL, 0 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { NULL, 0 },
+ /* 0x06 */ { NULL, 0 },
+ /* 0x07 */ { NULL, 0 },
+ /* 0x08 */ { NULL, 0 },
+ /* 0x09 */ { NULL, 0 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { NULL, 0 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { NULL, 0 },
+ /* 0x0e */ { NULL, 0 },
+ /* 0x0f */ { NULL, 0 },
+ /* 0x10 */ { NULL, 0 },
+ /* 0x11 */ { NULL, 0 },
+ /* 0x12 */ { NULL, 0 },
+ /* 0x13 */ { NULL, 0 },
+ /* 0x14 */ { NULL, 0 },
+ /* 0x15 */ { NULL, 0 },
+ /* 0x16 */ { NULL, 0 },
+ /* 0x17 */ { NULL, 0 },
+ /* 0x18 */ { NULL, 0 },
+ /* 0x19 */ { NULL, 0 },
+ /* 0x1a */ { NULL, 0 },
+ /* 0x1b */ { NULL, 0 },
+ /* 0x1c */ { NULL, 0 },
+ /* 0x1d */ { NULL, 0 },
+ /* 0x1e */ { NULL, 0 },
+ /* 0x1f */ { NULL, 0 },
+ /* 0x20 */ { NULL, 0 },
+ /* 0x21 */ { NULL, 0 },
+ /* 0x22 */ { NULL, 0 },
+ /* 0x23 */ { NULL, 0 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { NULL, 0 },
+ /* 0x29 */ { NULL, 0 },
+ /* 0x2a */ { NULL, 0 },
+ /* 0x2b */ { NULL, 0 },
+ /* 0x2c */ { NULL, 0 },
+ /* 0x2d */ { NULL, 0 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { NULL, 0 },
+ /* 0x30 */ { NULL, 0 },
+ /* 0x31 */ { NULL, 0 },
+ /* 0x32 */ { NULL, 0 },
+ /* 0x33 */ { NULL, 0 },
+ /* 0x34 */ { NULL, 0 },
+ /* 0x35 */ { NULL, 0 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { NULL, 0 },
+ /* 0x38 */ { NULL, 0 },
+ /* 0x39 */ { NULL, 0 },
+ /* 0x3a */ { NULL, 0 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { NULL, 0 },
+ /* 0x3d */ { NULL, 0 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { NULL, 0 },
+ /* 0x41 */ { NULL, 0 },
+ /* 0x42 */ { NULL, 0 },
+ /* 0x43 */ { NULL, 0 },
+ /* 0x44 */ { NULL, 0 },
+ /* 0x45 */ { NULL, 0 },
+ /* 0x46 */ { NULL, 0 },
+ /* 0x47 */ { NULL, 0 },
+ /* 0x48 */ { NULL, 0 },
+ /* 0x49 */ { NULL, 0 },
+ /* 0x4a */ { NULL, 0 },
+ /* 0x4b */ { NULL, 0 },
+ /* 0x4c */ { NULL, 0 },
+ /* 0x4d */ { NULL, 0 },
+ /* 0x4e */ { NULL, 0 },
+ /* 0x4f */ { NULL, 0 },
+ /* 0x50 */ { NULL, 0 },
+ /* 0x51 */ { NULL, 0 },
+ /* 0x52 */ { NULL, 0 },
+ /* 0x53 */ { NULL, 0 },
+ /* 0x54 */ { NULL, 0 },
+ /* 0x55 */ { NULL, 0 },
+ /* 0x56 */ { NULL, 0 },
+ /* 0x57 */ { NULL, 0 },
+ /* 0x58 */ { NULL, 0 },
+ /* 0x59 */ { NULL, 0 },
+ /* 0x5a */ { NULL, 0 },
+ /* 0x5b */ { NULL, 0 },
+ /* 0x5c */ { NULL, 0 },
+ /* 0x5d */ { NULL, 0 },
+ /* 0x5e */ { NULL, 0 },
+ /* 0x5f */ { NULL, 0 },
+ /* 0x60 */ { NULL, 0 },
+ /* 0x61 */ { NULL, 0 },
+ /* 0x62 */ { NULL, 0 },
+ /* 0x63 */ { NULL, 0 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { NULL, 0 },
+ /* 0x69 */ { NULL, 0 },
+ /* 0x6a */ { NULL, 0 },
+ /* 0x6b */ { NULL, 0 },
+ /* 0x6c */ { NULL, 0 },
+ /* 0x6d */ { NULL, 0 },
+ /* 0x6e */ { NULL, 0 },
+ /* 0x6f */ { NULL, 0 },
+ /* 0x70 */ { NULL, 0 },
+ /* 0x71 */ { NULL, 0 },
+ /* 0x72 */ { NULL, 0 },
+ /* 0x73 */ { NULL, 0 },
+ /* 0x74 */ { NULL, 0 },
+ /* 0x75 */ { NULL, 0 },
+ /* 0x76 */ { NULL, 0 },
+ /* 0x77 */ { NULL, 0 },
+ /* 0x78 */ { NULL, 0 },
+ /* 0x79 */ { NULL, 0 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { NULL, 0 },
+ /* 0x7c */ { NULL, 0 },
+ /* 0x7d */ { NULL, 0 },
+ /* 0x7e */ { NULL, 0 },
+ /* 0x7f */ { NULL, 0 },
+ /* 0x80 */ { NULL, 0 },
+ /* 0x81 */ { NULL, 0 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { NULL, 0 },
+ /* 0x84 */ { NULL, 0 },
+ /* 0x85 */ { NULL, 0 },
+ /* 0x86 */ { NULL, 0 },
+ /* 0x87 */ { NULL, 0 },
+ /* 0x88 */ { NULL, 0 },
+ /* 0x89 */ { NULL, 0 },
+ /* 0x8a */ { NULL, 0 },
+ /* 0x8b */ { NULL, 0 },
+ /* 0x8c */ { NULL, 0 },
+ /* 0x8d */ { NULL, 0 },
+ /* 0x8e */ { NULL, 0 },
+ /* 0x8f */ { NULL, 0 },
+ /* 0x90 */ { NULL, 0 },
+ /* 0x91 */ { NULL, 0 },
+ /* 0x92 */ { NULL, 0 },
+ /* 0x93 */ { NULL, 0 },
+ /* 0x94 */ { NULL, 0 },
+ /* 0x95 */ { NULL, 0 },
+ /* 0x96 */ { NULL, 0 },
+ /* 0x97 */ { NULL, 0 },
+ /* 0x98 */ { NULL, 0 },
+ /* 0x99 */ { NULL, 0 },
+ /* 0x9a */ { NULL, 0 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { NULL, 0 },
+ /* 0x9d */ { NULL, 0 },
+ /* 0x9e */ { NULL, 0 },
+ /* 0x9f */ { NULL, 0 },
+ /* 0xa0 */ { NULL, 0 },
+ /* 0xa1 */ { NULL, 0 },
+ /* 0xa2 */ { NULL, 0 },
+ /* 0xa3 */ { NULL, 0 },
+ /* 0xa4 */ { NULL, 0 },
+ /* 0xa5 */ { NULL, 0 },
+ /* 0xa6 */ { NULL, 0 },
+ /* 0xa7 */ { NULL, 0 },
+ /* 0xa8 */ { NULL, 0 },
+ /* 0xa9 */ { NULL, 0 },
+ /* 0xaa */ { NULL, 0 },
+ /* 0xab */ { NULL, 0 },
+ /* 0xac */ { NULL, 0 },
+ /* 0xad */ { NULL, 0 },
+ /* 0xae */ { NULL, 0 },
+ /* 0xaf */ { NULL, 0 },
+ /* 0xb0 */ { NULL, 0 },
+ /* 0xb1 */ { NULL, 0 },
+ /* 0xb2 */ { NULL, 0 },
+ /* 0xb3 */ { NULL, 0 },
+ /* 0xb4 */ { NULL, 0 },
+ /* 0xb5 */ { NULL, 0 },
+ /* 0xb6 */ { NULL, 0 },
+ /* 0xb7 */ { NULL, 0 },
+ /* 0xb8 */ { NULL, 0 },
+ /* 0xb9 */ { NULL, 0 },
+ /* 0xba */ { NULL, 0 },
+ /* 0xbb */ { NULL, 0 },
+ /* 0xbc */ { NULL, 0 },
+ /* 0xbd */ { NULL, 0 },
+ /* 0xbe */ { NULL, 0 },
+ /* 0xbf */ { NULL, 0 },
+ /* 0xc0 */ { itable_0FA7C0, 1 },
+ /* 0xc1 */ { NULL, 0 },
+ /* 0xc2 */ { NULL, 0 },
+ /* 0xc3 */ { NULL, 0 },
+ /* 0xc4 */ { NULL, 0 },
+ /* 0xc5 */ { NULL, 0 },
+ /* 0xc6 */ { NULL, 0 },
+ /* 0xc7 */ { NULL, 0 },
+ /* 0xc8 */ { itable_0FA7C8, 1 },
+ /* 0xc9 */ { NULL, 0 },
+ /* 0xca */ { NULL, 0 },
+ /* 0xcb */ { NULL, 0 },
+ /* 0xcc */ { NULL, 0 },
+ /* 0xcd */ { NULL, 0 },
+ /* 0xce */ { NULL, 0 },
+ /* 0xcf */ { NULL, 0 },
+ /* 0xd0 */ { itable_0FA7D0, 1 },
+ /* 0xd1 */ { NULL, 0 },
+ /* 0xd2 */ { NULL, 0 },
+ /* 0xd3 */ { NULL, 0 },
+ /* 0xd4 */ { NULL, 0 },
+ /* 0xd5 */ { NULL, 0 },
+ /* 0xd6 */ { NULL, 0 },
+ /* 0xd7 */ { NULL, 0 },
+ /* 0xd8 */ { itable_0FA7D8, 1 },
+ /* 0xd9 */ { NULL, 0 },
+ /* 0xda */ { NULL, 0 },
+ /* 0xdb */ { NULL, 0 },
+ /* 0xdc */ { NULL, 0 },
+ /* 0xdd */ { NULL, 0 },
+ /* 0xde */ { NULL, 0 },
+ /* 0xdf */ { NULL, 0 },
+ /* 0xe0 */ { itable_0FA7E0, 1 },
+ /* 0xe1 */ { NULL, 0 },
+ /* 0xe2 */ { NULL, 0 },
+ /* 0xe3 */ { NULL, 0 },
+ /* 0xe4 */ { NULL, 0 },
+ /* 0xe5 */ { NULL, 0 },
+ /* 0xe6 */ { NULL, 0 },
+ /* 0xe7 */ { NULL, 0 },
+ /* 0xe8 */ { itable_0FA7E8, 1 },
+ /* 0xe9 */ { NULL, 0 },
+ /* 0xea */ { NULL, 0 },
+ /* 0xeb */ { NULL, 0 },
+ /* 0xec */ { NULL, 0 },
+ /* 0xed */ { NULL, 0 },
+ /* 0xee */ { NULL, 0 },
+ /* 0xef */ { NULL, 0 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { NULL, 0 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { NULL, 0 },
+ /* 0xf5 */ { NULL, 0 },
+ /* 0xf6 */ { NULL, 0 },
+ /* 0xf7 */ { NULL, 0 },
+ /* 0xf8 */ { NULL, 0 },
+ /* 0xf9 */ { NULL, 0 },
+ /* 0xfa */ { NULL, 0 },
+ /* 0xfb */ { NULL, 0 },
+ /* 0xfc */ { NULL, 0 },
+ /* 0xfd */ { NULL, 0 },
+ /* 0xfe */ { NULL, 0 },
+ /* 0xff */ { NULL, 0 },
+};
+
+static const struct disasm_index itable_0F[256] = {
+ /* 0x00 */ { itable_0F00, 24 },
+ /* 0x01 */ { itable_0F01, 48 },
+ /* 0x02 */ { itable_0F02, 10 },
+ /* 0x03 */ { itable_0F03, 10 },
+ /* 0x04 */ { NULL, 0 },
+ /* 0x05 */ { itable_0F05, 1 },
+ /* 0x06 */ { itable_0F06, 1 },
+ /* 0x07 */ { itable_0F07, 1 },
+ /* 0x08 */ { itable_0F08, 1 },
+ /* 0x09 */ { itable_0F09, 2 },
+ /* 0x0a */ { NULL, 0 },
+ /* 0x0b */ { itable_0F0B, 1 },
+ /* 0x0c */ { NULL, 0 },
+ /* 0x0d */ { itable_0F0D, 3 },
+ /* 0x0e */ { itable_0F0E, 1 },
+ /* 0x0f */ { itable_0F0F, 26 },
+ /* 0x10 */ { itable_0F10, 7 },
+ /* 0x11 */ { itable_0F11, 6 },
+ /* 0x12 */ { itable_0F12, 5 },
+ /* 0x13 */ { itable_0F13, 2 },
+ /* 0x14 */ { itable_0F14, 2 },
+ /* 0x15 */ { itable_0F15, 2 },
+ /* 0x16 */ { itable_0F16, 4 },
+ /* 0x17 */ { itable_0F17, 2 },
+ /* 0x18 */ { itable_0F18, 28 },
+ /* 0x19 */ { itable_0F19, 24 },
+ /* 0x1a */ { itable_0F1A, 35 },
+ /* 0x1b */ { itable_0F1B, 35 },
+ /* 0x1c */ { itable_0F1C, 25 },
+ /* 0x1d */ { itable_0F1D, 24 },
+ /* 0x1e */ { itable_0F1E, 24 },
+ /* 0x1f */ { itable_0F1F, 27 },
+ /* 0x20 */ { itable_0F20, 2 },
+ /* 0x21 */ { itable_0F21, 2 },
+ /* 0x22 */ { itable_0F22, 2 },
+ /* 0x23 */ { itable_0F23, 2 },
+ /* 0x24 */ { NULL, 0 },
+ /* 0x25 */ { NULL, 0 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { NULL, 0 },
+ /* 0x28 */ { itable_0F28, 3 },
+ /* 0x29 */ { itable_0F29, 3 },
+ /* 0x2a */ { itable_0F2A, 6 },
+ /* 0x2b */ { itable_0F2B, 4 },
+ /* 0x2c */ { itable_0F2C, 8 },
+ /* 0x2d */ { itable_0F2D, 10 },
+ /* 0x2e */ { itable_0F2E, 2 },
+ /* 0x2f */ { itable_0F2F, 2 },
+ /* 0x30 */ { itable_0F30, 1 },
+ /* 0x31 */ { itable_0F31, 1 },
+ /* 0x32 */ { itable_0F32, 1 },
+ /* 0x33 */ { itable_0F33, 1 },
+ /* 0x34 */ { itable_0F34, 1 },
+ /* 0x35 */ { itable_0F35, 1 },
+ /* 0x36 */ { itable_0F36, 1 },
+ /* 0x37 */ { itable_0F37, 2 },
+ /* 0x38 */ { itable_0F38, -1 },
+ /* 0x39 */ { itable_0F39, 1 },
+ /* 0x3a */ { itable_0F3A, -1 },
+ /* 0x3b */ { NULL, 0 },
+ /* 0x3c */ { itable_0F3C, 1 },
+ /* 0x3d */ { itable_0F3D, 1 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { NULL, 0 },
+ /* 0x40 */ { itable_0F40, 6 },
+ /* 0x41 */ { itable_0F41, 6 },
+ /* 0x42 */ { itable_0F42, 6 },
+ /* 0x43 */ { itable_0F43, 6 },
+ /* 0x44 */ { itable_0F44, 6 },
+ /* 0x45 */ { itable_0F45, 6 },
+ /* 0x46 */ { itable_0F46, 6 },
+ /* 0x47 */ { itable_0F47, 6 },
+ /* 0x48 */ { itable_0F48, 6 },
+ /* 0x49 */ { itable_0F49, 6 },
+ /* 0x4a */ { itable_0F4A, 6 },
+ /* 0x4b */ { itable_0F4B, 6 },
+ /* 0x4c */ { itable_0F4C, 6 },
+ /* 0x4d */ { itable_0F4D, 6 },
+ /* 0x4e */ { itable_0F4E, 6 },
+ /* 0x4f */ { itable_0F4F, 6 },
+ /* 0x50 */ { itable_0F50, 5 },
+ /* 0x51 */ { itable_0F51, 5 },
+ /* 0x52 */ { itable_0F52, 3 },
+ /* 0x53 */ { itable_0F53, 2 },
+ /* 0x54 */ { itable_0F54, 3 },
+ /* 0x55 */ { itable_0F55, 3 },
+ /* 0x56 */ { itable_0F56, 2 },
+ /* 0x57 */ { itable_0F57, 2 },
+ /* 0x58 */ { itable_0F58, 5 },
+ /* 0x59 */ { itable_0F59, 5 },
+ /* 0x5a */ { itable_0F5A, 5 },
+ /* 0x5b */ { itable_0F5B, 4 },
+ /* 0x5c */ { itable_0F5C, 5 },
+ /* 0x5d */ { itable_0F5D, 5 },
+ /* 0x5e */ { itable_0F5E, 5 },
+ /* 0x5f */ { itable_0F5F, 4 },
+ /* 0x60 */ { itable_0F60, 2 },
+ /* 0x61 */ { itable_0F61, 2 },
+ /* 0x62 */ { itable_0F62, 2 },
+ /* 0x63 */ { itable_0F63, 2 },
+ /* 0x64 */ { itable_0F64, 2 },
+ /* 0x65 */ { itable_0F65, 2 },
+ /* 0x66 */ { itable_0F66, 2 },
+ /* 0x67 */ { itable_0F67, 2 },
+ /* 0x68 */ { itable_0F68, 2 },
+ /* 0x69 */ { itable_0F69, 2 },
+ /* 0x6a */ { itable_0F6A, 2 },
+ /* 0x6b */ { itable_0F6B, 2 },
+ /* 0x6c */ { itable_0F6C, 1 },
+ /* 0x6d */ { itable_0F6D, 1 },
+ /* 0x6e */ { itable_0F6E, 5 },
+ /* 0x6f */ { itable_0F6F, 5 },
+ /* 0x70 */ { itable_0F70, 7 },
+ /* 0x71 */ { itable_0F71, 6 },
+ /* 0x72 */ { itable_0F72, 6 },
+ /* 0x73 */ { itable_0F73, 6 },
+ /* 0x74 */ { itable_0F74, 2 },
+ /* 0x75 */ { itable_0F75, 2 },
+ /* 0x76 */ { itable_0F76, 2 },
+ /* 0x77 */ { itable_0F77, 1 },
+ /* 0x78 */ { itable_0F78, 5 },
+ /* 0x79 */ { itable_0F79, 5 },
+ /* 0x7a */ { NULL, 0 },
+ /* 0x7b */ { itable_0F7B, 1 },
+ /* 0x7c */ { itable_0F7C, 3 },
+ /* 0x7d */ { itable_0F7D, 3 },
+ /* 0x7e */ { itable_0F7E, 7 },
+ /* 0x7f */ { itable_0F7F, 5 },
+ /* 0x80 */ { itable_0F80, 4 },
+ /* 0x81 */ { itable_0F81, 4 },
+ /* 0x82 */ { itable_0F82, 4 },
+ /* 0x83 */ { itable_0F83, 4 },
+ /* 0x84 */ { itable_0F84, 4 },
+ /* 0x85 */ { itable_0F85, 4 },
+ /* 0x86 */ { itable_0F86, 4 },
+ /* 0x87 */ { itable_0F87, 4 },
+ /* 0x88 */ { itable_0F88, 4 },
+ /* 0x89 */ { itable_0F89, 4 },
+ /* 0x8a */ { itable_0F8A, 4 },
+ /* 0x8b */ { itable_0F8B, 4 },
+ /* 0x8c */ { itable_0F8C, 4 },
+ /* 0x8d */ { itable_0F8D, 4 },
+ /* 0x8e */ { itable_0F8E, 4 },
+ /* 0x8f */ { itable_0F8F, 4 },
+ /* 0x90 */ { itable_0F90, 2 },
+ /* 0x91 */ { itable_0F91, 2 },
+ /* 0x92 */ { itable_0F92, 2 },
+ /* 0x93 */ { itable_0F93, 2 },
+ /* 0x94 */ { itable_0F94, 2 },
+ /* 0x95 */ { itable_0F95, 2 },
+ /* 0x96 */ { itable_0F96, 2 },
+ /* 0x97 */ { itable_0F97, 2 },
+ /* 0x98 */ { itable_0F98, 2 },
+ /* 0x99 */ { itable_0F99, 2 },
+ /* 0x9a */ { itable_0F9A, 2 },
+ /* 0x9b */ { itable_0F9B, 2 },
+ /* 0x9c */ { itable_0F9C, 2 },
+ /* 0x9d */ { itable_0F9D, 2 },
+ /* 0x9e */ { itable_0F9E, 2 },
+ /* 0x9f */ { itable_0F9F, 2 },
+ /* 0xa0 */ { itable_0FA0, 1 },
+ /* 0xa1 */ { itable_0FA1, 1 },
+ /* 0xa2 */ { itable_0FA2, 1 },
+ /* 0xa3 */ { itable_0FA3, 6 },
+ /* 0xa4 */ { itable_0FA4, 6 },
+ /* 0xa5 */ { itable_0FA5, 6 },
+ /* 0xa6 */ { itable_0FA6, -1 },
+ /* 0xa7 */ { itable_0FA7, -1 },
+ /* 0xa8 */ { itable_0FA8, 1 },
+ /* 0xa9 */ { itable_0FA9, 1 },
+ /* 0xaa */ { itable_0FAA, 1 },
+ /* 0xab */ { itable_0FAB, 6 },
+ /* 0xac */ { itable_0FAC, 6 },
+ /* 0xad */ { itable_0FAD, 6 },
+ /* 0xae */ { itable_0FAE, 37 },
+ /* 0xaf */ { itable_0FAF, 6 },
+ /* 0xb0 */ { itable_0FB0, 2 },
+ /* 0xb1 */ { itable_0FB1, 6 },
+ /* 0xb2 */ { itable_0FB2, 3 },
+ /* 0xb3 */ { itable_0FB3, 6 },
+ /* 0xb4 */ { itable_0FB4, 3 },
+ /* 0xb5 */ { itable_0FB5, 3 },
+ /* 0xb6 */ { itable_0FB6, 4 },
+ /* 0xb7 */ { itable_0FB7, 2 },
+ /* 0xb8 */ { itable_0FB8, 6 },
+ /* 0xb9 */ { itable_0FB9, 3 },
+ /* 0xba */ { itable_0FBA, 12 },
+ /* 0xbb */ { itable_0FBB, 6 },
+ /* 0xbc */ { itable_0FBC, 9 },
+ /* 0xbd */ { itable_0FBD, 9 },
+ /* 0xbe */ { itable_0FBE, 4 },
+ /* 0xbf */ { itable_0FBF, 2 },
+ /* 0xc0 */ { itable_0FC0, 2 },
+ /* 0xc1 */ { itable_0FC1, 6 },
+ /* 0xc2 */ { itable_0FC2, 38 },
+ /* 0xc3 */ { itable_0FC3, 2 },
+ /* 0xc4 */ { itable_0FC4, 6 },
+ /* 0xc5 */ { itable_0FC5, 2 },
+ /* 0xc6 */ { itable_0FC6, 3 },
+ /* 0xc7 */ { itable_0FC7, 21 },
+ /* 0xc8 */ { itable_0FC8, 2 },
+ /* 0xc9 */ { itable_0FC9, 2 },
+ /* 0xca */ { itable_0FCA, 2 },
+ /* 0xcb */ { itable_0FCB, 2 },
+ /* 0xcc */ { itable_0FCC, 2 },
+ /* 0xcd */ { itable_0FCD, 2 },
+ /* 0xce */ { itable_0FCE, 2 },
+ /* 0xcf */ { itable_0FCF, 2 },
+ /* 0xd0 */ { itable_0FD0, 2 },
+ /* 0xd1 */ { itable_0FD1, 2 },
+ /* 0xd2 */ { itable_0FD2, 2 },
+ /* 0xd3 */ { itable_0FD3, 2 },
+ /* 0xd4 */ { itable_0FD4, 2 },
+ /* 0xd5 */ { itable_0FD5, 2 },
+ /* 0xd6 */ { itable_0FD6, 4 },
+ /* 0xd7 */ { itable_0FD7, 2 },
+ /* 0xd8 */ { itable_0FD8, 2 },
+ /* 0xd9 */ { itable_0FD9, 2 },
+ /* 0xda */ { itable_0FDA, 2 },
+ /* 0xdb */ { itable_0FDB, 2 },
+ /* 0xdc */ { itable_0FDC, 2 },
+ /* 0xdd */ { itable_0FDD, 2 },
+ /* 0xde */ { itable_0FDE, 2 },
+ /* 0xdf */ { itable_0FDF, 2 },
+ /* 0xe0 */ { itable_0FE0, 2 },
+ /* 0xe1 */ { itable_0FE1, 2 },
+ /* 0xe2 */ { itable_0FE2, 2 },
+ /* 0xe3 */ { itable_0FE3, 2 },
+ /* 0xe4 */ { itable_0FE4, 2 },
+ /* 0xe5 */ { itable_0FE5, 2 },
+ /* 0xe6 */ { itable_0FE6, 3 },
+ /* 0xe7 */ { itable_0FE7, 2 },
+ /* 0xe8 */ { itable_0FE8, 2 },
+ /* 0xe9 */ { itable_0FE9, 2 },
+ /* 0xea */ { itable_0FEA, 2 },
+ /* 0xeb */ { itable_0FEB, 2 },
+ /* 0xec */ { itable_0FEC, 2 },
+ /* 0xed */ { itable_0FED, 2 },
+ /* 0xee */ { itable_0FEE, 2 },
+ /* 0xef */ { itable_0FEF, 2 },
+ /* 0xf0 */ { itable_0FF0, 1 },
+ /* 0xf1 */ { itable_0FF1, 2 },
+ /* 0xf2 */ { itable_0FF2, 2 },
+ /* 0xf3 */ { itable_0FF3, 2 },
+ /* 0xf4 */ { itable_0FF4, 2 },
+ /* 0xf5 */ { itable_0FF5, 2 },
+ /* 0xf6 */ { itable_0FF6, 2 },
+ /* 0xf7 */ { itable_0FF7, 2 },
+ /* 0xf8 */ { itable_0FF8, 2 },
+ /* 0xf9 */ { itable_0FF9, 2 },
+ /* 0xfa */ { itable_0FFA, 2 },
+ /* 0xfb */ { itable_0FFB, 2 },
+ /* 0xfc */ { itable_0FFC, 2 },
+ /* 0xfd */ { itable_0FFD, 2 },
+ /* 0xfe */ { itable_0FFE, 2 },
+ /* 0xff */ { itable_0FFF, 4 },
+};
+
+const struct disasm_index itable[256] = {
+ /* 0x00 */ { itable_00, 2 },
+ /* 0x01 */ { itable_01, 6 },
+ /* 0x02 */ { itable_02, 2 },
+ /* 0x03 */ { itable_03, 6 },
+ /* 0x04 */ { itable_04, 1 },
+ /* 0x05 */ { itable_05, 3 },
+ /* 0x06 */ { itable_06, 1 },
+ /* 0x07 */ { itable_07, 1 },
+ /* 0x08 */ { itable_08, 2 },
+ /* 0x09 */ { itable_09, 6 },
+ /* 0x0a */ { itable_0A, 2 },
+ /* 0x0b */ { itable_0B, 6 },
+ /* 0x0c */ { itable_0C, 1 },
+ /* 0x0d */ { itable_0D, 3 },
+ /* 0x0e */ { itable_0E, 1 },
+ /* 0x0f */ { itable_0F, -1 },
+ /* 0x10 */ { itable_10, 2 },
+ /* 0x11 */ { itable_11, 6 },
+ /* 0x12 */ { itable_12, 2 },
+ /* 0x13 */ { itable_13, 6 },
+ /* 0x14 */ { itable_14, 1 },
+ /* 0x15 */ { itable_15, 3 },
+ /* 0x16 */ { itable_16, 1 },
+ /* 0x17 */ { itable_17, 1 },
+ /* 0x18 */ { itable_18, 2 },
+ /* 0x19 */ { itable_19, 6 },
+ /* 0x1a */ { itable_1A, 2 },
+ /* 0x1b */ { itable_1B, 6 },
+ /* 0x1c */ { itable_1C, 1 },
+ /* 0x1d */ { itable_1D, 3 },
+ /* 0x1e */ { itable_1E, 1 },
+ /* 0x1f */ { itable_1F, 1 },
+ /* 0x20 */ { itable_20, 2 },
+ /* 0x21 */ { itable_21, 6 },
+ /* 0x22 */ { itable_22, 2 },
+ /* 0x23 */ { itable_23, 6 },
+ /* 0x24 */ { itable_24, 1 },
+ /* 0x25 */ { itable_25, 3 },
+ /* 0x26 */ { NULL, 0 },
+ /* 0x27 */ { itable_27, 1 },
+ /* 0x28 */ { itable_28, 2 },
+ /* 0x29 */ { itable_29, 6 },
+ /* 0x2a */ { itable_2A, 2 },
+ /* 0x2b */ { itable_2B, 6 },
+ /* 0x2c */ { itable_2C, 1 },
+ /* 0x2d */ { itable_2D, 3 },
+ /* 0x2e */ { NULL, 0 },
+ /* 0x2f */ { itable_2F, 1 },
+ /* 0x30 */ { itable_30, 2 },
+ /* 0x31 */ { itable_31, 6 },
+ /* 0x32 */ { itable_32, 2 },
+ /* 0x33 */ { itable_33, 6 },
+ /* 0x34 */ { itable_34, 1 },
+ /* 0x35 */ { itable_35, 3 },
+ /* 0x36 */ { NULL, 0 },
+ /* 0x37 */ { itable_37, 1 },
+ /* 0x38 */ { itable_38, 2 },
+ /* 0x39 */ { itable_39, 6 },
+ /* 0x3a */ { itable_3A, 2 },
+ /* 0x3b */ { itable_3B, 6 },
+ /* 0x3c */ { itable_3C, 1 },
+ /* 0x3d */ { itable_3D, 3 },
+ /* 0x3e */ { NULL, 0 },
+ /* 0x3f */ { itable_3F, 1 },
+ /* 0x40 */ { itable_40, 2 },
+ /* 0x41 */ { itable_41, 2 },
+ /* 0x42 */ { itable_42, 2 },
+ /* 0x43 */ { itable_43, 2 },
+ /* 0x44 */ { itable_44, 2 },
+ /* 0x45 */ { itable_45, 2 },
+ /* 0x46 */ { itable_46, 2 },
+ /* 0x47 */ { itable_47, 2 },
+ /* 0x48 */ { itable_48, 2 },
+ /* 0x49 */ { itable_49, 2 },
+ /* 0x4a */ { itable_4A, 2 },
+ /* 0x4b */ { itable_4B, 2 },
+ /* 0x4c */ { itable_4C, 2 },
+ /* 0x4d */ { itable_4D, 2 },
+ /* 0x4e */ { itable_4E, 2 },
+ /* 0x4f */ { itable_4F, 2 },
+ /* 0x50 */ { itable_50, 3 },
+ /* 0x51 */ { itable_51, 3 },
+ /* 0x52 */ { itable_52, 3 },
+ /* 0x53 */ { itable_53, 3 },
+ /* 0x54 */ { itable_54, 3 },
+ /* 0x55 */ { itable_55, 3 },
+ /* 0x56 */ { itable_56, 3 },
+ /* 0x57 */ { itable_57, 3 },
+ /* 0x58 */ { itable_58, 3 },
+ /* 0x59 */ { itable_59, 3 },
+ /* 0x5a */ { itable_5A, 3 },
+ /* 0x5b */ { itable_5B, 3 },
+ /* 0x5c */ { itable_5C, 3 },
+ /* 0x5d */ { itable_5D, 3 },
+ /* 0x5e */ { itable_5E, 3 },
+ /* 0x5f */ { itable_5F, 3 },
+ /* 0x60 */ { itable_60, 3 },
+ /* 0x61 */ { itable_61, 3 },
+ /* 0x62 */ { itable_62, 2 },
+ /* 0x63 */ { itable_63, 3 },
+ /* 0x64 */ { NULL, 0 },
+ /* 0x65 */ { NULL, 0 },
+ /* 0x66 */ { NULL, 0 },
+ /* 0x67 */ { NULL, 0 },
+ /* 0x68 */ { itable_68, 5 },
+ /* 0x69 */ { itable_69, 9 },
+ /* 0x6a */ { itable_6A, 1 },
+ /* 0x6b */ { itable_6B, 9 },
+ /* 0x6c */ { itable_6C, 1 },
+ /* 0x6d */ { itable_6D, 2 },
+ /* 0x6e */ { itable_6E, 1 },
+ /* 0x6f */ { itable_6F, 2 },
+ /* 0x70 */ { itable_70, 1 },
+ /* 0x71 */ { itable_71, 1 },
+ /* 0x72 */ { itable_72, 1 },
+ /* 0x73 */ { itable_73, 1 },
+ /* 0x74 */ { itable_74, 1 },
+ /* 0x75 */ { itable_75, 1 },
+ /* 0x76 */ { itable_76, 1 },
+ /* 0x77 */ { itable_77, 1 },
+ /* 0x78 */ { itable_78, 1 },
+ /* 0x79 */ { itable_79, 1 },
+ /* 0x7a */ { itable_7A, 1 },
+ /* 0x7b */ { itable_7B, 1 },
+ /* 0x7c */ { itable_7C, 1 },
+ /* 0x7d */ { itable_7D, 1 },
+ /* 0x7e */ { itable_7E, 1 },
+ /* 0x7f */ { itable_7F, 1 },
+ /* 0x80 */ { itable_80, 15 },
+ /* 0x81 */ { itable_81, 40 },
+ /* 0x82 */ { NULL, 0 },
+ /* 0x83 */ { itable_83, 24 },
+ /* 0x84 */ { itable_84, 3 },
+ /* 0x85 */ { itable_85, 9 },
+ /* 0x86 */ { itable_86, 4 },
+ /* 0x87 */ { itable_87, 12 },
+ /* 0x88 */ { itable_88, 2 },
+ /* 0x89 */ { itable_89, 6 },
+ /* 0x8a */ { itable_8A, 2 },
+ /* 0x8b */ { itable_8B, 6 },
+ /* 0x8c */ { itable_8C, 4 },
+ /* 0x8d */ { itable_8D, 3 },
+ /* 0x8e */ { itable_8E, 4 },
+ /* 0x8f */ { itable_8F, 3 },
+ /* 0x90 */ { itable_90, 9 },
+ /* 0x91 */ { itable_91, 6 },
+ /* 0x92 */ { itable_92, 6 },
+ /* 0x93 */ { itable_93, 6 },
+ /* 0x94 */ { itable_94, 6 },
+ /* 0x95 */ { itable_95, 6 },
+ /* 0x96 */ { itable_96, 6 },
+ /* 0x97 */ { itable_97, 6 },
+ /* 0x98 */ { itable_98, 3 },
+ /* 0x99 */ { itable_99, 3 },
+ /* 0x9a */ { itable_9A, 5 },
+ /* 0x9b */ { NULL, 0 },
+ /* 0x9c */ { itable_9C, 4 },
+ /* 0x9d */ { itable_9D, 4 },
+ /* 0x9e */ { itable_9E, 1 },
+ /* 0x9f */ { itable_9F, 1 },
+ /* 0xa0 */ { itable_A0, 1 },
+ /* 0xa1 */ { itable_A1, 3 },
+ /* 0xa2 */ { itable_A2, 1 },
+ /* 0xa3 */ { itable_A3, 3 },
+ /* 0xa4 */ { itable_A4, 1 },
+ /* 0xa5 */ { itable_A5, 3 },
+ /* 0xa6 */ { itable_A6, 1 },
+ /* 0xa7 */ { itable_A7, 3 },
+ /* 0xa8 */ { itable_A8, 1 },
+ /* 0xa9 */ { itable_A9, 3 },
+ /* 0xaa */ { itable_AA, 1 },
+ /* 0xab */ { itable_AB, 3 },
+ /* 0xac */ { itable_AC, 1 },
+ /* 0xad */ { itable_AD, 3 },
+ /* 0xae */ { itable_AE, 1 },
+ /* 0xaf */ { itable_AF, 3 },
+ /* 0xb0 */ { itable_B0, 1 },
+ /* 0xb1 */ { itable_B1, 1 },
+ /* 0xb2 */ { itable_B2, 1 },
+ /* 0xb3 */ { itable_B3, 1 },
+ /* 0xb4 */ { itable_B4, 1 },
+ /* 0xb5 */ { itable_B5, 1 },
+ /* 0xb6 */ { itable_B6, 1 },
+ /* 0xb7 */ { itable_B7, 1 },
+ /* 0xb8 */ { itable_B8, 3 },
+ /* 0xb9 */ { itable_B9, 3 },
+ /* 0xba */ { itable_BA, 3 },
+ /* 0xbb */ { itable_BB, 3 },
+ /* 0xbc */ { itable_BC, 3 },
+ /* 0xbd */ { itable_BD, 3 },
+ /* 0xbe */ { itable_BE, 3 },
+ /* 0xbf */ { itable_BF, 3 },
+ /* 0xc0 */ { itable_C0, 7 },
+ /* 0xc1 */ { itable_C1, 21 },
+ /* 0xc2 */ { itable_C2, 8 },
+ /* 0xc3 */ { itable_C3, 8 },
+ /* 0xc4 */ { itable_C4, 2 },
+ /* 0xc5 */ { itable_C5, 2 },
+ /* 0xc6 */ { itable_C6, 4 },
+ /* 0xc7 */ { itable_C7, 10 },
+ /* 0xc8 */ { itable_C8, 1 },
+ /* 0xc9 */ { itable_C9, 1 },
+ /* 0xca */ { itable_CA, 4 },
+ /* 0xcb */ { itable_CB, 4 },
+ /* 0xcc */ { itable_CC, 1 },
+ /* 0xcd */ { itable_CD, 1 },
+ /* 0xce */ { itable_CE, 1 },
+ /* 0xcf */ { itable_CF, 4 },
+ /* 0xd0 */ { itable_D0, 7 },
+ /* 0xd1 */ { itable_D1, 21 },
+ /* 0xd2 */ { itable_D2, 7 },
+ /* 0xd3 */ { itable_D3, 21 },
+ /* 0xd4 */ { itable_D4, 2 },
+ /* 0xd5 */ { itable_D5, 2 },
+ /* 0xd6 */ { itable_D6, 1 },
+ /* 0xd7 */ { itable_D7, 2 },
+ /* 0xd8 */ { itable_D8, 24 },
+ /* 0xd9 */ { itable_D9, 41 },
+ /* 0xda */ { itable_DA, 17 },
+ /* 0xdb */ { itable_DB, 27 },
+ /* 0xdc */ { itable_DC, 20 },
+ /* 0xdd */ { itable_DD, 17 },
+ /* 0xde */ { itable_DE, 21 },
+ /* 0xdf */ { itable_DF, 18 },
+ /* 0xe0 */ { itable_E0, 8 },
+ /* 0xe1 */ { itable_E1, 8 },
+ /* 0xe2 */ { itable_E2, 4 },
+ /* 0xe3 */ { itable_E3, 3 },
+ /* 0xe4 */ { itable_E4, 1 },
+ /* 0xe5 */ { itable_E5, 2 },
+ /* 0xe6 */ { itable_E6, 1 },
+ /* 0xe7 */ { itable_E7, 2 },
+ /* 0xe8 */ { itable_E8, 4 },
+ /* 0xe9 */ { itable_E9, 4 },
+ /* 0xea */ { itable_EA, 5 },
+ /* 0xeb */ { itable_EB, 1 },
+ /* 0xec */ { itable_EC, 1 },
+ /* 0xed */ { itable_ED, 2 },
+ /* 0xee */ { itable_EE, 1 },
+ /* 0xef */ { itable_EF, 2 },
+ /* 0xf0 */ { NULL, 0 },
+ /* 0xf1 */ { itable_F1, 2 },
+ /* 0xf2 */ { NULL, 0 },
+ /* 0xf3 */ { NULL, 0 },
+ /* 0xf4 */ { itable_F4, 1 },
+ /* 0xf5 */ { itable_F5, 1 },
+ /* 0xf6 */ { itable_F6, 8 },
+ /* 0xf7 */ { itable_F7, 23 },
+ /* 0xf8 */ { itable_F8, 1 },
+ /* 0xf9 */ { itable_F9, 1 },
+ /* 0xfa */ { itable_FA, 1 },
+ /* 0xfb */ { itable_FB, 1 },
+ /* 0xfc */ { itable_FC, 1 },
+ /* 0xfd */ { itable_FD, 1 },
+ /* 0xfe */ { itable_FE, 2 },
+ /* 0xff */ { itable_FF, 27 },
+};
+
+const struct disasm_index * const itable_vex[NASM_VEX_CLASSES][32][4] =
+{
+ {
+ { NULL, NULL, NULL, NULL, },
+ { itable_vex010, itable_vex011, itable_vex012, itable_vex013, },
+ { itable_vex020, itable_vex021, itable_vex022, itable_vex023, },
+ { NULL, itable_vex031, NULL, itable_vex033, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ },
+ {
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { itable_xop080, NULL, NULL, NULL, },
+ { itable_xop090, NULL, NULL, NULL, },
+ { itable_xop0A0, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ },
+ {
+ { NULL, NULL, NULL, NULL, },
+ { itable_evex010,itable_evex011,itable_evex012,itable_evex013,},
+ { NULL, itable_evex021,itable_evex022,itable_evex023,},
+ { NULL, itable_evex031,NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ { NULL, NULL, NULL, NULL, },
+ },
+};
diff --git a/x86/insnsi.h b/x86/insnsi.h
new file mode 100644
index 00000000..44e11a35
--- /dev/null
+++ b/x86/insnsi.h
@@ -0,0 +1,1900 @@
+/* This file is auto-generated from insns.dat by insns.pl - don't edit it */
+
+/* This file in included by nasm.h */
+
+/* Instruction names */
+
+#ifndef NASM_INSNSI_H
+#define NASM_INSNSI_H 1
+
+enum opcode {
+ I_DB,
+ I_DW,
+ I_DD,
+ I_DQ,
+ I_DT,
+ I_DO,
+ I_DY,
+ I_DZ,
+ I_RESB,
+ I_RESW,
+ I_RESD,
+ I_RESQ,
+ I_REST,
+ I_RESO,
+ I_RESY,
+ I_RESZ,
+ I_INCBIN,
+ I_AAA,
+ I_AAD,
+ I_AAM,
+ I_AAS,
+ I_ADC,
+ I_ADD,
+ I_AND,
+ I_ARPL,
+ I_BB0_RESET,
+ I_BB1_RESET,
+ I_BOUND,
+ I_BSF,
+ I_BSR,
+ I_BSWAP,
+ I_BT,
+ I_BTC,
+ I_BTR,
+ I_BTS,
+ I_CALL,
+ I_CBW,
+ I_CDQ,
+ I_CDQE,
+ I_CLC,
+ I_CLD,
+ I_CLI,
+ I_CLTS,
+ I_CMC,
+ I_CMP,
+ I_CMPSB,
+ I_CMPSD,
+ I_CMPSQ,
+ I_CMPSW,
+ I_CMPXCHG,
+ I_CMPXCHG486,
+ I_CMPXCHG8B,
+ I_CMPXCHG16B,
+ I_CPUID,
+ I_CPU_READ,
+ I_CPU_WRITE,
+ I_CQO,
+ I_CWD,
+ I_CWDE,
+ I_DAA,
+ I_DAS,
+ I_DEC,
+ I_DIV,
+ I_DMINT,
+ I_EMMS,
+ I_ENTER,
+ I_EQU,
+ I_F2XM1,
+ I_FABS,
+ I_FADD,
+ I_FADDP,
+ I_FBLD,
+ I_FBSTP,
+ I_FCHS,
+ I_FCLEX,
+ I_FCMOVB,
+ I_FCMOVBE,
+ I_FCMOVE,
+ I_FCMOVNB,
+ I_FCMOVNBE,
+ I_FCMOVNE,
+ I_FCMOVNU,
+ I_FCMOVU,
+ I_FCOM,
+ I_FCOMI,
+ I_FCOMIP,
+ I_FCOMP,
+ I_FCOMPP,
+ I_FCOS,
+ I_FDECSTP,
+ I_FDISI,
+ I_FDIV,
+ I_FDIVP,
+ I_FDIVR,
+ I_FDIVRP,
+ I_FEMMS,
+ I_FENI,
+ I_FFREE,
+ I_FFREEP,
+ I_FIADD,
+ I_FICOM,
+ I_FICOMP,
+ I_FIDIV,
+ I_FIDIVR,
+ I_FILD,
+ I_FIMUL,
+ I_FINCSTP,
+ I_FINIT,
+ I_FIST,
+ I_FISTP,
+ I_FISTTP,
+ I_FISUB,
+ I_FISUBR,
+ I_FLD,
+ I_FLD1,
+ I_FLDCW,
+ I_FLDENV,
+ I_FLDL2E,
+ I_FLDL2T,
+ I_FLDLG2,
+ I_FLDLN2,
+ I_FLDPI,
+ I_FLDZ,
+ I_FMUL,
+ I_FMULP,
+ I_FNCLEX,
+ I_FNDISI,
+ I_FNENI,
+ I_FNINIT,
+ I_FNOP,
+ I_FNSAVE,
+ I_FNSTCW,
+ I_FNSTENV,
+ I_FNSTSW,
+ I_FPATAN,
+ I_FPREM,
+ I_FPREM1,
+ I_FPTAN,
+ I_FRNDINT,
+ I_FRSTOR,
+ I_FSAVE,
+ I_FSCALE,
+ I_FSETPM,
+ I_FSIN,
+ I_FSINCOS,
+ I_FSQRT,
+ I_FST,
+ I_FSTCW,
+ I_FSTENV,
+ I_FSTP,
+ I_FSTSW,
+ I_FSUB,
+ I_FSUBP,
+ I_FSUBR,
+ I_FSUBRP,
+ I_FTST,
+ I_FUCOM,
+ I_FUCOMI,
+ I_FUCOMIP,
+ I_FUCOMP,
+ I_FUCOMPP,
+ I_FXAM,
+ I_FXCH,
+ I_FXTRACT,
+ I_FYL2X,
+ I_FYL2XP1,
+ I_HLT,
+ I_IBTS,
+ I_ICEBP,
+ I_IDIV,
+ I_IMUL,
+ I_IN,
+ I_INC,
+ I_INSB,
+ I_INSD,
+ I_INSW,
+ I_INT,
+ I_INT01,
+ I_INT1,
+ I_INT03,
+ I_INT3,
+ I_INTO,
+ I_INVD,
+ I_INVPCID,
+ I_INVLPG,
+ I_INVLPGA,
+ I_IRET,
+ I_IRETD,
+ I_IRETQ,
+ I_IRETW,
+ I_JCXZ,
+ I_JECXZ,
+ I_JRCXZ,
+ I_JMP,
+ I_JMPE,
+ I_LAHF,
+ I_LAR,
+ I_LDS,
+ I_LEA,
+ I_LEAVE,
+ I_LES,
+ I_LFENCE,
+ I_LFS,
+ I_LGDT,
+ I_LGS,
+ I_LIDT,
+ I_LLDT,
+ I_LMSW,
+ I_LOADALL,
+ I_LOADALL286,
+ I_LODSB,
+ I_LODSD,
+ I_LODSQ,
+ I_LODSW,
+ I_LOOP,
+ I_LOOPE,
+ I_LOOPNE,
+ I_LOOPNZ,
+ I_LOOPZ,
+ I_LSL,
+ I_LSS,
+ I_LTR,
+ I_MFENCE,
+ I_MONITOR,
+ I_MONITORX,
+ I_MOV,
+ I_MOVD,
+ I_MOVQ,
+ I_MOVSB,
+ I_MOVSD,
+ I_MOVSQ,
+ I_MOVSW,
+ I_MOVSX,
+ I_MOVSXD,
+ I_MOVZX,
+ I_MUL,
+ I_MWAIT,
+ I_MWAITX,
+ I_NEG,
+ I_NOP,
+ I_NOT,
+ I_OR,
+ I_OUT,
+ I_OUTSB,
+ I_OUTSD,
+ I_OUTSW,
+ I_PACKSSDW,
+ I_PACKSSWB,
+ I_PACKUSWB,
+ I_PADDB,
+ I_PADDD,
+ I_PADDSB,
+ I_PADDSIW,
+ I_PADDSW,
+ I_PADDUSB,
+ I_PADDUSW,
+ I_PADDW,
+ I_PAND,
+ I_PANDN,
+ I_PAUSE,
+ I_PAVEB,
+ I_PAVGUSB,
+ I_PCMPEQB,
+ I_PCMPEQD,
+ I_PCMPEQW,
+ I_PCMPGTB,
+ I_PCMPGTD,
+ I_PCMPGTW,
+ I_PDISTIB,
+ I_PF2ID,
+ I_PFACC,
+ I_PFADD,
+ I_PFCMPEQ,
+ I_PFCMPGE,
+ I_PFCMPGT,
+ I_PFMAX,
+ I_PFMIN,
+ I_PFMUL,
+ I_PFRCP,
+ I_PFRCPIT1,
+ I_PFRCPIT2,
+ I_PFRSQIT1,
+ I_PFRSQRT,
+ I_PFSUB,
+ I_PFSUBR,
+ I_PI2FD,
+ I_PMACHRIW,
+ I_PMADDWD,
+ I_PMAGW,
+ I_PMULHRIW,
+ I_PMULHRWA,
+ I_PMULHRWC,
+ I_PMULHW,
+ I_PMULLW,
+ I_PMVGEZB,
+ I_PMVLZB,
+ I_PMVNZB,
+ I_PMVZB,
+ I_POP,
+ I_POPA,
+ I_POPAD,
+ I_POPAW,
+ I_POPF,
+ I_POPFD,
+ I_POPFQ,
+ I_POPFW,
+ I_POR,
+ I_PREFETCH,
+ I_PREFETCHW,
+ I_PSLLD,
+ I_PSLLQ,
+ I_PSLLW,
+ I_PSRAD,
+ I_PSRAW,
+ I_PSRLD,
+ I_PSRLQ,
+ I_PSRLW,
+ I_PSUBB,
+ I_PSUBD,
+ I_PSUBSB,
+ I_PSUBSIW,
+ I_PSUBSW,
+ I_PSUBUSB,
+ I_PSUBUSW,
+ I_PSUBW,
+ I_PUNPCKHBW,
+ I_PUNPCKHDQ,
+ I_PUNPCKHWD,
+ I_PUNPCKLBW,
+ I_PUNPCKLDQ,
+ I_PUNPCKLWD,
+ I_PUSH,
+ I_PUSHA,
+ I_PUSHAD,
+ I_PUSHAW,
+ I_PUSHF,
+ I_PUSHFD,
+ I_PUSHFQ,
+ I_PUSHFW,
+ I_PXOR,
+ I_RCL,
+ I_RCR,
+ I_RDSHR,
+ I_RDMSR,
+ I_RDPMC,
+ I_RDTSC,
+ I_RDTSCP,
+ I_RET,
+ I_RETF,
+ I_RETN,
+ I_RETW,
+ I_RETFW,
+ I_RETNW,
+ I_RETD,
+ I_RETFD,
+ I_RETND,
+ I_RETQ,
+ I_RETFQ,
+ I_RETNQ,
+ I_ROL,
+ I_ROR,
+ I_RDM,
+ I_RSDC,
+ I_RSLDT,
+ I_RSM,
+ I_RSTS,
+ I_SAHF,
+ I_SAL,
+ I_SALC,
+ I_SAR,
+ I_SBB,
+ I_SCASB,
+ I_SCASD,
+ I_SCASQ,
+ I_SCASW,
+ I_SFENCE,
+ I_SGDT,
+ I_SHL,
+ I_SHLD,
+ I_SHR,
+ I_SHRD,
+ I_SIDT,
+ I_SLDT,
+ I_SKINIT,
+ I_SMI,
+ I_SMINT,
+ I_SMINTOLD,
+ I_SMSW,
+ I_STC,
+ I_STD,
+ I_STI,
+ I_STOSB,
+ I_STOSD,
+ I_STOSQ,
+ I_STOSW,
+ I_STR,
+ I_SUB,
+ I_SVDC,
+ I_SVLDT,
+ I_SVTS,
+ I_SWAPGS,
+ I_SYSCALL,
+ I_SYSENTER,
+ I_SYSEXIT,
+ I_SYSRET,
+ I_TEST,
+ I_UD0,
+ I_UD1,
+ I_UD2B,
+ I_UD2,
+ I_UD2A,
+ I_UMOV,
+ I_VERR,
+ I_VERW,
+ I_FWAIT,
+ I_WBINVD,
+ I_WRSHR,
+ I_WRMSR,
+ I_XADD,
+ I_XBTS,
+ I_XCHG,
+ I_XLATB,
+ I_XLAT,
+ I_XOR,
+ I_ADDPS,
+ I_ADDSS,
+ I_ANDNPS,
+ I_ANDPS,
+ I_CMPEQPS,
+ I_CMPEQSS,
+ I_CMPLEPS,
+ I_CMPLESS,
+ I_CMPLTPS,
+ I_CMPLTSS,
+ I_CMPNEQPS,
+ I_CMPNEQSS,
+ I_CMPNLEPS,
+ I_CMPNLESS,
+ I_CMPNLTPS,
+ I_CMPNLTSS,
+ I_CMPORDPS,
+ I_CMPORDSS,
+ I_CMPUNORDPS,
+ I_CMPUNORDSS,
+ I_CMPPS,
+ I_CMPSS,
+ I_COMISS,
+ I_CVTPI2PS,
+ I_CVTPS2PI,
+ I_CVTSI2SS,
+ I_CVTSS2SI,
+ I_CVTTPS2PI,
+ I_CVTTSS2SI,
+ I_DIVPS,
+ I_DIVSS,
+ I_LDMXCSR,
+ I_MAXPS,
+ I_MAXSS,
+ I_MINPS,
+ I_MINSS,
+ I_MOVAPS,
+ I_MOVHPS,
+ I_MOVLHPS,
+ I_MOVLPS,
+ I_MOVHLPS,
+ I_MOVMSKPS,
+ I_MOVNTPS,
+ I_MOVSS,
+ I_MOVUPS,
+ I_MULPS,
+ I_MULSS,
+ I_ORPS,
+ I_RCPPS,
+ I_RCPSS,
+ I_RSQRTPS,
+ I_RSQRTSS,
+ I_SHUFPS,
+ I_SQRTPS,
+ I_SQRTSS,
+ I_STMXCSR,
+ I_SUBPS,
+ I_SUBSS,
+ I_UCOMISS,
+ I_UNPCKHPS,
+ I_UNPCKLPS,
+ I_XORPS,
+ I_FXRSTOR,
+ I_FXRSTOR64,
+ I_FXSAVE,
+ I_FXSAVE64,
+ I_XGETBV,
+ I_XSETBV,
+ I_XSAVE,
+ I_XSAVE64,
+ I_XSAVEC,
+ I_XSAVEC64,
+ I_XSAVEOPT,
+ I_XSAVEOPT64,
+ I_XSAVES,
+ I_XSAVES64,
+ I_XRSTOR,
+ I_XRSTOR64,
+ I_XRSTORS,
+ I_XRSTORS64,
+ I_PREFETCHNTA,
+ I_PREFETCHT0,
+ I_PREFETCHT1,
+ I_PREFETCHT2,
+ I_MASKMOVQ,
+ I_MOVNTQ,
+ I_PAVGB,
+ I_PAVGW,
+ I_PEXTRW,
+ I_PINSRW,
+ I_PMAXSW,
+ I_PMAXUB,
+ I_PMINSW,
+ I_PMINUB,
+ I_PMOVMSKB,
+ I_PMULHUW,
+ I_PSADBW,
+ I_PSHUFW,
+ I_PF2IW,
+ I_PFNACC,
+ I_PFPNACC,
+ I_PI2FW,
+ I_PSWAPD,
+ I_MASKMOVDQU,
+ I_CLFLUSH,
+ I_MOVNTDQ,
+ I_MOVNTI,
+ I_MOVNTPD,
+ I_MOVDQA,
+ I_MOVDQU,
+ I_MOVDQ2Q,
+ I_MOVQ2DQ,
+ I_PADDQ,
+ I_PMULUDQ,
+ I_PSHUFD,
+ I_PSHUFHW,
+ I_PSHUFLW,
+ I_PSLLDQ,
+ I_PSRLDQ,
+ I_PSUBQ,
+ I_PUNPCKHQDQ,
+ I_PUNPCKLQDQ,
+ I_ADDPD,
+ I_ADDSD,
+ I_ANDNPD,
+ I_ANDPD,
+ I_CMPEQPD,
+ I_CMPEQSD,
+ I_CMPLEPD,
+ I_CMPLESD,
+ I_CMPLTPD,
+ I_CMPLTSD,
+ I_CMPNEQPD,
+ I_CMPNEQSD,
+ I_CMPNLEPD,
+ I_CMPNLESD,
+ I_CMPNLTPD,
+ I_CMPNLTSD,
+ I_CMPORDPD,
+ I_CMPORDSD,
+ I_CMPUNORDPD,
+ I_CMPUNORDSD,
+ I_CMPPD,
+ I_COMISD,
+ I_CVTDQ2PD,
+ I_CVTDQ2PS,
+ I_CVTPD2DQ,
+ I_CVTPD2PI,
+ I_CVTPD2PS,
+ I_CVTPI2PD,
+ I_CVTPS2DQ,
+ I_CVTPS2PD,
+ I_CVTSD2SI,
+ I_CVTSD2SS,
+ I_CVTSI2SD,
+ I_CVTSS2SD,
+ I_CVTTPD2PI,
+ I_CVTTPD2DQ,
+ I_CVTTPS2DQ,
+ I_CVTTSD2SI,
+ I_DIVPD,
+ I_DIVSD,
+ I_MAXPD,
+ I_MAXSD,
+ I_MINPD,
+ I_MINSD,
+ I_MOVAPD,
+ I_MOVHPD,
+ I_MOVLPD,
+ I_MOVMSKPD,
+ I_MOVUPD,
+ I_MULPD,
+ I_MULSD,
+ I_ORPD,
+ I_SHUFPD,
+ I_SQRTPD,
+ I_SQRTSD,
+ I_SUBPD,
+ I_SUBSD,
+ I_UCOMISD,
+ I_UNPCKHPD,
+ I_UNPCKLPD,
+ I_XORPD,
+ I_ADDSUBPD,
+ I_ADDSUBPS,
+ I_HADDPD,
+ I_HADDPS,
+ I_HSUBPD,
+ I_HSUBPS,
+ I_LDDQU,
+ I_MOVDDUP,
+ I_MOVSHDUP,
+ I_MOVSLDUP,
+ I_CLGI,
+ I_STGI,
+ I_VMCALL,
+ I_VMCLEAR,
+ I_VMFUNC,
+ I_VMLAUNCH,
+ I_VMLOAD,
+ I_VMMCALL,
+ I_VMPTRLD,
+ I_VMPTRST,
+ I_VMREAD,
+ I_VMRESUME,
+ I_VMRUN,
+ I_VMSAVE,
+ I_VMWRITE,
+ I_VMXOFF,
+ I_VMXON,
+ I_INVEPT,
+ I_INVVPID,
+ I_PABSB,
+ I_PABSW,
+ I_PABSD,
+ I_PALIGNR,
+ I_PHADDW,
+ I_PHADDD,
+ I_PHADDSW,
+ I_PHSUBW,
+ I_PHSUBD,
+ I_PHSUBSW,
+ I_PMADDUBSW,
+ I_PMULHRSW,
+ I_PSHUFB,
+ I_PSIGNB,
+ I_PSIGNW,
+ I_PSIGND,
+ I_EXTRQ,
+ I_INSERTQ,
+ I_MOVNTSD,
+ I_MOVNTSS,
+ I_LZCNT,
+ I_BLENDPD,
+ I_BLENDPS,
+ I_BLENDVPD,
+ I_BLENDVPS,
+ I_DPPD,
+ I_DPPS,
+ I_EXTRACTPS,
+ I_INSERTPS,
+ I_MOVNTDQA,
+ I_MPSADBW,
+ I_PACKUSDW,
+ I_PBLENDVB,
+ I_PBLENDW,
+ I_PCMPEQQ,
+ I_PEXTRB,
+ I_PEXTRD,
+ I_PEXTRQ,
+ I_PHMINPOSUW,
+ I_PINSRB,
+ I_PINSRD,
+ I_PINSRQ,
+ I_PMAXSB,
+ I_PMAXSD,
+ I_PMAXUD,
+ I_PMAXUW,
+ I_PMINSB,
+ I_PMINSD,
+ I_PMINUD,
+ I_PMINUW,
+ I_PMOVSXBW,
+ I_PMOVSXBD,
+ I_PMOVSXBQ,
+ I_PMOVSXWD,
+ I_PMOVSXWQ,
+ I_PMOVSXDQ,
+ I_PMOVZXBW,
+ I_PMOVZXBD,
+ I_PMOVZXBQ,
+ I_PMOVZXWD,
+ I_PMOVZXWQ,
+ I_PMOVZXDQ,
+ I_PMULDQ,
+ I_PMULLD,
+ I_PTEST,
+ I_ROUNDPD,
+ I_ROUNDPS,
+ I_ROUNDSD,
+ I_ROUNDSS,
+ I_CRC32,
+ I_PCMPESTRI,
+ I_PCMPESTRM,
+ I_PCMPISTRI,
+ I_PCMPISTRM,
+ I_PCMPGTQ,
+ I_POPCNT,
+ I_GETSEC,
+ I_PFRCPV,
+ I_PFRSQRTV,
+ I_MOVBE,
+ I_AESENC,
+ I_AESENCLAST,
+ I_AESDEC,
+ I_AESDECLAST,
+ I_AESIMC,
+ I_AESKEYGENASSIST,
+ I_VAESENC,
+ I_VAESENCLAST,
+ I_VAESDEC,
+ I_VAESDECLAST,
+ I_VAESIMC,
+ I_VAESKEYGENASSIST,
+ I_VADDPD,
+ I_VADDPS,
+ I_VADDSD,
+ I_VADDSS,
+ I_VADDSUBPD,
+ I_VADDSUBPS,
+ I_VANDPD,
+ I_VANDPS,
+ I_VANDNPD,
+ I_VANDNPS,
+ I_VBLENDPD,
+ I_VBLENDPS,
+ I_VBLENDVPD,
+ I_VBLENDVPS,
+ I_VBROADCASTSS,
+ I_VBROADCASTSD,
+ I_VBROADCASTF128,
+ I_VCMPEQ_OSPD,
+ I_VCMPEQPD,
+ I_VCMPLT_OSPD,
+ I_VCMPLTPD,
+ I_VCMPLE_OSPD,
+ I_VCMPLEPD,
+ I_VCMPUNORD_QPD,
+ I_VCMPUNORDPD,
+ I_VCMPNEQ_UQPD,
+ I_VCMPNEQPD,
+ I_VCMPNLT_USPD,
+ I_VCMPNLTPD,
+ I_VCMPNLE_USPD,
+ I_VCMPNLEPD,
+ I_VCMPORD_QPD,
+ I_VCMPORDPD,
+ I_VCMPEQ_UQPD,
+ I_VCMPNGE_USPD,
+ I_VCMPNGEPD,
+ I_VCMPNGT_USPD,
+ I_VCMPNGTPD,
+ I_VCMPFALSE_OQPD,
+ I_VCMPFALSEPD,
+ I_VCMPNEQ_OQPD,
+ I_VCMPGE_OSPD,
+ I_VCMPGEPD,
+ I_VCMPGT_OSPD,
+ I_VCMPGTPD,
+ I_VCMPTRUE_UQPD,
+ I_VCMPTRUEPD,
+ I_VCMPLT_OQPD,
+ I_VCMPLE_OQPD,
+ I_VCMPUNORD_SPD,
+ I_VCMPNEQ_USPD,
+ I_VCMPNLT_UQPD,
+ I_VCMPNLE_UQPD,
+ I_VCMPORD_SPD,
+ I_VCMPEQ_USPD,
+ I_VCMPNGE_UQPD,
+ I_VCMPNGT_UQPD,
+ I_VCMPFALSE_OSPD,
+ I_VCMPNEQ_OSPD,
+ I_VCMPGE_OQPD,
+ I_VCMPGT_OQPD,
+ I_VCMPTRUE_USPD,
+ I_VCMPPD,
+ I_VCMPEQ_OSPS,
+ I_VCMPEQPS,
+ I_VCMPLT_OSPS,
+ I_VCMPLTPS,
+ I_VCMPLE_OSPS,
+ I_VCMPLEPS,
+ I_VCMPUNORD_QPS,
+ I_VCMPUNORDPS,
+ I_VCMPNEQ_UQPS,
+ I_VCMPNEQPS,
+ I_VCMPNLT_USPS,
+ I_VCMPNLTPS,
+ I_VCMPNLE_USPS,
+ I_VCMPNLEPS,
+ I_VCMPORD_QPS,
+ I_VCMPORDPS,
+ I_VCMPEQ_UQPS,
+ I_VCMPNGE_USPS,
+ I_VCMPNGEPS,
+ I_VCMPNGT_USPS,
+ I_VCMPNGTPS,
+ I_VCMPFALSE_OQPS,
+ I_VCMPFALSEPS,
+ I_VCMPNEQ_OQPS,
+ I_VCMPGE_OSPS,
+ I_VCMPGEPS,
+ I_VCMPGT_OSPS,
+ I_VCMPGTPS,
+ I_VCMPTRUE_UQPS,
+ I_VCMPTRUEPS,
+ I_VCMPLT_OQPS,
+ I_VCMPLE_OQPS,
+ I_VCMPUNORD_SPS,
+ I_VCMPNEQ_USPS,
+ I_VCMPNLT_UQPS,
+ I_VCMPNLE_UQPS,
+ I_VCMPORD_SPS,
+ I_VCMPEQ_USPS,
+ I_VCMPNGE_UQPS,
+ I_VCMPNGT_UQPS,
+ I_VCMPFALSE_OSPS,
+ I_VCMPNEQ_OSPS,
+ I_VCMPGE_OQPS,
+ I_VCMPGT_OQPS,
+ I_VCMPTRUE_USPS,
+ I_VCMPPS,
+ I_VCMPEQ_OSSD,
+ I_VCMPEQSD,
+ I_VCMPLT_OSSD,
+ I_VCMPLTSD,
+ I_VCMPLE_OSSD,
+ I_VCMPLESD,
+ I_VCMPUNORD_QSD,
+ I_VCMPUNORDSD,
+ I_VCMPNEQ_UQSD,
+ I_VCMPNEQSD,
+ I_VCMPNLT_USSD,
+ I_VCMPNLTSD,
+ I_VCMPNLE_USSD,
+ I_VCMPNLESD,
+ I_VCMPORD_QSD,
+ I_VCMPORDSD,
+ I_VCMPEQ_UQSD,
+ I_VCMPNGE_USSD,
+ I_VCMPNGESD,
+ I_VCMPNGT_USSD,
+ I_VCMPNGTSD,
+ I_VCMPFALSE_OQSD,
+ I_VCMPFALSESD,
+ I_VCMPNEQ_OQSD,
+ I_VCMPGE_OSSD,
+ I_VCMPGESD,
+ I_VCMPGT_OSSD,
+ I_VCMPGTSD,
+ I_VCMPTRUE_UQSD,
+ I_VCMPTRUESD,
+ I_VCMPLT_OQSD,
+ I_VCMPLE_OQSD,
+ I_VCMPUNORD_SSD,
+ I_VCMPNEQ_USSD,
+ I_VCMPNLT_UQSD,
+ I_VCMPNLE_UQSD,
+ I_VCMPORD_SSD,
+ I_VCMPEQ_USSD,
+ I_VCMPNGE_UQSD,
+ I_VCMPNGT_UQSD,
+ I_VCMPFALSE_OSSD,
+ I_VCMPNEQ_OSSD,
+ I_VCMPGE_OQSD,
+ I_VCMPGT_OQSD,
+ I_VCMPTRUE_USSD,
+ I_VCMPSD,
+ I_VCMPEQ_OSSS,
+ I_VCMPEQSS,
+ I_VCMPLT_OSSS,
+ I_VCMPLTSS,
+ I_VCMPLE_OSSS,
+ I_VCMPLESS,
+ I_VCMPUNORD_QSS,
+ I_VCMPUNORDSS,
+ I_VCMPNEQ_UQSS,
+ I_VCMPNEQSS,
+ I_VCMPNLT_USSS,
+ I_VCMPNLTSS,
+ I_VCMPNLE_USSS,
+ I_VCMPNLESS,
+ I_VCMPORD_QSS,
+ I_VCMPORDSS,
+ I_VCMPEQ_UQSS,
+ I_VCMPNGE_USSS,
+ I_VCMPNGESS,
+ I_VCMPNGT_USSS,
+ I_VCMPNGTSS,
+ I_VCMPFALSE_OQSS,
+ I_VCMPFALSESS,
+ I_VCMPNEQ_OQSS,
+ I_VCMPGE_OSSS,
+ I_VCMPGESS,
+ I_VCMPGT_OSSS,
+ I_VCMPGTSS,
+ I_VCMPTRUE_UQSS,
+ I_VCMPTRUESS,
+ I_VCMPLT_OQSS,
+ I_VCMPLE_OQSS,
+ I_VCMPUNORD_SSS,
+ I_VCMPNEQ_USSS,
+ I_VCMPNLT_UQSS,
+ I_VCMPNLE_UQSS,
+ I_VCMPORD_SSS,
+ I_VCMPEQ_USSS,
+ I_VCMPNGE_UQSS,
+ I_VCMPNGT_UQSS,
+ I_VCMPFALSE_OSSS,
+ I_VCMPNEQ_OSSS,
+ I_VCMPGE_OQSS,
+ I_VCMPGT_OQSS,
+ I_VCMPTRUE_USSS,
+ I_VCMPSS,
+ I_VCOMISD,
+ I_VCOMISS,
+ I_VCVTDQ2PD,
+ I_VCVTDQ2PS,
+ I_VCVTPD2DQ,
+ I_VCVTPD2PS,
+ I_VCVTPS2DQ,
+ I_VCVTPS2PD,
+ I_VCVTSD2SI,
+ I_VCVTSD2SS,
+ I_VCVTSI2SD,
+ I_VCVTSI2SS,
+ I_VCVTSS2SD,
+ I_VCVTSS2SI,
+ I_VCVTTPD2DQ,
+ I_VCVTTPS2DQ,
+ I_VCVTTSD2SI,
+ I_VCVTTSS2SI,
+ I_VDIVPD,
+ I_VDIVPS,
+ I_VDIVSD,
+ I_VDIVSS,
+ I_VDPPD,
+ I_VDPPS,
+ I_VEXTRACTF128,
+ I_VEXTRACTPS,
+ I_VHADDPD,
+ I_VHADDPS,
+ I_VHSUBPD,
+ I_VHSUBPS,
+ I_VINSERTF128,
+ I_VINSERTPS,
+ I_VLDDQU,
+ I_VLDQQU,
+ I_VLDMXCSR,
+ I_VMASKMOVDQU,
+ I_VMASKMOVPS,
+ I_VMASKMOVPD,
+ I_VMAXPD,
+ I_VMAXPS,
+ I_VMAXSD,
+ I_VMAXSS,
+ I_VMINPD,
+ I_VMINPS,
+ I_VMINSD,
+ I_VMINSS,
+ I_VMOVAPD,
+ I_VMOVAPS,
+ I_VMOVD,
+ I_VMOVQ,
+ I_VMOVDDUP,
+ I_VMOVDQA,
+ I_VMOVQQA,
+ I_VMOVDQU,
+ I_VMOVQQU,
+ I_VMOVHLPS,
+ I_VMOVHPD,
+ I_VMOVHPS,
+ I_VMOVLHPS,
+ I_VMOVLPD,
+ I_VMOVLPS,
+ I_VMOVMSKPD,
+ I_VMOVMSKPS,
+ I_VMOVNTDQ,
+ I_VMOVNTQQ,
+ I_VMOVNTDQA,
+ I_VMOVNTPD,
+ I_VMOVNTPS,
+ I_VMOVSD,
+ I_VMOVSHDUP,
+ I_VMOVSLDUP,
+ I_VMOVSS,
+ I_VMOVUPD,
+ I_VMOVUPS,
+ I_VMPSADBW,
+ I_VMULPD,
+ I_VMULPS,
+ I_VMULSD,
+ I_VMULSS,
+ I_VORPD,
+ I_VORPS,
+ I_VPABSB,
+ I_VPABSW,
+ I_VPABSD,
+ I_VPACKSSWB,
+ I_VPACKSSDW,
+ I_VPACKUSWB,
+ I_VPACKUSDW,
+ I_VPADDB,
+ I_VPADDW,
+ I_VPADDD,
+ I_VPADDQ,
+ I_VPADDSB,
+ I_VPADDSW,
+ I_VPADDUSB,
+ I_VPADDUSW,
+ I_VPALIGNR,
+ I_VPAND,
+ I_VPANDN,
+ I_VPAVGB,
+ I_VPAVGW,
+ I_VPBLENDVB,
+ I_VPBLENDW,
+ I_VPCMPESTRI,
+ I_VPCMPESTRM,
+ I_VPCMPISTRI,
+ I_VPCMPISTRM,
+ I_VPCMPEQB,
+ I_VPCMPEQW,
+ I_VPCMPEQD,
+ I_VPCMPEQQ,
+ I_VPCMPGTB,
+ I_VPCMPGTW,
+ I_VPCMPGTD,
+ I_VPCMPGTQ,
+ I_VPERMILPD,
+ I_VPERMILPS,
+ I_VPERM2F128,
+ I_VPEXTRB,
+ I_VPEXTRW,
+ I_VPEXTRD,
+ I_VPEXTRQ,
+ I_VPHADDW,
+ I_VPHADDD,
+ I_VPHADDSW,
+ I_VPHMINPOSUW,
+ I_VPHSUBW,
+ I_VPHSUBD,
+ I_VPHSUBSW,
+ I_VPINSRB,
+ I_VPINSRW,
+ I_VPINSRD,
+ I_VPINSRQ,
+ I_VPMADDWD,
+ I_VPMADDUBSW,
+ I_VPMAXSB,
+ I_VPMAXSW,
+ I_VPMAXSD,
+ I_VPMAXUB,
+ I_VPMAXUW,
+ I_VPMAXUD,
+ I_VPMINSB,
+ I_VPMINSW,
+ I_VPMINSD,
+ I_VPMINUB,
+ I_VPMINUW,
+ I_VPMINUD,
+ I_VPMOVMSKB,
+ I_VPMOVSXBW,
+ I_VPMOVSXBD,
+ I_VPMOVSXBQ,
+ I_VPMOVSXWD,
+ I_VPMOVSXWQ,
+ I_VPMOVSXDQ,
+ I_VPMOVZXBW,
+ I_VPMOVZXBD,
+ I_VPMOVZXBQ,
+ I_VPMOVZXWD,
+ I_VPMOVZXWQ,
+ I_VPMOVZXDQ,
+ I_VPMULHUW,
+ I_VPMULHRSW,
+ I_VPMULHW,
+ I_VPMULLW,
+ I_VPMULLD,
+ I_VPMULUDQ,
+ I_VPMULDQ,
+ I_VPOR,
+ I_VPSADBW,
+ I_VPSHUFB,
+ I_VPSHUFD,
+ I_VPSHUFHW,
+ I_VPSHUFLW,
+ I_VPSIGNB,
+ I_VPSIGNW,
+ I_VPSIGND,
+ I_VPSLLDQ,
+ I_VPSRLDQ,
+ I_VPSLLW,
+ I_VPSLLD,
+ I_VPSLLQ,
+ I_VPSRAW,
+ I_VPSRAD,
+ I_VPSRLW,
+ I_VPSRLD,
+ I_VPSRLQ,
+ I_VPTEST,
+ I_VPSUBB,
+ I_VPSUBW,
+ I_VPSUBD,
+ I_VPSUBQ,
+ I_VPSUBSB,
+ I_VPSUBSW,
+ I_VPSUBUSB,
+ I_VPSUBUSW,
+ I_VPUNPCKHBW,
+ I_VPUNPCKHWD,
+ I_VPUNPCKHDQ,
+ I_VPUNPCKHQDQ,
+ I_VPUNPCKLBW,
+ I_VPUNPCKLWD,
+ I_VPUNPCKLDQ,
+ I_VPUNPCKLQDQ,
+ I_VPXOR,
+ I_VRCPPS,
+ I_VRCPSS,
+ I_VRSQRTPS,
+ I_VRSQRTSS,
+ I_VROUNDPD,
+ I_VROUNDPS,
+ I_VROUNDSD,
+ I_VROUNDSS,
+ I_VSHUFPD,
+ I_VSHUFPS,
+ I_VSQRTPD,
+ I_VSQRTPS,
+ I_VSQRTSD,
+ I_VSQRTSS,
+ I_VSTMXCSR,
+ I_VSUBPD,
+ I_VSUBPS,
+ I_VSUBSD,
+ I_VSUBSS,
+ I_VTESTPS,
+ I_VTESTPD,
+ I_VUCOMISD,
+ I_VUCOMISS,
+ I_VUNPCKHPD,
+ I_VUNPCKHPS,
+ I_VUNPCKLPD,
+ I_VUNPCKLPS,
+ I_VXORPD,
+ I_VXORPS,
+ I_VZEROALL,
+ I_VZEROUPPER,
+ I_PCLMULLQLQDQ,
+ I_PCLMULHQLQDQ,
+ I_PCLMULLQHQDQ,
+ I_PCLMULHQHQDQ,
+ I_PCLMULQDQ,
+ I_VPCLMULLQLQDQ,
+ I_VPCLMULHQLQDQ,
+ I_VPCLMULLQHQDQ,
+ I_VPCLMULHQHQDQ,
+ I_VPCLMULQDQ,
+ I_VFMADD132PS,
+ I_VFMADD132PD,
+ I_VFMADD312PS,
+ I_VFMADD312PD,
+ I_VFMADD213PS,
+ I_VFMADD213PD,
+ I_VFMADD123PS,
+ I_VFMADD123PD,
+ I_VFMADD231PS,
+ I_VFMADD231PD,
+ I_VFMADD321PS,
+ I_VFMADD321PD,
+ I_VFMADDSUB132PS,
+ I_VFMADDSUB132PD,
+ I_VFMADDSUB312PS,
+ I_VFMADDSUB312PD,
+ I_VFMADDSUB213PS,
+ I_VFMADDSUB213PD,
+ I_VFMADDSUB123PS,
+ I_VFMADDSUB123PD,
+ I_VFMADDSUB231PS,
+ I_VFMADDSUB231PD,
+ I_VFMADDSUB321PS,
+ I_VFMADDSUB321PD,
+ I_VFMSUB132PS,
+ I_VFMSUB132PD,
+ I_VFMSUB312PS,
+ I_VFMSUB312PD,
+ I_VFMSUB213PS,
+ I_VFMSUB213PD,
+ I_VFMSUB123PS,
+ I_VFMSUB123PD,
+ I_VFMSUB231PS,
+ I_VFMSUB231PD,
+ I_VFMSUB321PS,
+ I_VFMSUB321PD,
+ I_VFMSUBADD132PS,
+ I_VFMSUBADD132PD,
+ I_VFMSUBADD312PS,
+ I_VFMSUBADD312PD,
+ I_VFMSUBADD213PS,
+ I_VFMSUBADD213PD,
+ I_VFMSUBADD123PS,
+ I_VFMSUBADD123PD,
+ I_VFMSUBADD231PS,
+ I_VFMSUBADD231PD,
+ I_VFMSUBADD321PS,
+ I_VFMSUBADD321PD,
+ I_VFNMADD132PS,
+ I_VFNMADD132PD,
+ I_VFNMADD312PS,
+ I_VFNMADD312PD,
+ I_VFNMADD213PS,
+ I_VFNMADD213PD,
+ I_VFNMADD123PS,
+ I_VFNMADD123PD,
+ I_VFNMADD231PS,
+ I_VFNMADD231PD,
+ I_VFNMADD321PS,
+ I_VFNMADD321PD,
+ I_VFNMSUB132PS,
+ I_VFNMSUB132PD,
+ I_VFNMSUB312PS,
+ I_VFNMSUB312PD,
+ I_VFNMSUB213PS,
+ I_VFNMSUB213PD,
+ I_VFNMSUB123PS,
+ I_VFNMSUB123PD,
+ I_VFNMSUB231PS,
+ I_VFNMSUB231PD,
+ I_VFNMSUB321PS,
+ I_VFNMSUB321PD,
+ I_VFMADD132SS,
+ I_VFMADD132SD,
+ I_VFMADD312SS,
+ I_VFMADD312SD,
+ I_VFMADD213SS,
+ I_VFMADD213SD,
+ I_VFMADD123SS,
+ I_VFMADD123SD,
+ I_VFMADD231SS,
+ I_VFMADD231SD,
+ I_VFMADD321SS,
+ I_VFMADD321SD,
+ I_VFMSUB132SS,
+ I_VFMSUB132SD,
+ I_VFMSUB312SS,
+ I_VFMSUB312SD,
+ I_VFMSUB213SS,
+ I_VFMSUB213SD,
+ I_VFMSUB123SS,
+ I_VFMSUB123SD,
+ I_VFMSUB231SS,
+ I_VFMSUB231SD,
+ I_VFMSUB321SS,
+ I_VFMSUB321SD,
+ I_VFNMADD132SS,
+ I_VFNMADD132SD,
+ I_VFNMADD312SS,
+ I_VFNMADD312SD,
+ I_VFNMADD213SS,
+ I_VFNMADD213SD,
+ I_VFNMADD123SS,
+ I_VFNMADD123SD,
+ I_VFNMADD231SS,
+ I_VFNMADD231SD,
+ I_VFNMADD321SS,
+ I_VFNMADD321SD,
+ I_VFNMSUB132SS,
+ I_VFNMSUB132SD,
+ I_VFNMSUB312SS,
+ I_VFNMSUB312SD,
+ I_VFNMSUB213SS,
+ I_VFNMSUB213SD,
+ I_VFNMSUB123SS,
+ I_VFNMSUB123SD,
+ I_VFNMSUB231SS,
+ I_VFNMSUB231SD,
+ I_VFNMSUB321SS,
+ I_VFNMSUB321SD,
+ I_RDFSBASE,
+ I_RDGSBASE,
+ I_RDRAND,
+ I_WRFSBASE,
+ I_WRGSBASE,
+ I_VCVTPH2PS,
+ I_VCVTPS2PH,
+ I_ADCX,
+ I_ADOX,
+ I_RDSEED,
+ I_CLAC,
+ I_STAC,
+ I_XSTORE,
+ I_XCRYPTECB,
+ I_XCRYPTCBC,
+ I_XCRYPTCTR,
+ I_XCRYPTCFB,
+ I_XCRYPTOFB,
+ I_MONTMUL,
+ I_XSHA1,
+ I_XSHA256,
+ I_LLWPCB,
+ I_SLWPCB,
+ I_LWPVAL,
+ I_LWPINS,
+ I_VFMADDPD,
+ I_VFMADDPS,
+ I_VFMADDSD,
+ I_VFMADDSS,
+ I_VFMADDSUBPD,
+ I_VFMADDSUBPS,
+ I_VFMSUBADDPD,
+ I_VFMSUBADDPS,
+ I_VFMSUBPD,
+ I_VFMSUBPS,
+ I_VFMSUBSD,
+ I_VFMSUBSS,
+ I_VFNMADDPD,
+ I_VFNMADDPS,
+ I_VFNMADDSD,
+ I_VFNMADDSS,
+ I_VFNMSUBPD,
+ I_VFNMSUBPS,
+ I_VFNMSUBSD,
+ I_VFNMSUBSS,
+ I_VFRCZPD,
+ I_VFRCZPS,
+ I_VFRCZSD,
+ I_VFRCZSS,
+ I_VPCMOV,
+ I_VPCOMB,
+ I_VPCOMD,
+ I_VPCOMQ,
+ I_VPCOMUB,
+ I_VPCOMUD,
+ I_VPCOMUQ,
+ I_VPCOMUW,
+ I_VPCOMW,
+ I_VPHADDBD,
+ I_VPHADDBQ,
+ I_VPHADDBW,
+ I_VPHADDDQ,
+ I_VPHADDUBD,
+ I_VPHADDUBQ,
+ I_VPHADDUBW,
+ I_VPHADDUDQ,
+ I_VPHADDUWD,
+ I_VPHADDUWQ,
+ I_VPHADDWD,
+ I_VPHADDWQ,
+ I_VPHSUBBW,
+ I_VPHSUBDQ,
+ I_VPHSUBWD,
+ I_VPMACSDD,
+ I_VPMACSDQH,
+ I_VPMACSDQL,
+ I_VPMACSSDD,
+ I_VPMACSSDQH,
+ I_VPMACSSDQL,
+ I_VPMACSSWD,
+ I_VPMACSSWW,
+ I_VPMACSWD,
+ I_VPMACSWW,
+ I_VPMADCSSWD,
+ I_VPMADCSWD,
+ I_VPPERM,
+ I_VPROTB,
+ I_VPROTD,
+ I_VPROTQ,
+ I_VPROTW,
+ I_VPSHAB,
+ I_VPSHAD,
+ I_VPSHAQ,
+ I_VPSHAW,
+ I_VPSHLB,
+ I_VPSHLD,
+ I_VPSHLQ,
+ I_VPSHLW,
+ I_VBROADCASTI128,
+ I_VPBLENDD,
+ I_VPBROADCASTB,
+ I_VPBROADCASTW,
+ I_VPBROADCASTD,
+ I_VPBROADCASTQ,
+ I_VPERMD,
+ I_VPERMPD,
+ I_VPERMPS,
+ I_VPERMQ,
+ I_VPERM2I128,
+ I_VEXTRACTI128,
+ I_VINSERTI128,
+ I_VPMASKMOVD,
+ I_VPMASKMOVQ,
+ I_VPSLLVD,
+ I_VPSLLVQ,
+ I_VPSRAVD,
+ I_VPSRLVD,
+ I_VPSRLVQ,
+ I_VGATHERDPD,
+ I_VGATHERQPD,
+ I_VGATHERDPS,
+ I_VGATHERQPS,
+ I_VPGATHERDD,
+ I_VPGATHERQD,
+ I_VPGATHERDQ,
+ I_VPGATHERQQ,
+ I_XABORT,
+ I_XBEGIN,
+ I_XEND,
+ I_XTEST,
+ I_ANDN,
+ I_BEXTR,
+ I_BLCI,
+ I_BLCIC,
+ I_BLSI,
+ I_BLSIC,
+ I_BLCFILL,
+ I_BLSFILL,
+ I_BLCMSK,
+ I_BLSMSK,
+ I_BLSR,
+ I_BLCS,
+ I_BZHI,
+ I_MULX,
+ I_PDEP,
+ I_PEXT,
+ I_RORX,
+ I_SARX,
+ I_SHLX,
+ I_SHRX,
+ I_TZCNT,
+ I_TZMSK,
+ I_T1MSKC,
+ I_PREFETCHWT1,
+ I_BNDMK,
+ I_BNDCL,
+ I_BNDCU,
+ I_BNDCN,
+ I_BNDMOV,
+ I_BNDLDX,
+ I_BNDSTX,
+ I_SHA1MSG1,
+ I_SHA1MSG2,
+ I_SHA1NEXTE,
+ I_SHA1RNDS4,
+ I_SHA256MSG1,
+ I_SHA256MSG2,
+ I_SHA256RNDS2,
+ I_KADDB,
+ I_KADDD,
+ I_KADDQ,
+ I_KADDW,
+ I_KANDB,
+ I_KANDD,
+ I_KANDNB,
+ I_KANDND,
+ I_KANDNQ,
+ I_KANDNW,
+ I_KANDQ,
+ I_KANDW,
+ I_KMOVB,
+ I_KMOVD,
+ I_KMOVQ,
+ I_KMOVW,
+ I_KNOTB,
+ I_KNOTD,
+ I_KNOTQ,
+ I_KNOTW,
+ I_KORB,
+ I_KORD,
+ I_KORQ,
+ I_KORTESTB,
+ I_KORTESTD,
+ I_KORTESTQ,
+ I_KORTESTW,
+ I_KORW,
+ I_KSHIFTLB,
+ I_KSHIFTLD,
+ I_KSHIFTLQ,
+ I_KSHIFTLW,
+ I_KSHIFTRB,
+ I_KSHIFTRD,
+ I_KSHIFTRQ,
+ I_KSHIFTRW,
+ I_KTESTB,
+ I_KTESTD,
+ I_KTESTQ,
+ I_KTESTW,
+ I_KUNPCKBW,
+ I_KUNPCKDQ,
+ I_KUNPCKWD,
+ I_KXNORB,
+ I_KXNORD,
+ I_KXNORQ,
+ I_KXNORW,
+ I_KXORB,
+ I_KXORD,
+ I_KXORQ,
+ I_KXORW,
+ I_VALIGND,
+ I_VALIGNQ,
+ I_VBLENDMPD,
+ I_VBLENDMPS,
+ I_VBROADCASTF32X2,
+ I_VBROADCASTF32X4,
+ I_VBROADCASTF32X8,
+ I_VBROADCASTF64X2,
+ I_VBROADCASTF64X4,
+ I_VBROADCASTI32X2,
+ I_VBROADCASTI32X4,
+ I_VBROADCASTI32X8,
+ I_VBROADCASTI64X2,
+ I_VBROADCASTI64X4,
+ I_VCOMPRESSPD,
+ I_VCOMPRESSPS,
+ I_VCVTPD2QQ,
+ I_VCVTPD2UDQ,
+ I_VCVTPD2UQQ,
+ I_VCVTPS2QQ,
+ I_VCVTPS2UDQ,
+ I_VCVTPS2UQQ,
+ I_VCVTQQ2PD,
+ I_VCVTQQ2PS,
+ I_VCVTSD2USI,
+ I_VCVTSS2USI,
+ I_VCVTTPD2QQ,
+ I_VCVTTPD2UDQ,
+ I_VCVTTPD2UQQ,
+ I_VCVTTPS2QQ,
+ I_VCVTTPS2UDQ,
+ I_VCVTTPS2UQQ,
+ I_VCVTTSD2USI,
+ I_VCVTTSS2USI,
+ I_VCVTUDQ2PD,
+ I_VCVTUDQ2PS,
+ I_VCVTUQQ2PD,
+ I_VCVTUQQ2PS,
+ I_VCVTUSI2SD,
+ I_VCVTUSI2SS,
+ I_VDBPSADBW,
+ I_VEXP2PD,
+ I_VEXP2PS,
+ I_VEXPANDPD,
+ I_VEXPANDPS,
+ I_VEXTRACTF32X4,
+ I_VEXTRACTF32X8,
+ I_VEXTRACTF64X2,
+ I_VEXTRACTF64X4,
+ I_VEXTRACTI32X4,
+ I_VEXTRACTI32X8,
+ I_VEXTRACTI64X2,
+ I_VEXTRACTI64X4,
+ I_VFIXUPIMMPD,
+ I_VFIXUPIMMPS,
+ I_VFIXUPIMMSD,
+ I_VFIXUPIMMSS,
+ I_VFPCLASSPD,
+ I_VFPCLASSPS,
+ I_VFPCLASSSD,
+ I_VFPCLASSSS,
+ I_VGATHERPF0DPD,
+ I_VGATHERPF0DPS,
+ I_VGATHERPF0QPD,
+ I_VGATHERPF0QPS,
+ I_VGATHERPF1DPD,
+ I_VGATHERPF1DPS,
+ I_VGATHERPF1QPD,
+ I_VGATHERPF1QPS,
+ I_VGETEXPPD,
+ I_VGETEXPPS,
+ I_VGETEXPSD,
+ I_VGETEXPSS,
+ I_VGETMANTPD,
+ I_VGETMANTPS,
+ I_VGETMANTSD,
+ I_VGETMANTSS,
+ I_VINSERTF32X4,
+ I_VINSERTF32X8,
+ I_VINSERTF64X2,
+ I_VINSERTF64X4,
+ I_VINSERTI32X4,
+ I_VINSERTI32X8,
+ I_VINSERTI64X2,
+ I_VINSERTI64X4,
+ I_VMOVDQA32,
+ I_VMOVDQA64,
+ I_VMOVDQU16,
+ I_VMOVDQU32,
+ I_VMOVDQU64,
+ I_VMOVDQU8,
+ I_VPABSQ,
+ I_VPANDD,
+ I_VPANDND,
+ I_VPANDNQ,
+ I_VPANDQ,
+ I_VPBLENDMB,
+ I_VPBLENDMD,
+ I_VPBLENDMQ,
+ I_VPBLENDMW,
+ I_VPBROADCASTMB2Q,
+ I_VPBROADCASTMW2D,
+ I_VPCMPB,
+ I_VPCMPD,
+ I_VPCMPQ,
+ I_VPCMPUB,
+ I_VPCMPUD,
+ I_VPCMPUQ,
+ I_VPCMPUW,
+ I_VPCMPW,
+ I_VPCOMPRESSD,
+ I_VPCOMPRESSQ,
+ I_VPCONFLICTD,
+ I_VPCONFLICTQ,
+ I_VPERMB,
+ I_VPERMI2B,
+ I_VPERMI2D,
+ I_VPERMI2PD,
+ I_VPERMI2PS,
+ I_VPERMI2Q,
+ I_VPERMI2W,
+ I_VPERMT2B,
+ I_VPERMT2D,
+ I_VPERMT2PD,
+ I_VPERMT2PS,
+ I_VPERMT2Q,
+ I_VPERMT2W,
+ I_VPERMW,
+ I_VPEXPANDD,
+ I_VPEXPANDQ,
+ I_VPLZCNTD,
+ I_VPLZCNTQ,
+ I_VPMADD52HUQ,
+ I_VPMADD52LUQ,
+ I_VPMAXSQ,
+ I_VPMAXUQ,
+ I_VPMINSQ,
+ I_VPMINUQ,
+ I_VPMOVB2M,
+ I_VPMOVD2M,
+ I_VPMOVDB,
+ I_VPMOVDW,
+ I_VPMOVM2B,
+ I_VPMOVM2D,
+ I_VPMOVM2Q,
+ I_VPMOVM2W,
+ I_VPMOVQ2M,
+ I_VPMOVQB,
+ I_VPMOVQD,
+ I_VPMOVQW,
+ I_VPMOVSDB,
+ I_VPMOVSDW,
+ I_VPMOVSQB,
+ I_VPMOVSQD,
+ I_VPMOVSQW,
+ I_VPMOVSWB,
+ I_VPMOVUSDB,
+ I_VPMOVUSDW,
+ I_VPMOVUSQB,
+ I_VPMOVUSQD,
+ I_VPMOVUSQW,
+ I_VPMOVUSWB,
+ I_VPMOVW2M,
+ I_VPMOVWB,
+ I_VPMULLQ,
+ I_VPMULTISHIFTQB,
+ I_VPORD,
+ I_VPORQ,
+ I_VPROLD,
+ I_VPROLQ,
+ I_VPROLVD,
+ I_VPROLVQ,
+ I_VPRORD,
+ I_VPRORQ,
+ I_VPRORVD,
+ I_VPRORVQ,
+ I_VPSCATTERDD,
+ I_VPSCATTERDQ,
+ I_VPSCATTERQD,
+ I_VPSCATTERQQ,
+ I_VPSLLVW,
+ I_VPSRAQ,
+ I_VPSRAVQ,
+ I_VPSRAVW,
+ I_VPSRLVW,
+ I_VPTERNLOGD,
+ I_VPTERNLOGQ,
+ I_VPTESTMB,
+ I_VPTESTMD,
+ I_VPTESTMQ,
+ I_VPTESTMW,
+ I_VPTESTNMB,
+ I_VPTESTNMD,
+ I_VPTESTNMQ,
+ I_VPTESTNMW,
+ I_VPXORD,
+ I_VPXORQ,
+ I_VRANGEPD,
+ I_VRANGEPS,
+ I_VRANGESD,
+ I_VRANGESS,
+ I_VRCP14PD,
+ I_VRCP14PS,
+ I_VRCP14SD,
+ I_VRCP14SS,
+ I_VRCP28PD,
+ I_VRCP28PS,
+ I_VRCP28SD,
+ I_VRCP28SS,
+ I_VREDUCEPD,
+ I_VREDUCEPS,
+ I_VREDUCESD,
+ I_VREDUCESS,
+ I_VRNDSCALEPD,
+ I_VRNDSCALEPS,
+ I_VRNDSCALESD,
+ I_VRNDSCALESS,
+ I_VRSQRT14PD,
+ I_VRSQRT14PS,
+ I_VRSQRT14SD,
+ I_VRSQRT14SS,
+ I_VRSQRT28PD,
+ I_VRSQRT28PS,
+ I_VRSQRT28SD,
+ I_VRSQRT28SS,
+ I_VSCALEFPD,
+ I_VSCALEFPS,
+ I_VSCALEFSD,
+ I_VSCALEFSS,
+ I_VSCATTERDPD,
+ I_VSCATTERDPS,
+ I_VSCATTERPF0DPD,
+ I_VSCATTERPF0DPS,
+ I_VSCATTERPF0QPD,
+ I_VSCATTERPF0QPS,
+ I_VSCATTERPF1DPD,
+ I_VSCATTERPF1DPS,
+ I_VSCATTERPF1QPD,
+ I_VSCATTERPF1QPS,
+ I_VSCATTERQPD,
+ I_VSCATTERQPS,
+ I_VSHUFF32X4,
+ I_VSHUFF64X2,
+ I_VSHUFI32X4,
+ I_VSHUFI64X2,
+ I_RDPKRU,
+ I_WRPKRU,
+ I_RDPID,
+ I_CLFLUSHOPT,
+ I_CLWB,
+ I_PCOMMIT,
+ I_CLZERO,
+ I_PTWRITE,
+ I_CLDEMOTE,
+ I_MOVDIRI,
+ I_MOVDIR64B,
+ I_PCONFIG,
+ I_TPAUSE,
+ I_UMONITOR,
+ I_UMWAIT,
+ I_WBNOINVD,
+ I_GF2P8AFFINEINVQB,
+ I_VGF2P8AFFINEINVQB,
+ I_GF2P8AFFINEQB,
+ I_VGF2P8AFFINEQB,
+ I_GF2P8MULB,
+ I_VGF2P8MULB,
+ I_VPCOMPRESSB,
+ I_VPCOMPRESSW,
+ I_VPEXPANDB,
+ I_VPEXPANDW,
+ I_VPSHLDW,
+ I_VPSHLDD,
+ I_VPSHLDQ,
+ I_VPSHLDVW,
+ I_VPSHLDVD,
+ I_VPSHLDVQ,
+ I_VPSHRDW,
+ I_VPSHRDD,
+ I_VPSHRDQ,
+ I_VPSHRDVW,
+ I_VPSHRDVD,
+ I_VPSHRDVQ,
+ I_VPDPBUSD,
+ I_VPDPBUSDS,
+ I_VPDPWSSD,
+ I_VPDPWSSDS,
+ I_VPOPCNTB,
+ I_VPOPCNTW,
+ I_VPOPCNTD,
+ I_VPOPCNTQ,
+ I_VPSHUFBITQMB,
+ I_V4FMADDPS,
+ I_V4FNMADDPS,
+ I_V4FMADDSS,
+ I_V4FNMADDSS,
+ I_V4DPWSSDS,
+ I_V4DPWSSD,
+ I_ENCLS,
+ I_ENCLU,
+ I_ENCLV,
+ I_HINT_NOP0,
+ I_HINT_NOP1,
+ I_HINT_NOP2,
+ I_HINT_NOP3,
+ I_HINT_NOP4,
+ I_HINT_NOP5,
+ I_HINT_NOP6,
+ I_HINT_NOP7,
+ I_HINT_NOP8,
+ I_HINT_NOP9,
+ I_HINT_NOP10,
+ I_HINT_NOP11,
+ I_HINT_NOP12,
+ I_HINT_NOP13,
+ I_HINT_NOP14,
+ I_HINT_NOP15,
+ I_HINT_NOP16,
+ I_HINT_NOP17,
+ I_HINT_NOP18,
+ I_HINT_NOP19,
+ I_HINT_NOP20,
+ I_HINT_NOP21,
+ I_HINT_NOP22,
+ I_HINT_NOP23,
+ I_HINT_NOP24,
+ I_HINT_NOP25,
+ I_HINT_NOP26,
+ I_HINT_NOP27,
+ I_HINT_NOP28,
+ I_HINT_NOP29,
+ I_HINT_NOP30,
+ I_HINT_NOP31,
+ I_HINT_NOP32,
+ I_HINT_NOP33,
+ I_HINT_NOP34,
+ I_HINT_NOP35,
+ I_HINT_NOP36,
+ I_HINT_NOP37,
+ I_HINT_NOP38,
+ I_HINT_NOP39,
+ I_HINT_NOP40,
+ I_HINT_NOP41,
+ I_HINT_NOP42,
+ I_HINT_NOP43,
+ I_HINT_NOP44,
+ I_HINT_NOP45,
+ I_HINT_NOP46,
+ I_HINT_NOP47,
+ I_HINT_NOP48,
+ I_HINT_NOP49,
+ I_HINT_NOP50,
+ I_HINT_NOP51,
+ I_HINT_NOP52,
+ I_HINT_NOP53,
+ I_HINT_NOP54,
+ I_HINT_NOP55,
+ I_HINT_NOP56,
+ I_HINT_NOP57,
+ I_HINT_NOP58,
+ I_HINT_NOP59,
+ I_HINT_NOP60,
+ I_HINT_NOP61,
+ I_HINT_NOP62,
+ I_HINT_NOP63,
+ I_CMOVcc,
+ I_Jcc,
+ I_SETcc,
+ I_none = -1
+};
+
+#define MAX_INSLEN 17
+#define NASM_VEX_CLASSES 3
+#define NO_DECORATOR {0,0,0,0,0}
+#define FIRST_COND_OPCODE I_CMOVcc
+
+#endif /* NASM_INSNSI_H */
diff --git a/x86/insnsn.c b/x86/insnsn.c
new file mode 100644
index 00000000..6f2ccb37
--- /dev/null
+++ b/x86/insnsn.c
@@ -0,0 +1,1887 @@
+/* This file is auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include "tables.h"
+
+const char * const nasm_insn_names[] = {
+ "db",
+ "dw",
+ "dd",
+ "dq",
+ "dt",
+ "do",
+ "dy",
+ "dz",
+ "resb",
+ "resw",
+ "resd",
+ "resq",
+ "rest",
+ "reso",
+ "resy",
+ "resz",
+ "incbin",
+ "aaa",
+ "aad",
+ "aam",
+ "aas",
+ "adc",
+ "add",
+ "and",
+ "arpl",
+ "bb0_reset",
+ "bb1_reset",
+ "bound",
+ "bsf",
+ "bsr",
+ "bswap",
+ "bt",
+ "btc",
+ "btr",
+ "bts",
+ "call",
+ "cbw",
+ "cdq",
+ "cdqe",
+ "clc",
+ "cld",
+ "cli",
+ "clts",
+ "cmc",
+ "cmp",
+ "cmpsb",
+ "cmpsd",
+ "cmpsq",
+ "cmpsw",
+ "cmpxchg",
+ "cmpxchg486",
+ "cmpxchg8b",
+ "cmpxchg16b",
+ "cpuid",
+ "cpu_read",
+ "cpu_write",
+ "cqo",
+ "cwd",
+ "cwde",
+ "daa",
+ "das",
+ "dec",
+ "div",
+ "dmint",
+ "emms",
+ "enter",
+ "equ",
+ "f2xm1",
+ "fabs",
+ "fadd",
+ "faddp",
+ "fbld",
+ "fbstp",
+ "fchs",
+ "fclex",
+ "fcmovb",
+ "fcmovbe",
+ "fcmove",
+ "fcmovnb",
+ "fcmovnbe",
+ "fcmovne",
+ "fcmovnu",
+ "fcmovu",
+ "fcom",
+ "fcomi",
+ "fcomip",
+ "fcomp",
+ "fcompp",
+ "fcos",
+ "fdecstp",
+ "fdisi",
+ "fdiv",
+ "fdivp",
+ "fdivr",
+ "fdivrp",
+ "femms",
+ "feni",
+ "ffree",
+ "ffreep",
+ "fiadd",
+ "ficom",
+ "ficomp",
+ "fidiv",
+ "fidivr",
+ "fild",
+ "fimul",
+ "fincstp",
+ "finit",
+ "fist",
+ "fistp",
+ "fisttp",
+ "fisub",
+ "fisubr",
+ "fld",
+ "fld1",
+ "fldcw",
+ "fldenv",
+ "fldl2e",
+ "fldl2t",
+ "fldlg2",
+ "fldln2",
+ "fldpi",
+ "fldz",
+ "fmul",
+ "fmulp",
+ "fnclex",
+ "fndisi",
+ "fneni",
+ "fninit",
+ "fnop",
+ "fnsave",
+ "fnstcw",
+ "fnstenv",
+ "fnstsw",
+ "fpatan",
+ "fprem",
+ "fprem1",
+ "fptan",
+ "frndint",
+ "frstor",
+ "fsave",
+ "fscale",
+ "fsetpm",
+ "fsin",
+ "fsincos",
+ "fsqrt",
+ "fst",
+ "fstcw",
+ "fstenv",
+ "fstp",
+ "fstsw",
+ "fsub",
+ "fsubp",
+ "fsubr",
+ "fsubrp",
+ "ftst",
+ "fucom",
+ "fucomi",
+ "fucomip",
+ "fucomp",
+ "fucompp",
+ "fxam",
+ "fxch",
+ "fxtract",
+ "fyl2x",
+ "fyl2xp1",
+ "hlt",
+ "ibts",
+ "icebp",
+ "idiv",
+ "imul",
+ "in",
+ "inc",
+ "insb",
+ "insd",
+ "insw",
+ "int",
+ "int01",
+ "int1",
+ "int03",
+ "int3",
+ "into",
+ "invd",
+ "invpcid",
+ "invlpg",
+ "invlpga",
+ "iret",
+ "iretd",
+ "iretq",
+ "iretw",
+ "jcxz",
+ "jecxz",
+ "jrcxz",
+ "jmp",
+ "jmpe",
+ "lahf",
+ "lar",
+ "lds",
+ "lea",
+ "leave",
+ "les",
+ "lfence",
+ "lfs",
+ "lgdt",
+ "lgs",
+ "lidt",
+ "lldt",
+ "lmsw",
+ "loadall",
+ "loadall286",
+ "lodsb",
+ "lodsd",
+ "lodsq",
+ "lodsw",
+ "loop",
+ "loope",
+ "loopne",
+ "loopnz",
+ "loopz",
+ "lsl",
+ "lss",
+ "ltr",
+ "mfence",
+ "monitor",
+ "monitorx",
+ "mov",
+ "movd",
+ "movq",
+ "movsb",
+ "movsd",
+ "movsq",
+ "movsw",
+ "movsx",
+ "movsxd",
+ "movzx",
+ "mul",
+ "mwait",
+ "mwaitx",
+ "neg",
+ "nop",
+ "not",
+ "or",
+ "out",
+ "outsb",
+ "outsd",
+ "outsw",
+ "packssdw",
+ "packsswb",
+ "packuswb",
+ "paddb",
+ "paddd",
+ "paddsb",
+ "paddsiw",
+ "paddsw",
+ "paddusb",
+ "paddusw",
+ "paddw",
+ "pand",
+ "pandn",
+ "pause",
+ "paveb",
+ "pavgusb",
+ "pcmpeqb",
+ "pcmpeqd",
+ "pcmpeqw",
+ "pcmpgtb",
+ "pcmpgtd",
+ "pcmpgtw",
+ "pdistib",
+ "pf2id",
+ "pfacc",
+ "pfadd",
+ "pfcmpeq",
+ "pfcmpge",
+ "pfcmpgt",
+ "pfmax",
+ "pfmin",
+ "pfmul",
+ "pfrcp",
+ "pfrcpit1",
+ "pfrcpit2",
+ "pfrsqit1",
+ "pfrsqrt",
+ "pfsub",
+ "pfsubr",
+ "pi2fd",
+ "pmachriw",
+ "pmaddwd",
+ "pmagw",
+ "pmulhriw",
+ "pmulhrwa",
+ "pmulhrwc",
+ "pmulhw",
+ "pmullw",
+ "pmvgezb",
+ "pmvlzb",
+ "pmvnzb",
+ "pmvzb",
+ "pop",
+ "popa",
+ "popad",
+ "popaw",
+ "popf",
+ "popfd",
+ "popfq",
+ "popfw",
+ "por",
+ "prefetch",
+ "prefetchw",
+ "pslld",
+ "psllq",
+ "psllw",
+ "psrad",
+ "psraw",
+ "psrld",
+ "psrlq",
+ "psrlw",
+ "psubb",
+ "psubd",
+ "psubsb",
+ "psubsiw",
+ "psubsw",
+ "psubusb",
+ "psubusw",
+ "psubw",
+ "punpckhbw",
+ "punpckhdq",
+ "punpckhwd",
+ "punpcklbw",
+ "punpckldq",
+ "punpcklwd",
+ "push",
+ "pusha",
+ "pushad",
+ "pushaw",
+ "pushf",
+ "pushfd",
+ "pushfq",
+ "pushfw",
+ "pxor",
+ "rcl",
+ "rcr",
+ "rdshr",
+ "rdmsr",
+ "rdpmc",
+ "rdtsc",
+ "rdtscp",
+ "ret",
+ "retf",
+ "retn",
+ "retw",
+ "retfw",
+ "retnw",
+ "retd",
+ "retfd",
+ "retnd",
+ "retq",
+ "retfq",
+ "retnq",
+ "rol",
+ "ror",
+ "rdm",
+ "rsdc",
+ "rsldt",
+ "rsm",
+ "rsts",
+ "sahf",
+ "sal",
+ "salc",
+ "sar",
+ "sbb",
+ "scasb",
+ "scasd",
+ "scasq",
+ "scasw",
+ "sfence",
+ "sgdt",
+ "shl",
+ "shld",
+ "shr",
+ "shrd",
+ "sidt",
+ "sldt",
+ "skinit",
+ "smi",
+ "smint",
+ "smintold",
+ "smsw",
+ "stc",
+ "std",
+ "sti",
+ "stosb",
+ "stosd",
+ "stosq",
+ "stosw",
+ "str",
+ "sub",
+ "svdc",
+ "svldt",
+ "svts",
+ "swapgs",
+ "syscall",
+ "sysenter",
+ "sysexit",
+ "sysret",
+ "test",
+ "ud0",
+ "ud1",
+ "ud2b",
+ "ud2",
+ "ud2a",
+ "umov",
+ "verr",
+ "verw",
+ "fwait",
+ "wbinvd",
+ "wrshr",
+ "wrmsr",
+ "xadd",
+ "xbts",
+ "xchg",
+ "xlatb",
+ "xlat",
+ "xor",
+ "addps",
+ "addss",
+ "andnps",
+ "andps",
+ "cmpeqps",
+ "cmpeqss",
+ "cmpleps",
+ "cmpless",
+ "cmpltps",
+ "cmpltss",
+ "cmpneqps",
+ "cmpneqss",
+ "cmpnleps",
+ "cmpnless",
+ "cmpnltps",
+ "cmpnltss",
+ "cmpordps",
+ "cmpordss",
+ "cmpunordps",
+ "cmpunordss",
+ "cmpps",
+ "cmpss",
+ "comiss",
+ "cvtpi2ps",
+ "cvtps2pi",
+ "cvtsi2ss",
+ "cvtss2si",
+ "cvttps2pi",
+ "cvttss2si",
+ "divps",
+ "divss",
+ "ldmxcsr",
+ "maxps",
+ "maxss",
+ "minps",
+ "minss",
+ "movaps",
+ "movhps",
+ "movlhps",
+ "movlps",
+ "movhlps",
+ "movmskps",
+ "movntps",
+ "movss",
+ "movups",
+ "mulps",
+ "mulss",
+ "orps",
+ "rcpps",
+ "rcpss",
+ "rsqrtps",
+ "rsqrtss",
+ "shufps",
+ "sqrtps",
+ "sqrtss",
+ "stmxcsr",
+ "subps",
+ "subss",
+ "ucomiss",
+ "unpckhps",
+ "unpcklps",
+ "xorps",
+ "fxrstor",
+ "fxrstor64",
+ "fxsave",
+ "fxsave64",
+ "xgetbv",
+ "xsetbv",
+ "xsave",
+ "xsave64",
+ "xsavec",
+ "xsavec64",
+ "xsaveopt",
+ "xsaveopt64",
+ "xsaves",
+ "xsaves64",
+ "xrstor",
+ "xrstor64",
+ "xrstors",
+ "xrstors64",
+ "prefetchnta",
+ "prefetcht0",
+ "prefetcht1",
+ "prefetcht2",
+ "maskmovq",
+ "movntq",
+ "pavgb",
+ "pavgw",
+ "pextrw",
+ "pinsrw",
+ "pmaxsw",
+ "pmaxub",
+ "pminsw",
+ "pminub",
+ "pmovmskb",
+ "pmulhuw",
+ "psadbw",
+ "pshufw",
+ "pf2iw",
+ "pfnacc",
+ "pfpnacc",
+ "pi2fw",
+ "pswapd",
+ "maskmovdqu",
+ "clflush",
+ "movntdq",
+ "movnti",
+ "movntpd",
+ "movdqa",
+ "movdqu",
+ "movdq2q",
+ "movq2dq",
+ "paddq",
+ "pmuludq",
+ "pshufd",
+ "pshufhw",
+ "pshuflw",
+ "pslldq",
+ "psrldq",
+ "psubq",
+ "punpckhqdq",
+ "punpcklqdq",
+ "addpd",
+ "addsd",
+ "andnpd",
+ "andpd",
+ "cmpeqpd",
+ "cmpeqsd",
+ "cmplepd",
+ "cmplesd",
+ "cmpltpd",
+ "cmpltsd",
+ "cmpneqpd",
+ "cmpneqsd",
+ "cmpnlepd",
+ "cmpnlesd",
+ "cmpnltpd",
+ "cmpnltsd",
+ "cmpordpd",
+ "cmpordsd",
+ "cmpunordpd",
+ "cmpunordsd",
+ "cmppd",
+ "comisd",
+ "cvtdq2pd",
+ "cvtdq2ps",
+ "cvtpd2dq",
+ "cvtpd2pi",
+ "cvtpd2ps",
+ "cvtpi2pd",
+ "cvtps2dq",
+ "cvtps2pd",
+ "cvtsd2si",
+ "cvtsd2ss",
+ "cvtsi2sd",
+ "cvtss2sd",
+ "cvttpd2pi",
+ "cvttpd2dq",
+ "cvttps2dq",
+ "cvttsd2si",
+ "divpd",
+ "divsd",
+ "maxpd",
+ "maxsd",
+ "minpd",
+ "minsd",
+ "movapd",
+ "movhpd",
+ "movlpd",
+ "movmskpd",
+ "movupd",
+ "mulpd",
+ "mulsd",
+ "orpd",
+ "shufpd",
+ "sqrtpd",
+ "sqrtsd",
+ "subpd",
+ "subsd",
+ "ucomisd",
+ "unpckhpd",
+ "unpcklpd",
+ "xorpd",
+ "addsubpd",
+ "addsubps",
+ "haddpd",
+ "haddps",
+ "hsubpd",
+ "hsubps",
+ "lddqu",
+ "movddup",
+ "movshdup",
+ "movsldup",
+ "clgi",
+ "stgi",
+ "vmcall",
+ "vmclear",
+ "vmfunc",
+ "vmlaunch",
+ "vmload",
+ "vmmcall",
+ "vmptrld",
+ "vmptrst",
+ "vmread",
+ "vmresume",
+ "vmrun",
+ "vmsave",
+ "vmwrite",
+ "vmxoff",
+ "vmxon",
+ "invept",
+ "invvpid",
+ "pabsb",
+ "pabsw",
+ "pabsd",
+ "palignr",
+ "phaddw",
+ "phaddd",
+ "phaddsw",
+ "phsubw",
+ "phsubd",
+ "phsubsw",
+ "pmaddubsw",
+ "pmulhrsw",
+ "pshufb",
+ "psignb",
+ "psignw",
+ "psignd",
+ "extrq",
+ "insertq",
+ "movntsd",
+ "movntss",
+ "lzcnt",
+ "blendpd",
+ "blendps",
+ "blendvpd",
+ "blendvps",
+ "dppd",
+ "dpps",
+ "extractps",
+ "insertps",
+ "movntdqa",
+ "mpsadbw",
+ "packusdw",
+ "pblendvb",
+ "pblendw",
+ "pcmpeqq",
+ "pextrb",
+ "pextrd",
+ "pextrq",
+ "phminposuw",
+ "pinsrb",
+ "pinsrd",
+ "pinsrq",
+ "pmaxsb",
+ "pmaxsd",
+ "pmaxud",
+ "pmaxuw",
+ "pminsb",
+ "pminsd",
+ "pminud",
+ "pminuw",
+ "pmovsxbw",
+ "pmovsxbd",
+ "pmovsxbq",
+ "pmovsxwd",
+ "pmovsxwq",
+ "pmovsxdq",
+ "pmovzxbw",
+ "pmovzxbd",
+ "pmovzxbq",
+ "pmovzxwd",
+ "pmovzxwq",
+ "pmovzxdq",
+ "pmuldq",
+ "pmulld",
+ "ptest",
+ "roundpd",
+ "roundps",
+ "roundsd",
+ "roundss",
+ "crc32",
+ "pcmpestri",
+ "pcmpestrm",
+ "pcmpistri",
+ "pcmpistrm",
+ "pcmpgtq",
+ "popcnt",
+ "getsec",
+ "pfrcpv",
+ "pfrsqrtv",
+ "movbe",
+ "aesenc",
+ "aesenclast",
+ "aesdec",
+ "aesdeclast",
+ "aesimc",
+ "aeskeygenassist",
+ "vaesenc",
+ "vaesenclast",
+ "vaesdec",
+ "vaesdeclast",
+ "vaesimc",
+ "vaeskeygenassist",
+ "vaddpd",
+ "vaddps",
+ "vaddsd",
+ "vaddss",
+ "vaddsubpd",
+ "vaddsubps",
+ "vandpd",
+ "vandps",
+ "vandnpd",
+ "vandnps",
+ "vblendpd",
+ "vblendps",
+ "vblendvpd",
+ "vblendvps",
+ "vbroadcastss",
+ "vbroadcastsd",
+ "vbroadcastf128",
+ "vcmpeq_ospd",
+ "vcmpeqpd",
+ "vcmplt_ospd",
+ "vcmpltpd",
+ "vcmple_ospd",
+ "vcmplepd",
+ "vcmpunord_qpd",
+ "vcmpunordpd",
+ "vcmpneq_uqpd",
+ "vcmpneqpd",
+ "vcmpnlt_uspd",
+ "vcmpnltpd",
+ "vcmpnle_uspd",
+ "vcmpnlepd",
+ "vcmpord_qpd",
+ "vcmpordpd",
+ "vcmpeq_uqpd",
+ "vcmpnge_uspd",
+ "vcmpngepd",
+ "vcmpngt_uspd",
+ "vcmpngtpd",
+ "vcmpfalse_oqpd",
+ "vcmpfalsepd",
+ "vcmpneq_oqpd",
+ "vcmpge_ospd",
+ "vcmpgepd",
+ "vcmpgt_ospd",
+ "vcmpgtpd",
+ "vcmptrue_uqpd",
+ "vcmptruepd",
+ "vcmplt_oqpd",
+ "vcmple_oqpd",
+ "vcmpunord_spd",
+ "vcmpneq_uspd",
+ "vcmpnlt_uqpd",
+ "vcmpnle_uqpd",
+ "vcmpord_spd",
+ "vcmpeq_uspd",
+ "vcmpnge_uqpd",
+ "vcmpngt_uqpd",
+ "vcmpfalse_ospd",
+ "vcmpneq_ospd",
+ "vcmpge_oqpd",
+ "vcmpgt_oqpd",
+ "vcmptrue_uspd",
+ "vcmppd",
+ "vcmpeq_osps",
+ "vcmpeqps",
+ "vcmplt_osps",
+ "vcmpltps",
+ "vcmple_osps",
+ "vcmpleps",
+ "vcmpunord_qps",
+ "vcmpunordps",
+ "vcmpneq_uqps",
+ "vcmpneqps",
+ "vcmpnlt_usps",
+ "vcmpnltps",
+ "vcmpnle_usps",
+ "vcmpnleps",
+ "vcmpord_qps",
+ "vcmpordps",
+ "vcmpeq_uqps",
+ "vcmpnge_usps",
+ "vcmpngeps",
+ "vcmpngt_usps",
+ "vcmpngtps",
+ "vcmpfalse_oqps",
+ "vcmpfalseps",
+ "vcmpneq_oqps",
+ "vcmpge_osps",
+ "vcmpgeps",
+ "vcmpgt_osps",
+ "vcmpgtps",
+ "vcmptrue_uqps",
+ "vcmptrueps",
+ "vcmplt_oqps",
+ "vcmple_oqps",
+ "vcmpunord_sps",
+ "vcmpneq_usps",
+ "vcmpnlt_uqps",
+ "vcmpnle_uqps",
+ "vcmpord_sps",
+ "vcmpeq_usps",
+ "vcmpnge_uqps",
+ "vcmpngt_uqps",
+ "vcmpfalse_osps",
+ "vcmpneq_osps",
+ "vcmpge_oqps",
+ "vcmpgt_oqps",
+ "vcmptrue_usps",
+ "vcmpps",
+ "vcmpeq_ossd",
+ "vcmpeqsd",
+ "vcmplt_ossd",
+ "vcmpltsd",
+ "vcmple_ossd",
+ "vcmplesd",
+ "vcmpunord_qsd",
+ "vcmpunordsd",
+ "vcmpneq_uqsd",
+ "vcmpneqsd",
+ "vcmpnlt_ussd",
+ "vcmpnltsd",
+ "vcmpnle_ussd",
+ "vcmpnlesd",
+ "vcmpord_qsd",
+ "vcmpordsd",
+ "vcmpeq_uqsd",
+ "vcmpnge_ussd",
+ "vcmpngesd",
+ "vcmpngt_ussd",
+ "vcmpngtsd",
+ "vcmpfalse_oqsd",
+ "vcmpfalsesd",
+ "vcmpneq_oqsd",
+ "vcmpge_ossd",
+ "vcmpgesd",
+ "vcmpgt_ossd",
+ "vcmpgtsd",
+ "vcmptrue_uqsd",
+ "vcmptruesd",
+ "vcmplt_oqsd",
+ "vcmple_oqsd",
+ "vcmpunord_ssd",
+ "vcmpneq_ussd",
+ "vcmpnlt_uqsd",
+ "vcmpnle_uqsd",
+ "vcmpord_ssd",
+ "vcmpeq_ussd",
+ "vcmpnge_uqsd",
+ "vcmpngt_uqsd",
+ "vcmpfalse_ossd",
+ "vcmpneq_ossd",
+ "vcmpge_oqsd",
+ "vcmpgt_oqsd",
+ "vcmptrue_ussd",
+ "vcmpsd",
+ "vcmpeq_osss",
+ "vcmpeqss",
+ "vcmplt_osss",
+ "vcmpltss",
+ "vcmple_osss",
+ "vcmpless",
+ "vcmpunord_qss",
+ "vcmpunordss",
+ "vcmpneq_uqss",
+ "vcmpneqss",
+ "vcmpnlt_usss",
+ "vcmpnltss",
+ "vcmpnle_usss",
+ "vcmpnless",
+ "vcmpord_qss",
+ "vcmpordss",
+ "vcmpeq_uqss",
+ "vcmpnge_usss",
+ "vcmpngess",
+ "vcmpngt_usss",
+ "vcmpngtss",
+ "vcmpfalse_oqss",
+ "vcmpfalsess",
+ "vcmpneq_oqss",
+ "vcmpge_osss",
+ "vcmpgess",
+ "vcmpgt_osss",
+ "vcmpgtss",
+ "vcmptrue_uqss",
+ "vcmptruess",
+ "vcmplt_oqss",
+ "vcmple_oqss",
+ "vcmpunord_sss",
+ "vcmpneq_usss",
+ "vcmpnlt_uqss",
+ "vcmpnle_uqss",
+ "vcmpord_sss",
+ "vcmpeq_usss",
+ "vcmpnge_uqss",
+ "vcmpngt_uqss",
+ "vcmpfalse_osss",
+ "vcmpneq_osss",
+ "vcmpge_oqss",
+ "vcmpgt_oqss",
+ "vcmptrue_usss",
+ "vcmpss",
+ "vcomisd",
+ "vcomiss",
+ "vcvtdq2pd",
+ "vcvtdq2ps",
+ "vcvtpd2dq",
+ "vcvtpd2ps",
+ "vcvtps2dq",
+ "vcvtps2pd",
+ "vcvtsd2si",
+ "vcvtsd2ss",
+ "vcvtsi2sd",
+ "vcvtsi2ss",
+ "vcvtss2sd",
+ "vcvtss2si",
+ "vcvttpd2dq",
+ "vcvttps2dq",
+ "vcvttsd2si",
+ "vcvttss2si",
+ "vdivpd",
+ "vdivps",
+ "vdivsd",
+ "vdivss",
+ "vdppd",
+ "vdpps",
+ "vextractf128",
+ "vextractps",
+ "vhaddpd",
+ "vhaddps",
+ "vhsubpd",
+ "vhsubps",
+ "vinsertf128",
+ "vinsertps",
+ "vlddqu",
+ "vldqqu",
+ "vldmxcsr",
+ "vmaskmovdqu",
+ "vmaskmovps",
+ "vmaskmovpd",
+ "vmaxpd",
+ "vmaxps",
+ "vmaxsd",
+ "vmaxss",
+ "vminpd",
+ "vminps",
+ "vminsd",
+ "vminss",
+ "vmovapd",
+ "vmovaps",
+ "vmovd",
+ "vmovq",
+ "vmovddup",
+ "vmovdqa",
+ "vmovqqa",
+ "vmovdqu",
+ "vmovqqu",
+ "vmovhlps",
+ "vmovhpd",
+ "vmovhps",
+ "vmovlhps",
+ "vmovlpd",
+ "vmovlps",
+ "vmovmskpd",
+ "vmovmskps",
+ "vmovntdq",
+ "vmovntqq",
+ "vmovntdqa",
+ "vmovntpd",
+ "vmovntps",
+ "vmovsd",
+ "vmovshdup",
+ "vmovsldup",
+ "vmovss",
+ "vmovupd",
+ "vmovups",
+ "vmpsadbw",
+ "vmulpd",
+ "vmulps",
+ "vmulsd",
+ "vmulss",
+ "vorpd",
+ "vorps",
+ "vpabsb",
+ "vpabsw",
+ "vpabsd",
+ "vpacksswb",
+ "vpackssdw",
+ "vpackuswb",
+ "vpackusdw",
+ "vpaddb",
+ "vpaddw",
+ "vpaddd",
+ "vpaddq",
+ "vpaddsb",
+ "vpaddsw",
+ "vpaddusb",
+ "vpaddusw",
+ "vpalignr",
+ "vpand",
+ "vpandn",
+ "vpavgb",
+ "vpavgw",
+ "vpblendvb",
+ "vpblendw",
+ "vpcmpestri",
+ "vpcmpestrm",
+ "vpcmpistri",
+ "vpcmpistrm",
+ "vpcmpeqb",
+ "vpcmpeqw",
+ "vpcmpeqd",
+ "vpcmpeqq",
+ "vpcmpgtb",
+ "vpcmpgtw",
+ "vpcmpgtd",
+ "vpcmpgtq",
+ "vpermilpd",
+ "vpermilps",
+ "vperm2f128",
+ "vpextrb",
+ "vpextrw",
+ "vpextrd",
+ "vpextrq",
+ "vphaddw",
+ "vphaddd",
+ "vphaddsw",
+ "vphminposuw",
+ "vphsubw",
+ "vphsubd",
+ "vphsubsw",
+ "vpinsrb",
+ "vpinsrw",
+ "vpinsrd",
+ "vpinsrq",
+ "vpmaddwd",
+ "vpmaddubsw",
+ "vpmaxsb",
+ "vpmaxsw",
+ "vpmaxsd",
+ "vpmaxub",
+ "vpmaxuw",
+ "vpmaxud",
+ "vpminsb",
+ "vpminsw",
+ "vpminsd",
+ "vpminub",
+ "vpminuw",
+ "vpminud",
+ "vpmovmskb",
+ "vpmovsxbw",
+ "vpmovsxbd",
+ "vpmovsxbq",
+ "vpmovsxwd",
+ "vpmovsxwq",
+ "vpmovsxdq",
+ "vpmovzxbw",
+ "vpmovzxbd",
+ "vpmovzxbq",
+ "vpmovzxwd",
+ "vpmovzxwq",
+ "vpmovzxdq",
+ "vpmulhuw",
+ "vpmulhrsw",
+ "vpmulhw",
+ "vpmullw",
+ "vpmulld",
+ "vpmuludq",
+ "vpmuldq",
+ "vpor",
+ "vpsadbw",
+ "vpshufb",
+ "vpshufd",
+ "vpshufhw",
+ "vpshuflw",
+ "vpsignb",
+ "vpsignw",
+ "vpsignd",
+ "vpslldq",
+ "vpsrldq",
+ "vpsllw",
+ "vpslld",
+ "vpsllq",
+ "vpsraw",
+ "vpsrad",
+ "vpsrlw",
+ "vpsrld",
+ "vpsrlq",
+ "vptest",
+ "vpsubb",
+ "vpsubw",
+ "vpsubd",
+ "vpsubq",
+ "vpsubsb",
+ "vpsubsw",
+ "vpsubusb",
+ "vpsubusw",
+ "vpunpckhbw",
+ "vpunpckhwd",
+ "vpunpckhdq",
+ "vpunpckhqdq",
+ "vpunpcklbw",
+ "vpunpcklwd",
+ "vpunpckldq",
+ "vpunpcklqdq",
+ "vpxor",
+ "vrcpps",
+ "vrcpss",
+ "vrsqrtps",
+ "vrsqrtss",
+ "vroundpd",
+ "vroundps",
+ "vroundsd",
+ "vroundss",
+ "vshufpd",
+ "vshufps",
+ "vsqrtpd",
+ "vsqrtps",
+ "vsqrtsd",
+ "vsqrtss",
+ "vstmxcsr",
+ "vsubpd",
+ "vsubps",
+ "vsubsd",
+ "vsubss",
+ "vtestps",
+ "vtestpd",
+ "vucomisd",
+ "vucomiss",
+ "vunpckhpd",
+ "vunpckhps",
+ "vunpcklpd",
+ "vunpcklps",
+ "vxorpd",
+ "vxorps",
+ "vzeroall",
+ "vzeroupper",
+ "pclmullqlqdq",
+ "pclmulhqlqdq",
+ "pclmullqhqdq",
+ "pclmulhqhqdq",
+ "pclmulqdq",
+ "vpclmullqlqdq",
+ "vpclmulhqlqdq",
+ "vpclmullqhqdq",
+ "vpclmulhqhqdq",
+ "vpclmulqdq",
+ "vfmadd132ps",
+ "vfmadd132pd",
+ "vfmadd312ps",
+ "vfmadd312pd",
+ "vfmadd213ps",
+ "vfmadd213pd",
+ "vfmadd123ps",
+ "vfmadd123pd",
+ "vfmadd231ps",
+ "vfmadd231pd",
+ "vfmadd321ps",
+ "vfmadd321pd",
+ "vfmaddsub132ps",
+ "vfmaddsub132pd",
+ "vfmaddsub312ps",
+ "vfmaddsub312pd",
+ "vfmaddsub213ps",
+ "vfmaddsub213pd",
+ "vfmaddsub123ps",
+ "vfmaddsub123pd",
+ "vfmaddsub231ps",
+ "vfmaddsub231pd",
+ "vfmaddsub321ps",
+ "vfmaddsub321pd",
+ "vfmsub132ps",
+ "vfmsub132pd",
+ "vfmsub312ps",
+ "vfmsub312pd",
+ "vfmsub213ps",
+ "vfmsub213pd",
+ "vfmsub123ps",
+ "vfmsub123pd",
+ "vfmsub231ps",
+ "vfmsub231pd",
+ "vfmsub321ps",
+ "vfmsub321pd",
+ "vfmsubadd132ps",
+ "vfmsubadd132pd",
+ "vfmsubadd312ps",
+ "vfmsubadd312pd",
+ "vfmsubadd213ps",
+ "vfmsubadd213pd",
+ "vfmsubadd123ps",
+ "vfmsubadd123pd",
+ "vfmsubadd231ps",
+ "vfmsubadd231pd",
+ "vfmsubadd321ps",
+ "vfmsubadd321pd",
+ "vfnmadd132ps",
+ "vfnmadd132pd",
+ "vfnmadd312ps",
+ "vfnmadd312pd",
+ "vfnmadd213ps",
+ "vfnmadd213pd",
+ "vfnmadd123ps",
+ "vfnmadd123pd",
+ "vfnmadd231ps",
+ "vfnmadd231pd",
+ "vfnmadd321ps",
+ "vfnmadd321pd",
+ "vfnmsub132ps",
+ "vfnmsub132pd",
+ "vfnmsub312ps",
+ "vfnmsub312pd",
+ "vfnmsub213ps",
+ "vfnmsub213pd",
+ "vfnmsub123ps",
+ "vfnmsub123pd",
+ "vfnmsub231ps",
+ "vfnmsub231pd",
+ "vfnmsub321ps",
+ "vfnmsub321pd",
+ "vfmadd132ss",
+ "vfmadd132sd",
+ "vfmadd312ss",
+ "vfmadd312sd",
+ "vfmadd213ss",
+ "vfmadd213sd",
+ "vfmadd123ss",
+ "vfmadd123sd",
+ "vfmadd231ss",
+ "vfmadd231sd",
+ "vfmadd321ss",
+ "vfmadd321sd",
+ "vfmsub132ss",
+ "vfmsub132sd",
+ "vfmsub312ss",
+ "vfmsub312sd",
+ "vfmsub213ss",
+ "vfmsub213sd",
+ "vfmsub123ss",
+ "vfmsub123sd",
+ "vfmsub231ss",
+ "vfmsub231sd",
+ "vfmsub321ss",
+ "vfmsub321sd",
+ "vfnmadd132ss",
+ "vfnmadd132sd",
+ "vfnmadd312ss",
+ "vfnmadd312sd",
+ "vfnmadd213ss",
+ "vfnmadd213sd",
+ "vfnmadd123ss",
+ "vfnmadd123sd",
+ "vfnmadd231ss",
+ "vfnmadd231sd",
+ "vfnmadd321ss",
+ "vfnmadd321sd",
+ "vfnmsub132ss",
+ "vfnmsub132sd",
+ "vfnmsub312ss",
+ "vfnmsub312sd",
+ "vfnmsub213ss",
+ "vfnmsub213sd",
+ "vfnmsub123ss",
+ "vfnmsub123sd",
+ "vfnmsub231ss",
+ "vfnmsub231sd",
+ "vfnmsub321ss",
+ "vfnmsub321sd",
+ "rdfsbase",
+ "rdgsbase",
+ "rdrand",
+ "wrfsbase",
+ "wrgsbase",
+ "vcvtph2ps",
+ "vcvtps2ph",
+ "adcx",
+ "adox",
+ "rdseed",
+ "clac",
+ "stac",
+ "xstore",
+ "xcryptecb",
+ "xcryptcbc",
+ "xcryptctr",
+ "xcryptcfb",
+ "xcryptofb",
+ "montmul",
+ "xsha1",
+ "xsha256",
+ "llwpcb",
+ "slwpcb",
+ "lwpval",
+ "lwpins",
+ "vfmaddpd",
+ "vfmaddps",
+ "vfmaddsd",
+ "vfmaddss",
+ "vfmaddsubpd",
+ "vfmaddsubps",
+ "vfmsubaddpd",
+ "vfmsubaddps",
+ "vfmsubpd",
+ "vfmsubps",
+ "vfmsubsd",
+ "vfmsubss",
+ "vfnmaddpd",
+ "vfnmaddps",
+ "vfnmaddsd",
+ "vfnmaddss",
+ "vfnmsubpd",
+ "vfnmsubps",
+ "vfnmsubsd",
+ "vfnmsubss",
+ "vfrczpd",
+ "vfrczps",
+ "vfrczsd",
+ "vfrczss",
+ "vpcmov",
+ "vpcomb",
+ "vpcomd",
+ "vpcomq",
+ "vpcomub",
+ "vpcomud",
+ "vpcomuq",
+ "vpcomuw",
+ "vpcomw",
+ "vphaddbd",
+ "vphaddbq",
+ "vphaddbw",
+ "vphadddq",
+ "vphaddubd",
+ "vphaddubq",
+ "vphaddubw",
+ "vphaddudq",
+ "vphadduwd",
+ "vphadduwq",
+ "vphaddwd",
+ "vphaddwq",
+ "vphsubbw",
+ "vphsubdq",
+ "vphsubwd",
+ "vpmacsdd",
+ "vpmacsdqh",
+ "vpmacsdql",
+ "vpmacssdd",
+ "vpmacssdqh",
+ "vpmacssdql",
+ "vpmacsswd",
+ "vpmacssww",
+ "vpmacswd",
+ "vpmacsww",
+ "vpmadcsswd",
+ "vpmadcswd",
+ "vpperm",
+ "vprotb",
+ "vprotd",
+ "vprotq",
+ "vprotw",
+ "vpshab",
+ "vpshad",
+ "vpshaq",
+ "vpshaw",
+ "vpshlb",
+ "vpshld",
+ "vpshlq",
+ "vpshlw",
+ "vbroadcasti128",
+ "vpblendd",
+ "vpbroadcastb",
+ "vpbroadcastw",
+ "vpbroadcastd",
+ "vpbroadcastq",
+ "vpermd",
+ "vpermpd",
+ "vpermps",
+ "vpermq",
+ "vperm2i128",
+ "vextracti128",
+ "vinserti128",
+ "vpmaskmovd",
+ "vpmaskmovq",
+ "vpsllvd",
+ "vpsllvq",
+ "vpsravd",
+ "vpsrlvd",
+ "vpsrlvq",
+ "vgatherdpd",
+ "vgatherqpd",
+ "vgatherdps",
+ "vgatherqps",
+ "vpgatherdd",
+ "vpgatherqd",
+ "vpgatherdq",
+ "vpgatherqq",
+ "xabort",
+ "xbegin",
+ "xend",
+ "xtest",
+ "andn",
+ "bextr",
+ "blci",
+ "blcic",
+ "blsi",
+ "blsic",
+ "blcfill",
+ "blsfill",
+ "blcmsk",
+ "blsmsk",
+ "blsr",
+ "blcs",
+ "bzhi",
+ "mulx",
+ "pdep",
+ "pext",
+ "rorx",
+ "sarx",
+ "shlx",
+ "shrx",
+ "tzcnt",
+ "tzmsk",
+ "t1mskc",
+ "prefetchwt1",
+ "bndmk",
+ "bndcl",
+ "bndcu",
+ "bndcn",
+ "bndmov",
+ "bndldx",
+ "bndstx",
+ "sha1msg1",
+ "sha1msg2",
+ "sha1nexte",
+ "sha1rnds4",
+ "sha256msg1",
+ "sha256msg2",
+ "sha256rnds2",
+ "kaddb",
+ "kaddd",
+ "kaddq",
+ "kaddw",
+ "kandb",
+ "kandd",
+ "kandnb",
+ "kandnd",
+ "kandnq",
+ "kandnw",
+ "kandq",
+ "kandw",
+ "kmovb",
+ "kmovd",
+ "kmovq",
+ "kmovw",
+ "knotb",
+ "knotd",
+ "knotq",
+ "knotw",
+ "korb",
+ "kord",
+ "korq",
+ "kortestb",
+ "kortestd",
+ "kortestq",
+ "kortestw",
+ "korw",
+ "kshiftlb",
+ "kshiftld",
+ "kshiftlq",
+ "kshiftlw",
+ "kshiftrb",
+ "kshiftrd",
+ "kshiftrq",
+ "kshiftrw",
+ "ktestb",
+ "ktestd",
+ "ktestq",
+ "ktestw",
+ "kunpckbw",
+ "kunpckdq",
+ "kunpckwd",
+ "kxnorb",
+ "kxnord",
+ "kxnorq",
+ "kxnorw",
+ "kxorb",
+ "kxord",
+ "kxorq",
+ "kxorw",
+ "valignd",
+ "valignq",
+ "vblendmpd",
+ "vblendmps",
+ "vbroadcastf32x2",
+ "vbroadcastf32x4",
+ "vbroadcastf32x8",
+ "vbroadcastf64x2",
+ "vbroadcastf64x4",
+ "vbroadcasti32x2",
+ "vbroadcasti32x4",
+ "vbroadcasti32x8",
+ "vbroadcasti64x2",
+ "vbroadcasti64x4",
+ "vcompresspd",
+ "vcompressps",
+ "vcvtpd2qq",
+ "vcvtpd2udq",
+ "vcvtpd2uqq",
+ "vcvtps2qq",
+ "vcvtps2udq",
+ "vcvtps2uqq",
+ "vcvtqq2pd",
+ "vcvtqq2ps",
+ "vcvtsd2usi",
+ "vcvtss2usi",
+ "vcvttpd2qq",
+ "vcvttpd2udq",
+ "vcvttpd2uqq",
+ "vcvttps2qq",
+ "vcvttps2udq",
+ "vcvttps2uqq",
+ "vcvttsd2usi",
+ "vcvttss2usi",
+ "vcvtudq2pd",
+ "vcvtudq2ps",
+ "vcvtuqq2pd",
+ "vcvtuqq2ps",
+ "vcvtusi2sd",
+ "vcvtusi2ss",
+ "vdbpsadbw",
+ "vexp2pd",
+ "vexp2ps",
+ "vexpandpd",
+ "vexpandps",
+ "vextractf32x4",
+ "vextractf32x8",
+ "vextractf64x2",
+ "vextractf64x4",
+ "vextracti32x4",
+ "vextracti32x8",
+ "vextracti64x2",
+ "vextracti64x4",
+ "vfixupimmpd",
+ "vfixupimmps",
+ "vfixupimmsd",
+ "vfixupimmss",
+ "vfpclasspd",
+ "vfpclassps",
+ "vfpclasssd",
+ "vfpclassss",
+ "vgatherpf0dpd",
+ "vgatherpf0dps",
+ "vgatherpf0qpd",
+ "vgatherpf0qps",
+ "vgatherpf1dpd",
+ "vgatherpf1dps",
+ "vgatherpf1qpd",
+ "vgatherpf1qps",
+ "vgetexppd",
+ "vgetexpps",
+ "vgetexpsd",
+ "vgetexpss",
+ "vgetmantpd",
+ "vgetmantps",
+ "vgetmantsd",
+ "vgetmantss",
+ "vinsertf32x4",
+ "vinsertf32x8",
+ "vinsertf64x2",
+ "vinsertf64x4",
+ "vinserti32x4",
+ "vinserti32x8",
+ "vinserti64x2",
+ "vinserti64x4",
+ "vmovdqa32",
+ "vmovdqa64",
+ "vmovdqu16",
+ "vmovdqu32",
+ "vmovdqu64",
+ "vmovdqu8",
+ "vpabsq",
+ "vpandd",
+ "vpandnd",
+ "vpandnq",
+ "vpandq",
+ "vpblendmb",
+ "vpblendmd",
+ "vpblendmq",
+ "vpblendmw",
+ "vpbroadcastmb2q",
+ "vpbroadcastmw2d",
+ "vpcmpb",
+ "vpcmpd",
+ "vpcmpq",
+ "vpcmpub",
+ "vpcmpud",
+ "vpcmpuq",
+ "vpcmpuw",
+ "vpcmpw",
+ "vpcompressd",
+ "vpcompressq",
+ "vpconflictd",
+ "vpconflictq",
+ "vpermb",
+ "vpermi2b",
+ "vpermi2d",
+ "vpermi2pd",
+ "vpermi2ps",
+ "vpermi2q",
+ "vpermi2w",
+ "vpermt2b",
+ "vpermt2d",
+ "vpermt2pd",
+ "vpermt2ps",
+ "vpermt2q",
+ "vpermt2w",
+ "vpermw",
+ "vpexpandd",
+ "vpexpandq",
+ "vplzcntd",
+ "vplzcntq",
+ "vpmadd52huq",
+ "vpmadd52luq",
+ "vpmaxsq",
+ "vpmaxuq",
+ "vpminsq",
+ "vpminuq",
+ "vpmovb2m",
+ "vpmovd2m",
+ "vpmovdb",
+ "vpmovdw",
+ "vpmovm2b",
+ "vpmovm2d",
+ "vpmovm2q",
+ "vpmovm2w",
+ "vpmovq2m",
+ "vpmovqb",
+ "vpmovqd",
+ "vpmovqw",
+ "vpmovsdb",
+ "vpmovsdw",
+ "vpmovsqb",
+ "vpmovsqd",
+ "vpmovsqw",
+ "vpmovswb",
+ "vpmovusdb",
+ "vpmovusdw",
+ "vpmovusqb",
+ "vpmovusqd",
+ "vpmovusqw",
+ "vpmovuswb",
+ "vpmovw2m",
+ "vpmovwb",
+ "vpmullq",
+ "vpmultishiftqb",
+ "vpord",
+ "vporq",
+ "vprold",
+ "vprolq",
+ "vprolvd",
+ "vprolvq",
+ "vprord",
+ "vprorq",
+ "vprorvd",
+ "vprorvq",
+ "vpscatterdd",
+ "vpscatterdq",
+ "vpscatterqd",
+ "vpscatterqq",
+ "vpsllvw",
+ "vpsraq",
+ "vpsravq",
+ "vpsravw",
+ "vpsrlvw",
+ "vpternlogd",
+ "vpternlogq",
+ "vptestmb",
+ "vptestmd",
+ "vptestmq",
+ "vptestmw",
+ "vptestnmb",
+ "vptestnmd",
+ "vptestnmq",
+ "vptestnmw",
+ "vpxord",
+ "vpxorq",
+ "vrangepd",
+ "vrangeps",
+ "vrangesd",
+ "vrangess",
+ "vrcp14pd",
+ "vrcp14ps",
+ "vrcp14sd",
+ "vrcp14ss",
+ "vrcp28pd",
+ "vrcp28ps",
+ "vrcp28sd",
+ "vrcp28ss",
+ "vreducepd",
+ "vreduceps",
+ "vreducesd",
+ "vreducess",
+ "vrndscalepd",
+ "vrndscaleps",
+ "vrndscalesd",
+ "vrndscaless",
+ "vrsqrt14pd",
+ "vrsqrt14ps",
+ "vrsqrt14sd",
+ "vrsqrt14ss",
+ "vrsqrt28pd",
+ "vrsqrt28ps",
+ "vrsqrt28sd",
+ "vrsqrt28ss",
+ "vscalefpd",
+ "vscalefps",
+ "vscalefsd",
+ "vscalefss",
+ "vscatterdpd",
+ "vscatterdps",
+ "vscatterpf0dpd",
+ "vscatterpf0dps",
+ "vscatterpf0qpd",
+ "vscatterpf0qps",
+ "vscatterpf1dpd",
+ "vscatterpf1dps",
+ "vscatterpf1qpd",
+ "vscatterpf1qps",
+ "vscatterqpd",
+ "vscatterqps",
+ "vshuff32x4",
+ "vshuff64x2",
+ "vshufi32x4",
+ "vshufi64x2",
+ "rdpkru",
+ "wrpkru",
+ "rdpid",
+ "clflushopt",
+ "clwb",
+ "pcommit",
+ "clzero",
+ "ptwrite",
+ "cldemote",
+ "movdiri",
+ "movdir64b",
+ "pconfig",
+ "tpause",
+ "umonitor",
+ "umwait",
+ "wbnoinvd",
+ "gf2p8affineinvqb",
+ "vgf2p8affineinvqb",
+ "gf2p8affineqb",
+ "vgf2p8affineqb",
+ "gf2p8mulb",
+ "vgf2p8mulb",
+ "vpcompressb",
+ "vpcompressw",
+ "vpexpandb",
+ "vpexpandw",
+ "vpshldw",
+ "vpshldd",
+ "vpshldq",
+ "vpshldvw",
+ "vpshldvd",
+ "vpshldvq",
+ "vpshrdw",
+ "vpshrdd",
+ "vpshrdq",
+ "vpshrdvw",
+ "vpshrdvd",
+ "vpshrdvq",
+ "vpdpbusd",
+ "vpdpbusds",
+ "vpdpwssd",
+ "vpdpwssds",
+ "vpopcntb",
+ "vpopcntw",
+ "vpopcntd",
+ "vpopcntq",
+ "vpshufbitqmb",
+ "v4fmaddps",
+ "v4fnmaddps",
+ "v4fmaddss",
+ "v4fnmaddss",
+ "v4dpwssds",
+ "v4dpwssd",
+ "encls",
+ "enclu",
+ "enclv",
+ "hint_nop0",
+ "hint_nop1",
+ "hint_nop2",
+ "hint_nop3",
+ "hint_nop4",
+ "hint_nop5",
+ "hint_nop6",
+ "hint_nop7",
+ "hint_nop8",
+ "hint_nop9",
+ "hint_nop10",
+ "hint_nop11",
+ "hint_nop12",
+ "hint_nop13",
+ "hint_nop14",
+ "hint_nop15",
+ "hint_nop16",
+ "hint_nop17",
+ "hint_nop18",
+ "hint_nop19",
+ "hint_nop20",
+ "hint_nop21",
+ "hint_nop22",
+ "hint_nop23",
+ "hint_nop24",
+ "hint_nop25",
+ "hint_nop26",
+ "hint_nop27",
+ "hint_nop28",
+ "hint_nop29",
+ "hint_nop30",
+ "hint_nop31",
+ "hint_nop32",
+ "hint_nop33",
+ "hint_nop34",
+ "hint_nop35",
+ "hint_nop36",
+ "hint_nop37",
+ "hint_nop38",
+ "hint_nop39",
+ "hint_nop40",
+ "hint_nop41",
+ "hint_nop42",
+ "hint_nop43",
+ "hint_nop44",
+ "hint_nop45",
+ "hint_nop46",
+ "hint_nop47",
+ "hint_nop48",
+ "hint_nop49",
+ "hint_nop50",
+ "hint_nop51",
+ "hint_nop52",
+ "hint_nop53",
+ "hint_nop54",
+ "hint_nop55",
+ "hint_nop56",
+ "hint_nop57",
+ "hint_nop58",
+ "hint_nop59",
+ "hint_nop60",
+ "hint_nop61",
+ "hint_nop62",
+ "hint_nop63",
+ "cmov",
+ "j",
+ "set"
+};
diff --git a/x86/regdis.c b/x86/regdis.c
new file mode 100644
index 00000000..cef7f01c
--- /dev/null
+++ b/x86/regdis.c
@@ -0,0 +1,20 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#include "regdis.h"
+
+const enum reg_enum nasm_rd_bndreg [ 4] = {R_BND0,R_BND1,R_BND2,R_BND3};
+const enum reg_enum nasm_rd_creg [16] = {R_CR0,R_CR1,R_CR2,R_CR3,R_CR4,R_CR5,R_CR6,R_CR7,R_CR8,R_CR9,R_CR10,R_CR11,R_CR12,R_CR13,R_CR14,R_CR15};
+const enum reg_enum nasm_rd_dreg [16] = {R_DR0,R_DR1,R_DR2,R_DR3,R_DR4,R_DR5,R_DR6,R_DR7,R_DR8,R_DR9,R_DR10,R_DR11,R_DR12,R_DR13,R_DR14,R_DR15};
+const enum reg_enum nasm_rd_fpureg [ 8] = {R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7};
+const enum reg_enum nasm_rd_mmxreg [ 8] = {R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7};
+const enum reg_enum nasm_rd_opmaskreg[ 8] = {R_K0,R_K1,R_K2,R_K3,R_K4,R_K5,R_K6,R_K7};
+const enum reg_enum nasm_rd_reg16 [16] = {R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,R_R8W,R_R9W,R_R10W,R_R11W,R_R12W,R_R13W,R_R14W,R_R15W};
+const enum reg_enum nasm_rd_reg32 [16] = {R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,R_R8D,R_R9D,R_R10D,R_R11D,R_R12D,R_R13D,R_R14D,R_R15D};
+const enum reg_enum nasm_rd_reg64 [16] = {R_RAX,R_RCX,R_RDX,R_RBX,R_RSP,R_RBP,R_RSI,R_RDI,R_R8,R_R9,R_R10,R_R11,R_R12,R_R13,R_R14,R_R15};
+const enum reg_enum nasm_rd_reg8 [ 8] = {R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_DH,R_BH};
+const enum reg_enum nasm_rd_reg8_rex[16] = {R_AL,R_CL,R_DL,R_BL,R_SPL,R_BPL,R_SIL,R_DIL,R_R8B,R_R9B,R_R10B,R_R11B,R_R12B,R_R13B,R_R14B,R_R15B};
+const enum reg_enum nasm_rd_sreg [ 8] = {R_ES,R_CS,R_SS,R_DS,R_FS,R_GS,R_SEGR6,R_SEGR7};
+const enum reg_enum nasm_rd_treg [ 8] = {R_TR0,R_TR1,R_TR2,R_TR3,R_TR4,R_TR5,R_TR6,R_TR7};
+const enum reg_enum nasm_rd_xmmreg [32] = {R_XMM0,R_XMM1,R_XMM2,R_XMM3,R_XMM4,R_XMM5,R_XMM6,R_XMM7,R_XMM8,R_XMM9,R_XMM10,R_XMM11,R_XMM12,R_XMM13,R_XMM14,R_XMM15,R_XMM16,R_XMM17,R_XMM18,R_XMM19,R_XMM20,R_XMM21,R_XMM22,R_XMM23,R_XMM24,R_XMM25,R_XMM26,R_XMM27,R_XMM28,R_XMM29,R_XMM30,R_XMM31};
+const enum reg_enum nasm_rd_ymmreg [32] = {R_YMM0,R_YMM1,R_YMM2,R_YMM3,R_YMM4,R_YMM5,R_YMM6,R_YMM7,R_YMM8,R_YMM9,R_YMM10,R_YMM11,R_YMM12,R_YMM13,R_YMM14,R_YMM15,R_YMM16,R_YMM17,R_YMM18,R_YMM19,R_YMM20,R_YMM21,R_YMM22,R_YMM23,R_YMM24,R_YMM25,R_YMM26,R_YMM27,R_YMM28,R_YMM29,R_YMM30,R_YMM31};
+const enum reg_enum nasm_rd_zmmreg [32] = {R_ZMM0,R_ZMM1,R_ZMM2,R_ZMM3,R_ZMM4,R_ZMM5,R_ZMM6,R_ZMM7,R_ZMM8,R_ZMM9,R_ZMM10,R_ZMM11,R_ZMM12,R_ZMM13,R_ZMM14,R_ZMM15,R_ZMM16,R_ZMM17,R_ZMM18,R_ZMM19,R_ZMM20,R_ZMM21,R_ZMM22,R_ZMM23,R_ZMM24,R_ZMM25,R_ZMM26,R_ZMM27,R_ZMM28,R_ZMM29,R_ZMM30,R_ZMM31};
diff --git a/x86/regdis.h b/x86/regdis.h
new file mode 100644
index 00000000..b2e1a715
--- /dev/null
+++ b/x86/regdis.h
@@ -0,0 +1,25 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#ifndef NASM_REGDIS_H
+#define NASM_REGDIS_H
+
+#include "regs.h"
+
+extern const enum reg_enum nasm_rd_bndreg [ 4];
+extern const enum reg_enum nasm_rd_creg [16];
+extern const enum reg_enum nasm_rd_dreg [16];
+extern const enum reg_enum nasm_rd_fpureg [ 8];
+extern const enum reg_enum nasm_rd_mmxreg [ 8];
+extern const enum reg_enum nasm_rd_opmaskreg[ 8];
+extern const enum reg_enum nasm_rd_reg16 [16];
+extern const enum reg_enum nasm_rd_reg32 [16];
+extern const enum reg_enum nasm_rd_reg64 [16];
+extern const enum reg_enum nasm_rd_reg8 [ 8];
+extern const enum reg_enum nasm_rd_reg8_rex[16];
+extern const enum reg_enum nasm_rd_sreg [ 8];
+extern const enum reg_enum nasm_rd_treg [ 8];
+extern const enum reg_enum nasm_rd_xmmreg [32];
+extern const enum reg_enum nasm_rd_ymmreg [32];
+extern const enum reg_enum nasm_rd_zmmreg [32];
+
+#endif /* NASM_REGDIS_H */
diff --git a/x86/regflags.c b/x86/regflags.c
new file mode 100644
index 00000000..82d27624
--- /dev/null
+++ b/x86/regflags.c
@@ -0,0 +1,248 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#include "tables.h"
+#include "nasm.h"
+
+const opflags_t nasm_reg_flags[] = {
+ 0,
+ REG_HIGH, /* ah */
+ REG_AL, /* al */
+ REG_AX, /* ax */
+ REG_HIGH, /* bh */
+ REG8NA, /* bl */
+ BNDREG, /* bnd0 */
+ BNDREG, /* bnd1 */
+ BNDREG, /* bnd2 */
+ BNDREG, /* bnd3 */
+ REG16NA, /* bp */
+ REG8NA, /* bpl */
+ REG16NA, /* bx */
+ REG_HIGH, /* ch */
+ REG_CL, /* cl */
+ REG_CREG, /* cr0 */
+ REG_CREG, /* cr1 */
+ REG_CREG, /* cr10 */
+ REG_CREG, /* cr11 */
+ REG_CREG, /* cr12 */
+ REG_CREG, /* cr13 */
+ REG_CREG, /* cr14 */
+ REG_CREG, /* cr15 */
+ REG_CREG, /* cr2 */
+ REG_CREG, /* cr3 */
+ REG_CREG, /* cr4 */
+ REG_CREG, /* cr5 */
+ REG_CREG, /* cr6 */
+ REG_CREG, /* cr7 */
+ REG_CREG, /* cr8 */
+ REG_CREG, /* cr9 */
+ REG_CS, /* cs */
+ REG_CX, /* cx */
+ REG_HIGH, /* dh */
+ REG16NA, /* di */
+ REG8NA, /* dil */
+ REG_DL, /* dl */
+ REG_DREG, /* dr0 */
+ REG_DREG, /* dr1 */
+ REG_DREG, /* dr10 */
+ REG_DREG, /* dr11 */
+ REG_DREG, /* dr12 */
+ REG_DREG, /* dr13 */
+ REG_DREG, /* dr14 */
+ REG_DREG, /* dr15 */
+ REG_DREG, /* dr2 */
+ REG_DREG, /* dr3 */
+ REG_DREG, /* dr4 */
+ REG_DREG, /* dr5 */
+ REG_DREG, /* dr6 */
+ REG_DREG, /* dr7 */
+ REG_DREG, /* dr8 */
+ REG_DREG, /* dr9 */
+ REG_DS, /* ds */
+ REG_DX, /* dx */
+ REG_EAX, /* eax */
+ REG32NA, /* ebp */
+ REG32NA, /* ebx */
+ REG_ECX, /* ecx */
+ REG32NA, /* edi */
+ REG_EDX, /* edx */
+ REG_ES, /* es */
+ REG32NA, /* esi */
+ REG32NA, /* esp */
+ REG_FS, /* fs */
+ REG_GS, /* gs */
+ OPMASK0, /* k0 */
+ OPMASKREG, /* k1 */
+ OPMASKREG, /* k2 */
+ OPMASKREG, /* k3 */
+ OPMASKREG, /* k4 */
+ OPMASKREG, /* k5 */
+ OPMASKREG, /* k6 */
+ OPMASKREG, /* k7 */
+ MMXREG, /* mm0 */
+ MMXREG, /* mm1 */
+ MMXREG, /* mm2 */
+ MMXREG, /* mm3 */
+ MMXREG, /* mm4 */
+ MMXREG, /* mm5 */
+ MMXREG, /* mm6 */
+ MMXREG, /* mm7 */
+ REG64NA, /* r10 */
+ REG8NA, /* r10b */
+ REG32NA, /* r10d */
+ REG16NA, /* r10w */
+ REG64NA, /* r11 */
+ REG8NA, /* r11b */
+ REG32NA, /* r11d */
+ REG16NA, /* r11w */
+ REG64NA, /* r12 */
+ REG8NA, /* r12b */
+ REG32NA, /* r12d */
+ REG16NA, /* r12w */
+ REG64NA, /* r13 */
+ REG8NA, /* r13b */
+ REG32NA, /* r13d */
+ REG16NA, /* r13w */
+ REG64NA, /* r14 */
+ REG8NA, /* r14b */
+ REG32NA, /* r14d */
+ REG16NA, /* r14w */
+ REG64NA, /* r15 */
+ REG8NA, /* r15b */
+ REG32NA, /* r15d */
+ REG16NA, /* r15w */
+ REG64NA, /* r8 */
+ REG8NA, /* r8b */
+ REG32NA, /* r8d */
+ REG16NA, /* r8w */
+ REG64NA, /* r9 */
+ REG8NA, /* r9b */
+ REG32NA, /* r9d */
+ REG16NA, /* r9w */
+ REG_RAX, /* rax */
+ REG64NA, /* rbp */
+ REG64NA, /* rbx */
+ REG_RCX, /* rcx */
+ REG64NA, /* rdi */
+ REG_RDX, /* rdx */
+ REG64NA, /* rsi */
+ REG64NA, /* rsp */
+ REG_SEG67, /* segr6 */
+ REG_SEG67, /* segr7 */
+ REG16NA, /* si */
+ REG8NA, /* sil */
+ REG16NA, /* sp */
+ REG8NA, /* spl */
+ REG_SS, /* ss */
+ FPU0, /* st0 */
+ FPUREG, /* st1 */
+ FPUREG, /* st2 */
+ FPUREG, /* st3 */
+ FPUREG, /* st4 */
+ FPUREG, /* st5 */
+ FPUREG, /* st6 */
+ FPUREG, /* st7 */
+ REG_TREG, /* tr0 */
+ REG_TREG, /* tr1 */
+ REG_TREG, /* tr2 */
+ REG_TREG, /* tr3 */
+ REG_TREG, /* tr4 */
+ REG_TREG, /* tr5 */
+ REG_TREG, /* tr6 */
+ REG_TREG, /* tr7 */
+ XMM0, /* xmm0 */
+ XMM_L16, /* xmm1 */
+ XMM_L16, /* xmm10 */
+ XMM_L16, /* xmm11 */
+ XMM_L16, /* xmm12 */
+ XMM_L16, /* xmm13 */
+ XMM_L16, /* xmm14 */
+ XMM_L16, /* xmm15 */
+ XMMREG, /* xmm16 */
+ XMMREG, /* xmm17 */
+ XMMREG, /* xmm18 */
+ XMMREG, /* xmm19 */
+ XMM_L16, /* xmm2 */
+ XMMREG, /* xmm20 */
+ XMMREG, /* xmm21 */
+ XMMREG, /* xmm22 */
+ XMMREG, /* xmm23 */
+ XMMREG, /* xmm24 */
+ XMMREG, /* xmm25 */
+ XMMREG, /* xmm26 */
+ XMMREG, /* xmm27 */
+ XMMREG, /* xmm28 */
+ XMMREG, /* xmm29 */
+ XMM_L16, /* xmm3 */
+ XMMREG, /* xmm30 */
+ XMMREG, /* xmm31 */
+ XMM_L16, /* xmm4 */
+ XMM_L16, /* xmm5 */
+ XMM_L16, /* xmm6 */
+ XMM_L16, /* xmm7 */
+ XMM_L16, /* xmm8 */
+ XMM_L16, /* xmm9 */
+ YMM0, /* ymm0 */
+ YMM_L16, /* ymm1 */
+ YMM_L16, /* ymm10 */
+ YMM_L16, /* ymm11 */
+ YMM_L16, /* ymm12 */
+ YMM_L16, /* ymm13 */
+ YMM_L16, /* ymm14 */
+ YMM_L16, /* ymm15 */
+ YMMREG, /* ymm16 */
+ YMMREG, /* ymm17 */
+ YMMREG, /* ymm18 */
+ YMMREG, /* ymm19 */
+ YMM_L16, /* ymm2 */
+ YMMREG, /* ymm20 */
+ YMMREG, /* ymm21 */
+ YMMREG, /* ymm22 */
+ YMMREG, /* ymm23 */
+ YMMREG, /* ymm24 */
+ YMMREG, /* ymm25 */
+ YMMREG, /* ymm26 */
+ YMMREG, /* ymm27 */
+ YMMREG, /* ymm28 */
+ YMMREG, /* ymm29 */
+ YMM_L16, /* ymm3 */
+ YMMREG, /* ymm30 */
+ YMMREG, /* ymm31 */
+ YMM_L16, /* ymm4 */
+ YMM_L16, /* ymm5 */
+ YMM_L16, /* ymm6 */
+ YMM_L16, /* ymm7 */
+ YMM_L16, /* ymm8 */
+ YMM_L16, /* ymm9 */
+ ZMM0, /* zmm0 */
+ ZMM_L16, /* zmm1 */
+ ZMM_L16, /* zmm10 */
+ ZMM_L16, /* zmm11 */
+ ZMM_L16, /* zmm12 */
+ ZMM_L16, /* zmm13 */
+ ZMM_L16, /* zmm14 */
+ ZMM_L16, /* zmm15 */
+ ZMMREG, /* zmm16 */
+ ZMMREG, /* zmm17 */
+ ZMMREG, /* zmm18 */
+ ZMMREG, /* zmm19 */
+ ZMM_L16, /* zmm2 */
+ ZMMREG, /* zmm20 */
+ ZMMREG, /* zmm21 */
+ ZMMREG, /* zmm22 */
+ ZMMREG, /* zmm23 */
+ ZMMREG, /* zmm24 */
+ ZMMREG, /* zmm25 */
+ ZMMREG, /* zmm26 */
+ ZMMREG, /* zmm27 */
+ ZMMREG, /* zmm28 */
+ ZMMREG, /* zmm29 */
+ ZMM_L16, /* zmm3 */
+ ZMMREG, /* zmm30 */
+ ZMMREG, /* zmm31 */
+ ZMM_L16, /* zmm4 */
+ ZMM_L16, /* zmm5 */
+ ZMM_L16, /* zmm6 */
+ ZMM_L16, /* zmm7 */
+ ZMM_L16, /* zmm8 */
+ ZMM_L16, /* zmm9 */
+};
diff --git a/x86/regs.c b/x86/regs.c
new file mode 100644
index 00000000..903c1b58
--- /dev/null
+++ b/x86/regs.c
@@ -0,0 +1,246 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#include "tables.h"
+
+const char * const nasm_reg_names[] = {
+ "ah",
+ "al",
+ "ax",
+ "bh",
+ "bl",
+ "bnd0",
+ "bnd1",
+ "bnd2",
+ "bnd3",
+ "bp",
+ "bpl",
+ "bx",
+ "ch",
+ "cl",
+ "cr0",
+ "cr1",
+ "cr10",
+ "cr11",
+ "cr12",
+ "cr13",
+ "cr14",
+ "cr15",
+ "cr2",
+ "cr3",
+ "cr4",
+ "cr5",
+ "cr6",
+ "cr7",
+ "cr8",
+ "cr9",
+ "cs",
+ "cx",
+ "dh",
+ "di",
+ "dil",
+ "dl",
+ "dr0",
+ "dr1",
+ "dr10",
+ "dr11",
+ "dr12",
+ "dr13",
+ "dr14",
+ "dr15",
+ "dr2",
+ "dr3",
+ "dr4",
+ "dr5",
+ "dr6",
+ "dr7",
+ "dr8",
+ "dr9",
+ "ds",
+ "dx",
+ "eax",
+ "ebp",
+ "ebx",
+ "ecx",
+ "edi",
+ "edx",
+ "es",
+ "esi",
+ "esp",
+ "fs",
+ "gs",
+ "k0",
+ "k1",
+ "k2",
+ "k3",
+ "k4",
+ "k5",
+ "k6",
+ "k7",
+ "mm0",
+ "mm1",
+ "mm2",
+ "mm3",
+ "mm4",
+ "mm5",
+ "mm6",
+ "mm7",
+ "r10",
+ "r10b",
+ "r10d",
+ "r10w",
+ "r11",
+ "r11b",
+ "r11d",
+ "r11w",
+ "r12",
+ "r12b",
+ "r12d",
+ "r12w",
+ "r13",
+ "r13b",
+ "r13d",
+ "r13w",
+ "r14",
+ "r14b",
+ "r14d",
+ "r14w",
+ "r15",
+ "r15b",
+ "r15d",
+ "r15w",
+ "r8",
+ "r8b",
+ "r8d",
+ "r8w",
+ "r9",
+ "r9b",
+ "r9d",
+ "r9w",
+ "rax",
+ "rbp",
+ "rbx",
+ "rcx",
+ "rdi",
+ "rdx",
+ "rsi",
+ "rsp",
+ "segr6",
+ "segr7",
+ "si",
+ "sil",
+ "sp",
+ "spl",
+ "ss",
+ "st0",
+ "st1",
+ "st2",
+ "st3",
+ "st4",
+ "st5",
+ "st6",
+ "st7",
+ "tr0",
+ "tr1",
+ "tr2",
+ "tr3",
+ "tr4",
+ "tr5",
+ "tr6",
+ "tr7",
+ "xmm0",
+ "xmm1",
+ "xmm10",
+ "xmm11",
+ "xmm12",
+ "xmm13",
+ "xmm14",
+ "xmm15",
+ "xmm16",
+ "xmm17",
+ "xmm18",
+ "xmm19",
+ "xmm2",
+ "xmm20",
+ "xmm21",
+ "xmm22",
+ "xmm23",
+ "xmm24",
+ "xmm25",
+ "xmm26",
+ "xmm27",
+ "xmm28",
+ "xmm29",
+ "xmm3",
+ "xmm30",
+ "xmm31",
+ "xmm4",
+ "xmm5",
+ "xmm6",
+ "xmm7",
+ "xmm8",
+ "xmm9",
+ "ymm0",
+ "ymm1",
+ "ymm10",
+ "ymm11",
+ "ymm12",
+ "ymm13",
+ "ymm14",
+ "ymm15",
+ "ymm16",
+ "ymm17",
+ "ymm18",
+ "ymm19",
+ "ymm2",
+ "ymm20",
+ "ymm21",
+ "ymm22",
+ "ymm23",
+ "ymm24",
+ "ymm25",
+ "ymm26",
+ "ymm27",
+ "ymm28",
+ "ymm29",
+ "ymm3",
+ "ymm30",
+ "ymm31",
+ "ymm4",
+ "ymm5",
+ "ymm6",
+ "ymm7",
+ "ymm8",
+ "ymm9",
+ "zmm0",
+ "zmm1",
+ "zmm10",
+ "zmm11",
+ "zmm12",
+ "zmm13",
+ "zmm14",
+ "zmm15",
+ "zmm16",
+ "zmm17",
+ "zmm18",
+ "zmm19",
+ "zmm2",
+ "zmm20",
+ "zmm21",
+ "zmm22",
+ "zmm23",
+ "zmm24",
+ "zmm25",
+ "zmm26",
+ "zmm27",
+ "zmm28",
+ "zmm29",
+ "zmm3",
+ "zmm30",
+ "zmm31",
+ "zmm4",
+ "zmm5",
+ "zmm6",
+ "zmm7",
+ "zmm8",
+ "zmm9"
+};
diff --git a/x86/regs.dat b/x86/regs.dat
new file mode 100644
index 00000000..723f6a44
--- /dev/null
+++ b/x86/regs.dat
@@ -0,0 +1,138 @@
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# List of registers and their classes; classes are defined in nasm.h
+#
+# The columns are:
+#
+# register name, assembler class, disassembler class(es), x86 register number[, token flag]
+#
+# If the register name ends in two numbers separated by a dash, then it is
+# repeated as many times as indicated, and the register number is
+# updated with it.
+#
+# If 'token flag' is present, this value will be assigned to tokflag field in
+# 'struct tokendata tokendata[]' table. Token flag can be used for specifying
+# special usage of corresponding register. E.g. opmask registers can be either
+# enclosed by curly braces or standalone operand depending on the usage.
+#
+
+# General-purpose registers
+al REG_AL reg8,reg8_rex 0
+ah REG_HIGH reg8 4
+ax REG_AX reg16 0
+eax REG_EAX reg32 0
+rax REG_RAX reg64 0
+bl REG8NA reg8,reg8_rex 3
+bh REG_HIGH reg8 7
+bx REG16NA reg16 3
+ebx REG32NA reg32 3
+rbx REG64NA reg64 3
+cl REG_CL reg8,reg8_rex 1
+ch REG_HIGH reg8 5
+cx REG_CX reg16 1
+ecx REG_ECX reg32 1
+rcx REG_RCX reg64 1
+dl REG_DL reg8,reg8_rex 2
+dh REG_HIGH reg8 6
+dx REG_DX reg16 2
+edx REG_EDX reg32 2
+rdx REG_RDX reg64 2
+spl REG8NA reg8_rex 4
+sp REG16NA reg16 4
+esp REG32NA reg32 4
+rsp REG64NA reg64 4
+bpl REG8NA reg8_rex 5
+bp REG16NA reg16 5
+ebp REG32NA reg32 5
+rbp REG64NA reg64 5
+sil REG8NA reg8_rex 6
+si REG16NA reg16 6
+esi REG32NA reg32 6
+rsi REG64NA reg64 6
+dil REG8NA reg8_rex 7
+di REG16NA reg16 7
+edi REG32NA reg32 7
+rdi REG64NA reg64 7
+r8-15b REG8NA reg8_rex 8
+r8-15w REG16NA reg16 8
+r8-15d REG32NA reg32 8
+r8-15 REG64NA reg64 8
+
+# Segment registers
+es REG_ES sreg 0
+cs REG_CS sreg 1
+ss REG_SS sreg 2
+ds REG_DS sreg 3
+fs REG_FS sreg 4
+gs REG_GS sreg 5
+segr6-7 REG_SEG67 sreg 6
+
+# Control registers
+cr0-15 REG_CREG creg 0
+
+# Debug registers
+dr0-15 REG_DREG dreg 0
+
+# Test registers
+tr0-7 REG_TREG treg 0
+
+# Floating-point registers
+st0 FPU0 fpureg 0
+st1-7 FPUREG fpureg 1
+
+# MMX registers
+mm0-7 MMXREG mmxreg 0
+
+# SSE registers
+xmm0 XMM0 xmmreg 0
+xmm1-15 XMM_L16 xmmreg 1
+xmm16-31 XMMREG xmmreg 16
+
+# AVX registers
+ymm0 YMM0 ymmreg 0
+ymm1-15 YMM_L16 ymmreg 1
+ymm16-31 YMMREG ymmreg 16
+
+# AVX512 registers
+zmm0 ZMM0 zmmreg 0
+zmm1-15 ZMM_L16 zmmreg 1
+zmm16-31 ZMMREG zmmreg 16
+
+# Opmask registers
+k0 OPMASK0 opmaskreg 0
+k1-7 OPMASKREG opmaskreg 1 TFLAG_BRC_OPT
+
+# Bounds registers
+bnd0-3 BNDREG bndreg 0
diff --git a/x86/regs.h b/x86/regs.h
new file mode 100644
index 00000000..bdfb5564
--- /dev/null
+++ b/x86/regs.h
@@ -0,0 +1,498 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#ifndef NASM_REGS_H
+#define NASM_REGS_H
+
+#define EXPR_REG_START 1
+
+enum reg_enum {
+ R_zero = 0,
+ R_none = -1,
+ R_AH = EXPR_REG_START,
+ R_AL,
+ R_AX,
+ R_BH,
+ R_BL,
+ R_BND0,
+ R_BND1,
+ R_BND2,
+ R_BND3,
+ R_BP,
+ R_BPL,
+ R_BX,
+ R_CH,
+ R_CL,
+ R_CR0,
+ R_CR1,
+ R_CR10,
+ R_CR11,
+ R_CR12,
+ R_CR13,
+ R_CR14,
+ R_CR15,
+ R_CR2,
+ R_CR3,
+ R_CR4,
+ R_CR5,
+ R_CR6,
+ R_CR7,
+ R_CR8,
+ R_CR9,
+ R_CS,
+ R_CX,
+ R_DH,
+ R_DI,
+ R_DIL,
+ R_DL,
+ R_DR0,
+ R_DR1,
+ R_DR10,
+ R_DR11,
+ R_DR12,
+ R_DR13,
+ R_DR14,
+ R_DR15,
+ R_DR2,
+ R_DR3,
+ R_DR4,
+ R_DR5,
+ R_DR6,
+ R_DR7,
+ R_DR8,
+ R_DR9,
+ R_DS,
+ R_DX,
+ R_EAX,
+ R_EBP,
+ R_EBX,
+ R_ECX,
+ R_EDI,
+ R_EDX,
+ R_ES,
+ R_ESI,
+ R_ESP,
+ R_FS,
+ R_GS,
+ R_K0,
+ R_K1,
+ R_K2,
+ R_K3,
+ R_K4,
+ R_K5,
+ R_K6,
+ R_K7,
+ R_MM0,
+ R_MM1,
+ R_MM2,
+ R_MM3,
+ R_MM4,
+ R_MM5,
+ R_MM6,
+ R_MM7,
+ R_R10,
+ R_R10B,
+ R_R10D,
+ R_R10W,
+ R_R11,
+ R_R11B,
+ R_R11D,
+ R_R11W,
+ R_R12,
+ R_R12B,
+ R_R12D,
+ R_R12W,
+ R_R13,
+ R_R13B,
+ R_R13D,
+ R_R13W,
+ R_R14,
+ R_R14B,
+ R_R14D,
+ R_R14W,
+ R_R15,
+ R_R15B,
+ R_R15D,
+ R_R15W,
+ R_R8,
+ R_R8B,
+ R_R8D,
+ R_R8W,
+ R_R9,
+ R_R9B,
+ R_R9D,
+ R_R9W,
+ R_RAX,
+ R_RBP,
+ R_RBX,
+ R_RCX,
+ R_RDI,
+ R_RDX,
+ R_RSI,
+ R_RSP,
+ R_SEGR6,
+ R_SEGR7,
+ R_SI,
+ R_SIL,
+ R_SP,
+ R_SPL,
+ R_SS,
+ R_ST0,
+ R_ST1,
+ R_ST2,
+ R_ST3,
+ R_ST4,
+ R_ST5,
+ R_ST6,
+ R_ST7,
+ R_TR0,
+ R_TR1,
+ R_TR2,
+ R_TR3,
+ R_TR4,
+ R_TR5,
+ R_TR6,
+ R_TR7,
+ R_XMM0,
+ R_XMM1,
+ R_XMM10,
+ R_XMM11,
+ R_XMM12,
+ R_XMM13,
+ R_XMM14,
+ R_XMM15,
+ R_XMM16,
+ R_XMM17,
+ R_XMM18,
+ R_XMM19,
+ R_XMM2,
+ R_XMM20,
+ R_XMM21,
+ R_XMM22,
+ R_XMM23,
+ R_XMM24,
+ R_XMM25,
+ R_XMM26,
+ R_XMM27,
+ R_XMM28,
+ R_XMM29,
+ R_XMM3,
+ R_XMM30,
+ R_XMM31,
+ R_XMM4,
+ R_XMM5,
+ R_XMM6,
+ R_XMM7,
+ R_XMM8,
+ R_XMM9,
+ R_YMM0,
+ R_YMM1,
+ R_YMM10,
+ R_YMM11,
+ R_YMM12,
+ R_YMM13,
+ R_YMM14,
+ R_YMM15,
+ R_YMM16,
+ R_YMM17,
+ R_YMM18,
+ R_YMM19,
+ R_YMM2,
+ R_YMM20,
+ R_YMM21,
+ R_YMM22,
+ R_YMM23,
+ R_YMM24,
+ R_YMM25,
+ R_YMM26,
+ R_YMM27,
+ R_YMM28,
+ R_YMM29,
+ R_YMM3,
+ R_YMM30,
+ R_YMM31,
+ R_YMM4,
+ R_YMM5,
+ R_YMM6,
+ R_YMM7,
+ R_YMM8,
+ R_YMM9,
+ R_ZMM0,
+ R_ZMM1,
+ R_ZMM10,
+ R_ZMM11,
+ R_ZMM12,
+ R_ZMM13,
+ R_ZMM14,
+ R_ZMM15,
+ R_ZMM16,
+ R_ZMM17,
+ R_ZMM18,
+ R_ZMM19,
+ R_ZMM2,
+ R_ZMM20,
+ R_ZMM21,
+ R_ZMM22,
+ R_ZMM23,
+ R_ZMM24,
+ R_ZMM25,
+ R_ZMM26,
+ R_ZMM27,
+ R_ZMM28,
+ R_ZMM29,
+ R_ZMM3,
+ R_ZMM30,
+ R_ZMM31,
+ R_ZMM4,
+ R_ZMM5,
+ R_ZMM6,
+ R_ZMM7,
+ R_ZMM8,
+ R_ZMM9,
+ REG_ENUM_LIMIT
+};
+
+#define EXPR_REG_END 240
+
+#define REG_NUM_AH 4
+#define REG_NUM_AL 0
+#define REG_NUM_AX 0
+#define REG_NUM_BH 7
+#define REG_NUM_BL 3
+#define REG_NUM_BND0 0
+#define REG_NUM_BND1 1
+#define REG_NUM_BND2 2
+#define REG_NUM_BND3 3
+#define REG_NUM_BP 5
+#define REG_NUM_BPL 5
+#define REG_NUM_BX 3
+#define REG_NUM_CH 5
+#define REG_NUM_CL 1
+#define REG_NUM_CR0 0
+#define REG_NUM_CR1 1
+#define REG_NUM_CR10 10
+#define REG_NUM_CR11 11
+#define REG_NUM_CR12 12
+#define REG_NUM_CR13 13
+#define REG_NUM_CR14 14
+#define REG_NUM_CR15 15
+#define REG_NUM_CR2 2
+#define REG_NUM_CR3 3
+#define REG_NUM_CR4 4
+#define REG_NUM_CR5 5
+#define REG_NUM_CR6 6
+#define REG_NUM_CR7 7
+#define REG_NUM_CR8 8
+#define REG_NUM_CR9 9
+#define REG_NUM_CS 1
+#define REG_NUM_CX 1
+#define REG_NUM_DH 6
+#define REG_NUM_DI 7
+#define REG_NUM_DIL 7
+#define REG_NUM_DL 2
+#define REG_NUM_DR0 0
+#define REG_NUM_DR1 1
+#define REG_NUM_DR10 10
+#define REG_NUM_DR11 11
+#define REG_NUM_DR12 12
+#define REG_NUM_DR13 13
+#define REG_NUM_DR14 14
+#define REG_NUM_DR15 15
+#define REG_NUM_DR2 2
+#define REG_NUM_DR3 3
+#define REG_NUM_DR4 4
+#define REG_NUM_DR5 5
+#define REG_NUM_DR6 6
+#define REG_NUM_DR7 7
+#define REG_NUM_DR8 8
+#define REG_NUM_DR9 9
+#define REG_NUM_DS 3
+#define REG_NUM_DX 2
+#define REG_NUM_EAX 0
+#define REG_NUM_EBP 5
+#define REG_NUM_EBX 3
+#define REG_NUM_ECX 1
+#define REG_NUM_EDI 7
+#define REG_NUM_EDX 2
+#define REG_NUM_ES 0
+#define REG_NUM_ESI 6
+#define REG_NUM_ESP 4
+#define REG_NUM_FS 4
+#define REG_NUM_GS 5
+#define REG_NUM_K0 0
+#define REG_NUM_K1 1
+#define REG_NUM_K2 2
+#define REG_NUM_K3 3
+#define REG_NUM_K4 4
+#define REG_NUM_K5 5
+#define REG_NUM_K6 6
+#define REG_NUM_K7 7
+#define REG_NUM_MM0 0
+#define REG_NUM_MM1 1
+#define REG_NUM_MM2 2
+#define REG_NUM_MM3 3
+#define REG_NUM_MM4 4
+#define REG_NUM_MM5 5
+#define REG_NUM_MM6 6
+#define REG_NUM_MM7 7
+#define REG_NUM_R10 10
+#define REG_NUM_R10B 10
+#define REG_NUM_R10D 10
+#define REG_NUM_R10W 10
+#define REG_NUM_R11 11
+#define REG_NUM_R11B 11
+#define REG_NUM_R11D 11
+#define REG_NUM_R11W 11
+#define REG_NUM_R12 12
+#define REG_NUM_R12B 12
+#define REG_NUM_R12D 12
+#define REG_NUM_R12W 12
+#define REG_NUM_R13 13
+#define REG_NUM_R13B 13
+#define REG_NUM_R13D 13
+#define REG_NUM_R13W 13
+#define REG_NUM_R14 14
+#define REG_NUM_R14B 14
+#define REG_NUM_R14D 14
+#define REG_NUM_R14W 14
+#define REG_NUM_R15 15
+#define REG_NUM_R15B 15
+#define REG_NUM_R15D 15
+#define REG_NUM_R15W 15
+#define REG_NUM_R8 8
+#define REG_NUM_R8B 8
+#define REG_NUM_R8D 8
+#define REG_NUM_R8W 8
+#define REG_NUM_R9 9
+#define REG_NUM_R9B 9
+#define REG_NUM_R9D 9
+#define REG_NUM_R9W 9
+#define REG_NUM_RAX 0
+#define REG_NUM_RBP 5
+#define REG_NUM_RBX 3
+#define REG_NUM_RCX 1
+#define REG_NUM_RDI 7
+#define REG_NUM_RDX 2
+#define REG_NUM_RSI 6
+#define REG_NUM_RSP 4
+#define REG_NUM_SEGR6 6
+#define REG_NUM_SEGR7 7
+#define REG_NUM_SI 6
+#define REG_NUM_SIL 6
+#define REG_NUM_SP 4
+#define REG_NUM_SPL 4
+#define REG_NUM_SS 2
+#define REG_NUM_ST0 0
+#define REG_NUM_ST1 1
+#define REG_NUM_ST2 2
+#define REG_NUM_ST3 3
+#define REG_NUM_ST4 4
+#define REG_NUM_ST5 5
+#define REG_NUM_ST6 6
+#define REG_NUM_ST7 7
+#define REG_NUM_TR0 0
+#define REG_NUM_TR1 1
+#define REG_NUM_TR2 2
+#define REG_NUM_TR3 3
+#define REG_NUM_TR4 4
+#define REG_NUM_TR5 5
+#define REG_NUM_TR6 6
+#define REG_NUM_TR7 7
+#define REG_NUM_XMM0 0
+#define REG_NUM_XMM1 1
+#define REG_NUM_XMM10 10
+#define REG_NUM_XMM11 11
+#define REG_NUM_XMM12 12
+#define REG_NUM_XMM13 13
+#define REG_NUM_XMM14 14
+#define REG_NUM_XMM15 15
+#define REG_NUM_XMM16 16
+#define REG_NUM_XMM17 17
+#define REG_NUM_XMM18 18
+#define REG_NUM_XMM19 19
+#define REG_NUM_XMM2 2
+#define REG_NUM_XMM20 20
+#define REG_NUM_XMM21 21
+#define REG_NUM_XMM22 22
+#define REG_NUM_XMM23 23
+#define REG_NUM_XMM24 24
+#define REG_NUM_XMM25 25
+#define REG_NUM_XMM26 26
+#define REG_NUM_XMM27 27
+#define REG_NUM_XMM28 28
+#define REG_NUM_XMM29 29
+#define REG_NUM_XMM3 3
+#define REG_NUM_XMM30 30
+#define REG_NUM_XMM31 31
+#define REG_NUM_XMM4 4
+#define REG_NUM_XMM5 5
+#define REG_NUM_XMM6 6
+#define REG_NUM_XMM7 7
+#define REG_NUM_XMM8 8
+#define REG_NUM_XMM9 9
+#define REG_NUM_YMM0 0
+#define REG_NUM_YMM1 1
+#define REG_NUM_YMM10 10
+#define REG_NUM_YMM11 11
+#define REG_NUM_YMM12 12
+#define REG_NUM_YMM13 13
+#define REG_NUM_YMM14 14
+#define REG_NUM_YMM15 15
+#define REG_NUM_YMM16 16
+#define REG_NUM_YMM17 17
+#define REG_NUM_YMM18 18
+#define REG_NUM_YMM19 19
+#define REG_NUM_YMM2 2
+#define REG_NUM_YMM20 20
+#define REG_NUM_YMM21 21
+#define REG_NUM_YMM22 22
+#define REG_NUM_YMM23 23
+#define REG_NUM_YMM24 24
+#define REG_NUM_YMM25 25
+#define REG_NUM_YMM26 26
+#define REG_NUM_YMM27 27
+#define REG_NUM_YMM28 28
+#define REG_NUM_YMM29 29
+#define REG_NUM_YMM3 3
+#define REG_NUM_YMM30 30
+#define REG_NUM_YMM31 31
+#define REG_NUM_YMM4 4
+#define REG_NUM_YMM5 5
+#define REG_NUM_YMM6 6
+#define REG_NUM_YMM7 7
+#define REG_NUM_YMM8 8
+#define REG_NUM_YMM9 9
+#define REG_NUM_ZMM0 0
+#define REG_NUM_ZMM1 1
+#define REG_NUM_ZMM10 10
+#define REG_NUM_ZMM11 11
+#define REG_NUM_ZMM12 12
+#define REG_NUM_ZMM13 13
+#define REG_NUM_ZMM14 14
+#define REG_NUM_ZMM15 15
+#define REG_NUM_ZMM16 16
+#define REG_NUM_ZMM17 17
+#define REG_NUM_ZMM18 18
+#define REG_NUM_ZMM19 19
+#define REG_NUM_ZMM2 2
+#define REG_NUM_ZMM20 20
+#define REG_NUM_ZMM21 21
+#define REG_NUM_ZMM22 22
+#define REG_NUM_ZMM23 23
+#define REG_NUM_ZMM24 24
+#define REG_NUM_ZMM25 25
+#define REG_NUM_ZMM26 26
+#define REG_NUM_ZMM27 27
+#define REG_NUM_ZMM28 28
+#define REG_NUM_ZMM29 29
+#define REG_NUM_ZMM3 3
+#define REG_NUM_ZMM30 30
+#define REG_NUM_ZMM31 31
+#define REG_NUM_ZMM4 4
+#define REG_NUM_ZMM5 5
+#define REG_NUM_ZMM6 6
+#define REG_NUM_ZMM7 7
+#define REG_NUM_ZMM8 8
+#define REG_NUM_ZMM9 9
+
+
+#endif /* NASM_REGS_H */
diff --git a/x86/regs.pl b/x86/regs.pl
new file mode 100755
index 00000000..3a1b56f5
--- /dev/null
+++ b/x86/regs.pl
@@ -0,0 +1,204 @@
+#!/usr/bin/perl
+## --------------------------------------------------------------------------
+##
+## Copyright 1996-2009 The NASM Authors - All Rights Reserved
+## See the file AUTHORS included with the NASM distribution for
+## the specific copyright holders.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following
+## conditions are met:
+##
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * 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 COPYRIGHT OWNER 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.
+##
+## --------------------------------------------------------------------------
+
+#
+# Read regs.dat and output regs.h and regs.c (included in names.c)
+#
+
+$nline = 0;
+
+sub toint($) {
+ my($v) = @_;
+
+ return ($v =~ /^0/) ? oct $v : $v+0;
+}
+
+sub process_line($) {
+ my($line) = @_;
+ my @v;
+
+ if ( $line !~ /^\s*(\S+)\s*(\S+)\s*(\S+)\s*([0-9]+)\s*(\S*)/i ) {
+ die "regs.dat:$nline: invalid input\n";
+ }
+ $reg = $1;
+ $aclass = $2;
+ $dclasses = $3;
+ $x86regno = toint($4);
+
+ if ($reg =~ /^(.*[^0-9])([0-9]+)\-([0-9]+)(|[^0-9].*)$/) {
+ $nregs = $3-$2+1;
+ $reg = $1.$2.$4;
+ $reg_nr = $2;
+ $reg_prefix = $1;
+ $reg_suffix = $4;
+ } else {
+ $nregs = 1;
+ undef $reg_prefix, $reg_suffix;
+ }
+
+ while ($nregs--) {
+ $regs{$reg} = $aclass;
+ $regvals{$reg} = $x86regno;
+
+ foreach $dclass (split(/,/, $dclasses)) {
+ if ( !defined($disclass{$dclass}) ) {
+ $disclass{$dclass} = [];
+ }
+
+ $disclass{$dclass}->[$x86regno] = $reg;
+ }
+
+ # Compute the next register, if any
+ if (defined($reg_prefix)) {
+ $x86regno++;
+ $reg_nr++;
+ $reg = sprintf("%s%u%s", $reg_prefix, $reg_nr, $reg_suffix);
+ } else {
+ # Not a dashed sequence
+ die if ($nregs);
+ }
+ }
+}
+
+($fmt, $file) = @ARGV;
+
+%regs = ();
+%regvals = ();
+%disclass = ();
+open(REGS, '<', $file) or die "$0: Cannot open $file\n";
+while ( defined($line = <REGS>) ) {
+ $nline++;
+
+ chomp $line;
+ $line =~ s/\s*(\#.*|)$//;
+
+ next if ( $line eq '' );
+
+ process_line($line);
+}
+close(REGS);
+
+if ( $fmt eq 'h' ) {
+ # Output regs.h
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#ifndef NASM_REGS_H\n";
+ print "#define NASM_REGS_H\n\n";
+
+ $expr_regs = 1;
+ printf "#define EXPR_REG_START %d\n\n", $expr_regs;
+ print "enum reg_enum {\n";
+ # Unfortunately the code uses both 0 and -1 as "no register" in
+ # different places...
+ print " R_zero = 0,\n";
+ print " R_none = -1,\n";
+ $attach = ' = EXPR_REG_START'; # EXPR_REG_START == 1
+ foreach $reg ( sort(keys(%regs)) ) {
+ print " R_\U${reg}\E${attach},\n";
+ $attach = '';
+ $expr_regs++;
+ }
+ print " REG_ENUM_LIMIT\n";
+ print "};\n\n";
+ printf "#define EXPR_REG_END %d\n\n", $expr_regs-1;
+ foreach $reg ( sort(keys(%regs)) ) {
+ printf "#define %-15s %2d\n", "REG_NUM_\U${reg}", $regvals{$reg};
+ }
+ print "\n\n#endif /* NASM_REGS_H */\n";
+} elsif ( $fmt eq 'c' ) {
+ # Output regs.c
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#include \"tables.h\"\n\n";
+ print "const char * const nasm_reg_names[] = "; $ch = '{';
+ # This one has no dummy entry for 0
+ foreach $reg ( sort(keys(%regs)) ) {
+ print "$ch\n \"${reg}\"";
+ $ch = ',';
+ }
+ print "\n};\n";
+} elsif ( $fmt eq 'fc' ) {
+ # Output regflags.c
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#include \"tables.h\"\n";
+ print "#include \"nasm.h\"\n\n";
+ print "const opflags_t nasm_reg_flags[] = {\n";
+ printf " 0,\n"; # Dummy entry for 0
+ foreach $reg ( sort(keys(%regs)) ) {
+ # Print the class of the register
+ printf " %-15s /* %-5s */\n",
+ $regs{$reg}.',', $reg;
+ }
+ print "};\n";
+} elsif ( $fmt eq 'vc' ) {
+ # Output regvals.c
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#include \"tables.h\"\n\n";
+ print "const int nasm_regvals[] = {\n";
+ print " -1,\n"; # Dummy entry for 0
+ foreach $reg ( sort(keys(%regs)) ) {
+ # Print the x86 value of the register
+ printf " %2d, /* %-5s */\n", $regvals{$reg}, $reg;
+ }
+ print "};\n";
+} elsif ( $fmt eq 'dc' ) {
+ # Output regdis.c
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#include \"regdis.h\"\n\n";
+ foreach $class ( sort(keys(%disclass)) ) {
+ printf "const enum reg_enum nasm_rd_%-8s[%2d] = {",
+ $class, scalar @{$disclass{$class}};
+ @foo = @{$disclass{$class}};
+ @bar = ();
+ for ( $i = 0 ; $i < scalar(@foo) ; $i++ ) {
+ if (defined($foo[$i])) {
+ push(@bar, "R_\U$foo[$i]\E");
+ } else {
+ die "$0: No register name for class $class, value $i\n";
+ }
+ }
+ print join(',', @bar), "};\n";
+ }
+} elsif ( $fmt eq 'dh' ) {
+ # Output regdis.h
+ print "/* automatically generated from $file - do not edit */\n\n";
+ print "#ifndef NASM_REGDIS_H\n";
+ print "#define NASM_REGDIS_H\n\n";
+ print "#include \"regs.h\"\n\n";
+ foreach $class ( sort(keys(%disclass)) ) {
+ printf "extern const enum reg_enum nasm_rd_%-8s[%2d];\n",
+ $class, scalar @{$disclass{$class}};
+ }
+ print "\n#endif /* NASM_REGDIS_H */\n";
+} else {
+ die "$0: Unknown output format\n";
+}
diff --git a/x86/regvals.c b/x86/regvals.c
new file mode 100644
index 00000000..2e9ea23e
--- /dev/null
+++ b/x86/regvals.c
@@ -0,0 +1,247 @@
+/* automatically generated from ./x86/regs.dat - do not edit */
+
+#include "tables.h"
+
+const int nasm_regvals[] = {
+ -1,
+ 4, /* ah */
+ 0, /* al */
+ 0, /* ax */
+ 7, /* bh */
+ 3, /* bl */
+ 0, /* bnd0 */
+ 1, /* bnd1 */
+ 2, /* bnd2 */
+ 3, /* bnd3 */
+ 5, /* bp */
+ 5, /* bpl */
+ 3, /* bx */
+ 5, /* ch */
+ 1, /* cl */
+ 0, /* cr0 */
+ 1, /* cr1 */
+ 10, /* cr10 */
+ 11, /* cr11 */
+ 12, /* cr12 */
+ 13, /* cr13 */
+ 14, /* cr14 */
+ 15, /* cr15 */
+ 2, /* cr2 */
+ 3, /* cr3 */
+ 4, /* cr4 */
+ 5, /* cr5 */
+ 6, /* cr6 */
+ 7, /* cr7 */
+ 8, /* cr8 */
+ 9, /* cr9 */
+ 1, /* cs */
+ 1, /* cx */
+ 6, /* dh */
+ 7, /* di */
+ 7, /* dil */
+ 2, /* dl */
+ 0, /* dr0 */
+ 1, /* dr1 */
+ 10, /* dr10 */
+ 11, /* dr11 */
+ 12, /* dr12 */
+ 13, /* dr13 */
+ 14, /* dr14 */
+ 15, /* dr15 */
+ 2, /* dr2 */
+ 3, /* dr3 */
+ 4, /* dr4 */
+ 5, /* dr5 */
+ 6, /* dr6 */
+ 7, /* dr7 */
+ 8, /* dr8 */
+ 9, /* dr9 */
+ 3, /* ds */
+ 2, /* dx */
+ 0, /* eax */
+ 5, /* ebp */
+ 3, /* ebx */
+ 1, /* ecx */
+ 7, /* edi */
+ 2, /* edx */
+ 0, /* es */
+ 6, /* esi */
+ 4, /* esp */
+ 4, /* fs */
+ 5, /* gs */
+ 0, /* k0 */
+ 1, /* k1 */
+ 2, /* k2 */
+ 3, /* k3 */
+ 4, /* k4 */
+ 5, /* k5 */
+ 6, /* k6 */
+ 7, /* k7 */
+ 0, /* mm0 */
+ 1, /* mm1 */
+ 2, /* mm2 */
+ 3, /* mm3 */
+ 4, /* mm4 */
+ 5, /* mm5 */
+ 6, /* mm6 */
+ 7, /* mm7 */
+ 10, /* r10 */
+ 10, /* r10b */
+ 10, /* r10d */
+ 10, /* r10w */
+ 11, /* r11 */
+ 11, /* r11b */
+ 11, /* r11d */
+ 11, /* r11w */
+ 12, /* r12 */
+ 12, /* r12b */
+ 12, /* r12d */
+ 12, /* r12w */
+ 13, /* r13 */
+ 13, /* r13b */
+ 13, /* r13d */
+ 13, /* r13w */
+ 14, /* r14 */
+ 14, /* r14b */
+ 14, /* r14d */
+ 14, /* r14w */
+ 15, /* r15 */
+ 15, /* r15b */
+ 15, /* r15d */
+ 15, /* r15w */
+ 8, /* r8 */
+ 8, /* r8b */
+ 8, /* r8d */
+ 8, /* r8w */
+ 9, /* r9 */
+ 9, /* r9b */
+ 9, /* r9d */
+ 9, /* r9w */
+ 0, /* rax */
+ 5, /* rbp */
+ 3, /* rbx */
+ 1, /* rcx */
+ 7, /* rdi */
+ 2, /* rdx */
+ 6, /* rsi */
+ 4, /* rsp */
+ 6, /* segr6 */
+ 7, /* segr7 */
+ 6, /* si */
+ 6, /* sil */
+ 4, /* sp */
+ 4, /* spl */
+ 2, /* ss */
+ 0, /* st0 */
+ 1, /* st1 */
+ 2, /* st2 */
+ 3, /* st3 */
+ 4, /* st4 */
+ 5, /* st5 */
+ 6, /* st6 */
+ 7, /* st7 */
+ 0, /* tr0 */
+ 1, /* tr1 */
+ 2, /* tr2 */
+ 3, /* tr3 */
+ 4, /* tr4 */
+ 5, /* tr5 */
+ 6, /* tr6 */
+ 7, /* tr7 */
+ 0, /* xmm0 */
+ 1, /* xmm1 */
+ 10, /* xmm10 */
+ 11, /* xmm11 */
+ 12, /* xmm12 */
+ 13, /* xmm13 */
+ 14, /* xmm14 */
+ 15, /* xmm15 */
+ 16, /* xmm16 */
+ 17, /* xmm17 */
+ 18, /* xmm18 */
+ 19, /* xmm19 */
+ 2, /* xmm2 */
+ 20, /* xmm20 */
+ 21, /* xmm21 */
+ 22, /* xmm22 */
+ 23, /* xmm23 */
+ 24, /* xmm24 */
+ 25, /* xmm25 */
+ 26, /* xmm26 */
+ 27, /* xmm27 */
+ 28, /* xmm28 */
+ 29, /* xmm29 */
+ 3, /* xmm3 */
+ 30, /* xmm30 */
+ 31, /* xmm31 */
+ 4, /* xmm4 */
+ 5, /* xmm5 */
+ 6, /* xmm6 */
+ 7, /* xmm7 */
+ 8, /* xmm8 */
+ 9, /* xmm9 */
+ 0, /* ymm0 */
+ 1, /* ymm1 */
+ 10, /* ymm10 */
+ 11, /* ymm11 */
+ 12, /* ymm12 */
+ 13, /* ymm13 */
+ 14, /* ymm14 */
+ 15, /* ymm15 */
+ 16, /* ymm16 */
+ 17, /* ymm17 */
+ 18, /* ymm18 */
+ 19, /* ymm19 */
+ 2, /* ymm2 */
+ 20, /* ymm20 */
+ 21, /* ymm21 */
+ 22, /* ymm22 */
+ 23, /* ymm23 */
+ 24, /* ymm24 */
+ 25, /* ymm25 */
+ 26, /* ymm26 */
+ 27, /* ymm27 */
+ 28, /* ymm28 */
+ 29, /* ymm29 */
+ 3, /* ymm3 */
+ 30, /* ymm30 */
+ 31, /* ymm31 */
+ 4, /* ymm4 */
+ 5, /* ymm5 */
+ 6, /* ymm6 */
+ 7, /* ymm7 */
+ 8, /* ymm8 */
+ 9, /* ymm9 */
+ 0, /* zmm0 */
+ 1, /* zmm1 */
+ 10, /* zmm10 */
+ 11, /* zmm11 */
+ 12, /* zmm12 */
+ 13, /* zmm13 */
+ 14, /* zmm14 */
+ 15, /* zmm15 */
+ 16, /* zmm16 */
+ 17, /* zmm17 */
+ 18, /* zmm18 */
+ 19, /* zmm19 */
+ 2, /* zmm2 */
+ 20, /* zmm20 */
+ 21, /* zmm21 */
+ 22, /* zmm22 */
+ 23, /* zmm23 */
+ 24, /* zmm24 */
+ 25, /* zmm25 */
+ 26, /* zmm26 */
+ 27, /* zmm27 */
+ 28, /* zmm28 */
+ 29, /* zmm29 */
+ 3, /* zmm3 */
+ 30, /* zmm30 */
+ 31, /* zmm31 */
+ 4, /* zmm4 */
+ 5, /* zmm5 */
+ 6, /* zmm6 */
+ 7, /* zmm7 */
+ 8, /* zmm8 */
+ 9, /* zmm9 */
+};