Browse Source

Rebase to revision 18805

git-svn-id: branches/svenbarth/classhelpers@18825 -
svenbarth 14 years ago
parent
commit
bc96bb0be5
100 changed files with 4161 additions and 2913 deletions
  1. 60 6
      .gitattributes
  2. 8 3
      Makefile
  3. 1 1
      Makefile.fpc
  4. 44 8
      compiler/Makefile
  5. 53 6
      compiler/Makefile.fpc
  6. 77 7
      compiler/aasmtai.pas
  7. 75 13
      compiler/aggas.pas
  8. 0 27
      compiler/alpha/cpubase.pas
  9. 3 1
      compiler/arm/armatt.inc
  10. 2 0
      compiler/arm/armatts.inc
  11. 3 0
      compiler/arm/armins.dat
  12. 3 1
      compiler/arm/armop.inc
  13. 2 1
      compiler/arm/cgcpu.pas
  14. 0 33
      compiler/arm/cpubase.pas
  15. 3 1
      compiler/arm/cpuinfo.pas
  16. 50 11
      compiler/arm/narmset.pas
  17. 23 0
      compiler/arm/rgcpu.pas
  18. 21 11
      compiler/avr/cgcpu.pas
  19. 5 35
      compiler/avr/cpubase.pas
  20. 20 8
      compiler/avr/cpuinfo.pas
  21. 33 4
      compiler/avr/raavrgas.pas
  22. 1 1
      compiler/cclasses.pas
  23. 60 8
      compiler/cmsgs.pas
  24. 12 11
      compiler/comphook.pas
  25. 30 1
      compiler/compiler.pas
  26. 13 5
      compiler/comprsrc.pas
  27. 4 0
      compiler/constexp.pas
  28. 37 2
      compiler/dbgdwarf.pas
  29. 16 28
      compiler/dbgstabs.pas
  30. 7 4
      compiler/defcmp.pas
  31. 11 3
      compiler/defutil.pas
  32. 7 0
      compiler/fpcdefs.inc
  33. 1 103
      compiler/generic/cpuinfo.pas
  34. 9 4
      compiler/globals.pas
  35. 25 3
      compiler/globtype.pas
  36. 57 30
      compiler/htypechk.pas
  37. 0 26
      compiler/i386/cpubase.inc
  38. 1 1
      compiler/i386/cputarg.pas
  39. 2 0
      compiler/i386/i386att.inc
  40. 2 0
      compiler/i386/i386atts.inc
  41. 2 0
      compiler/i386/i386int.inc
  42. 1 1
      compiler/i386/i386nop.inc
  43. 2 0
      compiler/i386/i386op.inc
  44. 20 18
      compiler/i386/i386prop.inc
  45. 1217 1203
      compiler/i386/i386tab.inc
  46. 122 15
      compiler/link.pas
  47. 4 4
      compiler/m68k/n68kadd.pas
  48. 2 2
      compiler/mips/aasmcpu.pas
  49. 0 33
      compiler/mips/cpubase.pas
  50. 2 2
      compiler/mips/cpuinfo.pas
  51. 195 158
      compiler/msg/errord.msg
  52. 133 49
      compiler/msg/errordu.msg
  53. 33 9
      compiler/msg/errore.msg
  54. 10 4
      compiler/msgidx.inc
  55. 464 456
      compiler/msgtxt.inc
  56. 289 211
      compiler/nadd.pas
  57. 17 17
      compiler/nbas.pas
  58. 19 4
      compiler/ncal.pas
  59. 34 12
      compiler/ncgadd.pas
  60. 8 7
      compiler/ncgrtti.pas
  61. 21 4
      compiler/ncgutil.pas
  62. 8 5
      compiler/ncnv.pas
  63. 17 12
      compiler/nflw.pas
  64. 24 7
      compiler/ninl.pas
  65. 10 1
      compiler/nld.pas
  66. 5 2
      compiler/nmat.pas
  67. 36 0
      compiler/nmem.pas
  68. 9 4
      compiler/nobj.pas
  69. 6 6
      compiler/nset.pas
  70. 22 0
      compiler/nutils.pas
  71. 33 22
      compiler/ogbase.pas
  72. 129 15
      compiler/ogcoff.pas
  73. 7 2
      compiler/ognlm.pas
  74. 1 1
      compiler/optcse.pas
  75. 9 0
      compiler/options.pas
  76. 5 0
      compiler/parser.pas
  77. 2 2
      compiler/pdecl.pas
  78. 1 0
      compiler/pdecobj.pas
  79. 17 50
      compiler/pdecsub.pas
  80. 33 8
      compiler/pdecvar.pas
  81. 13 8
      compiler/pexpr.pas
  82. 10 4
      compiler/pmodules.pas
  83. 6 6
      compiler/powerpc/cgcpu.pas
  84. 1 1
      compiler/powerpc64/rappcgas.pas
  85. 3 2
      compiler/ppcgen/cgppc.pas
  86. 4 4
      compiler/ppcgen/ngppcadd.pas
  87. 187 24
      compiler/ppu.pas
  88. 9 7
      compiler/ppx86_64.lpi
  89. 24 12
      compiler/psystem.pas
  90. 34 4
      compiler/ptconst.pas
  91. 24 8
      compiler/ptype.pas
  92. 29 16
      compiler/rautils.pas
  93. 16 0
      compiler/rgobj.pas
  94. 14 1
      compiler/scandir.pas
  95. 2 2
      compiler/scanner.pas
  96. 2 1
      compiler/sparc/cgcpu.pas
  97. 1 55
      compiler/sparc/cpubase.pas
  98. 2 2
      compiler/sparc/racpugas.pas
  99. 24 1
      compiler/switches.pas
  100. 6 2
      compiler/symconst.pas

+ 60 - 6
.gitattributes

@@ -152,7 +152,6 @@ compiler/globtype.pas svneol=native#text/plain
 compiler/html/i386/readme.txt svneol=native#text/plain
 compiler/html/powerpc/readme.txt svneol=native#text/plain
 compiler/htypechk.pas svneol=native#text/plain
-compiler/i386/ag386nsm.pas svneol=native#text/plain
 compiler/i386/aopt386.pas svneol=native#text/plain
 compiler/i386/cgcpu.pas svneol=native#text/plain
 compiler/i386/cpubase.inc svneol=native#text/plain
@@ -615,6 +614,7 @@ compiler/wpoinfo.pas svneol=native#text/plain
 compiler/x86/aasmcpu.pas svneol=native#text/plain
 compiler/x86/agx86att.pas svneol=native#text/plain
 compiler/x86/agx86int.pas svneol=native#text/plain
+compiler/x86/agx86nsm.pas svneol=native#text/plain
 compiler/x86/cga.pas svneol=native#text/plain
 compiler/x86/cgx86.pas svneol=native#text/plain
 compiler/x86/cpubase.pas svneol=native#text/plain
@@ -1014,6 +1014,7 @@ packages/chm/src/paslzx.pas svneol=native#text/plain
 packages/chm/src/paslzxcomp.pas svneol=native#text/plain
 packages/cocoaint/Makefile svneol=native#text/plain
 packages/cocoaint/Makefile.fpc svneol=native#text/plain
+packages/cocoaint/fpmake.pp svneol=native#text/plain
 packages/cocoaint/src/AnonClassDefinitionsCoredata.pas svneol=native#text/plain
 packages/cocoaint/src/AnonClassDefinitionsQuartzcore.pas svneol=native#text/plain
 packages/cocoaint/src/AnonClassDefinitionsWebkit.pas svneol=native#text/plain
@@ -1635,6 +1636,7 @@ packages/fastcgi/fpmake.pp svneol=native#text/plain
 packages/fastcgi/src/fastcgi.pp svneol=native#text/plain
 packages/fcl-async/Makefile svneol=native#text/plain
 packages/fcl-async/Makefile.fpc svneol=native#text/plain
+packages/fcl-async/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-async/fpmake.pp svneol=native#text/plain
 packages/fcl-async/src/fpasync.pp svneol=native#text/plain
 packages/fcl-async/src/libasync.inc svneol=native#text/plain
@@ -1642,6 +1644,7 @@ packages/fcl-async/src/libasynch.inc svneol=native#text/plain
 packages/fcl-async/src/unix/libasync.pp svneol=native#text/plain
 packages/fcl-base/Makefile svneol=native#text/plain
 packages/fcl-base/Makefile.fpc svneol=native#text/plain
+packages/fcl-base/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-base/examples/Makefile svneol=native#text/plain
 packages/fcl-base/examples/Makefile.fpc svneol=native#text/plain
 packages/fcl-base/examples/README.txt svneol=native#text/plain
@@ -1656,7 +1659,6 @@ packages/fcl-base/examples/base64decodingtestcase.pas svneol=native#text/plain
 packages/fcl-base/examples/cachetest.pp svneol=native#text/plain
 packages/fcl-base/examples/cfgtest.pp svneol=native#text/plain
 packages/fcl-base/examples/crittest.pp svneol=native#text/plain
-packages/fcl-base/examples/daemon.txt svneol=native#text/plain
 packages/fcl-base/examples/dbugsrv.pp svneol=native#text/plain
 packages/fcl-base/examples/debugtest.pp svneol=native#text/plain
 packages/fcl-base/examples/decodeascii85.pp svneol=native#text/plain
@@ -1876,6 +1878,7 @@ packages/fcl-db/src/dbase/tdbf_l.pas svneol=native#text/plain
 packages/fcl-db/src/dbase/testdbf.pp svneol=native#text/plain
 packages/fcl-db/src/export/Makefile svneol=native#text/plain
 packages/fcl-db/src/export/Makefile.fpc svneol=native#text/plain
+packages/fcl-db/src/export/XMLXSDExportReadme.TXT svneol=native#text/plain
 packages/fcl-db/src/export/fpcsvexport.pp svneol=native#text/plain
 packages/fcl-db/src/export/fpdbexport.pp svneol=native#text/plain
 packages/fcl-db/src/export/fpdbfexport.pp svneol=native#text/plain
@@ -1886,6 +1889,7 @@ packages/fcl-db/src/export/fpsimplexmlexport.pp svneol=native#text/plain
 packages/fcl-db/src/export/fpsqlexport.pp svneol=native#text/plain
 packages/fcl-db/src/export/fpstdexports.pp svneol=native#text/plain
 packages/fcl-db/src/export/fptexexport.pp svneol=native#text/plain
+packages/fcl-db/src/export/fpxmlxsdexport.pp svneol=native#text/plain
 packages/fcl-db/src/memds/Makefile svneol=native#text/plain
 packages/fcl-db/src/memds/Makefile.fpc svneol=native#text/plain
 packages/fcl-db/src/memds/README.txt svneol=native#text/plain
@@ -1972,6 +1976,8 @@ packages/fcl-db/src/sqlite/testds.pas svneol=native#text/plain
 packages/fcl-db/tests/Makefile -text
 packages/fcl-db/tests/Makefile.fpc -text
 packages/fcl-db/tests/README.txt svneol=native#text/plain
+packages/fcl-db/tests/XMLXSDExportTest.lpi svneol=native#text/plain
+packages/fcl-db/tests/XMLXSDExportTest.lpr svneol=native#text/plain
 packages/fcl-db/tests/database.ini.txt svneol=native#text/plain
 packages/fcl-db/tests/dbftoolsunit.pas svneol=native#text/plain
 packages/fcl-db/tests/dbtestframework.pas svneol=native#text/plain
@@ -1993,11 +1999,14 @@ packages/fcl-db/tests/testsqlscanner.lpi svneol=native#text/plain
 packages/fcl-db/tests/testsqlscanner.lpr svneol=native#text/plain
 packages/fcl-db/tests/testsqlscript.pas svneol=native#text/plain
 packages/fcl-db/tests/toolsunit.pas svneol=native#text/plain
+packages/fcl-db/tests/xmlxsdexporttestcase1.pas svneol=native#text/plain
 packages/fcl-extra/Makefile svneol=native#text/plain
 packages/fcl-extra/Makefile.fpc svneol=native#text/plain
+packages/fcl-extra/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-extra/examples/Makefile svneol=native#text/plain
 packages/fcl-extra/examples/Makefile.fpc svneol=native#text/plain
 packages/fcl-extra/examples/daemon.pp svneol=native#text/plain
+packages/fcl-extra/examples/daemon.txt svneol=native#text/plain
 packages/fcl-extra/fpmake.pp svneol=native#text/pascal
 packages/fcl-extra/src/daemonapp.pp svneol=native#text/plain
 packages/fcl-extra/src/unix/daemonapp.inc svneol=native#text/plain
@@ -2050,6 +2059,7 @@ packages/fcl-fpcunit/src/xmlreporter.pas svneol=native#text/plain
 packages/fcl-fpcunit/src/xmltestreport.pp svneol=native#text/plain
 packages/fcl-image/Makefile svneol=native#text/plain
 packages/fcl-image/Makefile.fpc svneol=native#text/plain
+packages/fcl-image/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-image/examples/Makefile svneol=native#text/plain
 packages/fcl-image/examples/Makefile.fpc svneol=native#text/plain
 packages/fcl-image/examples/drawing.pp svneol=native#text/plain
@@ -2111,8 +2121,9 @@ packages/fcl-image/src/targacmn.pp svneol=native#text/plain
 packages/fcl-image/src/xwdfile.pp svneol=native#text/plain
 packages/fcl-js/Makefile svneol=native#text/plain
 packages/fcl-js/Makefile.fpc svneol=native#text/plain
+packages/fcl-js/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-js/README.TXT svneol=native#text/plain
-packages/fcl-js/fpmake_disabled.pp svneol=native#text/plain
+packages/fcl-js/fpmake.pp svneol=native#text/plain
 packages/fcl-js/src/jsbase.pp svneol=native#text/plain
 packages/fcl-js/src/jsparser.pp svneol=native#text/plain
 packages/fcl-js/src/jsscanner.pp svneol=native#text/plain
@@ -2126,6 +2137,7 @@ packages/fcl-js/tests/testjs.manifest svneol=native#text/plain
 packages/fcl-js/tests/testjs.rc svneol=native#text/plain
 packages/fcl-json/Makefile svneol=native#text/plain
 packages/fcl-json/Makefile.fpc svneol=native#text/plain
+packages/fcl-json/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-json/examples/confdemo.lpi svneol=native#text/plain
 packages/fcl-json/examples/confdemo.pp svneol=native#text/plain
 packages/fcl-json/examples/demoformat.pp svneol=native#text/plain
@@ -2151,6 +2163,7 @@ packages/fcl-json/tests/testjsonparser.pp svneol=native#text/plain
 packages/fcl-json/tests/testjsonrtti.pp svneol=native#text/plain
 packages/fcl-net/Makefile svneol=native#text/plain
 packages/fcl-net/Makefile.fpc svneol=native#text/plain
+packages/fcl-net/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-net/README.txt svneol=native#text/plain
 packages/fcl-net/examples/Makefile svneol=native#text/plain
 packages/fcl-net/examples/Makefile.fpc svneol=native#text/plain
@@ -2182,6 +2195,7 @@ packages/fcl-net/src/unix/resolve.inc svneol=native#text/plain
 packages/fcl-net/src/win/resolve.inc svneol=native#text/plain
 packages/fcl-passrc/Makefile svneol=native#text/plain
 packages/fcl-passrc/Makefile.fpc svneol=native#text/plain
+packages/fcl-passrc/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-passrc/examples/test_parser.pp svneol=native#text/plain
 packages/fcl-passrc/examples/testunit1.pp svneol=native#text/plain
 packages/fcl-passrc/fpmake.pp svneol=native#text/plain
@@ -2215,6 +2229,7 @@ packages/fcl-process/src/wince/process.inc svneol=native#text/plain
 packages/fcl-process/src/wince/simpleipc.inc svneol=native#text/plain
 packages/fcl-registry/Makefile svneol=native#text/plain
 packages/fcl-registry/Makefile.fpc svneol=native#text/plain
+packages/fcl-registry/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-registry/fpmake.pp svneol=native#text/plain
 packages/fcl-registry/src/regdef.inc svneol=native#text/plain
 packages/fcl-registry/src/regini.inc svneol=native#text/plain
@@ -2228,6 +2243,7 @@ packages/fcl-registry/tests/regtestframework.pp -text
 packages/fcl-registry/tests/testbasics.pp svneol=native#text/plain
 packages/fcl-res/Makefile svneol=native#text/plain
 packages/fcl-res/Makefile.fpc svneol=native#text/plain
+packages/fcl-res/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-res/fpmake.pp svneol=native#text/plain
 packages/fcl-res/src/acceleratorsresource.pp svneol=native#text/plain
 packages/fcl-res/src/bitmapresource.pp svneol=native#text/plain
@@ -2325,6 +2341,7 @@ packages/fcl-stl/doc/stackexample.pp svneol=native#text/plain
 packages/fcl-stl/doc/util.tex svneol=native#text/plain
 packages/fcl-stl/doc/vector.tex svneol=native#text/plain
 packages/fcl-stl/doc/vectorexample.pp svneol=native#text/plain
+packages/fcl-stl/fpmake.pp svneol=native#text/pascal
 packages/fcl-stl/src/garrayutils.pp svneol=native#text/plain
 packages/fcl-stl/src/gdeque.pp svneol=native#text/plain
 packages/fcl-stl/src/ghashmap.pp svneol=native#text/plain
@@ -2626,6 +2643,7 @@ packages/fcl-web/src/base/fphttp.pp svneol=native#text/plain
 packages/fcl-web/src/base/fphttpapp.pp svneol=native#text/plain
 packages/fcl-web/src/base/fphttpclient.pp svneol=native#text/plain
 packages/fcl-web/src/base/fphttpserver.pp svneol=native#text/plain
+packages/fcl-web/src/base/fphttpstatus.pas svneol=native#text/plain
 packages/fcl-web/src/base/fpweb.pp svneol=native#text/plain
 packages/fcl-web/src/base/fpwebfile.pp svneol=native#text/plain
 packages/fcl-web/src/base/httpdefs.pp svneol=native#text/plain
@@ -2868,6 +2886,7 @@ packages/gmp/examples/printf_example.pas svneol=native#text/plain
 packages/gmp/examples/printf_example2.pas svneol=native#text/plain
 packages/gmp/examples/scanf_example.pas svneol=native#text/plain
 packages/gmp/examples/scanf_example2.pas svneol=native#text/plain
+packages/gmp/fpmake.pp svneol=native#text/plain
 packages/gmp/readme svneol=native#text/plain
 packages/gmp/src/gmp.pas svneol=native#text/plain
 packages/gnome1/Makefile svneol=native#text/plain
@@ -3646,7 +3665,7 @@ packages/hash/src/unixcrypt.pas svneol=native#text/plain
 packages/hash/src/uuid.pas svneol=native#text/plain
 packages/hermes/Makefile svneol=native#text/plain
 packages/hermes/Makefile.fpc svneol=native#text/plain
-packages/hermes/fpmake_disabled.pp svneol=native#text/plain
+packages/hermes/fpmake.pp svneol=native#text/plain
 packages/hermes/src/d_32.inc svneol=native#text/plain
 packages/hermes/src/factconv.inc svneol=native#text/plain
 packages/hermes/src/headp.inc svneol=native#text/plain
@@ -4916,7 +4935,7 @@ packages/mad/fpmake.pp svneol=native#text/plain
 packages/mad/src/mad.pas svneol=native#text/plain
 packages/matroska/Makefile svneol=native#text/plain
 packages/matroska/Makefile.fpc svneol=native#text/plain
-packages/matroska/fpmake.pp svneol=native#text/plain
+packages/matroska/fpmake.pp_disabled svneol=native#text/plain
 packages/matroska/src/matroska.pas svneol=native#text/plain
 packages/modplug/Makefile svneol=native#text/plain
 packages/modplug/Makefile.fpc svneol=native#text/plain
@@ -5626,7 +5645,7 @@ packages/ptc/examples/timer.pp svneol=native#text/plain
 packages/ptc/examples/tunnel.pp svneol=native#text/plain
 packages/ptc/examples/tunnel3d.pp svneol=native#text/plain
 packages/ptc/examples/tunnel3d.raw -text svneol=unset#raw/binary
-packages/ptc/fpmake_disabled.pp svneol=native#text/plain
+packages/ptc/fpmake.pp svneol=native#text/plain
 packages/ptc/src/c_api/capi_area.inc svneol=native#text/plain
 packages/ptc/src/c_api/capi_aread.inc svneol=native#text/plain
 packages/ptc/src/c_api/capi_clear.inc svneol=native#text/plain
@@ -5885,6 +5904,7 @@ packages/symbolic/doc/optimization.txt svneol=native#text/plain
 packages/symbolic/doc/symbolic.txt svneol=native#text/plain
 packages/symbolic/examples/Makefile svneol=native#text/plain
 packages/symbolic/examples/Makefile.fpc svneol=native#text/plain
+packages/symbolic/examples/easyevalexample.pp svneol=native#text/plain
 packages/symbolic/examples/evaltest.pas svneol=native#text/plain
 packages/symbolic/examples/rpnthing.pas svneol=native#text/plain
 packages/symbolic/fpmake.pp svneol=native#text/plain
@@ -6994,6 +7014,8 @@ rtl/embedded/arm/stellaris.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f103.pp svneol=native#text/plain
 rtl/embedded/avr/atmega128.pp svneol=native#text/plain
 rtl/embedded/avr/start.inc svneol=native#text/plain
+rtl/embedded/buildrtl.lpi svneol=native#text/plain
+rtl/embedded/buildrtl.pp svneol=native#text/plain
 rtl/embedded/check.inc svneol=native#text/plain
 rtl/embedded/empty.cfg svneol=native#text/plain
 rtl/embedded/rtl.cfg svneol=native#text/plain
@@ -8167,6 +8189,7 @@ rtl/win32/gprt0.as svneol=native#text/plain
 rtl/win32/initc.pp svneol=native#text/plain
 rtl/win32/objinc.inc svneol=native#text/plain
 rtl/win32/signals.pp svneol=native#text/plain
+rtl/win32/sysinit.inc svneol=native#text/plain
 rtl/win32/sysinitcyg.pp svneol=native#text/plain
 rtl/win32/sysinitgprof.pp svneol=native#text/plain
 rtl/win32/sysinitpas.pp svneol=native#text/plain
@@ -9113,6 +9136,11 @@ tests/tbs/tb0573.pp svneol=native#text/plain
 tests/tbs/tb0574.pp svneol=native#text/pascal
 tests/tbs/tb0575.pp svneol=native#text/plain
 tests/tbs/tb0576.pp svneol=native#text/plain
+tests/tbs/tb0577.pp svneol=native#text/plain
+tests/tbs/tb0577a.pp svneol=native#text/plain
+tests/tbs/tb0578.pp svneol=native#text/pascal
+tests/tbs/tb0579.pp svneol=native#text/pascal
+tests/tbs/tb0580.pp svneol=native#text/pascal
 tests/tbs/tb205.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
 tests/tbs/ub0069.pp svneol=native#text/plain
@@ -10420,6 +10448,7 @@ tests/test/tset5a.pp svneol=native#text/plain
 tests/test/tset6.pp svneol=native#text/plain
 tests/test/tset7.pp svneol=native#text/plain
 tests/test/tsetsize.pp svneol=native#text/plain
+tests/test/tshuffle1.pp svneol=native#text/pascal
 tests/test/tstack.pp svneol=native#text/plain
 tests/test/tstatic1.pp svneol=native#text/pascal
 tests/test/tstatic2.pp svneol=native#text/pascal
@@ -10468,6 +10497,7 @@ tests/test/tutf82.pp svneol=native#text/plain
 tests/test/tvarpropsetter1.pp svneol=native#text/plain
 tests/test/tvarpropsetter2.pp svneol=native#text/plain
 tests/test/tvarset1.pp svneol=native#text/plain
+tests/test/twarn1.pp svneol=native#text/pascal
 tests/test/tweaklib1.pp svneol=native#text/plain
 tests/test/tweaklib2.pp svneol=native#text/plain
 tests/test/tweaklib3.pp svneol=native#text/plain
@@ -10563,6 +10593,7 @@ tests/test/units/math/tmask2.pp svneol=native#text/plain
 tests/test/units/math/tnaninf.pp svneol=native#text/plain
 tests/test/units/math/tpower.pp svneol=native#text/pascal
 tests/test/units/math/ttrig1.pp svneol=native#text/plain
+tests/test/units/matrix/tinv1.pp svneol=native#text/pascal
 tests/test/units/objects/testobj.pp svneol=native#text/plain
 tests/test/units/objects/testobj1.pp svneol=native#text/plain
 tests/test/units/objects/testobj2.pp svneol=native#text/plain
@@ -10639,6 +10670,7 @@ tests/test/units/system/tvalc.pp svneol=native#text/plain
 tests/test/units/sysutils/strtotimetest.pp svneol=native#text/plain
 tests/test/units/sysutils/tastrcmp.pp svneol=native#text/plain
 tests/test/units/sysutils/tastrcmp1.pp svneol=native#text/plain
+tests/test/units/sysutils/tdirex.pp svneol=native#text/plain
 tests/test/units/sysutils/texec1.pp svneol=native#text/plain
 tests/test/units/sysutils/texec2.pp svneol=native#text/plain
 tests/test/units/sysutils/textractquote.pp svneol=native#text/plain
@@ -10826,6 +10858,9 @@ tests/webtbf/tw1754.pp svneol=native#text/plain
 tests/webtbf/tw1754b.pp svneol=native#text/plain
 tests/webtbf/tw17646a.pp svneol=native#text/plain
 tests/webtbf/tw1782.pp svneol=native#text/plain
+tests/webtbf/tw18058a.pp svneol=native#text/plain
+tests/webtbf/tw18058b.pp svneol=native#text/plain
+tests/webtbf/tw18058c.pp svneol=native#text/plain
 tests/webtbf/tw18096.pp svneol=native#text/pascal
 tests/webtbf/tw18096c.pp svneol=native#text/pascal
 tests/webtbf/tw18267.pp svneol=native#text/plain
@@ -10840,6 +10875,7 @@ tests/webtbf/tw1928.pp svneol=native#text/plain
 tests/webtbf/tw1939.pp svneol=native#text/plain
 tests/webtbf/tw19463.pp svneol=native#text/pascal
 tests/webtbf/tw1949.pp svneol=native#text/plain
+tests/webtbf/tw19591.pp svneol=native#text/plain
 tests/webtbf/tw1969.pp svneol=native#text/plain
 tests/webtbf/tw1995.pp svneol=native#text/plain
 tests/webtbf/tw2018.pp svneol=native#text/plain
@@ -11482,6 +11518,7 @@ tests/webtbs/tw15467.pp svneol=native#text/pascal
 tests/webtbs/tw15500.pp svneol=native#text/plain
 tests/webtbs/tw15504.pp svneol=native#text/plain
 tests/webtbs/tw15530.pp svneol=native#text/pascal
+tests/webtbs/tw15571.pp svneol=native#text/pascal
 tests/webtbs/tw15591.pp svneol=native#text/pascal
 tests/webtbs/tw15592.pp svneol=native#text/plain
 tests/webtbs/tw15599.pp svneol=native#text/plain
@@ -11609,6 +11646,7 @@ tests/webtbs/tw17715.pp svneol=native#text/plain
 tests/webtbs/tw1779.pp svneol=native#text/plain
 tests/webtbs/tw1780.pp svneol=native#text/plain
 tests/webtbs/tw17836.pp svneol=native#text/plain
+tests/webtbs/tw17838.pp svneol=native#text/pascal
 tests/webtbs/tw17846.pp svneol=native#text/plain
 tests/webtbs/tw17862.pp svneol=native#text/plain
 tests/webtbs/tw17904.pas svneol=native#text/plain
@@ -11685,8 +11723,21 @@ tests/webtbs/tw1936.pp svneol=native#text/plain
 tests/webtbs/tw1938.pp svneol=native#text/plain
 tests/webtbs/tw1948.pp svneol=native#text/plain
 tests/webtbs/tw1950.pp svneol=native#text/plain
+tests/webtbs/tw19548.pp svneol=native#text/pascal
+tests/webtbs/tw19555.pp svneol=native#text/pascal
 tests/webtbs/tw1964.pp svneol=native#text/plain
+tests/webtbs/tw19700.pp svneol=native#text/plain
+tests/webtbs/tw19851a.pp svneol=native#text/pascal
+tests/webtbs/tw19851b.pp svneol=native#text/pascal
+tests/webtbs/tw19864.pp svneol=native#text/pascal
+tests/webtbs/tw19874.pp svneol=native#text/pascal
+tests/webtbs/tw19910.pp svneol=native#text/pascal
 tests/webtbs/tw1996.pp svneol=native#text/plain
+tests/webtbs/tw19960.pp svneol=native#text/pascal
+tests/webtbs/tw19974.pp svneol=native#text/pascal
+tests/webtbs/tw19977.pp svneol=native#text/pascal
+tests/webtbs/tw20003.pp svneol=native#text/pascal
+tests/webtbs/tw20005.pp svneol=native#text/pascal
 tests/webtbs/tw2001.pp svneol=native#text/plain
 tests/webtbs/tw2002.pp svneol=native#text/plain
 tests/webtbs/tw2004.pp svneol=native#text/plain
@@ -12278,6 +12329,7 @@ tests/webtbs/tw7173.pp svneol=native#text/plain
 tests/webtbs/tw7179.pp svneol=native#text/plain
 tests/webtbs/tw7195.pp svneol=native#text/plain
 tests/webtbs/tw7200.pp svneol=native#text/plain
+tests/webtbs/tw7210.pp svneol=native#text/plain
 tests/webtbs/tw7227.pp svneol=native#text/plain
 tests/webtbs/tw7242.pp svneol=native#text/plain
 tests/webtbs/tw7262.pp svneol=native#text/plain
@@ -12507,6 +12559,8 @@ tests/webtbs/uw18087a.pp svneol=native#text/pascal
 tests/webtbs/uw18087b.pp svneol=native#text/pascal
 tests/webtbs/uw18909a.pp svneol=native#text/pascal
 tests/webtbs/uw18909b.pp svneol=native#text/pascal
+tests/webtbs/uw19159.pp svneol=native#text/pascal
+tests/webtbs/uw19851.pp svneol=native#text/pascal
 tests/webtbs/uw2004.inc svneol=native#text/plain
 tests/webtbs/uw2040.pp svneol=native#text/plain
 tests/webtbs/uw2266a.inc svneol=native#text/plain

+ 8 - 3
Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/06/05]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/11]
 #
 default: help
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
@@ -188,7 +188,11 @@ ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 TARGETSUFFIX=$(OS_TARGET)
 SOURCESUFFIX=$(OS_SOURCE)
 else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
 TARGETSUFFIX=$(FULL_TARGET)
+endif
 SOURCESUFFIX=$(FULL_SOURCE)
 endif
 ifneq ($(FULL_TARGET),$(FULL_SOURCE))
@@ -284,11 +288,12 @@ export FPCFPMAKE
 export FPMAKE_SKIP_CONFIG
 endif
 else
+FPMAKE_SKIP_CONFIG=-n
 FPCFPMAKE=$(FPC)
 endif
 endif
 override PACKAGE_NAME=fpc
-override PACKAGE_VERSION=2.5.1
+override PACKAGE_VERSION=2.7.1
 ifndef inOS2
 override FPCDIR:=$(BASEDIR)
 export FPCDIR
@@ -1470,7 +1475,7 @@ override FPCOPT+=-Aas
 endif
 endif
 ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
-ifeq ($(OS_TARGET),linux)
+ifneq ($(findstring $(OS_TARGET),linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif

+ 1 - 1
Makefile.fpc

@@ -4,7 +4,7 @@
 
 [package]
 name=fpc
-version=2.5.1
+version=2.7.1
 
 [target]
 dirs=compiler rtl utils packages ide installer

+ 44 - 8
compiler/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/06/14]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/11]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
@@ -188,7 +188,11 @@ ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 TARGETSUFFIX=$(OS_TARGET)
 SOURCESUFFIX=$(OS_SOURCE)
 else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
 TARGETSUFFIX=$(FULL_TARGET)
+endif
 SOURCESUFFIX=$(FULL_SOURCE)
 endif
 ifneq ($(FULL_TARGET),$(FULL_SOURCE))
@@ -284,11 +288,12 @@ export FPCFPMAKE
 export FPMAKE_SKIP_CONFIG
 endif
 else
+FPMAKE_SKIP_CONFIG=-n
 FPCFPMAKE=$(FPC)
 endif
 endif
 override PACKAGE_NAME=compiler
-override PACKAGE_VERSION=2.5.1
+override PACKAGE_VERSION=2.7.1
 unexport FPC_VERSION FPC_COMPILERINFO
 CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr
 ALLTARGETS=$(CYCLETARGETS)
@@ -2688,7 +2693,7 @@ override FPCOPT+=-Aas
 endif
 endif
 ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
-ifeq ($(OS_TARGET),linux)
+ifneq ($(findstring $(OS_TARGET),linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif
@@ -3521,15 +3526,20 @@ msgtxt.inc: $(MSGFILE)
 msg: msgtxt.inc
 insdatx86 : $(COMPILER_UNITTARGETDIR) x86/x86ins.dat
 	$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkx86ins.pp
-	cd x86 && ../utils/mkx86ins$(SRCEXEEXT) && mv -f *.inc ../i386
-	cd x86 && ../utils/mkx86ins$(SRCEXEEXT) x86_64 && mv -f *.inc ../x86_64
+	cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86ins$(SRCEXEEXT) && mv -f *.inc ../i386
+	cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86ins$(SRCEXEEXT) x86_64 && mv -f *.inc ../x86_64
+	$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkx86reg.pp
+	cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86reg$(SRCEXEEXT)
+	mv -f x86/r386*.inc i386
+	cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86reg$(SRCEXEEXT) x86_64
+	mv -f x86/r8664*.inc x86_64
 insdatarm : arm/armins.dat
 	    $(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmins.pp
-	cd arm && ../utils/mkarmins$(SRCEXEEXT)
+	cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmins$(SRCEXEEXT)
 insdat: insdatx86 insdatarm
 regdatarm : arm/armreg.dat
 	    $(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
-	cd arm && ../utils/mkarmreg$(SRCEXEEXT)
+	cd arm && ..$(PATHSEP)utils$PATHSEP)mkarmreg$(SRCEXEEXT)
 revision.inc :
 ifneq ($(REVSTR),)
 ifdef USEZIPWRAPPER
@@ -3550,7 +3560,8 @@ revision :
 	$(MAKE) revision.inc
 $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \
 	     $(wildcard systems/*.pas) $(wilcard systems/*.inc) \
-	     $(wildcard $(CPC_TARGET)/*.pas) $(wildcard $(CPC_TARGET)/*.inc)
+	     $(wildcard $(CPC_TARGET)/*.pas) $(wildcard $(CPC_TARGET)/*.inc) \
+	     $(COMPILER_UNITTARGETDIR) $(COMPILER_TARGETDIR)
 ifneq ($(REVSTR),)
 ifdef USEZIPWRAPPER
 ifneq ($(ECHOREDIR),echo)
@@ -3705,6 +3716,31 @@ rtlclean:
 	$(MAKE) -C $(PACKAGEDIR_RTL) clean
 rtlinstall:
 	$(MAKE) -C $(PACKAGEDIR_RTL) install
+PPUDIR=$(COMPILER_UNITTARGETDIR)
+ALLPPUDIR=$(CPU_TARGET)/units/*
+PPULIST=$(wildcard $(PPUDIR)/*.ppu)
+PPULOGLIST=$(subst .ppu,.log-ppu,$(PPULIST))
+RTLPPUDIR=../rtl/units/$(FULL_TARGET)
+RTLPPULIST=$(wildcard $(RTLPPUDIR)/*.ppu)
+RTLPPULOGLIST=$(subst .ppu,.log-ppu,$(RTLPPULIST))
+.PHONY : ppulogs cleanppulogs rtlppulogs cleanrtlppulogs testppudump
+ppulogs : $(PPULOGLIST)
+rtlppulogs : $(RTLPPULOGLIST)
+vpath %.ppu $(PPUDIR) $(RTLPPUDIR) $(ALLPPUDIR)
+vpath %.log-ppu $(PPUDIR) $(RTLPPUDIR) $(ALLPPUDIR)
+%.log-ppu : %.ppu ./utils/ppudump$(EXEEXT)
+	.$(PATHSEP)utils$(PATHSEP)ppudump -VA -M $< > $@
+./utils/ppudump$(EXEEXT):
+	$(MAKE) -C $(COMPILERUTILSDIR) ppudump$(EXEEXT)
+ppuinfo :
+	echo PPU list is "$(PPULIST)"
+	echo PPULOG list is "$(PPULOGLIST)"
+cleanppulogs :
+	-$(RMPROG) $(PPULOGLIST)
+cleanrtlppulogs :
+	-$(RMPROG) $(RTLPPULOGLIST)
+testppudump :
+	$(MAKE) cleanrtlppulogs cleanppulogs ppulogs rtlppulogs
 localmake:=$(strip $(wildcard makefile.loc))
 ifdef localmake
 include ./$(localmake)

+ 53 - 6
compiler/Makefile.fpc

@@ -4,7 +4,7 @@
 
 [package]
 name=compiler
-version=2.5.1
+version=2.7.1
 
 [target]
 programs=pp
@@ -397,18 +397,23 @@ msg: msgtxt.inc
 
 insdatx86 : $(COMPILER_UNITTARGETDIR) x86/x86ins.dat
 	$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkx86ins.pp
-        cd x86 && ../utils/mkx86ins$(SRCEXEEXT) && mv -f *.inc ../i386
-        cd x86 && ../utils/mkx86ins$(SRCEXEEXT) x86_64 && mv -f *.inc ../x86_64
+        cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86ins$(SRCEXEEXT) && mv -f *.inc ../i386
+        cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86ins$(SRCEXEEXT) x86_64 && mv -f *.inc ../x86_64
+	$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkx86reg.pp
+        cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86reg$(SRCEXEEXT)
+        mv -f x86/r386*.inc i386
+        cd x86 && ..$(PATHSEP)utils$(PATHSEP)mkx86reg$(SRCEXEEXT) x86_64
+        mv -f x86/r8664*.inc x86_64
 
 insdatarm : arm/armins.dat
 	    $(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmins.pp
-        cd arm && ../utils/mkarmins$(SRCEXEEXT)
+        cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmins$(SRCEXEEXT)
 
 insdat: insdatx86 insdatarm
 
 regdatarm : arm/armreg.dat
 	    $(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
-        cd arm && ../utils/mkarmreg$(SRCEXEEXT)
+        cd arm && ..$(PATHSEP)utils$PATHSEP)mkarmreg$(SRCEXEEXT)
 
 # revision.inc rule
 revision.inc :
@@ -436,7 +441,8 @@ revision :
 # ECHOREDIR sometimes does not remove double quotes
 $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \
              $(wildcard systems/*.pas) $(wilcard systems/*.inc) \
-             $(wildcard $(CPC_TARGET)/*.pas) $(wildcard $(CPC_TARGET)/*.inc)
+             $(wildcard $(CPC_TARGET)/*.pas) $(wildcard $(CPC_TARGET)/*.inc) \
+             $(COMPILER_UNITTARGETDIR) $(COMPILER_TARGETDIR)
 ifneq ($(REVSTR),)
 ifdef USEZIPWRAPPER
 ifneq ($(ECHOREDIR),echo)
@@ -699,6 +705,47 @@ rtlclean:
 rtlinstall:
         $(MAKE) -C $(PACKAGEDIR_RTL) install
 
+#####################################################################
+# PPU testing targets
+#####################################################################
+
+PPUDIR=$(COMPILER_UNITTARGETDIR)
+ALLPPUDIR=$(CPU_TARGET)/units/*
+PPULIST=$(wildcard $(PPUDIR)/*.ppu)
+PPULOGLIST=$(subst .ppu,.log-ppu,$(PPULIST))
+
+RTLPPUDIR=../rtl/units/$(FULL_TARGET)
+RTLPPULIST=$(wildcard $(RTLPPUDIR)/*.ppu)
+RTLPPULOGLIST=$(subst .ppu,.log-ppu,$(RTLPPULIST))
+
+.PHONY : ppulogs cleanppulogs rtlppulogs cleanrtlppulogs testppudump
+
+ppulogs : $(PPULOGLIST)
+
+rtlppulogs : $(RTLPPULOGLIST)
+
+vpath %.ppu $(PPUDIR) $(RTLPPUDIR) $(ALLPPUDIR)
+vpath %.log-ppu $(PPUDIR) $(RTLPPUDIR) $(ALLPPUDIR)
+
+%.log-ppu : %.ppu ./utils/ppudump$(EXEEXT)
+	.$(PATHSEP)utils$(PATHSEP)ppudump -VA -M $< > $@
+
+
+./utils/ppudump$(EXEEXT):
+	$(MAKE) -C $(COMPILERUTILSDIR) ppudump$(EXEEXT)
+
+ppuinfo :
+	echo PPU list is "$(PPULIST)"
+	echo PPULOG list is "$(PPULOGLIST)"
+
+cleanppulogs :
+	-$(RMPROG) $(PPULOGLIST)
+
+cleanrtlppulogs :
+	-$(RMPROG) $(RTLPPULOGLIST)
+
+testppudump :
+	$(MAKE) cleanrtlppulogs cleanppulogs ppulogs rtlppulogs
 
 #####################################################################
 # local user configurable file

+ 77 - 7
compiler/aasmtai.pas

@@ -84,7 +84,9 @@ interface
           ait_regalloc,
           ait_tempalloc,
           { used to mark assembler blocks and inlined functions }
-          ait_marker
+          ait_marker,
+          { used to describe a new location of a variable }
+          ait_varloc
           );
 
         taiconst_type = (
@@ -113,7 +115,9 @@ interface
             relsyms (nor do they support dwarf, for that matter)
           }
           aitconst_darwin_dwarf_delta64,
-          aitconst_darwin_dwarf_delta32
+          aitconst_darwin_dwarf_delta32,
+          { ARM Thumb-2 only }
+          aitconst_half16bit { used for table jumps. The actual value is the 16bit value shifted left once }
         );
 
     const
@@ -168,7 +172,8 @@ interface
           'cut',
           'regalloc',
           'tempalloc',
-          'marker'
+          'marker',
+          'varloc'
           );
 
     type
@@ -231,14 +236,15 @@ interface
         a new ait type!                                                              }
       SkipInstr = [ait_comment, ait_symbol,ait_section
                    ,ait_stab, ait_function_name, ait_force_line
-                   ,ait_regalloc, ait_tempalloc, ait_symbol_end, ait_directive];
+                   ,ait_regalloc, ait_tempalloc, ait_symbol_end, ait_directive
+                   ,ait_varloc];
 
       { ait_* types which do not have line information (and hence which are of type
         tai, otherwise, they are of type tailineinfo }
       SkipLineInfo =[ait_label,
                      ait_regalloc,ait_tempalloc,
                      ait_stab,ait_function_name,
-                     ait_cutobject,ait_marker,ait_align,ait_section,ait_comment,
+                     ait_cutobject,ait_marker,ait_varloc,ait_align,ait_section,ait_comment,
                      ait_const,
 {$ifdef arm}
                      ait_thumb_func,
@@ -498,11 +504,14 @@ interface
           procedure ppuwrite(ppufile:tcompilerppufile);override;
        end;
 
+       { tai_stab }
+
        tai_stab = class(tai)
           str : pchar;
           stabtype : TStabType;
           constructor Create(_stabtype:TStabType;_str : pchar);
           constructor Create_str(_stabtype:TStabType;const s:string);
+          constructor create_ansistr(_stabtype: TStabType; const s: ansistring);
           destructor Destroy;override;
        end;
 
@@ -640,6 +649,16 @@ interface
         end;
         tai_align_class = class of tai_align_abstract;
 
+        tai_varloc = class(tai)
+           newlocation : tregister;
+           varsym : tsym;
+           constructor create(sym : tsym;loc : tregister);
+           constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
+           procedure ppuwrite(ppufile:tcompilerppufile);override;
+           procedure buildderefimpl;override;
+           procedure derefimpl;override;
+        end;
+
     var
       { array with all class types for tais }
       aiclass : taiclassarray;
@@ -752,6 +771,39 @@ implementation
       end;
 
 
+    constructor tai_varloc.create(sym: tsym; loc: tregister);
+      begin
+        inherited Create;
+        typ:=ait_varloc;
+        newlocation:=loc;
+        varsym:=sym;
+      end;
+
+
+    constructor tai_varloc.ppuload(t: taitype; ppufile: tcompilerppufile);
+      begin
+        inherited ppuload(t, ppufile);
+      end;
+
+
+    procedure tai_varloc.ppuwrite(ppufile: tcompilerppufile);
+      begin
+        inherited ppuwrite(ppufile);
+      end;
+
+
+    procedure tai_varloc.buildderefimpl;
+      begin
+        inherited buildderefimpl;
+      end;
+
+
+    procedure tai_varloc.derefimpl;
+      begin
+        inherited derefimpl;
+      end;
+
+
 {****************************************************************************
                              TAI
  ****************************************************************************}
@@ -1323,6 +1375,8 @@ implementation
             result:=LengthUleb128(qword(value));
           aitconst_sleb128bit :
             result:=LengthSleb128(value);
+          aitconst_half16bit:
+            result:=2;
           else
             internalerror(200603253);
         end;
@@ -1648,6 +1702,15 @@ implementation
          self.create(_stabtype,strpnew(s));
       end;
 
+    constructor tai_stab.create_ansistr(_stabtype:TStabType;const s:ansistring);
+      begin
+         inherited create;
+         typ:=ait_stab;
+         stabtype:=_stabtype;
+         getmem(str,length(s)+1);
+         move(s[1],str^,length(s)+1);
+      end;
+
     destructor tai_stab.destroy;
       begin
          freemem(str);
@@ -2003,7 +2066,11 @@ implementation
             if (cs_create_pic in current_settings.moduleswitches) and
               assigned(r.symbol) and
               not assigned(r.relsymbol) and
-              (r.refaddr=addr_no) then
+              (r.refaddr=addr_no)
+{$ifdef ARM}
+              and not(r.base=NR_R15)
+{$endif ARM}
+              then
               internalerror(200502052);
             typ:=top_ref;
             if assigned(add_reg_instruction_hook) then
@@ -2406,5 +2473,8 @@ implementation
         ppufile.putbyte(fillop);
         ppufile.putbyte(byte(use_op));
       end;
-
+begin
+  { taitype should fit into a 4 byte set for speed reasons }
+  if ord(high(taitype))>31 then
+    internalerror(201108181);
 end.

+ 75 - 13
compiler/aggas.pas

@@ -45,6 +45,7 @@ interface
       TGNUAssembler=class(texternalassembler)
       protected
         function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;virtual;
+        function sectionattrs_coff(atype:TAsmSectiontype):string;virtual;
         procedure WriteSection(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder);
         procedure WriteExtraHeader;virtual;
         procedure WriteInstruction(hp: tai);
@@ -194,10 +195,10 @@ implementation
 
 
     const
-      ait_const2str : array[aitconst_128bit..aitconst_darwin_dwarf_delta32] of string[20]=(
+      ait_const2str : array[aitconst_128bit..aitconst_half16bit] of string[20]=(
         #9'.fixme128'#9,#9'.quad'#9,#9'.long'#9,#9'.short'#9,#9'.byte'#9,
         #9'.sleb128'#9,#9'.uleb128'#9,
-        #9'.rva'#9,#9'.secrel32'#9,#9'.quad'#9,#9'.long'#9
+        #9'.rva'#9,#9'.secrel32'#9,#9'.quad'#9,#9'.long'#9,#9'.short'#9
       );
 
     function ReplaceForbiddenChars(const s: string): string;
@@ -238,6 +239,19 @@ implementation
         result := target_asm.labelprefix+'$set$'+tostr(setcount);
       end;
 
+    function is_smart_section(atype:TAsmSectiontype):boolean;
+      begin
+        { For bss we need to set some flags that are target dependent,
+          it is easier to disable it for smartlinking. It doesn't take up
+          filespace }
+        result:=not(target_info.system in systems_darwin) and
+           create_smartlink_sections and
+           (atype<>sec_toc) and
+           (atype<>sec_user) and
+           { on embedded systems every byte counts, so smartlink bss too }
+           ((atype<>sec_bss) or (target_info.system in systems_embedded));
+      end;
+
     function TGNUAssembler.sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;
       const
         secnames : array[TAsmSectiontype] of string[length('__DATA, __datacoal_nt,coalesced')] = ('','',
@@ -404,16 +418,7 @@ implementation
         if atype=sec_user then
           secname:=aname;
 
-        { For bss we need to set some flags that are target dependent,
-          it is easier to disable it for smartlinking. It doesn't take up
-          filespace }
-        if not(target_info.system in systems_darwin) and
-           create_smartlink_sections and
-           (aname<>'') and
-           (atype<>sec_toc) and
-           (atype<>sec_user) and
-           { on embedded systems every byte counts, so smartlink bss too }
-           ((atype<>sec_bss) or (target_info.system in systems_embedded)) then
+        if is_smart_section(atype) and (aname<>'') then
           begin
             case aorder of
               secorder_begin :
@@ -430,6 +435,45 @@ implementation
       end;
 
 
+    function TGNUAssembler.sectionattrs_coff(atype:TAsmSectiontype):string;
+      begin
+        case atype of
+          sec_code, sec_init, sec_fini, sec_stub:
+            result:='x';
+
+          { TODO: must be individual for each section }
+          sec_user:
+            result:='d';
+
+          sec_data, sec_data_lazy, sec_data_nonlazy, sec_fpc,
+          sec_idata2, sec_idata4, sec_idata5, sec_idata6, sec_idata7:
+            result:='d';
+
+          { TODO: these need a fix to become read-only }
+          sec_rodata, sec_rodata_norel:
+            result:='d';
+
+          sec_bss:
+            result:='b';
+
+          { TODO: Somewhat questionable. FPC does not allow initialized threadvars,
+            so no sense to mark it as containing data. But Windows allows it to
+            contain data, and Linux even has .tdata and .tbss }
+          sec_threadvar:
+            result:='b';
+
+          sec_pdata, sec_edata, sec_eh_frame, sec_toc:
+            result:='r';
+
+          sec_stab,sec_stabstr,
+          sec_debug_frame,sec_debug_info,sec_debug_line,sec_debug_abbrev:
+            result:='n';
+        else
+          result:='';  { defaults to data+load }
+        end;
+      end;
+
+
     procedure TGNUAssembler.WriteSection(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder);
       var
         s : string;
@@ -484,6 +528,20 @@ implementation
                   internalerror(2006031101);
               end;
             end;
+        else
+          { GNU AS won't recognize '.text.n_something' section name as belonging
+            to '.text' and assigns default attributes to it, which is not
+            always correct. We have to fix it.
+
+            TODO: This likely applies to all systems which smartlink without
+            creating libraries }
+          if (target_info.system in [system_i386_win32,system_x86_64_win64]) and
+            is_smart_section(atype) and (aname<>'') then
+            begin
+              s:=sectionattrs_coff(atype);
+              if (s<>'') then
+                AsmWrite(',"'+s+'"');
+            end;
         end;
         AsmLn;
         LastSecType:=atype;
@@ -777,7 +835,8 @@ implementation
                  aitconst_rva_symbol,
                  aitconst_secrel32_symbol,
                  aitconst_darwin_dwarf_delta32,
-                 aitconst_darwin_dwarf_delta64:
+                 aitconst_darwin_dwarf_delta64,
+                 aitconst_half16bit:
                    begin
                      if (target_info.system in systems_darwin) and
                         (constdef in [aitconst_uleb128bit,aitconst_sleb128bit]) then
@@ -823,6 +882,9 @@ implementation
                              { 64 bit constants are already handled above in this case }
                              s:=tostr(longint(tai_const(hp).value));
 {$endif cpu64bitaddr}
+                           if constdef = aitconst_half16bit then
+                             s:='('+s+')/2';
+
                            AsmWrite(s);
                            inc(l,length(s));
                            { Values with symbols are written on a single line to improve

+ 0 - 27
compiler/alpha/cpubase.pas

@@ -155,40 +155,13 @@ unit cpubase;
        LoReg = R_0;
        HiReg = R_31;
 
-       { Constant defining possibly all registers which might require saving }
-       ALL_REGISTERS = [firstreg..lastreg];
-
-       general_registers = [R_0..R_31];
-
-       availabletempregsint = [R_0..R_14,R_16..R_25,R_28];
-       availabletempregsfpu = [R_F0..R_F30];
-       availabletempregsmm  = [];
-
-       intregs = [R_0..R_31];
-       usableregsint = [];
-       c_countusableregsint = 26;
-
        maxfpuregs = 32;
-       fpuregs = [R_F0..R_F31];
-       usableregsfpu = [];
-       c_countusableregsfpu = 31;
-
-       mmregs = [];
-       usableregsmm = [];
-       c_countusableregsmm  = 0;
 
        max_operands = 4;
 
        registers_saved_on_cdecl = [R_9..R_14,R_F2..R_F9];
 
-       firstsaveintreg = R_NO;
-       lastsaveintreg  = R_NO;
-       firstsavefpureg = R_NO;
-       lastsavefpureg  = R_NO;
-       firstsavemmreg  = R_NO;
-       lastsavemmreg   = R_NO;
        maxvarregs = 6;
-
        varregs : Array [1..maxvarregs] of Tregister =
                  (R_9,R_10,R_11,R_12,R_13,R_14);
 

+ 3 - 1
compiler/arm/armatt.inc

@@ -202,5 +202,7 @@
 'iteet',
 'ittet',
 'itett',
-'itttt'
+'itttt',
+'tbb',
+'tbh'
 );

+ 2 - 0
compiler/arm/armatts.inc

@@ -202,5 +202,7 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 3 - 0
compiler/arm/armins.dat

@@ -623,3 +623,6 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 [ITETT]
 
 [ITTTT]
+
+[TBB]
+[TBH]

+ 3 - 1
compiler/arm/armop.inc

@@ -202,5 +202,7 @@ A_ITTTE,
 A_ITEET,
 A_ITTET,
 A_ITETT,
-A_ITTTT
+A_ITTTT,
+A_TBB,
+A_TBH
 );

+ 2 - 1
compiler/arm/cgcpu.pas

@@ -2084,7 +2084,8 @@ unit cgcpu;
 
               if not((def.typ=pointerdef) or
                     ((def.typ=orddef) and
-                     (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool]))) then
+                     (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,
+                                               pasbool8,pasbool16,pasbool32,pasbool64]))) then
                  ai.SetCondition(C_VC)
               else
                 if TAiCpu(List.Last).opcode in [A_RSB,A_RSC,A_SBC,A_SUB] then

+ 0 - 33
compiler/arm/cpubase.pas

@@ -213,42 +213,9 @@ unit cpubase;
     const
       max_operands = 4;
 
-      {# Constant defining possibly all registers which might require saving }
-      ALL_OTHERREGISTERS = [];
-
-      general_superregisters = [RS_R0..RS_PC];
-
-      {# Table of registers which can be allocated by the code generator
-         internally, when generating the code.
-      }
-      { legend:                                                                }
-      { xxxregs = set of all possibly used registers of that type in the code  }
-      {           generator                                                    }
-      { usableregsxxx = set of all 32bit components of registers that can be   }
-      {           possible allocated to a regvar or using getregisterxxx (this }
-      {           excludes registers which can be only used for parameter      }
-      {           passing on ABI's that define this)                           }
-      { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-
       maxintregs = 15;
-      { to determine how many registers to use for regvars }
-      maxintscratchregs = 3;
-      usableregsint = [RS_R4..RS_R10];
-      c_countusableregsint = 7;
-
       maxfpuregs = 8;
-      fpuregs = [RS_F0..RS_F7];
-      usableregsfpu = [RS_F4..RS_F7];
-      c_countusableregsfpu = 4;
-
-      mmregs = [RS_D0..RS_D15];
-      usableregsmm = [RS_D8..RS_D15];
-      c_countusableregsmm  = 8;
-
       maxaddrregs = 0;
-      addrregs    = [];
-      usableregsaddr = [];
-      c_countusableregsaddr = 0;
 
 {*****************************************************************************
                                 Operand Sizes

+ 3 - 1
compiler/arm/cpuinfo.pas

@@ -36,6 +36,7 @@ Type
        cpu_armv4,
        cpu_armv5,
        cpu_armv6,
+       cpu_armv7,
        cpu_armv7m,
        cpu_cortexm3
       );
@@ -75,7 +76,7 @@ Type
       ct_stm32f103re,
 
       { TI }
-      stellaris
+      ct_stellaris
      );
 
 Const
@@ -109,6 +110,7 @@ Const
      'ARMV4',
      'ARMV5',
      'ARMV6',
+     'ARMV7',
      'ARMV7M',
      'CORTEXM3'
    );

+ 50 - 11
compiler/arm/narmset.pas

@@ -73,6 +73,7 @@ implementation
         last : TConstExprInt;
         indexreg : tregister;
         href : treference;
+        tablelabel: TAsmLabel;
 
         procedure genitem(list:TAsmList;t : pcaselabel);
           var
@@ -90,6 +91,22 @@ implementation
               genitem(list,t^.greater);
           end;
 
+        procedure genitem_thumb2(list:TAsmList;t : pcaselabel);
+          var
+            i : aint;
+          begin
+            if assigned(t^.less) then
+              genitem_thumb2(list,t^.less);
+            { fill possible hole }
+            for i:=last.svalue+1 to t^._low.svalue-1 do
+              list.concat(Tai_const.Create_rel_sym(aitconst_half16bit,tablelabel,elselabel));
+            for i:=t^._low.svalue to t^._high.svalue do
+              list.concat(Tai_const.Create_rel_sym(aitconst_half16bit,tablelabel,blocklabel(t^.blockid)));
+            last:=t^._high.svalue;
+            if assigned(t^.greater) then
+              genitem_thumb2(list,t^.greater);
+          end;
+
       begin
         if not(jumptable_no_range) then
           begin
@@ -101,17 +118,39 @@ implementation
         { make it a 32bit register }
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,OS_INT,hregister,indexreg);
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg);
-        { create reference }
-        reference_reset(href,4);
-        href.base:=NR_PC;
-        href.index:=indexreg;
-        href.shiftmode:=SM_LSL;
-        href.shiftimm:=2;
-        cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,NR_PC);
-        { generate jump table }
-        last:=min_;
-        genitem(current_asmdata.CurrAsmList,hp);
+
+        if current_settings.cputype in cpu_thumb2 then
+          begin
+            { adjust index }
+            cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_,indexreg,indexreg);
+            { create reference and generate jump table }
+            reference_reset(href,4);
+            href.base:=NR_PC;
+            href.index:=indexreg;
+            href.shiftmode:=SM_LSL;
+            href.shiftimm:=1;
+            current_asmdata.CurrAsmList.Concat(taicpu.op_ref(A_TBH,href));
+            { generate jump table }
+            current_asmdata.getjumplabel(tablelabel);
+            cg.a_label(current_asmdata.CurrAsmList,tablelabel);
+            last:=min_;
+            genitem_thumb2(current_asmdata.CurrAsmList,hp);
+          end
+        else
+          begin
+            { adjust index }
+            cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg);
+            { create reference and generate jump table }
+            reference_reset(href,4);
+            href.base:=NR_PC;
+            href.index:=indexreg;
+            href.shiftmode:=SM_LSL;
+            href.shiftimm:=2;
+            cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,NR_PC);
+            { generate jump table }
+            last:=min_;
+            genitem(current_asmdata.CurrAsmList,hp);
+          end;
       end;
 
 

+ 23 - 0
compiler/arm/rgcpu.pas

@@ -62,6 +62,8 @@ unit rgcpu;
       procinfo;
 
     procedure trgintcputhumb2.add_cpu_interferences(p: tai);
+      var
+        r : tregister;
       begin
         if p.typ=ait_instruction then
           begin
@@ -95,6 +97,27 @@ unit rgcpu;
                         end;
                     end;
                 end;
+              A_LDRB,
+              A_STRB,
+              A_STR,
+              A_LDR,
+              A_LDRH,
+              A_STRH,
+              A_LDRSB,
+              A_LDRSH,
+              A_LDRD,
+              A_STRD:
+                { don't mix up the framepointer and stackpointer with pre/post indexed operations }
+                if (taicpu(p).oper[1]^.typ=top_ref) and
+                  (taicpu(p).oper[1]^.ref^.addressmode in [AM_PREINDEXED,AM_POSTINDEXED]) then
+                  begin
+                    add_edge(getsupreg(taicpu(p).oper[1]^.ref^.base),getsupreg(current_procinfo.framepointer));
+                    { FIXME: temp variable r is needed here to avoid Internal error 20060521 }
+                    {        while compiling the compiler. }
+                    r:=NR_STACK_POINTER_REG;
+                    if current_procinfo.framepointer<>r then
+                      add_edge(getsupreg(taicpu(p).oper[1]^.ref^.base),getsupreg(r));
+                  end;
             end;
           end;
       end;

+ 21 - 11
compiler/avr/cgcpu.pas

@@ -118,7 +118,7 @@ unit cgcpu;
        globals,verbose,systems,cutils,
        fmodule,
        symconst,symsym,
-       tgobj,
+       tgobj,rgobj,
        procinfo,cpupi,
        paramgr;
 
@@ -594,6 +594,14 @@ unit cgcpu;
 
 
     function tcgavr.normalize_ref(list:TAsmList;ref: treference;tmpreg : tregister) : treference;
+
+      procedure maybegetcpuregister(list:tasmlist;reg : tregister);
+        begin
+          { allocate the register only, if a cpu register is passed }
+          if getsupreg(reg)<first_int_imreg then
+            getcpuregister(list,reg);
+        end;
+
       var
         tmpref : treference;
         l : tasmlabel;
@@ -618,10 +626,10 @@ unit cgcpu;
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
             tmpref.refaddr:=addr_lo8;
-            getcpuregister(list,tmpreg);
+            maybegetcpuregister(list,tmpreg);
             list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
             tmpref.refaddr:=addr_hi8;
-            getcpuregister(list,GetNextReg(tmpreg));
+            maybegetcpuregister(list,GetNextReg(tmpreg));
             list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
             if (ref.base<>NR_NO) then
               begin
@@ -640,9 +648,9 @@ unit cgcpu;
           end
         else if (ref.base<>NR_NO) and (ref.index<>NR_NO) then
           begin
-            getcpuregister(list,tmpreg);
+            maybegetcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.index);
-            getcpuregister(list,GetNextReg(tmpreg));
+            maybegetcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
             list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
             list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
@@ -651,18 +659,18 @@ unit cgcpu;
           end
         else if (ref.base<>NR_NO) then
           begin
-            getcpuregister(list,tmpreg);
+            maybegetcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.base);
-            getcpuregister(list,GetNextReg(tmpreg));
+            maybegetcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.base));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
           end
         else if (ref.index<>NR_NO) then
           begin
-            getcpuregister(list,tmpreg);
+            maybegetcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.index);
-            getcpuregister(list,GetNextReg(tmpreg));
+            maybegetcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
@@ -1486,7 +1494,7 @@ unit cgcpu;
                    (source.symbol=nil) and
                    ((source.base=NR_R28) or
                     (source.base=NR_R29)) and
-                    (source.Index=NR_No) and
+                    (source.Index=NR_NO) and
                     (source.Offset in [0..64-len])) and
               not((source.Base=NR_NO) and (source.Index=NR_NO)) then
               srcref:=normalize_ref(list,source,NR_R30)
@@ -1517,6 +1525,7 @@ unit cgcpu;
                     list.concat(taicpu.op_reg(A_PUSH,GetNextReg(tmpreg)));
                     list.concat(taicpu.op_reg(A_POP,NR_R27));
                     list.concat(taicpu.op_reg(A_POP,NR_R26));
+                    dstref.base:=NR_R26;
                   end
                 else
                   dstref:=normalize_ref(list,dest,NR_R30);
@@ -1567,7 +1576,8 @@ unit cgcpu;
         current_asmdata.getjumplabel(hl);
         if not ((def.typ=pointerdef) or
                ((def.typ=orddef) and
-                (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool]))) then
+                (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,
+                                          pasbool8,pasbool16,pasbool32,pasbool64]))) then
           cond:=C_VC
         else
           cond:=C_CC;

+ 5 - 35
compiler/avr/cpubase.pas

@@ -169,42 +169,9 @@ unit cpubase;
     const
       max_operands = 4;
 
-      {# Constant defining possibly all registers which might require saving }
-      ALL_OTHERREGISTERS = [];
-
-      general_superregisters = [RS_R0..RS_R31];
-
-      {# Table of registers which can be allocated by the code generator
-         internally, when generating the code.
-      }
-      { legend:                                                                }
-      { xxxregs = set of all possibly used registers of that type in the code  }
-      {           generator                                                    }
-      { usableregsxxx = set of all 32bit components of registers that can be   }
-      {           possible allocated to a regvar or using getregisterxxx (this }
-      {           excludes registers which can be only used for parameter      }
-      {           passing on ABI's that define this)                           }
-      { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-
       maxintregs = 15;
-      { to determine how many registers to use for regvars }
-      maxintscratchregs = 3;
-      usableregsint = [RS_R4..RS_R10];
-      c_countusableregsint = 7;
-
       maxfpuregs = 0;
-      fpuregs = [];
-      usableregsfpu = [];
-      c_countusableregsfpu = 0;
-
-      mmregs = [];
-      usableregsmm = [];
-      c_countusableregsmm  = 0;
-
       maxaddrregs = 0;
-      addrregs    = [];
-      usableregsaddr = [];
-      c_countusableregsaddr = 0;
 
 {*****************************************************************************
                                 Operand Sizes
@@ -458,10 +425,13 @@ unit cpubase;
 
 
     function dwarf_reg(r:tregister):byte;
+      var
+        reg : shortint;
       begin
-        result:=regdwarf_table[findreg_by_number(r)];
-        if result=-1 then
+        reg:=regdwarf_table[findreg_by_number(r)];
+        if reg=-1 then
           internalerror(200603251);
+        result:=reg;
       end;
 
 

+ 20 - 8
compiler/avr/cpuinfo.pas

@@ -45,13 +45,13 @@ Type
       );
 
    tcpuflags =
-      (AVR_HAVE_JMP_CALL,
-       AVR_HAVE_MOVW,
-       AVR_HAVE_LPMX,
-       AVR_HAVE_MUL,
-       AVR_HAVE_RAMPZ,
-       AVR_HAVE_ELPM,
-       AVR_HAVE_ELPMX,
+      (AVR_HAS_JMP_CALL,
+       AVR_HAS_MOVW,
+       AVR_HAS_LPMX,
+       AVR_HAS_MUL,
+       AVR_HAS_RAMPZ,
+       AVR_HAS_ELPM,
+       AVR_HAS_ELPMX,
        AVR_2_BYTE_PC,
        AVR_3_BYTE_PC
       );
@@ -137,9 +137,21 @@ Const
                                  [cs_opt_level1,cs_opt_level2,cs_opt_level3]+
                                  [cs_opt_regvar,cs_opt_loopunroll,cs_opt_tailrecursion,
 								  cs_opt_stackframe,cs_opt_nodecse];
+   cpuflagsstr : array[tcpuflags] of string[20] =
+      ('AVR_HAS_JMP_CALL',
+       'AVR_HAS_MOVW',
+       'AVR_HAS_LPMX',
+       'AVR_HAS_MUL',
+       'AVR_HAS_RAMPZ',
+       'AVR_HAS_ELPM',
+       'AVR_HAS_ELPMX',
+       'AVR_2_BYTE_PC',
+       'AVR_3_BYTE_PC'
+      );
+
 
    level1optimizerswitches = genericlevel1optimizerswitches;
-   level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches + 
+   level2optimizerswitches = genericlevel2optimizerswitches + level1optimizerswitches +
      [cs_opt_regvar,cs_opt_stackframe,cs_opt_tailrecursion];
    level3optimizerswitches = genericlevel3optimizerswitches + level2optimizerswitches + [{,cs_opt_loopunroll}];
 

+ 33 - 4
compiler/avr/raavrgas.pas

@@ -324,6 +324,8 @@ Unit raavrgas;
         hl : tasmlabel;
         ofs : longint;
         registerset : tcpuregisterset;
+        tempstr : string;
+        tempsymtyp : tasmsymtype;
       Begin
         expr:='';
         case actasmtoken of
@@ -355,16 +357,43 @@ Unit raavrgas;
 
           AS_ID: { A constant expression, or a Variable ref.  }
             Begin
+              if (actasmpattern='LO8') or (actasmpattern='HI8') then
+                begin
+                  { Low or High part of a constant (or constant
+                    memory location) }
+                  oper.InitRef;
+                  if actasmpattern='LO8' then
+                    oper.opr.ref.refaddr:=addr_lo8
+                  else
+                    oper.opr.ref.refaddr:=addr_hi8;
+                  Consume(actasmtoken);
+                  Consume(AS_LPAREN);
+                  BuildConstSymbolExpression(false, true,false,l,tempstr,tempsymtyp);
+                  if not assigned(oper.opr.ref.symbol) then
+                    oper.opr.ref.symbol:=current_asmdata.RefAsmSymbol(tempstr)
+                  else
+                    Message(asmr_e_cant_have_multiple_relocatable_symbols);
+                  case oper.opr.typ of
+                    OPR_CONSTANT :
+                      inc(oper.opr.val,l);
+                    OPR_LOCAL :
+                      inc(oper.opr.localsymofs,l);
+                    OPR_REFERENCE :
+                      inc(oper.opr.ref.offset,l);
+                    else
+                      internalerror(200309202);
+                  end;
+                  Consume(AS_RPAREN);
+                end
               { Local Label ? }
-              if is_locallabel(actasmpattern) then
+              else if is_locallabel(actasmpattern) then
                begin
                  CreateLocalLabel(actasmpattern,hl,false);
                  Consume(AS_ID);
                  AddLabelOperand(hl);
                end
-              else
-               { Check for label }
-               if SearchLabel(actasmpattern,hl,false) then
+              { Check for label }
+              else if SearchLabel(actasmpattern,hl,false) then
                 begin
                   Consume(AS_ID);
                   AddLabelOperand(hl);

+ 1 - 1
compiler/cclasses.pas

@@ -46,7 +46,7 @@ interface
        tmemdebug = class
        private
           totalmem,
-          startmem : integer;
+          startmem : int64;
           infostr  : string[40];
        public
           constructor Create(const s:string);

+ 60 - 8
compiler/cmsgs.pas

@@ -53,14 +53,18 @@ type
     msgidx      : array[1..maxmsgidxparts] of PArrayOfPChar;
     msgidxmax   : array[1..maxmsgidxparts] of longint;
     msgstates   : array[1..maxmsgidxparts] of PArrayOfState;
+    { set if changes with $WARN need to be cleared at next module change }
+    has_local_changes : boolean;
     constructor Init(n:longint;const idxmax:array of longint);
     destructor  Done;
     function  LoadIntern(p:pointer;n:longint):boolean;
     function  LoadExtern(const fn:string):boolean;
     procedure ClearIdx;
+    procedure ResetStates;
     procedure CreateIdx;
     function  GetPChar(nr:longint):pchar;
-    function  ClearVerbosity(nr:longint):boolean;
+    { function  ClearVerbosity(nr:longint):boolean; not used anymore }
+    function  SetVerbosity(nr:longint;newstate:tmsgstate):boolean;
     function  Get(nr:longint;const args:array of TMsgStr):ansistring;
   end;
 
@@ -107,9 +111,10 @@ end;
 
 constructor TMessage.Init(n:longint;const idxmax:array of longint);
 var
-  i : longint;
+  i,j : longint;
 begin
   msgtxt:=nil;
+  has_local_changes:=false;
   msgsize:=0;
   msgparts:=n;
   if n<>high(idxmax)+1 then
@@ -122,7 +127,9 @@ begin
      fillchar(msgidx[i]^,msgidxmax[i]*sizeof(pointer),0);
      { create array of states }
      getmem(msgstates[i],msgidxmax[i]*sizeof(tmsgstate));
-     fillchar(msgstates[i]^,msgidxmax[i]*sizeof(tmsgstate),0);
+     { default value for msgstate is ms_on_global }
+     for j:=0 to msgidxmax[i]-1 do
+       msgstates[i]^[j]:=ms_on_global;
    end;
 end;
 
@@ -387,31 +394,76 @@ end;
 
 function TMessage.GetPChar(nr:longint):pchar;
 begin
-  GetPChar:=msgidx[nr div 1000]^[nr mod 1000];
+  if (nr div 1000 < msgparts) and
+     (nr mod 1000 <  msgidxmax[nr div 1000]) then
+    GetPChar:=msgidx[nr div 1000]^[nr mod 1000]
+  else
+    GetPChar:='';
 end;
 
-function TMessage.ClearVerbosity(nr:longint):boolean;
+function TMessage.SetVerbosity(nr:longint;newstate:tmsgstate):boolean;
 var
   i: longint;
+  oldstate : tmsgstate;
+  is_global : boolean;
 begin
   result:=false;
   i:=nr div 1000;
   if (i < low(msgstates)) or
      (i > msgparts) then
     exit;
-  msgstates[i]^[nr mod 1000]:=ms_off;
-  result:=true;
+  if (nr mod 1000 < msgidxmax[i]) then
+    begin
+      is_global:=(ord(newstate) and ms_global_mask) <> 0;
+      oldstate:=msgstates[i]^[nr mod 1000];
+      if not is_global then
+        newstate:= tmsgstate((ord(newstate) and ms_local_mask) or (ord(oldstate) and ms_global_mask));
+      if newstate<>oldstate then
+        has_local_changes:=true;
+      msgstates[i]^[nr mod 1000]:=newstate;
+      result:=true;
+    end;
 end;
 
+{
+function TMessage.ClearVerbosity(nr:longint):boolean;
+begin
+  ClearVerbosity:=SetVerbosity(nr,ms_off);
+end;
+}
+
 function TMessage.Get(nr:longint;const args:array of TMsgStr):ansistring;
 var
   hp : pchar;
 begin
-  hp:=msgidx[nr div 1000]^[nr mod 1000];
+  if (nr div 1000 < msgparts) and
+     (nr mod 1000 <  msgidxmax[nr div 1000]) then
+    hp:=msgidx[nr div 1000]^[nr mod 1000]
+  else
+    hp:=nil;
   if hp=nil then
     Get:='msg nr '+tostr(nr)
   else
     Get:=MsgReplace(system.strpas(hp),args);
 end;
 
+procedure TMessage.ResetStates;
+var
+  i,j,glob : longint;
+  state : tmsgstate;
+begin
+  if not has_local_changes then
+    exit;
+  for i:=1 to msgparts do
+    for j:=0 to msgidxmax[i] - 1 do
+      begin
+        state:=msgstates[i]^[j];
+        glob:=(ord(state) and ms_global_mask) shr ms_shift;
+        state:=tmsgstate((glob shl ms_shift) or glob);
+        msgstates[i]^[j]:=state;
+      end;
+  has_local_changes:=false;
+end;
+
+
 end.

+ 12 - 11
compiler/comphook.pas

@@ -107,20 +107,21 @@ type
   { Special file for bug report }
     reportbugfile : text;
   end;
+
+type
+  EControlCAbort=class(Exception)
+    constructor Create;
+  end;
+  ECompilerAbort=class(Exception)
+    constructor Create;
+  end;
+  ECompilerAbortSilent=class(Exception)
+    constructor Create;
+  end;
+
 var
   status : tcompilerstatus;
 
-    type
-      EControlCAbort=class(Exception)
-        constructor Create;
-      end;
-      ECompilerAbort=class(Exception)
-        constructor Create;
-      end;
-      ECompilerAbortSilent=class(Exception)
-        constructor Create;
-      end;
-
 { Default Functions }
 Function  def_status:boolean;
 Function  def_comment(Level:Longint;const s:ansistring):boolean;

+ 30 - 1
compiler/compiler.pas

@@ -281,7 +281,6 @@ begin
      end;
      DoneVerbose;
   except
-
     on EControlCAbort do
       begin
         try
@@ -312,6 +311,36 @@ begin
       begin
         DoneVerbose;
       end;
+    on EOutOfMemory do
+      begin
+        try
+          Message(general_f_no_memory_left);
+        except
+          on ECompilerAbort do
+            ;
+        end;
+        DoneVerbose;
+      end;
+    on e : EInOutError do
+      begin
+        try
+          Message1(general_f_ioerror,e.message);
+        except
+          on ECompilerAbort do
+            ;
+        end;
+        DoneVerbose;
+      end;
+    on e : EOSError do
+      begin
+        try
+          Message1(general_f_oserror,e.message);
+        except
+          on ECompilerAbort do
+            ;
+        end;
+        DoneVerbose;
+      end;
     on Exception do
       begin
         { General catchall, normally not used }

+ 13 - 5
compiler/comprsrc.pas

@@ -75,7 +75,7 @@ implementation
 uses
   SysUtils,
   cutils,cfileutl,cclasses,
-  Globtype,Globals,Verbose,Fmodule, comphook;
+  Globtype,Globals,Verbose,Fmodule, comphook,cpuinfo;
 
 {****************************************************************************
                               TRESOURCEFILE
@@ -237,7 +237,8 @@ var
   srcfilepath,
   preprocessorbin,
   s : TCmdStr;
-  arch : ansistring;
+  arch,
+  subarch: ansistring;
 
   function WindresFileName(filename: TCmdStr): TCmdStr;
   // to be on the safe side, for files that are passed to the preprocessor,
@@ -271,11 +272,18 @@ begin
       else
         ObjUsed:=(pos('$OBJ',s)>0);
       Replace(s,'$OBJ',maybequoted(OutName));
+      subarch:='all';
       arch:=cpu2str[target_cpu];
-      //Differentiate between arm and armeb
-      if (source_info.cpu=cpu_arm) and (source_info.endian=endian_big) then
-        arch:=arch+'eb';
+      if (source_info.cpu=systems.cpu_arm) then
+        begin
+          //Differentiate between arm and armeb
+          if (source_info.endian=endian_big) then
+            arch:=arch+'eb';
+        end;
       Replace(s,'$ARCH',arch);
+      if target_info.system=system_arm_darwin then
+        subarch:=lower(cputypestr[current_settings.cputype]);
+      Replace(s,'$SUBARCH',subarch);
       case target_info.endian of
         endian_little : Replace(s,'$ENDIAN','littleendian');
         endian_big : Replace(s,'$ENDIAN','bigendian');

+ 4 - 0
compiler/constexp.pas

@@ -57,11 +57,15 @@ var   internalerror:errorproc;
 
 {Same issue, avoid dependency on cpuinfo because the cpu directory isn't
  searched during utils building.}
+{$ifdef GENERIC_CPU}
+type  bestreal=extended;
+{$else}
 {$ifdef x86}
 type  bestreal=extended;
 {$else}
 type  bestreal=double;
 {$endif}
+{$endif}
 
 operator := (const u:qword):Tconstexprint;inline;
 operator := (const s:int64):Tconstexprint;inline;

+ 37 - 2
compiler/dbgdwarf.pas

@@ -1418,8 +1418,7 @@ implementation
                 ]);
               finish_entry;
             end;
-          pasbool,
-          bool8bit :
+          pasbool8 :
             begin
               append_entry(DW_TAG_base_type,false,[
                 DW_AT_name,DW_FORM_string,'Boolean'#0,
@@ -1428,6 +1427,24 @@ implementation
                 ]);
               finish_entry;
             end;
+          bool8bit :
+            begin
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,'ByteBool'#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                DW_AT_byte_size,DW_FORM_data1,1
+                ]);
+              finish_entry;
+            end;
+          pasbool16 :
+            begin
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,'Boolean16'#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                DW_AT_byte_size,DW_FORM_data1,2
+                ]);
+              finish_entry;
+            end;
           bool16bit :
             begin
               append_entry(DW_TAG_base_type,false,[
@@ -1437,6 +1454,15 @@ implementation
                 ]);
               finish_entry;
             end;
+          pasbool32 :
+            begin
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,'Boolean32'#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                DW_AT_byte_size,DW_FORM_data1,4
+                ]);
+              finish_entry;
+            end;
           bool32bit :
             begin
               append_entry(DW_TAG_base_type,false,[
@@ -1446,6 +1472,15 @@ implementation
                 ]);
               finish_entry;
             end;
+          pasbool64 :
+            begin
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,'Boolean64'#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                DW_AT_byte_size,DW_FORM_data1,8
+                ]);
+              finish_entry;
+            end;
           bool64bit :
             begin
               append_entry(DW_TAG_base_type,false,[

+ 16 - 28
compiler/dbgstabs.pas

@@ -499,7 +499,6 @@ implementation
         stabchar : string[2];
         symname  : string[20];
         st    : ansistring;
-        p     : pchar;
       begin
         { type prefix }
         if def.typ in tagtypes then
@@ -528,9 +527,7 @@ implementation
           unit and then the linenumber is invalid in the current sourcefile }
         st:=st+def_stabstr_evaluate(def,'",${N_LSYM},0,0,0',[]);
         { add to list }
-        getmem(p,length(st)+1);
-        move(pchar(st)^,p^,length(st)+1);
-        list.concat(Tai_stab.create(stab_stabs,p));
+        list.concat(Tai_stab.create_ansistr(stab_stabs,st));
       end;
 
 
@@ -624,7 +621,10 @@ implementation
             case def.ordtype of
               uvoid :
                 ss:=def_stab_number(def);
-              pasbool,
+              pasbool8,
+              pasbool16,
+              pasbool32,
+              pasbool64,
               bool8bit,
               bool16bit,
               bool32bit,
@@ -647,13 +647,16 @@ implementation
                 ss:='-20;';
               uwidechar :
                 ss:='-30;';
-              pasbool,
+              pasbool8,
               bool8bit :
                 ss:='-21;';
+              pasbool16,
               bool16bit :
                 ss:='-22;';
+              pasbool32,
               bool32bit :
                 ss:='-23;';
+              pasbool64,
               bool64bit :
                 { no clue if this is correct (FK) }
                 ss:='-23;';
@@ -794,8 +797,8 @@ implementation
         if (oo_has_vmt in def.objectoptions) and
            assigned(def.owner) and
            assigned(def.owner.name) then
-          list.concat(Tai_stab.create(stab_stabs,strpnew('"vmt_'+GetSymTableName(def.owner)+tobjectdef(def).objname^+':S'+
-                 def_stab_number(vmttype)+'",'+tostr(N_STSYM)+',0,0,'+tobjectdef(def).vmt_mangledname)));
+          list.concat(Tai_stab.create_ansistr(stab_stabs,ansistring('"vmt_')+GetSymTableName(def.owner)+tobjectdef(def).objname^+':S'+
+                 def_stab_number(vmttype)+'",'+tostr(N_STSYM)+',0,0,'+ansistring(tobjectdef(def).vmt_mangledname)));
       end;
 
 
@@ -826,7 +829,6 @@ implementation
       var
         st,
         ss : ansistring;
-        p: pchar;
         elementdefstabnr: string;
       begin
         { ugly hack: create a temporary subrange type if the lower bound of
@@ -845,9 +847,7 @@ implementation
               st:=st+def_stabstr_evaluate(def.elementdef,'r'+elementdefstabnr+';$1;$2;',[tostr(longint(def.setbase)),tostr(longint(get_max_value(def.elementdef).svalue))]);
             st:=st+'",'+tostr(N_LSYM)+',0,0,0';
             { add to list }
-            getmem(p,length(st)+1);
-            move(pchar(st)^,p^,length(st)+1);
-            list.concat(Tai_stab.create(stab_stabs,p));
+            list.concat(Tai_stab.create_ansistr(stab_stabs,st));
           end
         else
           elementdefstabnr:=def_stab_number(def.elementdef);
@@ -1017,7 +1017,6 @@ implementation
       var
         templist : TAsmList;
         stabsendlabel : tasmlabel;
-        p  : pchar;
         RType : Char;
         Obj,Info : String;
         hs : string;
@@ -1067,9 +1066,7 @@ implementation
               ss:=ss+'.';
             ss:=ss+def.mangledname;
           end;
-        getmem(p,length(ss)+1);
-        move(pchar(ss)^,p^,length(ss)+1);
-        templist.concat(Tai_stab.Create(stab_stabn,p));
+        templist.concat(Tai_stab.Create_ansistr(stab_stabn,ss));
         // RBRAC
         ss:=tostr(N_RBRAC)+',0,0,'+stabsendlabel.name;
         if not(af_stabs_use_function_absolute_addresses in target_asm.flags) then
@@ -1079,9 +1076,7 @@ implementation
               ss:=ss+'.';
             ss:=ss+def.mangledname;
           end;
-        getmem(p,length(ss)+1);
-        move(pchar(ss)^,p^,length(ss)+1);
-        templist.concat(Tai_stab.Create(stab_stabn,p));
+        templist.concat(Tai_stab.Create_ansistr(stab_stabn,ss));
 
         { the stabsendlabel must come after all other stabs for this }
         { function                                                   }
@@ -1128,10 +1123,7 @@ implementation
                assigned(tprocdef(def.owner.defowner).procsym) then
               info := ','+GetSymName(def.procsym)+','+GetSymName(tprocdef(def.owner.defowner).procsym);
           end;
-        ss:='"'+ansistring(obj)+':'+RType+def_stab_number(def.returndef)+info+'",'+tostr(n_function)+',0,'+tostr(def.fileinfo.line)+','+ansistring(def.mangledname);
-        getmem(p,length(ss)+1);
-        move(pchar(ss)^,p^,length(ss)+1);
-        templist.concat(Tai_stab.Create(stab_stabs,p));
+        templist.concat(Tai_stab.Create_ansistr(stab_stabs,'"'+ansistring(obj)+':'+RType+def_stab_number(def.returndef)+info+'",'+tostr(n_function)+',0,'+tostr(def.fileinfo.line)+','+ansistring(def.mangledname)));
 
         current_asmdata.asmlists[al_procedures].insertlistbefore(def.procstarttai,templist);
 
@@ -1191,15 +1183,11 @@ implementation
 
 
     procedure TDebugInfoStabs.write_sym_stabstr(list:TAsmList;sym:tsym;const ss:ansistring);
-      var
-        p : pchar;
       begin
         if ss='' then
           exit;
         { add to list }
-        getmem(p,length(ss)+1);
-        move(pchar(ss)^,p^,length(ss)+1);
-        list.concat(Tai_stab.create(stab_stabs,p));
+        list.concat(Tai_stab.create_ansistr(stab_stabs,ss));
       end;
 
 

+ 7 - 4
compiler/defcmp.pas

@@ -166,7 +166,8 @@ implementation
           (bvoid,
            bint,bint,bint,bint,
            bint,bint,bint,bint,
-           bbool,bbool,bbool,bbool,bbool,
+           bbool,bbool,bbool,bbool,
+           bbool,bbool,bbool,bbool,
            bchar,bchar,bint);
 
         basedefconvertsimplicit : array[tbasedef,tbasedef] of tconverttype =
@@ -241,7 +242,8 @@ implementation
                                 end;
                             end;
                           uvoid,
-                          pasbool,bool8bit,bool16bit,bool32bit,bool64bit:
+                          pasbool8,pasbool16,pasbool32,pasbool64,
+                          bool8bit,bool16bit,bool32bit,bool64bit:
                             eq:=te_equal;
                           else
                             internalerror(200210061);
@@ -1551,8 +1553,9 @@ implementation
                 u8bit,u16bit,u32bit,u64bit,
                 s8bit,s16bit,s32bit,s64bit :
                   is_subequal:=(torddef(def2).ordtype in [s64bit,u64bit,s32bit,u32bit,u8bit,s8bit,s16bit,u16bit]);
-                pasbool,bool8bit,bool16bit,bool32bit,bool64bit :
-                  is_subequal:=(torddef(def2).ordtype in [pasbool,bool8bit,bool16bit,bool32bit,bool64bit]);
+                pasbool8,pasbool16,pasbool32,pasbool64,
+                bool8bit,bool16bit,bool32bit,bool64bit :
+                  is_subequal:=(torddef(def2).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64,bool8bit,bool16bit,bool32bit,bool64bit]);
                 uchar :
                   is_subequal:=(torddef(def2).ordtype=uchar);
                 uwidechar :

+ 11 - 3
compiler/defutil.pas

@@ -265,6 +265,9 @@ interface
         or not }
     function is_nested_pd(def: tabstractprocdef): boolean;{$ifdef USEINLINE}inline;{$endif}
 
+    { # returns whether def is a type parameter of a generic }
+    function is_typeparam(def : tdef) : boolean;{$ifdef USEINLINE}inline;{$endif}
+
 implementation
 
     uses
@@ -384,7 +387,8 @@ implementation
                is_ordinal:=dt in [uchar,uwidechar,
                                   u8bit,u16bit,u32bit,u64bit,
                                   s8bit,s16bit,s32bit,s64bit,
-                                  pasbool,bool8bit,bool16bit,bool32bit,bool64bit];
+                                  pasbool8,pasbool16,pasbool32,pasbool64,
+                                  bool8bit,bool16bit,bool32bit,bool64bit];
              end;
            enumdef :
              is_ordinal:=true;
@@ -441,14 +445,14 @@ implementation
     function is_boolean(def : tdef) : boolean;
       begin
         result:=(def.typ=orddef) and
-                    (torddef(def).ordtype in [pasbool,bool8bit,bool16bit,bool32bit,bool64bit]);
+                    (torddef(def).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64,bool8bit,bool16bit,bool32bit,bool64bit]);
       end;
 
 
     function is_pasbool(def : tdef) : boolean;
       begin
         result:=(def.typ=orddef) and
-                    (torddef(def).ordtype = pasbool);
+                    (torddef(def).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64]);
       end;
 
     { true if def is a C-style boolean (non-zero value = true, zero = false) }
@@ -1142,4 +1146,8 @@ implementation
       end;
 
 
+    function is_typeparam(def : tdef) : boolean;{$ifdef USEINLINE}inline;{$endif}
+      begin
+        result:=(def.typ=undefineddef);
+      end;
 end.

+ 7 - 0
compiler/fpcdefs.inc

@@ -28,6 +28,13 @@
 
 {$define USEEXCEPT}
 
+{ If anyone wants to use interrupt for
+  a specific target, add a
+  $define FPC_HAS_SYSTEMS_INTERRUPT_TABLE
+  to fpcdefs.inc to reactivate
+  the corresponding code }
+{$undef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
+
 { This fake CPU is used to allow incorporation of globtype unit
   into utils/ppudump without any CPU specific code PM }
 {$ifdef generic_cpu}

+ 1 - 103
compiler/generic/cpuinfo.pas

@@ -21,109 +21,7 @@ Interface
     globtype;
 
 Type
-   bestreal = double;
-   ts32real = single;
-   ts64real = double;
-   ts80real = type extended;
-   ts128real = type extended;
-   ts64comp = comp;
-
-   pbestreal=^bestreal;
-
-   { possible supported processors for this target }
-   tcputype =
-      (cpu_none
-      );
-
-
-Type
-   tfputype =
-     (fpu_none,
-      fpu_soft
-     );
-
-Const
-   cputypestr : array[tcputype] of string[8] = ('none');
-   fputypestr : array[tfputype] of string[6] = ('none','soft');
-
-Implementation
-
-end.
-{
-    Copyright (c) 1998-2002 by the Free Pascal development team
-
-    Basic Processor information for the Generic CPU
-    This file is used by PPUDump program from utils subdirectory.
-
-    See the file COPYING.FPC, included in this distribution,
-    for details about the copyright.
-
-    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.
-
- **********************************************************************}
-
-Unit CPUInfo;
-
-Interface
-
-  uses
-    globtype;
-
-Type
-   bestreal = double;
-   ts32real = single;
-   ts64real = double;
-   ts80real = type extended;
-   ts128real = type extended;
-   ts64comp = comp;
-
-   pbestreal=^bestreal;
-
-   { possible supported processors for this target }
-   tcputype =
-      (cpu_none
-      );
-
-
-Type
-   tfputype =
-     (fpu_none,
-      fpu_soft
-     );
-
-Const
-   cputypestr : array[tcputype] of string[8] = ('none');
-   fputypestr : array[tfputype] of string[6] = ('none','soft');
-
-Implementation
-
-end.
-{
-    Copyright (c) 1998-2002 by the Free Pascal development team
-
-    Basic Processor information for the Generic CPU
-    This file is used by PPUDump program from utils subdirectory.
-
-    See the file COPYING.FPC, included in this distribution,
-    for details about the copyright.
-
-    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.
-
- **********************************************************************}
-
-Unit CPUInfo;
-
-Interface
-
-  uses
-    globtype;
-
-Type
-   bestreal = double;
+   bestreal = extended;
    ts32real = single;
    ts64real = double;
    ts80real = type extended;

+ 9 - 4
compiler/globals.pas

@@ -68,7 +68,7 @@ interface
          [m_gpc,m_all,m_tp_procvar];
 {$endif}
        macmodeswitches =
-         [m_mac,m_all,m_cvar_support,m_mac_procvar,m_nested_procvars,m_non_local_goto,m_isolike_unary_minus];
+         [m_mac,m_all,m_cvar_support,m_mac_procvar,m_nested_procvars,m_non_local_goto,m_isolike_unary_minus,m_default_inline];
        isomodeswitches =
          [m_iso,m_all,m_tp_procvar,m_duplicate_names,m_nested_procvars,m_non_local_goto,m_isolike_unary_minus];
 
@@ -121,6 +121,7 @@ interface
          debugswitches   : tdebugswitches;
          { 0: old behaviour for sets <=256 elements
            >0: round to this size }
+         pmessage : pmessagestaterecord;
          setalloc,
          packenum        : shortint;
 
@@ -176,11 +177,13 @@ interface
         property items[I:longint]:TLinkRec read getlinkrec; default;
       end;
 
+
       tpendingstate = record
         nextverbositystr : shortstring;
         nextlocalswitches : tlocalswitches;
         nextverbosityfullswitch: longint;
         nextcallingstr : shortstring;
+        nextmessagerecord : pmessagestaterecord;
         verbosityfullswitched,
         localswitcheschanged : boolean;
       end;
@@ -358,6 +361,7 @@ interface
         genwpoptimizerswitches : [];
         dowpoptimizerswitches : [];
         debugswitches : [];
+        pmessage : nil;
 
         setalloc : 0;
         packenum : 4;
@@ -426,9 +430,9 @@ interface
         minfpconstprec : s32real;
 
         disabledircache : false;
-{$if defined(ARM)}
+{$if defined(ARM) or defined(AVR)}
         controllertype : ct_none;
-{$endif defined(ARM)}
+{$endif defined(ARM) or defined(AVR)}
       );
 
     var
@@ -759,7 +763,8 @@ implementation
          Replace(s,'$FPCDATE',date_string);
          Replace(s,'$FPCCPU',target_cpu_string);
          Replace(s,'$FPCOS',target_os_string);
-         if tf_use_8_3 in Source_Info.Flags then
+         if (tf_use_8_3 in Source_Info.Flags) or
+            (tf_use_8_3 in Target_Info.Flags) then
            Replace(s,'$FPCTARGET',target_os_string)
          else
            Replace(s,'$FPCTARGET',target_full_string);

+ 25 - 3
compiler/globtype.pas

@@ -517,10 +517,32 @@ interface
     type
       { a message state }
       tmsgstate = (
-        ms_on,    // turn on output
-        ms_off,   // turn off output
-        ms_error  // cast to error
+        ms_on := 1,
+        ms_off := 2,
+        ms_error := 3,
+
+        ms_on_global := $11,    // turn on output
+        ms_off_global := $22,   // turn off output
+        ms_error_global := $33  // cast to error
       );
+    const
+      { Mask for current value of message state }
+      ms_local_mask = $0f;
+      { Mask for global value of message state
+        that needs to be restored when changing units }
+      ms_global_mask = $f0;
+      { Shift used to convert global to local message state }
+      ms_shift = 4;
+
+    type
+      pmessagestaterecord = ^tmessagestaterecord;
+      tmessagestaterecord = record
+        next : pmessagestaterecord;
+        value : longint;
+        state : tmsgstate;
+      end;
+
+
 
 implementation
 

+ 57 - 30
compiler/htypechk.pas

@@ -67,12 +67,12 @@ interface
         FParaNode   : tnode;
         FParaLength : smallint;
         FAllowVariant : boolean;
-        procedure collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList;searchhelpers:boolean);
+        procedure collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList;searchhelpers,anoninherited:boolean);
         procedure collect_overloads_in_units(ProcdefOverloadList:TFPObjectList; objcidcall,explicitunit: boolean);
-        procedure create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers:boolean);
+        procedure create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers,anoninherited:boolean);
         function  proc_add(st:tsymtable;pd:tprocdef;objcidcall: boolean):pcandidate;
       public
-        constructor create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers:boolean);
+        constructor create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers,anoninherited:boolean);
         constructor create_operator(op:ttoken;ppn:tnode);
         destructor destroy;override;
         procedure list(all:boolean);
@@ -1322,9 +1322,8 @@ implementation
                     (vo_is_loop_counter in tsubscriptnode(hp).vs.varoptions) then
                    begin
                      if report_errors then
-                       CGMessage1(parser_e_illegal_assignment_to_count_var,tsubscriptnode(hp).vs.realname)
-                     else
-                       exit;
+                       CGMessage1(parser_e_illegal_assignment_to_count_var,tsubscriptnode(hp).vs.realname);
+                     exit;
                    end;
                  { implicit pointer object types result in dereferencing }
                  hp:=tsubscriptnode(hp).left;
@@ -1475,10 +1474,11 @@ implementation
                        if not(Valid_Const in opts) and
                           not gotderef and
                           (vo_is_loop_counter in tabstractvarsym(tloadnode(hp).symtableentry).varoptions) then
-                         if report_errors then
-                          CGMessage1(parser_e_illegal_assignment_to_count_var,tloadnode(hp).symtableentry.realname)
-                         else
-                          exit;
+                         begin
+                           if report_errors then
+                             CGMessage1(parser_e_illegal_assignment_to_count_var,tloadnode(hp).symtableentry.realname);
+                           exit;
+                         end;
                        { read-only variable? }
                        if (tabstractvarsym(tloadnode(hp).symtableentry).varspez in [vs_const,vs_constref]) then
                         begin
@@ -1758,7 +1758,7 @@ implementation
                            TCallCandidates
 ****************************************************************************}
 
-    constructor tcallcandidates.create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers:boolean);
+    constructor tcallcandidates.create(sym:tprocsym;st:TSymtable;ppn:tnode;ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers,anoninherited:boolean);
       begin
         if not assigned(sym) then
           internalerror(200411015);
@@ -1766,7 +1766,7 @@ implementation
         FProcsym:=sym;
         FProcsymtable:=st;
         FParanode:=ppn;
-        create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers);
+        create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers,anoninherited);
       end;
 
 
@@ -1776,7 +1776,7 @@ implementation
         FProcsym:=nil;
         FProcsymtable:=nil;
         FParanode:=ppn;
-        create_candidate_list(false,false,false,false,false);
+        create_candidate_list(false,false,false,false,false,false);
       end;
 
 
@@ -1795,21 +1795,43 @@ implementation
       end;
 
 
-    procedure tcallcandidates.collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList;searchhelpers:boolean);
+    procedure tcallcandidates.collect_overloads_in_struct(structdef:tabstractrecorddef;ProcdefOverloadList:TFPObjectList;searchhelpers,anoninherited:boolean);
 
-      function processprocsym(srsym:tprocsym):boolean;
+      function processprocsym(srsym:tprocsym; out foundanything: boolean):boolean;
         var
           j  : integer;
           pd : tprocdef;
         begin
-          { Store first procsym found }
-          if not assigned(FProcsym) then
-            FProcsym:=srsym;
           { add all definitions }
           result:=false;
+          foundanything:=false;
           for j:=0 to srsym.ProcdefList.Count-1 do
             begin
               pd:=tprocdef(srsym.ProcdefList[j]);
+              { in case of anonymous inherited, only match procdefs identical
+                to the current one (apart from hidden parameters), rather than
+                anything compatible to the parameters -- except in case of
+                the presence of a messagestr/int, in which case those have to
+                match exactly }
+              if anoninherited then
+                if po_msgint in current_procinfo.procdef.procoptions then
+                  begin
+                    if not(po_msgint in pd.procoptions) or
+                       (pd.messageinf.i<>current_procinfo.procdef.messageinf.i) then
+                      continue
+                  end
+                else if po_msgstr in current_procinfo.procdef.procoptions then
+                  begin
+                    if not(po_msgstr in pd.procoptions) or
+                       (pd.messageinf.str^<>current_procinfo.procdef.messageinf.str^) then
+                      continue
+                  end
+                else if (compare_paras(current_procinfo.procdef.paras,pd.paras,cp_all,[cpo_ignorehidden])<te_equal) then
+                  continue;
+              foundanything:=true;
+              { Store first procsym found }
+              if not assigned(FProcsym) then
+                FProcsym:=tprocsym(srsym);
               if po_overload in pd.procoptions then
                 result:=true;
               ProcdefOverloadList.Add(srsym.ProcdefList[j]);
@@ -1819,7 +1841,8 @@ implementation
       var
         srsym      : tsym;
         hashedid   : THashedIDString;
-        hasoverload : boolean;
+        hasoverload,
+        foundanything : boolean;
         helperdef  : tobjectdef;
       begin
         if FOperator=NOTOKEN then
@@ -1843,9 +1866,10 @@ implementation
                            { Delphi allows hiding a property by a procedure with the same name }
                            (srsym.typ=procsym) then
                          begin
-                           hasoverload := processprocsym(tprocsym(srsym));
+                           hasoverload:=processprocsym(tprocsym(srsym),foundanything);
                            { when there is no explicit overload we stop searching }
-                           if not hasoverload then
+                           if foundanything and
+                              not hasoverload then
                              break;
                          end;
                        helperdef:=helperdef.childof;
@@ -1860,9 +1884,10 @@ implementation
               { Delphi allows hiding a property by a procedure with the same name }
               (srsym.typ=procsym) then
              begin
-               hasoverload:=processprocsym(tprocsym(srsym));
+               hasoverload:=processprocsym(tprocsym(srsym),foundanything);
                { when there is no explicit overload we stop searching }
-               if not hasoverload then
+               if foundanything and
+                  not hasoverload then
                  break;
              end;
            if is_objectpascal_helper(structdef) then
@@ -1875,9 +1900,10 @@ implementation
                   { Delphi allows hiding a property by a procedure with the same name }
                   (srsym.typ=procsym) then
                  begin
-                   hasoverload:=processprocsym(tprocsym(srsym));
+                   hasoverload:=processprocsym(tprocsym(srsym),foundanything);
                    { when there is no explicit overload we stop searching }
-                   if not hasoverload then
+                   if foundanything and
+                      not hasoverload then
                      break;
                  end;
              end;
@@ -1933,7 +1959,7 @@ implementation
               break;
             if srsymtable.symtabletype in [localsymtable,staticsymtable,globalsymtable] then
               begin
-                srsym:=tprocsym(srsymtable.FindWithHash(hashedid));
+                srsym:=tsym(srsymtable.FindWithHash(hashedid));
                 if assigned(srsym) and
                    (srsym.typ=procsym) then
                   begin
@@ -1961,7 +1987,7 @@ implementation
       end;
 
 
-    procedure tcallcandidates.create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers:boolean);
+    procedure tcallcandidates.create_candidate_list(ignorevisibility,allowdefaultparas,objcidcall,explicitunit,searchhelpers,anoninherited:boolean);
       var
         j     : integer;
         pd    : tprocdef;
@@ -1979,7 +2005,7 @@ implementation
         if not objcidcall and
            (FOperator=NOTOKEN) and
            (FProcsym.owner.symtabletype in [objectsymtable,recordsymtable]) then
-          collect_overloads_in_struct(tabstractrecorddef(FProcsym.owner.defowner),ProcdefOverloadList,searchhelpers)
+          collect_overloads_in_struct(tabstractrecorddef(FProcsym.owner.defowner),ProcdefOverloadList,searchhelpers,anoninherited)
         else
         if (FOperator<>NOTOKEN) then
           begin
@@ -1989,7 +2015,7 @@ implementation
             while assigned(pt) do
               begin
                 if (pt.resultdef.typ=recorddef) then
-                  collect_overloads_in_struct(tabstractrecorddef(pt.resultdef),ProcdefOverloadList,searchhelpers);
+                  collect_overloads_in_struct(tabstractrecorddef(pt.resultdef),ProcdefOverloadList,searchhelpers,anoninherited);
                 pt:=tcallparanode(pt.right);
               end;
             collect_overloads_in_units(ProcdefOverloadList,objcidcall,explicitunit);
@@ -2493,7 +2519,8 @@ implementation
         variantorddef_cl: array[tordtype] of tvariantequaltype =
           (tve_incompatible,tve_byte,tve_word,tve_cardinal,tve_chari64,
            tve_shortint,tve_smallint,tve_longint,tve_chari64,
-           tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal,
+           tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal,
+           tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal,
            tve_chari64,tve_chari64,tve_dblcurrency);
 { TODO: fixme for 128 bit floats }
         variantfloatdef_cl: array[tfloattype] of tvariantequaltype =

+ 0 - 26
compiler/i386/cpubase.inc

@@ -48,30 +48,6 @@
       }
       std_op2str:op2strtable={$i i386int.inc}
 
-{*****************************************************************************
-                                 Constants
-*****************************************************************************}
-      c_countusableregsint = 4;
-
-{
-      firstsaveintreg = RS_EAX;
-      lastsaveintreg  = RS_EDX;
-      firstsavefpureg = RS_INVALID;
-      lastsavefpureg  = RS_INVALID;
-      firstsavemmreg  = RS_MM0;
-      lastsavemmreg   = RS_MM7;
-
-      general_superregisters = [RS_EAX,RS_EBX,RS_ECX,RS_EDX];
-
-      maxvarregs = 4;
-      varregs : array[1..maxvarregs] of tsuperregister =
-         (RS_EBX,RS_EDX,RS_ECX,RS_EAX);
-
-      maxfpuvarregs = 8;
-
-      maxmmvarregs = 8;
-}
-
 {*****************************************************************************
                                GDB Information
 *****************************************************************************}
@@ -169,5 +145,3 @@
          PARM_BOUNDARY / BITS_PER_UNIT in the GCC source.
       }
       std_param_align = 4;
-
-

+ 1 - 1
compiler/i386/cputarg.pas

@@ -92,7 +92,7 @@ implementation
       ,agx86att
     {$endif}
     {$ifndef NOAG386NSM}
-      ,ag386nsm
+      ,agx86nsm
     {$endif}
     {$ifndef NOAG386INT}
       ,agx86int

+ 2 - 0
compiler/i386/i386att.inc

@@ -161,6 +161,7 @@
 'iret',
 'iret',
 'iretw',
+'iretq',
 'jcxz',
 'jecxz',
 'jrcxz',
@@ -662,6 +663,7 @@
 'pmovzxwq',
 'pmovzxdq',
 'pmuldq',
+'pmulld',
 'ptest',
 'roundps',
 'roundpd',

+ 2 - 0
compiler/i386/i386atts.inc

@@ -164,6 +164,7 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
 attsufINT,
 attsufNONE,
 attsufINT,
@@ -667,6 +668,7 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
 attsufINT,
 attsufNONE,
 attsufNONE,

+ 2 - 0
compiler/i386/i386int.inc

@@ -161,6 +161,7 @@
 'iret',
 'iretd',
 'iretw',
+'iretq',
 'jcxz',
 'jecxz',
 'jrcxz',
@@ -662,6 +663,7 @@
 'pmovzxwq',
 'pmovzxdq',
 'pmuldq',
+'pmulld',
 'ptest',
 'roundps',
 'roundpd',

+ 1 - 1
compiler/i386/i386nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-1203;
+1205;

+ 2 - 0
compiler/i386/i386op.inc

@@ -161,6 +161,7 @@ A_INVLPG,
 A_IRET,
 A_IRETD,
 A_IRETW,
+A_IRETQ,
 A_JCXZ,
 A_JECXZ,
 A_JRCXZ,
@@ -662,6 +663,7 @@ A_PMOVZXWD,
 A_PMOVZXWQ,
 A_PMOVZXDQ,
 A_PMULDQ,
+A_PMULLD,
 A_PTEST,
 A_ROUNDPS,
 A_ROUNDPD,

+ 20 - 18
compiler/i386/i386prop.inc

@@ -161,6 +161,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_RECX, Ch_None, Ch_None)),
 (Ch: (Ch_RECX, Ch_None, Ch_None)),
 (Ch: (Ch_RECX, Ch_None, Ch_None)),
@@ -413,7 +414,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Rop1, Ch_Rop2, Ch_WFlags)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
@@ -439,19 +440,19 @@
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Mop3, Ch_Rop2, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Rop1, Ch_Rop2, Ch_WFlags)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
@@ -522,7 +523,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Rop1, Ch_Rop2, Ch_WFlags)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
@@ -553,21 +554,21 @@
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Mop3, Ch_Rop2, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Rop1, Ch_Rop2, Ch_WFlags)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
+(Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
@@ -667,6 +668,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_Mop1, Ch_Rop2, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),

+ 1217 - 1203
compiler/i386/i386tab.inc

@@ -3,8421 +3,8435 @@
   (
     opcode  : A_NONE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #0;
     flags   : if_none
   ),
   (
     opcode  : A_AAA;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#55;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_AAD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#213#10;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_AAD;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#213#20;
     flags   : if_8086 or if_sb or if_nox86_64
   ),
   (
     opcode  : A_AAM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#212#10;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_AAM;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#212#20;
     flags   : if_8086 or if_sb or if_nox86_64
   ),
   (
     opcode  : A_AAS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#63;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#17#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#19#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#16#65;
     flags   : if_8086
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#18#72;
     flags   : if_8086
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#130#13;
     flags   : if_8086
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#21#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#129#130#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#21#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#130#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#20#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#130#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#1#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#3#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#0#65;
     flags   : if_8086
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#2#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#128#13;
     flags   : if_8086
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #208#1#5#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#129#128#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#5#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#128#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#4#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#128#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#33#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#35#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#32#65;
     flags   : if_8086
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#34#72;
     flags   : if_8086
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#132#13;
     flags   : if_8086
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#37#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#129#132#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#37#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#132#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#36#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#132#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ARPL;
     ops     : 2;
-    optypes : (ot_reg16,ot_reg16,ot_none);
+    optypes : (ot_reg16,ot_reg16,ot_none,ot_none);
     code    : #1#99#65;
     flags   : if_286 or if_prot or if_nox86_64
   ),
   (
     opcode  : A_ARPL;
     ops     : 2;
-    optypes : (ot_memory,ot_reg16,ot_none);
+    optypes : (ot_memory,ot_reg16,ot_none,ot_none);
     code    : #1#99#65;
     flags   : if_286 or if_prot or if_sm or if_nox86_64
   ),
   (
     opcode  : A_BOUND;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none,ot_none);
     code    : #208#1#98#72;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_BSF;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#2#15#188#72;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BSR;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#2#15#189#72;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BSWAP;
     ops     : 1;
-    optypes : (ot_reg32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#15#8#200;
     flags   : if_486
   ),
   (
     opcode  : A_BT;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#163#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BT;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#2#15#186#132#21;
     flags   : if_386 or if_sb
   ),
   (
     opcode  : A_BTC;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#187#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BTC;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#2#15#186#135#21;
     flags   : if_386 or if_sb
   ),
   (
     opcode  : A_BTR;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#179#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BTR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#2#15#186#134#21;
     flags   : if_386 or if_sb
   ),
   (
     opcode  : A_BTS;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#171#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_BTS;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#2#15#186#133#21;
     flags   : if_386 or if_sb
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #208#1#232#52;
     flags   : if_8086
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#130;
     flags   : if_8086
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_immediate or ot_near,ot_none,ot_none);
+    optypes : (ot_immediate or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#232#52;
     flags   : if_8086
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_immediate or ot_far,ot_none,ot_none);
+    optypes : (ot_immediate or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#154#28#31;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_memory or ot_near,ot_none,ot_none);
+    optypes : (ot_memory or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#255#130;
     flags   : if_8086
   ),
   (
     opcode  : A_CALL;
     ops     : 1;
-    optypes : (ot_memory or ot_far,ot_none,ot_none);
+    optypes : (ot_memory or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#255#131;
     flags   : if_8086
   ),
   (
     opcode  : A_CALL;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate,ot_none);
+    optypes : (ot_immediate,ot_immediate,ot_none,ot_none);
     code    : #215#1#154#29#24;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_CALL;
     ops     : 2;
-    optypes : (ot_immediate or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_immediate or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#154#25#24;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_CALL;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate or ot_bits16,ot_none);
+    optypes : (ot_immediate,ot_immediate or ot_bits16,ot_none,ot_none);
     code    : #212#1#154#25#24;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_CALL;
     ops     : 2;
-    optypes : (ot_immediate or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_immediate or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#154#33#24;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_CALL;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate or ot_bits32,ot_none);
+    optypes : (ot_immediate,ot_immediate or ot_bits32,ot_none,ot_none);
     code    : #213#1#154#33#24;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_CBW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#152;
     flags   : if_8086
   ),
   (
     opcode  : A_CDQ;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#153;
     flags   : if_386
   ),
   (
     opcode  : A_CLC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#248;
     flags   : if_8086
   ),
   (
     opcode  : A_CLD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#252;
     flags   : if_8086
   ),
   (
     opcode  : A_CLI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#250;
     flags   : if_8086
   ),
   (
     opcode  : A_CLTS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#6;
     flags   : if_286 or if_priv
   ),
   (
     opcode  : A_CMC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#245;
     flags   : if_8086
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#57#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#59#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#56#65;
     flags   : if_8086
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#58#72;
     flags   : if_8086
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#135#13;
     flags   : if_8086
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#61#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#129#135#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#61#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#135#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#60#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#135#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits32,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits32,ot_none,ot_none);
     code    : #213#1#129#135#33;
     flags   : if_386 or if_sd
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits16,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits16,ot_none,ot_none);
     code    : #212#1#129#135#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits8,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits8,ot_none,ot_none);
     code    : #1#128#135#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_CMPSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#1#166;
     flags   : if_8086
   ),
   (
     opcode  : A_CMPSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#213#1#167;
     flags   : if_386
   ),
   (
     opcode  : A_CMPSD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #220#2#15#194#72#22;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_CMPSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#212#1#167;
     flags   : if_8086
   ),
   (
     opcode  : A_CMPXCHG;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#177#65;
     flags   : if_pent or if_sm
   ),
   (
     opcode  : A_CMPXCHG;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #2#15#176#65;
     flags   : if_pent
   ),
   (
     opcode  : A_CMPXCHG486;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#167#65;
     flags   : if_486 or if_sm
   ),
   (
     opcode  : A_CMPXCHG486;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #2#15#166#65;
     flags   : if_486 or if_undoc
   ),
   (
     opcode  : A_CMPXCHG8B;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#199#129;
     flags   : if_pent
   ),
   (
     opcode  : A_CPUID;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#162;
     flags   : if_pent
   ),
   (
     opcode  : A_CWD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#153;
     flags   : if_8086
   ),
   (
     opcode  : A_CWDE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#152;
     flags   : if_386
   ),
   (
     opcode  : A_DAA;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#39;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_DAS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#47;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_DEC;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32,ot_none,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_none,ot_none,ot_none);
     code    : #208#8#72;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_DEC;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#129;
     flags   : if_8086
   ),
   (
     opcode  : A_DEC;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#254#129;
     flags   : if_8086
   ),
   (
     opcode  : A_DIV;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#134;
     flags   : if_8086
   ),
   (
     opcode  : A_DIV;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#134;
     flags   : if_8086
   ),
   (
     opcode  : A_EMMS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#119;
     flags   : if_pent or if_mmx
   ),
   (
     opcode  : A_ENTER;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate,ot_none);
+    optypes : (ot_immediate,ot_immediate,ot_none,ot_none);
     code    : #1#200#24#21;
     flags   : if_186
   ),
   (
     opcode  : A_F2XM1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FABS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#225;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#193;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADD;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADDP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#193;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADDP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FADDP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FBLD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #1#223#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FBLD;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#223#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FBSTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #1#223#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FBSTP;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#223#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCHS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCLEX;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#155#219#226;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCMOVB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#218#193;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVB;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#218#8#192;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVB;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#218#9#192;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVBE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#218#209;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVBE;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#218#8#208;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVBE;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#218#9#208;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#218#201;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVE;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#218#8#200;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVE;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#218#9#200;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#193;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNB;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#192;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNB;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#192;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNBE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#209;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNBE;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#208;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNBE;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#208;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#201;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNE;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#200;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNE;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#200;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNU;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#217;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNU;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#216;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVNU;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#216;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVU;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#218#217;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVU;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#218#8#216;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCMOVU;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#218#9#216;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOM;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOM;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#216#209;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOM;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#208;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOM;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#208;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#241;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMI;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#240;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMI;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#240;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMIP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#223#241;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMIP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#223#8#240;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMIP;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#223#9#240;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FCOMP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#216#217;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#216;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMP;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#216;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOMPP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#217;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FCOS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#255;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FDECSTP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#246;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDISI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#155#219#225;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#220#241;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIV;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#241;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#240;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#220#249;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVR;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVRP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#249;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVRP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FDIVRP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FEMMS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#14;
     flags   : if_pent or if_3dnow
   ),
   (
     opcode  : A_FENI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#155#219#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FFREE;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#221#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIADD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIADD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FICOM;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FICOM;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FICOMP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FICOMP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIDIV;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIDIV;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIDIVR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIDIVR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FILD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#219#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FILD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#223#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FILD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#223#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIMUL;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#129;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIMUL;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#129;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FINCSTP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#247;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FINIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#155#219#227;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIST;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#219#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FIST;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #212#1#223#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#219#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #212#1#223#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#223#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISTTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#219#129;
     flags   : if_prescott or if_fpu
   ),
   (
     opcode  : A_FISTTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#223#129;
     flags   : if_prescott or if_fpu
   ),
   (
     opcode  : A_FISTTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#221#129;
     flags   : if_prescott or if_fpu
   ),
   (
     opcode  : A_FISUB;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISUB;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISUBR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #1#222#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FISUBR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#218#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#217#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#221#128;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLD;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #1#219#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLD;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#217#8#192;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLD1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDCW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#217#133;
     flags   : if_8086 or if_fpu or if_sw
   ),
   (
     opcode  : A_FLDENV;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#217#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDL2E;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#234;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDL2T;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#233;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDLG2;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#236;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDLN2;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#237;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDPI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#235;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FLDZ;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#238;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#129;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#129;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#220#201;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMUL;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMULP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#201;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMULP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FMULP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNCLEX;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#226;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNDISI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#225;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNENI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNINIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#227;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNOP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#208;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNSAVE;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#221#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNSTCW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#217#135;
     flags   : if_8086 or if_fpu or if_sw
   ),
   (
     opcode  : A_FNSTENV;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#217#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FNSTSW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#221#135;
     flags   : if_8086 or if_fpu or if_sw
   ),
   (
     opcode  : A_FNSTSW;
     ops     : 1;
-    optypes : (ot_reg_ax,ot_none,ot_none);
+    optypes : (ot_reg_ax,ot_none,ot_none,ot_none);
     code    : #2#223#224;
     flags   : if_286 or if_fpu
   ),
   (
     opcode  : A_FPATAN;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#243;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FPREM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#248;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FPREM1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#245;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FPTAN;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#242;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FRNDINT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#252;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FRSTOR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #1#221#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSAVE;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#155#221#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSCALE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#253;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSETPM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#228;
     flags   : if_286 or if_fpu
   ),
   (
     opcode  : A_FSIN;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#254;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FSINCOS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#251;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FSQRT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#250;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FST;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#217#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FST;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#221#130;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FST;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#221#8#208;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTCW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#155#217#135;
     flags   : if_8086 or if_fpu or if_sw
   ),
   (
     opcode  : A_FSTENV;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#155#217#134;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#217#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#221#131;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTP;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #1#219#135;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#221#8#216;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSTSW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#155#221#135;
     flags   : if_8086 or if_fpu or if_sw
   ),
   (
     opcode  : A_FSTSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#155#223#224;
     flags   : if_286 or if_fpu
   ),
   (
     opcode  : A_FSTSW;
     ops     : 1;
-    optypes : (ot_reg_ax,ot_none,ot_none);
+    optypes : (ot_reg_ax,ot_none,ot_none,ot_none);
     code    : #3#155#223#224;
     flags   : if_286 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#132;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#220#225;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUB;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#225;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#224;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits32,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits32,ot_none,ot_none,ot_none);
     code    : #1#216#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits64,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits64,ot_none,ot_none,ot_none);
     code    : #1#220#133;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#220#233;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 1;
-    optypes : (ot_fpureg or ot_to,ot_none,ot_none);
+    optypes : (ot_fpureg or ot_to,ot_none,ot_none,ot_none);
     code    : #1#220#8#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#220#8#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#216#8#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBR;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#216#9#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBRP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#222#233;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBRP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#222#8#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FSUBRP;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#222#8#232;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FTST;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#228;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FUCOM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#221#225;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOM;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#221#8#224;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOM;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#221#9#224;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOMI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#219#233;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMI;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#219#8#232;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMI;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#219#9#232;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMIP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#223#233;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMIP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#223#8#232;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMIP;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#223#9#232;
     flags   : if_p6 or if_fpu
   ),
   (
     opcode  : A_FUCOMP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#221#233;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOMP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#221#8#232;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOMP;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#221#9#232;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FUCOMPP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#218#233;
     flags   : if_386 or if_fpu
   ),
   (
     opcode  : A_FWAIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#155;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXAM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#229;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXCH;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#201;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXCH;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#217#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXCH;
     ops     : 2;
-    optypes : (ot_fpureg,ot_fpu0,ot_none);
+    optypes : (ot_fpureg,ot_fpu0,ot_none,ot_none);
     code    : #1#217#8#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXCH;
     ops     : 2;
-    optypes : (ot_fpu0,ot_fpureg,ot_none);
+    optypes : (ot_fpu0,ot_fpureg,ot_none,ot_none);
     code    : #1#217#9#200;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FXTRACT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#244;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FYL2X;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#241;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_FYL2XP1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#217#249;
     flags   : if_8086 or if_fpu
   ),
   (
     opcode  : A_HLT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#244;
     flags   : if_8086 or if_priv
   ),
   (
     opcode  : A_IBTS;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#167#65;
     flags   : if_386 or if_sm or if_undoc
   ),
   (
     opcode  : A_ICEBP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#241;
     flags   : if_386
   ),
   (
     opcode  : A_IDIV;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#135;
     flags   : if_8086
   ),
   (
     opcode  : A_IDIV;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#135;
     flags   : if_8086
   ),
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#2#15#175#72;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_IMUL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#133;
     flags   : if_8086
   ),
   (
     opcode  : A_IMUL;
     ops     : 3;
-    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_immediate or ot_bits8 or ot_signed);
+    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_immediate or ot_bits8 or ot_signed,ot_none);
     code    : #208#1#107#72#14;
     flags   : if_286 or if_sm
   ),
   (
     opcode  : A_IMUL;
     ops     : 3;
-    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_immediate);
+    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_immediate,ot_none);
     code    : #208#1#105#72#34;
     flags   : if_286 or if_sm or if_sd or if_ar2
   ),
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#107#64#13;
     flags   : if_286
   ),
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg32,ot_immediate,ot_none);
+    optypes : (ot_reg32,ot_immediate,ot_none,ot_none);
     code    : #213#1#105#64#33;
     flags   : if_286 or if_sd
   ),
   (
     opcode  : A_IMUL;
     ops     : 3;
-    optypes : (ot_reg16,ot_rm_gpr,ot_immediate or ot_bits8 or ot_signed);
+    optypes : (ot_reg16,ot_rm_gpr,ot_immediate or ot_bits8 or ot_signed,ot_none);
     code    : #212#1#107#72#14;
     flags   : if_286 or if_sm
   ),
   (
     opcode  : A_IMUL;
     ops     : 3;
-    optypes : (ot_reg16,ot_rm_gpr,ot_immediate);
+    optypes : (ot_reg16,ot_rm_gpr,ot_immediate,ot_none);
     code    : #212#1#105#72#26;
     flags   : if_286 or if_sm or if_sw or if_ar2
   ),
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg16,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_reg16,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #212#1#107#64#13;
     flags   : if_286
   ),
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg16,ot_immediate,ot_none);
+    optypes : (ot_reg16,ot_immediate,ot_none,ot_none);
     code    : #212#1#105#64#25;
     flags   : if_286 or if_sw
   ),
   (
     opcode  : A_IMUL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#133;
     flags   : if_8086
   ),
   (
     opcode  : A_IN;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#228#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_IN;
     ops     : 2;
-    optypes : (ot_reg_ax or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_reg_ax or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #208#1#229#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_IN;
     ops     : 2;
-    optypes : (ot_reg_al,ot_reg_dx,ot_none);
+    optypes : (ot_reg_al,ot_reg_dx,ot_none,ot_none);
     code    : #1#236;
     flags   : if_8086
   ),
   (
     opcode  : A_IN;
     ops     : 2;
-    optypes : (ot_reg_ax or ot_bits32,ot_reg_dx,ot_none);
+    optypes : (ot_reg_ax or ot_bits32,ot_reg_dx,ot_none,ot_none);
     code    : #208#1#237;
     flags   : if_8086
   ),
   (
     opcode  : A_INC;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32,ot_none,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_none,ot_none,ot_none);
     code    : #208#8#64;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_INC;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#128;
     flags   : if_8086
   ),
   (
     opcode  : A_INC;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#254#128;
     flags   : if_8086
   ),
   (
     opcode  : A_INSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#108;
     flags   : if_186
   ),
   (
     opcode  : A_INSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#109;
     flags   : if_386
   ),
   (
     opcode  : A_INSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#109;
     flags   : if_186
   ),
   (
     opcode  : A_INT;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#205#20;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_INT01;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#241;
     flags   : if_386
   ),
   (
     opcode  : A_INT1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#241;
     flags   : if_386
   ),
   (
     opcode  : A_INT03;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#204;
     flags   : if_8086
   ),
   (
     opcode  : A_INT3;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#204;
     flags   : if_8086
   ),
   (
     opcode  : A_INTO;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#206;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_INVD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#8;
     flags   : if_486 or if_priv
   ),
   (
     opcode  : A_INVLPG;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#1#135;
     flags   : if_486 or if_priv
   ),
   (
     opcode  : A_IRET;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #215#1#207;
     flags   : if_8086
   ),
   (
     opcode  : A_IRETD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#207;
     flags   : if_386
   ),
   (
     opcode  : A_IRETW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#207;
     flags   : if_8086
   ),
   (
     opcode  : A_JCXZ;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #200#1#227#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_JECXZ;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #201#1#227#40;
     flags   : if_386
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits8,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#235#40;
     flags   : if_8086 or if_pass2
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits16 or ot_bits32,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits16 or ot_bits32,ot_none,ot_none,ot_none);
     code    : #208#1#233#52;
     flags   : if_8086 or if_pass2
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#132;
     flags   : if_8086
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_immediate or ot_short,ot_none,ot_none);
+    optypes : (ot_immediate or ot_short,ot_none,ot_none,ot_none);
     code    : #1#235#40;
     flags   : if_8086 or if_pass2
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_immediate or ot_near,ot_none,ot_none);
+    optypes : (ot_immediate or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#233#52;
     flags   : if_8086 or if_pass2
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_immediate or ot_far,ot_none,ot_none);
+    optypes : (ot_immediate or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#234#28#31;
     flags   : if_8086 or if_pass2 or if_nox86_64
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_memory or ot_near,ot_none,ot_none);
+    optypes : (ot_memory or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#255#132;
     flags   : if_8086
   ),
   (
     opcode  : A_JMP;
     ops     : 1;
-    optypes : (ot_memory or ot_far,ot_none,ot_none);
+    optypes : (ot_memory or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#255#133;
     flags   : if_8086
   ),
   (
     opcode  : A_JMP;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate,ot_none);
+    optypes : (ot_immediate,ot_immediate,ot_none,ot_none);
     code    : #215#1#234#29#24;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_JMP;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate or ot_bits16,ot_none);
+    optypes : (ot_immediate,ot_immediate or ot_bits16,ot_none,ot_none);
     code    : #212#1#234#25#24;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_JMP;
     ops     : 2;
-    optypes : (ot_immediate,ot_immediate or ot_bits32,ot_none);
+    optypes : (ot_immediate,ot_immediate or ot_bits32,ot_none,ot_none);
     code    : #213#1#234#33#24;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_LAHF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#159;
     flags   : if_8086
   ),
   (
     opcode  : A_LAR;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#2#15#2#72;
     flags   : if_286 or if_prot or if_sm
   ),
   (
     opcode  : A_LCALL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#130;
     flags   : if_8086
   ),
   (
     opcode  : A_LCALL;
     ops     : 1;
-    optypes : (ot_memory or ot_near,ot_none,ot_none);
+    optypes : (ot_memory or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#255#130;
     flags   : if_8086
   ),
   (
     opcode  : A_LCALL;
     ops     : 1;
-    optypes : (ot_memory or ot_far,ot_none,ot_none);
+    optypes : (ot_memory or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#255#131;
     flags   : if_8086
   ),
   (
     opcode  : A_LDS;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none,ot_none);
     code    : #208#1#197#72;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LEA;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #208#1#141#72;
     flags   : if_8086
   ),
   (
     opcode  : A_LEA;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#141#72;
     flags   : if_8086 or if_sd
   ),
   (
     opcode  : A_LEAVE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#201;
     flags   : if_186
   ),
   (
     opcode  : A_LES;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none,ot_none);
     code    : #208#1#196#72;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LFS;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none,ot_none);
     code    : #208#2#15#180#72;
     flags   : if_386
   ),
   (
     opcode  : A_LGDT;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#1#130;
     flags   : if_286 or if_priv
   ),
   (
     opcode  : A_LGS;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32,ot_memory,ot_none,ot_none);
     code    : #208#2#15#181#72;
     flags   : if_386
   ),
   (
     opcode  : A_LIDT;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#1#131;
     flags   : if_286 or if_priv
   ),
   (
     opcode  : A_LJMP;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#255#133;
     flags   : if_8086
   ),
   (
     opcode  : A_LJMP;
     ops     : 1;
-    optypes : (ot_memory or ot_far,ot_none,ot_none);
+    optypes : (ot_memory or ot_far,ot_none,ot_none,ot_none);
     code    : #208#1#255#133;
     flags   : if_8086
   ),
   (
     opcode  : A_LJMP;
     ops     : 1;
-    optypes : (ot_memory or ot_near,ot_none,ot_none);
+    optypes : (ot_memory or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#255#132;
     flags   : if_8086
   ),
   (
     opcode  : A_LLDT;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none,ot_none);
     code    : #2#15#0#130;
     flags   : if_286 or if_prot or if_priv
   ),
   (
     opcode  : A_LMSW;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none,ot_none);
     code    : #2#15#1#134;
     flags   : if_286 or if_priv
   ),
   (
     opcode  : A_LOADALL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#7;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_LOADALL286;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#5;
     flags   : if_286 or if_undoc
   ),
   (
     opcode  : A_LOCK;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#240;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_LODSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#172;
     flags   : if_8086
   ),
   (
     opcode  : A_LODSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#173;
     flags   : if_386
   ),
   (
     opcode  : A_LODSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#173;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOP;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #202#1#226#40;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOP;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_cx,ot_none);
+    optypes : (ot_immediate,ot_reg_cx,ot_none,ot_none);
     code    : #200#1#226#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LOOP;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none);
+    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none,ot_none);
     code    : #201#1#226#40;
     flags   : if_386
   ),
   (
     opcode  : A_LOOPE;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #202#1#225#40;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOPE;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_cx,ot_none);
+    optypes : (ot_immediate,ot_reg_cx,ot_none,ot_none);
     code    : #200#1#225#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LOOPE;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none);
+    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none,ot_none);
     code    : #201#1#225#40;
     flags   : if_386
   ),
   (
     opcode  : A_LOOPNE;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #202#1#224#40;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOPNE;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_cx,ot_none);
+    optypes : (ot_immediate,ot_reg_cx,ot_none,ot_none);
     code    : #200#1#224#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LOOPNE;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none);
+    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none,ot_none);
     code    : #201#1#224#40;
     flags   : if_386
   ),
   (
     opcode  : A_LOOPNZ;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #202#1#224#40;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOPNZ;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_cx,ot_none);
+    optypes : (ot_immediate,ot_reg_cx,ot_none,ot_none);
     code    : #200#1#224#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LOOPNZ;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none);
+    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none,ot_none);
     code    : #201#1#224#40;
     flags   : if_386
   ),
   (
     opcode  : A_LOOPZ;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #202#1#225#40;
     flags   : if_8086
   ),
   (
     opcode  : A_LOOPZ;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_cx,ot_none);
+    optypes : (ot_immediate,ot_reg_cx,ot_none,ot_none);
     code    : #200#1#225#40;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_LOOPZ;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none);
+    optypes : (ot_immediate,ot_reg_ecx or ot_bits64,ot_none,ot_none);
     code    : #201#1#225#40;
     flags   : if_386
   ),
   (
     opcode  : A_LSL;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#2#15#3#72;
     flags   : if_286 or if_prot or if_sm
   ),
   (
     opcode  : A_LSS;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #208#2#15#178#72;
     flags   : if_386
   ),
   (
     opcode  : A_LTR;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none,ot_none);
     code    : #2#15#0#131;
     flags   : if_286 or if_prot or if_priv
   ),
   (
     opcode  : A_MONITOR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#200;
     flags   : if_prescott
   ),
   (
     opcode  : A_MONITOR;
     ops     : 3;
-    optypes : (ot_reg_eax,ot_reg_ecx,ot_reg_edx);
+    optypes : (ot_reg_eax,ot_reg_ecx,ot_reg_edx,ot_none);
     code    : #3#15#1#200;
     flags   : if_prescott
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_mem_offs,ot_reg_ax,ot_none);
+    optypes : (ot_mem_offs,ot_reg_ax,ot_none,ot_none);
     code    : #212#1#163#36;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_mem_offs,ot_reg_eax,ot_none);
+    optypes : (ot_mem_offs,ot_reg_eax,ot_none,ot_none);
     code    : #213#1#163#36;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#137#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_mem_offs,ot_none);
+    optypes : (ot_reg_ax,ot_mem_offs,ot_none,ot_none);
     code    : #212#1#161#37;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_mem_offs,ot_none);
+    optypes : (ot_reg_eax,ot_mem_offs,ot_none,ot_none);
     code    : #213#1#161#37;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#139#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32,ot_immediate,ot_none);
+    optypes : (ot_reg32,ot_immediate,ot_none,ot_none);
     code    : #213#8#184#33;
     flags   : if_386 or if_sd
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#199#128#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg16,ot_immediate,ot_none);
+    optypes : (ot_reg16,ot_immediate,ot_none,ot_none);
     code    : #212#8#184#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#199#128#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_mem_offs,ot_reg_al,ot_none);
+    optypes : (ot_mem_offs,ot_reg_al,ot_none,ot_none);
     code    : #1#162#36;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#136#65;
     flags   : if_8086
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_al,ot_mem_offs,ot_none);
+    optypes : (ot_reg_al,ot_mem_offs,ot_none,ot_none);
     code    : #1#160#37;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#138#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg8,ot_immediate,ot_none);
+    optypes : (ot_reg8,ot_immediate,ot_none,ot_none);
     code    : #8#176#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#198#128#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_cs,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_cs,ot_none,ot_none);
     code    : #208#1#140#129;
     flags   : if_8086
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_dess,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_dess,ot_none,ot_none);
     code    : #208#1#140#65;
     flags   : if_8086
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_fsgs,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32,ot_reg_fsgs,ot_none,ot_none);
     code    : #208#1#140#65;
     flags   : if_386
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_dess,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none);
+    optypes : (ot_reg_dess,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none,ot_none);
     code    : #209#1#142#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_fsgs,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none);
+    optypes : (ot_reg_fsgs,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none,ot_none);
     code    : #209#1#142#72;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg_cr4,ot_none);
+    optypes : (ot_reg32,ot_reg_cr4,ot_none,ot_none);
     code    : #2#15#32#132;
     flags   : if_pent or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg_creg,ot_none);
+    optypes : (ot_reg32,ot_reg_creg,ot_none,ot_none);
     code    : #2#15#32#65;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg_dreg,ot_none);
+    optypes : (ot_reg32,ot_reg_dreg,ot_none,ot_none);
     code    : #2#15#33#65;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg_treg,ot_none);
+    optypes : (ot_reg32,ot_reg_treg,ot_none,ot_none);
     code    : #2#15#36#65;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_cr4,ot_reg32,ot_none);
+    optypes : (ot_reg_cr4,ot_reg32,ot_none,ot_none);
     code    : #2#15#34#140;
     flags   : if_pent or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_creg,ot_reg32,ot_none);
+    optypes : (ot_reg_creg,ot_reg32,ot_none,ot_none);
     code    : #2#15#34#72;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_dreg,ot_reg32,ot_none);
+    optypes : (ot_reg_dreg,ot_reg32,ot_none,ot_none);
     code    : #2#15#35#72;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg_treg,ot_reg32,ot_none);
+    optypes : (ot_reg_treg,ot_reg32,ot_none,ot_none);
     code    : #2#15#38#72;
     flags   : if_386 or if_priv or if_nox86_64
   ),
   (
     opcode  : A_MOVD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_rm_gpr or ot_bits32,ot_none);
+    optypes : (ot_mmxreg,ot_rm_gpr or ot_bits32,ot_none,ot_none);
     code    : #2#15#110#72;
     flags   : if_pent or if_mmx or if_sd
   ),
   (
     opcode  : A_MOVD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_mmxreg,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#126#65;
     flags   : if_pent or if_mmx or if_sd
   ),
   (
     opcode  : A_MOVD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_rm_gpr or ot_bits32,ot_none);
+    optypes : (ot_xmmreg,ot_rm_gpr or ot_bits32,ot_none,ot_none);
     code    : #241#2#15#110#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_xmmreg,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#126#65;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#111#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxrm,ot_mmxreg,ot_none);
+    optypes : (ot_mmxrm,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#127#65;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#126#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#214#65;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#164;
     flags   : if_8086
   ),
   (
     opcode  : A_MOVSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#165;
     flags   : if_386
   ),
   (
     opcode  : A_MOVSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#16#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVSD;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #220#2#15#17#65;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#165;
     flags   : if_8086
   ),
   (
     opcode  : A_MOVSX;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr or ot_bits16,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr or ot_bits16,ot_none,ot_none);
     code    : #208#2#15#191#72;
     flags   : if_386
   ),
   (
     opcode  : A_MOVSX;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #208#2#15#190#72;
     flags   : if_386
   ),
   (
     opcode  : A_MOVZX;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr or ot_bits16,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr or ot_bits16,ot_none,ot_none);
     code    : #208#2#15#183#72;
     flags   : if_386
   ),
   (
     opcode  : A_MOVZX;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #208#2#15#182#72;
     flags   : if_386
   ),
   (
     opcode  : A_MUL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#132;
     flags   : if_8086
   ),
   (
     opcode  : A_MUL;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#132;
     flags   : if_8086
   ),
   (
     opcode  : A_MWAIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#201;
     flags   : if_prescott
   ),
   (
     opcode  : A_MWAIT;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_reg_ecx,ot_none);
+    optypes : (ot_reg_eax,ot_reg_ecx,ot_none,ot_none);
     code    : #3#15#1#201;
     flags   : if_prescott
   ),
   (
     opcode  : A_NEG;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#131;
     flags   : if_8086
   ),
   (
     opcode  : A_NEG;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#131;
     flags   : if_8086
   ),
   (
     opcode  : A_NOP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#144;
     flags   : if_8086
   ),
   (
     opcode  : A_NOT;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#1#247#130;
     flags   : if_8086
   ),
   (
     opcode  : A_NOT;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#246#130;
     flags   : if_8086
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#9#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#11#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#8#65;
     flags   : if_8086
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#10#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#129#13;
     flags   : if_8086
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#13#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#129#129#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#13#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#129#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#12#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#129#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_al,ot_none);
+    optypes : (ot_immediate,ot_reg_al,ot_none,ot_none);
     code    : #1#230#20;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_ax,ot_none);
+    optypes : (ot_immediate,ot_reg_ax,ot_none,ot_none);
     code    : #212#1#231#20;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_immediate,ot_reg_eax,ot_none);
+    optypes : (ot_immediate,ot_reg_eax,ot_none,ot_none);
     code    : #213#1#231#20;
     flags   : if_386 or if_sb
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_reg_dx,ot_reg_al,ot_none);
+    optypes : (ot_reg_dx,ot_reg_al,ot_none,ot_none);
     code    : #1#238;
     flags   : if_8086
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_reg_dx,ot_reg_ax,ot_none);
+    optypes : (ot_reg_dx,ot_reg_ax,ot_none,ot_none);
     code    : #212#1#239;
     flags   : if_8086
   ),
   (
     opcode  : A_OUT;
     ops     : 2;
-    optypes : (ot_reg_dx,ot_reg_eax,ot_none);
+    optypes : (ot_reg_dx,ot_reg_eax,ot_none,ot_none);
     code    : #213#1#239;
     flags   : if_386
   ),
   (
     opcode  : A_OUTSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#110;
     flags   : if_186
   ),
   (
     opcode  : A_OUTSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#111;
     flags   : if_386
   ),
   (
     opcode  : A_OUTSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#111;
     flags   : if_186
   ),
   (
     opcode  : A_PACKSSDW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#107#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PACKSSDW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#107#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PACKSSWB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#99#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PACKSSWB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#99#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PACKUSWB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#103#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PACKUSWB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#103#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#252#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#252#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#254#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#254#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#236#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#236#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDSIW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#81#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PADDSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#237#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#237#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDUSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#220#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDUSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#220#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDUSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#221#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDUSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#221#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#253#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PADDW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#253#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PAND;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#219#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PAND;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#219#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PANDN;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#223#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PANDN;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#223#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PAVEB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#80#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PAVGUSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#191;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PCMPEQB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#116#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPEQB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#116#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PCMPEQD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#118#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPEQD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#118#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PCMPEQW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#117#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPEQW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#117#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PCMPGTB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#100#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPGTB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#100#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PCMPGTD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#102#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPGTD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#102#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PCMPGTW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#101#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PCMPGTW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#101#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PDISTIB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#84#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PF2ID;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#29;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#174;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFADD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#158;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFCMPEQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#176;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFCMPGE;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#144;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFCMPGT;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#160;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFMAX;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#164;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFMIN;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#148;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFMUL;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#180;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFRCP;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#150;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFRCPIT1;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#166;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFRCPIT2;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#182;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFRSQIT1;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#167;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFRSQRT;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#151;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFSUB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#154;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFSUBR;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#170;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PI2FD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#13;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PMACHRIW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#94#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMADDWD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#245#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PMADDWD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#245#72;
     flags   : if_willamette or if_sm or if_sse2
   ),
   (
     opcode  : A_PMAGW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#82#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMULHRIW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#93#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMULHRWA;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#183;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PMULHRWC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#89#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMULHW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#229#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PMULHW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#229#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMULLW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#213#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PMULLW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#213#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMVGEZB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#92#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMVLZB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#91#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMVNZB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#90#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PMVZB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#88#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg16,ot_none,ot_none);
+    optypes : (ot_reg16,ot_none,ot_none,ot_none);
     code    : #212#8#88;
     flags   : if_8086
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg32,ot_none,ot_none);
+    optypes : (ot_reg32,ot_none,ot_none,ot_none);
     code    : #213#8#88;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none,ot_none);
     code    : #212#1#143#128;
     flags   : if_8086
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits32,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_none,ot_none,ot_none);
     code    : #213#1#143#128;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg_cs,ot_none,ot_none);
+    optypes : (ot_reg_cs,ot_none,ot_none,ot_none);
     code    : #1#15;
     flags   : if_8086 or if_undoc
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg_dess,ot_none,ot_none);
+    optypes : (ot_reg_dess,ot_none,ot_none,ot_none);
     code    : #4;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg_fsgs,ot_none,ot_none);
+    optypes : (ot_reg_fsgs,ot_none,ot_none,ot_none);
     code    : #1#15#5#221;
     flags   : if_386
   ),
   (
     opcode  : A_POPA;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #215#1#97;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_POPAD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#97;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_POPAW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#97;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_POPF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #215#1#157;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_POPFD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#157;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_POPFW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#157;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_POR;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#235#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_POR;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#235#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PREFETCH;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#13#128;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PREFETCHW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#13#129;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PSLLD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#242#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSLLD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#114#134#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#242#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSLLD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#114#134#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#115#135#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#243#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSLLQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#115#134#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#243#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSLLQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#115#134#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#241#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSLLW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#113#134#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSLLW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#241#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSLLW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#113#134#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRAD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#226#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSRAD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#114#132#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRAD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#226#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSRAD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#114#132#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRAW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#225#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSRAW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#113#132#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRAW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#225#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSRAW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#113#132#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#210#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSRLD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#114#130#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#210#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSRLD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#114#130#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#211#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSRLQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#115#130#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#211#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSRLQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#115#130#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#209#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSRLW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_immediate,ot_none);
+    optypes : (ot_mmxreg,ot_immediate,ot_none,ot_none);
     code    : #2#15#113#130#21;
     flags   : if_pent or if_mmx or if_sb or if_ar1
   ),
   (
     opcode  : A_PSRLW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#209#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSRLW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#113#130#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSUBB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#248#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#248#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#250#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#250#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#232#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#232#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBSIW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #2#15#85#72;
     flags   : if_pent or if_mmx or if_sm or if_cyrix
   ),
   (
     opcode  : A_PSUBSIW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#85#72;
     flags   : if_pent or if_mmx or if_cyrix
   ),
   (
     opcode  : A_PSUBSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#233#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#233#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBUSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#216#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBUSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#216#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBUSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#217#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBUSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#217#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#249#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PSUBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#249#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKHBW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#104#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKHBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#104#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKHDQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#106#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKHDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#106#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKHWD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#105#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKHWD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#105#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKLBW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#96#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKLBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#96#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKLDQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#98#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKLDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#98#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKLWD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#97#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PUNPCKLWD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#97#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg16,ot_none,ot_none);
+    optypes : (ot_reg16,ot_none,ot_none,ot_none);
     code    : #212#8#80;
     flags   : if_8086
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg32,ot_none,ot_none);
+    optypes : (ot_reg32,ot_none,ot_none,ot_none);
     code    : #213#8#80;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_none,ot_none,ot_none);
     code    : #212#1#255#134;
     flags   : if_8086
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits32,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_none,ot_none,ot_none);
     code    : #213#1#255#134;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits32,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits32,ot_none,ot_none,ot_none);
     code    : #213#1#104#32#221;
     flags   : if_386
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits16,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits16,ot_none,ot_none,ot_none);
     code    : #212#1#104#24#221;
     flags   : if_286
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none,ot_none);
     code    : #1#106#12#221;
     flags   : if_286
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg_fsgs,ot_none,ot_none);
+    optypes : (ot_reg_fsgs,ot_none,ot_none,ot_none);
     code    : #1#15#7#221;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg_sreg,ot_none,ot_none);
+    optypes : (ot_reg_sreg,ot_none,ot_none,ot_none);
     code    : #6;
     flags   : if_8086 or if_nox86_64
   ),
   (
     opcode  : A_PUSHA;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #215#1#96;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_PUSHAD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#96;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_PUSHAW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#96;
     flags   : if_186 or if_nox86_64
   ),
   (
     opcode  : A_PUSHF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #215#1#156;
     flags   : if_186
   ),
   (
     opcode  : A_PUSHFD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#156;
     flags   : if_386 or if_nox86_64
   ),
   (
     opcode  : A_PUSHFW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#156;
     flags   : if_186
   ),
   (
     opcode  : A_PXOR;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#239#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_PXOR;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#239#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#130;
     flags   : if_8086
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#130;
     flags   : if_8086
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#130#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#130;
     flags   : if_8086
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#130;
     flags   : if_8086
   ),
   (
     opcode  : A_RCL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#130#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#131;
     flags   : if_8086
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#131;
     flags   : if_8086
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#131#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#131;
     flags   : if_8086
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#131;
     flags   : if_8086
   ),
   (
     opcode  : A_RCR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#131#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_RDSHR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#54;
     flags   : if_p6 or if_cyrix or if_smm
   ),
   (
     opcode  : A_RDMSR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#50;
     flags   : if_pent or if_priv
   ),
   (
     opcode  : A_RDPMC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#51;
     flags   : if_p6
   ),
   (
     opcode  : A_RDTSC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#49;
     flags   : if_pent
   ),
   (
     opcode  : A_REP;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#243;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_REPE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#243;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_REPNE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#242;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_REPNZ;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#242;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_REPZ;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#243;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_RET;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#195;
     flags   : if_8086
   ),
   (
     opcode  : A_RET;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#194#24;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_RETF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#203;
     flags   : if_8086
   ),
   (
     opcode  : A_RETF;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#202#24;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_RETN;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#195;
     flags   : if_8086
   ),
   (
     opcode  : A_RETN;
     ops     : 1;
-    optypes : (ot_immediate,ot_none,ot_none);
+    optypes : (ot_immediate,ot_none,ot_none,ot_none);
     code    : #1#194#24;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#128;
     flags   : if_8086
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#128;
     flags   : if_8086
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#128#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#128;
     flags   : if_8086
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#128;
     flags   : if_8086
   ),
   (
     opcode  : A_ROL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#128#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#129;
     flags   : if_8086
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#129;
     flags   : if_8086
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#129#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#129;
     flags   : if_8086
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#129;
     flags   : if_8086
   ),
   (
     opcode  : A_ROR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#129#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_RSDC;
     ops     : 2;
-    optypes : (ot_reg_sreg,ot_memory or ot_bits80,ot_none);
+    optypes : (ot_reg_sreg,ot_memory or ot_bits80,ot_none,ot_none);
     code    : #2#15#121#65;
     flags   : if_486 or if_cyrix or if_smm
   ),
   (
     opcode  : A_RSLDT;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #2#15#123#128;
     flags   : if_486 or if_cyrix or if_smm
   ),
   (
     opcode  : A_RSM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#170;
     flags   : if_pent or if_smm
   ),
   (
     opcode  : A_SAHF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#158;
     flags   : if_8086
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#132#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SAL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#132#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_SALC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#214;
     flags   : if_8086 or if_undoc or if_nox86_64
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#135;
     flags   : if_8086
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#135;
     flags   : if_8086
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#135#21;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#135;
     flags   : if_8086
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#135;
     flags   : if_8086
   ),
   (
     opcode  : A_SAR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#135#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#25#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#27#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#131#13;
     flags   : if_8086
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#24#65;
     flags   : if_8086
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#26#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#29#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #208#1#129#131#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#29#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #208#1#129#131#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#28#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#131#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SCASB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#1#174;
     flags   : if_8086
   ),
   (
     opcode  : A_SCASD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#213#1#175;
     flags   : if_386
   ),
   (
     opcode  : A_SCASW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #218#212#1#175;
     flags   : if_8086
   ),
   (
     opcode  : A_SEGCS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#46;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SEGDS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#62;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SEGES;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#38;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SEGFS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#100;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SEGGS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#101;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SEGSS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#54;
     flags   : if_8086 or if_pre
   ),
   (
     opcode  : A_SGDT;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#1#128;
     flags   : if_286
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#132#21;
     flags   : if_186 or if_sw
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#132;
     flags   : if_8086
   ),
   (
     opcode  : A_SHL;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#132#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_SHLD;
     ops     : 3;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_immediate);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
     code    : #209#2#15#164#65#22;
     flags   : if_386 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_SHLD;
     ops     : 3;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_reg_cl);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
     code    : #209#2#15#165#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_unity,ot_none,ot_none);
     code    : #208#1#209#133;
     flags   : if_8086
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none,ot_none);
     code    : #208#1#211#133;
     flags   : if_8086
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate,ot_none,ot_none);
     code    : #208#1#193#133#21;
     flags   : if_186 or if_sw
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_unity,ot_none,ot_none);
     code    : #1#208#133;
     flags   : if_8086
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg_cl,ot_none,ot_none);
     code    : #1#210#133;
     flags   : if_8086
   ),
   (
     opcode  : A_SHR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#192#133#21;
     flags   : if_186 or if_sb
   ),
   (
     opcode  : A_SHRD;
     ops     : 3;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_immediate);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_immediate,ot_none);
     code    : #209#2#15#172#65#22;
     flags   : if_386 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_SHRD;
     ops     : 3;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_reg_cl);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_reg_cl,ot_none);
     code    : #209#2#15#173#65;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SIDT;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#1#129;
     flags   : if_286
   ),
   (
     opcode  : A_SLDT;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#0#128;
     flags   : if_286
   ),
   (
     opcode  : A_SLDT;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#2#15#0#128;
     flags   : if_286
   ),
   (
     opcode  : A_SMI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#241;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_SMINT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#56;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_SMINTOLD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#126;
     flags   : if_486 or if_cyrix
   ),
   (
     opcode  : A_SMSW;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#2#15#1#132;
     flags   : if_286
   ),
   (
     opcode  : A_STC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#249;
     flags   : if_8086
   ),
   (
     opcode  : A_STD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#253;
     flags   : if_8086
   ),
   (
     opcode  : A_STI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#251;
     flags   : if_8086
   ),
   (
     opcode  : A_STOSB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#170;
     flags   : if_8086
   ),
   (
     opcode  : A_STOSD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #213#1#171;
     flags   : if_386
   ),
   (
     opcode  : A_STOSW;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #212#1#171;
     flags   : if_8086
   ),
   (
     opcode  : A_STR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_STR;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none,ot_none);
     code    : #208#2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#41#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#43#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#40#65;
     flags   : if_8086
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#42#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#133#13;
     flags   : if_8086
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#45#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #208#1#129#133#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#45#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#133#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#44#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#133#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_SVDC;
     ops     : 2;
-    optypes : (ot_memory or ot_bits80,ot_reg_sreg,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_reg_sreg,ot_none,ot_none);
     code    : #2#15#120#65;
     flags   : if_486 or if_cyrix or if_smm
   ),
   (
     opcode  : A_SVLDT;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #2#15#122#128;
     flags   : if_486 or if_cyrix or if_smm
   ),
   (
     opcode  : A_SVTS;
     ops     : 1;
-    optypes : (ot_memory or ot_bits80,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits80,ot_none,ot_none,ot_none);
     code    : #2#15#124#128;
     flags   : if_486 or if_cyrix or if_smm
   ),
   (
     opcode  : A_SYSCALL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#5;
     flags   : if_p6 or if_amd
   ),
   (
     opcode  : A_SYSENTER;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#52;
     flags   : if_p6
   ),
   (
     opcode  : A_SYSEXIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#53;
     flags   : if_p6 or if_priv
   ),
   (
     opcode  : A_SYSRET;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#7;
     flags   : if_p6 or if_priv or if_amd
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#133#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #208#1#133#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_reg8,ot_reg8,ot_none);
+    optypes : (ot_reg8,ot_reg8,ot_none,ot_none);
     code    : #1#132#65;
     flags   : if_8086
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#132#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#169#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#169#25;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#168#17;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #213#1#247#128#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#247#128#25;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#246#128#17;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits32,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits32,ot_none,ot_none);
     code    : #213#1#247#128#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits16,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits16,ot_none,ot_none);
     code    : #212#1#247#128#25;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_TEST;
     ops     : 2;
-    optypes : (ot_memory,ot_immediate or ot_bits8,ot_none);
+    optypes : (ot_memory,ot_immediate or ot_bits8,ot_none,ot_none);
     code    : #1#246#128#17;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_UD1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#185;
     flags   : if_286 or if_undoc
   ),
   (
     opcode  : A_UD2;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#11;
     flags   : if_286
   ),
   (
     opcode  : A_UMOV;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#17#65;
     flags   : if_386 or if_undoc or if_sm
   ),
   (
     opcode  : A_UMOV;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #208#2#15#19#72;
     flags   : if_386 or if_undoc or if_sm
   ),
   (
     opcode  : A_UMOV;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #2#15#16#65;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_UMOV;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #2#15#18#72;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
-    optypes : (ot_reg16,ot_none,ot_none);
+    optypes : (ot_reg16,ot_none,ot_none,ot_none);
     code    : #2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
-    optypes : (ot_memory or ot_bits16,ot_none,ot_none);
+    optypes : (ot_memory or ot_bits16,ot_none,ot_none,ot_none);
     code    : #2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
-    optypes : (ot_reg16,ot_none,ot_none);
+    optypes : (ot_reg16,ot_none,ot_none,ot_none);
     code    : #2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_WAIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#155;
     flags   : if_8086
   ),
   (
     opcode  : A_WBINVD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#9;
     flags   : if_486 or if_priv
   ),
   (
     opcode  : A_WRSHR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#55;
     flags   : if_p6 or if_cyrix or if_smm
   ),
   (
     opcode  : A_WRMSR;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#48;
     flags   : if_pent or if_priv
   ),
   (
     opcode  : A_XADD;
     ops     : 2;
-    optypes : (ot_memory,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_memory,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#193#65;
     flags   : if_486 or if_sm
   ),
   (
     opcode  : A_XADD;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #2#15#192#65;
     flags   : if_486
   ),
   (
     opcode  : A_XBTS;
     ops     : 2;
-    optypes : (ot_reg16,ot_memory,ot_none);
+    optypes : (ot_reg16,ot_memory,ot_none,ot_none);
     code    : #212#2#15#166#72;
     flags   : if_386 or if_sw or if_undoc
   ),
   (
     opcode  : A_XBTS;
     ops     : 2;
-    optypes : (ot_reg16,ot_reg16,ot_none);
+    optypes : (ot_reg16,ot_reg16,ot_none,ot_none);
     code    : #212#2#15#166#72;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_XBTS;
     ops     : 2;
-    optypes : (ot_reg32,ot_memory,ot_none);
+    optypes : (ot_reg32,ot_memory,ot_none,ot_none);
     code    : #213#2#15#166#72;
     flags   : if_386 or if_sd or if_undoc
   ),
   (
     opcode  : A_XBTS;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg32,ot_none);
+    optypes : (ot_reg32,ot_reg32,ot_none,ot_none);
     code    : #213#2#15#166#72;
     flags   : if_386 or if_undoc
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_reg16,ot_none);
+    optypes : (ot_reg_ax,ot_reg16,ot_none,ot_none);
     code    : #212#9#144;
     flags   : if_8086
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_reg32,ot_none);
+    optypes : (ot_reg_eax,ot_reg32,ot_none,ot_none);
     code    : #213#9#144;
     flags   : if_386
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg16,ot_reg_ax,ot_none);
+    optypes : (ot_reg16,ot_reg_ax,ot_none,ot_none);
     code    : #212#8#144;
     flags   : if_8086
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg_eax,ot_none);
+    optypes : (ot_reg32,ot_reg_eax,ot_none,ot_none);
     code    : #213#8#144;
     flags   : if_386
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#135#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_memory,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_memory,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#135#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#134#72;
     flags   : if_8086
   ),
   (
     opcode  : A_XCHG;
     ops     : 2;
-    optypes : (ot_memory or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_memory or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#134#65;
     flags   : if_8086
   ),
   (
     opcode  : A_XLAT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#215;
     flags   : if_8086
   ),
   (
     opcode  : A_XLATB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #1#215;
     flags   : if_8086
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none);
+    optypes : (ot_rm_gpr,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
     code    : #208#1#49#65;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#51#72;
     flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_reg8,ot_none,ot_none);
     code    : #1#48#65;
     flags   : if_8086
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg8,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #1#50#72;
     flags   : if_8086
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16 or ot_bits32 or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
     code    : #208#1#131#134#13;
     flags   : if_8086
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none,ot_none);
     code    : #213#1#53#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
     code    : #208#1#129#134#33;
     flags   : if_386 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg_ax,ot_immediate,ot_none);
+    optypes : (ot_reg_ax,ot_immediate,ot_none,ot_none);
     code    : #212#1#53#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits16,ot_immediate,ot_none,ot_none);
     code    : #212#1#129#134#25;
     flags   : if_8086 or if_sw
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg_al,ot_immediate,ot_none);
+    optypes : (ot_reg_al,ot_immediate,ot_none,ot_none);
     code    : #1#52#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_immediate,ot_none,ot_none);
     code    : #1#128#134#17;
     flags   : if_8086 or if_sb
   ),
   (
     opcode  : A_XSTORE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#167#192;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_XCRYPTECB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#167#200;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_XCRYPTCBC;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#167#208;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_XCRYPTCFB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#167#224;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_XCRYPTOFB;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#167#232;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_CMOVcc;
     ops     : 2;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #208#1#15#11#64#72;
     flags   : if_p6 or if_sm
   ),
   (
     opcode  : A_Jcc;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits8,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits8,ot_none,ot_none,ot_none);
     code    : #11#112#40;
     flags   : if_8086
   ),
   (
     opcode  : A_Jcc;
     ops     : 1;
-    optypes : (ot_immediate or ot_bits16 or ot_bits32,ot_none,ot_none);
+    optypes : (ot_immediate or ot_bits16 or ot_bits32,ot_none,ot_none,ot_none);
     code    : #208#1#15#11#128#52;
     flags   : if_386 or if_pass2
   ),
   (
     opcode  : A_Jcc;
     ops     : 1;
-    optypes : (ot_immediate or ot_short,ot_none,ot_none);
+    optypes : (ot_immediate or ot_short,ot_none,ot_none,ot_none);
     code    : #11#112#40;
     flags   : if_8086
   ),
   (
     opcode  : A_Jcc;
     ops     : 1;
-    optypes : (ot_immediate or ot_near,ot_none,ot_none);
+    optypes : (ot_immediate or ot_near,ot_none,ot_none,ot_none);
     code    : #208#1#15#11#128#52;
     flags   : if_386 or if_pass2
   ),
   (
     opcode  : A_SETcc;
     ops     : 1;
-    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none);
+    optypes : (ot_rm_gpr or ot_bits8,ot_none,ot_none,ot_none);
     code    : #1#15#11#144#128;
     flags   : if_386
   ),
   (
     opcode  : A_ADDPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#88#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_ADDSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#88#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_ANDNPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#85#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_ANDPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#84#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPEQPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#0;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPEQSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#0;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPLEPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#2;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPLESS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#2;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPLTPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#1;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPLTSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#1;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNEQPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#4;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNEQSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#4;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNLEPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#6;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNLESS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#6;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNLTPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#5;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPNLTSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#5;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPORDPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#7;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPORDSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#7;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPUNORDPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#194#72#1#3;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPUNORDSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#194#72#1#3;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CMPPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #217#2#15#194#72#18;
     flags   : if_katmai or if_sse or if_sb or if_ar2
   ),
   (
     opcode  : A_CMPSS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #219#2#15#194#72#18;
     flags   : if_katmai or if_sse or if_sb or if_ar2
   ),
   (
     opcode  : A_COMISS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#47#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTPI2PS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #217#2#15#42#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTPI2PS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_mmxreg,ot_none);
+    optypes : (ot_xmmreg,ot_mmxreg,ot_none,ot_none);
     code    : #217#2#15#42#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTPS2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #217#2#15#45#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTPS2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_xmmreg,ot_none);
+    optypes : (ot_mmxreg,ot_xmmreg,ot_none,ot_none);
     code    : #217#2#15#45#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTSI2SS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #219#209#2#15#42#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTSI2SS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_none);
+    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_none,ot_none);
     code    : #219#209#2#15#42#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTSS2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #219#208#2#15#45#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTSS2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none,ot_none);
     code    : #219#208#2#15#45#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTTPS2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #217#2#15#44#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTTPS2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_xmmreg,ot_none);
+    optypes : (ot_mmxreg,ot_xmmreg,ot_none,ot_none);
     code    : #217#2#15#44#72;
     flags   : if_katmai or if_sse or if_mmx
   ),
   (
     opcode  : A_CVTTSS2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #219#208#2#15#44#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_CVTTSS2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none,ot_none);
     code    : #219#208#2#15#44#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_DIVPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#94#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_DIVSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#94#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_LDMXCSR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#174#130;
     flags   : if_katmai or if_sse or if_sd
   ),
   (
     opcode  : A_MAXPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#95#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MAXSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#95#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MINPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#93#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MINSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#93#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVAPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#40#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVAPS;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#41#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVHPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #2#15#22#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVHPS;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#23#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVLHPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#22#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVLPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #2#15#18#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVLPS;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#19#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVHLPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#18#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVMSKPS;
     ops     : 2;
-    optypes : (ot_reg32,ot_xmmreg,ot_none);
+    optypes : (ot_reg32,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#80#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVNTPS;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #2#15#43#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#16#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVSS;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #219#2#15#17#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVUPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#16#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MOVUPS;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #217#2#15#17#65;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MULPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#89#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_MULSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#89#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_ORPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#86#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_RCPPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#83#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_RCPSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#83#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_RSQRTPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#82#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_RSQRTSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#82#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_SHUFPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #2#15#198#72#18;
     flags   : if_katmai or if_sse or if_sb or if_ar2
   ),
   (
     opcode  : A_SQRTPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#81#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_SQRTSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#81#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_STMXCSR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#174#131;
     flags   : if_katmai or if_sse or if_sd
   ),
   (
     opcode  : A_SUBPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #217#2#15#92#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_SUBSS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#92#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_UCOMISS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#46#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_UNPCKHPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#21#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_UNPCKLPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#20#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_XORPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#87#72;
     flags   : if_katmai or if_sse
   ),
   (
     opcode  : A_FXRSTOR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#174#129;
     flags   : if_p6 or if_sse or if_fpu
   ),
   (
     opcode  : A_FXSAVE;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#174#128;
     flags   : if_p6 or if_sse or if_fpu
   ),
   (
     opcode  : A_PREFETCHNTA;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#24#128;
     flags   : if_katmai
   ),
   (
     opcode  : A_PREFETCHT0;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#24#129;
     flags   : if_katmai
   ),
   (
     opcode  : A_PREFETCHT1;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#24#130;
     flags   : if_katmai
   ),
   (
     opcode  : A_PREFETCHT2;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#24#131;
     flags   : if_katmai
   ),
   (
     opcode  : A_SFENCE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#174#248;
     flags   : if_katmai
   ),
   (
     opcode  : A_MASKMOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#247#72;
     flags   : if_katmai or if_mmx
   ),
   (
     opcode  : A_MOVNTQ;
     ops     : 2;
-    optypes : (ot_memory,ot_mmxreg,ot_none);
+    optypes : (ot_memory,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#231#65;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PAVGB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#224#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PAVGB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#224#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PAVGW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#227#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PAVGW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#227#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PEXTRW;
     ops     : 3;
-    optypes : (ot_reg32,ot_mmxreg,ot_immediate);
+    optypes : (ot_reg32,ot_mmxreg,ot_immediate,ot_none);
     code    : #2#15#197#72#18;
     flags   : if_katmai or if_mmx or if_sb or if_ar2
   ),
   (
     opcode  : A_PEXTRW;
     ops     : 3;
-    optypes : (ot_reg32,ot_xmmreg,ot_immediate);
+    optypes : (ot_reg32,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#2#15#197#72#22;
     flags   : if_sse41
   ),
   (
     opcode  : A_PEXTRW;
     ops     : 3;
-    optypes : (ot_memory or ot_bits32,ot_xmmreg,ot_immediate);
+    optypes : (ot_memory or ot_bits32,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#21#65#22;
     flags   : if_sse41
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_reg16,ot_immediate);
+    optypes : (ot_mmxreg,ot_reg16,ot_immediate,ot_none);
     code    : #2#15#196#72#18;
     flags   : if_katmai or if_mmx or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_reg32,ot_immediate);
+    optypes : (ot_mmxreg,ot_reg32,ot_immediate,ot_none);
     code    : #2#15#196#72#18;
     flags   : if_katmai or if_mmx or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_memory,ot_immediate);
+    optypes : (ot_mmxreg,ot_memory,ot_immediate,ot_none);
     code    : #2#15#196#72#18;
     flags   : if_katmai or if_mmx or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_memory or ot_bits16,ot_immediate);
+    optypes : (ot_mmxreg,ot_memory or ot_bits16,ot_immediate,ot_none);
     code    : #2#15#196#72#18;
     flags   : if_katmai or if_mmx or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_reg16,ot_immediate);
+    optypes : (ot_xmmreg,ot_reg16,ot_immediate,ot_none);
     code    : #241#2#15#196#72#22;
     flags   : if_willamette or if_sse2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_reg32,ot_immediate);
+    optypes : (ot_xmmreg,ot_reg32,ot_immediate,ot_none);
     code    : #241#2#15#196#72#22;
     flags   : if_willamette or if_sse2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory,ot_immediate,ot_none);
     code    : #241#2#15#196#72#22;
     flags   : if_willamette or if_sse2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory or ot_bits16,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory or ot_bits16,ot_immediate,ot_none);
     code    : #241#2#15#196#72#22;
     flags   : if_willamette or if_sse2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PMAXSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#238#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PMAXSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#238#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMAXUB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#222#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PMAXUB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#222#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMINSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#234#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PMINSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#234#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMINUB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#218#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PMINUB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#218#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMOVMSKB;
     ops     : 2;
-    optypes : (ot_reg32,ot_mmxreg,ot_none);
+    optypes : (ot_reg32,ot_mmxreg,ot_none,ot_none);
     code    : #2#15#215#72;
     flags   : if_katmai or if_mmx
   ),
   (
     opcode  : A_PMOVMSKB;
     ops     : 2;
-    optypes : (ot_reg32,ot_xmmreg,ot_none);
+    optypes : (ot_reg32,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#215#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_PMULHUW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#228#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PMULHUW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#228#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSADBW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#246#72;
     flags   : if_katmai or if_mmx or if_sm
   ),
   (
     opcode  : A_PSADBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#246#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSHUFW;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_immediate);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_immediate,ot_none);
     code    : #2#15#112#72#18;
     flags   : if_katmai or if_mmx or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PFNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#138;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFPNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#142;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PI2FW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#12;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PF2IW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#28;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PSWAPD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#15#72#1#187;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_FFREEP;
     ops     : 1;
-    optypes : (ot_fpureg,ot_none,ot_none);
+    optypes : (ot_fpureg,ot_none,ot_none,ot_none);
     code    : #1#223#8#192;
     flags   : if_pent or if_3dnow or if_fpu
   ),
   (
     opcode  : A_MASKMOVDQU;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#247#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CLFLUSH;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#174#135;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVNTDQ;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#231#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVNTI;
     ops     : 2;
-    optypes : (ot_memory,ot_reg32 or ot_bits64,ot_none);
+    optypes : (ot_memory,ot_reg32 or ot_bits64,ot_none,ot_none);
     code    : #208#2#15#195#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVNTPD;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#43#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PAUSE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#1#144;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_LFENCE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#174#232;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MFENCE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#174#240;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVDQA;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#127#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVDQA;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#111#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVDQU;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #219#2#15#127#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVDQU;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#111#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVDQ2Q;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_xmmreg,ot_none);
+    optypes : (ot_mmxreg,ot_xmmreg,ot_none,ot_none);
     code    : #220#2#15#214#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVQ2DQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_mmxreg,ot_none);
+    optypes : (ot_xmmreg,ot_mmxreg,ot_none,ot_none);
     code    : #219#2#15#214#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_PADDQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#212#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PADDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#212#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMULUDQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#244#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PMULUDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#244#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSHUFD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#2#15#112#72#18;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PSHUFHW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #219#2#15#112#72#18;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PSHUFLW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #220#2#15#112#72#18;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PSRLDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_immediate,ot_none);
+    optypes : (ot_xmmreg,ot_immediate,ot_none,ot_none);
     code    : #241#2#15#115#131#21;
     flags   : if_willamette or if_sse2 or if_sb or if_ar1
   ),
   (
     opcode  : A_PSUBQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #2#15#251#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PSUBQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#251#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKHQDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#109#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_PUNPCKLQDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#108#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_ADDPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#88#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_ADDSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#88#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_ANDNPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#85#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_ANDPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#84#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPEQPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#0;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPEQSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#0;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPLEPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#2;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPLESD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#2;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPLTPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#1;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPLTSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#1;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPNEQPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#4;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPNEQSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#4;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPNLEPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#6;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPNLESD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#6;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPNLTPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#5;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPNLTSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#5;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPORDPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#7;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPORDSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#7;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPUNORDPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#194#72#1#3;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CMPUNORDSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#194#72#1#3;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CMPPD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#2#15#194#72#22;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_COMISD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#47#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTDQ2PD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#230#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTDQ2PS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#91#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTPD2DQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#230#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTPD2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_xmmrm,ot_none);
+    optypes : (ot_mmxreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#45#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTPD2PS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#90#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTPI2PD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_mmxrm,ot_none);
+    optypes : (ot_xmmreg,ot_mmxrm,ot_none,ot_none);
     code    : #241#2#15#42#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTPS2DQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#91#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTPS2PD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #2#15#90#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSD2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none,ot_none);
     code    : #220#208#2#15#45#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSD2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #220#208#2#15#45#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSD2SS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#90#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSI2SD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_none);
+    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_none,ot_none);
     code    : #220#209#2#15#42#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSI2SD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #220#209#2#15#42#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTSS2SD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#90#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTTPD2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_xmmreg,ot_none);
+    optypes : (ot_mmxreg,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#44#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTTPD2PI;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_memory,ot_none,ot_none);
     code    : #241#2#15#44#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTTPD2DQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#230#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTTPS2DQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#91#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_CVTTSD2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_none,ot_none);
     code    : #220#208#2#15#44#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_CVTTSD2SI;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_memory,ot_none,ot_none);
     code    : #220#208#2#15#44#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_DIVPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#94#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_DIVSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#94#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MAXPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#95#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MAXSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#95#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MINPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#93#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MINSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#93#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVAPD;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#41#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVAPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#40#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVHPD;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#23#65;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVHPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #241#2#15#22#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVLPD;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#19#65;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVLPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #241#2#15#18#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVMSKPD;
     ops     : 2;
-    optypes : (ot_reg32,ot_xmmreg,ot_none);
+    optypes : (ot_reg32,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#80#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVUPD;
     ops     : 2;
-    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#17#65;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MOVUPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#16#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MULPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#89#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_MULSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#89#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_ORPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#86#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_SHUFPD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#2#15#198#72#22;
     flags   : if_willamette or if_sse2 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_SQRTPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#81#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_SQRTSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#81#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_SUBPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#92#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_SUBSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#92#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_UCOMISD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#46#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_UNPCKHPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#21#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_UNPCKLPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#20#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_XORPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#87#72;
     flags   : if_willamette or if_sse2 or if_sm
   ),
   (
     opcode  : A_ADDSUBPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#208#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_ADDSUBPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#208#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_HADDPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#124#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_HADDPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#124#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_HSUBPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#2#15#125#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_HSUBPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#125#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_LDDQU;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #220#2#15#240#72;
     flags   : if_prescott or if_sse3
   ),
   (
     opcode  : A_MOVDDUP;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #220#2#15#18#72;
     flags   : if_prescott or if_sse3
   ),
   (
     opcode  : A_MOVSHDUP;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#22#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_MOVSLDUP;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #219#2#15#18#72;
     flags   : if_prescott or if_sse3 or if_sm
   ),
   (
     opcode  : A_VMREAD;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg32,ot_none);
+    optypes : (ot_reg32,ot_reg32,ot_none,ot_none);
     code    : #2#15#120#65;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMREAD;
     ops     : 2;
-    optypes : (ot_memory,ot_reg32,ot_none);
+    optypes : (ot_memory,ot_reg32,ot_none,ot_none);
     code    : #2#15#120#65;
     flags   : if_386 or if_priv or if_prot or if_sm
   ),
   (
     opcode  : A_VMWRITE;
     ops     : 2;
-    optypes : (ot_reg32,ot_reg32,ot_none);
+    optypes : (ot_reg32,ot_reg32,ot_none,ot_none);
     code    : #2#15#121#72;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMWRITE;
     ops     : 2;
-    optypes : (ot_reg32,ot_memory,ot_none);
+    optypes : (ot_reg32,ot_memory,ot_none,ot_none);
     code    : #2#15#121#72;
     flags   : if_386 or if_priv or if_prot or if_sm
   ),
   (
     opcode  : A_VMCALL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#193;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMLAUNCH;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#194;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMRESUME;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#195;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMXOFF;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#196;
     flags   : if_386 or if_priv or if_prot
   ),
   (
     opcode  : A_VMXON;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #219#2#15#199#134;
     flags   : if_priv or if_prot
   ),
   (
     opcode  : A_VMCLEAR;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #241#2#15#199#134;
     flags   : if_priv or if_prot
   ),
   (
     opcode  : A_VMPTRLD;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#199#134;
     flags   : if_priv or if_prot
   ),
   (
     opcode  : A_VMPTRST;
     ops     : 1;
-    optypes : (ot_memory,ot_none,ot_none);
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
     code    : #2#15#199#135;
     flags   : if_priv or if_prot
   ),
   (
     opcode  : A_VMRUN;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#216;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_VMMCALL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#217;
     flags   : if_386 or if_svm
   ),
   (
     opcode  : A_VMLOAD;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#218;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_VMSAVE;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#219;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_STGI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#220;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_CLGI;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#221;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_SKINIT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#222;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_INVLPGA;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #3#15#1#223;
     flags   : if_386 or if_svm or if_priv or if_prot
   ),
   (
     opcode  : A_MONTMUL;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#166#192;
     flags   : if_centaur
   ),
   (
     opcode  : A_XSHA1;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#166#200;
     flags   : if_centaur
   ),
   (
     opcode  : A_XSHA256;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #219#3#15#166#208;
     flags   : if_centaur
   ),
   (
     opcode  : A_DMINT;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#57;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_RDM;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none);
+    optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #2#15#58;
     flags   : if_p6 or if_cyrix
   ),
   (
     opcode  : A_MOVNTSS;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #219#2#15#43#65;
     flags   : if_sse4 or if_sd
   ),
   (
     opcode  : A_MOVNTSD;
     ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
+    optypes : (ot_memory,ot_xmmreg,ot_none,ot_none);
     code    : #220#213#2#15#43#65;
     flags   : if_sse4
   ),
   (
     opcode  : A_INSERTQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #220#2#15#121#72;
     flags   : if_sse4
   ),
+  (
+    opcode  : A_INSERTQ;
+    ops     : 4;
+    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate,ot_immediate);
+    code    : #220#2#15#120#72#22#23;
+    flags   : if_sse4 or if_sb
+  ),
   (
     opcode  : A_EXTRQ;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_immediate,ot_immediate);
+    optypes : (ot_xmmreg,ot_immediate,ot_immediate,ot_none);
     code    : #241#2#15#120#128#21#22;
     flags   : if_sse4 or if_sb
   ),
   (
     opcode  : A_EXTRQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none,ot_none);
     code    : #241#2#15#121#72;
     flags   : if_sse4
   ),
   (
     opcode  : A_LZCNT;
     ops     : 2;
-    optypes : (ot_reg16,ot_rm_gpr,ot_none);
+    optypes : (ot_reg16,ot_rm_gpr,ot_none,ot_none);
     code    : #208#219#2#15#189#72;
     flags   : if_386 or if_sm or if_sse4
   ),
   (
     opcode  : A_LZCNT;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_none);
+    optypes : (ot_reg32 or ot_bits64,ot_rm_gpr,ot_none,ot_none);
     code    : #209#219#2#15#189#72;
     flags   : if_386 or if_sm or if_sse4
   ),
   (
     opcode  : A_PABSB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#28#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PABSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#28#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PABSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#29#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PABSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#29#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PABSD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#30#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PABSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#30#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PALIGNR;
     ops     : 3;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_immediate);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_immediate,ot_none);
     code    : #217#3#15#58#15#72#22;
     flags   : if_ssse3 or if_mmx or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PALIGNR;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#15#72#22;
     flags   : if_ssse3 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PHADDW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#1#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHADDW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#1#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PHADDD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#2#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHADDD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#2#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PHADDSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#3#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHADDSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#3#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PHSUBW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#5#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHSUBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#5#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PHSUBD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#6#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHSUBD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#6#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PHSUBSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#7#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PHSUBSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#7#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PMADDUBSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#4#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PMADDUBSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#4#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PMULHRSW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#11#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PMULHRSW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#11#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PSHUFB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#0#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PSHUFB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#0#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PSIGNB;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#8#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PSIGNB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#8#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PSIGNW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#9#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PSIGNW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#9#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_PSIGND;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none,ot_none);
     code    : #217#3#15#56#10#72;
     flags   : if_ssse3 or if_mmx or if_sm
   ),
   (
     opcode  : A_PSIGND;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#10#72;
     flags   : if_ssse3 or if_sm
   ),
   (
     opcode  : A_BLENDPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#12#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_BLENDPD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#13#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_BLENDVPS;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#20#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_BLENDVPD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#21#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_DPPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#64#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_DPPD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#65#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_EXTRACTPS;
     ops     : 3;
-    optypes : (ot_memory,ot_xmmreg,ot_immediate);
+    optypes : (ot_memory,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#213#3#15#58#23#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_EXTRACTPS;
     ops     : 3;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_immediate);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#23#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_INSERTPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#33#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_MOVNTDQA;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
+    optypes : (ot_xmmreg,ot_memory,ot_none,ot_none);
     code    : #241#3#15#56#42#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_MPSADBW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#66#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PACKUSDW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#43#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PBLENDVB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#16#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PBLENDW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#14#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PCMPEQQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#41#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PEXTRB;
     ops     : 3;
-    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_immediate);
+    optypes : (ot_reg32 or ot_bits64,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#20#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PEXTRB;
     ops     : 3;
-    optypes : (ot_memory or ot_bits8,ot_xmmreg,ot_immediate);
+    optypes : (ot_memory or ot_bits8,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#20#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PEXTRD;
     ops     : 3;
-    optypes : (ot_reg32,ot_xmmreg,ot_immediate);
+    optypes : (ot_reg32,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#22#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PEXTRD;
     ops     : 3;
-    optypes : (ot_memory or ot_bits32,ot_xmmreg,ot_immediate);
+    optypes : (ot_memory or ot_bits32,ot_xmmreg,ot_immediate,ot_none);
     code    : #241#3#15#58#22#65#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PHMINPOSUW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#65#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PINSRB;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_immediate);
+    optypes : (ot_xmmreg,ot_reg32 or ot_bits64,ot_immediate,ot_none);
     code    : #241#3#15#58#32#72#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRB;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory or ot_bits8,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory or ot_bits8,ot_immediate,ot_none);
     code    : #241#3#15#58#32#72#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_reg32,ot_immediate);
+    optypes : (ot_xmmreg,ot_reg32,ot_immediate,ot_none);
     code    : #241#3#15#58#34#72#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PINSRD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory or ot_bits32,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory or ot_bits32,ot_immediate,ot_none);
     code    : #241#3#15#58#34#72#22;
     flags   : if_sse41 or if_sb or if_ar2
   ),
   (
     opcode  : A_PMAXSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#60#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMAXSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#61#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMAXUD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#63#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMAXUW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#62#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMINSB;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#56#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMINSD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#57#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMINUW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#58#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMINUD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#59#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#32#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXBD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#33#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXBQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#34#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXWD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#35#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXWQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#36#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVSXDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#37#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXBW;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#48#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXBD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#49#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXBQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#50#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXWD;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#51#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXWQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#52#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMOVZXDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#53#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_PMULDQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#40#72;
     flags   : if_sse41 or if_sm
   ),
+  (
+    opcode  : A_PMULLD;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #241#3#15#56#64#72;
+    flags   : if_sse41 or if_sm
+  ),
   (
     opcode  : A_PTEST;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#23#72;
     flags   : if_sse41 or if_sm
   ),
   (
     opcode  : A_ROUNDPS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#8#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_ROUNDPD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#9#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_ROUNDSS;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#10#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_ROUNDSD;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#11#72#22;
     flags   : if_sse41 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_CRC32;
     ops     : 2;
-    optypes : (ot_reg32,ot_rm_gpr or ot_bits8,ot_none);
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits8,ot_none,ot_none);
     code    : #220#3#15#56#240#72;
     flags   : if_sse42
   ),
   (
     opcode  : A_CRC32;
     ops     : 2;
-    optypes : (ot_reg32,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none);
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits16 or ot_bits32,ot_none,ot_none);
     code    : #209#220#3#15#56#241#72;
     flags   : if_sse42
   ),
   (
     opcode  : A_PCMPESTRI;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#97#72#22;
     flags   : if_sse42 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PCMPESTRM;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#96#72#22;
     flags   : if_sse42 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PCMPISTRI;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#99#72#22;
     flags   : if_sse42 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PCMPISTRM;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#98#72#22;
     flags   : if_sse42 or if_sm2 or if_sb or if_ar2
   ),
   (
     opcode  : A_PCMPGTQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#55#72;
     flags   : if_sse42 or if_sm
   ),
   (
     opcode  : A_POPCNT;
     ops     : 2;
-    optypes : (ot_reg16,ot_rm_gpr or ot_bits16,ot_none);
+    optypes : (ot_reg16,ot_rm_gpr or ot_bits16,ot_none,ot_none);
     code    : #219#208#2#15#184#72;
     flags   : if_386 or if_sm or if_sse4
   ),
   (
     opcode  : A_POPCNT;
     ops     : 2;
-    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none);
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none);
     code    : #219#208#2#15#184#72;
     flags   : if_386 or if_sm or if_sse4
   ),
   (
     opcode  : A_AESENC;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#220#72;
     flags   : if_sse4 or if_sm
   ),
   (
     opcode  : A_AESENCLAST;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#221#72;
     flags   : if_sse4 or if_sm
   ),
   (
     opcode  : A_AESDEC;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#222#72;
     flags   : if_sse4 or if_sm
   ),
   (
     opcode  : A_AESDECLAST;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#223#72;
     flags   : if_sse4 or if_sm
   ),
   (
     opcode  : A_AESIMC;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
     code    : #241#3#15#56#219#72;
     flags   : if_sse4 or if_sm
   ),
   (
     opcode  : A_AESKEYGENASSIST;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
     code    : #241#3#15#58#223#72#22;
     flags   : if_sse4 or if_sb or if_ar2
   )

+ 122 - 15
compiler/link.pas

@@ -84,6 +84,9 @@ interface
          Function  MakeStaticLibrary:boolean;override;
        end;
 
+      TBooleanArray = array [1..1024] of boolean;
+      PBooleanArray = ^TBooleanArray;
+
       TInternalLinker = class(TLinker)
       private
          FCExeOutput : TExeOutputClass;
@@ -94,7 +97,9 @@ interface
          procedure Load_ReadObject(const para:TCmdStr);
          procedure Load_ReadStaticLibrary(const para:TCmdStr);
          procedure ParseScript_Handle;
+         procedure ParseScript_PostCheck;
          procedure ParseScript_Load;
+         function  ParsePara(const para : string) : string;
          procedure ParseScript_Order;
          procedure ParseScript_MemPos;
          procedure ParseScript_DataPos;
@@ -102,6 +107,8 @@ interface
          function  RunLinkScript(const outputname:TCmdStr):boolean;
       protected
          linkscript : TCmdStrList;
+         ScriptCount : longint;
+         IsHandled : PBooleanArray;
          property CObjInput:TObjInputClass read FCObjInput write FCObjInput;
          property CExeOutput:TExeOutputClass read FCExeOutput write FCExeOutput;
          property StaticLibraryList:TFPHashObjectList read FStaticLibraryList;
@@ -109,6 +116,7 @@ interface
          procedure DefaultLinkScript;virtual;abstract;
       public
          IsSharedLibrary : boolean;
+         UseStabs : boolean;
          Constructor Create;override;
          Destructor Destroy;override;
          Function  MakeExecutable:boolean;override;
@@ -811,7 +819,10 @@ Implementation
         FImportLibraryList:=TFPHashObjectList.Create(true);
         exemap:=nil;
         exeoutput:=nil;
+        UseStabs:=false;
         CObjInput:=TObjInput;
+        ScriptCount:=0;
+        IsHandled:=nil;
       end;
 
 
@@ -820,6 +831,12 @@ Implementation
         linkscript.free;
         StaticLibraryList.Free;
         ImportLibraryList.Free;
+        if assigned(IsHandled) then
+          begin
+            FreeMem(IsHandled,sizeof(boolean)*ScriptCount);
+            IsHandled:=nil;
+            ScriptCount:=0;
+          end;
         if assigned(exeoutput) then
           begin
             exeoutput.free;
@@ -887,15 +904,15 @@ Implementation
 
     procedure TInternalLinker.ParseScript_Handle;
       var
-        s,
-        para,
-        keyword : String;
+        s, para, keyword : String;
         hp : TCmdStrListItem;
+        i : longint;
       begin
-        exeoutput.Load_Start;
         hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
         while assigned(hp) do
           begin
+            inc(i);
             s:=hp.str;
             if (s='') or (s[1]='#') then
               continue;
@@ -904,8 +921,10 @@ Implementation
             if Trim(s)<>'' then
               Comment(V_Warning,'Unknown part "'+s+'" in "'+hp.str+'" internal linker script');
             if (keyword<>'SYMBOL') and
+               (keyword<>'SYMBOLS') and
+               (keyword<>'STABS') and
                (keyword<>'PROVIDE') and
-               (keyword<>'ZEROES') and
+               (keyword<>'ZEROS') and
                (keyword<>'BYTE') and
                (keyword<>'WORD') and
                (keyword<>'LONG') and
@@ -924,6 +943,45 @@ Implementation
                 +'" internal linker script');
             hp:=TCmdStrListItem(hp.next);
           end;
+        ScriptCount:=i;
+        if ScriptCount>0 then
+          begin
+            GetMem(IsHandled,sizeof(boolean)*ScriptCount);
+            Fillchar(IsHandled^,sizeof(boolean)*ScriptCount,#0);
+          end;
+      end;
+
+    procedure TInternalLinker.ParseScript_PostCheck;
+      var
+        s : String;
+        hp : TCmdStrListItem;
+        i : longint;
+      begin
+        hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
+        while assigned(hp) do
+          begin
+            inc(i);
+            if not IsHandled^[i] then
+              begin
+                s:=hp.str;
+                Comment(V_Warning,'"'+hp.str+
+                  '" internal linker script not handled');
+              end;
+            hp:=TCmdStrListItem(hp.next);
+          end;
+      end;
+
+    function  TInternalLinker.ParsePara(const para : string) : string;
+      var
+        res : string;
+      begin
+        res:=trim(para);
+        { Remove enclosing braces }
+        if (length(res)>0) and (res[1]='(') and
+           (res[length(res)]=')') then
+          res:=trim(copy(res,2,length(res)-2));
+        result:=res;
       end;
 
     procedure TInternalLinker.ParseScript_Load;
@@ -932,16 +990,24 @@ Implementation
         para,
         keyword : String;
         hp : TCmdStrListItem;
+        i : longint;
+        handled : boolean;
       begin
         exeoutput.Load_Start;
         hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
         while assigned(hp) do
           begin
+            inc(i);
             s:=hp.str;
             if (s='') or (s[1]='#') then
-              continue;
+              begin
+                IsHandled^[i]:=true;
+                continue;
+              end;
+            handled:=true;
             keyword:=Upper(GetToken(s,' '));
-            para:=GetToken(s,' ');
+            para:=ParsePara(GetToken(s,' '));
             if keyword='SYMBOL' then
               ExeOutput.Load_Symbol(para)
             else if keyword='PROVIDE' then
@@ -954,8 +1020,14 @@ Implementation
               ExeOutput.Load_ImageBase(para)
             else if keyword='READOBJECT' then
               Load_ReadObject(para)
+            else if keyword='STABS' then
+              UseStabs:=true
             else if keyword='READSTATICLIBRARY' then
-              Load_ReadStaticLibrary(para);
+              Load_ReadStaticLibrary(para)
+            else
+              handled:=false;
+            if handled then
+              IsHandled^[i]:=true;
             hp:=TCmdStrListItem(hp.next);
           end;
       end;
@@ -967,16 +1039,22 @@ Implementation
         para,
         keyword : String;
         hp : TCmdStrListItem;
+        i : longint;
+        handled : boolean;
       begin
         exeoutput.Order_Start;
         hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
         while assigned(hp) do
           begin
+            inc(i);
             s:=hp.str;
             if (s='') or (s[1]='#') then
               continue;
+            handled:=true;
             keyword:=Upper(GetToken(s,' '));
-            para:=GetToken(s,' ');
+            para:=ParsePara(GetToken(s,' '));
+
             if keyword='EXESECTION' then
               ExeOutput.Order_ExeSection(para)
             else if keyword='ENDEXESECTION' then
@@ -996,7 +1074,11 @@ Implementation
             else if keyword='SYMBOL' then
               ExeOutput.Order_Symbol(para)
             else if keyword='PROVIDE' then
-              ExeOutput.Order_ProvideSymbol(para);
+              ExeOutput.Order_ProvideSymbol(para)
+            else
+              handled:=false;
+            if handled then
+              IsHandled^[i]:=true;
             hp:=TCmdStrListItem(hp.next);
           end;
         exeoutput.Order_End;
@@ -1009,22 +1091,31 @@ Implementation
         para,
         keyword : String;
         hp : TCmdStrListItem;
+        i : longint;
+        handled : boolean;
       begin
         exeoutput.MemPos_Start;
         hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
         while assigned(hp) do
           begin
+            inc(i);
             s:=hp.str;
             if (s='') or (s[1]='#') then
               continue;
+            handled:=true;
             keyword:=Upper(GetToken(s,' '));
-            para:=GetToken(s,' ');
+            para:=ParsePara(GetToken(s,' '));
             if keyword='EXESECTION' then
               ExeOutput.MemPos_ExeSection(para)
             else if keyword='ENDEXESECTION' then
               ExeOutput.MemPos_EndExeSection
             else if keyword='HEADER' then
-              ExeOutput.MemPos_Header;
+              ExeOutput.MemPos_Header
+            else
+              handled:=false;
+            if handled then
+              IsHandled^[i]:=true;
             hp:=TCmdStrListItem(hp.next);
           end;
       end;
@@ -1036,16 +1127,21 @@ Implementation
         para,
         keyword : String;
         hp : TCmdStrListItem;
+        i : longint;
+        handled : boolean;
       begin
         exeoutput.DataPos_Start;
         hp:=TCmdStrListItem(linkscript.first);
+        i:=0;
         while assigned(hp) do
           begin
+            inc(i);
             s:=hp.str;
             if (s='') or (s[1]='#') then
               continue;
+            handled:=true;
             keyword:=Upper(GetToken(s,' '));
-            para:=GetToken(s,' ');
+            para:=ParsePara(GetToken(s,' '));
             if keyword='EXESECTION' then
               ExeOutput.DataPos_ExeSection(para)
             else if keyword='ENDEXESECTION' then
@@ -1053,7 +1149,11 @@ Implementation
             else if keyword='HEADER' then
               ExeOutput.DataPos_Header
             else if keyword='SYMBOLS' then
-              ExeOutput.DataPos_Symbols;
+              ExeOutput.DataPos_Symbols
+            else
+              handled:=false;
+            if handled then
+              IsHandled^[i]:=true;
             hp:=TCmdStrListItem(hp.next);
           end;
       end;
@@ -1099,6 +1199,8 @@ Implementation
 
         PrintLinkerScript;
 
+        { Check that syntax is OK }
+        ParseScript_Handle;
         { Load .o files and resolve symbols }
         ParseScript_Load;
         exeoutput.ResolveSymbols(StaticLibraryList);
@@ -1115,7 +1217,9 @@ Implementation
         { Create .exe sections and add .o sections }
         ParseScript_Order;
         exeoutput.RemoveUnreferencedSections;
-        exeoutput.MergeStabs;
+        { if UseStabs then, this would remove
+          STABS for empty linker scripts }
+          exeoutput.MergeStabs;
         exeoutput.RemoveEmptySections;
         if ErrorCount>0 then
           goto myexit;
@@ -1149,6 +1253,9 @@ Implementation
             exeoutput.WriteExeFile(outputname);
           end;
 
+        { Post check that everything was handled }
+        ParseScript_PostCheck;
+
 { TODO: fixed section names}
         status.codesize:=exeoutput.findexesection('.text').size;
         status.datasize:=exeoutput.findexesection('.data').size;

+ 4 - 4
compiler/m68k/n68kadd.pas

@@ -358,12 +358,12 @@ implementation
         otl,ofl : tasmlabel;
       begin
 //        writeln('second_cmpboolean');
-        if (torddef(left.resultdef).ordtype in [pasbool,bool8bit]) or
-           (torddef(right.resultdef).ordtype in [pasbool,bool8bit]) then
+        if (torddef(left.resultdef).ordtype in [pasbool8,bool8bit]) or
+           (torddef(right.resultdef).ordtype in [pasbool8,bool8bit]) then
          cgsize:=OS_8
         else
-          if (torddef(left.resultdef).ordtype=bool16bit) or
-             (torddef(right.resultdef).ordtype=bool16bit) then
+          if (torddef(left.resultdef).ordtype in [pasbool16,bool16bit]) or
+             (torddef(right.resultdef).ordtype in [pasbool16,bool16bit]) then
            cgsize:=OS_16
         else
            cgsize:=OS_32;

+ 2 - 2
compiler/mips/aasmcpu.pas

@@ -28,7 +28,7 @@ interface
 uses
   cclasses,
   globtype, globals, verbose,
-  aasmbase, aasmtai,
+  aasmbase, aasmsym, aasmtai,
   cgbase, cgutils, cpubase, cpuinfo;
 
 const
@@ -38,7 +38,7 @@ const
   O_MOV_DEST   = 1;
 
 type
-  taicpu = class(tai_cpu_abstract)
+  taicpu = class(tai_cpu_abstract_sym)
     delayslot_annulled: boolean;   { conditinal opcode with ,a }
     constructor op_none(op: tasmop);
 

+ 0 - 33
compiler/mips/cpubase.pas

@@ -134,42 +134,9 @@ unit cpubase;
     const
       max_operands = 4;
 
-      { Constant defining possibly all registers which might require saving }
-      ALL_OTHERREGISTERS = [];
-
-      general_superregisters = [RS_R0..RS_R31];
-
-      { Table of registers which can be allocated by the code generator
-        internally, when generating the code.
-      }
-      { legend:                                                                }
-      { xxxregs = set of all possibly used registers of that type in the code  }
-      {           generator                                                    }
-      { usableregsxxx = set of all 32bit components of registers that can be   }
-      {           possible allocated to a regvar or using getregisterxxx (this }
-      {           excludes registers which can be only used for parameter      }
-      {           passing on ABI's that define this)                           }
-      { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-
       maxintregs = 31;
-      { to determine how many registers to use for regvars }
-      maxintscratchregs = 3;
-      usableregsint = [RS_R4..RS_R10];
-      c_countusableregsint = 7;
-
       maxfpuregs = 8;
-      fpuregs = [RS_F0..RS_F7];
-      usableregsfpu = [RS_F4..RS_F7];
-      c_countusableregsfpu = 4;
-
-      mmregs = [RS_NO..RS_NO];
-      usableregsmm = [RS_NO..RS_NO];
-      c_countusableregsmm  = 0;
-
       maxaddrregs = 0;
-      addrregs    = [];
-      usableregsaddr = [];
-      c_countusableregsaddr = 0;
 
 {*****************************************************************************
                                 Operand Sizes

+ 2 - 2
compiler/mips/cpuinfo.pas

@@ -58,11 +58,11 @@ Const
      pocall_cppdecl
    ];
 
-   cputypestr : array[tcputype] of string[5] = ('',
+   cputypestr : array[tcputype] of string[6] = ('',
      'MIPS32'
    );
 
-   fputypestr : array[tfputype] of string[6] = ('',
+   fputypestr : array[tfputype] of string[9] = ('',
      'SOFT',
      'FPU_MIPS2','FPU_MIPS3'
    );

File diff suppressed because it is too large
+ 195 - 158
compiler/msg/errord.msg


+ 133 - 49
compiler/msg/errordu.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <karl-michael.schindler at web.de>
 #
-#   Based on errore.msg of SVN revision 16783
+#   Based on errore.msg of SVN revision 18275
 #
 #   This file is part of the Free Pascal Compiler
 #   Copyright (c) 1998-2010 by the Free Pascal Development team
@@ -49,7 +49,7 @@
 #
 # General
 #
-# 01023 is the last used one
+# 01025 is the last used one
 #
 # BeginOfTeX
 % \section{General compiler messages}
@@ -79,11 +79,11 @@ general_t_includepath=01005_T_Der Includepfad ist: $1
 general_t_librarypath=01006_T_Der Bibliothekspfad ist: $1
 % When the \var{-vt} switch is used, this line tells you where the compiler
 % looks for the libraries. You can set this path with the \var{-Fl} option.
-general_t_objectpath=01007_T_Der Objektdateienpfad: $1
+general_t_objectpath=01007_T_Der Objektdateienpfad ist: $1
 % When the \var{-vt} switch is used, this line tells you where the compiler
 % looks for object files you link in (files used in \var{\{\$L xxx\}} statements).
 % You can set this path with the \var{-Fo} option.
-general_i_abslines_compiled=01008_I_$1 Zeilen übersetzt, $2 Sekunden$3
+general_i_abslines_compiled=01008_I_$1 Zeilen übersetzt, $2 Sekunden $3
 % When the \var{-vi} switch is used, the compiler reports the number
 % of lines compiled, and the time it took to compile them (real time,
 % not program time).
@@ -128,6 +128,10 @@ general_i_number_of_hints=01022_I_$1 Hinweis(e) ausgegeben
 % Total number of hints issued during compilation.
 general_i_number_of_notes=01023_I_$1 Anmerkung(en) ausgegeben
 % Total number of notes issued during compilation.
+general_f_ioerror=01024_F_I/O Fehler: $1
+% During compilation an I/O error happened which allows no further compilation.
+general_f_oserror=01025_F_Betriebsystemfehler: $1
+% During compilation an operanting system error happened which allows no further compilation.
 %
 % \end{description}
 # EndOfTeX
@@ -135,7 +139,7 @@ general_i_number_of_notes=01023_I_$1 Anmerkung(en) ausgegeben
 #
 # Scanner
 #
-# 02087 is the last used one
+# 02088 is the last used one
 #
 % \section{Scanner messages.}
 % This section lists the messages that the scanner emits. The scanner takes
@@ -152,7 +156,7 @@ scan_f_end_of_file=02000_F_Unerwartetes Dateiende
 % \item An include file ends in the middle of a statement.
 % \item A comment was not closed.
 % \end{itemize}
-scan_f_string_exceeds_line=02001_F_Zeichenkette geht über Zeilenende hinaus
+scan_f_string_exceeds_line=02001_F_Zeichenkette geht über das Zeilenende hinaus
 % You forgot probably to include the closing ' in a string, so it occupies
 % multiple lines.
 scan_f_illegal_char=02002_F_Unzulässiges Zeichen "$1" ($2)
@@ -217,7 +221,7 @@ scan_h_user_defined=02026_H_Benutzerdefiniert: $1
 % A user defined hint was encountered. See also the \progref
 scan_i_user_defined=02027_I_Benutzerdefiniert: $1
 % User defined information was encountered. See also the \progref
-scan_e_keyword_cant_be_a_macro=02028_E_Ein Makro, welches den selben Namen wie ein Schlüsselwort hat, wird ignoriert
+scan_e_keyword_cant_be_a_macro=02028_E_Ein Makro, das den selben Namen wie ein Schlüsselwort hat, wird ignoriert
 % You cannot redefine keywords with macros.
 scan_f_macro_buffer_overflow=02029_F_Makropufferüberlauf während des Lesens oder Expandierens eines Makros
 % Your macro or it's result was too long for the compiler.
@@ -296,7 +300,7 @@ scan_w_include_env_not_found=02054_W_$1 ist keine Umgebungsvariable
 % be replaced by an empty string instead.
 scan_e_invalid_maxfpureg_value=02055_E_Nicht erlaubter Wert für MAXFPUREGISTER-Direktive
 % Valid values for this directive are 0..8 and NORMAL/DEFAULT.
-scan_w_only_one_resourcefile_supported=02056_W_Nur ein Resourcedatei wird vom aktuellen Zielbetriebssystem unterstützt
+scan_w_only_one_resourcefile_supported=02056_W_Vom aktuellen Zielbetriebssystem wird nur eine Resourcedatei unterstützt
 % Only one resource file can be supported for this target - this is the case of
 % OS/2 (EMX) currently. The first one found is used, the others are discarded.
 scan_w_macro_support_turned_off=02057_W_Makrounterstützung ist ausgeschaltet
@@ -329,11 +333,11 @@ scan_e_mode_switch_not_allowed=02067_E_Der Modus Umschalter "$1" ist hier nicht
 % a mode switch occurs after UNIT.
 scan_e_error_macro_undefined=02068_E_Die Compile time Variable oder das Makro "$1" ist nicht definiert.
 % Thus the conditional compile time expression cannot be evaluated. Only in mode MacPas.
-scan_e_utf8_bigger_than_65535=02069_E_Der UTF-8 Kode ist grösser als 65535
+scan_e_utf8_bigger_than_65535=02069_E_Der UTF-8 Code ist grösser als 65535
 % \fpc handles UTF-8 strings internally as widestrings, i.e. the char codes are limited to 65535.
 scan_e_utf8_malformed=02070_E_Ungültige UTF-8 Zeichenkette
 % The given string isn't a valid UTF-8 string.
-scan_c_switching_to_utf8=02071_C_UTF-8 Signatur gefunden, verwende UTF-8 Kode
+scan_c_switching_to_utf8=02071_C_UTF-8 Signatur gefunden, verwende UTF-8 Code
 % The compiler found a UTF-8 encoding signature (\$ef, \$bb, \$bf) at the beginning of a file,
 % so it interprets it as a UTF-8 file.
 scan_e_compile_time_typeerror=02072_E_Compile time Ausdruck: Erwartete $1 aber erhielt $2 bei $3
@@ -371,6 +375,9 @@ scan_w_multiple_main_name_overrides=02086_W_Der Name der "main" Prozedur wird me
 % name will be used.
 scanner_w_illegal_warn_identifier=02087_W_Ungültige Bezeichner "$1" für die $WARN Direktive
 % Identifier is not known by a \var{\{\$WARN\}} compiler directive.
+scanner_e_illegal_alignment_directive=02088_E_Ungültige "alignment" Direktive
+% The alignment directive is not valid. Either the alignment type is not known or the alignment
+% value is not a power of two.
 %
 % \end{description}
 # EndOfTeX
@@ -378,7 +385,7 @@ scanner_w_illegal_warn_identifier=02087_W_Ungültige Bezeichner "$1" für die $W
 #
 # Parser
 #
-# 03304 is the last used one
+# 03313 is the last used one
 #
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
@@ -403,7 +410,7 @@ parser_e_export_invalid_index=03010_E_Ungültiger Index for exportierte Funktion
 % DLL function index must be in the range \var{1..\$FFFF}.
 parser_w_parser_reloc_no_debug=03011_W_Für relozierbare DLL oder ausführbare Datei $1 funktionieren keine Debug-Information, deaktiviert.
 % It is currently not possible to include debug information in a relocatable DLL.
-parser_w_parser_win32_debug_needs_WN=03012_W_Um Win32-Code debuggen zu können müssen die Relozierungen mit -WN option abgeschaltet werden.
+parser_w_parser_win32_debug_needs_WN=03012_W_Um Win32-Code debuggen zu können, müssen die Relozierungen mit -WN option abgeschaltet werden.
 % Stabs debug info is wrong for relocatable DLL or EXES. Use -WN
 % if you want to debug win32 executables.
 parser_e_constructorname_must_be_init=03013_E_Konstruktor-Name muss INIT sein
@@ -928,9 +935,9 @@ parser_e_no_access_specifier_in_interfaces=03172_E_Zugriffsbezeichner können in
 % The access specifiers \var{public}, \var{private}, \var{protected} and
 % \var{published} can't be used in interfaces, Objective-C protocols and categories because all methods
 % of an interface/protocol/category must be public.
-parser_e_no_vars_in_interfaces=03173_E_Ein Interface, ein Objective-C Protokoll oder eine Kategorie darf keine Felder enthalten
-% Declarations of fields are not allowed in interfaces and Objective-C protocols and categories.
-% An interface/protocol/category can contain only methods and properties with method read/write specifiers.
+parser_e_no_vars_in_interfaces=03173_E_Ein Interface, ein Helfer, ein Objective-C Protokoll oder eine Kategorie darf keine Felder enthalten
+% Declarations of fields are not allowed in interfaces, helpers and Objective-C protocols and categories.
+% An interface/helper/protocol/category can contain only methods and properties with method read/write specifiers.
 parser_e_no_local_proc_external=03174_E_Eine lokale Prozedur kann nicht als EXTERNAL deklariert werden
 % Declaring local procedures as external is not possible. Local procedures
 % get hidden parameters that will make the chance of errors very high.
@@ -1275,9 +1282,12 @@ parser_e_objc_message_name_changed=03275_E_Der Nachrichtenname "$1" in der verer
 parser_e_no_objc_unique=03276_E_Noch können eindeutige Kopien von Objective-C Typen nicht erstellt werden
 % Duplicating an Objective-C type using \var{type x = type y;} is not yet supported. You may be able to
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
-parser_e_no_category_as_types=03277_E_Objective-C Kategorien können nicht als Typen benutzt werden
-% It is not possible to declare a variable as an instance of an Objective-C category. A
-% category adds methods to the scope of an existing class, but does not define a type by itself.
+parser_e_no_category_as_types=03277_E_Objective-C Kategorien und Object-Pascal Klassenhelfer können nicht als Typen benutzt werden
+% It is not possible to declare a variable as an instance of an Objective-C
+% category or an Object Pascal class helper. A category/class helper adds
+% methods to the scope of an existing class, but does not define a type by
+% itself. An exception of this rule is when inheriting an Object Pascal class
+% helper from another class helper.
 parser_e_no_category_override=03278_E_Kategorien überschreiben Methoden nicht, sondern ersetzen sie. "reintroduce" benutzen
 parser_e_must_use_reintroduce_objc=03279_E_Ersetzte Methoden können in Objective-C nur wieder eingeführt werden, füge "reintroduce" hinzu (Ersetzte Methode ist in $1 definiert)
 parser_h_should_use_reintroduce_objc=03280_H_Ersetzte Methoden können in Objective-C nur wieder eingeführt werden, füge "reintroduce" hinzu (Ersetzte Methode ist in $1 definiert)
@@ -1363,19 +1373,44 @@ parser_e_forward_protocol_declaration_must_be_resolved=03298_E_Vorwärts-Deklara
 % where \var{MyProtocol} is declared but not defined.
 parser_e_no_record_published=03299_E_Record -Typen können keine öffentlichen Abschnitte (published sections) haben
 % Published sections can be used only inside classes.
-parser_e_no_destructor_in_records=03300_E_Destruktoren sind in Records nicht erlaubt
-% Destructor declarations aren't allowed in records.
+parser_e_no_destructor_in_records=03300_E_Destruktoren sind in Records und Helfern nicht erlaubt
+% Destructor declarations aren't allowed in records or helpers.
 parser_e_class_methods_only_static_in_records=03301_E_Klassenmethoden müssen in Records statisch sein
 % Class methods declarations aren't allowed in records without static modifier.
 % Records have no inheritance and therefore non static class methods have no sence for them.
-parser_e_no_constructor_in_records=03302_E_Konstruktoren sind in Records nicht erlaubt
-% Constructor declarations aren't allowed in records.
+parser_e_no_constructor_in_records=03302_E_Konstruktoren sind in Records und Recordhelfern nicht erlaubt
+% Constructor declarations aren't allowed in records or record helpers.
 parser_e_at_least_one_argument_must_be_of_type=03303_E_Entweder das Ergebnis oder mindestens ein Parameter müssen vom Typ "$1" sein
 % It is required that either the result of the routine or at least one of its parameters be of the specified type.
 % For example class operators either take an instance of the structured type in which they are defined, or they return one.
 parser_e_cant_use_type_parameters_here=03304_E_Typ-Parameter können initialization/finalization erfordern - Sie können deshalb nicht in varianten Rekords verwendet werden
 % Type parameters may be specialized with types which (e.g. \var{ansistring}) need initialization/finalization
 % code which is implicitly generated by the compiler. 
+parser_e_externals_no_section=03305_E_"external" deklarierte Variablen dürfen nicht in einer "custom section" sein
+% A section directive is not valid for variables being declared as external.
+parser_e_section_no_locals=03306_E_Nicht-statische und nicht-globale Variablen dürfen keine Direktive "section" haben
+% A variable placed in a custom section is always statically allocated so it must be either a static or global variable.
+parser_e_not_allowed_in_helper=03307_E_"$1" ist in Helfertypen nicht erlaubt
+% Some directives and specifiers like "virtual", "dynamic", "override" aren't
+% allowed inside helper types in mode ObjFPC (they are ignored in mode Delphi),
+% because they have no meaning within helpers. Also "abstract" isn't allowed in
+% either mode.
+parser_e_no_class_constructor_in_helpers=03308_E_Klassenkonstruktoren sind in Helfern nicht erlaubt
+% Class constructor declarations aren't allowed in helpers.
+parser_e_inherited_not_in_record=03309_E_"inherited" ist in einem Record nicht erlaubt
+% As records don't suppport inheritance the use of "inherited" is prohibited for
+% these as well as for record helpers (in mode "Delphi" only).
+parser_e_no_types_in_local_anonymous_records=03310_E_Typ-Deklarationen sind in lokalen oder anonymen Records nicht erlaubt
+% Records with types must be defined globally. Types cannot be defined inside records which are defined in a
+% procedure or function or in anonymous records.
+parser_e_duplicate_implements_clause=03311_E_Zweifacher "implements"-Term für das Interface "$1"
+% A class may delegate an interface using the "implements" clause only to a single property. Delegating it multiple times
+% is a error.
+parser_e_mapping_no_implements=03312_E_Das Interface "$1" kann nicht durch "$2" delegiert werden. Die Methode ist bereits aufgelöst
+% Method resolution clause maps a method of an interface to a method of the current class. Therefore the current class
+% has to implement the interface directly. Delegation is not possible.
+parser_e_implements_no_mapping=03313_E_Das Interface "$1" kann keine Methoden-Auflösung haben, "$2" delegiert es bereits
+% Method resoulution is only possible for interfaces that are implemented directly, not by delegation.
 %
 % \end{description}
 # EndOfTeX
@@ -1383,7 +1418,7 @@ parser_e_cant_use_type_parameters_here=03304_E_Typ-Parameter können initializat
 #
 # Type Checking
 #
-# 04098 is the last used one
+# 04103 is the last used one
 #
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
@@ -1570,14 +1605,16 @@ type_e_type_is_not_completly_defined=04042_E_Typ "$1" ist nicht vollständig def
 type_w_string_too_long=04043_W_String literal hat mehr Zeichen als short string length
 % The size of the constant string, which is assigned to a shortstring,
 % is longer than the maximum size of the shortstring (255 characters).
-type_w_signed_unsigned_always_false=04044_W_Wegen des Bereichs der Werte ist das Vergleichsergebnis immer falsch
-% There is a comparison between an unsigned value and a signed constant which is
-% less than zero. Because of type promotion, the statement will always evaluate to
-% false. Explicitly typecast the constant to the correct range to avoid this problem.
-type_w_signed_unsigned_always_true=04045_W_Wegen des Bereichs der Werte ist das Vergleichsergebnis immer richtig
-% There is a comparison between an unsigned value and a signed constant which is
-% less than zero. Because of type promotion, the statement will always evaluate to
-% true. Explicitly typecast the constant to the correct range to avoid this problem.
+type_w_comparison_always_false=04044_W_Wegen der Bereiche der Konstanten und des Ausdrucks könnte das Vergleichsergebnis immer falsch sein
+% There is a comparison between a constant and an expression where the constant is out of the
+% valid range of values of the expression. Because of type promotion, the statement will always evaluate to
+% false. Explicitly typecast the constant or the expression to the correct range to avoid this warning
+% if you think the code is correct.
+type_w_comparison_always_true=04045_W_Wegen der Bereiche der Konstanten und des Ausdrucks könnte das Vergleichsergebnis immer richtig sein
+% There is a comparison between a constant and an expression where the constant is out of the
+% valid range of values of the expression. Because of type promotion, the statement will always evaluate to
+% true. Explicitly typecast the constant or the expression to the correct range to avoid this warning
+% if you think the code is correct.
 type_w_instance_with_abstract=04046_W_Konstruktion der Klasse "$1" mit der abstrakten Methode "$2"
 % An instance of a class is created which contains non-implemented abstract
 % methods. This will probably lead to a runtime error 211 in the code if that
@@ -1604,7 +1641,8 @@ type_e_constant_expr_expected=04052_E_Konstanter Ausdruck erwartet
 type_e_operator_not_supported_for_types=04053_E_Operation "$1" wird für die Typen "$2" und "$3" nicht unterstützt
 % The operation is not allowed for the supplied types.
 type_e_illegal_type_conversion=04054_E_Illegale Typ-Konversion: "$1" nach "$2"
-% When doing a type-cast, you must take care that the sizes of the variable and
+% When doing a type-cast, you must take care that the sizes of
+ the variable and
 % the destination type are the same.
 type_h_pointer_to_longint_conv_not_portable=04055_H_Konversion zwischen ordinalen Typen und Zeigern ist nicht portierbar
 % If you typecast a pointer to a longint (or vice-versa), this code will not compile
@@ -1664,7 +1702,7 @@ type_w_pointer_to_signed=04082_W_Die Konvertierung von Pointern in einen Integer
 % For example both \windows and \linux allow pointers in the range \$0000000 to \$bfffffff.
 % If you convert pointers to signed types, this can cause overflow and range check errors,
 % but also \$80000000 < \$7fffffff. This can cause random errors in code like "if p>q".
-type_interface_has_no_guid=04083_E_Interface Typ $1 hat keine gültige GUID
+type_e_interface_has_no_guid=04083_E_Interface Typ $1 hat keine gültige GUID
 % When applying the as-operator to an interface or class, the desired interface (i.e. the right operand of the
 % as-operator) must have a valid GUID.
 type_e_invalid_objc_selector_name=04084_E_Ungültiger Objective-C-Selector-Name "$1"
@@ -1731,6 +1769,20 @@ type_e_type_parameters_are_not_allowed_here=04097_E_Typ-Parameter sind für nich
 % Type parameters are only allowed for methods of generic classes, records or objects
 type_e_generic_declaration_does_not_match=04098_E_Die generische Deklaration von "$1" unterscheidet sich vom der vorherigen Deklaration
 % Generic declaration does not match the previous declaration
+type_e_helper_type_expected=04099_E_Helfertyp erwartet
+% The compiler expected a \var{class helper} type.
+type_e_record_type_expected=04100_E_Recordtyp erwartet
+% The compiler expected a \var{record} type.
+type_e_class_helper_must_extend_subclass=04101_E_Abgeleitete Klassenhelfer müssen eine Unterklasse von "$1" oder die Klasse selbst erweitern
+% If a class helper inherits from another class helper the extended class must
+% extend either the same class as the parent class helper or a subclass of it
+type_e_record_helper_must_extend_same_record=04102_E_Abgeleitete Recordhelfer müssen "$1" erweitern
+% If a record helper inherits from another record helper it must extend the same
+% record that the parent record helper extended.
+type_e_procedures_return_no_value=04103_E_Ungültige Zuweisung, eine Prozedur gibt keinen Wert zurück
+% This error occurs when one tries to assign the result of a procedure or destructor call.
+% A procedure or destructor returns no value so this is not
+% possible.
 %
 % \end{description}
 # EndOfTeX
@@ -1738,7 +1790,7 @@ type_e_generic_declaration_does_not_match=04098_E_Die generische Deklaration von
 #
 # Symtable
 #
-# 05083 is the last used one
+# 05084 is the last used one
 #
 % \section{Symbol handling}
 % This section lists all the messages that concern the handling of symbols.
@@ -1977,11 +2029,17 @@ sym_e_objc_formal_class_not_resolved=05080_E_Die vollständige Definition der fo
 % of the class to be in scope.
 sym_e_interprocgoto_into_init_final_code_not_allowed=05081_E_Gotos in die 'initialization'- oder 'finalization'-Blöcke einer Unit sind nicht erlaubt
 % Gotos into initialization or finalization blockse of units are not allowed.
-sym_e_external_class_name_mismatch1=05082=E_Ungültiger externer Name "$1" für die formale Klasse "$2"
-sym_e_external_class_name_mismatch2=05083=E_Hierhin muss die vollständige Klassendefinition mit externem Namen "$1"
+sym_e_external_class_name_mismatch1=05082_E_Ungültiger externer Name "$1" für die formale Klasse "$2"
+sym_e_external_class_name_mismatch2=05083_E_Hierhin muss die vollständige Klassendefinition mit externem Namen "$1"
 % When a class is declared using a formal external definition, the actual external
 % definition (if any) must specify the same external name as the formal definition
 % (since both definitions refer to the same actual class type).
+sym_w_library_overload=05084_W_Möglicher Bibliothekenkonflikt: Das Symbol "$1" aus Bibliothek "$2" wurde auch in Bibliothek "$3" gefunden
+% Some OS do not have library specific namespaces, for those
+% OS, the function declared as "external 'libname' name 'funcname'",
+% the 'libname' part is only a hint, funcname might also be loaded
+% by another library. This warning appears if 'funcname' is used twice
+% with two different library names.
 %
 % \end{description}
 # EndOfTeX
@@ -2286,7 +2344,7 @@ asmr_w_id_supposed_external=07072_W_Bezeichner $1 ist vermutlich External
 % problems at link time if the symbol is not defined anywhere.
 asmr_e_string_not_allowed_as_const=07073_E_Strings sind als Konstanten unzulässig
 % Character strings are not allowed as constants.
-asmr_e_no_var_type_specified=07074_Typ der Variablen nicht angegeben
+asmr_e_no_var_type_specified=07074_E_Typ der Variablen nicht angegeben
 % The syntax expects a type idenfitifer after the dot, but
 % none was found.
 asmr_w_assembler_code_not_returned_to_text=07075_E_Assemblercode kehrt nicht zum Text zurück
@@ -2388,14 +2446,14 @@ asmr_e_mixing_regtypes=07108_E_Alle Register in einem Registerset müssen in T u
 asmr_e_empty_regset=07109_E_Ein Registerset kann nicht leer sein
 % Instructions on the ARM architecture that take a register set as argument require that such a set
 % contains at least one register.
-
 asmr_w_useless_got_for_local=07110_W_@GOTPCREL ist nutzlos und bei lokalen Symbole möglicherweise gefährlich
 % The use of @GOTPCREL supposes an extra indirection that is
 % not present if the symbol is local, which might lead to wrong asembler code
+
 #
 # Assembler/binary writers
 #
-# 08021 is the last used one
+# 08022 is the last used one
 #
 asmw_f_too_many_asm_files=08000_F_Zu viele Assembler-Dateien
 % With smartlinking enabled, there are too many assembler
@@ -2422,6 +2480,11 @@ asmw_e_first_defined_label=08018_E_Asm: First beginnt hier
 asmw_e_invalid_register=08019_E_Asm: Ungültiges Register $1
 asmw_e_16bit_32bit_not_supported=08020_E_Asm: 16 oder 32 Bit Referenzen werden nicht unterstützt
 asmw_e_64bit_not_supported=08021_E_Asm: 64 Bit Operanden werden nicht unterstützt
+asmw_e_bad_reg_with_rex=08022_E_Asm: AH,BH,CH oder DH können nicht in einer Instruktion verwendt werden, die den Prefix REX benötigt
+% x86_64 only: instruction encoding of this platform does not allow using
+% 8086 high byte registers (AH,BH,CH or DH) together with REX prefix in a single instruction.
+% The REX prefix is required whenever the instruction operand size is 64 bits, or
+% when it uses one of extended x86_64 registers (R8-R15 or XMM8-XMM15).
 
 #
 # Executing linker/assembler
@@ -3080,6 +3143,11 @@ option_help_pages=11025_[
 3*2Acoff_COFF (Go32v2) mit Hilfe des internen Schreibers
 3*2Apecoff_PE_COFF (Win32) mit Hilfe des internen Schreibers
 4*2Aas_Assembliere mit Hilfe von GNU AS
+4*2Agas_Assembliere mit Hilfe von GNU GAS
+4*2Agas-darwin_Assembliere darwin Mach-O64 mit Hilfe von GNU GAS
+4*2Amasm_Win64 Object Datei mit Hilfe von ml64 (Microsoft)
+4*2Apecoff_PE-COFF (Win64) mit Hilfe des internen Writer
+4*2Aelf_ELF (Linux-64bit) mit Hilfe des internen Writer
 6*2Aas_Unix o-file mit Hilfe von GNU AS
 6*2Agas_GNU Motorola Assembler
 6*2Amit_MIT Syntax (old GAS)
@@ -3216,6 +3284,7 @@ S*2Aas_Assembliere mit Hilfe von GNU AS
 **2So_Sei TP/BP 7.0 kompatibel (wie -Mtp)
 **2Ss_Konstruktor- und Destruktorname müssen "Init" und "Done" sein
 **2Sx_Exception Schlüsselwörter einschalten (Voreinstellung in Delphi/ObjFPC Moden)
+**2Sy_@<pointer> gibt einen typisierten Pointer zurück, genau wie $T+
 **1s_Rufe weder Assembler noch Linker auf (nur mit -a)
 **2sh_Erzeuge Script um auf dem Host zu linken
 **2st_Erzeuge Script um auf dem Zielsystem zu linken
@@ -3273,41 +3342,56 @@ S*2Tlinux_Linux
 **2*_    Dateinamen den vollständigen  v : Schreibe fpcdebug.txt mit 
 **2*_    Pfad                              ganz viel Information
 **2*_m<x>,<y> : Zeige die Meldungen mit den Nummern <x> und <y> nicht
-3*1W<x>_Ziel-spezifische Optionen (Ziele)
-A*1W<x>_Ziel-spezifische Optionen (Ziele)
-P*1W<x>_Ziel-spezifische Optionen (Ziele)
-p*1W<x>_Ziel-spezifische Optionen (Ziele)
+**1W<x>_Spezifiziere ein natives Programm (Windows)
+3*2WA_Spezifiziere ein natives Programm (Windows)
+4*2WA_Spezifiziere ein natives Programm (Windows)
+A*2WA_Spezifiziere ein natives Programm (Windows)
 3*2Wb_Erzeuge statt einer Bibliothek ein Bundle (Darwin)
 P*2Wb_Erzeuge statt einer Bibliothek ein Bundle (Darwin)
 p*2Wb_Erzeuge statt einer Bibliothek ein Bundle (Darwin)
-3*2WB_Erzeuge ein relozierbares Image (Windows)
+A*2Wb_Erzeuge statt einer Bibliothek ein Bundle (Darwin)
+4*2Wb_Erzeuge statt einer Bibliothek ein Bundle (Darwin)
+3*2WB_Erzeuge ein relozierbares Image (Windows, Symbian)
+3*2WBxxxx_Setze die Imagebasis auf xxxx (Windows, Symbian)
+4*2WB_Erzeuge ein relozierbares Image (Windows)
+4*2WBxxxx_Setze die Imagebasis auf xxxx (Windows, Symbian)
 A*2WB_Erzeuge ein relozierbares Image (Windows, Symbian)
+A*2WBxxxx_Setze die Imagebasis auf xxxx (Windows)
 3*2WC_Spezifiziere "console type application" (EMX, OS/2, Windows)
+4*2WC_Spezifiziere "console type application" (EMX, OS/2, Windows)
 A*2WC_Spezifiziere "console type application" (Windows)
 P*2WC_Spezifiziere "console type application" (Classic Mac OS)
 3*2WD_Benutze DEFFILE um Funktionen der DLL oder EXE zu exportieren (Windows)
+4*2WD_Benutze DEFFILE um Funktionen der DLL oder EXE zu exportieren (Windows)
 A*2WD_Benutze DEFFILE um Funktionen der DLL oder EXE zu exportieren (Windows)
 3*2We_Benutze externe Resourcen (Darwin)
 4*2We_Benutze externe Resourcen (Darwin)
 A*2We_Benutze externe Resourcen (Darwin)
 P*2We_Benutze externe Resourcen (Darwin)
-p*2We_Benutze externe resoResourcenurces (Darwin)
+p*2We_Benutze externe Resourcen (Darwin)
 3*2WF_Spezifiziere "full-screen type application" (EMX, OS/2)
 3*2WG_Spezifiziere "graphic type application" (EMX, OS/2, Windows)
+4*2WG_Spezifiziere "graphic type application" (EMX, OS/2, Windows)
 A*2WG_Spezifiziere "graphic type application" (Windows)
 P*2WG_Spezifiziere "graphic type application" (Classic Mac OS)
 3*2Wi_Benutze interne Resourcen (Darwin)
+4*2Wi_Benutze interne Resourcen (Darwin)
+A*2Wi_Benutze interne Resourcen (Darwin)
 P*2Wi_Benutze interne Resourcen (Darwin)
 p*2Wi_Benutze interne Resourcen (Darwin)
+3*2WI_Die Verwendung der "import"-Abschnitte ein/ausschalten (Windows)
+4*2WI_Die Verwendung der "import"-Abschnitte ein/ausschalten (Windows)
+A*2WI_Die Verwendung der "import"-Abschnitte ein/ausschalten (Windows)
 3*2WN_Erzeuge keinen "relocation code" (notwendig für debugging) (Windows)
+4*2WN_Erzeuge keinen "relocation code" (notwendig für debugging) (Windows)
 A*2WN_Erzeuge keinen "relocation code" (notwendig für debugging) (Windows)
+A*2Wpxxxx_Spezifiziere den Kontrollertyp, mögliche Werte liefert fpc -i
+V*2Wpxxxx_Spezifiziere den Kontrollertyp, mögliche Werte liefert fpc -i
 3*2WR_Erzeuge "relocation code" (Windows)
+4*2WR_Erzeuge "relocation code" (Windows)
 A*2WR_Erzeuge "relocation code" (Windows)
 P*2WF_Spezifiziere "MPW tool type application" (Classic Mac OS)
-3*2WX_Ermögliche den executable stack (Linux)
-A*2WX_Ermögliche den executable stack (Linux)
-p*2WX_Ermögliche den executable stack (Linux)
-P*2WX_Ermögliche den executable stack (Linux)
+**2WX_Ermögliche den executable stack (Linux)
 **1X_Programm-Optionen:
 **2Xc_Übergebe --shared an den Linker (nur Unix)
 **2Xd_Den Standard Bibliotheks-Suchpfad NICHT nutzen (benötigt für cross compile)

+ 33 - 9
compiler/msg/errore.msg

@@ -124,6 +124,10 @@ general_i_number_of_hints=01022_I_$1 hint(s) issued
 % Total number of hints issued during compilation.
 general_i_number_of_notes=01023_I_$1 note(s) issued
 % Total number of notes issued during compilation.
+general_f_ioerror=01024_F_I/O error: $1
+% During compilation an I/O error happened which allows no further compilation.
+general_f_oserror=01025_F_Operating system error: $1
+% During compilation an operanting system error happened which allows no further compilation.
 % \end{description}
 #
 # Scanner
@@ -1388,6 +1392,14 @@ parser_e_inherited_not_in_record=03309_E_The use of "inherited" is not allowed i
 parser_e_no_types_in_local_anonymous_records=03310_E_Type declarations are not allowed in local or anonymous records
 % Records with types must be defined globally. Types cannot be defined inside records which are defined in a
 % procedure or function or in anonymous records.
+parser_e_duplicate_implements_clause=03311_E_Duplicate implements clause for interface "$1"
+% A class may delegate an interface using the "implements" clause only to a single property. Delegating it multiple times
+% is a error.
+parser_e_mapping_no_implements=03312_E_Interface "$1" can't be delegated by "$2", it already has method resolutions
+% Method resolution clause maps a method of an interface to a method of the current class. Therefore the current class
+% has to implement the interface directly. Delegation is not possible.
+parser_e_implements_no_mapping=03313_E_Interface "$1" can't have method resolutions, "$2" already delegates it
+% Method resoulution is only possible for interfaces that are implemented directly, not by delegation.
 % \end{description}
 # Type Checking
 #
@@ -1578,14 +1590,16 @@ type_e_type_is_not_completly_defined=04042_E_Type "$1" is not completely defined
 type_w_string_too_long=04043_W_String literal has more characters than short string length
 % The size of the constant string, which is assigned to a shortstring,
 % is longer than the maximum size of the shortstring (255 characters).
-type_w_signed_unsigned_always_false=04044_W_Comparison is always false due to range of values
-% There is a comparison between an unsigned value and a signed constant which is
-% less than zero. Because of type promotion, the statement will always evaluate to
-% false. Explicitly typecast the constant to the correct range to avoid this problem.
-type_w_signed_unsigned_always_true=04045_W_Comparison is always true due to range of values
-% There is a comparison between an unsigned value and a signed constant which is
-% less than zero. Because of type promotion, the statement will always evaluate to
-% true. Explicitly typecast the constant to the correct range to avoid this problem.
+type_w_comparison_always_false=04044_W_Comparison might be always false due to range of constant and expression
+% There is a comparison between a constant and an expression where the constant is out of the
+% valid range of values of the expression. Because of type promotion, the statement will always evaluate to
+% false. Explicitly typecast the constant or the expression to the correct range to avoid this warning
+% if you think the code is correct.
+type_w_comparison_always_true=04045_W_Comparison might be always true due to range of constant and expression
+% There is a comparison between a constant and an expression where the constant is out of the
+% valid range of values of the expression. Because of type promotion, the statement will always evaluate to
+% true. Explicitly typecast the constant or the expression to the correct range to avoid this warning
+% if you think the code is correct.
 type_w_instance_with_abstract=04046_W_Constructing a class "$1" with abstract method "$2"
 % An instance of a class is created which contains non-implemented abstract
 % methods. This will probably lead to a runtime error 211 in the code if that
@@ -1749,7 +1763,10 @@ type_e_class_helper_must_extend_subclass=04101_E_Derived class helper must exten
 type_e_record_helper_must_extend_same_record=04102_E_Derived record helper must extend "$1"
 % If a record helper inherits from another record helper it must extend the same
 % record that the parent record helper extended.
-%
+type_e_procedures_return_no_value=04103_E_Invalid assignment, procedures return no value
+% This error occurs when one tries to assign the result of a procedure or destructor call.
+% A procedure or destructor returns no value so this is not
+% possible.
 % \end{description}
 #
 # Symtable
@@ -3099,6 +3116,11 @@ option_help_pages=11025_[
 3*2Acoff_COFF (Go32v2) using internal writer
 3*2Apecoff_PE-COFF (Win32) using internal writer
 4*2Aas_Assemble using GNU AS
+4*2Agas_Assemble using GNU GAS
+4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS
+4*2Amasm_Win64 object file using ml64 (Microsoft)
+4*2Apecoff_PE-COFF (Win64) using internal writer
+4*2Aelf_ELF (Linux-64bit) using internal writer
 6*2Aas_Unix o-file using GNU AS
 6*2Agas_GNU Motorola assembler
 6*2Amit_MIT Syntax (old GAS)
@@ -3337,6 +3359,8 @@ A*2WI_Turn on/off the usage of import sections (Windows)
 3*2WN_Do not generate relocation code, needed for debugging (Windows)
 4*2WN_Do not generate relocation code, needed for debugging (Windows)
 A*2WN_Do not generate relocation code, needed for debugging (Windows)
+A*2Wpxxxx_Specify the controller type, see fpc -i for possible values
+V*2Wpxxxx_Specify the controller type, see fpc -i for possible values
 3*2WR_Generate relocation code (Windows)
 4*2WR_Generate relocation code (Windows)
 A*2WR_Generate relocation code (Windows)

+ 10 - 4
compiler/msgidx.inc

@@ -23,6 +23,8 @@ const
   general_i_number_of_warnings=01021;
   general_i_number_of_hints=01022;
   general_i_number_of_notes=01023;
+  general_f_ioerror=01024;
+  general_f_oserror=01025;
   scan_f_end_of_file=02000;
   scan_f_string_exceeds_line=02001;
   scan_f_illegal_char=02002;
@@ -400,6 +402,9 @@ const
   parser_e_no_class_constructor_in_helpers=03308;
   parser_e_inherited_not_in_record=03309;
   parser_e_no_types_in_local_anonymous_records=03310;
+  parser_e_duplicate_implements_clause=03311;
+  parser_e_mapping_no_implements=03312;
+  parser_e_implements_no_mapping=03313;
   type_e_mismatch=04000;
   type_e_incompatible_types=04001;
   type_e_not_equal_types=04002;
@@ -443,8 +448,8 @@ const
   type_e_class_or_interface_type_expected=04041;
   type_e_type_is_not_completly_defined=04042;
   type_w_string_too_long=04043;
-  type_w_signed_unsigned_always_false=04044;
-  type_w_signed_unsigned_always_true=04045;
+  type_w_comparison_always_false=04044;
+  type_w_comparison_always_true=04045;
   type_w_instance_with_abstract=04046;
   type_h_in_range_check=04047;
   type_w_smaller_possible_range_check=04048;
@@ -493,6 +498,7 @@ const
   type_e_record_type_expected=04100;
   type_e_class_helper_must_extend_subclass=04101;
   type_e_record_helper_must_extend_same_record=04102;
+  type_e_procedures_return_no_value=04103;
   sym_e_id_not_found=05000;
   sym_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
@@ -895,9 +901,9 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 60342;
+  MsgTxtSize = 61092;
 
   MsgIdxMax : array[1..20] of longint=(
-    24,89,311,103,85,54,111,23,202,63,
+    26,89,314,104,85,54,111,23,202,63,
     49,20,1,1,1,1,1,1,1,1
   );

File diff suppressed because it is too large
+ 464 - 456
compiler/msgtxt.inc


+ 289 - 211
compiler/nadd.pas

@@ -77,6 +77,14 @@ interface
            { checks whether a muln can be calculated as a 32bit }
            { * 32bit -> 64 bit                                  }
            function try_make_mul32to64: boolean;
+           { Match against the ranges, i.e.:
+             var a:1..10;
+             begin
+               if a>0 then
+                 ...
+             always evaluates to true. (DM)
+           }
+           function cmp_of_disjunct_ranges(var res : boolean) : boolean;
        end;
        taddnodeclass = class of taddnode;
 
@@ -173,6 +181,169 @@ implementation
       end;
 
 
+    function taddnode.cmp_of_disjunct_ranges(var res : boolean) : boolean;
+      var
+        hp          : tnode;
+        realdef     : tdef;
+        v           : tconstexprint;
+      begin
+        result:=false;
+        { check for comparision with known result because the ranges of the operands don't overlap }
+        if (is_constintnode(right) and (left.resultdef.typ=orddef) and
+            { don't ignore type checks }
+            is_subequal(right.resultdef,left.resultdef)) or
+           (is_constintnode(left) and (right.resultdef.typ=orddef) and
+            { don't ignore type checks }
+            is_subequal(left.resultdef,right.resultdef)) then
+           begin
+             if is_constintnode(right) then
+               begin
+                 hp:=left;
+                 v:=Tordconstnode(right).value;
+               end
+             else
+               begin
+                 hp:=right;
+                 v:=Tordconstnode(left).value;
+               end;
+
+             realdef:=hp.resultdef;
+             { stop with finding the real def when we either encounter
+                a) an explicit type conversion (then the value has to be
+                   re-interpreted)
+                b) an "absolute" type conversion (also requires
+                   re-interpretation)
+             }
+             while (hp.nodetype=typeconvn) and
+                   ([nf_internal,nf_explicit,nf_absolute] * hp.flags = []) do
+               begin
+                 hp:=ttypeconvnode(hp).left;
+                 realdef:=hp.resultdef;
+               end;
+             if is_constintnode(left) then
+               with torddef(realdef) do
+                 case nodetype of
+                  ltn:
+                    if v<low then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end
+                    else if v>=high then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  lten:
+                    if v<=low then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end
+                    else if v>high then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  gtn:
+                    if v<=low then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end
+                    else if v>high then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                  gten :
+                    if v<low then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end
+                    else if v>=high then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                  equaln:
+                    if (v<low) or (v>high) then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  unequaln:
+                    if (v<low) or (v>high) then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                 end
+             else
+               with torddef(realdef) do
+                 case nodetype of
+                  ltn:
+                    if high<v then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end
+                    else if low>=v then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  lten:
+                    if high<=v then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end
+                    else if low>v then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  gtn:
+                    if high<=v then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end
+                    else if low>v then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                  gten:
+                    if high<v then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end
+                    else if low>=v then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                  equaln:
+                    if (v<low) or (v>high) then
+                      begin
+                        result:=true;
+                        res:=false;
+                      end;
+                  unequaln:
+                    if (v<low) or (v>high) then
+                      begin
+                        result:=true;
+                        res:=true;
+                      end;
+                 end;
+           end;
+      end;
+
+
     function taddnode.simplify(forinline : boolean) : tnode;
       var
         t, hp   : tnode;
@@ -187,6 +358,7 @@ implementation
         s1,s2   : pchar;
         l1,l2   : longint;
         resultset : Tconstset;
+        res,
         b       : boolean;
       begin
         result:=nil;
@@ -334,17 +506,17 @@ implementation
                  else
                    t:=cordconstnode.create(lv and rv,resultdef,true);
                ltn :
-                 t:=cordconstnode.create(ord(lv<rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv<rv),pasbool8type,true);
                lten :
-                 t:=cordconstnode.create(ord(lv<=rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv<=rv),pasbool8type,true);
                gtn :
-                 t:=cordconstnode.create(ord(lv>rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv>rv),pasbool8type,true);
                gten :
-                 t:=cordconstnode.create(ord(lv>=rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv>=rv),pasbool8type,true);
                equaln :
-                 t:=cordconstnode.create(ord(lv=rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv=rv),pasbool8type,true);
                unequaln :
-                 t:=cordconstnode.create(ord(lv<>rv),booltype,true);
+                 t:=cordconstnode.create(ord(lv<>rv),pasbool8type,true);
                slashn :
                  begin
                    { int/int becomes a real }
@@ -358,115 +530,21 @@ implementation
              result:=t;
              exit;
           end
-        {Match against the ranges, i.e.:
-         var a:1..10;
-         begin
-           if a>0 then
-         ... always evaluates to true. (DM)}
-        else if is_constintnode(left) and (right.resultdef.typ=orddef) and
-            { don't ignore type checks }
-            is_subequal(left.resultdef,right.resultdef) then
-            begin
-              t:=nil;
-              hp:=right;
-              realdef:=hp.resultdef;
-              { stop with finding the real def when we either encounter
-                 a) an explicit type conversion (then the value has to be
-                    re-interpreted)
-                 b) an "absolute" type conversion (also requires
-                    re-interpretation)
-              }
-              while (hp.nodetype=typeconvn) and
-                    ([nf_internal,nf_explicit,nf_absolute] * hp.flags = []) do
-                begin
-                  hp:=ttypeconvnode(hp).left;
-                  realdef:=hp.resultdef;
-                end;
-              lv:=Tordconstnode(left).value;
-              with torddef(realdef) do
-                case nodetype of
-                 ltn:
-                   if lv<low then
-                     t:=Cordconstnode.create(1,booltype,true)
-                   else if lv>=high then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 lten:
-                   if lv<=low then
-                     t:=Cordconstnode.create(1,booltype,true)
-                   else if lv>high then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 gtn:
-                   if lv<=low then
-                     t:=Cordconstnode.create(0,booltype,true)
-                   else if lv>high then
-                     t:=Cordconstnode.create(1,booltype,true);
-                 gten :
-                   if lv<low then
-                     t:=Cordconstnode.create(0,booltype,true)
-                   else if lv>=high then
-                     t:=Cordconstnode.create(1,booltype,true);
-                 equaln:
-                   if (lv<low) or (lv>high) then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 unequaln:
-                   if (lv<low) or (lv>high) then
-                     t:=Cordconstnode.create(1,booltype,true);
-                end;
-              if t<>nil then
-                begin
-                  result:=t;
-                  exit;
-                end
-            end
-          else if (left.resultdef.typ=orddef) and is_constintnode(right) and
-              { don't ignore type checks }
-              is_subequal(left.resultdef,right.resultdef) then
-            begin
-              t:=nil;
-              hp:=left;
-              realdef:=hp.resultdef;
-              while (hp.nodetype=typeconvn) and
-                    ([nf_internal,nf_explicit,nf_absolute] * hp.flags = []) do
-                begin
-                  hp:=ttypeconvnode(hp).left;
-                  realdef:=hp.resultdef;
-                end;
-              rv:=Tordconstnode(right).value;
-              with torddef(realdef) do
-                case nodetype of
-                 ltn:
-                   if high<rv then
-                     t:=Cordconstnode.create(1,booltype,true)
-                   else if low>=rv then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 lten:
-                   if high<=rv then
-                     t:=Cordconstnode.create(1,booltype,true)
-                   else if low>rv then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 gtn:
-                   if high<=rv then
-                     t:=Cordconstnode.create(0,booltype,true)
-                   else if low>rv then
-                     t:=Cordconstnode.create(1,booltype,true);
-                 gten:
-                   if high<rv then
-                     t:=Cordconstnode.create(0,booltype,true)
-                   else if low>=rv then
-                     t:=Cordconstnode.create(1,booltype,true);
-                 equaln:
-                   if (rv<low) or (rv>high) then
-                     t:=Cordconstnode.create(0,booltype,true);
-                 unequaln:
-                   if (rv<low) or (rv>high) then
-                     t:=Cordconstnode.create(1,booltype,true);
-                end;
-              if t<>nil then
-                begin
-                  result:=t;
-                  exit;
-                end
-            end;
+        else if cmp_of_disjunct_ranges(res) then
+          begin
+            if res then
+              t:=Cordconstnode.create(1,pasbool8type,true)
+            else
+              t:=Cordconstnode.create(0,pasbool8type,true);
+              { don't do this optimization, if the variable expression might
+                have a side effect }
+              if (is_constintnode(left) and might_have_sideeffects(right)) or
+                (is_constintnode(right) and might_have_sideeffects(left)) then
+                t.free
+              else
+                result:=t;
+              exit;
+          end;
 
         { Add,Sub,Mul with constant 0, 1 or -1?  }
         if is_constintnode(right) and is_integer(left.resultdef) then
@@ -563,17 +641,17 @@ implementation
                 slashn :
                   t:=crealconstnode.create(lvd/rvd,resultrealdef);
                 ltn :
-                  t:=cordconstnode.create(ord(lvd<rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd<rvd),pasbool8type,true);
                 lten :
-                  t:=cordconstnode.create(ord(lvd<=rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd<=rvd),pasbool8type,true);
                 gtn :
-                  t:=cordconstnode.create(ord(lvd>rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd>rvd),pasbool8type,true);
                 gten :
-                  t:=cordconstnode.create(ord(lvd>=rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd>=rvd),pasbool8type,true);
                 equaln :
-                  t:=cordconstnode.create(ord(lvd=rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd=rvd),pasbool8type,true);
                 unequaln :
-                  t:=cordconstnode.create(ord(lvd<>rvd),booltype,true);
+                  t:=cordconstnode.create(ord(lvd<>rvd),pasbool8type,true);
                 else
                   internalerror(2008022102);
              end;
@@ -602,17 +680,17 @@ implementation
                      t:=cstringconstnode.createwstr(ws1);
                   end;
                 ltn :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<0),pasbool8type,true);
                 lten :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<=0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<=0),pasbool8type,true);
                 gtn :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>0),pasbool8type,true);
                 gten :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>=0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>=0),pasbool8type,true);
                 equaln :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)=0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)=0),pasbool8type,true);
                 unequaln :
-                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<>0),booltype,true);
+                  t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<>0),pasbool8type,true);
                 else
                   internalerror(2008022103);
              end;
@@ -676,17 +754,17 @@ implementation
                     tstringconstnode(t).changestringtype(resultdef);
                   end;
                 ltn :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<0),pasbool8type,true);
                 lten :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<=0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<=0),pasbool8type,true);
                 gtn :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>0),pasbool8type,true);
                 gten :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>=0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>=0),pasbool8type,true);
                 equaln :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)=0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)=0),pasbool8type,true);
                 unequaln :
-                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<>0),booltype,true);
+                  t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<>0),pasbool8type,true);
                 else
                   internalerror(2008022104);
              end;
@@ -724,22 +802,22 @@ implementation
                unequaln :
                   begin
                     b:=tsetconstnode(right).value_set^ <> tsetconstnode(left).value_set^;
-                    t:=cordconstnode.create(byte(b),booltype,true);
+                    t:=cordconstnode.create(byte(b),pasbool8type,true);
                   end;
                equaln :
                   begin
                     b:=tsetconstnode(right).value_set^ = tsetconstnode(left).value_set^;
-                    t:=cordconstnode.create(byte(b),booltype,true);
+                    t:=cordconstnode.create(byte(b),pasbool8type,true);
                   end;
                lten :
                   begin
                     b:=tsetconstnode(left).value_set^ <= tsetconstnode(right).value_set^;
-                    t:=cordconstnode.create(byte(b),booltype,true);
+                    t:=cordconstnode.create(byte(b),pasbool8type,true);
                   end;
                gten :
                   begin
                     b:=tsetconstnode(left).value_set^ >= tsetconstnode(right).value_set^;
-                    t:=cordconstnode.create(byte(b),booltype,true);
+                    t:=cordconstnode.create(byte(b),pasbool8type,true);
                   end;
                 else
                   internalerror(2008022105);
@@ -748,35 +826,50 @@ implementation
              exit;
           end;
 
-        { the comparison is might be expensive and the nodes are usually only
-          equal if some previous optimizations were done so don't check
-          this simplification always
-        }
-        if (cs_opt_level2 in current_settings.optimizerswitches) and
-          is_boolean(left.resultdef) and is_boolean(right.resultdef) and
-          { since the expressions might have sideeffects, we may only remove them
-            if short boolean evaluation is turned on }
-          (nf_short_bool in flags) then
-            begin
-              if left.isequal(right) then
-                begin
-                  case nodetype of
-                    andn,orn:
-                      begin
-                        result:=left;
-                        left:=nil;
-                        exit;
-                      end;
-                    {
-                    xorn:
-                      begin
-                        result:=cordconstnode.create(0,resultdef,true);
-                        exit;
-                      end;
-                    }
+        { slow simplifications }
+        if (cs_opt_level2 in current_settings.optimizerswitches) then
+          begin
+            { the comparison is might be expensive and the nodes are usually only
+              equal if some previous optimizations were done so don't check
+              this simplification always
+            }
+            if is_boolean(left.resultdef) and is_boolean(right.resultdef) and
+            { since the expressions might have sideeffects, we may only remove them
+              if short boolean evaluation is turned on }
+            (nf_short_bool in flags) then
+              begin
+                if left.isequal(right) then
+                  begin
+                    case nodetype of
+                      andn,orn:
+                        begin
+                          result:=left;
+                          left:=nil;
+                          exit;
+                        end;
+                      {
+                      xorn:
+                        begin
+                          result:=cordconstnode.create(0,resultdef,true);
+                          exit;
+                        end;
+                      }
+                    end;
                   end;
-                end;
-            end;
+              end;
+
+            { using sqr(x) for reals instead of x*x might reduces register pressure and/or
+              memory accesses while sqr(<real>) has no drawback }
+            if (nodetype=muln) and
+               is_real(left.resultdef) and is_real(right.resultdef) and
+               left.isequal(right) and
+               not(might_have_sideeffects(left)) then
+              begin
+                result:=cinlinenode.create(in_sqr_real,false,left);
+                left:=nil;
+                exit;
+              end;
+          end;
       end;
 
 
@@ -816,6 +909,7 @@ implementation
         llow,lhigh,
         rlow,rhigh  : tconstexprint;
         strtype     : tstringtype;
+        res,
         b           : boolean;
         lt,rt       : tnodetype;
         ot          : tnodetype;
@@ -826,6 +920,13 @@ implementation
 
       begin
          result:=nil;
+         { avoid any problems with type parameters later on }
+         if is_typeparam(left.resultdef) or is_typeparam(right.resultdef) then
+           begin
+             resultdef:=cundefinedtype;
+             exit;
+           end;
+
          { both left and right need to be valid }
          set_varstate(left,vs_read,[vsf_must_be_valid]);
          set_varstate(right,vs_read,[vsf_must_be_valid]);
@@ -891,17 +992,19 @@ implementation
           operation on a float and int are also handled }
 {$ifdef x86}
         { use extended as default real type only when the x87 fpu is used }
-{$ifdef i386}
+  {$ifdef i386}
         if not(current_settings.fputype=fpu_x87) then
-{$endif i386}
-{$ifdef x86_64}
-        { x86-64 has no x87 only mode, so use always double as default }
-        if true then
-{$endif x86_6}
           resultrealdef:=s64floattype
         else
-{$endif x86}
           resultrealdef:=pbestrealtype^;
+  {$endif i386}
+  {$ifdef x86_64}
+        { x86-64 has no x87 only mode, so use always double as default }
+        resultrealdef:=s64floattype;
+  {$endif x86_6}
+{$else not x86}
+        resultrealdef:=pbestrealtype^;
+{$endif not x86}
 
         if (right.resultdef.typ=floatdef) or (left.resultdef.typ=floatdef) then
          begin
@@ -1020,12 +1123,12 @@ implementation
                 begin
                   if not is_boolean(ld) then
                     begin
-                      inserttypeconv(left,booltype);
+                      inserttypeconv(left,pasbool8type);
                       ld := left.resultdef;
                     end;
                   if not is_boolean(rd) then
                     begin
-                      inserttypeconv(right,booltype);
+                      inserttypeconv(right,pasbool8type);
                       rd := right.resultdef;
                     end;
                 end;
@@ -1267,39 +1370,6 @@ implementation
              { generic ord conversion is sinttype }
              else
                begin
-                 { if the left or right value is smaller than the normal
-                   type sinttype and is unsigned, and the other value
-                   is a constant < 0, the result will always be false/true
-                   for equal / unequal nodes.
-                 }
-                 if (
-                      { left : unsigned ordinal var, right : < 0 constant }
-                      (
-                       ((is_signed(ld)=false) and (is_constintnode(left) =false)) and
-                       ((is_constintnode(right)) and (tordconstnode(right).value < 0))
-                      ) or
-                      { right : unsigned ordinal var, left : < 0 constant }
-                      (
-                       ((is_signed(rd)=false) and (is_constintnode(right) =false)) and
-                       ((is_constintnode(left)) and (tordconstnode(left).value < 0))
-                      )
-                    )  then
-                    begin
-                      if nodetype = equaln then
-                         CGMessage(type_w_signed_unsigned_always_false)
-                      else
-                      if nodetype = unequaln then
-                         CGMessage(type_w_signed_unsigned_always_true)
-                      else
-                      if (is_constintnode(left) and (nodetype in [ltn,lten])) or
-                         (is_constintnode(right) and (nodetype in [gtn,gten])) then
-                         CGMessage(type_w_signed_unsigned_always_true)
-                      else
-                      if (is_constintnode(right) and (nodetype in [ltn,lten])) or
-                         (is_constintnode(left) and (nodetype in [gtn,gten])) then
-                         CGMessage(type_w_signed_unsigned_always_false);
-                    end;
-
                  { When there is a signed type or there is a minus operation
                    we convert to signed int. Otherwise (both are unsigned) we keep
                    the result also unsigned. This is compatible with Delphi (PFV) }
@@ -1845,12 +1915,20 @@ implementation
             inserttypeconv(right,sinttype);
           end;
 
+         if cmp_of_disjunct_ranges(res) then
+           begin
+             if res then
+               CGMessage(type_w_comparison_always_true)
+             else
+               CGMessage(type_w_comparison_always_false);
+           end;
+
          { set resultdef if not already done }
          if not assigned(resultdef) then
           begin
              case nodetype of
                 ltn,lten,gtn,gten,equaln,unequaln :
-                  resultdef:=booltype;
+                  resultdef:=pasbool8type;
                 slashn :
                   resultdef:=resultrealdef;
                 addn:
@@ -2320,7 +2398,7 @@ implementation
 
         { otherwise, create the parameters for the helper }
         right := ccallparanode.create(
-          cordconstnode.create(ord(cs_check_overflow in current_settings.localswitches),booltype,true),
+          cordconstnode.create(ord(cs_check_overflow in current_settings.localswitches),pasbool8type,true),
           ccallparanode.create(right,ccallparanode.create(left,nil)));
         left := nil;
         { only qword needs the unsigned code, the
@@ -2450,7 +2528,7 @@ implementation
         if not(target_info.system in systems_wince) then
           begin
             if nodetype in [ltn,lten,gtn,gten,equaln,unequaln] then
-              resultdef:=booltype;
+              resultdef:=pasbool8type;
             result:=ctypeconvnode.create_internal(ccallnode.createintern(procname,ccallparanode.create(
                 ctypeconvnode.create_internal(right,fdef),
                 ccallparanode.create(
@@ -2611,7 +2689,7 @@ implementation
                          internalerror(2011022301);
                      end;
                      result := ccallnode.createintern(procname,
-                       ccallparanode.create(cordconstnode.create(0,booltype,false),
+                       ccallparanode.create(cordconstnode.create(0,pasbool8type,false),
                        ccallparanode.create(right,
                        ccallparanode.create(left,nil))));
                      left := nil;

+ 17 - 17
compiler/nbas.pas

@@ -123,7 +123,7 @@ interface
        { a node which will create a (non)persistent temp of a given type with a given  }
        { size (the size is separate to allow creating "void" temps with a custom size) }
        ttempcreatenode = class(tnode)
-          size: aint;
+          size: tcgint;
           tempinfo: ptempinfo;
           ftemplvalue : tnode;
           { * persistent temps are used in manually written code where the temp }
@@ -133,9 +133,9 @@ interface
           { where the node that receives the temp becomes responsible for       }
           { freeing it. In this last case, you must use only one reference      }
           { to it and *not* generate a ttempdeletenode                          }
-          constructor create(_typedef: tdef; _size: aint; _temptype: ttemptype;allowreg:boolean); virtual;
-          constructor create_withnode(_typedef: tdef; _size: aint; _temptype: ttemptype; allowreg:boolean; withnode: tnode); virtual;
-          constructor create_value(_typedef:tdef; _size: aint; _temptype: ttemptype;allowreg:boolean; templvalue: tnode);
+          constructor create(_typedef: tdef; _size: tcgint; _temptype: ttemptype;allowreg:boolean); virtual;
+          constructor create_withnode(_typedef: tdef; _size: tcgint; _temptype: ttemptype; allowreg:boolean; withnode: tnode); virtual;
+          constructor create_value(_typedef:tdef; _size: tcgint; _temptype: ttemptype;allowreg:boolean; templvalue: tnode);
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure buildderefimpl;override;
@@ -694,7 +694,7 @@ implementation
                           TEMPCREATENODE
 *****************************************************************************}
 
-    constructor ttempcreatenode.create(_typedef:tdef; _size: aint; _temptype: ttemptype;allowreg:boolean);
+    constructor ttempcreatenode.create(_typedef:tdef; _size: tcgint; _temptype: ttemptype;allowreg:boolean);
       begin
         inherited create(tempcreaten);
         size := _size;
@@ -717,14 +717,14 @@ implementation
       end;
 
 
-    constructor ttempcreatenode.create_withnode(_typedef: tdef; _size: aint; _temptype: ttemptype; allowreg:boolean; withnode: tnode);
+    constructor ttempcreatenode.create_withnode(_typedef: tdef; _size: tcgint; _temptype: ttemptype; allowreg:boolean; withnode: tnode);
       begin
         self.create(_typedef,_size,_temptype,allowreg);
         tempinfo^.withnode:=withnode.getcopy;
       end;
 
 
-    constructor ttempcreatenode.create_value(_typedef:tdef; _size: aint; _temptype: ttemptype;allowreg:boolean; templvalue: tnode);
+    constructor ttempcreatenode.create_value(_typedef:tdef; _size: tcgint; _temptype: ttemptype;allowreg:boolean; templvalue: tnode);
       begin
         self.create(_typedef,_size,_temptype,allowreg);
         // store in ppuwrite
@@ -747,27 +747,27 @@ implementation
         n.tempinfo^.typedef := tempinfo^.typedef;
         n.tempinfo^.temptype := tempinfo^.temptype;
         n.tempinfo^.flags := tempinfo^.flags * tempinfostoreflags;
-        if assigned(tempinfo^.withnode) then
-          n.tempinfo^.withnode := tempinfo^.withnode.getcopy
-        else
-          n.tempinfo^.withnode := nil;
-
-        if assigned(tempinfo^.tempinitcode) then
-          n.tempinfo^.tempinitcode := tempinfo^.tempinitcode.getcopy
-        else
-          n.tempinfo^.tempinitcode := nil;
 
         { when the tempinfo has already a hookoncopy then it is not
           reset by a tempdeletenode }
         if assigned(tempinfo^.hookoncopy) then
           internalerror(200211262);
-
         { signal the temprefs that the temp they point to has been copied, }
         { so that if the refs get copied as well, they can hook themselves }
         { to the copy of the temp                                          }
         tempinfo^.hookoncopy := n.tempinfo;
         exclude(tempinfo^.flags,ti_nextref_set_hookoncopy_nil);
 
+        if assigned(tempinfo^.withnode) then
+          n.tempinfo^.withnode := tempinfo^.withnode.getcopy
+        else
+          n.tempinfo^.withnode := nil;
+
+        if assigned(tempinfo^.tempinitcode) then
+          n.tempinfo^.tempinitcode := tempinfo^.tempinitcode.getcopy
+        else
+          n.tempinfo^.tempinitcode := nil;
+
         result := n;
       end;
 

+ 19 - 4
compiler/ncal.pas

@@ -1877,6 +1877,11 @@ implementation
           firstpass would be called multiple times }
         include(callnodeflags,cnf_objc_processed);
 
+        { make sure the methodpointer doesn't get translated into a call
+          as well (endless loop) }
+        if methodpointer.nodetype=loadvmtaddrn then
+          tloadvmtaddrnode(methodpointer).forcall:=true;
+
         { A) set the appropriate objc_msgSend* variant to call }
 
         { record returned via implicit pointer }
@@ -1938,6 +1943,10 @@ implementation
                 (selftree.resultdef.typ<>classrefdef) then
                begin
                  selftree:=cloadvmtaddrnode.create(selftree);
+                 { since we're in a class method of the current class, its
+                   information has already been initialized (and that of all of
+                   its parent classes too) }
+                 tloadvmtaddrnode(selftree).forcall:=true;
                  typecheckpass(selftree);
                end;
              selfrestype:=selftree.resultdef;
@@ -1981,6 +1990,9 @@ implementation
                 (methodpointer.resultdef.typ<>classrefdef)) then
               begin
                 methodpointer:=cloadvmtaddrnode.create(methodpointer);
+                { no need to obtain the class ref by calling class(), sending
+                  this message will initialize it if necessary }
+                tloadvmtaddrnode(methodpointer).forcall:=true;
                 firstpass(methodpointer);
               end;
           end;
@@ -2013,7 +2025,10 @@ implementation
                 vmttree:=methodpointer.getcopy;
                 { Only a typenode can be passed when it is called with <class of xx>.create }
                 if vmttree.nodetype=typen then
-                  vmttree:=cloadvmtaddrnode.create(vmttree);
+                  begin
+                    vmttree:=cloadvmtaddrnode.create(vmttree);
+                    tloadvmtaddrnode(vmttree).forcall:=true;
+                  end;
               end
             else
               begin
@@ -2347,12 +2362,12 @@ implementation
                 else
                  if vo_is_range_check in para.parasym.varoptions then
                    begin
-                     para.left:=cordconstnode.create(Ord(cs_check_range in current_settings.localswitches),booltype,false);
+                     para.left:=cordconstnode.create(Ord(cs_check_range in current_settings.localswitches),pasbool8type,false);
                    end
                 else
                  if vo_is_overflow_check in para.parasym.varoptions then
                    begin
-                     para.left:=cordconstnode.create(Ord(cs_check_overflow in current_settings.localswitches),booltype,false);
+                     para.left:=cordconstnode.create(Ord(cs_check_overflow in current_settings.localswitches),pasbool8type,false);
                    end
                 else
                   if vo_is_msgsel in para.parasym.varoptions then
@@ -2723,7 +2738,7 @@ implementation
                                     ((m_delphi in current_settings.modeswitches) and (cnf_anon_inherited in callnodeflags));
                   candidates:=tcallcandidates.create(symtableprocentry,symtableproc,left,ignorevisibility,
                     not(nf_isproperty in flags),cnf_objc_id_call in callnodeflags,cnf_unit_specified in callnodeflags,
-                    callnodeflags*[cnf_anon_inherited,cnf_inherited]=[]);
+                    callnodeflags*[cnf_anon_inherited,cnf_inherited]=[],cnf_anon_inherited in callnodeflags);
 
                    { no procedures found? then there is something wrong
                      with the parameter size or the procedures are

+ 34 - 12
compiler/ncgadd.pas

@@ -303,6 +303,13 @@ interface
                   if (right.location.size<>left.location.size) or
                      (location.size<>left.location.size) then
                     internalerror(2010123001);
+                  { make sure that location.register is different from
+                    left.location.register, since right will overwrite it
+                    and we'll use left afterwards }
+                  if (right.location.loc=LOC_REGISTER) then
+                    location.register:=right.location.register
+                  else
+                    location.register:=cg.getintregister(current_asmdata.CurrAsmList,location.size);
                   { make sure we don't modify left/right.location, because we told
                     force_reg_left_right above that they can be constant }
                   cg.a_op_reg_reg(current_asmdata.CurrAsmList,OP_NOT,location.size,right.location.register,location.register);
@@ -342,14 +349,14 @@ interface
       begin
         if nodetype<>addn then
           internalerror(20080302);
-        { setelementn is a special case, it must be on right }
-        if (nf_swapped in flags) and
-           (left.nodetype=setelementn) then
-          swapleftright;
         { no range support for smallsets }
         if assigned(tsetelementnode(right).right) then
           internalerror(20080303);
         pass_left_right;
+        { setelementn is a special case, it must be on right }
+        if (nf_swapped in flags) and
+           (left.nodetype=setelementn) then
+          swapleftright;
         force_reg_left_right(false,false);
         set_result_location_reg;
         setbase:=tsetdef(left.resultdef).setbase;
@@ -463,15 +470,30 @@ interface
               else
                  internalerror(200203247);
             end;
-
-            if right.location.loc <> LOC_CONSTANT then
-              cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
-                 left.location.register,right.location.register,
-                 location.register)
+{$ifndef cpu64bitalu}
+            if right.location.size in [OS_64,OS_S64] then
+              begin
+                if right.location.loc <> LOC_CONSTANT then
+                  cg64.a_op64_reg_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
+                     left.location.register64,right.location.register64,
+                     location.register64)
+                else
+                  cg64.a_op64_const_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
+                     right.location.value,left.location.register64,
+                     location.register64);
+              end
             else
-              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
-                 right.location.value,left.location.register,
-                 location.register);
+{$endif cpu64bitalu}
+              begin
+                if right.location.loc <> LOC_CONSTANT then
+                  cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
+                     left.location.register,right.location.register,
+                     location.register)
+                else
+                  cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,cgop,location.size,
+                     right.location.value,left.location.register,
+                     location.register);
+              end;
          end;
       end;
 

+ 8 - 7
compiler/ncgrtti.pas

@@ -452,7 +452,7 @@ implementation
           end;
           { we need to align by Tconstptruint here to satisfy the alignment rules set by
             records: in the typinfo unit we overlay a TTypeData record on this data, which at
-            the innermost variant record needs an alignment of TConstPtrUint due to e.g. 
+            the innermost variant record needs an alignment of TConstPtrUint due to e.g.
             the "CompType" member for tkSet (also the "BaseType" member for tkEnumeration).
             We need to adhere to this, otherwise things will break.
             Note that other code (e.g. enumdef_rtti_calcstringtablestart()) relies on the
@@ -490,7 +490,8 @@ implementation
               (otUByte{otNone},
                otUByte,otUWord,otULong,otUByte{otNone},
                otSByte,otSWord,otSLong,otUByte{otNone},
-               otUByte,otSByte,otSWord,otSLong,otSByte,
+               otUByte,otUWord,otULong,otUByte,
+               otSByte,otSWord,otSLong,otSByte,
                otUByte,otUWord,otUByte);
           begin
             write_header(def,typekind);
@@ -523,7 +524,7 @@ implementation
                 { high }
                 current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_64bit(def.high.svalue));
               end;
-            pasbool:
+            pasbool8:
                 dointeger(tkBool);
             uchar:
                 dointeger(tkChar);
@@ -698,18 +699,18 @@ implementation
                  potype_class_constructor: methodkind:=mkClassConstructor;
                  potype_class_destructor: methodkind:=mkClassDestructor;
                  potype_operator: methodkind:=mkOperatorOverload;
-                 potype_procedure: 
-                   if po_classmethod in def.procoptions then 
+                 potype_procedure:
+                   if po_classmethod in def.procoptions then
                      methodkind:=mkClassProcedure
                    else
                      methodkind:=mkProcedure;
                  potype_function:
-                   if po_classmethod in def.procoptions then 
+                   if po_classmethod in def.procoptions then
                      methodkind:=mkClassFunction
                    else
                      methodkind:=mkFunction;
                else
-                 begin                   
+                 begin
                    if def.returndef = voidtype then
                      methodkind:=mkProcedure
                    else

+ 21 - 4
compiler/ncgutil.pas

@@ -1037,7 +1037,11 @@ implementation
                       tmploc:=l;
                       location_force_mem(list,tmploc);
                       cg.a_load_loc_cgpara(list,tmploc,cgpara);
-                      location_freetemp(list,tmploc);
+                      { do not free the tmploc in case the original value was
+                        already in memory, because the caller (ncgcal) will then
+                        free it again later }
+                      if not(l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
+                        location_freetemp(list,tmploc);
                     end
                   else
 {$endif not cpu64bitalu}
@@ -1506,7 +1510,10 @@ implementation
         include(current_procinfo.flags,pi_needs_implicit_finally);
         OldAsmList:=current_asmdata.CurrAsmList;
         current_asmdata.CurrAsmList:=asmlist;
-        hp:=finalize_data_node(cloadnode.create(sym,sym.owner));
+        hp:=cloadnode.create(sym,sym.owner);
+        if (sym.typ=staticvarsym) and (vo_force_finalize in tstaticvarsym(sym).varoptions) then
+          include(hp.flags,nf_isinternal_ignoreconst);
+        hp:=finalize_data_node(hp);
         firstpass(hp);
         secondpass(hp);
         hp.free;
@@ -1544,7 +1551,10 @@ implementation
                     they may also be used in another unit
                   }
                   (tstaticvarsym(p).owner.symtabletype=globalsymtable)) and
-                 (tstaticvarsym(p).varspez<>vs_const) and
+                  (
+                    (tstaticvarsym(p).varspez<>vs_const) or
+                    (vo_force_finalize in tstaticvarsym(p).varoptions)
+                  ) and
                  not(vo_is_funcret in tstaticvarsym(p).varoptions) and
                  not(vo_is_external in tstaticvarsym(p).varoptions) and
                  is_managed_type(tstaticvarsym(p).vardef) then
@@ -2533,7 +2543,7 @@ implementation
             sectype:=sec_bss;
           end;
         maybe_new_object_file(list);
-        if sym.section<>'' then
+        if vo_has_section in sym.varoptions then
           new_section(list,sec_user,sym.section,varalign)
         else
           new_section(list,sectype,lower(sym.mangledname),varalign);
@@ -2789,6 +2799,8 @@ implementation
         oldhi, newhi: tregister;
 {$endif not cpu64bitalu}
         ressym: tsym;
+        { moved sym }
+        sym : tsym;
       end;
 
 
@@ -2820,6 +2832,7 @@ implementation
                       exit;
 {$endif not cpu64bitalu}
                   tabstractnormalvarsym(tloadnode(n).symtableentry).localloc.register := rr^.new;
+                  rr^.sym := tabstractnormalvarsym(tloadnode(n).symtableentry);
                   result := fen_norecurse_true;
                 end;
             end;
@@ -2865,6 +2878,7 @@ implementation
           exit;
         rr.old := n.location.register;
         rr.ressym := nil;
+        rr.sym := nil;
       {$ifndef cpu64bitalu}
         rr.oldhi := NR_NO;
       {$endif not cpu64bitalu}
@@ -2928,6 +2942,9 @@ implementation
               internalerror(2006090920);
           end;
 
+        if assigned(rr.sym) then
+          list.concat(tai_varloc.create(rr.sym,rr.new));
+
         { now that we've change the loadn/temp, also change the node result location }
       {$ifndef cpu64bitalu}
         if (n.location.size in [OS_64,OS_S64]) then

+ 8 - 5
compiler/ncnv.pas

@@ -913,7 +913,7 @@ implementation
             addstatement(newstat,restemp);
             addstatement(newstat,ccallnode.createintern('fpc_'+chartype+'array_to_shortstr',
               ccallparanode.create(cordconstnode.create(
-                ord(tarraydef(left.resultdef).lowrange=0),booltype,false),
+                ord(tarraydef(left.resultdef).lowrange=0),pasbool8type,false),
               ccallparanode.create(left,ccallparanode.create(
               ctemprefnode.create(restemp),nil)))));
             addstatement(newstat,ctempdeletenode.create_normal_temp(restemp));
@@ -924,7 +924,7 @@ implementation
           result:=ccallnode.createinternres(
             'fpc_'+chartype+'array_to_'+tstringdef(resultdef).stringtypname,
             ccallparanode.create(cordconstnode.create(
-               ord(tarraydef(left.resultdef).lowrange=0),booltype,false),
+               ord(tarraydef(left.resultdef).lowrange=0),pasbool8type,false),
              ccallparanode.create(left,nil)),resultdef);
         left:=nil;
       end;
@@ -2137,7 +2137,10 @@ implementation
           ordconstn:
             inserttypeconv_internal(n,todef);
           typeconvn:
-            n.resultdef:=todef;
+            begin
+              n.resultdef:=todef;
+              ttypeconvnode(n).totypedef:=todef;
+            end;
         end;
       end;
 {$endif not cpu64bitalu}
@@ -3347,7 +3350,7 @@ implementation
               CGMessage1(type_e_class_or_cominterface_type_expected,left.resultdef.typename);
             case nodetype of
               isn:
-                resultdef:=booltype;
+                resultdef:=pasbool8type;
               asn:
                 resultdef:=tclassrefdef(right.resultdef).pointeddef;
             end;
@@ -3361,7 +3364,7 @@ implementation
 
             case nodetype of
               isn:
-                resultdef:=booltype;
+                resultdef:=pasbool8type;
               asn:
                 resultdef:=right.resultdef;
             end;

+ 17 - 12
compiler/nflw.pas

@@ -457,7 +457,7 @@ implementation
           one }
         hp:=cwhilerepeatnode.create(
           { repeat .. until false }
-          cordconstnode.create(0,booltype,false),innerloop,false,true);
+          cordconstnode.create(0,pasbool8type,false),innerloop,false,true);
         addstatement(outerloopbodystatement,hp);
 
         { create the outer repeat/until and add it to the the main body }
@@ -1070,10 +1070,11 @@ implementation
          if codegenerror then
            exit;
 
-         if not is_boolean(left.resultdef) then
+         if not(is_boolean(left.resultdef)) and
+           not(is_typeparam(left.resultdef)) then
            begin
              if left.resultdef.typ=variantdef then
-               inserttypeconv(left,booltype)
+               inserttypeconv(left,pasbool8type)
              else
                CGMessage1(type_e_boolean_expr_expected,left.resultdef.typename);
            end;
@@ -1310,7 +1311,7 @@ implementation
             end;
         if not is_constboolnode(condition) then
             aktstate.store_fact(condition,
-             cordconstnode.create(byte(checknegate),booltype,true))
+             cordconstnode.create(byte(checknegate),pasbool8type,true))
         else
             condition.destroy;
     end;
@@ -1382,10 +1383,11 @@ implementation
          if codegenerror then
            exit;
 
-         if not is_boolean(left.resultdef) then
+         if not(is_boolean(left.resultdef)) and
+           not(is_typeparam(left.resultdef)) then
            begin
              if left.resultdef.typ=variantdef then
-               inserttypeconv(left,booltype)
+               inserttypeconv(left,pasbool8type)
              else
                Message1(type_e_boolean_expr_expected,left.resultdef.typename);
            end;
@@ -1569,10 +1571,17 @@ implementation
 
 
     function texitnode.pass_typecheck:tnode;
+      var
+        newstatement : tstatementnode;
       begin
         result:=nil;
         if assigned(left) then
-          typecheckpass(left);
+          begin
+             result:=internalstatements(newstatement);
+             addstatement(newstatement,left);
+             left:=nil;
+             addstatement(newstatement,self.getcopy);
+          end;
         resultdef:=voidtype;
       end;
 
@@ -1582,11 +1591,7 @@ implementation
          result:=nil;
          expectloc:=LOC_VOID;
          if assigned(left) then
-           begin
-              firstpass(left);
-              if codegenerror then
-               exit;
-           end;
+           internalerror(2011052801);
       end;
 
 

+ 24 - 7
compiler/ninl.pas

@@ -314,7 +314,8 @@ implementation
             scurrency,
             s64bit:
               procname := procname + 'int64';
-            pasbool,bool8bit,bool16bit,bool32bit,bool64bit:
+            pasbool8,pasbool16,pasbool32,pasbool64,
+            bool8bit,bool16bit,bool32bit,bool64bit:
               procname := procname + 'bool';
 {$endif}
             else
@@ -511,7 +512,10 @@ implementation
                       readfunctype:=s64currencytype;
                       is_real:=true;
                     end;
-                  pasbool,
+                  pasbool8,
+                  pasbool16,
+                  pasbool32,
+                  pasbool64,
                   bool8bit,
                   bool16bit,
                   bool32bit,
@@ -524,7 +528,7 @@ implementation
                     else
                       begin
                         name := procprefixes[do_read]+'boolean';
-                        readfunctype:=booltype;
+                        readfunctype:=pasbool8type;
                       end
                   else
                     begin
@@ -746,7 +750,7 @@ implementation
                   { zero-based                                       }
                   if para.left.resultdef.typ=arraydef then
                     para := ccallparanode.create(cordconstnode.create(
-                      ord(tarraydef(para.left.resultdef).lowrange=0),booltype,false),para);
+                      ord(tarraydef(para.left.resultdef).lowrange=0),pasbool8type,false),para);
                   { create the call statement }
                   addstatement(Tstatementnode(newstatement),
                     ccallnode.createintern(name,para));
@@ -1635,7 +1639,7 @@ implementation
                    else
                      hp:=create_simplified_ord_const(sqr(vl.uvalue),resultdef,forinline);
                  in_const_odd :
-                   hp:=cordconstnode.create(qword(odd(int64(vl))),booltype,true);
+                   hp:=cordconstnode.create(qword(odd(int64(vl))),pasbool8type,true);
                  in_const_swap_word :
                    hp:=cordconstnode.create((vl and $ff) shl 8+(vl shr 8),left.resultdef,true);
                  in_const_swap_long :
@@ -1691,19 +1695,32 @@ implementation
                     orddef :
                       begin
                         case torddef(left.resultdef).ordtype of
-                          pasbool,
+                          pasbool8,
                           uchar:
                             begin
                               { change to byte() }
                               result:=ctypeconvnode.create_internal(left,u8inttype);
                               left:=nil;
                             end;
+                          pasbool16,
                           uwidechar :
                             begin
                               { change to word() }
                               result:=ctypeconvnode.create_internal(left,u16inttype);
                               left:=nil;
                             end;
+                          pasbool32 :
+                            begin
+                              { change to dword() }
+                              result:=ctypeconvnode.create_internal(left,u32inttype);
+                              left:=nil;
+                            end;
+                          pasbool64 :
+                            begin
+                              { change to qword() }
+                              result:=ctypeconvnode.create_internal(left,u64inttype);
+                              left:=nil;
+                            end;
                           bool8bit:
                             begin
                               { change to shortint() }
@@ -2357,7 +2374,7 @@ implementation
                     in procvar handling between FPC and Delphi handling, so
                     handle specially }
                   set_varstate(tcallparanode(left).left,vs_read,[vsf_must_be_valid]);
-                  resultdef:=booltype;
+                  resultdef:=pasbool8type;
                 end;
 
               in_ofs_x :

+ 10 - 1
compiler/nld.pas

@@ -625,7 +625,16 @@ implementation
           begin
             { check if the assignment may cause a range check error }
             check_ranges(fileinfo,right,left.resultdef);
-            inserttypeconv(right,left.resultdef);
+
+            { beginners might be confused about an error message like
+              Incompatible types: got "untyped" expected "LongInt"
+              when trying to assign the result of a procedure, so give
+              a better error message, see also #19122 }
+            if (left.resultdef.typ<>procvardef) and
+              (right.nodetype=calln) and is_void(right.resultdef) then
+              CGMessage(type_e_procedures_return_no_value)
+            else
+              inserttypeconv(right,left.resultdef);
           end;
 
         { call helpers for interface }

+ 5 - 2
compiler/nmat.pas

@@ -884,14 +884,17 @@ implementation
              v:=tordconstnode(left).value;
              def:=left.resultdef;
              case torddef(left.resultdef).ordtype of
-               pasbool,
+               pasbool8,
+               pasbool16,
+               pasbool32,
+               pasbool64,
                bool8bit,
                bool16bit,
                bool32bit,
                bool64bit:
                  begin
                    v:=byte(not(boolean(int64(v))));
-                   if (torddef(left.resultdef).ordtype<>pasbool) then
+                   if is_cbool(left.resultdef) then
                      v:=-v;
                  end;
                uchar,

+ 36 - 0
compiler/nmem.pas

@@ -31,9 +31,17 @@ interface
 
     type
        tloadvmtaddrnode = class(tunarynode)
+          { unless this is for a call, we have to send the "class" message to
+            the objctype because the type information only gets initialized
+            after the first message has been sent -> crash if you pass an
+            uninitialized type to e.g. class_getInstanceSize() or so. No need
+            to save to/restore from ppu. }
+          forcall: boolean;
           constructor create(l : tnode);virtual;
           function pass_1 : tnode;override;
           function pass_typecheck:tnode;override;
+          function docompare(p: tnode): boolean; override;
+          function dogetcopy: tnode; override;
        end;
        tloadvmtaddrnodeclass = class of tloadvmtaddrnode;
 
@@ -190,6 +198,21 @@ implementation
       end;
 
 
+    function tloadvmtaddrnode.docompare(p: tnode): boolean;
+      begin
+        result:=inherited docompare(p);
+        if result then
+          result:=forcall=tloadvmtaddrnode(p).forcall;
+      end;
+
+
+    function tloadvmtaddrnode.dogetcopy: tnode;
+      begin
+        result:=inherited dogetcopy;
+        tloadvmtaddrnode(result).forcall:=forcall;
+      end;
+
+
     function tloadvmtaddrnode.pass_1 : tnode;
       var
         vs: tsym;
@@ -229,6 +252,19 @@ implementation
                else if (left.resultdef.typ=objectdef) then
                  tobjectdef(left.resultdef).register_maybe_created_object_type
              end
+           end
+         else if is_objcclass(left.resultdef) and
+              not(forcall) then
+           begin
+             { call "class" method (= "classclass" in FPC), because otherwise
+               we may use the class information before it has been
+               initialized }
+             vs:=search_struct_member(tobjectdef(left.resultdef),'CLASSCLASS');
+             if not assigned(vs) or
+                (vs.typ<>procsym) then
+               internalerror(2011080601);
+             { can't reuse "self", because it will be freed when we return }
+             result:=ccallnode.create(nil,tprocsym(vs),vs.owner,self.getcopy,[]);
            end;
       end;
 

+ 9 - 4
compiler/nobj.pas

@@ -266,7 +266,7 @@ implementation
             end;
 
           { compare parameter types only, no specifiers yet }
-          hasequalpara:=(compare_paras(vmtpd.paras,pd.paras,cp_none,[cpo_ignoreuniv])>=te_equal);
+          hasequalpara:=(compare_paras(vmtpd.paras,pd.paras,cp_none,[cpo_ignoreuniv,cpo_ignorehidden])>=te_equal);
 
           { check that we are not trying to override a final method }
           if (po_finalmethod in vmtpd.procoptions) and
@@ -352,7 +352,7 @@ implementation
 
                   { All parameter specifiers and some procedure the flags have to match
                     except abstract and override }
-                  if (compare_paras(vmtpd.paras,pd.paras,cp_all,[cpo_ignoreuniv])<te_equal) or
+                  if (compare_paras(vmtpd.paras,pd.paras,cp_all,[cpo_ignoreuniv,cpo_ignorehidden])<te_equal) or
                      (vmtpd.proccalloption<>pd.proccalloption) or
                      (vmtpd.proctypeoption<>pd.proctypeoption) or
                      ((vmtpd.procoptions*po_comp)<>(pd.procoptions*po_comp)) then
@@ -529,14 +529,19 @@ implementation
               begin
                 { Find implementing procdef
                    1. Check for mapped name
-                   2. Use symbol name }
+                   2. Use symbol name, but only if there's no mapping,
+                      or we're processing ancestor of interface.
+                  When modifying this code, ensure that webtbs/tw11862, webtbs/tw4950
+                  and webtbf/tw19591 stay correct. }
                 implprocdef:=nil;
                 hs:=prefix+tprocdef(def).procsym.name;
                 mappedname:=ImplIntf.GetMapping(hs);
                 if mappedname<>'' then
                   implprocdef:=intf_search_procdef_by_name(tprocdef(def),mappedname);
                 if not assigned(implprocdef) then
-                  implprocdef:=intf_search_procdef_by_name(tprocdef(def),tprocdef(def).procsym.name);
+                  if (mappedname='') or (ImplIntf.IntfDef<>IntfDef) then
+                    implprocdef:=intf_search_procdef_by_name(tprocdef(def),tprocdef(def).procsym.name);
+
                 { Add procdef to the implemented interface }
                 if assigned(implprocdef) then
                   begin

+ 6 - 6
compiler/nset.pas

@@ -213,7 +213,7 @@ implementation
 
       begin
          result:=nil;
-         resultdef:=booltype;
+         resultdef:=pasbool8type;
          typecheckpass(right);
          set_varstate(right,vs_read,[vsf_must_be_valid]);
          if codegenerror then
@@ -256,7 +256,7 @@ implementation
              }
              if  (
                    (left.resultdef.typ = orddef) and not
-                   (torddef(left.resultdef).ordtype in [s8bit,u8bit,uchar,pasbool,bool8bit])
+                   (torddef(left.resultdef).ordtype in [s8bit,u8bit,uchar,pasbool8,bool8bit])
                  )
                 or
                  (
@@ -294,7 +294,7 @@ implementation
             ((right.nodetype = setconstn) and
              (tnormalset(tsetconstnode(right).value_set^) = [])) then
           begin
-            t:=cordconstnode.create(0,booltype,false);
+            t:=cordconstnode.create(0,pasbool8type,false);
             typecheckpass(t);
             result:=t;
             exit;
@@ -321,10 +321,10 @@ implementation
                  { into account                                             }
                  if Tordconstnode(left).value.signed then
                    t:=cordconstnode.create(byte(tordconstnode(left).value.svalue in Tsetconstnode(right).value_set^),
-                     booltype,true)
+                     pasbool8type,true)
                  else
                    t:=cordconstnode.create(byte(tordconstnode(left).value.uvalue in Tsetconstnode(right).value_set^),
-                     booltype,true);
+                     pasbool8type,true);
                  typecheckpass(t);
                  result:=t;
                  exit;
@@ -334,7 +334,7 @@ implementation
                  if (Tordconstnode(left).value<int64(tsetdef(right.resultdef).setbase)) or
                     (Tordconstnode(left).value>int64(Tsetdef(right.resultdef).setmax)) then
                    begin
-                     t:=cordconstnode.create(0, booltype, true);
+                     t:=cordconstnode.create(0, pasbool8type, true);
                      typecheckpass(t);
                      result:=t;
                      exit;

+ 22 - 0
compiler/nutils.pas

@@ -109,6 +109,8 @@ interface
       represented by n }
     function genloadfield(n: tnode; const fieldname: string): tnode;
 
+    { returns true, if the tree given might have side effects }
+    function might_have_sideeffects(n : tnode) : boolean;
 
 implementation
 
@@ -1213,4 +1215,24 @@ implementation
         end;
       end;
 
+
+    function check_for_sideeffect(var n: tnode; arg: pointer): foreachnoderesult;
+      begin
+        result:=fen_false;
+        if (n.nodetype in [assignn,calln,asmn]) or
+          ((n.nodetype=inlinen) and
+           (tinlinenode(n).inlinenumber in [in_write_x,in_writeln_x,in_read_x,in_readln_x,in_str_x_string,
+             in_val_x,in_reset_x,in_rewrite_x,in_reset_typedfile,in_rewrite_typedfile,in_settextbuf_file_x,
+             in_inc_x,in_dec_x,in_include_x_y,in_exclude_x_y,in_break,in_continue,in_setlength_x,
+             in_finalize_x,in_new_x,in_dispose_x,in_exit,in_copy_x,in_initialize_x,in_leave,in_cycle])
+          ) then
+          result:=fen_norecurse_true;
+      end;
+
+
+    function might_have_sideeffects(n : tnode) : boolean;
+      begin
+        result:=foreachnodestatic(n,@check_for_sideeffect,nil);
+      end;
+
 end.

+ 33 - 22
compiler/ogbase.pas

@@ -439,7 +439,7 @@ interface
         function  writeData:boolean;virtual;abstract;
         property CExeSection:TExeSectionClass read FCExeSection write FCExeSection;
         property CObjData:TObjDataClass read FCObjData write FCObjData;
-        procedure Order_ObjSectionList(ObjSectionList : TFPObjectList);virtual;
+        procedure Order_ObjSectionList(ObjSectionList : TFPObjectList; const aPattern:string);virtual;
       public
         CurrDataPos  : aword;
         MaxMemPos    : qword;
@@ -913,7 +913,7 @@ implementation
     function TObjData.sectiontype2options(atype:TAsmSectiontype):TObjSectionOptions;
       const
         secoptions : array[TAsmSectiontype] of TObjSectionOptions = ([],
-          {user} [oso_Data,oso_load,oso_write,oso_executable,oso_keep],
+          {user} [oso_Data,oso_load,oso_write,oso_keep],
           {code} [oso_Data,oso_load,oso_readonly,oso_executable,oso_keep],
           {Data} [oso_Data,oso_load,oso_write,oso_keep],
 { TODO: Fix sec_rodata be read-only-with-relocs}
@@ -921,7 +921,11 @@ implementation
 { TODO: Fix sec_rodata_norel be read-only/constant}
           {roData_norel} [oso_Data,oso_load,oso_write,oso_keep],
           {bss} [oso_load,oso_write,oso_keep],
-          {threadvar} [oso_load,oso_write],
+          {threadvar} [oso_load,oso_write
+{$ifdef FPC_USE_TLS_DIRECTORY}
+                       ,oso_keep
+{$endif FPC_USE_TLS_DIRECTORY}
+          ],
           {pdata} [oso_load,oso_readonly,oso_keep],
           {stub} [oso_Data,oso_load,oso_readonly,oso_executable],
           {data_nonlazy}  [oso_Data,oso_load,oso_write],
@@ -1595,7 +1599,7 @@ implementation
 
     procedure TExeOutput.Load_EntryName(const aname:string);
       begin
-        EntryName:=aname;
+        FEntryName:=aname;
       end;
 
 
@@ -1694,7 +1698,7 @@ implementation
               end;
           end;
         { Order list if needed }
-        Order_ObjSectionList(TmpObjSectionList);
+        Order_ObjSectionList(TmpObjSectionList,aname);
         { Add the (ordered) list to the current ExeSection }
         for i:=0 to TmpObjSectionList.Count-1 do
           begin
@@ -1705,7 +1709,7 @@ implementation
       end;
 
 
-    procedure TExeOutput.Order_ObjSectionList(ObjSectionList : TFPObjectList);
+    procedure TExeOutput.Order_ObjSectionList(ObjSectionList : TFPObjectList; const aPattern:string);
       begin
       end;
 
@@ -1805,27 +1809,34 @@ implementation
           if oneval<>'' then
             begin
               if oneval[1]='-' then
-                val(oneval,signedval,code)
+                begin
+                  val(oneval,signedval,code);
+                  anumval:=qword(signedval);
+                end
               else
                 val(oneval,anumval,code);
               if code<>0 then
                 Comment(V_Error,'Invalid number '+avalue)
-              else if (indexpos<MAXVAL) then
+              else
                 begin
-                  anumval:=qword(signedval);
-                  if source_info.endian<>target_info.endian then
-                    swapendian(anumval);
-                  { No range checking here }
-
-                  if bytesize=1 then
-                    bytevalues[indexpos]:=byte(anumval)
-                  else if bytesize=2 then
-                    twobytevalues[indexpos]:=word(anumval)
-                  else if bytesize=4 then
-                    fourbytevalues[indexpos]:=dword(anumval)
-                  else if bytesize=8 then
-                    eightbytevalues[indexpos]:=anumval;
-                  inc(indexpos);
+                  if (indexpos<MAXVAL) then
+                    begin
+                      if source_info.endian<>target_info.endian then
+                        swapendian(anumval);
+                      { No range checking here }
+
+                      if bytesize=1 then
+                        bytevalues[indexpos]:=byte(anumval)
+                      else if bytesize=2 then
+                        twobytevalues[indexpos]:=word(anumval)
+                      else if bytesize=4 then
+                        fourbytevalues[indexpos]:=dword(anumval)
+                      else if bytesize=8 then
+                        eightbytevalues[indexpos]:=anumval;
+                      inc(indexpos);
+                    end
+                  else
+                    Comment(V_Error,'Buffer overrun in Order_values');
                 end;
             end;
         until allvals='';

+ 129 - 15
compiler/ogcoff.pas

@@ -235,7 +235,7 @@ interface
          procedure ExeSectionList_write_data(p:TObject;arg:pointer);
        protected
          function writedata:boolean;override;
-         procedure Order_ObjSectionList(ObjSectionList : TFPObjectList);override;
+         procedure Order_ObjSectionList(ObjSectionList : TFPObjectList;const aPattern:string);override;
        public
          constructor createcoff(awin32:boolean);
          procedure MemPos_Header;override;
@@ -282,14 +282,17 @@ interface
 {$ifdef i386}
        COFF_MAGIC       = $14c;
        COFF_OPT_MAGIC   = $10b;
+       TLSDIR_SIZE      = $18;
 {$endif i386}
 {$ifdef arm}
        COFF_MAGIC       = $1c0;
        COFF_OPT_MAGIC   = $10b;
+       TLSDIR_SIZE      = $18;
 {$endif arm}
 {$ifdef x86_64}
        COFF_MAGIC       = $8664;
        COFF_OPT_MAGIC   = $20b;
+       TLSDIR_SIZE      = $28;
 {$endif x86_64}
     function ReadDLLImports(const dllname:string;readdllproc:Treaddllproc):boolean;
 
@@ -484,6 +487,14 @@ implementation
          aux     : byte;
        end;
 
+       { This is defined in rtl/win/sysos.inc source }
+       tlsdirectory=packed record
+         data_start, data_end : PUInt;
+         index_pointer, callbacks_pointer : PUInt;
+         zero_fill_size : dword;
+         flags : dword;
+       end;
+
      const
        SymbolMaxGrow = 200*sizeof(coffsymbol);
        StrsMaxGrow   = 8192;
@@ -1017,6 +1028,8 @@ const pemagic : array[0..3] of byte = (
         createsection(sec_code);
         createsection(sec_data);
         createsection(sec_bss);
+        if tf_section_threadvars in target_info.flags then
+          createsection(sec_threadvar);
       end;
 
 
@@ -2097,12 +2110,18 @@ const pemagic : array[0..3] of byte = (
             else
               sechdr.vsize:=mempos;
 
-            { sechdr.dataSize is size of initilized data. For .bss section it must be zero }
-            if (Name <> '.bss') then
-              sechdr.dataSize:=Size;
-            if (sechdr.dataSize>0) and
-               (oso_data in SecOptions) then
-              sechdr.datapos:=datapos;
+            { sechdr.dataSize is size of initilized data. Must be zero for sections that
+              do not contain one. In Windows it must be rounded up to FileAlignment
+              (so it can be greater than VirtualSize) }
+            if (oso_data in SecOptions) then
+              begin
+                if win32 then
+                  sechdr.dataSize:=Align(Size,SectionDataAlign)
+                else
+                  sechdr.dataSize:=Size;
+                if (Size>0) then
+                  sechdr.datapos:=datapos;
+              end;
             sechdr.nrelocs:=0;
             sechdr.relocpos:=0;
             if win32 then
@@ -2112,6 +2131,10 @@ const pemagic : array[0..3] of byte = (
                   sechdr.flags:=peencodesechdrflags(SecOptions,SecAlign) or PE_SCN_MEM_NOT_PAGED
                 else
                   sechdr.flags:=peencodesechdrflags(SecOptions,SecAlign);
+                { some flags are invalid in executables, reset them }
+                sechdr.flags:=sechdr.flags and
+                  not(PE_SCN_LNK_INFO or PE_SCN_LNK_REMOVE or
+                      PE_SCN_LNK_COMDAT or PE_SCN_ALIGN_MASK);
               end
             else
               sechdr.flags:=djencodesechdrflags(SecOptions);
@@ -2208,7 +2231,7 @@ const pemagic : array[0..3] of byte = (
         inherited DataPos_Symbols;
         { Calculating symbols position and size }
         nsyms:=ExeSymbolList.Count;
-        sympos:=CurrDataPos;
+        sympos:=Align(CurrDataPos,SectionDataAlign);
         inc(CurrDataPos,sizeof(coffsymbol)*nsyms);
       end;
 
@@ -2222,7 +2245,9 @@ const pemagic : array[0..3] of byte = (
         textExeSec,
         dataExeSec,
         bssExeSec,
-        idataExeSec : TExeSection;
+        idataExeSec,
+        tlsExeSec : TExeSection;
+        tlsdir : TlsDirectory;
         hassymbols,
         writeDbgStrings : boolean;
 
@@ -2238,6 +2263,89 @@ const pemagic : array[0..3] of byte = (
            end;
         end;
 
+        procedure UpdateImports;
+        var
+          exesec: TExeSection;
+          objsec, iat_start, iat_end, ilt_start: TObjSection;
+          i: longint;
+        begin
+          exesec:=FindExeSection('.idata');
+          if exesec=nil then
+            exit;
+          iat_start:=nil;
+          iat_end:=nil;
+          ilt_start:=nil;
+          for i:=0 to exesec.ObjSectionList.Count-1 do
+            begin
+              objsec:=TObjSection(exesec.ObjSectionList[i]);
+              if (ilt_start=nil) and (Pos('.idata$4',objsec.Name)=1) then
+                ilt_start:=objsec;
+              if Pos('.idata$5',objsec.Name)=1 then
+                begin
+                  if iat_start=nil then
+                    iat_start:=objsec;
+                end
+              else
+                if Assigned(iat_start) then
+                  begin
+                    iat_end:=objsec;
+                    Break;
+                  end;
+            end;
+
+          peoptheader.DataDirectory[PE_DATADIR_IDATA].vaddr:=exesec.mempos;
+          if Assigned(ilt_start) then
+            peoptheader.DataDirectory[PE_DATADIR_IDATA].size:=ilt_start.mempos-exesec.mempos
+          else  { should not happen }
+            peoptheader.DataDirectory[PE_DATADIR_IDATA].size:=exesec.Size;
+
+          if Assigned(iat_start) and Assigned(iat_end) then
+            begin
+              peoptheader.DataDirectory[PE_DATADIR_IMPORTADDRESSTABLE].vaddr:=iat_start.mempos;
+              peoptheader.DataDirectory[PE_DATADIR_IMPORTADDRESSTABLE].size:=iat_end.mempos-iat_start.mempos;
+            end;
+        end;
+
+        procedure UpdateTlsDataDir;
+        var
+          {callbacksection : TExeSection;}
+          tlsexesymbol: TExeSymbol;
+          tlssymbol: TObjSymbol;
+          callbackexesymbol: TExeSymbol;
+          callbacksymbol: TObjSymbol;
+        begin
+          { according to GNU ld,
+            the callback routines should be placed into .CRT$XL*
+            sections, and the thread local variables in .tls
+            __tls_start__ and __tls_end__ symbols
+            should be used for the initialized part,
+            which we do not support yet. }
+          { For now, we only pass the address of the __tls_used
+            asm symbol into PE_DATADIR_TLS with the correct
+            size of this table (different for win32/win64 }
+          tlsexesymbol:=texesymbol(ExeSymbolList.Find(
+            target_info.Cprefix+'_tls_used'));
+          if assigned(tlsexesymbol) then
+            begin
+              tlssymbol:=tlsexesymbol.ObjSymbol;
+              peoptheader.DataDirectory[PE_DATADIR_TLS].vaddr:=tlssymbol.address;
+              { sizeof(TlsDirectory) is different on host and target when cross-compiling }
+              peoptheader.DataDirectory[PE_DATADIR_TLS].size:=TLSDIR_SIZE;
+              if IsSharedLibrary then
+                begin
+                  { Here we should reset __FPC_tls_callbacks value to nil }
+                  callbackexesymbol:=texesymbol(ExeSymbolList.Find(
+                                        '__FPC_tls_callbacks'));
+                  if assigned (callbackexesymbol) then
+                    begin
+                      callbacksymbol:=callbackexesymbol.ObjSymbol;
+
+                    end;
+                end;
+
+           end;
+        end;
+
       begin
         result:=false;
         FCoffSyms:=TDynamicArray.Create(SymbolMaxGrow);
@@ -2245,6 +2353,7 @@ const pemagic : array[0..3] of byte = (
         textExeSec:=FindExeSection('.text');
         dataExeSec:=FindExeSection('.data');
         bssExeSec:=FindExeSection('.bss');
+        tlsExeSec:=FindExeSection('.tls');
         if not assigned(TextExeSec) or
            not assigned(DataExeSec) then
           internalerror(200602231);
@@ -2352,7 +2461,8 @@ const pemagic : array[0..3] of byte = (
             peoptheader.SizeOfHeapReserve:=$100000;
             peoptheader.SizeOfHeapCommit:=$1000;
             peoptheader.NumberOfRvaAndSizes:=PE_DATADIR_ENTRIES;
-            UpdateDataDir('.idata',PE_DATADIR_IDATA);
+            UpdateImports;
+            UpdateTlsDataDir;
             UpdateDataDir('.edata',PE_DATADIR_EDATA);
             UpdateDataDir('.rsrc',PE_DATADIR_RSRC);
             UpdateDataDir('.pdata',PE_DATADIR_PDATA);
@@ -2387,6 +2497,9 @@ const pemagic : array[0..3] of byte = (
         ExeSectionList.ForEachCall(@ExeSectionList_write_header,nil);
         { Section data }
         ExeSectionList.ForEachCall(@ExeSectionList_write_data,nil);
+        { Align after the last section }
+        FWriter.Writezeros(Align(FWriter.Size,SectionDataAlign)-FWriter.Size);
+
         { Optional Symbols }
         if SymPos<>FWriter.Size then
           internalerror(200602252);
@@ -2414,9 +2527,12 @@ const pemagic : array[0..3] of byte = (
         Result:=CompareStr(I1.Name,I2.Name);
       end;
 
-    procedure TCoffexeoutput.Order_ObjSectionList(ObjSectionList: TFPObjectList);
+    procedure TCoffexeoutput.Order_ObjSectionList(ObjSectionList: TFPObjectList;const aPattern:string);
       begin
-        if CurrExeSec.Name = '.idata' then
+        { Sort sections having '$' in the name, that's how PECOFF documentation
+          tells to handle them. However, look for '$' in the pattern, not in section
+          names, because the latter often get superfluous '$' due to mangling. }
+        if Pos('$',aPattern)>0 then
           ObjSectionList.Sort(@IdataObjSectionCompare);
       end;
 
@@ -2492,6 +2608,7 @@ const pemagic : array[0..3] of byte = (
           emptyint : longint;
         begin
           emptyint:=0;
+          { These are referenced from idata2, oso_keep is not necessary. }
           idata4objsection:=internalobjdata.createsection(sec_idata4, basedllname+'_z_');
           internalobjdata.SymbolDefine('__imp_names_end_'+basedllname,AB_LOCAL,AT_DATA);
           idata5objsection:=internalobjdata.createsection(sec_idata5, basedllname+'_z_');
@@ -2506,9 +2623,6 @@ const pemagic : array[0..3] of byte = (
           internalobjdata.writebytes(emptyint,sizeof(emptyint));
           if target_info.system=system_x86_64_win64 then
             internalobjdata.writebytes(emptyint,sizeof(emptyint));
-          { be sure that this will not be removed }
-          idata4objsection.SecOptions:=idata4objsection.SecOptions + [oso_keep];
-          idata5objsection.SecOptions:=idata5objsection.SecOptions + [oso_keep];
         end;
 
         function AddImport(const afuncname,amangledname:string; AOrdNr:longint;isvar:boolean):TObjSymbol;

+ 7 - 2
compiler/ognlm.pas

@@ -1198,7 +1198,12 @@ function SecOpts(SecOptions:TObjSectionOptions):string;
                     targetSectionName := '';
                     if objreloc.symbol <> nil then
                     begin
-                      // writeln ('  MemPos',objsec.MemPos,' dataOfs:',objreloc.dataoffset,' ',objsec.name,'   objreloc.symbol: ',objreloc.symbol.name,'  objreloc.symbol.objsection.name: ',objreloc.symbol.objsection.name,' ',objreloc.symbol.Typ,' ',objreloc.symbol.bind,' ',objreloc.Typ);
+                      // writeln ('  MemPos',objsec.MemPos,
+                      // ' dataOfs:',objreloc.dataoffset,' ',objsec.name,
+                      // '   objreloc.symbol: ',objreloc.symbol.name,
+                      // '  objreloc.symbol.objsection.name: ',objreloc.symbol.objsection.name,
+                      // ' ',objreloc.symbol.Typ,' ',objrel
+                      // oc.symbol.bind,' ',objreloc.Typ);
                       if objreloc.symbol.objsection.name[1] <> '.' then
                         targetSectionName := objreloc.symbol.name                       // specials like __bss_start__
                       else                                                              // dont use objsection.name because it begins with *
@@ -1313,7 +1318,7 @@ function SecOpts(SecOptions:TObjSectionOptions):string;
                    exit;
                  end;
                fileH := fileOpen (fn,fmOpenRead);
-               if fileH = -1 then
+               if fileH = THandle(-1) then
                  begin
                    comment(v_error,'can not open '+desc+' file '+fn);
                    exit;

+ 1 - 1
compiler/optcse.pas

@@ -173,7 +173,7 @@ unit optcse;
                     if plists(arg)^.equalto[i]<>pointer(-1) then
                       plists(arg)^.equalto[plists(arg)^.nodelist.count-1]:=plists(arg)^.equalto[i]
                     else
-                      plists(arg)^.equalto[plists(arg)^.nodelist.count-1]:=pointer(i);
+                      plists(arg)^.equalto[plists(arg)^.nodelist.count-1]:=pointer(ptrint(i));
                     plists(arg)^.refs[i]:=pointer(plists(arg)^.refs[i])+1;
                     break;
                   end;

+ 9 - 0
compiler/options.pas

@@ -365,6 +365,9 @@ begin
       'S',
 {$endif}
 {$ifdef vis}
+      'I',
+{$endif}
+{$ifdef avr}
       'V',
 {$endif}
       '*' : show:=true;
@@ -2853,6 +2856,12 @@ if (target_info.system=system_arm_darwin) then
         def_system_macro('FPC_HAS_TYPE_EXTENDED');
 {$endif}
     end;
+    { Not ready yet }
+{$ifdef TEST_TLS_DIRECTORY}
+    if target_info.system in systems_windows then
+      def_system_macro('FPC_USE_TLS_DIRECTORY');
+{$endif TEST_TLS_DIRECTORY}
+
 
 {$ifdef ARM}
   { define FPC_DOUBLE_HILO_SWAPPED if needed to properly handle doubles in RTL }

+ 5 - 0
compiler/parser.pas

@@ -351,6 +351,7 @@ implementation
          current_exceptblock:=0;
          exceptblockcounter:=0;
          current_settings.maxfpuregisters:=-1;
+         current_settings.pmessage:=nil;
        { reset the unit or create a new program }
          { a unit compiled at command line must be inside the loaded_unit list }
          if (compile_level=1) then
@@ -481,6 +482,8 @@ implementation
                 current_procinfo:=oldcurrent_procinfo;
                 current_filepos:=oldcurrent_filepos;
                 current_settings:=old_settings;
+                { Restore all locally modified warning messages }
+                RestoreLocalVerbosity(current_settings.pmessage);
                 current_exceptblock:=0;
                 exceptblockcounter:=0;
               end;
@@ -518,6 +521,8 @@ implementation
            dec(compile_level);
            set_current_module(olddata^.old_current_module);
 
+           FreeLocalVerbosity(current_settings.pmessage);
+
            dispose(olddata);
          end;
     end;

+ 2 - 2
compiler/pdecl.pas

@@ -279,9 +279,9 @@ implementation
                       { get init value }
                       consume(_EQ);
                       if (cs_typed_const_writable in current_settings.localswitches) then
-                        tclist:=current_asmdata.asmlists[al_rotypedconsts]
+                        tclist:=current_asmdata.asmlists[al_typedconsts]
                       else
-                        tclist:=current_asmdata.asmlists[al_typedconsts];
+                        tclist:=current_asmdata.asmlists[al_rotypedconsts];
                       read_typed_const(tclist,tstaticvarsym(sym),in_structure);
                     end;
                 end;

+ 1 - 0
compiler/pdecobj.pas

@@ -1251,6 +1251,7 @@ implementation
                 list.add(current_structdef);
               end;
           end;
+        tabstractrecordsymtable(current_objectdef.symtable).addalignmentpadding;
 
         { return defined objectdef }
         result:=current_objectdef;

+ 17 - 50
compiler/pdecsub.pas

@@ -82,7 +82,7 @@ implementation
        cutils,cclasses,
        { global }
        globtype,globals,verbose,constexp,
-       systems,
+       systems,fpccrc,
        cpuinfo,
        { symtable }
        symbase,symtable,defutil,defcmp,paramgr,cpupara,
@@ -1008,6 +1008,9 @@ implementation
              ImplIntf:=tobjectdef(astruct).find_implemented_interface(tobjectdef(ttypesym(srsym).typedef));
            if ImplIntf=nil then
              Message(parser_e_interface_id_expected);
+           { must be a directly implemented interface }
+           if Assigned(ImplIntf.ImplementsGetter) then
+             Message2(parser_e_implements_no_mapping,ImplIntf.IntfDef.typename,astruct.objrealname^);
            consume(_ID);
            { Create unique name <interface>.<method> }
            hs:=sp+'.'+pattern;
@@ -1468,7 +1471,7 @@ implementation
                        end;
                      if (optoken in [_EQ,_NE,_GT,_LT,_GTE,_LTE,_OP_IN]) and
                         ((pd.returndef.typ<>orddef) or
-                         (torddef(pd.returndef).ordtype<>pasbool)) then
+                         (torddef(pd.returndef).ordtype<>pasbool8)) then
                         Message(parser_e_comparative_operator_return_boolean);
                      if (optoken in [_ASSIGNMENT,_OP_EXPLICIT]) and
                         equal_defs(pd.returndef,tparavarsym(pd.parast.SymList[0]).vardef) and
@@ -1626,6 +1629,7 @@ begin
   if pd.parast.symtablelevel>normal_function_level then
     Message(parser_e_dont_nest_interrupt);
 
+{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
   if target_info.system in systems_interrupt_table then
     begin
       if token<>_SEMICOLON then
@@ -1635,6 +1639,7 @@ begin
           Tprocdef(pd).interruptvector:=v.uvalue;
         end;
     end;
+{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
 end;
 
 procedure pd_abstract(pd:tabstractprocdef);
@@ -2718,14 +2723,8 @@ const
 
 
     function proc_get_importname(pd:tprocdef):string;
-
-       function maybe_cprefix(const s:string):string;
-         begin
-           if not(pd.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
-             result:=s
-           else
-             result:=target_info.Cprefix+s;
-         end;
+      var
+        dllname, importname : string;
 
       begin
         result:='';
@@ -2735,36 +2734,15 @@ const
         if assigned(pd.import_name) or (pd.import_nr<>0) then
           begin
             if assigned(pd.import_dll) then
-              begin
-                { If we are not using direct dll linking under win32 then imports
-                  need to use the normal name since two functions can refer to the
-                  same DLL function. This is also needed for compatability
-                  with Delphi and TP7 }
-(*
-                case target_info.system of
-                  system_i386_emx,
-                  system_i386_os2 :
-                    begin
-                      { keep normal mangledname }
-                      if not (Assigned (PD.Import_Name)) then
-                       Result := PD.MangledName;
-                    end;
-                  else
-*)
-                if assigned(pd.import_name) then
-                  begin
-                    if target_info.system in (systems_all_windows + systems_nativent +
-                                       [system_i386_emx, system_i386_os2]) then
-                   { cprefix is not used in DLL imports under Windows or OS/2 }
-                      result:='_$dll$'+ExtractFileName(pd.import_dll^)+'$'+pd.import_name^
-                    else
-                      result:=maybe_cprefix(pd.import_name^);
-                  end
-                else
-                  result:=ExtractFileName(pd.import_dll^)+'_index_'+tostr(pd.import_nr);
-              end
+              dllname:=pd.import_dll^
+            else
+              dllname:='';
+            if assigned(pd.import_name) then
+              importname:=pd.import_name^
             else
-              result:=maybe_cprefix(pd.import_name^);
+              importname:='';
+            proc_get_importname:=make_dllmangledname(dllname,
+              importname,pd.import_nr,pd.proccalloption);
           end
         else
           begin
@@ -2811,17 +2789,6 @@ const
                     s:=proc_get_importname(pd);
                     if s<>'' then
                       begin
-                        { Replace ? and @ in import name, since GNU AS does not allow these characters in symbol names. }
-                        { This allows to import VC++ mangled names from DLLs. }
-                        { Do not perform replacement, if external symbol is not imported from DLL. }
-                        if (target_info.system in systems_all_windows) and (pd.import_dll<>nil) then
-                          begin
-                            Replace(s,'?','__q$$');
-{$ifdef arm}
-                            { @ symbol is not allowed in ARM assembler only }
-                            Replace(s,'@','__a$$');
-{$endif arm}
-                          end;
                         pd.setmangledname(s);
                       end;
                   end;

+ 33 - 8
compiler/pdecvar.pas

@@ -41,6 +41,8 @@ interface
 
     procedure read_public_and_external(vs: tabstractvarsym);
 
+    procedure try_consume_sectiondirective(var asection: ansistring);
+
 implementation
 
     uses
@@ -674,7 +676,7 @@ implementation
                                    storedprocdef:=tprocvardef.create(normal_function_level);
                                    include(storedprocdef.procoptions,po_methodpointer);
                                    { Return type must be boolean }
-                                   storedprocdef.returndef:=booltype;
+                                   storedprocdef.returndef:=pasbool8type;
                                    { Add index parameter if needed }
                                    if ppo_indexed in p.propoptions then
                                      begin
@@ -839,6 +841,13 @@ implementation
                end;
              if found then
                begin
+                 { An interface may not be delegated by more than one property,
+                   it also may not have method mappings. }
+                 if Assigned(ImplIntf.ImplementsGetter) then
+                   message1(parser_e_duplicate_implements_clause,ImplIntf.IntfDef.typename);
+                 if Assigned(ImplIntf.NameMappings) then
+                   message2(parser_e_mapping_no_implements,ImplIntf.IntfDef.typename,astruct.objrealname^);
+
                  ImplIntf.ImplementsGetter:=p;
                  ImplIntf.VtblImplIntf:=ImplIntf;
                  case p.propaccesslist[palt_read].firstsym^.sym.typ of
@@ -925,7 +934,7 @@ implementation
       is_external_var,
       is_weak_external,
       is_public_var  : boolean;
-      dll_name,
+      dll_name,section_name,
       C_name,mangledname      : string;
     begin
       { only allowed for one var }
@@ -940,6 +949,7 @@ implementation
       is_cdecl:=false;
       is_external_var:=false;
       is_public_var:=false;
+      section_name := '';
       C_name:=vs.realname;
 
       { macpas specific handling due to some switches}
@@ -992,6 +1002,10 @@ implementation
             is_public_var:=true;
           if try_to_consume(_NAME) then
             C_name:=get_stringconst;
+          if (target_info.system in systems_allow_section_no_semicolon) and
+             (vs.typ=staticvarsym) and
+             try_to_consume (_SECTION) then
+            section_name:=get_stringconst;
           consume(_SEMICOLON);
         end;
 
@@ -1000,6 +1014,14 @@ implementation
          (target_info.system in systems_all_windows) then
         include(vs.varoptions,vo_is_dll_var);
 
+      { This can only happen if vs.typ=staticvarsym }
+      if section_name<>'' then
+        begin
+          tstaticvarsym(vs).section:=section_name;
+          include(vs.varoptions,vo_has_section);
+        end;
+
+
       { Add C _ prefix }
       if is_cdecl or
          (
@@ -1035,7 +1057,7 @@ implementation
             begin
               if target_info.system in (systems_all_windows + systems_nativent +
                                        [system_i386_emx, system_i386_os2]) then
-                mangledname:='_$dll$'+ExtractFileName(dll_name)+'$'+C_name;
+                mangledname:=make_dllmangledname(dll_name,C_name,0,pocall_none);
 
               current_module.AddExternalImport(dll_name,C_Name,mangledname,0,true,false);
             end
@@ -1272,7 +1294,7 @@ implementation
          hintsymoptions  : tsymoptions;
          deprecatedmsg   : pshortstring;
          old_block_type  : tblock_type;
-         section : ansistring;
+         sectionname : ansistring;
       begin
          old_block_type:=block_type;
          block_type:=bt_var;
@@ -1415,10 +1437,12 @@ implementation
                read_public_and_external_sc(sc);
 
              { try to parse a section directive }
-             if (target_info.system in systems_embedded) and (idtoken=_SECTION) then
+             if (target_info.system in systems_allow_section) and
+                (symtablestack.top.symtabletype in [staticsymtable,globalsymtable]) and
+                (idtoken=_SECTION) then
                begin
-                 try_consume_sectiondirective(section);
-                 if section<>'' then
+                 try_consume_sectiondirective(sectionname);
+                 if sectionname<>'' then
                    begin
                      for i:=0 to sc.count-1 do
                        begin
@@ -1427,7 +1451,8 @@ implementation
                            Message(parser_e_externals_no_section);
                          if vs.typ<>staticvarsym then
                            Message(parser_e_section_no_locals);
-                         tstaticvarsym(vs).section:=section;
+                         tstaticvarsym(vs).section:=sectionname;
+                         include(vs.varoptions, vo_has_section);
                        end;
                    end;
                end;

+ 13 - 8
compiler/pexpr.pas

@@ -515,10 +515,11 @@ implementation
                          err:=true;
                        end;
                    else
-                     begin
-                       Message(parser_e_illegal_parameter_list);
-                       err:=true;
-                     end;
+                     if p1.resultdef.typ<>undefineddef then
+                       begin
+                         Message(parser_e_illegal_parameter_list);
+                         err:=true;
+                       end;
                  end;
                end
               else
@@ -1491,7 +1492,7 @@ implementation
                        if (df_generic in hdef.defoptions) and
                           (token=_LT) and
                           (m_delphi in current_settings.modeswitches) then
-                          generate_specialization(hdef,false);
+                          generate_specialization(hdef,false,'');
                        if try_to_consume(_LKLAMMER) then
                         begin
                           p1:=comp_expr(true,false);
@@ -2306,6 +2307,7 @@ implementation
          hs,hsorg   : string;
          hdef       : tdef;
          filepos    : tfileposinfo;
+         callflags  : tcallnodeflags;
          again,
          updatefpos,
          nodechanged  : boolean;
@@ -2452,7 +2454,10 @@ implementation
                              p1:=cerrornode.create;
                            end;
                        end;
-                       do_member_read(hclassdef,getaddr,srsym,p1,again,[cnf_inherited,cnf_anon_inherited]);
+                       callflags:=[cnf_inherited];
+                       if anon_inherited then
+                         include(callflags,cnf_anon_inherited);
+                       do_member_read(hclassdef,getaddr,srsym,p1,again,callflags);
                      end
                     else
                      begin
@@ -2745,13 +2750,13 @@ implementation
              _TRUE :
                begin
                  consume(_TRUE);
-                 p1:=cordconstnode.create(1,booltype,false);
+                 p1:=cordconstnode.create(1,pasbool8type,false);
                end;
 
              _FALSE :
                begin
                  consume(_FALSE);
-                 p1:=cordconstnode.create(0,booltype,false);
+                 p1:=cordconstnode.create(0,pasbool8type,false);
                end;
 
              _NIL :

+ 10 - 4
compiler/pmodules.pas

@@ -243,10 +243,14 @@ implementation
         new_section(current_asmdata.asmlists[al_globals],sec_data,s,sizeof(pint));
         current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global(s,AT_DATA,0));
         repeat
-          { address to initialize }
-          current_asmdata.asmlists[al_globals].concat(Tai_const.createname(item.sym.mangledname, item.offset));
-          { value with which to initialize }
-          current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(item.datalabel));
+          { optimize away unused local/static symbols }
+          if (item.sym.refs>0) or (item.sym.owner.symtabletype=globalsymtable) then
+            begin
+              { address to initialize }
+              current_asmdata.asmlists[al_globals].concat(Tai_const.createname(item.sym.mangledname, item.offset));
+              { value with which to initialize }
+              current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(item.datalabel));
+            end;
           item:=TTCInitItem(item.Next);
         until item=nil;
         { end-of-list marker }
@@ -2347,8 +2351,10 @@ implementation
          InsertWideInitsTablesTable;
          InsertMemorySizes;
 
+{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
          if target_info.system in systems_interrupt_table then
            InsertInterruptTable;
+{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
 
          { Insert symbol to resource info }
          InsertResourceInfo(resources_used);

+ 6 - 6
compiler/powerpc/cgcpu.pas

@@ -275,7 +275,7 @@ const
           { TODO: optimize/take into consideration fromsize/tosize. Will }
           { probably only matter for OS_S8 loads though                  }
           if not(fromsize in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
-            internalerror(2002090902);
+            internalerror(2002090903);
           ref2 := ref;
           fixref(list,ref2);
           { the caller is expected to have adjusted the reference already }
@@ -435,7 +435,7 @@ const
           end;
         ophi := TOpCG2AsmOpConstHi[op];
         oplo := TOpCG2AsmOpConstLo[op];
-        gotrlwi := get_rlwi_const(a,l1,l2);
+        gotrlwi := get_rlwi_const(aint(a),l1,l2);
         if (op in [OP_AND,OP_OR,OP_XOR]) then
           begin
             if (a = 0) then
@@ -1742,8 +1742,8 @@ const
         case op of
           OP_AND,OP_OR,OP_XOR:
             begin
-              cg.a_op_const_reg_reg(list,op,OS_32,tcgint(value),regsrc.reglo,regdst.reglo);
-              cg.a_op_const_reg_reg(list,op,OS_32,tcgint(value shr 32),regsrc.reghi,
+              cg.a_op_const_reg_reg(list,op,OS_32,aint(value),regsrc.reglo,regdst.reglo);
+              cg.a_op_const_reg_reg(list,op,OS_32,aint(value shr 32),regsrc.reghi,
                 regdst.reghi);
             end;
           OP_ADD, OP_SUB:
@@ -1771,7 +1771,7 @@ const
                   else if ((value shr 32) = 0) then
                     begin
                       tmpreg := tcgppc(cg).rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
-                      cg.a_load_const_reg(list,OS_32,tcgint(value),tmpreg);
+                      cg.a_load_const_reg(list,OS_32,aint(value),tmpreg);
                       list.concat(taicpu.op_reg_reg_reg(ops[issub,2],
                         regdst.reglo,regsrc.reglo,tmpreg));
                       list.concat(taicpu.op_reg_reg(ops[issub,3],
@@ -1788,7 +1788,7 @@ const
               else
                 begin
                   cg.a_load_reg_reg(list,OS_INT,OS_INT,regsrc.reglo,regdst.reglo);
-                  cg.a_op_const_reg_reg(list,op,OS_32,tcgint(value shr 32),regsrc.reghi,
+                  cg.a_op_const_reg_reg(list,op,OS_32,aint(value shr 32),regsrc.reghi,
                     regdst.reghi);
                 end;
             end;

+ 1 - 1
compiler/powerpc64/rappcgas.pas

@@ -687,7 +687,7 @@ begin
     dec(ord(hs[0]));
     actcondition.dirhint := DH_Plus;
   end;
-  actopcode := tasmop(ptrint(iasmops.Find(hs)));
+  actopcode := tasmop(ptruint(iasmops.Find(hs)));
   if actopcode <> A_NONE then
   begin
     if actcondition.dirhint <> DH_None then

+ 3 - 2
compiler/ppcgen/cgppc.pas

@@ -440,7 +440,7 @@ unit cgppc;
       op: TAsmOp;
     begin
       if not (fromsize in [OS_8..OS_INT,OS_S8..OS_SINT]) then
-        internalerror(2002090903);
+        internalerror(2002090904);
       if not (tosize in [OS_8..OS_INT,OS_S8..OS_SINT]) then
         internalerror(2002090905);
 
@@ -580,7 +580,8 @@ unit cgppc;
       current_asmdata.getjumplabel(hl);
       if not ((def.typ=pointerdef) or
              ((def.typ=orddef) and
-              (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool]))) then
+              (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,
+                                        pasbool8,pasbool16,pasbool32,pasbool64]))) then
         begin
           if (current_settings.optimizecputype >= cpu_ppc970) or
              (current_settings.cputype >= cpu_ppc970) then

+ 4 - 4
compiler/ppcgen/ngppcadd.pas

@@ -177,12 +177,12 @@ implementation
         firstcomplex(self);
 
         cmpop:=false;
-        if (torddef(left.resultdef).ordtype in [pasbool,bool8bit]) or
-           (torddef(right.resultdef).ordtype in [pasbool,bool8bit]) then
+        if (torddef(left.resultdef).ordtype in [pasbool8,bool8bit]) or
+           (torddef(right.resultdef).ordtype in [pasbool8,bool8bit]) then
          cgsize:=OS_8
         else
-          if (torddef(left.resultdef).ordtype=bool16bit) or
-             (torddef(right.resultdef).ordtype=bool16bit) then
+          if (torddef(left.resultdef).ordtype in [pasbool16,bool16bit]) or
+             (torddef(right.resultdef).ordtype in [pasbool16,bool16bit]) then
            cgsize:=OS_16
         else
            cgsize:=OS_32;

+ 187 - 24
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 
 const
-  CurrentPPUVersion = 131;
+  CurrentPPUVersion = 135;
 
 { buffer sizes }
   maxentrysize = 1024;
@@ -132,6 +132,7 @@ const
 
   ibmainname       = 90;
   ibsymtableoptions = 91;
+  ibrecsymtableoptions = 91;
   { target-specific things }
   iblinkotherframeworks = 100;
 
@@ -230,6 +231,9 @@ type
       used by this unit. Reason: see mantis #13840 }
     indirect_crc     : cardinal;
     error,
+{$ifdef generic_cpu}
+    has_more,
+{$endif not generic_cpu}
     do_crc,
     do_interface_crc,
     do_indirect_crc  : boolean;
@@ -250,6 +254,7 @@ type
     function  readentry:byte;
     function  EndOfEntry:boolean;
     function  entrysize:longint;
+    function  entryleft:longint;
     procedure getdatabuf(var b;len:integer;var res:integer);
     procedure getdata(var b;len:integer);
     function  getbyte:byte;
@@ -262,6 +267,7 @@ type
     function getasizeint:asizeint;
     function getaword:aword;
     function  getreal:ppureal;
+    function  getrealsize(sizeofreal : longint):ppureal;
     function  getstring:string;
     function  getansistring:ansistring;
     procedure getnormalset(var b);
@@ -281,6 +287,7 @@ type
     procedure putint64(i:int64);
     procedure putqword(q:qword);
     procedure putaint(i:aint);
+    procedure putasizeint(i:asizeint);
     procedure putaword(i:aword);
     procedure putreal(d:ppureal);
     procedure putstring(const s:string);
@@ -301,6 +308,47 @@ implementation
     fpccrc,
     cutils;
 
+{$ifdef generic_cpu}
+{ We need to use the correct size of aint and pint for
+  the target CPU }
+const
+  CpuAddrBitSize : array[tsystemcpu] of longint =
+    (
+    {  0 } 32 {'none'},
+    {  1 } 32 {'i386'},
+    {  2 } 32 {'m68k'},
+    {  3 } 32 {'alpha'},
+    {  4 } 32 {'powerpc'},
+    {  5 } 32 {'sparc'},
+    {  6 } 32 {'vis'},
+    {  7 } 64 {'ia64'},
+    {  8 } 64 {'x86_64'},
+    {  9 } 32 {'mips'},
+    { 10 } 32 {'arm'},
+    { 11 } 64 {'powerpc64'},
+    { 12 } 16 {'avr'},
+    { 13 } 32 {'mipsel'}
+    );
+  CpuAluBitSize : array[tsystemcpu] of longint =
+    (
+    {  0 } 32 {'none'},
+    {  1 } 32 {'i386'},
+    {  2 } 32 {'m68k'},
+    {  3 } 32 {'alpha'},
+    {  4 } 32 {'powerpc'},
+    {  5 } 32 {'sparc'},
+    {  6 } 32 {'vis'},
+    {  7 } 64 {'ia64'},
+    {  8 } 64 {'x86_64'},
+    {  9 } 32 {'mips'},
+    { 10 } 32 {'arm'},
+    { 11 } 64 {'powerpc64'},
+    { 12 }  8 {'avr'},
+    { 13 } 32 {'mipsel'}
+    );
+{$endif generic_cpu}
+
+
 
 function swapendian_ppureal(d:ppureal):ppureal;
 
@@ -530,12 +578,20 @@ end;
 function tppufile.readentry:byte;
 begin
   if entryidx<entry.size then
-   skipdata(entry.size-entryidx);
+    begin
+{$ifdef generic_cpu}
+     has_more:=true;
+{$endif not generic_cpu}
+     skipdata(entry.size-entryidx);
+    end;
   readdata(entry,sizeof(tppuentry));
   if change_endian then
     entry.size:=swapendian(entry.size);
   entrystart:=bufstart+bufidx;
   entryidx:=0;
+{$ifdef generic_cpu}
+  has_more:=false;
+{$endif not generic_cpu}
   if not(entry.id in [mainentryid,subentryid]) then
    begin
      readentry:=iberror;
@@ -548,7 +604,11 @@ end;
 
 function tppufile.endofentry:boolean;
 begin
+{$ifdef generic_cpu}
+  endofentry:=(entryidx=entry.size);
+{$else not generic_cpu}
   endofentry:=(entryidx>=entry.size);
+{$endif not generic_cpu}
 end;
 
 
@@ -557,6 +617,11 @@ begin
   entrysize:=entry.size;
 end;
 
+function tppufile.entryleft:longint;
+begin
+  entryleft:=entry.size-entryidx;
+end;
+
 
 procedure tppufile.getdatabuf(var b;len:integer;var res:integer);
 begin
@@ -707,68 +772,154 @@ end;
 
 function tppufile.getaint:aint;
 begin
+{$ifdef generic_cpu}
+  if CpuAluBitSize[tsystemcpu(header.cpu)]=64 then
+    result:=getint64
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=32 then
+    result:=getlongint
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=16 then
+    result:=smallint(getword)
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=8 then
+    result:=shortint(getbyte)
+  else
+    begin
+      error:=true;
+      result:=0;
+    end;
+{$else not generic_cpu}
 {$ifdef cpu64bitalu}
   result:=getint64;
 {$else cpu64bitalu}
   result:=getlongint;
 {$endif cpu64bitalu}
+{$endif not generic_cpu}
 end;
 
 
 function tppufile.getasizeint:asizeint;
 begin
+{$ifdef generic_cpu}
+  if CpuAddrBitSize[tsystemcpu(header.cpu)]=64 then
+    result:=getint64
+  else if CpuAddrBitSize[tsystemcpu(header.cpu)]=32 then
+    result:=getlongint
+  else if CpuAddrBitSize[tsystemcpu(header.cpu)]=16 then
+    result:=smallint(getword)
+  else
+    begin
+      error:=true;
+      result:=0;
+    end;
+{$else not generic_cpu}
 {$ifdef cpu64bitaddr}
   result:=getint64;
 {$else cpu64bitaddr}
   result:=getlongint;
 {$endif cpu32bitaddr}
+{$endif not generic_cpu}
 end;
 
 
 function tppufile.getaword:aword;
 begin
+{$ifdef generic_cpu}
+  if CpuAluBitSize[tsystemcpu(header.cpu)]=64 then
+    result:=getqword
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=32 then
+    result:=getdword
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=16 then
+    result:=getword
+  else if CpuAluBitSize[tsystemcpu(header.cpu)]=8 then
+    result:=getbyte
+  else
+    begin
+      error:=true;
+      result:=0;
+    end;
+{$else not generic_cpu}
 {$ifdef cpu64bitalu}
   result:=getqword;
 {$else cpu64bitalu}
   result:=getdword;
 {$endif cpu64bitalu}
+{$endif not generic_cpu}
 end;
 
-
-function tppufile.getreal:ppureal;
+function  tppufile.getrealsize(sizeofreal : longint):ppureal;
 var
-  d : ppureal;
-  hd : double;
+  e : ppureal;
+  d : double;
+  s : single;
 begin
-  if target_info.system=system_x86_64_win64 then
+  if sizeofreal=sizeof(e) then
     begin
-      if entryidx+sizeof(hd)>entry.size then
+      if entryidx+sizeof(e)>entry.size then
        begin
          error:=true;
-         getreal:=0;
+         result:=0;
          exit;
        end;
-      readdata(hd,sizeof(hd));
+      readdata(e,sizeof(e));
       if change_endian then
-        getreal:=swapendian(qword(hd))
+        result:=swapendian_ppureal(e)
       else
-        getreal:=hd;
-      inc(entryidx,sizeof(hd));
-    end
-  else
+        result:=e;
+      inc(entryidx,sizeof(e));
+      result:=e;
+      exit;
+    end;
+  if sizeofreal=sizeof(d) then
+    begin
+      if entryidx+sizeof(d)>entry.size then
+       begin
+         error:=true;
+         result:=0;
+         exit;
+       end;
+      readdata(d,sizeof(d));
+      if change_endian then
+        result:=swapendian(pqword(@d)^)
+      else
+        result:=d;
+      inc(entryidx,sizeof(d));
+      result:=d;
+      exit;
+    end;
+  if sizeofreal=sizeof(s) then
     begin
-      if entryidx+sizeof(ppureal)>entry.size then
+      if entryidx+sizeof(s)>entry.size then
        begin
          error:=true;
-         getreal:=0;
+         result:=0;
          exit;
        end;
-      readdata(d,sizeof(ppureal));
+      readdata(s,sizeof(s));
       if change_endian then
-        getreal:=swapendian_ppureal(d)
+        result:=swapendian(pdword(@s)^)
       else
-        getreal:=d;
-      inc(entryidx,sizeof(ppureal));
+        result:=s;
+      inc(entryidx,sizeof(s));
+      result:=s;
+      exit;
+    end;
+  error:=true;
+  result:=0.0;
+end;
+
+function tppufile.getreal:ppureal;
+var
+  d : ppureal;
+  hd : double;
+begin
+  if target_info.system=system_x86_64_win64 then
+    begin
+      hd:=getrealsize(sizeof(hd));
+      getreal:=hd;
+    end
+  else
+    begin
+      d:=getrealsize(sizeof(d));
+      getreal:=d;
     end;
 end;
 
@@ -796,8 +947,13 @@ begin
      error:=true;
      exit;
    end;
-  SetLength(Result,l);
-  ReadData(result[1],l);
+  if l>0 then
+    begin
+      SetLength(Result,l);
+      ReadData(result[1],l);
+    end
+  else
+    Result:='';
   inc(entryidx,l);
 end;
 
@@ -1122,6 +1278,12 @@ begin
 end;
 
 
+procedure tppufile.putasizeint(i: asizeint);
+begin
+  putdata(i,sizeof(asizeint));
+end;
+
+
 procedure tppufile.putaword(i:aword);
 begin
   putdata(i,sizeof(aword));
@@ -1154,7 +1316,8 @@ procedure tppufile.putansistring(const s: ansistring);
   begin
     l:=length(s);
     putdata(l,4);
-    putdata(s[1],l);
+    if l>0 then
+      putdata(s[1],l);
   end;
 
 

+ 9 - 7
compiler/ppx86_64.lpi

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 <CONFIG>
   <ProjectOptions>
+    <Version Value="9"/>
     <PathDelim Value="\"/>
-    <Version Value="7"/>
     <General>
       <Flags>
         <MainUnitHasUsesSectionForAllUnits Value="False"/>
@@ -12,9 +12,11 @@
       </Flags>
       <SessionStorage Value="InProjectDir"/>
       <MainUnit Value="0"/>
-      <TargetFileExt Value=".exe"/>
       <Title Value="pp"/>
     </General>
+    <BuildModes Count="1">
+      <Item1 Name="default" Default="True"/>
+    </BuildModes>
     <PublishOptions>
       <Version Value="2"/>
       <DestinationDirectory Value="$(TestDir)\publishedproject\"/>
@@ -41,14 +43,14 @@
     </Units>
   </ProjectOptions>
   <CompilerOptions>
-    <Version Value="8"/>
+    <Version Value="10"/>
     <PathDelim Value="\"/>
     <Target>
       <Filename Value="x86_64\pp"/>
     </Target>
     <SearchPaths>
-      <IncludeFiles Value="x86_64\"/>
-      <OtherUnitFiles Value="x86_64\;x86\;systems\"/>
+      <IncludeFiles Value="x86_64"/>
+      <OtherUnitFiles Value="x86_64;x86;systems"/>
       <UnitOutputDirectory Value="x86_64\lazbuild"/>
     </SearchPaths>
     <Parsing>
@@ -56,6 +58,7 @@
         <CStyleOperator Value="False"/>
         <AllowLabel Value="False"/>
         <CPPInline Value="False"/>
+        <UseAnsiStrings Value="False"/>
       </SyntaxOptions>
     </Parsing>
     <Linking>
@@ -72,8 +75,7 @@
       <ConfigFile>
         <StopAfterErrCount Value="50"/>
       </ConfigFile>
-      <CustomOptions Value="-dx86_64
-"/>
+      <CustomOptions Value="-dx86_64"/>
       <CompilerPath Value="$(CompPath)"/>
     </Other>
   </CompilerOptions>

+ 24 - 12
compiler/psystem.pas

@@ -154,7 +154,10 @@ implementation
         s32inttype:=torddef.create(s32bit,int64(low(longint)),int64(high(longint)));
         u64inttype:=torddef.create(u64bit,low(qword),high(qword));
         s64inttype:=torddef.create(s64bit,low(int64),high(int64));
-        booltype:=torddef.create(pasbool,0,1);
+        pasbool8type:=torddef.create(pasbool8,0,1);
+        pasbool16type:=torddef.create(pasbool16,0,1);
+        pasbool32type:=torddef.create(pasbool32,0,1);
+        pasbool64type:=torddef.create(pasbool64,0,1);
         bool8type:=torddef.create(bool8bit,low(int64),high(int64));
         bool16type:=torddef.create(bool16bit,low(int64),high(int64));
         bool32type:=torddef.create(bool32bit,low(int64),high(int64));
@@ -293,7 +296,10 @@ implementation
         addtype('UnicodeString',cunicodestringtype);
 
         addtype('OpenString',openshortstringtype);
-        addtype('Boolean',booltype);
+        addtype('Boolean',pasbool8type);
+        addtype('Boolean16',pasbool16type);
+        addtype('Boolean32',pasbool32type);
+        addtype('Boolean64',pasbool64type);
         addtype('ByteBool',bool8type);
         addtype('WordBool',bool16type);
         addtype('LongBool',bool32type);
@@ -333,11 +339,14 @@ implementation
         addtype('$widestring',cwidestringtype);
         addtype('$unicodestring',cunicodestringtype);
         addtype('$openshortstring',openshortstringtype);
-        addtype('$boolean',booltype);
-        addtype('$boolean8',bool8type);
-        addtype('$boolean16',bool16type);
-        addtype('$boolean32',bool32type);
-        addtype('$boolean64',bool64type);
+        addtype('$boolean',pasbool8type);
+        addtype('$boolean16',pasbool16type);
+        addtype('$boolean32',pasbool32type);
+        addtype('$boolean64',pasbool64type);
+        addtype('$bytebool',bool8type);
+        addtype('$wordbool',bool16type);
+        addtype('$longbool',bool32type);
+        addtype('$qwordbool',bool64type);
         addtype('$void_pointer',voidpointertype);
         addtype('$char_pointer',charpointertype);
         addtype('$widechar_pointer',widecharpointertype);
@@ -438,11 +447,14 @@ implementation
             loadtype('sc80real',sc80floattype);
           end;
         loadtype('s64currency',s64currencytype);
-        loadtype('boolean',booltype);
-        loadtype('boolean8',bool8type);
-        loadtype('boolean16',bool16type);
-        loadtype('boolean32',bool32type);
-        loadtype('boolean64',bool64type);
+        loadtype('boolean',pasbool8type);
+        loadtype('boolean16',pasbool16type);
+        loadtype('boolean32',pasbool32type);
+        loadtype('boolean64',pasbool64type);
+        loadtype('bytebool',bool8type);
+        loadtype('wordbool',bool16type);
+        loadtype('longbool',bool32type);
+        loadtype('qwordbool',bool64type);
         loadtype('void_pointer',voidpointertype);
         loadtype('char_pointer',charpointertype);
         loadtype('widechar_pointer',widecharpointertype);

+ 34 - 4
compiler/ptconst.pas

@@ -172,6 +172,7 @@ implementation
         list   : tasmlist;
         origsym: tstaticvarsym;
         offset:  asizeint;
+        origblock: tblock_type;
       end;
 
     { this procedure reads typed constants }
@@ -196,7 +197,7 @@ implementation
            if is_cbool(def) then
              inserttypeconv(n,def);
            case def.ordtype of
-              pasbool,
+              pasbool8,
               bool8bit :
                 begin
                    if is_constboolnode(n) then
@@ -204,6 +205,7 @@ implementation
                    else
                      do_error;
                 end;
+              pasbool16,
               bool16bit :
                 begin
                    if is_constboolnode(n) then
@@ -211,6 +213,7 @@ implementation
                    else
                      do_error;
                 end;
+              pasbool32,
               bool32bit :
                 begin
                    if is_constboolnode(n) then
@@ -218,6 +221,7 @@ implementation
                    else
                      do_error;
                 end;
+              pasbool64,
               bool64bit :
                 begin
                    if is_constboolnode(n) then
@@ -745,13 +749,17 @@ implementation
                               strval,
                               winlike);
 
-                       { collect global Windows widestrings }
-                       if winlike and (hr.origsym.owner.symtablelevel <= main_program_level) then
+                       { Collect Windows widestrings that need initialization at startup.
+                         Local initialized vars are excluded because they are initialized
+                         at function entry instead. }
+                       if winlike and ((hr.origsym.owner.symtablelevel <= main_program_level) or
+                         (hr.origblock=bt_const)) then
                        begin
                          current_asmdata.WideInits.Concat(
                             TTCInitItem.Create(hr.origsym, hr.offset, ll)
                          );
                          ll := nil;
+                         Include(hr.origsym.varoptions, vo_force_finalize);
                        end;
                      end;
                      hr.list.concat(Tai_const.Create_sym(ll));
@@ -1434,6 +1442,7 @@ implementation
         storefilepos : tfileposinfo;
         cursectype   : TAsmSectionType;
         hrec         : threc;
+        section : ansistring;
       begin
         { mark the staticvarsym as typedconst }
         include(sym.varoptions,vo_is_typed_const);
@@ -1453,6 +1462,7 @@ implementation
         hrec.list:=tasmlist.create;
         hrec.origsym:=sym;
         hrec.offset:=0;
+        hrec.origblock:=block_type;
         read_typed_const_data(hrec,sym.vardef);
 
         { Parse hints }
@@ -1478,9 +1488,29 @@ implementation
            ) then
           read_public_and_external(sym);
 
+         { try to parse a section directive }
+        if not in_structure and (target_info.system in systems_allow_section) and
+          (symtablestack.top.symtabletype in [staticsymtable,globalsymtable]) and
+           (idtoken=_SECTION) then
+               begin
+                 try_consume_sectiondirective(section);
+                 if section<>'' then
+                   begin
+                     if (sym.varoptions *[vo_is_external,vo_is_weak_external])<>[] then
+                       Message(parser_e_externals_no_section);
+                     if sym.typ<>staticvarsym then
+                       Message(parser_e_section_no_locals);
+                     tstaticvarsym(sym).section:=section;
+                     include(sym.varoptions, vo_has_section);
+                   end;
+               end;
+
         { only now add items based on the symbolname, because it may }
         { have been modified by the directives parsed above          }
-        new_section(list,cursectype,lower(sym.mangledname),const_align(sym.vardef.alignment));
+        if vo_has_section in sym.varoptions then
+          new_section(list,sec_user,sym.section,const_align(sym.vardef.alignment))
+        else
+          new_section(list,cursectype,lower(sym.mangledname),const_align(sym.vardef.alignment));
         if (sym.owner.symtabletype=globalsymtable) or
            create_smartlink or
            (assigned(current_procinfo) and

+ 24 - 8
compiler/ptype.pas

@@ -52,7 +52,7 @@ interface
     { generate persistent type information like VMT, RTTI and inittables }
     procedure write_persistent_type_info(st:tsymtable);
 
-    procedure generate_specialization(var tt:tdef;parse_class_parent:boolean);
+    procedure generate_specialization(var tt:tdef;parse_class_parent:boolean;_prettyname : string);
 
 implementation
 
@@ -143,7 +143,7 @@ implementation
       end;
 
 
-    procedure generate_specialization(var tt:tdef;parse_class_parent:boolean);
+    procedure generate_specialization(var tt:tdef;parse_class_parent:boolean;_prettyname : string);
       var
         st  : TSymtable;
         srsym : tsym;
@@ -159,6 +159,7 @@ implementation
         oldextendeddefs    : TFPHashObjectList;
         hmodule : tmodule;
         pu : tused_unit;
+        prettyname : ansistring;
         uspecializename,
         specializename : string;
         vmtbuilder : TVMTBuilder;
@@ -228,6 +229,7 @@ implementation
         if not assigned(genericdef.typesym) then
           internalerror(200710173);
         specializename:=genericdef.typesym.realname;
+        prettyname:=genericdef.typesym.prettyname+'<';
         for i:=0 to st.SymList.Count-1 do
           begin
             sym:=tsym(st.SymList[i]);
@@ -247,7 +249,13 @@ implementation
                     if not assigned(pt2.resultdef.typesym) then
                       message(type_e_generics_cannot_reference_itself)
                     else
-                      specializename:=specializename+'$'+pt2.resultdef.typesym.realname;
+                      begin
+                        specializename:=specializename+'$'+pt2.resultdef.typesym.realname;
+                        if i=0 then
+                          prettyname:=prettyname+pt2.resultdef.typesym.prettyname
+                        else
+                          prettyname:=prettyname+','+pt2.resultdef.typesym.prettyname;
+                      end;
                   end
                 else
                   begin
@@ -257,6 +265,8 @@ implementation
                 pt2.free;
               end;
           end;
+        prettyname:=prettyname+'>';
+
         uspecializename:=upper(specializename);
         { force correct error location if too much type parameters are passed }
         if not (token in [_RSHARPBRACKET,_GT]) then
@@ -335,6 +345,11 @@ implementation
                 ttypesym(srsym).typedef:=tt;
                 tt.typesym:=srsym;
 
+                if _prettyname<>'' then
+                  ttypesym(tt.typesym).fprettyname:=_prettyname
+                else
+                  ttypesym(tt.typesym).fprettyname:=prettyname;
+
                 case tt.typ of
                   { Build VMT indexes for classes }
                   objectdef:
@@ -616,7 +631,7 @@ implementation
            (m_delphi in current_settings.modeswitches) then
           dospecialize:=token=_LSHARPBRACKET;
         if dospecialize then
-          generate_specialization(def,stoParseClassParent in options)
+          generate_specialization(def,stoParseClassParent in options,'')
         else
           begin
             if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
@@ -685,7 +700,7 @@ implementation
                 member_blocktype:=bt_type;
 
                 { local and anonymous records can not have inner types. skip top record symtable }
-                if (current_structdef.objname^='') or 
+                if (current_structdef.objname^='') or
                    not(symtablestack.stack^.next^.symtable.symtabletype in [globalsymtable,staticsymtable,objectsymtable,recordsymtable]) then
                   Message(parser_e_no_types_in_local_anonymous_records);
               end;
@@ -1052,7 +1067,7 @@ implementation
                                def:=torddef.create(uchar,lv,hv)
                              else
                                if is_boolean(pt1.resultdef) then
-                                 def:=torddef.create(pasbool,lv,hv)
+                                 def:=torddef.create(pasbool8,lv,hv)
                                else if is_signed(pt1.resultdef) then
                                  def:=torddef.create(range_to_basetype(lv,hv),lv,hv)
                                else
@@ -1075,7 +1090,7 @@ implementation
                    if (m_delphi in current_settings.modeswitches) then
                      dospecialize:=token=_LSHARPBRACKET;
                    if dospecialize then
-                     generate_specialization(def,false)
+                     generate_specialization(def,false,name)
                    else
                      begin
                        if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
@@ -1172,7 +1187,8 @@ implementation
 {$ifdef cpu64bitaddr}
                     u32bit,s64bit,
 {$endif cpu64bitaddr}
-                    pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
+                    pasbool8,pasbool16,pasbool32,pasbool64,
+                    bool8bit,bool16bit,bool32bit,bool64bit,
                     uwidechar] then
                     begin
                        lowval:=torddef(def).low;

+ 29 - 16
compiler/rautils.pas

@@ -93,11 +93,11 @@ type
   end;
 
   TOperand = class
-    typesize : aint;
+    opr    : TOprRec;
+    typesize : byte;
     hastype,          { if the operand has typecasted variable }
     hasvar : boolean; { if the operand is loaded with a variable }
     size   : TCGSize;
-    opr    : TOprRec;
     constructor create;virtual;
     destructor  destroy;override;
     Procedure SetSize(_size:longint;force:boolean);virtual;
@@ -112,11 +112,11 @@ type
   TCOperand = class of TOperand;
 
   TInstruction = class
+    operands  : array[1..max_operands] of toperand;
     opcode    : tasmop;
     condition : tasmcond;
     ops       : byte;
     labeled   : boolean;
-    operands  : array[1..max_operands] of toperand;
     constructor create(optype : tcoperand);virtual;
     destructor  destroy;override;
     { converts the instruction to an instruction how it's used by the assembler writer
@@ -1018,19 +1018,32 @@ end;
     Var
       p : toperand;
     Begin
-      case Ops of
-       2 :
-        begin
-          p:=Operands[1];
-          Operands[1]:=Operands[2];
-          Operands[2]:=p;
-        end;
-       3 :
-        begin
-          p:=Operands[1];
-          Operands[1]:=Operands[3];
-          Operands[3]:=p;
-        end;
+      case ops of
+        0,1:
+          ;
+        2 : begin
+              { 0,1 -> 1,0 }
+              p:=Operands[1];
+              Operands[1]:=Operands[2];
+              Operands[2]:=p;
+            end;
+        3 : begin
+              { 0,1,2 -> 2,1,0 }
+              p:=Operands[1];
+              Operands[1]:=Operands[3];
+              Operands[3]:=p;
+            end;
+        4 : begin
+              { 0,1,2,3 -> 3,2,1,0 }
+              p:=Operands[1];
+              Operands[1]:=Operands[4];
+              Operands[4]:=p;
+              p:=Operands[2];
+              Operands[2]:=Operands[3];
+              Operands[3]:=p;
+            end;
+        else
+          internalerror(201108142);
       end;
     end;
 

+ 16 - 0
compiler/rgobj.pas

@@ -1676,6 +1676,22 @@ unit rgobj;
                           end;
                       end;
                   end;
+              ait_varloc:
+                begin
+                  if cs_asm_source in current_settings.globalswitches then
+                    begin
+                      setsupreg(tai_varloc(p).newlocation,reginfo[getsupreg(tai_varloc(p).newlocation)].colour);
+                      hp:=Tai_comment.Create(strpnew('Var '+tai_varloc(p).varsym.realname+' located in register '+
+                        std_regname(tai_varloc(p).newlocation)));
+                      list.insertafter(hp,p);
+                    end;
+                  q:=tai(p.next);
+                  list.remove(p);
+                  p.free;
+                  p:=q;
+                  continue;
+                end;
+
               ait_instruction:
                 with Taicpu(p) do
                   begin

+ 14 - 1
compiler/scandir.pas

@@ -35,6 +35,7 @@ unit scandir;
       tsavedswitchesstate = record
         localsw: tlocalswitches;
         verbosity: longint;
+        pmessage : pmessagestaterecord;
       end;
 
     type
@@ -944,6 +945,11 @@ unit scandir;
       Dec(switchesstatestackpos);
       recordpendinglocalfullswitch(switchesstatestack[switchesstatestackpos].localsw);
       recordpendingverbosityfullswitch(switchesstatestack[switchesstatestackpos].verbosity);
+      pendingstate.nextmessagerecord:=switchesstatestack[switchesstatestackpos].pmessage;
+      { Reset verbosity and forget previous pmeesage }
+      RestoreLocalVerbosity(nil);
+      current_settings.pmessage:=nil;
+      flushpendingswitchesstate;
     end;
 
     procedure dir_pointermath;
@@ -970,6 +976,7 @@ unit scandir;
       flushpendingswitchesstate;
 
       switchesstatestack[switchesstatestackpos].localsw:= current_settings.localswitches;
+      switchesstatestack[switchesstatestackpos].pmessage:= current_settings.pmessage;
       switchesstatestack[switchesstatestackpos].verbosity:=status.verbosity;
       Inc(switchesstatestackpos);
     end;
@@ -1206,6 +1213,7 @@ unit scandir;
         ident : string;
         state : string;
         msgstate : tmsgstate;
+        i : integer;
       begin
         current_scanner.skipspace;
         ident:=current_scanner.readid;
@@ -1213,6 +1221,7 @@ unit scandir;
         state:=current_scanner.readid;
 
         { support both delphi and fpc switches }
+        { use local ms_on/off/error tmsgstate values }
         if (state='ON') or (state='+') then
           msgstate:=ms_on
         else
@@ -1275,7 +1284,11 @@ unit scandir;
         if ident='ZERO_NIL_COMPAT' then
           recordpendingmessagestate(type_w_zero_to_nil, msgstate)
         else
-          Message1(scanner_w_illegal_warn_identifier,ident);
+          begin
+            i:=0;
+            if not ChangeMessageVerbosity(ident,i,msgstate) then
+              Message1(scanner_w_illegal_warn_identifier,ident);
+          end;
       end;
 
     procedure dir_warning;

+ 2 - 2
compiler/scanner.pas

@@ -309,9 +309,9 @@ implementation
          end
         else
          begin
-           exclude(current_settings.localswitches,cs_ansistrings);
+           exclude(current_settings.localswitches,cs_do_inline);
            if changeinit then
-            exclude(init_settings.localswitches,cs_ansistrings);
+            exclude(init_settings.localswitches,cs_do_inline);
          end;
       end;
 

+ 2 - 1
compiler/sparc/cgcpu.pas

@@ -1052,7 +1052,8 @@ implementation
             begin
               if not((def.typ=pointerdef) or
                     ((def.typ=orddef) and
-                     (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool]))) then
+                     (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,
+                                               pasbool8,pasbool16,pasbool32,pasbool64]))) then
                 begin
                   ai:=TAiCpu.Op_sym(A_Bxx,hl);
                   ai.SetCondition(C_NO);

+ 1 - 55
compiler/sparc/cpubase.pas

@@ -161,50 +161,9 @@ uses
     const
       max_operands = 3;
 
-      {# Constant defining possibly all registers which might require saving }
-      ALL_OTHERREGISTERS = [];
-
-      general_superregisters = [RS_O0..RS_I7];
-
-      {# Table of registers which can be allocated by the code generator
-         internally, when generating the code.
-      }
-      { legend:                                                                }
-      { xxxregs = set of all possibly used registers of that type in the code  }
-      {           generator                                                    }
-      { usableregsxxx = set of all 32bit components of registers that can be   }
-      {           possible allocated to a regvar or using getregisterxxx (this }
-      {           excludes registers which can be only used for parameter      }
-      {           passing on ABI's that define this)                           }
-      { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-
       maxintregs = 8;
-      { to determine how many registers to use for regvars }
-      maxintscratchregs = 3;
-      usableregsint = [RS_L0..RS_L7];
-      c_countusableregsint = 8;
-
       maxfpuregs = 8;
-      usableregsfpu=[RS_F0..RS_F31];
-      c_countusableregsfpu=32;
-
-      mmregs     = [];
-      usableregsmm  = [];
-      c_countusableregsmm  = 0;
-
-      { no distinction on this platform }
       maxaddrregs = 0;
-      addrregs    = [];
-      usableregsaddr = [];
-      c_countusableregsaddr = 0;
-
-{ TODO: firstsaveintreg shall be RS_NO}
-      firstsaveintreg = RS_L0; { Temporary, having RS_NO is broken }
-      lastsaveintreg = RS_L0; { L0..L7 are already saved, I0..O7 are parameter }
-      firstsavefpureg = RS_F2; { F0..F1 is used for return value }
-      lastsavefpureg = RS_F31;
-      firstsavemmreg = RS_INVALID;
-      lastsavemmreg = RS_INVALID;
 
       maxvarregs = 8;
       varregs : Array [1..maxvarregs] of Tsuperregister =
@@ -214,19 +173,6 @@ uses
       fpuvarregs : Array [1..maxfpuvarregs] of TsuperRegister =
                 (RS_F2);
 
-      {
-      max_param_regs_int = 6;
-      param_regs_int: Array[1..max_param_regs_int] of TCpuRegister =
-        (R_3,R_4,R_5,R_6,R_7,R_8,R_9,R_10);
-
-      max_param_regs_fpu = 13;
-      param_regs_fpu: Array[1..max_param_regs_fpu] of TCpuRegister =
-        (R_F1,R_F2,R_F3,R_F4,R_F5,R_F6,R_F7,R_F8,R_F9,R_F10,R_F11,R_F12,R_F13);
-
-      max_param_regs_mm = 13;
-      param_regs_mm: Array[1..max_param_regs_mm] of TCpuRegister =
-        (R_M1,R_M2,R_M3,R_M4,R_M5,R_M6,R_M7,R_M8,R_M9,R_M10,R_M11,R_M12,R_M13);
-      }
 
 
 {*****************************************************************************
@@ -306,7 +252,7 @@ uses
 
       { this is only for the generic code which is not used for this architecture }
       saved_mm_registers : array[0..0] of tsuperregister = (RS_NO);
-      
+
       {# Required parameter alignment when calling a routine declared as
          stdcall and cdecl. The alignment value should be the one defined
          by GCC or the target ABI.

+ 2 - 2
compiler/sparc/racpugas.pas

@@ -598,14 +598,14 @@ Interface
         fillchar(actcondition,sizeof(actcondition),0);
 
          { Search opcodes }
-         actopcode:=tasmop(PtrInt(iasmops.Find(s)));
+         actopcode:=tasmop(PtrUInt(iasmops.Find(s)));
          if actopcode<>A_NONE then
            begin
              actasmtoken:=AS_OPCODE;
              result:=TRUE;
              exit;
            end;
-           
+
         { not found, check branch instructions }
         if (Upcase(s[1])='B') or
            ((Upcase(s[1])='F') and (Upcase(s[2])='B')) then

+ 24 - 1
compiler/switches.pas

@@ -265,8 +265,14 @@ procedure recordpendingverbosityswitch(sw: char; state: char);
   end;
 
 procedure recordpendingmessagestate(msg: longint; state: tmsgstate);
+  var
+    pstate : pmessagestaterecord;
   begin
-    { todo }
+    new(pstate);
+    pstate^.next:=pendingstate.nextmessagerecord;
+    pstate^.value:=msg;
+    pstate^.state:=state;
+    pendingstate.nextmessagerecord:=pstate;
   end;
 
 procedure recordpendinglocalswitch(sw: tlocalswitch; state: char);
@@ -311,6 +317,7 @@ procedure recordpendingcallingswitch(const str: shortstring);
 procedure flushpendingswitchesstate;
   var
     tmpproccal: tproccalloption;
+    fstate, pstate : pmessagestaterecord;
   begin
     { process pending localswitches (range checking, etc) }
     if pendingstate.localswitcheschanged then
@@ -329,6 +336,22 @@ procedure flushpendingswitchesstate;
         setverbosity(pendingstate.nextverbositystr);
         pendingstate.nextverbositystr:='';
       end;
+    fstate:=pendingstate.nextmessagerecord;
+    pstate:=pendingstate.nextmessagerecord;
+    while assigned(pstate) do
+      begin
+        pendingstate.nextmessagerecord:=pstate^.next;
+        SetMessageVerbosity(pstate^.value,pstate^.state);
+        if not assigned(pstate^.next) then
+          begin
+            pstate^.next:=current_settings.pmessage;
+            current_settings.pmessage:=fstate;
+            pstate:=nil;
+          end
+        else
+          pstate:=pstate^.next;
+        pendingstate.nextmessagerecord:=nil;
+      end;
     { process pending calling convention changes (calling x) }
     if pendingstate.nextcallingstr<>'' then
       begin

+ 6 - 2
compiler/symconst.pas

@@ -210,7 +210,8 @@ type
     uvoid,
     u8bit,u16bit,u32bit,u64bit,
     s8bit,s16bit,s32bit,s64bit,
-    pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
+    pasbool8,pasbool16,pasbool32,pasbool64,
+    bool8bit,bool16bit,bool32bit,bool64bit,
     uchar,uwidechar,scurrency
   );
 
@@ -432,7 +433,10 @@ type
     { first field of variant part of a record }
     vo_is_first_field,
     vo_volatile,
-    vo_has_section
+    vo_has_section,
+    { variable contains a winlike WideString which should be finalized
+      even in $J- state }
+    vo_force_finalize
   );
   tvaroptions=set of tvaroption;
 

Some files were not shown because too many files changed in this diff