* first part of x86-64 assembler

git-svn-id: trunk@2824 -
This commit is contained in:
florian 2006-03-09 22:05:16 +00:00
parent a365a18fe2
commit 5ece7cbc2f
24 changed files with 1547 additions and 163 deletions

View File

@ -50,6 +50,8 @@ interface
function SwapLong(x : longint): longint;{$ifdef USEINLINE}inline;{$endif}
{# Returns the value in @va(x) swapped to different endian }
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 }
function align(i,a:longint):longint;{$ifdef USEINLINE}inline;{$endif}
@ -211,6 +213,13 @@ uses
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}
var
z : byte;

View File

@ -380,6 +380,10 @@
'xlatb',
'xor',
'xstore',
'xcryptecb',
'xcryptcbc',
'xcryptcfb',
'xcryptofb',
'cmov',
'j',
'set',
@ -563,6 +567,29 @@
'movddup',
'movshdup',
'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',
'movslq',
'cqto'

View File

@ -380,6 +380,10 @@ attsufNONE,
attsufNONE,
attsufINT,
attsufNONE,
attsufNONE,
attsufNONE,
attsufNONE,
attsufNONE,
attsufINT,
attsufNONE,
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
);

View File

@ -380,6 +380,10 @@
'xlatb',
'xor',
'xstore',
'xcryptecb',
'xcryptcbc',
'xcryptcfb',
'xcryptofb',
'cmov',
'j',
'set',
@ -563,6 +567,29 @@
'movddup',
'movshdup',
'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',
'movsxd',
'cqo'

View File

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

View File

@ -380,6 +380,10 @@ A_XLAT,
A_XLATB,
A_XOR,
A_XSTORE,
A_XCRYPTECB,
A_XCRYPTCBC,
A_XCRYPTCFB,
A_XCRYPTOFB,
A_CMOVcc,
A_Jcc,
A_SETcc,
@ -563,6 +567,29 @@ A_LDDQU,
A_MOVDDUP,
A_MOVSHDUP,
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_MOVSXD,
A_CQO

View File

@ -380,6 +380,10 @@
(Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
(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_ROp1, Ch_WOp2, Ch_RFLAGS)),
(Ch: (Ch_None, Ch_None, 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_Wop2, Ch_Rop1, Ch_None)),
(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
(Ch: (Ch_MRAX, Ch_WRDX, Ch_None))

View File

@ -8848,6 +8848,34 @@
code : #3#15#167#192;
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;
ops : 2;
@ -11549,5 +11577,180 @@
optypes : (ot_xmmreg,ot_xmmreg,ot_none);
code : #3#243#15#18#72;
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
)
);

View File

@ -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_first_defined_label=08018_E_Asm: First defined here
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

View File

@ -535,6 +535,7 @@ const
asmw_e_redefined_label=08017;
asmw_e_first_defined_label=08018;
asmw_e_invalid_register=08019;
asmw_e_16bit_32bit_not_supported=08020;
exec_w_source_os_redefined=09000;
exec_i_assembling_pipe=09001;
exec_d_cant_create_asmfile=09002;
@ -669,9 +670,9 @@ const
option_info=11024;
option_help_pages=11025;
MsgTxtSize = 39753;
MsgTxtSize = 39804;
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
);

View File

@ -583,154 +583,154 @@ const msgtxt : array[0..000165,1..240] of char=(
'08017_E_Asm: Redefined label $1'#000+
'08018_E_Asm: First defined here'#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+
'09003_E_Can'#039't create object 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+
'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'+
'ssembling'#000+
'09009_I_Assembling $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+
'09014_E_Can'#039't call the linker, switching to external linking'#000+
'09015_I_Linking $1'#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+
'09020_I_Closing script $1'#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'+
#000+
'09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
'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+
'09128_F_Can'#039't post process executable $1'#000+
'09129_F_Can'#039't open executable $1'#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+
'09134_X_Stack space committed: $1 bytes'#000+
'10000_T_Unitsearch: $1'#000+
'10001_T_PPU Loading $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+
'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+
'10008_U_PPU Invalid Version $1'#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+
'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+
'10015_F_unexpected end of PPU-File'#000+
'10016_F_Invalid PPU-File entry: $1'#000+
'10017_F_PPU Dbx count problem'#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+
'10022_F_Can'#039't find unit $1'#000+
'10023_W_Unit $1 was not found but $2 exists'#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+
'10027_U_Load from $1 ($2) unit $3'#000+
'10028_U_Recompiling $1, checksum changed for $2'#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+
'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+
'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+
'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+
'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+
'10044_U_Loading implementation units from $1'#000+
'10045_U_Interface 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+
'10050_U_No reload, already in second compile: $1'#000+
'10051_U_Flag for reload: $1'#000+
'10052_U_Forced reloading'#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+
'10057_U_Registering new unit $1'#000+
'10058_U_Re-resolving unit $1'#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+
'11003_E_nested response files are not supported'#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+
'11007_H_-? writes he','lp pages'#000+
'11007_H_-? writes help pages'#000+
'11008_F_Too many config files nested'#000+
'11009_F_Unable to open file $1'#000+
'11010_D_Reading further options from $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+
'11015_F_open conditional at the end of the file'#000+
'11016_W_Debug information generation is not supported by this executab'+
'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+
'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+
'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+
'11028_D_Handling option "$1"'#000+
'11029__*** press enter ***'#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+
'11036_D_in','terpreting firstpass option "$1"'#000+
'11036_D_interpreting firstpass option "$1"'#000+
'11033_D_interpreting file option "$1"'#000+
'11034_D_Reading config file "$1"'#000+
'11035_D_found source file name "$1"'#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+
'11024_Free Pascal Compiler version $FPCVERSION'#010+
#010+
'Compiler Date : $FPCDATE'#010+
'Compiler CPU Target: $FPCCPU'#010+
#010+
'Supported targets:'#010+
'Sup','ported targets:'#010+
' $OSTARGETS'#010+
#010+
'Supported CPU instruc','tion sets:'#010+
'Supported CPU instruction sets:'#010+
' $INSTRUCTIONSETS'#010+
#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+
'For more information read COPYING.FPC'#010+
#010+
'Report bugs,suggestions etc to:'#010+
' bugrep@fre','epascal.org'#000+
'Report b','ugs,suggestions etc to:'#010+
' bugrep@freepascal.org'#000+
'11025_**0*_put + after a boolean switch option to enable it, - to disa'+
'ble it'#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+
'*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+
'**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+
'3*2Aa','s_assemble using GNU AS'#010+
'3*2Aas_assemble using GNU AS'#010+
'3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
'3*2Anasmelf_elf32 (Linux) 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','*2Anasmobj_obj file using Nasm'#010+
'3*2Anasmobj_obj file using Nasm'#010+
'3*2Amasm_obj file using Masm (Microsoft)'#010+
'3*2Atasm_obj file using Tasm (Borland)'#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+
'6*2Aas_Unix o-file using GNU AS'#010+
'6*2Agas_GNU Motorola assembler'#010+
'6*2Amit_MIT Syntax (old GAS)'#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+
'S*2Aas_assemble u','sing GNU AS'#010+
'S*2Aas_assemble using GNU AS'#010+
'**1b_generate browser info'#010+
'**2bl_generate local symbol info'#010+
'**1B_build all modules'#010+
'**1C<x>_code generation options:'#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'+
'lues'#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+
'**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+
'**2Cr_range checking'#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+
'**2CX_create also smartli','nked library'#010+
'**2CX_create also smartlinked library'#010+
'**1d<x>_defines the symbol <x>'#010+
'**1D_generate a DEF file'#010+
'**2Dd<x>_set description to <x>'#010+
'**2Dv<x>_set DLL version to <x>'#010+
'*O2Dw_PM application'#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+
'**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+
'**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+
'**2Fl<x>_adds <x> to library path'#010+
'**2FL<x>_uses <x> as dynamic linker'#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>_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+
'*g2gc_generate checks for pointers'#010+
'*g2gd_use dbx'#010+
'*g2gg_use gsym'#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+
'*g2gw_generate dwarf debugging info'#010+
'**1i_information'#010+
'**2iD_return compiler date'#010+
'**2iV_return compiler version'#010+
'**2iSO_return compiler OS'#010+
'**2iSO_return compiler OS',#010+
'**2iSP_return compiler processor'#010+
'**2iTO_return tar','get OS'#010+
'**2iTO_return target OS'#010+
'**2iTP_return target processor'#010+
'**1I<x>_adds <x> to include path'#010+
'**1k<x>_Pass <x> to the linker'#010+
'**1l_write logo'#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+
'**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+
'**2Mgpc_tries to be gpc compatible'#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+
'**1o<x>_change the name of the executable produced to <x>'#010+
'**1O<x>_optimizations:'#010+
'3*2Oa_<type>=<values> set alignment'#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*2O1_level 1 optimizations (quick 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*3Op2_set target processor to Pentium/PentiumMMX (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*2Ox_optimize',' maximum (still BUGGY!!!)'#010+
'6*2Ox_optimize maximum (still BUGGY!!!)'#010+
'6*2O0_set target processor to a MC68000'#010+
'6*2O2_set target processor to a MC68020+ (default)'#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*2Rintel_read Intel style assembler'#010+
'6*2RMOT_read motorola style assembler'#010+
'**1S<x>_syntax options:'#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+
'**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*_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*_h ',': compiler stops also after hints'#010+
'**3*_h : compiler stops also after hints'#010+
'**2Sg_allow LABEL and GOTO'#010+
'**2Sh_Use ansistrings'#010+
'**2Si_support C++ styled INLINE'#010+
'**2Sk_load fpcylix unit'#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+
'**2So_same as -Mtp'#010+
'**2Sp_same as -Mgpc'#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+
'**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+
'**2sr_Skip register allocation phase (use with -alr)'#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*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*2Tnetbsd_NetBSD'#010+
'3*2Tnetware_Novell Netware Module (clib)'#010+
'3*2Tnetwlibc_Novell Netware Module (libc)'#010+
'3*2Topenbsd_OpenBSD'#010+
'3*2Tos2_OS/2 / eComStation'#010+
'3*2Tos2_OS/2 / eComS','tation'#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*2Twin32_Windows 32 Bit'#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*2Tatari_Atari ST/STe/TT'#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*2Twince_Windows CE'#010+
'P*2Tamiga_AmigaOS on PowerPC'#010+
'P*2Tdarwin_Darwin and MacOS X on PowerPC'#010+
'P*2Tlinux_Linux on PowerPC'#010+
'P*2Tmacos_MacOS (classic) on PowerPC'#010+
'P*2Tmorphos_MorphOS'#010+
'P*2Tmorphos_M','orphOS'#010+
'S*2Tlinux_Linux'#010+
'**1u<x>_undefines the symbol',' <x>'#010+
'**1u<x>_undefines the symbol <x>'#010+
'**1U_unit options:'#010+
'**2Un_don'#039't check the unit name'#010+
'**2Ur_generate release unit files'#010+
'**2Us_compile a system unit'#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+
'**2*_w : Show warnings u : Show unit info'#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*_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+
'3*1W<x>_Win32-like target options'#010+
'3*2WB_Create a relocatable image'#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*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+
'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*2WT_Specify tool type application (MPW tool, MacOS only)'#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+
'**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+
'**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+
'**1*_'#010+
'**1?_shows this help'#010+

View File

@ -120,6 +120,61 @@ implementation
R_386_GOTOFF = 9; { an offset from GOT base }
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_ABS = $fff1;
SHN_COMMON = $fff2;
@ -199,6 +254,211 @@ implementation
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
****************************************************************************}
@ -296,7 +556,7 @@ implementation
{ reset }
Syms:=TDynamicArray.Create(symbolresize);
{ 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);
shstrtabsect:=TElf32ObjSection.create_ext('.shstrtab',3,0,0,0,1,0);
{ insert the empty and filename as first in strtab }
@ -308,6 +568,9 @@ implementation
createsection(sec_bss,'');
if tf_section_threadvars in target_info.flags then
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;
@ -335,7 +598,7 @@ implementation
'.eh_frame',
'.debug_frame','.debug_info','.debug_line','.debug_abbrev',
'fpc',
''
''
);
begin
if (use_smartlink_section and
@ -393,8 +656,10 @@ implementation
else
begin
CurrObjSec.addsymreloc(CurrObjSec.Size,p,relative);
{$ifndef x86_64}
if relative=RELOC_RELATIVE then
dec(data,len);
{$endif x86_64}
end;
end;
CurrObjSec.write(data,len);
@ -436,7 +701,7 @@ implementation
procedure TElf32ObjectOutput.createrelocsection(s:TElf32ObjSection);
var
rel : TElf32reloc;
rel : telfreloc;
r : TObjRelocation;
relsym,reltyp : longint;
begin
@ -452,7 +717,15 @@ implementation
end;
{$endif userodata}
{ create the reloc section }
{$ifdef i386}
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 }
r:=TObjRelocation(s.relocations.first);
while assigned(r) do
@ -474,15 +747,50 @@ implementation
relsym:=r.objsection.secsymidx
else
relsym:=SHN_UNDEF;
{ when things settle down, we can create processor specific
derived classes
}
{$ifdef i386}
case r.typ of
RELOC_RELATIVE :
reltyp:=R_386_PC32;
RELOC_ABSOLUTE :
reltyp:=R_386_32;
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;
{$endif cpu64bit}
{ write reloc }
s.relocsect.write(rel,sizeof(rel));
s.relocsect.write(MaybeSwapElfReloc(rel),sizeof(rel));
r:=TObjRelocation(r.next);
end;
end;
@ -491,7 +799,7 @@ implementation
procedure TElf32ObjectOutput.section_write_symbol(p:TObject;arg:pointer);
var
elfsym : TElf32symbol;
elfsym : telfsymbol;
begin
fillchar(elfsym,sizeof(elfsym),0);
elfsym.st_name:=TElf32ObjSection(p).shstridx;
@ -500,14 +808,15 @@ implementation
TObjSection(p).secsymidx:=symidx;
inc(symidx);
inc(localsyms);
elf32data.symtabsect.write(elfsym,sizeof(elfsym));
elf32data.symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
end;
procedure TElf32ObjectOutput.createsymtab;
var
elfsym : TElf32symbol;
i : longint;
elfsym : telfsymbol;
i,
locals : longint;
objsym : TObjSymbol;
begin
with elf32data do
@ -516,14 +825,14 @@ implementation
localsyms:=0;
{ empty entry }
fillchar(elfsym,sizeof(elfsym),0);
symtabsect.write(elfsym,sizeof(elfsym));
symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
inc(symidx);
inc(localsyms);
{ filename entry }
elfsym.st_name:=1;
elfsym.st_info:=STT_FILE;
elfsym.st_shndx:=SHN_ABS;
symtabsect.write(elfsym,sizeof(elfsym));
symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
inc(symidx);
inc(localsyms);
{ section }
@ -582,7 +891,7 @@ implementation
end;
objsym.symidx:=symidx;
inc(symidx);
symtabsect.write(elfsym,sizeof(elfsym));
symtabsect.write(MaybeSwapElfSymbol(elfsym),sizeof(elfsym));
end;
end;
{ update the .symtab section header }
@ -618,7 +927,7 @@ implementation
procedure TElf32ObjectOutput.writesectionheader(s:TElf32ObjSection);
var
sechdr : TElf32sechdr;
sechdr : telfsechdr;
begin
fillchar(sechdr,sizeof(sechdr),0);
sechdr.sh_name:=s.shstridx;
@ -630,11 +939,10 @@ implementation
sechdr.sh_info:=s.shinfo;
sechdr.sh_addralign:=s.secalign;
sechdr.sh_entsize:=s.shentsize;
writer.write(sechdr,sizeof(sechdr));
writer.write(MaybeSwapSecHeader(sechdr),sizeof(sechdr));
end;
procedure TElf32ObjectOutput.writesectiondata(s:TElf32ObjSection);
begin
FWriter.writezeros(s.dataalignbytes);
@ -700,7 +1008,7 @@ implementation
function TElf32ObjectOutput.writedata(data:TObjData):boolean;
var
header : TElf32header;
header : telfheader;
shoffset,
datapos : aint;
nsections : word;
@ -735,7 +1043,7 @@ implementation
shstrtabsect.setdatapos(datapos);
{ section headers }
shoffset:=datapos;
inc(datapos,nsections*sizeof(TElf32sechdr));
inc(datapos,nsections*sizeof(telfsechdr));
{ symtab }
symtabsect.setdatapos(datapos);
{ strtab }
@ -746,25 +1054,52 @@ implementation
{ Write ELF Header }
fillchar(header,sizeof(header),0);
header.magic0123:=$464c457f; { = #127'ELF' }
{$ifdef cpu64bit}
header.file_class:=2;
{$else cpu64bit}
header.file_class:=1;
{$endif cpu64bit}
if target_info.endian=endian_big then
header.data_encoding:=2
else
header.data_encoding:=1;
header.file_version:=1;
header.e_type:=1;
{$ifdef sparc}
header.e_machine:=2;
{$endif sparc}
{$ifdef i386}
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_shoff:=shoffset;
header.e_shstrndx:=shstrtabsect.secshidx;
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 }
{ Sections }
ObjSectionList.ForEachCall(@section_write_data,nil);
{ .shstrtab }
writesectiondata(shstrtabsect);
{ section headers, start with an empty header for sh_undef }
writer.writezeros(sizeof(TElf32sechdr));
writer.writezeros(sizeof(telfsechdr));
ObjSectionList.ForEachCall(@section_write_sechdr,nil);
writesectionheader(shstrtabsect);
writesectionheader(symtabsect);
@ -808,7 +1143,39 @@ implementation
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
{$ifdef i386}
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.

View File

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

View File

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

View File

@ -780,6 +780,11 @@ implementation
if (ot and OT_BITS32)<>0 then
s:=s+'32'
else
{$ifdef x86_64}
if (ot and OT_BITS32)<>0 then
s:=s+'64'
else
{$endif x86_64}
s:=s+'??';
{ signed }
if (ot and OT_SIGNED)<>0 then
@ -1371,11 +1376,11 @@ implementation
(
(
(oper[opidx]^.ref^.index<>NR_NO) and
(getsubreg(oper[opidx]^.ref^.index)<>R_SUBD)
(getsubreg(oper[opidx]^.ref^.index)<>R_SUBADDR)
) or
(
(oper[opidx]^.ref^.base<>NR_NO) and
(getsubreg(oper[opidx]^.ref^.base)<>R_SUBD)
(getsubreg(oper[opidx]^.ref^.base)<>R_SUBADDR)
)
);
end;
@ -1406,6 +1411,156 @@ implementation
end;
{$ifdef 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
{$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;
@ -1452,8 +1607,8 @@ implementation
{ it's an indirection }
begin
{ 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
message(asmw_e_16bit_not_supported);
{$ifdef OPTEA}
{ make single reg base }
@ -1547,7 +1702,7 @@ implementation
output.size:=1+output.bytes;
process_ea:=true;
end;
{$endif x86_64}
function taicpu.calcsize(p:PInsEntry):shortint;
var

View File

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

View File

@ -1207,18 +1207,24 @@ mem,reg16 \320\300\1\x89\101 8086,SM
reg16,reg16 \320\300\1\x89\101 8086
mem,reg32 \321\300\1\x89\101 386,SM
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,reg8 \301\1\x8A\110 8086
reg16,mem \320\301\1\x8B\110 8086,SM
reg16,reg16 \320\301\1\x8B\110 8086
reg32,mem \321\301\1\x8B\110 386,SM
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
reg16,imm \320\10\xB8\31 8086,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
rm16,imm \320\300\1\xC7\200\31 8086,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,imm16 \320\300\1\xC7\200\31 8086,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]
(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_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]
(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
mem,reg32 \321\300\1\x29\101 386,SM
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,reg8 \301\1\x2A\110 8086
reg16,mem \320\301\1\x2B\110 8086,SM
reg16,reg16 \320\301\1\x2B\110 8086
reg32,mem \321\301\1\x2B\110 386,SM
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
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_ax,imm \320\1\x2D\31 8086,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
rm16,imm \320\300\1\x81\205\31 8086,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,imm16 \320\300\1\x81\205\31 8086,SM
mem,imm32 \321\300\1\x81\205\41 386,SM

View File

@ -380,6 +380,10 @@ attsufNONE,
attsufNONE,
attsufINT,
attsufNONE,
attsufNONE,
attsufNONE,
attsufNONE,
attsufNONE,
attsufINT,
attsufNONE,
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
);

View File

@ -380,6 +380,10 @@
'xlatb',
'xor',
'xstore',
'xcryptecb',
'xcryptcbc',
'xcryptcfb',
'xcryptofb',
'cmov',
'j',
'set',
@ -563,6 +567,29 @@
'movddup',
'movshdup',
'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',
'movslq',
'cqto'

View File

@ -380,6 +380,10 @@
'xlatb',
'xor',
'xstore',
'xcryptecb',
'xcryptcbc',
'xcryptcfb',
'xcryptofb',
'cmov',
'j',
'set',
@ -563,6 +567,29 @@
'movddup',
'movshdup',
'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',
'movsxd',
'cqo'

View File

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

View File

@ -380,6 +380,10 @@ A_XLAT,
A_XLATB,
A_XOR,
A_XSTORE,
A_XCRYPTECB,
A_XCRYPTCBC,
A_XCRYPTCFB,
A_XCRYPTOFB,
A_CMOVcc,
A_Jcc,
A_SETcc,
@ -563,6 +567,29 @@ A_LDDQU,
A_MOVDDUP,
A_MOVSHDUP,
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_MOVSXD,
A_CQO

View File

@ -380,6 +380,10 @@
(Ch: (Ch_WEAX, Ch_REBX, Ch_None)),
(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_ROp1, Ch_WOp2, Ch_RFLAGS)),
(Ch: (Ch_None, Ch_None, 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_Wop2, Ch_Rop1, Ch_None)),
(Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
(Ch: (Ch_MRAX, Ch_WRDX, Ch_None))

View File

@ -4214,6 +4214,20 @@
code : #209#192#1#137#65;
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;
ops : 2;
@ -4256,6 +4270,20 @@
code : #209#193#1#139#72;
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;
ops : 2;
@ -4277,6 +4305,13 @@
code : #209#8#184#33;
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;
ops : 2;
@ -4298,6 +4333,13 @@
code : #209#192#1#199#128#33;
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;
ops : 2;
@ -6678,6 +6720,62 @@
code : #3#102#15#97#72;
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;
ops : 0;
@ -7924,6 +8022,34 @@
code : #209#192#1#41#65;
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;
ops : 2;
@ -7966,6 +8092,13 @@
code : #209#193#1#43#72;
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;
ops : 2;
@ -7980,6 +8113,13 @@
code : #209#192#1#131#133#13;
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;
ops : 2;
@ -8001,6 +8141,13 @@
code : #209#1#45#33;
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;
ops : 2;
@ -8022,6 +8169,13 @@
code : #209#192#1#129#133#33;
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;
ops : 2;
@ -8750,6 +8904,34 @@
code : #3#15#167#192;
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;
ops : 2;
@ -11452,6 +11634,181 @@
code : #3#243#15#18#72;
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;
ops : 2;