From 189e49998c44fd23d8d3934ab9a5b20143321185 Mon Sep 17 00:00:00 2001 From: nickysn Date: Wed, 19 Apr 2017 15:42:50 +0000 Subject: [PATCH] * fixes to the x86 instruction flags tracking attributes: * AAA and AAS also read flags (AF) * CMC reads and writes flags (it inverts CF) * CMPSx and SCASx write flags * CMPSx, SCASx, LODSx, STOSx, MOVSx read the direction flag * NOT doesn't affect flags * REP isn't affected by and doesn't affect flags * REPE/REPNE/REPZ/REPNZ/REPC/REPNC don't write flags, only read them * ROL and ROR don't read flags * SAL doesn't read flags * SHLD and SHRD don't read flags git-svn-id: trunk@35849 - --- compiler/i386/i386prop.inc | 52 +++++++++++++------------- compiler/i8086/i8086prop.inc | 56 ++++++++++++++-------------- compiler/x86/aasmcpu.pas | 2 +- compiler/x86/x86ins.dat | 71 +++++++++++++++++++----------------- compiler/x86_64/x8664pro.inc | 58 ++++++++++++++--------------- 5 files changed, 121 insertions(+), 118 deletions(-) diff --git a/compiler/i386/i386prop.inc b/compiler/i386/i386prop.inc index b7c935a2e8..0bea0ff44c 100644 --- a/compiler/i386/i386prop.inc +++ b/compiler/i386/i386prop.inc @@ -1,10 +1,10 @@ { don't edit, this file is generated from x86ins.dat } ( (Ch: (Ch_None, Ch_None, Ch_None)), +(Ch: (Ch_MEAX, Ch_RWFlags, Ch_None)), (Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), (Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), -(Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), -(Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), +(Ch: (Ch_MEAX, Ch_RWFlags, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), @@ -24,11 +24,11 @@ (Ch: (Ch_CDirFlag, Ch_None, Ch_None)), (Ch: (Ch_WFlags, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WFlags, Ch_None, Ch_None)), +(Ch: (Ch_RWFlags, Ch_None, Ch_None)), (Ch: (Ch_ROp1, Ch_ROp2, Ch_WFlags)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -181,9 +181,9 @@ (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), (Ch: (Ch_RWECX, Ch_None, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), @@ -196,16 +196,16 @@ (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, 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_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_RWEAX, Ch_WEDX, Ch_WFlags)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_Mop1, Ch_WFlags, Ch_None)), +(Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Rop1, Ch_Rop2, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -309,27 +309,27 @@ (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_None, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(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_WFlags, Ch_REAX, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_WEAX, Ch_RFLAGS, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(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_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), @@ -338,9 +338,9 @@ (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), diff --git a/compiler/i8086/i8086prop.inc b/compiler/i8086/i8086prop.inc index 61a349022c..d1b20c846f 100644 --- a/compiler/i8086/i8086prop.inc +++ b/compiler/i8086/i8086prop.inc @@ -1,10 +1,10 @@ { don't edit, this file is generated from x86ins.dat } ( (Ch: (Ch_None, Ch_None, Ch_None)), +(Ch: (Ch_MEAX, Ch_RWFlags, Ch_None)), (Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), (Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), -(Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), -(Ch: (Ch_MEAX, Ch_WFlags, Ch_None)), +(Ch: (Ch_MEAX, Ch_RWFlags, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), @@ -24,11 +24,11 @@ (Ch: (Ch_CDirFlag, Ch_None, Ch_None)), (Ch: (Ch_WFlags, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WFlags, Ch_None, Ch_None)), +(Ch: (Ch_RWFlags, Ch_None, Ch_None)), (Ch: (Ch_ROp1, Ch_ROp2, Ch_WFlags)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -181,9 +181,9 @@ (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), (Ch: (Ch_RWECX, Ch_None, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), @@ -196,16 +196,16 @@ (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, 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_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_RWEAX, Ch_WEDX, Ch_WFlags)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_Mop1, Ch_WFlags, Ch_None)), +(Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Rop1, Ch_Rop2, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -309,27 +309,27 @@ (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_None, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(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_WFlags, Ch_REAX, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_WEAX, Ch_RFLAGS, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(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_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), @@ -338,9 +338,9 @@ (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -972,8 +972,8 @@ (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), (Ch: (Ch_Mop1, Ch_RWEAX, Ch_None)), (Ch: (Ch_Mop1, Ch_RWEAX, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)), diff --git a/compiler/x86/aasmcpu.pas b/compiler/x86/aasmcpu.pas index 72f1346247..d50acdde0b 100644 --- a/compiler/x86/aasmcpu.pas +++ b/compiler/x86/aasmcpu.pas @@ -213,7 +213,7 @@ interface this changed content afterwards (add/sub/..., but e.g. not rep or movsd)} Ch_MEAX, Ch_MECX, Ch_MEDX, Ch_MEBX, Ch_MESP, Ch_MEBP, Ch_MESI, Ch_MEDI, - Ch_CDirFlag {clear direction flag}, Ch_SDirFlag {set dir flag}, + Ch_CDirFlag {clear direction flag}, Ch_SDirFlag {set dir flag},Ch_RDirFlag {read direction flag}, Ch_RFlags, Ch_WFlags, Ch_RWFlags, Ch_FPU, Ch_Rop1, Ch_Wop1, Ch_RWop1,Ch_Mop1, Ch_Rop2, Ch_Wop2, Ch_RWop2,Ch_Mop2, diff --git a/compiler/x86/x86ins.dat b/compiler/x86/x86ins.dat index c242b773b5..1d216d159d 100644 --- a/compiler/x86/x86ins.dat +++ b/compiler/x86/x86ins.dat @@ -16,7 +16,7 @@ void void none [AAA] -(Ch_MEAX, Ch_WFlags, Ch_None) +(Ch_MEAX, Ch_RWFlags, Ch_None) void \1\x37 8086,NOX86_64 [AAD,aadX] @@ -30,7 +30,7 @@ void \2\xD4\x0A 8086,NOX86_64 imm \1\xD4\24 8086,SB,NOX86_64 [AAS] -(Ch_MEAX, Ch_WFlags, Ch_None) +(Ch_MEAX, Ch_RWFlags, Ch_None) void \1\x3F 8086,NOX86_64 [ADC,adcX] @@ -170,7 +170,7 @@ void \1\xFA 8086 void \2\x0F\x06 286,PRIV [CMC] -(Ch_WFlags, Ch_None, Ch_None) +(Ch_RWFlags, Ch_None, Ch_None) void \1\xF5 8086 [CMP,cmpX] @@ -193,16 +193,16 @@ mem,imm16 \324\1\x81\207\31 8086,SW mem,imm8 \1\x80\207\21 8086,SB [CMPSB] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\1\xA6 8086 [CMPSD,cmpsl] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\325\1\xA7 386 xmmreg,xmmrm,imm \334\2\x0F\xC2\110\26 WILLAMETTE,SSE2,SM2,SB,AR2 [CMPSW] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\324\1\xA7 8086 [CMPXCHG,cmpxchgX] @@ -983,15 +983,15 @@ void \2\x0F\x05 286,UNDOC void \1\xF0 8086,PRE [LODSB] -(Ch_WEAX, Ch_RWESI, Ch_None) +(Ch_WEAX, Ch_RWESI, Ch_RDirFlag) void \1\xAC 8086 [LODSD,lodsl] -(Ch_WEAX, Ch_RWESI, Ch_None) +(Ch_WEAX, Ch_RWESI, Ch_RDirFlag) void \325\1\xAD 386 [LODSW] -(Ch_WEAX, Ch_RWESI, Ch_None) +(Ch_WEAX, Ch_RWESI, Ch_RDirFlag) void \324\1\xAD 8086 [LOOP] @@ -1104,22 +1104,22 @@ xmmreg,reg64 \361\326\2\x0F\x6E\110 WILLAMETTE,SSE2,X86_64 reg64,xmmreg \361\326\2\x0F\x7E\101 WILLAMETTE,SSE2,X86_64 [MOVSB] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_RDirFlag, Ch_None) void \1\xA4 8086 [MOVSD,movsl] -; Ch_All isn't correct for the sse move, but how can it be solved? (FK) -(Ch_All, Ch_None, Ch_None) +; Ch_All and Ch_RDirFlag aren't correct for the sse move, but how can it be solved? (FK) +(Ch_All, Ch_RDirFlag, Ch_None) void \325\1\xA5 386 xmmreg,xmmrm \334\2\x0F\x10\110 WILLAMETTE,SSE2 xmmrm,xmmreg \334\2\x0F\x11\101 WILLAMETTE,SSE2 [MOVSQ] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_RDirFlag, Ch_None) void \326\1\xA5 X86_64 [MOVSW] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_RDirFlag, Ch_None) void \324\1\xA5 8086 [MOVSX,movsY] @@ -1153,7 +1153,7 @@ rm8 \1\xF6\203 8086 void \1\x90 8086 [NOT,notX] -(Ch_Mop1, Ch_WFlags, Ch_None) +(Ch_Mop1, Ch_None, Ch_None) rm16|32|64 \320\1\xF7\202 8086 rm8 \1\xF6\202 8086 @@ -1686,23 +1686,23 @@ void \2\x0F\x33 P6 void \2\x0F\x31 PENT [REP] -(Ch_RWECX, Ch_RWFlags, Ch_None) +(Ch_RWECX, Ch_None, Ch_None) void \1\xF3 8086,PRE [REPE] -(Ch_RWECX, Ch_RWFlags, Ch_None) +(Ch_RWECX, Ch_RFlags, Ch_None) void \1\xF3 8086,PRE [REPNE] -(Ch_RWECX, Ch_RWFlags, Ch_None) +(Ch_RWECX, Ch_RFlags, Ch_None) void \1\xF2 8086,PRE [REPNZ] -(Ch_RWECX, Ch_RWFLAGS, Ch_None) +(Ch_RWECX, Ch_RFLAGS, Ch_None) void \1\xF2 8086,PRE [REPZ] -(Ch_RWECX, Ch_RWFLAGS, Ch_None) +(Ch_RWECX, Ch_RFLAGS, Ch_None) void \1\xF3 8086,PRE [RET] @@ -1721,7 +1721,7 @@ void \1\xC3 8086 imm \1\xC2\30 8086,SW [ROL,rolX] -(Ch_Mop2, Ch_Rop1, Ch_RWFlags) +(Ch_Mop2, Ch_Rop1, Ch_WFlags) rm16|32|64,unity \320\1\xD1\200 8086 rm16|32|64,reg_cl \320\1\xD3\200 8086 rm16|32|64,imm \320\1\xC1\200\25 186,SB @@ -1730,7 +1730,7 @@ rm8,reg_cl \1\xD2\200 8086 rm8,imm \1\xC0\200\25 186,SB [ROR,rorX] -(Ch_Mop2, Ch_Rop1, Ch_RWFlags) +(Ch_Mop2, Ch_Rop1, Ch_WFlags) rm16|32|64,unity \320\1\xD1\201 8086 rm16|32|64,reg_cl \320\1\xD3\201 8086 rm16|32|64,imm \320\1\xC1\201\25 186,SB @@ -1756,7 +1756,7 @@ void \2\x0F\xAA PENT,SMM void \1\x9E 8086 [SAL,salX] -(Ch_Mop2, Ch_Rop1, Ch_RWFlags) +(Ch_Mop2, Ch_Rop1, Ch_WFlags) rm16|32|64,unity \320\1\xD1\204 8086,ND rm16|32|64,reg_cl \320\1\xD3\204 8086,ND rm16|32|64,imm \320\1\xC1\204\25 186,ND,SB @@ -1794,19 +1794,19 @@ reg_al,imm \1\x1C\21 8086,SB rm8,imm \1\x80\203\21 8086,SB [SCASB] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\1\xAE 8086 [SCASD,scasl] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\325\1\xAF 386 [SCASQ] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\326\1\xAF X86_64 [SCASW] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \332\324\1\xAF 8086 [SEGCS,cs] @@ -1847,7 +1847,7 @@ rm8,reg_cl \1\xD2\204 8086 rm8,imm \1\xC0\204\25 186,SB [SHLD,shldX] -(Ch_MOp3, Ch_RWFlags, Ch_Rop2) +(Ch_MOp3, Ch_WFlags, Ch_Rop2) rm16|32|64,reg16|32|64,imm \321\2\x0F\xA4\101\26 386,SM2,SB,AR2 rm16|32|64,reg16|32|64,reg_cl \321\2\x0F\xA5\101 386,SM @@ -1861,7 +1861,7 @@ rm8,reg_cl \1\xD2\205 8086 rm8,imm \1\xC0\205\25 186,SB [SHRD,shrdX] -(Ch_MOp3, Ch_RWFlags, Ch_Rop2) +(Ch_MOp3, Ch_WFlags, Ch_Rop2) rm16|32|64,reg16|32|64,imm \321\2\x0F\xAC\101\26 386,SM2,SB,AR2 rm16|32|64,reg16|32|64,reg_cl \321\2\x0F\xAD\101 386,SM @@ -1903,14 +1903,17 @@ void \1\xFD 8086 void \1\xFB 8086 [STOSB] +; todo: also needs Ch_CDirFlag (Ch_REAX, Ch_WMemEDI, Ch_RWEDI) void \1\xAA 8086 [STOSD,stosl] +; todo: also needs Ch_CDirFlag (Ch_REAX, Ch_WMemEDI, Ch_RWEDI) void \325\1\xAB 386 [STOSW] +; todo: also needs Ch_CDirFlag (Ch_REAX, Ch_WMemEDI, Ch_RWEDI) void \324\1\xAB 8086 @@ -3457,15 +3460,15 @@ void \3\x0F\x01\xf9 SSE4,SM ;******************************************************************************* ;******************************************************************************* [STOSQ] -(Ch_RRAX, Ch_WMemEDI, Ch_RWRDI) +(Ch_RRAX, Ch_WMemEDI, Ch_RWRDI, Ch_RDirFlag) void \326\1\xAB X86_64 [LODSQ] -(Ch_WRAX, Ch_RWRSI, Ch_None) +(Ch_WRAX, Ch_RWRSI, Ch_RDirFlag) void \326\1\xAD X86_64 [CMPSQ] -(Ch_All, Ch_None, Ch_None) +(Ch_All, Ch_WFlags, Ch_RDirFlag) void \326\1\xA7 X86_64 ;******************************************************************************* @@ -5065,11 +5068,11 @@ rm8,imm \2\x0F\x1E\200\25 NEC,SB rm16,imm \2\x0F\x1F\200\25 NEC,SW,IMM4,16BITONLY [REPC] -(Ch_RWECX, Ch_RWFlags, Ch_None) +(Ch_RWECX, Ch_RFlags, Ch_None) void \1\x65 NEC,PRE,16BITONLY [REPNC] -(Ch_RWECX, Ch_RWFlags, Ch_None) +(Ch_RWECX, Ch_RFlags, Ch_None) void \1\x64 NEC,PRE,16BITONLY [ROL4] diff --git a/compiler/x86_64/x8664pro.inc b/compiler/x86_64/x8664pro.inc index eead4c9cea..4cb1f47d4b 100644 --- a/compiler/x86_64/x8664pro.inc +++ b/compiler/x86_64/x8664pro.inc @@ -18,11 +18,11 @@ (Ch: (Ch_CDirFlag, Ch_None, Ch_None)), (Ch: (Ch_WFlags, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WFlags, Ch_None, Ch_None)), +(Ch: (Ch_RWFlags, Ch_None, Ch_None)), (Ch: (Ch_ROp1, Ch_ROp2, Ch_WFlags)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -171,9 +171,9 @@ (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), -(Ch: (Ch_WEAX, Ch_RWESI, Ch_None)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), +(Ch: (Ch_WEAX, Ch_RWESI, Ch_RDirFlag)), (Ch: (Ch_RWECX, Ch_None, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), (Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), @@ -186,17 +186,17 @@ (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, Ch_None)), (Ch: (Ch_Rop1, Ch_Wop2, 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_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), +(Ch: (Ch_All, Ch_RDirFlag, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)), (Ch: (Ch_RWEAX, Ch_WEDX, Ch_WFlags)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), -(Ch: (Ch_Mop1, Ch_WFlags, Ch_None)), +(Ch: (Ch_Mop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Rop1, Ch_Rop2, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -294,27 +294,27 @@ (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFlags, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), -(Ch: (Ch_RWECX, Ch_RWFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_None, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFlags, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), +(Ch: (Ch_RWECX, Ch_RFLAGS, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(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_WFlags, Ch_REAX, Ch_None)), -(Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), +(Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_RWFlags)), -(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_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_None, Ch_None, Ch_None)), @@ -323,9 +323,9 @@ (Ch: (Ch_None, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Mop2, Ch_Rop1, Ch_WFlags)), -(Ch: (Ch_MOp3, Ch_RWFlags, Ch_Rop2)), +(Ch: (Ch_MOp3, Ch_WFlags, Ch_Rop2)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_Wop1, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), @@ -663,9 +663,9 @@ (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_All, Ch_None, Ch_None)), (Ch: (Ch_WEAX, Ch_WEDX, Ch_None)), -(Ch: (Ch_RRAX, Ch_WMemEDI, Ch_RWRDI)), -(Ch: (Ch_WRAX, Ch_RWRSI, Ch_None)), -(Ch: (Ch_All, Ch_None, Ch_None)), +(Ch: (Ch_RRAX, Ch_WMemEDI, Ch_RWRDI, Ch_RDirFlag)), +(Ch: (Ch_WRAX, Ch_RWRSI, Ch_RDirFlag)), +(Ch: (Ch_All, Ch_WFlags, Ch_RDirFlag)), (Ch: (Ch_Wop3, Ch_Rop2, Ch_Rop1)), (Ch: (Ch_Wop3, Ch_Rop2, Ch_Rop1)), (Ch: (Ch_Wop3, Ch_Rop2, Ch_Rop1)),