NASM 0.98p3-hpa
authorH. Peter Anvin <hpa@zytor.com>
Tue, 30 Apr 2002 20:54:13 +0000 (20:54 +0000)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 30 Apr 2002 20:54:13 +0000 (20:54 +0000)
MODIFIED [new file with mode: 0644]
Makefile.in
insns.bas
insns.dat
insns.pl
names.c
nasm.h

diff --git a/MODIFIED b/MODIFIED
new file mode 100644 (file)
index 0000000..f7626f3
--- /dev/null
+++ b/MODIFIED
@@ -0,0 +1,18 @@
+This is a modified version of NASM, modified and released by H. Peter
+Anvin <hpa@zytor.com>; it is not the original form released by the
+NASM authors.
+
+The changes include:
+
+1. Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
+   buildable version for Unix systems (Makefile.in updates, etc.)
+
+2. 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.
+
+3. 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.)
index 5b8aceb..063e492 100644 (file)
@@ -25,8 +25,8 @@ INSTALL_DATA = @INSTALL_DATA@
 
 NASM = nasm.o nasmlib.o float.o insnsa.o assemble.o labels.o \
        parser.o outform.o outbin.o outaout.o outcoff.o outelf.o \
-       outobj.o outas86.o outrdf.o outdbg.o preproc.o listing.o \
-       eval.o
+       outobj.o outas86.o outrdf.o outrdf2.o outdbg.o zoutieee.o \
+       preproc.o listing.o eval.o
 
 NDISASM = ndisasm.o disasm.o sync.o nasmlib.o insnsd.o
 
@@ -38,37 +38,39 @@ nasm: $(NASM)
 ndisasm: $(NDISASM)
        $(CC) -o ndisasm $(NDISASM)
 
-assemble.o: assemble.c nasm.h nasmlib.h assemble.h insns.h
-disasm.o: disasm.c nasm.h disasm.h sync.h insns.h names.c
-eval.o: eval.c eval.h nasm.h nasmlib.h
-float.o: float.c nasm.h
-insnsa.o: insnsa.c nasm.h insns.h
-insnsd.o: insnsd.c nasm.h insns.h
-labels.o: labels.c nasm.h nasmlib.h
-listing.o: listing.c nasm.h nasmlib.h listing.h
-nasm.o: nasm.c nasm.h nasmlib.h preproc.h parser.h assemble.h labels.h \
+assemble.o: assemble.c nasm.h insnsi.h nasmlib.h assemble.h insns.h
+disasm.o: disasm.c nasm.h insnsi.h disasm.h sync.h insns.h names.c insnsn.c
+eval.o: eval.c eval.h nasm.h insnsi.h nasmlib.h
+float.o: float.c nasm.h insnsi.h
+insnsa.o: insnsa.c nasm.h insnsi.h insns.h
+insnsd.o: insnsd.c nasm.h insnsi.h insns.h
+labels.o: labels.c nasm.h insnsi.h nasmlib.h
+listing.o: listing.c nasm.h insnsi.h nasmlib.h listing.h
+nasm.o: nasm.c nasm.h insnsi.h nasmlib.h preproc.h parser.h assemble.h labels.h \
  outform.h listing.h
-nasmlib.o: nasmlib.c nasm.h nasmlib.h
-ndisasm.o: ndisasm.c nasm.h nasmlib.h sync.h disasm.h
-outaout.o: outaout.c nasm.h nasmlib.h outform.h
-outas86.o: outas86.c nasm.h nasmlib.h outform.h
-outbin.o: outbin.c nasm.h nasmlib.h outform.h
-outcoff.o: outcoff.c nasm.h nasmlib.h outform.h
-outdbg.o: outdbg.c nasm.h nasmlib.h outform.h
-outelf.o: outelf.c nasm.h nasmlib.h outform.h
-outform.o: outform.c outform.h nasm.h
-outobj.o: outobj.c nasm.h nasmlib.h outform.h
-outrdf.o: outrdf.c nasm.h nasmlib.h outform.h
-parser.o: parser.c nasm.h nasmlib.h parser.h float.h names.c
-preproc.o: preproc.c nasm.h nasmlib.h macros.c
+nasmlib.o: nasmlib.c nasm.h insnsi.h nasmlib.h
+ndisasm.o: ndisasm.c nasm.h insnsi.h nasmlib.h sync.h disasm.h
+outaout.o: outaout.c nasm.h insnsi.h nasmlib.h outform.h
+outas86.o: outas86.c nasm.h insnsi.h nasmlib.h outform.h
+outbin.o: outbin.c nasm.h insnsi.h nasmlib.h outform.h
+outcoff.o: outcoff.c nasm.h insnsi.h nasmlib.h outform.h
+outdbg.o: outdbg.c nasm.h insnsi.h nasmlib.h outform.h
+outelf.o: outelf.c nasm.h insnsi.h nasmlib.h outform.h
+outform.o: outform.c outform.h nasm.h insnsi.h
+outobj.o: outobj.c nasm.h insnsi.h nasmlib.h outform.h
+outrdf.o: outrdf.c nasm.h insnsi.h nasmlib.h outform.h
+outrdf2.o: outrdf2.c nasm.h insnsi.h nasmlib.h outform.h
+parser.o: parser.c nasm.h insnsi.h nasmlib.h parser.h float.h names.c insnsn.c
+preproc.o: preproc.c nasm.h insnsi.h nasmlib.h macros.c
 sync.o: sync.c sync.h
+zoutieee.o: zoutieee.c nasm.h insnsi.h nasmlib.h outform.h
 
-# These two source files are automagically generated from a single
+# These source files are automagically generated from a single
 # instruction-table file by a Perl script. They're distributed,
 # though, so it isn't necessary to have Perl just to recompile NASM
 # from the distribution.
 
-insnsa.c insnsd.c: insns.dat insns.pl
+insnsa.c insnsd.c insnsi.h insnsn.c: insns.dat insns.pl
        perl $(srcdir)/insns.pl $(srcdir)/insns.dat
 
 # This source file is generated from the standard macros file
@@ -89,7 +91,7 @@ clean:
        cd rdoff; $(MAKE) clean
 
 spotless: clean
-       rm -f config.* Makefile
+       rm -f config.* Makefile *~
        cd rdoff; $(MAKE) spotless
 
 rdf:
index 36dc3e1..5178aa6 100644 (file)
--- a/insns.bas
+++ b/insns.bas
@@ -5,11 +5,16 @@
 '         FIDO:     Mark Junker@2:2437/47.21
 '
 ' COMMENT: While I wrote this program I often asked me, if it isn't easier
-'          to write an interpreter for pearl-scripts :]
+'          to write an interpreter for Perl-scripts :]
 '
 ' COMMENT: To start the program press SHIFT+F5 within the QBasic IDE
 '          or start it from the command-line with QBASIC /RUN MACROS
 '
+'
+' THIS PROGRAM NEEDS TO BE UPDATED -- it doesn't create insnsi.h
+' and insnsn.c.  However, Perl interpreters are now available for both
+' DOS and Windows, so it seems pointless to spend the effort.
+'
 
 DEFINT A-Z
 
index 4113a07..1659422 100644 (file)
--- a/insns.dat
+++ b/insns.dat
@@ -8,9 +8,7 @@
 ; 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. _ALL_ opcodes
-; listed in the `enum' in nasm.h must be present in here, in the
-; same order. This is to build the main instruction table for NASM.
+; taken except to register the opcode as being present.
 
 AAA       void                \1\x37                        8086
 AAD       void                \2\xD5\x0A                    8086
@@ -389,6 +387,8 @@ FXCH      void                \2\xD9\xC9                    8086,FPU
 FXCH      fpureg              \1\xD9\10\xC8                 8086,FPU
 FXCH      fpureg,fpu0         \1\xD9\10\xC8                 8086,FPU
 FXCH      fpu0,fpureg         \1\xD9\11\xC8                 8086,FPU
+FXRSTOR   mem                 \300\2\x0F\xAE\202            P6,FPU
+FXSAVE    mem                 \300\2\x0F\xAE\200            P6,FPU
 FXTRACT   void                \2\xD9\xF4                    8086,FPU
 FYL2X     void                \2\xD9\xF1                    8086,FPU
 FYL2XP1   void                \2\xD9\xF9                    8086,FPU
@@ -985,6 +985,8 @@ SUB       rm32,imm            \321\300\1\x81\205\41         386,SM
 SUB       mem,imm8            \300\1\x80\205\21             8086,SM
 SUB       mem,imm16           \320\300\1\x81\205\31         8086,SM
 SUB       mem,imm32           \321\300\1\x81\205\41         386,SM
+SYSENTER  void                \2\x0F\x34                    P6
+SYSEXIT   void                \2\x0F\x36                    P6,PRIV
 TEST      mem,reg8            \300\1\x84\101                8086,SM
 TEST      reg8,reg8           \300\1\x84\101                8086
 TEST      mem,reg16           \320\300\1\x85\101            8086,SM
@@ -1003,6 +1005,8 @@ TEST      rm32,imm            \321\300\1\xF7\200\41         386,SM
 TEST      mem,imm8            \300\1\xF6\200\21             8086,SM
 TEST      mem,imm16           \320\300\1\xF7\200\31         8086,SM
 TEST      mem,imm32           \321\300\1\xF7\200\41         386,SM
+UD1       void                \2\x0F\xB9                    286
+UD2       void                \2\x0F\x0B                    286
 UMOV      mem,reg8            \300\2\x0F\x10\101            386,UNDOC,SM
 UMOV      reg8,reg8           \300\2\x0F\x10\101            386,UNDOC
 UMOV      mem,reg16           \320\300\2\x0F\x11\101        386,UNDOC,SM
index 9dc4dd4..8e2ac1e 100644 (file)
--- a/insns.pl
+++ b/insns.pl
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 #
-# insns.pl   produce insnsa.c and insnsd.c from insns.dat
+# insns.pl   produce insnsa.c, insnsd.c, insnsi.h, insnsn.c from insns.dat
 #
 # The Netwide Assembler is copyright (C) 1996 Simon Tatham and
 # Julian Hall. All rights reserved. The software is
@@ -102,6 +102,85 @@ print D "};\n";
 
 close D;
 
+print STDERR "Writing insnsi.h...\n";
+
+open I, ">insnsi.h";
+
+print I "/* This file is auto-generated from insns.dat by insns.pl" .
+        " - don't exit it */\n\n";
+print I "/* This file in included by nasm.h */\n\n";
+
+print I "/* Instruction names */\n";
+print I "enum {";
+$first  = 1;
+$maxlen = 0;
+foreach $i (@opcodes) {
+    print I "," if ( !$first );
+    $first = 0;
+    print I "\n\tI_${i}";
+    $len = length($i);
+    $len++ if ( $i =~ /cc$/ ); # Condition codes can be 3 characters long
+    $maxlen = $len if ( $len > $maxlen );
+}
+print I "\n};\n\n";
+print I "#define MAX_INSLEN ", $maxlen, "\n";
+
+close I;
+
+print STDERR "Writing insnsn.c...\n";
+
+open N, ">insnsn.c";
+
+print N "/* This file is auto-generated from insns.dat by insns.pl" .
+        " - don't exit it */\n\n";
+print N "/* This file in included by names.c */\n\n";
+
+print N "static char *insn_names[] = {";
+$first = 1;
+foreach $i (@opcodes) {
+    # Don't include conditional instructions
+    if ( $i !~ /cc$/ ) {
+       print N "," if ( !$first );
+       $first = 0;
+       $ilower = $i;
+       $ilower =~ tr/A-Z/a-z/;
+       print N "\n\t\"${ilower}\"";
+    }
+}
+print N "\n};\n\n";
+print N "/* Conditional instructions */\n";
+print N "static char *icn[] = {";
+$first = 1;
+foreach $i (@opcodes) {
+    # Only conditional instructions
+    if ( $i =~ /cc$/ ) {
+       $ins = $`;              # Skip cc suffix
+       print N "," if ( !$first );
+       $first = 0;
+       $ilower = $i;
+       $ilower =~ tr/A-Z/a-z/;
+       print N "\n\t\"${ilower}\"";
+    }
+}
+
+print N "\n};\n\n";
+print N "/* and the corresponding opcodes */\n";
+print N "static int ico[] = {";
+$first = 1;
+foreach $i (@opcodes) {
+    # Only conditional instructions
+    if ( $i =~ /cc$/ ) {
+       $ins = $`;              # Skip cc suffix
+       print N "," if ( !$first );
+       $first = 0;
+       print N "\n\tI_$i";
+    }
+}
+
+print N "\n};\n";
+
+close N;
+
 printf STDERR "Done: %d instructions\n", $insns;
 
 sub format {
diff --git a/names.c b/names.c
index cc16845..1a462ec 100644 (file)
--- a/names.c
+++ b/names.c
@@ -17,76 +17,11 @@ static char *reg_names[] = {               /* register names, as strings */
     "st7", "tr3", "tr4", "tr5", "tr6", "tr7"
 };
 
-static char *insn_names[] = {         /* instruction names, as strings */
-    "aaa", "aad", "aam", "aas", "adc", "add", "and", "arpl",
-    "bound", "bsf", "bsr", "bswap", "bt", "btc", "btr", "bts",
-    "call", "cbw", "cdq", "clc", "cld", "cli", "clts", "cmc", "cmp",
-    "cmpsb", "cmpsd", "cmpsw", "cmpxchg", "cmpxchg486", "cmpxchg8b",
-    "cpuid", "cwd", "cwde", "daa", "das", "db", "dd", "dec", "div",
-    "dq", "dt", "dw", "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", "fiadd", "ficom", "ficomp", "fidiv",
-    "fidivr", "fild", "fimul", "fincstp", "finit", "fist", "fistp",
-    "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", "incbin", "insb", "insd", "insw", "int",
-    "int01", "int1", "int3", "into", "invd", "invlpg", "iret",
-    "iretd", "iretw", "jcxz", "jecxz", "jmp", "lahf", "lar", "lds",
-    "lea", "leave", "les", "lfs", "lgdt", "lgs", "lidt", "lldt",
-    "lmsw", "loadall", "loadall286", "lodsb", "lodsd", "lodsw",
-    "loop", "loope", "loopne", "loopnz", "loopz", "lsl", "lss",
-    "ltr", "mov", "movd", "movq", "movsb", "movsd", "movsw",
-    "movsx", "movzx", "mul", "neg", "nop", "not", "or", "out",
-    "outsb", "outsd", "outsw", "packssdw", "packsswb", "packuswb",
-    "paddb", "paddd", "paddsb", "paddsiw", "paddsw", "paddusb",
-    "paddusw", "paddw", "pand", "pandn", "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",
-    "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",
-    "pushfw", "pxor", "rcl", "rcr", "rdmsr", "rdpmc", "rdtsc",
-    "resb", "resd", "resq", "rest", "resw", "ret", "retf", "retn",
-    "rol", "ror", "rsm", "sahf", "sal", "salc", "sar", "sbb",
-    "scasb", "scasd", "scasw", "sgdt", "shl", "shld", "shr", "shrd",
-    "sidt", "sldt", "smi", "smsw", "stc", "std", "sti", "stosb",
-    "stosd", "stosw", "str", "sub", "test", "umov", "verr", "verw",
-    "wait", "wbinvd", "wrmsr", "xadd", "xbts", "xchg", "xlatb",
-    "xor"
-};
-
-static char *icn[] = {                /* conditional instructions */
-    "cmov", "j", "set"
-};
-
-static int ico[] = {                  /* and the corresponding opcodes */
-    I_CMOVcc, I_Jcc, I_SETcc
-};
-
 static char *conditions[] = {         /* condition code names */
     "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"
 };
+
+/* Instruction names automatically generated from insns.dat */
+#include "insnsn.c"
diff --git a/nasm.h b/nasm.h
index aabe568..3ea75f2 100644 (file)
--- a/nasm.h
+++ b/nasm.h
@@ -426,67 +426,15 @@ enum {                                   /* register names */
     R_ST6, R_ST7, R_TR3, R_TR4, R_TR5, R_TR6, R_TR7, REG_ENUM_LIMIT
 };
 
-enum {                                /* instruction names */
-    I_AAA, I_AAD, I_AAM, I_AAS, I_ADC, I_ADD, I_AND, I_ARPL,
-    I_BOUND, I_BSF, I_BSR, I_BSWAP, I_BT, I_BTC, I_BTR, I_BTS,
-    I_CALL, I_CBW, I_CDQ, I_CLC, I_CLD, I_CLI, I_CLTS, I_CMC, I_CMP,
-    I_CMPSB, I_CMPSD, I_CMPSW, I_CMPXCHG, I_CMPXCHG486, I_CMPXCHG8B,
-    I_CPUID, I_CWD, I_CWDE, I_DAA, I_DAS, I_DB, I_DD, I_DEC, I_DIV,
-    I_DQ, I_DT, I_DW, 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_FIADD, I_FICOM, I_FICOMP, I_FIDIV,
-    I_FIDIVR, I_FILD, I_FIMUL, I_FINCSTP, I_FINIT, I_FIST, I_FISTP,
-    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_INCBIN, I_INSB, I_INSD, I_INSW, I_INT,
-    I_INT01, I_INT1, I_INT3, I_INTO, I_INVD, I_INVLPG, I_IRET,
-    I_IRETD, I_IRETW, I_JCXZ, I_JECXZ, I_JMP, I_LAHF, I_LAR, I_LDS,
-    I_LEA, I_LEAVE, I_LES, I_LFS, I_LGDT, I_LGS, I_LIDT, I_LLDT,
-    I_LMSW, I_LOADALL, I_LOADALL286, I_LODSB, I_LODSD, I_LODSW,
-    I_LOOP, I_LOOPE, I_LOOPNE, I_LOOPNZ, I_LOOPZ, I_LSL, I_LSS,
-    I_LTR, I_MOV, I_MOVD, I_MOVQ, I_MOVSB, I_MOVSD, I_MOVSW,
-    I_MOVSX, I_MOVZX, I_MUL, 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_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_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_PUSHFW, I_PXOR, I_RCL, I_RCR, I_RDMSR, I_RDPMC, I_RDTSC,
-    I_RESB, I_RESD, I_RESQ, I_REST, I_RESW, I_RET, I_RETF, I_RETN,
-    I_ROL, I_ROR, I_RSM, I_SAHF, I_SAL, I_SALC, I_SAR, I_SBB,
-    I_SCASB, I_SCASD, I_SCASW, I_SGDT, I_SHL, I_SHLD, I_SHR, I_SHRD,
-    I_SIDT, I_SLDT, I_SMI, I_SMSW, I_STC, I_STD, I_STI, I_STOSB,
-    I_STOSD, I_STOSW, I_STR, I_SUB, I_TEST, I_UMOV, I_VERR, I_VERW,
-    I_WAIT, I_WBINVD, I_WRMSR, I_XADD, I_XBTS, I_XCHG, I_XLATB,
-    I_XOR, I_CMOVcc, I_Jcc, I_SETcc
-};
-
-#define MAX_KEYWORD 9  /* max length of any instruction, register name etc. */
+/* Instruction names automatically generated from insns.dat */
+#include "insnsi.h"
+
+/* max length of any instruction, register name etc. */
+#if MAX_INSLEN > 9
+#define MAX_KEYWORD MAX_INSLEN
+#else
+#define MAX_KEYWORD 9
+#endif
 
 enum {                                /* 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,