Browse Source

* 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 -

nickysn 8 years ago
parent
commit
189e49998c
5 changed files with 121 additions and 118 deletions
  1. 26 26
      compiler/i386/i386prop.inc
  2. 28 28
      compiler/i8086/i8086prop.inc
  3. 1 1
      compiler/x86/aasmcpu.pas
  4. 37 34
      compiler/x86/x86ins.dat
  5. 29 29
      compiler/x86_64/x8664pro.inc

+ 26 - 26
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)),

+ 28 - 28
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)),

+ 1 - 1
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,

+ 37 - 34
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]

+ 29 - 29
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)),