Browse Source

* first part of x86-64 assembler

git-svn-id: trunk@2824 -
florian 19 years ago
parent
commit
5ece7cbc2f

+ 9 - 0
compiler/cutils.pas

@@ -50,6 +50,8 @@ interface
     function SwapLong(x : longint): longint;{$ifdef USEINLINE}inline;{$endif}
     function SwapLong(x : longint): longint;{$ifdef USEINLINE}inline;{$endif}
     {# Returns the value in @va(x) swapped to different endian }
     {# Returns the value in @va(x) swapped to different endian }
     function SwapWord(x : word): word;{$ifdef USEINLINE}inline;{$endif}
     function SwapWord(x : word): word;{$ifdef USEINLINE}inline;{$endif}
+    {# Returns the value in @va(x) swapped to different endian }
+    Function SwapQWord(x : qword) : qword{$ifdef USEINLINE}inline;{$endif}
     {# Return value @var(i) aligned on @var(a) boundary }
     {# Return value @var(i) aligned on @var(a) boundary }
     function align(i,a:longint):longint;{$ifdef USEINLINE}inline;{$endif}
     function align(i,a:longint):longint;{$ifdef USEINLINE}inline;{$endif}
 
 
@@ -211,6 +213,13 @@ uses
       End;
       End;
 
 
 
 
+    Function SwapQWord(x : qword) : qword{$ifdef USEINLINE}inline;{$endif}
+      Begin
+        result:=swaplong(longint(hi(x)));
+        result:=result or (swaplong(longint(lo(x))) shl 32);
+      End;
+
+
     Function SwapWord(x : word): word;{$ifdef USEINLINE}inline;{$endif}
     Function SwapWord(x : word): word;{$ifdef USEINLINE}inline;{$endif}
       var
       var
         z : byte;
         z : byte;

+ 27 - 0
compiler/i386/i386att.inc

@@ -380,6 +380,10 @@
 'xlatb',
 'xlatb',
 'xor',
 'xor',
 'xstore',
 'xstore',
+'xcryptecb',
+'xcryptcbc',
+'xcryptcfb',
+'xcryptofb',
 'cmov',
 'cmov',
 'j',
 'j',
 'set',
 'set',
@@ -563,6 +567,29 @@
 'movddup',
 'movddup',
 'movshdup',
 'movshdup',
 'movsldup',
 'movsldup',
+'vmread',
+'vmwrite',
+'vmcall',
+'vmlaunch',
+'vmresume',
+'vmxoff',
+'vmxon',
+'vmclear',
+'vmptrld',
+'vmptrst',
+'vmrun',
+'vmmcall',
+'vmload',
+'vmsave',
+'stgi',
+'clgi',
+'skinit',
+'invlpga',
+'montmul',
+'xsha1',
+'xsha256',
+'dmint',
+'rdm',
 'movabs',
 'movabs',
 'movslq',
 'movslq',
 'cqto'
 'cqto'

+ 27 - 0
compiler/i386/i386atts.inc

@@ -380,6 +380,10 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufINT,
 attsufINT,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufINT,
 attsufINT,
 attsufNONE,
 attsufNONE,
 attsufINT,
 attsufINT,
@@ -565,5 +569,28 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 attsufNONE
 );
 );

+ 27 - 0
compiler/i386/i386int.inc

@@ -380,6 +380,10 @@
 'xlatb',
 'xlatb',
 'xor',
 'xor',
 'xstore',
 'xstore',
+'xcryptecb',
+'xcryptcbc',
+'xcryptcfb',
+'xcryptofb',
 'cmov',
 'cmov',
 'j',
 'j',
 'set',
 'set',
@@ -563,6 +567,29 @@
 'movddup',
 'movddup',
 'movshdup',
 'movshdup',
 'movsldup',
 'movsldup',
+'vmread',
+'vmwrite',
+'vmcall',
+'vmlaunch',
+'vmresume',
+'vmxoff',
+'vmxon',
+'vmclear',
+'vmptrld',
+'vmptrst',
+'vmrun',
+'vmmcall',
+'vmload',
+'vmsave',
+'stgi',
+'clgi',
+'skinit',
+'invlpga',
+'montmul',
+'xsha1',
+'xsha256',
+'dmint',
+'rdm',
 'movabs',
 'movabs',
 'movsxd',
 'movsxd',
 'cqo'
 'cqo'

+ 1 - 1
compiler/i386/i386nop.inc

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

+ 27 - 0
compiler/i386/i386op.inc

@@ -380,6 +380,10 @@ A_XLAT,
 A_XLATB,
 A_XLATB,
 A_XOR,
 A_XOR,
 A_XSTORE,
 A_XSTORE,
+A_XCRYPTECB,
+A_XCRYPTCBC,
+A_XCRYPTCFB,
+A_XCRYPTOFB,
 A_CMOVcc,
 A_CMOVcc,
 A_Jcc,
 A_Jcc,
 A_SETcc,
 A_SETcc,
@@ -563,6 +567,29 @@ A_LDDQU,
 A_MOVDDUP,
 A_MOVDDUP,
 A_MOVSHDUP,
 A_MOVSHDUP,
 A_MOVSLDUP,
 A_MOVSLDUP,
+A_VMREAD,
+A_VMWRITE,
+A_VMCALL,
+A_VMLAUNCH,
+A_VMRESUME,
+A_VMXOFF,
+A_VMXON,
+A_VMCLEAR,
+A_VMPTRLD,
+A_VMPTRST,
+A_VMRUN,
+A_VMMCALL,
+A_VMLOAD,
+A_VMSAVE,
+A_STGI,
+A_CLGI,
+A_SKINIT,
+A_INVLPGA,
+A_MONTMUL,
+A_XSHA1,
+A_XSHA256,
+A_DMINT,
+A_RDM,
 A_MOVABS,
 A_MOVABS,
 A_MOVSXD,
 A_MOVSXD,
 A_CQO
 A_CQO

+ 27 - 0
compiler/i386/i386prop.inc

@@ -380,6 +380,10 @@
 (Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
 (Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)),
 (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_ROp1, Ch_WOp2, Ch_RFLAGS)),
 (Ch: (Ch_ROp1, Ch_WOp2, Ch_RFLAGS)),
 (Ch: (Ch_None, Ch_None, Ch_None)),
 (Ch: (Ch_None, Ch_None, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
@@ -563,6 +567,29 @@
 (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_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_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_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_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_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_MRAX, Ch_WRDX, Ch_None))
 (Ch: (Ch_MRAX, Ch_WRDX, Ch_None))

+ 203 - 0
compiler/i386/i386tab.inc

@@ -8848,6 +8848,34 @@
     code    : #3#15#167#192;
     code    : #3#15#167#192;
     flags   : if_p6 or if_cyrix
     flags   : if_p6 or if_cyrix
   ),
   ),
+  (
+    opcode  : A_XCRYPTECB;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#167#208;
+    flags   : if_p6 or if_cyrix
+  ),
+  (
+    opcode  : A_XCRYPTCFB;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#167#232;
+    flags   : if_p6 or if_cyrix
+  ),
   (
   (
     opcode  : A_CMOVcc;
     opcode  : A_CMOVcc;
     ops     : 2;
     ops     : 2;
@@ -11549,5 +11577,180 @@
     optypes : (ot_xmmreg,ot_xmmreg,ot_none);
     optypes : (ot_xmmreg,ot_xmmreg,ot_none);
     code    : #3#243#15#18#72;
     code    : #3#243#15#18#72;
     flags   : if_prescott or if_sse3
     flags   : if_prescott or if_sse3
+  ),
+  (
+    opcode  : A_VMREAD;
+    ops     : 2;
+    optypes : (ot_reg32,ot_reg32,ot_none);
+    code    : #192#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);
+    code    : #192#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);
+    code    : #193#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);
+    code    : #193#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);
+    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);
+    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);
+    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);
+    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);
+    code    : #192#219#2#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMCLEAR;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#3#102#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMPTRLD;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#2#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMPTRST;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#2#15#199#135;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMRUN;
+    ops     : 0;
+    optypes : (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);
+    code    : #3#15#1#217;
+    flags   : if_386 or if_svm
+  ),
+  (
+    opcode  : A_VMLOAD;
+    ops     : 0;
+    optypes : (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);
+    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);
+    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);
+    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);
+    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);
+    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);
+    code    : #219#3#15#166#192;
+    flags   : if_centaur
+  ),
+  (
+    opcode  : A_XSHA1;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#166#208;
+    flags   : if_centaur
+  ),
+  (
+    opcode  : A_DMINT;
+    ops     : 0;
+    optypes : (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);
+    code    : #2#15#58;
+    flags   : if_p6 or if_cyrix
   )
   )
 );
 );

+ 1 - 0
compiler/msg/errore.msg

@@ -1791,6 +1791,7 @@ asmw_e_duplicate_label=08016_E_Asm: Duplicate label $1
 asmw_e_redefined_label=08017_E_Asm: Redefined label $1
 asmw_e_redefined_label=08017_E_Asm: Redefined label $1
 asmw_e_first_defined_label=08018_E_Asm: First defined here
 asmw_e_first_defined_label=08018_E_Asm: First defined here
 asmw_e_invalid_register=08019_E_Asm: Invalid register $1
 asmw_e_invalid_register=08019_E_Asm: Invalid register $1
+asmw_e_16bit_32bit_not_supported=08020_E_Asm: 16 or 32 Bit references not supported
 
 
 #
 #
 # Executing linker/assembler
 # Executing linker/assembler

+ 3 - 2
compiler/msgidx.inc

@@ -535,6 +535,7 @@ const
   asmw_e_redefined_label=08017;
   asmw_e_redefined_label=08017;
   asmw_e_first_defined_label=08018;
   asmw_e_first_defined_label=08018;
   asmw_e_invalid_register=08019;
   asmw_e_invalid_register=08019;
+  asmw_e_16bit_32bit_not_supported=08020;
   exec_w_source_os_redefined=09000;
   exec_w_source_os_redefined=09000;
   exec_i_assembling_pipe=09001;
   exec_i_assembling_pipe=09001;
   exec_d_cant_create_asmfile=09002;
   exec_d_cant_create_asmfile=09002;
@@ -669,9 +670,9 @@ const
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 39753;
+  MsgTxtSize = 39804;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
-    19,74,219,59,62,47,100,20,135,60,
+    19,74,219,59,62,47,100,21,135,60,
     41,1,1,1,1,1,1,1,1,1
     41,1,1,1,1,1,1,1,1,1
   );
   );

+ 123 - 123
compiler/msgtxt.inc

@@ -583,154 +583,154 @@ const msgtxt : array[0..000165,1..240] of char=(
   '08017_E_Asm: Redefined label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08018_E_Asm: First defined here'#000+
   '08018_E_Asm: First defined here'#000+
   '08019_E_Asm: Invalid register $1'#000+
   '08019_E_Asm: Invalid register $1'#000+
-  '09000_W_Source operating system redefined'#000+
-  '09001_I_Assembling',' (pipe) $1'#000+
+  '08020_E_Asm: 16 or 32 Bit references not supported'#000+
+  '09000_W_S','ource operating system redefined'#000+
+  '09001_I_Assembling (pipe) $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
   '09003_E_Can'#039't create object file: $1'#000+
   '09003_E_Can'#039't create object file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
-  '09005_E_Assembler $1 not found, switching to external assembling'#000+
+  '09005_E_Assembler $1 not found, switching to external assemblin','g'#000+
   '09006_T_Using assembler: $1'#000+
   '09006_T_Using assembler: $1'#000+
-  '09007_E_Error while a','ssembling exitcode $1'#000+
+  '09007_E_Error while assembling exitcode $1'#000+
   '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
   '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
   'ssembling'#000+
   'ssembling'#000+
   '09009_I_Assembling $1'#000+
   '09009_I_Assembling $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
-  '09011_W_Object $1 not found, Linking may fail !'#000+
-  '09012_W_Library $1 not found, Li','nking may fail !'#000+
+  '09011_W_Object $1 not found, ','Linking may fail !'#000+
+  '09012_W_Library $1 not found, Linking may fail !'#000+
   '09013_E_Error while linking'#000+
   '09013_E_Error while linking'#000+
   '09014_E_Can'#039't call the linker, switching to external linking'#000+
   '09014_E_Can'#039't call the linker, switching to external linking'#000+
   '09015_I_Linking $1'#000+
   '09015_I_Linking $1'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
-  '09017_T_Using util $1'#000+
-  '09018_E_Creation of Executables not ','supported'#000+
+  '09017_T','_Using util $1'#000+
+  '09018_E_Creation of Executables not supported'#000+
   '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09020_I_Closing script $1'#000+
   '09020_I_Closing script $1'#000+
   '09021_E_resource compiler not found, switching to external mode'#000+
   '09021_E_resource compiler not found, switching to external mode'#000+
-  '09022_I_Compiling resource $1'#000+
-  '09023_T_unit $1 can'#039't be statically linked, switchi','ng to smart l'+
-  'inking'#000+
+  '09022_I_Compiling resource $1'#000,
+  '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
+  'king'#000+
   '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+
   '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+
   #000+
   #000+
   '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
   '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
   'g'#000+
   'g'#000+
-  '09026_E_unit $1 can'#039't be smart or static linked'#000+
-  '09027_E_unit $1 can'#039't be shared or st','atic linked'#000+
+  '09026_E_unit $1 can'#039't be smart or ','static linked'#000+
+  '09027_E_unit $1 can'#039't be shared or static linked'#000+
   '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
   '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
   '09128_F_Can'#039't post process executable $1'#000+
   '09128_F_Can'#039't post process executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09130_X_Size of Code: $1 bytes'#000+
   '09130_X_Size of Code: $1 bytes'#000+
-  '09131_X_Size of initialized data: $1 bytes'#000+
-  '09132_X_Size of',' uninitialized data: $1 bytes'#000+
+  '09131_X','_Size of initialized data: $1 bytes'#000+
+  '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09134_X_Stack space committed: $1 bytes'#000+
   '09134_X_Stack space committed: $1 bytes'#000+
   '10000_T_Unitsearch: $1'#000+
   '10000_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10002_U_PPU Name: $1'#000+
-  '10003_U_PPU Flags: $1'#000+
+  '10003_U_PPU F','lags: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10005_U_PPU Time: $1'#000+
-  '1','0006_U_PPU File too short'#000+
+  '10006_U_PPU File too short'#000+
   '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10009_U_PPU is compiled for another processor'#000+
   '10009_U_PPU is compiled for another processor'#000+
-  '10010_U_PPU is compiled for an other target'#000+
+  '10010_U_PPU is compiled for an other ','target'#000+
   '10011_U_PPU Source: $1'#000+
   '10011_U_PPU Source: $1'#000+
   '10012_U_Writing $1'#000+
   '10012_U_Writing $1'#000+
-  '10','013_F_Can'#039't Write PPU-File'#000+
+  '10013_F_Can'#039't Write PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10018_E_Illegal unit name: $1'#000+
   '10018_E_Illegal unit name: $1'#000+
-  '10019_F_Too much units'#000+
-  '10020_F_Circular unit referen','ce between $1 and $2'#000+
+  '1','0019_F_Too much units'#000+
+  '10020_F_Circular unit reference between $1 and $2'#000+
   '10021_F_Can'#039't compile unit $1, no sources available'#000+
   '10021_F_Can'#039't compile unit $1, no sources available'#000+
   '10022_F_Can'#039't find unit $1'#000+
   '10022_F_Can'#039't find unit $1'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10024_F_Unit $1 searched but $2 found'#000+
   '10024_F_Unit $1 searched but $2 found'#000+
-  '10025_W_Compiling the system unit requires the -Us switch'#000,
+  '10025_W','_Compiling the system unit requires the -Us switch'#000+
   '10026_F_There were $1 errors compiling module, stopping'#000+
   '10026_F_There were $1 errors compiling module, stopping'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10029_U_Recompiling $1, source found only'#000+
   '10029_U_Recompiling $1, source found only'#000+
-  '10030_U_Recompiling unit, static lib is older than ppufile'#000+
-  '1','0031_U_Recompiling unit, shared lib is older than ppufile'#000+
+  '10030_U_R','ecompiling unit, static lib is older than ppufile'#000+
+  '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
-  '10034_U_Parsing interface of $1'#000+
+  '10034_U_Parsing interf','ace of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
-  '1003','6_U_Second load for unit $1'#000+
+  '10036_U_Second load for unit $1'#000+
   '10037_U_PPU Check file $1 time $2'#000+
   '10037_U_PPU Check file $1 time $2'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10041_H_File $1 is newer than Release PPU file $2'#000+
   '10041_H_File $1 is newer than Release PPU file $2'#000+
-  '10042_U_Using a unit which was not compiled with correct FPU mo','de'#000+
+  '10042_U_Usin','g a unit which was not compiled with correct FPU mode'#000+
   '10043_U_Loading interface units from $1'#000+
   '10043_U_Loading interface units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10046_U_Implementation CRC changed for unit $1'#000+
   '10046_U_Implementation CRC changed for unit $1'#000+
-  '10047_U_Finished compiling unit $1'#000+
-  '10048_U_Add dependency of $1',' to $2'#000+
+  '10047_U_Fini','shed compiling unit $1'#000+
+  '10048_U_Add dependency of $1 to $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10052_U_Forced reloading'#000+
   '10052_U_Forced reloading'#000+
   '10053_U_Previous state of $1: $2'#000+
   '10053_U_Previous state of $1: $2'#000+
-  '10054_U_Already compiling $1, setting second compile'#000+
-  '10055_U_Load','ing unit $1'#000+
+  '10054_U_Alread','y compiling $1, setting second compile'#000+
+  '10055_U_Loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10057_U_Registering new unit $1'#000+
   '10057_U_Registering new unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
-  '11000_O_$1 [options] <inputfile> [options]'#000+
-  '11001_W_Only one source fil','e supported'#000+
+  '11000_O_$1 [options','] <inputfile> [options]'#000+
+  '11001_W_Only one source file supported'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11003_E_nested response files are not supported'#000+
   '11003_E_nested response files are not supported'#000+
   '11004_F_No source file name in command line'#000+
   '11004_F_No source file name in command line'#000+
-  '11005_N_No option inside $1 config file'#000+
+  '11005_N_No option inside $1 config file',#000+
   '11006_E_Illegal parameter: $1'#000+
   '11006_E_Illegal parameter: $1'#000+
-  '11007_H_-? writes he','lp pages'#000+
+  '11007_H_-? writes help pages'#000+
   '11008_F_Too many config files nested'#000+
   '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
   '11009_F_Unable to open file $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11011_W_Target is already set to: $1'#000+
-  '11012_W_Shared libs not supported on DOS platform, reverting to static'+
-  #000+
-  '11013_F_too man','y IF(N)DEFs'#000+
+  '11012_W_Shared libs not supported o','n DOS platform, reverting to stat'+
+  'ic'#000+
+  '11013_F_too many IF(N)DEFs'#000+
   '11014_F_too many ENDIFs'#000+
   '11014_F_too many ENDIFs'#000+
   '11015_F_open conditional at the end of the file'#000+
   '11015_F_open conditional at the end of the file'#000+
   '11016_W_Debug information generation is not supported by this executab'+
   '11016_W_Debug information generation is not supported by this executab'+
   'le'#000+
   'le'#000+
-  '11017_H_Try recompiling with -dGDB'#000+
+  '11017_H_Try recompiling with -dG','DB'#000+
   '11018_E_You are using the obsolete switch $1'#000+
   '11018_E_You are using the obsolete switch $1'#000+
-  '110','19_E_You are using the obsolete switch $1, please use $2'#000+
+  '11019_E_You are using the obsolete switch $1, please use $2'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
   '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
   '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
-  '11022_W_"$1" assembler use forced'#000+
-  '11026_T_Reading op','tions from file $1'#000+
+  '1','1022_W_"$1" assembler use forced'#000+
+  '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11028_D_Handling option "$1"'#000+
   '11029__*** press enter ***'#000+
   '11029__*** press enter ***'#000+
   '11030_H_Start of reading config file $1'#000+
   '11030_H_Start of reading config file $1'#000+
-  '11031_H_End of reading config file $1'#000+
+  '11031_H_End of reading config ','file $1'#000+
   '11032_D_interpreting option "$1"'#000+
   '11032_D_interpreting option "$1"'#000+
-  '11036_D_in','terpreting firstpass option "$1"'#000+
+  '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11039_E_Unknown code page'#000+
-  '11040_F_Config file $1 is a directory'#000+
-  '11023_Free Pascal Compiler version $','FPCVERSION [$FPCDATE] for $FPCCP'+
-  'U'#010+
+  '11040_F_Config file $1 ','is a directory'#000+
+  '11023_Free Pascal Compiler version $FPCVERSION [$FPCDATE] for $FPCCPU'#010+
   'Copyright (c) 1993-2005 by Florian Klaempfl'#000+
   'Copyright (c) 1993-2005 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   #010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   #010+
   #010+
-  'Supported targets:'#010+
+  'Sup','ported targets:'#010+
   '  $OSTARGETS'#010+
   '  $OSTARGETS'#010+
   #010+
   #010+
-  'Supported CPU instruc','tion sets:'#010+
+  'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   '  $INSTRUCTIONSETS'#010+
   #010+
   #010+
   'Supported FPU instruction sets:'#010+
   'Supported FPU instruction sets:'#010+
@@ -739,170 +739,170 @@ const msgtxt : array[0..000165,1..240] of char=(
   'This program comes under the GNU General Public Licence'#010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   'For more information read COPYING.FPC'#010+
   #010+
   #010+
-  'Report bugs,suggestions etc to:'#010+
-  '                 bugrep@fre','epascal.org'#000+
+  'Report b','ugs,suggestions etc to:'#010+
+  '                 [email protected]'#000+
   '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
   '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
   'ble it'#010+
   'ble it'#010+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#010+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#010+
-  '**2al_list sourcecode lines in assembler file'#010+
+  '**2al_list sourcecode lines in assembl','er file'#010+
   '**2an_list node info in assembler file'#010+
   '**2an_list node info in assembler file'#010+
-  '*L2a','p_use pipes instead of creating temporary assembler files'#010+
+  '*L2ap_use pipes instead of creating temporary assembler files'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
-  '**1A<x>_output format:'#010+
+  '**1A<x>_out','put format:'#010+
   '**2Adefault_use default assembler'#010+
   '**2Adefault_use default assembler'#010+
-  '3*2Aa','s_assemble using GNU AS'#010+
+  '3*2Aas_assemble using GNU AS'#010+
   '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
   '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
-  '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
+  '3*2Anasmwdosx_Win32/WDOSX object file',' using Nasm'#010+
   '3*2Awasm_obj file using Wasm (Watcom)'#010+
   '3*2Awasm_obj file using Wasm (Watcom)'#010+
-  '3','*2Anasmobj_obj file using Nasm'#010+
+  '3*2Anasmobj_obj file using Nasm'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
   '3*2Aelf_elf32 (Linux) using internal writer'#010+
   '3*2Aelf_elf32 (Linux) using internal writer'#010+
-  '3*2Acoff_coff (Go32v2) using internal writer'#010+
-  '3*2Apecoff_pecoff (Win32) using internal',' writer'#010+
+  '3*2Acoff_coff (Go32v2) using inter','nal writer'#010+
+  '3*2Apecoff_pecoff (Win32) using internal writer'#010+
   '4*2Aas_assemble using GNU AS'#010+
   '4*2Aas_assemble using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amot_Standard Motorola assembler'#010+
   '6*2Amot_Standard Motorola assembler'#010+
-  'A*2Aas_assemble using GNU AS'#010+
+  'A*2Aas_assemble using GN','U AS'#010+
   'P*2Aas_assemble using GNU AS'#010+
   'P*2Aas_assemble using GNU AS'#010+
-  'S*2Aas_assemble u','sing GNU AS'#010+
+  'S*2Aas_assemble using GNU AS'#010+
   '**1b_generate browser info'#010+
   '**1b_generate browser info'#010+
   '**2bl_generate local symbol info'#010+
   '**2bl_generate local symbol info'#010+
   '**1B_build all modules'#010+
   '**1B_build all modules'#010+
   '**1C<x>_code generation options:'#010+
   '**1C<x>_code generation options:'#010+
   '**2Cc<x>_set default calling convention to <x>'#010+
   '**2Cc<x>_set default calling convention to <x>'#010+
-  '**2CD_create also dynamic library (not supported)'#010+
-  '**2Ce_Compilati','on with emulated floating point opcodes'#010+
+  '**2CD_create a','lso dynamic library (not supported)'#010+
+  '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   'lues'#010+
   'lues'#010+
   '**2Cg_Generate PIC code'#010+
   '**2Cg_Generate PIC code'#010+
-  '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
+  '**2Ch<n>_<n> bytes heap (between 1023 and 67107840',')'#010+
   '**2Ci_IO-checking'#010+
   '**2Ci_IO-checking'#010+
   '**2Cn_omit linking stage'#010+
   '**2Cn_omit linking stage'#010+
-  '**2Co_','check overflow of integer operations'#010+
+  '**2Co_check overflow of integer operations'#010+
   '**2Cp<x>_select instruction set, see fpc -i for possible values'#010+
   '**2Cp<x>_select instruction set, see fpc -i for possible values'#010+
   '**2Cr_range checking'#010+
   '**2Cr_range checking'#010+
   '**2CR_verify object method call validity'#010+
   '**2CR_verify object method call validity'#010+
-  '**2Cs<n>_set stack size to <n>'#010+
+  '**2Cs<n>_set stack size to',' <n>'#010+
   '**2Ct_stack checking'#010+
   '**2Ct_stack checking'#010+
-  '**2CX_create also smartli','nked library'#010+
+  '**2CX_create also smartlinked library'#010+
   '**1d<x>_defines the symbol <x>'#010+
   '**1d<x>_defines the symbol <x>'#010+
   '**1D_generate a DEF file'#010+
   '**1D_generate a DEF file'#010+
   '**2Dd<x>_set description to <x>'#010+
   '**2Dd<x>_set description to <x>'#010+
   '**2Dv<x>_set DLL version to <x>'#010+
   '**2Dv<x>_set DLL version to <x>'#010+
   '*O2Dw_PM application'#010+
   '*O2Dw_PM application'#010+
   '**1e<x>_set path to executable'#010+
   '**1e<x>_set path to executable'#010+
-  '**1E_same as -Cn'#010+
+  '**1E','_same as -Cn'#010+
   '**1F<x>_set file names and paths:'#010+
   '**1F<x>_set file names and paths:'#010+
-  '**2F','a<x>[,y]_for a program load first units <x> and [y] before uses '+
-  'is parsed'#010+
+  '**2Fa<x>[,y]_for a program load first units <x> and [y] before uses is'+
+  ' parsed'#010+
   '**2Fc<x>_sets input codepage to <x>'#010+
   '**2Fc<x>_sets input codepage to <x>'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
-  '**2Fe<x>_redirect error output to <x>'#010+
-  '**2FE<x>_set exe/unit out','put path to <x>'#010+
+  '**2Fe<x>_red','irect error output to <x>'#010+
+  '**2FE<x>_set exe/unit output path to <x>'#010+
   '**2Fi<x>_adds <x> to include path'#010+
   '**2Fi<x>_adds <x> to include path'#010+
   '**2Fl<x>_adds <x> to library path'#010+
   '**2Fl<x>_adds <x> to library path'#010+
   '**2FL<x>_uses <x> as dynamic linker'#010+
   '**2FL<x>_uses <x> as dynamic linker'#010+
   '**2Fo<x>_adds <x> to object path'#010+
   '**2Fo<x>_adds <x> to object path'#010+
-  '**2Fr<x>_load error message file <x>'#010+
+  '**2Fr<x>_load error message file <x>',#010+
   '**2Fu<x>_adds <x> to unit path'#010+
   '**2Fu<x>_adds <x> to unit path'#010+
-  '**2FU<x>_set unit o','utput path to <x>, overrides -FE'#010+
+  '**2FU<x>_set unit output path to <x>, overrides -FE'#010+
   '*g1g_generate debugger information:'#010+
   '*g1g_generate debugger information:'#010+
   '*g2gc_generate checks for pointers'#010+
   '*g2gc_generate checks for pointers'#010+
   '*g2gd_use dbx'#010+
   '*g2gd_use dbx'#010+
   '*g2gg_use gsym'#010+
   '*g2gg_use gsym'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
-  '*g2gl_use line info unit to show more info for backtr','aces'#010+
+  '*g','2gl_use line info unit to show more info for backtraces'#010+
   '*g2gv_generates programs traceable with valgrind'#010+
   '*g2gv_generates programs traceable with valgrind'#010+
   '*g2gw_generate dwarf debugging info'#010+
   '*g2gw_generate dwarf debugging info'#010+
   '**1i_information'#010+
   '**1i_information'#010+
   '**2iD_return compiler date'#010+
   '**2iD_return compiler date'#010+
   '**2iV_return compiler version'#010+
   '**2iV_return compiler version'#010+
-  '**2iSO_return compiler OS'#010+
+  '**2iSO_return compiler OS',#010+
   '**2iSP_return compiler processor'#010+
   '**2iSP_return compiler processor'#010+
-  '**2iTO_return tar','get OS'#010+
+  '**2iTO_return target OS'#010+
   '**2iTP_return target processor'#010+
   '**2iTP_return target processor'#010+
   '**1I<x>_adds <x> to include path'#010+
   '**1I<x>_adds <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1l_write logo'#010+
   '**1l_write logo'#010+
   '**1M<x>_set language mode to <x>'#010+
   '**1M<x>_set language mode to <x>'#010+
-  '**2Mfpc_free pascal dialect (default)'#010+
+  '**2Mfpc_free pascal dialect (default)'#010,
   '**2Mobjfpc_switch some Delphi 2 extensions on'#010+
   '**2Mobjfpc_switch some Delphi 2 extensions on'#010+
-  '**2Md','elphi_tries to be Delphi compatible'#010+
+  '**2Mdelphi_tries to be Delphi compatible'#010+
   '**2Mtp_tries to be TP/BP 7.0 compatible'#010+
   '**2Mtp_tries to be TP/BP 7.0 compatible'#010+
   '**2Mgpc_tries to be gpc compatible'#010+
   '**2Mgpc_tries to be gpc compatible'#010+
   '**2Mmacpas_tries to be compatible to the macintosh pascal dialects'#010+
   '**2Mmacpas_tries to be compatible to the macintosh pascal dialects'#010+
-  '**1n_don'#039't read the default config file'#010+
-  '**1N<x>_node tree opti','mizations'#010+
+  '**1n_don'#039't ','read the default config file'#010+
+  '**1N<x>_node tree optimizations'#010+
   '**2Nu_unroll loops'#010+
   '**2Nu_unroll loops'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1O<x>_optimizations:'#010+
   '**1O<x>_optimizations:'#010+
   '3*2Oa_<type>=<values> set alignment'#010+
   '3*2Oa_<type>=<values> set alignment'#010+
   '3*2Og_generate smaller code'#010+
   '3*2Og_generate smaller code'#010+
-  '3*2OG_generate faster code (default)'#010+
-  '**2Or_keep certain variables ','in registers'#010+
+  '3*2OG_generate ','faster code (default)'#010+
+  '**2Or_keep certain variables in registers'#010+
   '3*2Ou_enable uncertain optimizations (see docs)'#010+
   '3*2Ou_enable uncertain optimizations (see docs)'#010+
   '3*2O1_level 1 optimizations (quick optimizations)'#010+
   '3*2O1_level 1 optimizations (quick optimizations)'#010+
   '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+
   '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+
-  '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 times)'#010+
-  '3*2Op<x>_targe','t processor:'#010+
+  '3*2O3_level 3 optimiz','ations (-O2 repeatedly, max 5 times)'#010+
+  '3*2Op<x>_target processor:'#010+
   '3*3Op1_set target processor to 386/486'#010+
   '3*3Op1_set target processor to 386/486'#010+
   '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+
   '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+
   '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+
   '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+
-  '6*2Og_generate smaller code'#010+
+  '6*2Og_generate smaller code'#010,
   '6*2OG_generate faster code (default)'#010+
   '6*2OG_generate faster code (default)'#010+
-  '6*2Ox_optimize',' maximum (still BUGGY!!!)'#010+
+  '6*2Ox_optimize maximum (still BUGGY!!!)'#010+
   '6*2O0_set target processor to a MC68000'#010+
   '6*2O0_set target processor to a MC68000'#010+
   '6*2O2_set target processor to a MC68020+ (default)'#010+
   '6*2O2_set target processor to a MC68020+ (default)'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
-  '**1R<x>_assembler reading style:'#010+
-  '**2Rdefault_use default assemb','ler'#010+
+  '**1R<x>_asse','mbler reading style:'#010+
+  '**2Rdefault_use default assembler'#010+
   '3*2Ratt_read AT&T style assembler'#010+
   '3*2Ratt_read AT&T style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '**1S<x>_syntax options:'#010+
   '**1S<x>_syntax options:'#010+
   '**2S2_same as -Mobjfpc'#010+
   '**2S2_same as -Mobjfpc'#010+
-  '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+
-  '**2Sa_include assertion code.'#010,
+  '**2Sc_supports operators like',' C (*=,+=,/= and -=)'#010+
+  '**2Sa_include assertion code.'#010+
   '**2Sd_same as -Mdelphi'#010+
   '**2Sd_same as -Mdelphi'#010+
   '**2Se<x>_error options. <x> is a combination of the following:'#010+
   '**2Se<x>_error options. <x> is a combination of the following:'#010+
   '**3*_<n> : compiler stops after the <n> errors (default is 1)'#010+
   '**3*_<n> : compiler stops after the <n> errors (default is 1)'#010+
-  '**3*_w : compiler stops also after warnings'#010+
+  '**3*_w : compiler stops also after warnin','gs'#010+
   '**3*_n : compiler stops also after notes'#010+
   '**3*_n : compiler stops also after notes'#010+
-  '**3*_h ',': compiler stops also after hints'#010+
+  '**3*_h : compiler stops also after hints'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Sk_load fpcylix unit'#010+
   '**2Sk_load fpcylix unit'#010+
   '**2SI<x>_set interface style to <x>'#010+
   '**2SI<x>_set interface style to <x>'#010+
-  '**3SIcom_COM compatible interface (default)'#010+
-  '**3SIcorba_CORBA comp','atible interface'#010+
+  '**3SIcom_COM c','ompatible interface (default)'#010+
+  '**3SIcorba_CORBA compatible interface'#010+
   '**2Sm_support macros like C (global)'#010+
   '**2Sm_support macros like C (global)'#010+
   '**2So_same as -Mtp'#010+
   '**2So_same as -Mtp'#010+
   '**2Sp_same as -Mgpc'#010+
   '**2Sp_same as -Mgpc'#010+
   '**2Ss_constructor name must be init (destructor must be done)'#010+
   '**2Ss_constructor name must be init (destructor must be done)'#010+
-  '**2St_allow static keyword in objects'#010+
+  '**2St_allow static keyword in obje','cts'#010+
   '**1s_don'#039't call assembler and linker'#010+
   '**1s_don'#039't call assembler and linker'#010+
-  '**2sh_Gene','rate script to link on host'#010+
+  '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '**1T<x>_Target operating system:'#010+
-  '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via EMX (including EMX','/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Versi','on 2 of DJ Delorie DOS extender'#010+
+  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3*2Tos2_OS/2 / eComStation'#010+
+  '3*2Tos2_OS/2 / eComS','tation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
-  '3*2Twatcom_Watcom co','mpatible DOS extender'#010+
+  '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '3*2Twince_Windows CE'#010+
@@ -910,59 +910,59 @@ const msgtxt : array[0..000165,1..240] of char=(
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux/m68k'#010+
   '6*2Tlinux_Linux/m68k'#010+
-  '6*2Tmacos_Macintosh m68k (not supported)'#010+
-  '6*2Tpalmos_Pa','lmOS'#010+
+  '6*2','Tmacos_Macintosh m68k (not supported)'#010+
+  '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tdarwin_Darwin and MacOS X on PowerPC'#010+
   'P*2Tdarwin_Darwin and MacOS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tmacos_MacOS (classic) on PowerPC'#010+
   'P*2Tmacos_MacOS (classic) on PowerPC'#010+
-  'P*2Tmorphos_MorphOS'#010+
+  'P*2Tmorphos_M','orphOS'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u<x>_undefines the symbol',' <x>'#010+
+  '**1u<x>_undefines the symbol <x>'#010+
   '**1U_unit options:'#010+
   '**1U_unit options:'#010+
   '**2Un_don'#039't check the unit name'#010+
   '**2Un_don'#039't check the unit name'#010+
   '**2Ur_generate release unit files'#010+
   '**2Ur_generate release unit files'#010+
   '**2Us_compile a system unit'#010+
   '**2Us_compile a system unit'#010+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
-  '**2*_e : Show errors (default)       0 : Show nothing (','except errors'+
+  '**2*','_e : Show errors (default)       0 : Show nothing (except errors'+
   ')'#010+
   ')'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints                  c : Show conditionals'#010+
-  '**2*_i : Show general info           d : Show d','ebug info'#010+
+  '**2*_h : Show hints                  c : Show condition','als'#010+
+  '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
   '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
-  '**2*_b : Write file names messages with full path'#010+
-  '**2*_v : write fpcdebug.txt with     p :',' Write tree.log with parse t'+
-  'ree'#010+
+  '**2*_b : Write file names messages with',' full path'#010+
+  '**2*_v : write fpcdebug.txt with     p : Write tree.log with parse tre'+
+  'e'#010+
   '**2*_    lots of debugging info'#010+
   '**2*_    lots of debugging info'#010+
   '3*1W<x>_Win32-like target options'#010+
   '3*1W<x>_Win32-like target options'#010+
   '3*2WB_Create a relocatable image'#010+
   '3*2WB_Create a relocatable image'#010+
   '3*2WB<x>_Set Image base to Hexadecimal <x> value'#010+
   '3*2WB<x>_Set Image base to Hexadecimal <x> value'#010+
-  '3*2WC_Specify console type application'#010+
-  '3*2WD_Use DEFFILE to ','export functions of DLL or EXE'#010+
+  '3*2WC_Spe','cify console type application'#010+
+  '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+
   '3*2WF_Specify full-screen type application (OS/2 only)'#010+
   '3*2WF_Specify full-screen type application (OS/2 only)'#010+
   '3*2WG_Specify graphic type application'#010+
   '3*2WG_Specify graphic type application'#010+
-  '3*2WN_Do not generate relocation code (necessary for debugging)'#010+
+  '3*2WN_Do not generate relocation code (necessary for debugging)'#010,
   '3*2WR_Generate relocation code'#010+
   '3*2WR_Generate relocation code'#010+
-  'P*2WC_Specify consol','e type application (MacOS only)'#010+
+  'P*2WC_Specify console type application (MacOS only)'#010+
   'P*2WG_Specify graphic type application (MacOS only)'#010+
   'P*2WG_Specify graphic type application (MacOS only)'#010+
   'P*2WT_Specify tool type application (MPW tool, MacOS only)'#010+
   'P*2WT_Specify tool type application (MPW tool, MacOS only)'#010+
   '**1X_executable options:'#010+
   '**1X_executable options:'#010+
-  '**2Xc_pass --shared to the linker (Unix only)'#010+
-  '**2Xd_don'#039't use standard l','ibrary search path (needed for cross c'+
-  'ompile)'#010+
+  '**2Xc_pass --shared t','o the linker (Unix only)'#010+
+  '**2Xd_don'#039't use standard library search path (needed for cross com'+
+  'pile)'#010+
   '**2XD_try to link units dynamic          (defines FPC_LINK_DYNAMIC)'#010+
   '**2XD_try to link units dynamic          (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xm_generate link map'#010+
   '**2Xm_generate link map'#010+
-  '**2XM<x>_set the name of the '#039'main'#039' program routine (default i'+
-  's '#039'main'#039')'#010+
-  '**2XP<x>_prepend the binutils ','names with the prefix <x>'#010+
+  '**2XM<x>_set the name of the '#039'main'#039' program routine',' (default'+
+  ' is '#039'main'#039')'#010+
+  '**2XP<x>_prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_set library search path to <x> (needed for cross compile)'#010+
   '**2Xr<x>_set library search path to <x> (needed for cross compile)'#010+
   '**2Xs_strip all symbols from executable'#010+
   '**2Xs_strip all symbols from executable'#010+
-  '**2XS_try to link units static (default) (defines FPC_LINK_STATIC)'#010+
-  '**2Xt_link with static libraries (-stati','c is passed to linker)'#010+
+  '**2XS_try to link units static (default) (defines FPC_LI','NK_STATIC)'#010+
+  '**2Xt_link with static libraries (-static is passed to linker)'#010+
   '**2XX_try to link units smart            (defines FPC_LINK_SMART)'#010+
   '**2XX_try to link units smart            (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1*_'#010+
   '**1?_shows this help'#010+
   '**1?_shows this help'#010+

+ 387 - 20
compiler/ogelf.pas

@@ -120,6 +120,61 @@ implementation
       R_386_GOTOFF = 9;                { an offset from GOT base }
       R_386_GOTOFF = 9;                { an offset from GOT base }
       R_386_GOTPC = 10;                { a PC-relative offset _to_ GOT }
       R_386_GOTPC = 10;                { a PC-relative offset _to_ GOT }
 
 
+      R_SPARC_32 = 3;
+      R_SPARC_WDISP30 = 7;
+      R_SPARC_HI22 = 9;
+      R_SPARC_LO10 = 12;
+
+      { AMD64 relocations }
+      R_X86_64_NONE = 0;
+      { Direct 64 bit   }
+      R_X86_64_64 = 1;
+      { PC relative 32 bit signed  }
+      R_X86_64_PC32 = 2;
+      { 32 bit GOT entry  }
+      R_X86_64_GOT32 = 3;
+      { 32 bit PLT address  }
+      R_X86_64_PLT32 = 4;
+      { Copy symbol at runtime  }
+      R_X86_64_COPY = 5;
+      { Create GOT entry  }
+      R_X86_64_GLOB_DAT = 6;
+      { Create PLT entry  }
+      R_X86_64_JUMP_SLOT = 7;
+      { Adjust by program base  }
+      R_X86_64_RELATIVE = 8;
+      { 32 bit signed PC relative offset to GOT  }
+      R_X86_64_GOTPCREL = 9;
+      { Direct 32 bit zero extended  }
+      R_X86_64_32 = 10;
+      { Direct 32 bit sign extended  }
+      R_X86_64_32S = 11;
+      { Direct 16 bit zero extended  }
+      R_X86_64_16 = 12;
+      { 16 bit sign extended pc relative  }
+      R_X86_64_PC16 = 13;
+      { Direct 8 bit sign extended   }
+      R_X86_64_8 = 14;
+      { 8 bit sign extended pc relative  }
+      R_X86_64_PC8 = 15;
+      { ID of module containing symbol  }
+      R_X86_64_DTPMOD64 = 16;
+      { Offset in module's TLS block  }
+      R_X86_64_DTPOFF64 = 17;
+      { Offset in initial TLS block  }
+      R_X86_64_TPOFF64 = 18;
+      { 32 bit signed PC relative offset to two GOT entries for GD symbol  }
+      R_X86_64_TLSGD = 19;
+      { 32 bit signed PC relative offset to two GOT entries for LD symbol  }
+      R_X86_64_TLSLD = 20;
+      { Offset in TLS block  }
+      R_X86_64_DTPOFF32 = 21;
+      { 32 bit signed PC relative offset to GOT entry for IE symbol  }
+      R_X86_64_GOTTPOFF = 22;
+      { Offset in initial TLS block  }
+      R_X86_64_TPOFF32 = 23;
+      R_X86_64_NUM = 24;
+
       SHN_UNDEF     = 0;
       SHN_UNDEF     = 0;
       SHN_ABS       = $fff1;
       SHN_ABS       = $fff1;
       SHN_COMMON    = $fff2;
       SHN_COMMON    = $fff2;
@@ -199,6 +254,211 @@ implementation
         end;
         end;
 
 
 
 
+        telf64header=packed record
+          magic0123         : longint;
+          file_class        : byte;
+          data_encoding     : byte;
+          file_version      : byte;
+          padding           : array[$07..$0f] of byte;
+          e_type            : word;
+          e_machine         : word;
+          e_version         : longint;
+          e_entry           : qword;            { entrypoint }
+          e_phoff           : qword;            { program header offset }
+          e_shoff           : qword;            { sections header offset }
+          e_flags           : longint;
+          e_ehsize          : word;             { elf header size in bytes }
+          e_phentsize       : word;             { size of an entry in the program header array }
+          e_phnum           : word;             { 0..e_phnum-1 of entrys }
+          e_shentsize       : word;             { size of an entry in sections header array }
+          e_shnum           : word;             { 0..e_shnum-1 of entrys }
+          e_shstrndx        : word;             { index of string section header }
+        end;
+        telf64sechdr=packed record
+          sh_name           : longint;
+          sh_type           : longint;
+          sh_flags          : qword;
+          sh_addr           : qword;
+          sh_offset         : qword;
+          sh_size           : qword;
+          sh_link           : longint;
+          sh_info           : longint;
+          sh_addralign      : qword;
+          sh_entsize        : qword;
+        end;
+        telf64reloc=packed record
+          address : qword;
+          info    : qword; { bit 0-7: type, 8-31: symbol }
+          addend  : qword;
+        end;
+        telf64symbol=packed record
+          st_name  : longint;
+          st_info  : byte; { bit 0-3: type, 4-7: bind }
+          st_other : byte;
+          st_shndx : word;
+          st_value : qword;
+          st_size  : qword;
+        end;
+        telf64stab=packed record
+          strpos  : longint;
+          ntype   : byte;
+          nother  : byte;
+          ndesc   : word;
+          nvalue  : longint;
+        end;
+
+
+{$ifdef cpu64bit}
+        telfheader = telf64header;
+        telfreloc = telf64reloc;
+        telfsymbol = telf64symbol;
+        telfsechdr = telf64sechdr;
+{$else cpu64bit}
+        telfheader = telf32header;
+        telfreloc = telf32reloc;
+        telfsymbol = telf32symbol;
+        telfsechdr = telf32sechdr;
+{$endif cpu64bit}
+
+
+      function MayBeSwapHeader(h : telf32header) : telf32header;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.e_type:=swapword(e_type);
+                result.e_machine:=swapword(e_machine);
+                result.e_version:=swaplong(e_version);
+                result.e_entry:=swaplong(e_entry);
+                result.e_phoff:=swaplong(e_phoff);
+                result.e_shoff:=swaplong(e_shoff);
+                result.e_flags:=swaplong(e_flags);
+                result.e_ehsize:=swapword(e_ehsize);
+                result.e_phentsize:=swapword(e_phentsize);
+                result.e_phnum:=swapword(e_phnum);
+                result.e_shentsize:=swapword(e_shentsize);
+                result.e_shnum:=swapword(e_shnum);
+                result.e_shstrndx:=swapword(e_shstrndx);
+              end;
+        end;
+
+
+      function MayBeSwapHeader(h : telf64header) : telf64header;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.e_type:=swapword(e_type);
+                result.e_machine:=swapword(e_machine);
+                result.e_version:=swaplong(e_version);
+                result.e_entry:=swapqword(e_entry);
+                result.e_phoff:=swapqword(e_phoff);
+                result.e_shoff:=swapqword(e_shoff);
+                result.e_flags:=swaplong(e_flags);
+                result.e_ehsize:=swapword(e_ehsize);
+                result.e_phentsize:=swapword(e_phentsize);
+                result.e_phnum:=swapword(e_phnum);
+                result.e_shentsize:=swapword(e_shentsize);
+                result.e_shnum:=swapword(e_shnum);
+                result.e_shstrndx:=swapword(e_shstrndx);
+              end;
+        end;
+
+
+      function MaybeSwapSecHeader(h : telf32sechdr) : telf32sechdr;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.sh_name:=SwapLong(sh_name);
+                result.sh_type:=SwapLong(sh_type);
+                result.sh_flags:=SwapLong(sh_flags);
+                result.sh_addr:=SwapLong(sh_addr);
+                result.sh_offset:=SwapLong(sh_offset);
+                result.sh_size:=SwapLong(sh_size);
+                result.sh_link:=SwapLong(sh_link);
+                result.sh_info:=SwapLong(sh_info);
+                result.sh_addralign:=SwapLong(sh_addralign);
+                result.sh_entsize:=SwapLong(sh_entsize);
+              end;
+        end;
+
+
+      function MaybeSwapSecHeader(h : telf64sechdr) : telf64sechdr;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.sh_name:=SwapLong(sh_name);
+                result.sh_type:=SwapLong(sh_type);
+                result.sh_flags:=SwapQWord(sh_flags);
+                result.sh_addr:=SwapQWord(sh_addr);
+                result.sh_offset:=SwapQWord(sh_offset);
+                result.sh_size:=SwapQWord(sh_size);
+                result.sh_link:=SwapLong(sh_link);
+                result.sh_info:=SwapLong(sh_info);
+                result.sh_addralign:=SwapQWord(sh_addralign);
+                result.sh_entsize:=SwapQWord(sh_entsize);
+              end;
+        end;
+
+
+      function MaybeSwapElfSymbol(h : telf32symbol) : telf32symbol;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.st_name:=SwapLong(st_name);
+                result.st_value:=SwapLong(st_value);
+                result.st_size:=SwapLong(st_size);
+                result.st_shndx:=SwapWord(st_shndx);
+              end;
+        end;
+
+
+      function MaybeSwapElfSymbol(h : telf64symbol) : telf64symbol;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.st_name:=SwapLong(st_name);
+                result.st_value:=SwapQWord(st_value);
+                result.st_size:=SwapQWord(st_size);
+                result.st_shndx:=SwapWord(st_shndx);
+              end;
+        end;
+
+
+      function MaybeSwapElfReloc(h : telf32reloc) : telf32reloc;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.address:=SwapLong(address);
+                result.info:=SwapLong(info);
+              end;
+        end;
+
+
+      function MaybeSwapElfReloc(h : telf64reloc) : telf64reloc;
+        begin
+          result:=h;
+          if source_info.endian<>target_info.endian then
+            with h do
+              begin
+                result.address:=SwapQWord(address);
+                result.info:=SwapQWord(info);
+              end;
+        end;
+
+
 {****************************************************************************
 {****************************************************************************
                                 Helpers
                                 Helpers
 ****************************************************************************}
 ****************************************************************************}
@@ -296,7 +556,7 @@ implementation
         { reset }
         { reset }
         Syms:=TDynamicArray.Create(symbolresize);
         Syms:=TDynamicArray.Create(symbolresize);
         { default sections }
         { default sections }
-        symtabsect:=TElf32ObjSection.create_ext('.symtab',2,0,0,0,4,16);
+        symtabsect:=TElf32ObjSection.create_ext('.symtab',2,0,0,0,4,sizeof(telfsymbol));
         strtabsect:=TElf32ObjSection.create_ext('.strtab',3,0,0,0,1,0);
         strtabsect:=TElf32ObjSection.create_ext('.strtab',3,0,0,0,1,0);
         shstrtabsect:=TElf32ObjSection.create_ext('.shstrtab',3,0,0,0,1,0);
         shstrtabsect:=TElf32ObjSection.create_ext('.shstrtab',3,0,0,0,1,0);
         { insert the empty and filename as first in strtab }
         { insert the empty and filename as first in strtab }
@@ -308,6 +568,9 @@ implementation
         createsection(sec_bss,'');
         createsection(sec_bss,'');
         if tf_section_threadvars in target_info.flags then
         if tf_section_threadvars in target_info.flags then
           createsection(sec_threadvar,'');
           createsection(sec_threadvar,'');
+        if (tf_needs_dwarf_cfi in target_info.flags) and
+           (af_supports_dwarf in target_asm.flags) then
+             createsection(sec_debug_frame,'');
       end;
       end;
 
 
 
 
@@ -335,7 +598,7 @@ implementation
           '.eh_frame',
           '.eh_frame',
           '.debug_frame','.debug_info','.debug_line','.debug_abbrev',
           '.debug_frame','.debug_info','.debug_line','.debug_abbrev',
           'fpc',
           'fpc',
-		  ''
+          ''
         );
         );
       begin
       begin
         if (use_smartlink_section and
         if (use_smartlink_section and
@@ -393,8 +656,10 @@ implementation
            else
            else
              begin
              begin
                CurrObjSec.addsymreloc(CurrObjSec.Size,p,relative);
                CurrObjSec.addsymreloc(CurrObjSec.Size,p,relative);
+{$ifndef x86_64}
                if relative=RELOC_RELATIVE then
                if relative=RELOC_RELATIVE then
                  dec(data,len);
                  dec(data,len);
+{$endif x86_64}
             end;
             end;
          end;
          end;
         CurrObjSec.write(data,len);
         CurrObjSec.write(data,len);
@@ -436,7 +701,7 @@ implementation
 
 
     procedure TElf32ObjectOutput.createrelocsection(s:TElf32ObjSection);
     procedure TElf32ObjectOutput.createrelocsection(s:TElf32ObjSection);
       var
       var
-        rel  : TElf32reloc;
+        rel  : telfreloc;
         r    : TObjRelocation;
         r    : TObjRelocation;
         relsym,reltyp : longint;
         relsym,reltyp : longint;
       begin
       begin
@@ -452,7 +717,15 @@ implementation
              end;
              end;
 {$endif userodata}
 {$endif userodata}
            { create the reloc section }
            { create the reloc section }
+{$ifdef i386}
            s.relocsect:=TElf32ObjSection.create_ext('.rel'+s.name,9,0,symtabsect.secshidx,s.secshidx,4,8);
            s.relocsect:=TElf32ObjSection.create_ext('.rel'+s.name,9,0,symtabsect.secshidx,s.secshidx,4,8);
+{$endif i386}
+{$ifdef x86_64}
+           s.relocsect:=TElf32ObjSection.create_ext('.rela'+s.name,4,0,symtabsect.secshidx,s.secshidx,4,3*8);
+{$endif x86_64}
+{$ifdef sparc}
+           s.relocsect:=TElf32ObjSection.create_ext('.rel'+s.name,4,0,symtabsect.secshidx,s.secshidx,4,8);
+{$endif sparc}
            { add the relocations }
            { add the relocations }
            r:=TObjRelocation(s.relocations.first);
            r:=TObjRelocation(s.relocations.first);
            while assigned(r) do
            while assigned(r) do
@@ -474,15 +747,50 @@ implementation
                 relsym:=r.objsection.secsymidx
                 relsym:=r.objsection.secsymidx
                else
                else
                 relsym:=SHN_UNDEF;
                 relsym:=SHN_UNDEF;
+
+              { when things settle down, we can create processor specific
+                derived classes
+              }
+{$ifdef i386}
               case r.typ of
               case r.typ of
                 RELOC_RELATIVE :
                 RELOC_RELATIVE :
                   reltyp:=R_386_PC32;
                   reltyp:=R_386_PC32;
                 RELOC_ABSOLUTE :
                 RELOC_ABSOLUTE :
                   reltyp:=R_386_32;
                   reltyp:=R_386_32;
               end;
               end;
+{$endif i386}
+{$ifdef sparc}
+              case r.typ of
+{                RELOC_RELATIVE :
+                  reltyp:=R_386_PC32;
+}
+                RELOC_ABSOLUTE :
+                  reltyp:=R_SPARC_32;
+                else
+                  internalerror(200410201);
+              end;
+{$endif sparc}
+{$ifdef x86_64}
+              case r.typ of
+                RELOC_RELATIVE :
+                  begin
+                    reltyp:=R_X86_64_PC32;
+                    { length of the relocated location is handled here }
+                    rel.addend:=-4;
+                  end;
+              RELOC_ABSOLUTE :
+                  reltyp:=R_X86_64_64;
+                else
+                  internalerror(200602261);
+              end;
+{$endif x86_64}
+{$ifdef cpu64bit}
+              rel.info:=(qword(relsym) shl 32) or reltyp;
+{$else cpu64bit}
               rel.info:=(relsym shl 8) or reltyp;
               rel.info:=(relsym shl 8) or reltyp;
+{$endif cpu64bit}
               { write reloc }
               { write reloc }
-              s.relocsect.write(rel,sizeof(rel));
+              s.relocsect.write(MaybeSwapElfReloc(rel),sizeof(rel));
               r:=TObjRelocation(r.next);
               r:=TObjRelocation(r.next);
             end;
             end;
          end;
          end;
@@ -491,7 +799,7 @@ implementation
 
 
     procedure TElf32ObjectOutput.section_write_symbol(p:TObject;arg:pointer);
     procedure TElf32ObjectOutput.section_write_symbol(p:TObject;arg:pointer);
       var
       var
-        elfsym : TElf32symbol;
+        elfsym : telfsymbol;
       begin
       begin
         fillchar(elfsym,sizeof(elfsym),0);
         fillchar(elfsym,sizeof(elfsym),0);
         elfsym.st_name:=TElf32ObjSection(p).shstridx;
         elfsym.st_name:=TElf32ObjSection(p).shstridx;
@@ -500,14 +808,15 @@ implementation
         TObjSection(p).secsymidx:=symidx;
         TObjSection(p).secsymidx:=symidx;
         inc(symidx);
         inc(symidx);
         inc(localsyms);
         inc(localsyms);
-        elf32data.symtabsect.write(elfsym,sizeof(elfsym));
+        elf32data.symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
       end;
       end;
 
 
 
 
     procedure TElf32ObjectOutput.createsymtab;
     procedure TElf32ObjectOutput.createsymtab;
       var
       var
-        elfsym : TElf32symbol;
-        i       : longint;
+        elfsym : telfsymbol;
+        i,
+        locals : longint;
         objsym : TObjSymbol;
         objsym : TObjSymbol;
       begin
       begin
         with elf32data do
         with elf32data do
@@ -516,14 +825,14 @@ implementation
            localsyms:=0;
            localsyms:=0;
            { empty entry }
            { empty entry }
            fillchar(elfsym,sizeof(elfsym),0);
            fillchar(elfsym,sizeof(elfsym),0);
-           symtabsect.write(elfsym,sizeof(elfsym));
+           symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
            inc(symidx);
            inc(symidx);
            inc(localsyms);
            inc(localsyms);
            { filename entry }
            { filename entry }
            elfsym.st_name:=1;
            elfsym.st_name:=1;
            elfsym.st_info:=STT_FILE;
            elfsym.st_info:=STT_FILE;
            elfsym.st_shndx:=SHN_ABS;
            elfsym.st_shndx:=SHN_ABS;
-           symtabsect.write(elfsym,sizeof(elfsym));
+           symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
            inc(symidx);
            inc(symidx);
            inc(localsyms);
            inc(localsyms);
            { section }
            { section }
@@ -582,7 +891,7 @@ implementation
                      end;
                      end;
                    objsym.symidx:=symidx;
                    objsym.symidx:=symidx;
                    inc(symidx);
                    inc(symidx);
-                   symtabsect.write(elfsym,sizeof(elfsym));
+                   symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
                  end;
                  end;
              end;
              end;
            { update the .symtab section header }
            { update the .symtab section header }
@@ -618,7 +927,7 @@ implementation
 
 
     procedure TElf32ObjectOutput.writesectionheader(s:TElf32ObjSection);
     procedure TElf32ObjectOutput.writesectionheader(s:TElf32ObjSection);
       var
       var
-        sechdr : TElf32sechdr;
+        sechdr : telfsechdr;
       begin
       begin
         fillchar(sechdr,sizeof(sechdr),0);
         fillchar(sechdr,sizeof(sechdr),0);
         sechdr.sh_name:=s.shstridx;
         sechdr.sh_name:=s.shstridx;
@@ -630,11 +939,10 @@ implementation
         sechdr.sh_info:=s.shinfo;
         sechdr.sh_info:=s.shinfo;
         sechdr.sh_addralign:=s.secalign;
         sechdr.sh_addralign:=s.secalign;
         sechdr.sh_entsize:=s.shentsize;
         sechdr.sh_entsize:=s.shentsize;
-        writer.write(sechdr,sizeof(sechdr));
+        writer.write(MaybeSwapSecHeader(sechdr),sizeof(sechdr));
       end;
       end;
 
 
 
 
-
     procedure TElf32ObjectOutput.writesectiondata(s:TElf32ObjSection);
     procedure TElf32ObjectOutput.writesectiondata(s:TElf32ObjSection);
       begin
       begin
         FWriter.writezeros(s.dataalignbytes);
         FWriter.writezeros(s.dataalignbytes);
@@ -700,7 +1008,7 @@ implementation
 
 
     function TElf32ObjectOutput.writedata(data:TObjData):boolean;
     function TElf32ObjectOutput.writedata(data:TObjData):boolean;
       var
       var
-        header    : TElf32header;
+        header : telfheader;
         shoffset,
         shoffset,
         datapos   : aint;
         datapos   : aint;
         nsections : word;
         nsections : word;
@@ -735,7 +1043,7 @@ implementation
            shstrtabsect.setdatapos(datapos);
            shstrtabsect.setdatapos(datapos);
            { section headers }
            { section headers }
            shoffset:=datapos;
            shoffset:=datapos;
-           inc(datapos,nsections*sizeof(TElf32sechdr));
+           inc(datapos,nsections*sizeof(telfsechdr));
            { symtab }
            { symtab }
            symtabsect.setdatapos(datapos);
            symtabsect.setdatapos(datapos);
            { strtab }
            { strtab }
@@ -746,25 +1054,52 @@ implementation
            { Write ELF Header }
            { Write ELF Header }
            fillchar(header,sizeof(header),0);
            fillchar(header,sizeof(header),0);
            header.magic0123:=$464c457f; { = #127'ELF' }
            header.magic0123:=$464c457f; { = #127'ELF' }
+{$ifdef cpu64bit}
+           header.file_class:=2;
+{$else cpu64bit}
            header.file_class:=1;
            header.file_class:=1;
+{$endif cpu64bit}
+           if target_info.endian=endian_big then
+             header.data_encoding:=2
+           else
            header.data_encoding:=1;
            header.data_encoding:=1;
+
            header.file_version:=1;
            header.file_version:=1;
            header.e_type:=1;
            header.e_type:=1;
+{$ifdef sparc}
+           header.e_machine:=2;
+{$endif sparc}
+{$ifdef i386}
            header.e_machine:=3;
            header.e_machine:=3;
+{$endif i386}
+{$ifdef m68k}
+           header.e_machine:=4;
+{$endif m68k}
+{$ifdef powerpc}
+           header.e_machine:=20;
+{$endif powerpc}
+{$ifdef arm}
+           header.e_machine:=40;
+{$endif arm}
+{$ifdef x86_64}
+           header.e_machine:=62;
+{$endif x86_64}
            header.e_version:=1;
            header.e_version:=1;
            header.e_shoff:=shoffset;
            header.e_shoff:=shoffset;
            header.e_shstrndx:=shstrtabsect.secshidx;
            header.e_shstrndx:=shstrtabsect.secshidx;
+
            header.e_shnum:=nsections;
            header.e_shnum:=nsections;
-           header.e_ehsize:=sizeof(TElf32header);
-           header.e_shentsize:=sizeof(TElf32sechdr);
-           writer.write(header,sizeof(header));
+           header.e_ehsize:=sizeof(telfheader);
+           header.e_shentsize:=sizeof(telfsechdr);
+           writer.write(MaybeSwapHeader(header),sizeof(header));
+
            writer.writezeros($40-sizeof(header)); { align }
            writer.writezeros($40-sizeof(header)); { align }
          { Sections }
          { Sections }
            ObjSectionList.ForEachCall(@section_write_data,nil);
            ObjSectionList.ForEachCall(@section_write_data,nil);
          { .shstrtab }
          { .shstrtab }
            writesectiondata(shstrtabsect);
            writesectiondata(shstrtabsect);
          { section headers, start with an empty header for sh_undef }
          { section headers, start with an empty header for sh_undef }
-           writer.writezeros(sizeof(TElf32sechdr));
+           writer.writezeros(sizeof(telfsechdr));
            ObjSectionList.ForEachCall(@section_write_sechdr,nil);
            ObjSectionList.ForEachCall(@section_write_sechdr,nil);
            writesectionheader(shstrtabsect);
            writesectionheader(shstrtabsect);
            writesectionheader(symtabsect);
            writesectionheader(symtabsect);
@@ -808,7 +1143,39 @@ implementation
             comment : '';
             comment : '';
           );
           );
 
 
+       as_x86_64_elf64_info : tasminfo =
+          (
+            id     : as_x86_64_elf64;
+            idtxt  : 'ELF';
+            asmbin : '';
+            asmcmd : '';
+            supported_target : system_any;  //target_i386_linux;
+            flags : [af_outputbinary,af_smartlink_sections];
+            labelprefix : '.L';
+            comment : '';
+          );
+
+       as_sparc_elf32_info : tasminfo =
+          (
+            id     : as_sparc_elf32;
+            idtxt  : 'ELF';
+            asmbin : '';
+            asmcmd : '';
+            supported_target : system_any;  //target_i386_linux;
+//            flags : [af_outputbinary,af_smartlink_sections];
+            flags : [af_outputbinary];
+            labelprefix : '.L';
+            comment : '';
+          );
 
 
 initialization
 initialization
+{$ifdef i386}
   RegisterAssembler(as_i386_elf32_info,TElf32Assembler);
   RegisterAssembler(as_i386_elf32_info,TElf32Assembler);
+{$endif i386}
+{$ifdef sparc}
+  RegisterAssembler(as_sparc_elf32_info,TElf32Assembler);
+{$endif sparc}
+{$ifdef x86_64}
+  RegisterAssembler(as_x86_64_elf64_info,TElf32Assembler);
+{$endif x86_64}
 end.
 end.

+ 2 - 0
compiler/systems.pas

@@ -148,6 +148,8 @@ interface
              ,as_x86_64_pecoff
              ,as_x86_64_pecoff
              ,as_i386_pecoffwince
              ,as_i386_pecoffwince
              ,as_arm_pecoffwince
              ,as_arm_pecoffwince
+             ,as_x86_64_elf64
+             ,as_sparc_elf32
        );
        );
 
 
        tar = (ar_none
        tar = (ar_none

+ 1 - 1
compiler/systems/i_linux.pas

@@ -431,7 +431,7 @@ unit i_linux;
             Cprefix      : '';
             Cprefix      : '';
             newline      : #10;
             newline      : #10;
             dirsep       : '/';
             dirsep       : '/';
-            assem        : as_gas;
+            assem        : as_gas; { as_x86_64_elf64; }
             assemextern  : as_gas;
             assemextern  : as_gas;
             link         : nil;
             link         : nil;
             linkextern   : nil;
             linkextern   : nil;

+ 160 - 5
compiler/x86/aasmcpu.pas

@@ -780,6 +780,11 @@ implementation
                    if (ot and OT_BITS32)<>0 then
                    if (ot and OT_BITS32)<>0 then
                     s:=s+'32'
                     s:=s+'32'
                   else
                   else
+{$ifdef x86_64}
+                   if (ot and OT_BITS32)<>0 then
+                    s:=s+'64'
+                  else
+{$endif x86_64}
                     s:=s+'??';
                     s:=s+'??';
                   { signed }
                   { signed }
                   if (ot and OT_SIGNED)<>0 then
                   if (ot and OT_SIGNED)<>0 then
@@ -1371,11 +1376,11 @@ implementation
                 (
                 (
                  (
                  (
                   (oper[opidx]^.ref^.index<>NR_NO) and
                   (oper[opidx]^.ref^.index<>NR_NO) and
-                  (getsubreg(oper[opidx]^.ref^.index)<>R_SUBD)
+                  (getsubreg(oper[opidx]^.ref^.index)<>R_SUBADDR)
                  ) or
                  ) or
                  (
                  (
                   (oper[opidx]^.ref^.base<>NR_NO) and
                   (oper[opidx]^.ref^.base<>NR_NO) and
-                  (getsubreg(oper[opidx]^.ref^.base)<>R_SUBD)
+                  (getsubreg(oper[opidx]^.ref^.base)<>R_SUBADDR)
                  )
                  )
                 );
                 );
       end;
       end;
@@ -1406,6 +1411,7 @@ implementation
       end;
       end;
 
 
 
 
+{$ifdef x86_64}
     function process_ea(const input:toper;var output:ea;rfield:longint):boolean;
     function process_ea(const input:toper;var output:ea;rfield:longint):boolean;
       var
       var
         sym   : tasmsymbol;
         sym   : tasmsymbol;
@@ -1452,8 +1458,157 @@ implementation
         { it's an indirection }
         { it's an indirection }
          begin
          begin
            { 16 bit address? }
            { 16 bit address? }
-           if ((ir<>NR_NO) and (isub<>R_SUBD)) or
-              ((br<>NR_NO) and (bsub<>R_SUBD)) then
+           if ((ir<>NR_NO) and (isub<>R_SUBADDR)) or
+              ((br<>NR_NO) and (bsub<>R_SUBADDR)) then
+{$ifdef x86_64}
+             message(asmw_e_16bit_32bit_not_supported);
+{$else x86_64}
+             message(asmw_e_16bit_not_supported);
+{$endif x86_64}
+{$ifdef OPTEA}
+           { make single reg base }
+           if (br=NR_NO) and (s=1) then
+            begin
+              br:=ir;
+              ir:=NR_NO;
+            end;
+           { convert [3,5,9]*EAX to EAX+[2,4,8]*EAX }
+           if (br=NR_NO) and
+              (((s=2) and (ir<>NR_ESP)) or
+                (s=3) or (s=5) or (s=9)) then
+            begin
+              br:=ir;
+              dec(s);
+            end;
+           { swap ESP into base if scalefactor is 1 }
+           if (s=1) and (ir=NR_ESP) then
+            begin
+              ir:=br;
+              br:=NR_ESP;
+            end;
+{$endif OPTEA}
+           { wrong, for various reasons }
+           if (ir=NR_ESP) or ((s<>1) and (s<>2) and (s<>4) and (s<>8) and (ir<>NR_NO)) then
+            exit;
+           { base }
+           case br of
+             NR_RAX : base:=0;
+             NR_RCX : base:=1;
+             NR_RDX : base:=2;
+             NR_RBX : base:=3;
+             NR_RSP : base:=4;
+             NR_NO,
+             NR_RBP : base:=5;
+             NR_RSI : base:=6;
+             NR_RDI : base:=7;
+           else
+             exit;
+           end;
+           { index }
+           case ir of
+             NR_EAX : index:=0;
+             NR_ECX : index:=1;
+             NR_EDX : index:=2;
+             NR_EBX : index:=3;
+             NR_NO  : index:=4;
+             NR_EBP : index:=5;
+             NR_ESI : index:=6;
+             NR_EDI : index:=7;
+           else
+             exit;
+           end;
+           case s of
+            0,
+            1 : scalefactor:=0;
+            2 : scalefactor:=1;
+            4 : scalefactor:=2;
+            8 : scalefactor:=3;
+           else
+            exit;
+           end;
+           if (br=NR_NO) or
+              ((br<>NR_EBP) and (o=0) and (sym=nil)) then
+            md:=0
+           else
+            if ((o>=-128) and (o<=127) and (sym=nil)) then
+             md:=1
+            else
+             md:=2;
+           if (br=NR_NO) or (md=2) then
+            output.bytes:=4
+           else
+            output.bytes:=md;
+           { SIB needed ? }
+           if (ir=NR_NO) and (br<>NR_ESP) then
+            begin
+              output.sib_present:=false;
+              output.modrm:=(md shl 6) or (rfield shl 3) or base;
+            end
+           else
+            begin
+              output.sib_present:=true;
+              output.modrm:=(md shl 6) or (rfield shl 3) or 4;
+              output.sib:=(scalefactor shl 6) or (index shl 3) or base;
+            end;
+         end;
+        if output.sib_present then
+         output.size:=2+output.bytes
+        else
+         output.size:=1+output.bytes;
+        process_ea:=true;
+      end;
+
+
+{$else x86_64}
+
+    function process_ea(const input:toper;var output:ea;rfield:longint):boolean;
+      var
+        sym   : tasmsymbol;
+        md,s,rv  : byte;
+        base,index,scalefactor,
+        o     : longint;
+        ir,br : Tregister;
+        isub,bsub : tsubregister;
+      begin
+        process_ea:=false;
+        {Register ?}
+        if (input.typ=top_reg) then
+          begin
+            rv:=regval(input.reg);
+            output.sib_present:=false;
+            output.bytes:=0;
+            output.modrm:=$c0 or (rfield shl 3) or rv;
+            output.size:=1;
+            process_ea:=true;
+            exit;
+         end;
+        {No register, so memory reference.}
+        if (input.typ<>top_ref) then
+          internalerror(200409262);
+        if ((input.ref^.index<>NR_NO) and (getregtype(input.ref^.index)<>R_INTREGISTER)) or
+           ((input.ref^.base<>NR_NO) and (getregtype(input.ref^.base)<>R_INTREGISTER)) then
+          internalerror(200301081);
+        ir:=input.ref^.index;
+        br:=input.ref^.base;
+        isub:=getsubreg(ir);
+        bsub:=getsubreg(br);
+        s:=input.ref^.scalefactor;
+        o:=input.ref^.offset;
+        sym:=input.ref^.symbol;
+      { it's direct address }
+        if (br=NR_NO) and (ir=NR_NO) then
+         begin
+           { it's a pure offset }
+           output.sib_present:=false;
+           output.bytes:=4;
+           output.modrm:=5 or (rfield shl 3);
+         end
+        else
+        { it's an indirection }
+         begin
+           { 16 bit address? }
+           if ((ir<>NR_NO) and (isub<>R_SUBADDR)) or
+              ((br<>NR_NO) and (bsub<>R_SUBADDR)) then
              message(asmw_e_16bit_not_supported);
              message(asmw_e_16bit_not_supported);
 {$ifdef OPTEA}
 {$ifdef OPTEA}
            { make single reg base }
            { make single reg base }
@@ -1547,7 +1702,7 @@ implementation
          output.size:=1+output.bytes;
          output.size:=1+output.bytes;
         process_ea:=true;
         process_ea:=true;
       end;
       end;
-
+{$endif x86_64}
 
 
     function taicpu.calcsize(p:PInsEntry):shortint;
     function taicpu.calcsize(p:PInsEntry):shortint;
       var
       var

+ 7 - 3
compiler/x86/cpubase.pas

@@ -136,11 +136,15 @@ uses
       first_mm_imreg     = $08;
       first_mm_imreg     = $08;
 {$endif x86_64}
 {$endif x86_64}
 
 
-      { The subregister that specifies the entire register }
+      { The subregister that specifies the entire register and an address }
 {$ifdef x86_64}
 {$ifdef x86_64}
-      R_SUBWHOLE    = R_SUBQ; {Hammer}
+      { Hammer }
+      R_SUBWHOLE    = R_SUBQ;
+      R_SUBADDR     = R_SUBQ;
 {$else x86_64}
 {$else x86_64}
-      R_SUBWHOLE    = R_SUBD;  {i386}
+      { i386 }
+      R_SUBWHOLE    = R_SUBD;
+      R_SUBADDR     = R_SUBD;
 {$endif x86_64}
 {$endif x86_64}
 
 
       { Available Registers }
       { Available Registers }

+ 22 - 7
compiler/x86/x86ins.dat

@@ -1207,18 +1207,24 @@ mem,reg16             \320\300\1\x89\101              8086,SM
 reg16,reg16           \320\300\1\x89\101              8086
 reg16,reg16           \320\300\1\x89\101              8086
 mem,reg32             \321\300\1\x89\101              386,SM
 mem,reg32             \321\300\1\x89\101              386,SM
 reg32,reg32           \321\300\1\x89\101              386
 reg32,reg32           \321\300\1\x89\101              386
+mem,reg64             \322\300\1\x89\101              X86_64
+reg64,reg64           \322\300\1\x89\101              X86_64
 reg8,mem              \301\1\x8A\110                  8086,SM
 reg8,mem              \301\1\x8A\110                  8086,SM
 reg8,reg8             \301\1\x8A\110                  8086
 reg8,reg8             \301\1\x8A\110                  8086
 reg16,mem             \320\301\1\x8B\110              8086,SM
 reg16,mem             \320\301\1\x8B\110              8086,SM
 reg16,reg16           \320\301\1\x8B\110              8086
 reg16,reg16           \320\301\1\x8B\110              8086
 reg32,mem             \321\301\1\x8B\110              386,SM
 reg32,mem             \321\301\1\x8B\110              386,SM
 reg32,reg32           \321\301\1\x8B\110              386
 reg32,reg32           \321\301\1\x8B\110              386
+reg64,mem             \322\301\1\x8B\110              X86_64
+reg64,reg64           \322\301\1\x8B\110              X86_64
 reg8,imm              \10\xB0\21                      8086,SM
 reg8,imm              \10\xB0\21                      8086,SM
 reg16,imm             \320\10\xB8\31                  8086,SM
 reg16,imm             \320\10\xB8\31                  8086,SM
 reg32,imm             \321\10\xB8\41                  386,SM
 reg32,imm             \321\10\xB8\41                  386,SM
+reg64,imm             \322\10\xB8\41                  X86_64
 rm8,imm               \300\1\xC6\200\21               8086,SM
 rm8,imm               \300\1\xC6\200\21               8086,SM
 rm16,imm              \320\300\1\xC7\200\31           8086,SM
 rm16,imm              \320\300\1\xC7\200\31           8086,SM
 rm32,imm              \321\300\1\xC7\200\41           386,SM
 rm32,imm              \321\300\1\xC7\200\41           386,SM
+rm64,imm              \322\300\1\xC7\200\41           X86_64
 mem,imm8              \300\1\xC6\200\21               8086,SM
 mem,imm8              \300\1\xC6\200\21               8086,SM
 mem,imm16             \320\300\1\xC7\200\31           8086,SM
 mem,imm16             \320\300\1\xC7\200\31           8086,SM
 mem,imm32             \321\300\1\xC7\200\41           386,SM
 mem,imm32             \321\300\1\xC7\200\41           386,SM
@@ -1871,15 +1877,16 @@ xmmreg,xmmreg         \3\x66\x0F\x61\110              WILLAMETTE,SSE2
 
 
 [PUSH,pushX]
 [PUSH,pushX]
 (Ch_Rop1, Ch_RWESP, Ch_None)
 (Ch_Rop1, Ch_RWESP, Ch_None)
-reg16                 \320\10\x50                     8086,NOX86_64
-reg32                 \321\10\x50                     386,NOX86_64
-rm16                  \320\300\1\xFF\206              8086,NOX86_64
-rm32                  \321\300\1\xFF\206              386,NOX86_64
+reg16                 \320\10\x50                     8086
+reg32                 \321\10\x50                     386
+reg64                 \321\10\x50                     X86_64
+rm16                  \320\300\1\xFF\206              8086
+rm32                  \321\300\1\xFF\206              386
 reg_fsgs              \1\x0F\7                        386,NOX86_64
 reg_fsgs              \1\x0F\7                        386,NOX86_64
 reg_sreg              \6                              8086,NOX86_64
 reg_sreg              \6                              8086,NOX86_64
-imm8                  \1\x6A\14                       286,NOX86_64
-imm16                 \320\1\x68\30                   286,NOX86_64
-imm32                 \321\1\x68\40                   386,NOX86_64
+imm8                  \1\x6A\14                       286
+imm16                 \320\1\x68\30                   286
+imm32                 \321\1\x68\40                   386
 
 
 [PUSHA,pushaX]
 [PUSHA,pushaX]
 (Ch_All, Ch_None, Ch_None)
 (Ch_All, Ch_None, Ch_None)
@@ -2236,20 +2243,28 @@ mem,reg16             \320\300\1\x29\101              8086,SM
 reg16,reg16           \320\300\1\x29\101              8086
 reg16,reg16           \320\300\1\x29\101              8086
 mem,reg32             \321\300\1\x29\101              386,SM
 mem,reg32             \321\300\1\x29\101              386,SM
 reg32,reg32           \321\300\1\x29\101              386
 reg32,reg32           \321\300\1\x29\101              386
+mem,reg32             \321\300\1\x29\101              386,SM
+reg32,reg32           \321\300\1\x29\101              386
+mem,reg64             \322\300\1\x29\101              X86_64
+reg64,reg64           \322\300\1\x29\101              X86_64
 reg8,mem              \301\1\x2A\110                  8086,SM
 reg8,mem              \301\1\x2A\110                  8086,SM
 reg8,reg8             \301\1\x2A\110                  8086
 reg8,reg8             \301\1\x2A\110                  8086
 reg16,mem             \320\301\1\x2B\110              8086,SM
 reg16,mem             \320\301\1\x2B\110              8086,SM
 reg16,reg16           \320\301\1\x2B\110              8086
 reg16,reg16           \320\301\1\x2B\110              8086
 reg32,mem             \321\301\1\x2B\110              386,SM
 reg32,mem             \321\301\1\x2B\110              386,SM
 reg32,reg32           \321\301\1\x2B\110              386
 reg32,reg32           \321\301\1\x2B\110              386
+reg64,reg64           \322\301\1\x2B\110              X86_64
 rm16,imm8             \320\300\1\x83\205\15           8086
 rm16,imm8             \320\300\1\x83\205\15           8086
 rm32,imm8             \321\300\1\x83\205\15           386
 rm32,imm8             \321\300\1\x83\205\15           386
+rm64,imm8             \322\300\1\x83\205\15           X86_64
 reg_al,imm            \1\x2C\21                       8086,SM
 reg_al,imm            \1\x2C\21                       8086,SM
 reg_ax,imm            \320\1\x2D\31                   8086,SM
 reg_ax,imm            \320\1\x2D\31                   8086,SM
 reg_eax,imm           \321\1\x2D\41                   386,SM
 reg_eax,imm           \321\1\x2D\41                   386,SM
+reg_rax,imm           \322\1\x2D\41                   X86_64
 rm8,imm               \300\1\x80\205\21               8086,SM
 rm8,imm               \300\1\x80\205\21               8086,SM
 rm16,imm              \320\300\1\x81\205\31           8086,SM
 rm16,imm              \320\300\1\x81\205\31           8086,SM
 rm32,imm              \321\300\1\x81\205\41           386,SM
 rm32,imm              \321\300\1\x81\205\41           386,SM
+rm64,imm              \322\300\1\x81\205\41           X86_64
 mem,imm8              \300\1\x80\205\21               8086,SM
 mem,imm8              \300\1\x80\205\21               8086,SM
 mem,imm16             \320\300\1\x81\205\31           8086,SM
 mem,imm16             \320\300\1\x81\205\31           8086,SM
 mem,imm32             \321\300\1\x81\205\41           386,SM
 mem,imm32             \321\300\1\x81\205\41           386,SM

+ 27 - 0
compiler/x86_64/x8664ats.inc

@@ -380,6 +380,10 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufINT,
 attsufINT,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufINT,
 attsufINT,
 attsufNONE,
 attsufNONE,
 attsufINT,
 attsufINT,
@@ -565,5 +569,28 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 attsufNONE
 );
 );

+ 27 - 0
compiler/x86_64/x8664att.inc

@@ -380,6 +380,10 @@
 'xlatb',
 'xlatb',
 'xor',
 'xor',
 'xstore',
 'xstore',
+'xcryptecb',
+'xcryptcbc',
+'xcryptcfb',
+'xcryptofb',
 'cmov',
 'cmov',
 'j',
 'j',
 'set',
 'set',
@@ -563,6 +567,29 @@
 'movddup',
 'movddup',
 'movshdup',
 'movshdup',
 'movsldup',
 'movsldup',
+'vmread',
+'vmwrite',
+'vmcall',
+'vmlaunch',
+'vmresume',
+'vmxoff',
+'vmxon',
+'vmclear',
+'vmptrld',
+'vmptrst',
+'vmrun',
+'vmmcall',
+'vmload',
+'vmsave',
+'stgi',
+'clgi',
+'skinit',
+'invlpga',
+'montmul',
+'xsha1',
+'xsha256',
+'dmint',
+'rdm',
 'movabs',
 'movabs',
 'movslq',
 'movslq',
 'cqto'
 'cqto'

+ 27 - 0
compiler/x86_64/x8664int.inc

@@ -380,6 +380,10 @@
 'xlatb',
 'xlatb',
 'xor',
 'xor',
 'xstore',
 'xstore',
+'xcryptecb',
+'xcryptcbc',
+'xcryptcfb',
+'xcryptofb',
 'cmov',
 'cmov',
 'j',
 'j',
 'set',
 'set',
@@ -563,6 +567,29 @@
 'movddup',
 'movddup',
 'movshdup',
 'movshdup',
 'movsldup',
 'movsldup',
+'vmread',
+'vmwrite',
+'vmcall',
+'vmlaunch',
+'vmresume',
+'vmxoff',
+'vmxon',
+'vmclear',
+'vmptrld',
+'vmptrst',
+'vmrun',
+'vmmcall',
+'vmload',
+'vmsave',
+'stgi',
+'clgi',
+'skinit',
+'invlpga',
+'montmul',
+'xsha1',
+'xsha256',
+'dmint',
+'rdm',
 'movabs',
 'movabs',
 'movsxd',
 'movsxd',
 'cqo'
 'cqo'

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 27 - 0
compiler/x86_64/x8664op.inc

@@ -380,6 +380,10 @@ A_XLAT,
 A_XLATB,
 A_XLATB,
 A_XOR,
 A_XOR,
 A_XSTORE,
 A_XSTORE,
+A_XCRYPTECB,
+A_XCRYPTCBC,
+A_XCRYPTCFB,
+A_XCRYPTOFB,
 A_CMOVcc,
 A_CMOVcc,
 A_Jcc,
 A_Jcc,
 A_SETcc,
 A_SETcc,
@@ -563,6 +567,29 @@ A_LDDQU,
 A_MOVDDUP,
 A_MOVDDUP,
 A_MOVSHDUP,
 A_MOVSHDUP,
 A_MOVSLDUP,
 A_MOVSLDUP,
+A_VMREAD,
+A_VMWRITE,
+A_VMCALL,
+A_VMLAUNCH,
+A_VMRESUME,
+A_VMXOFF,
+A_VMXON,
+A_VMCLEAR,
+A_VMPTRLD,
+A_VMPTRST,
+A_VMRUN,
+A_VMMCALL,
+A_VMLOAD,
+A_VMSAVE,
+A_STGI,
+A_CLGI,
+A_SKINIT,
+A_INVLPGA,
+A_MONTMUL,
+A_XSHA1,
+A_XSHA256,
+A_DMINT,
+A_RDM,
 A_MOVABS,
 A_MOVABS,
 A_MOVSXD,
 A_MOVSXD,
 A_CQO
 A_CQO

+ 27 - 0
compiler/x86_64/x8664pro.inc

@@ -380,6 +380,10 @@
 (Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
 (Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)),
 (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_ROp1, Ch_WOp2, Ch_RFLAGS)),
 (Ch: (Ch_ROp1, Ch_WOp2, Ch_RFLAGS)),
 (Ch: (Ch_None, Ch_None, Ch_None)),
 (Ch: (Ch_None, Ch_None, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
@@ -563,6 +567,29 @@
 (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_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_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_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_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_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_MRAX, Ch_WRDX, Ch_None))
 (Ch: (Ch_MRAX, Ch_WRDX, Ch_None))

+ 357 - 0
compiler/x86_64/x8664tab.inc

@@ -4214,6 +4214,20 @@
     code    : #209#192#1#137#65;
     code    : #209#192#1#137#65;
     flags   : if_386
     flags   : if_386
   ),
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_memory,ot_reg64,ot_none);
+    code    : #210#192#1#137#65;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg64,ot_reg64,ot_none);
+    code    : #210#192#1#137#65;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_MOV;
     opcode  : A_MOV;
     ops     : 2;
     ops     : 2;
@@ -4256,6 +4270,20 @@
     code    : #209#193#1#139#72;
     code    : #209#193#1#139#72;
     flags   : if_386
     flags   : if_386
   ),
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg64,ot_memory,ot_none);
+    code    : #210#193#1#139#72;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg64,ot_reg64,ot_none);
+    code    : #210#193#1#139#72;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_MOV;
     opcode  : A_MOV;
     ops     : 2;
     ops     : 2;
@@ -4277,6 +4305,13 @@
     code    : #209#8#184#33;
     code    : #209#8#184#33;
     flags   : if_386 or if_sm
     flags   : if_386 or if_sm
   ),
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg64,ot_immediate,ot_none);
+    code    : #210#8#184#33;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_MOV;
     opcode  : A_MOV;
     ops     : 2;
     ops     : 2;
@@ -4298,6 +4333,13 @@
     code    : #209#192#1#199#128#33;
     code    : #209#192#1#199#128#33;
     flags   : if_386 or if_sm
     flags   : if_386 or if_sm
   ),
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #210#192#1#199#128#33;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_MOV;
     opcode  : A_MOV;
     ops     : 2;
     ops     : 2;
@@ -6678,6 +6720,62 @@
     code    : #3#102#15#97#72;
     code    : #3#102#15#97#72;
     flags   : if_willamette or if_sse2
     flags   : if_willamette or if_sse2
   ),
   ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_reg16,ot_none,ot_none);
+    code    : #208#8#80;
+    flags   : if_8086
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_reg32,ot_none,ot_none);
+    code    : #209#8#80;
+    flags   : if_386
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_reg64,ot_none,ot_none);
+    code    : #209#8#80;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
+    code    : #208#192#1#255#134;
+    flags   : if_8086
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits32,ot_none,ot_none);
+    code    : #209#192#1#255#134;
+    flags   : if_386
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_immediate or ot_bits8 or ot_signed,ot_none,ot_none);
+    code    : #1#106#12;
+    flags   : if_286
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_immediate or ot_bits16,ot_none,ot_none);
+    code    : #208#1#104#24;
+    flags   : if_286
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_immediate or ot_bits32,ot_none,ot_none);
+    code    : #209#1#104#32;
+    flags   : if_386
+  ),
   (
   (
     opcode  : A_PUSHA;
     opcode  : A_PUSHA;
     ops     : 0;
     ops     : 0;
@@ -7924,6 +8022,34 @@
     code    : #209#192#1#41#65;
     code    : #209#192#1#41#65;
     flags   : if_386
     flags   : if_386
   ),
   ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_memory,ot_reg32,ot_none);
+    code    : #209#192#1#41#65;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_reg32,ot_reg32,ot_none);
+    code    : #209#192#1#41#65;
+    flags   : if_386
+  ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_memory,ot_reg64,ot_none);
+    code    : #210#192#1#41#65;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_reg64,ot_reg64,ot_none);
+    code    : #210#192#1#41#65;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_SUB;
     opcode  : A_SUB;
     ops     : 2;
     ops     : 2;
@@ -7966,6 +8092,13 @@
     code    : #209#193#1#43#72;
     code    : #209#193#1#43#72;
     flags   : if_386
     flags   : if_386
   ),
   ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_reg64,ot_reg64,ot_none);
+    code    : #210#193#1#43#72;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_SUB;
     opcode  : A_SUB;
     ops     : 2;
     ops     : 2;
@@ -7980,6 +8113,13 @@
     code    : #209#192#1#131#133#13;
     code    : #209#192#1#131#133#13;
     flags   : if_386
     flags   : if_386
   ),
   ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate or ot_bits8 or ot_signed,ot_none);
+    code    : #210#192#1#131#133#13;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_SUB;
     opcode  : A_SUB;
     ops     : 2;
     ops     : 2;
@@ -8001,6 +8141,13 @@
     code    : #209#1#45#33;
     code    : #209#1#45#33;
     flags   : if_386 or if_sm
     flags   : if_386 or if_sm
   ),
   ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #210#1#45#33;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_SUB;
     opcode  : A_SUB;
     ops     : 2;
     ops     : 2;
@@ -8022,6 +8169,13 @@
     code    : #209#192#1#129#133#33;
     code    : #209#192#1#129#133#33;
     flags   : if_386 or if_sm
     flags   : if_386 or if_sm
   ),
   ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #210#192#1#129#133#33;
+    flags   : if_x86_64
+  ),
   (
   (
     opcode  : A_SUB;
     opcode  : A_SUB;
     ops     : 2;
     ops     : 2;
@@ -8750,6 +8904,34 @@
     code    : #3#15#167#192;
     code    : #3#15#167#192;
     flags   : if_p6 or if_cyrix
     flags   : if_p6 or if_cyrix
   ),
   ),
+  (
+    opcode  : A_XCRYPTECB;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#167#208;
+    flags   : if_p6 or if_cyrix
+  ),
+  (
+    opcode  : A_XCRYPTCFB;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#167#232;
+    flags   : if_p6 or if_cyrix
+  ),
   (
   (
     opcode  : A_CMOVcc;
     opcode  : A_CMOVcc;
     ops     : 2;
     ops     : 2;
@@ -11452,6 +11634,181 @@
     code    : #3#243#15#18#72;
     code    : #3#243#15#18#72;
     flags   : if_prescott or if_sse3
     flags   : if_prescott or if_sse3
   ),
   ),
+  (
+    opcode  : A_VMREAD;
+    ops     : 2;
+    optypes : (ot_reg32,ot_reg32,ot_none);
+    code    : #192#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);
+    code    : #192#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);
+    code    : #193#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);
+    code    : #193#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);
+    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);
+    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);
+    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);
+    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);
+    code    : #192#219#2#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMCLEAR;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#3#102#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMPTRLD;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#2#15#199#134;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMPTRST;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none);
+    code    : #192#2#15#199#135;
+    flags   : if_priv or if_prot
+  ),
+  (
+    opcode  : A_VMRUN;
+    ops     : 0;
+    optypes : (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);
+    code    : #3#15#1#217;
+    flags   : if_386 or if_svm
+  ),
+  (
+    opcode  : A_VMLOAD;
+    ops     : 0;
+    optypes : (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);
+    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);
+    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);
+    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);
+    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);
+    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);
+    code    : #219#3#15#166#192;
+    flags   : if_centaur
+  ),
+  (
+    opcode  : A_XSHA1;
+    ops     : 0;
+    optypes : (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);
+    code    : #219#3#15#166#208;
+    flags   : if_centaur
+  ),
+  (
+    opcode  : A_DMINT;
+    ops     : 0;
+    optypes : (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);
+    code    : #2#15#58;
+    flags   : if_p6 or if_cyrix
+  ),
   (
   (
     opcode  : A_MOVABS;
     opcode  : A_MOVABS;
     ops     : 2;
     ops     : 2;