# # Copyright (c) 2020 Bitdefender # SPDX-License-Identifier: Apache-2.0 # # Flags access templates; many instructions have the same flag usage, so define them here. # Syntax: NAME: FLAG=modifier|FLAG=modifier|.... See the definitions for some examples. # Accepted flags: CF, PF, AF, ZF, TF, IF, OF, DF, AC, IOPL, RF, NT, VIF, VIP, VM # Accepted modifiers: t (tested), m (modified according to the result), 0 (cleared), 1 (set), u (undefined) # All arithmetic instructions: ADD, SUB, CMP, XADD ARITH : CF=m|PF=m|AF=m|ZF=m|SF=m|OF=m # Arithmetic with carry instructions: ADC, SBB ARITHC : CF=t|CF=m|PF=m|AF=m|ZF=m|SF=m|OF=m # INC/DEC do not alter CF. INCDEC : PF=m|AF=m|ZF=m|SF=m|OF=m # Logic instructions: OR, AND, XOR, TEST LOGIC : CF=0|PF=m|AF=u|ZF=m|SF=m|OF=0 # Rotate instructions. ROT : CF=m|OF=m # Rotate carry instructions. ROTC : CF=t|CF=m|OF=m # Shift instructions. SHIFT : CF=m|PF=m|AF=u|ZF=m|SF=m|OF=m # Shidft double instructions. SHIFTD : CF=u|PF=m|AF=u|ZF=m|SF=m|OF=u # Multiply instructions. MUL : CF=m|PF=u|AF=u|ZF=u|SF=u|OF=m # Division instructions. DIV : CF=u|PF=u|AF=u|ZF=u|SF=u|OF=u # AAD/AAM AADM : CF=u|PF=m|AF=u|ZF=m|SF=m|OF=u # AAA/AAS AAAS : CF=m|PF=u|AF=t|AF=m|ZF=u|SF=u|OF=u # DAA/DAS DAAS : CF=t|CF=m|PF=m|AF=t|AF=m|ZF=m|OF=u # I/O instructions. IO : IOPL=t|VM=t # I/O string operations IOS : DF=t|IOPL=t|VM=t # INT instructions. INT : VM=t|VM=m|IF=m|NT=m|AC=m|RF=m|TF=m # Used by CMPS/SCAS and REP CMPS/REP SCAS CMPS : CF=m|PF=m|AF=m|ZF=m|SF=m|OF=m|DF=t REPCMPS : CF=m|PF=m|AF=m|ZF=t|ZF=m|SF=m|OF=m|DF=t # Used by PCMPESTRM, PCMPESTRI, PCMPISTRM, PCMPISTRI PCMPSTR : CF=m|PF=0|AF=0|ZF=m|SF=m|OF=m # MOV to/from control/debug registers, all flags are undefined. MOVCRDR : CF=u|PF=u|AF=u|ZF=u|SF=u|OF=u # Used by VMX instructions. VMX : CF=m|PF=0|AF=0|ZF=m|SF=0|OF=0 # Used by BT, BTS, BTR, BTC instructions. BT : CF=m|PF=u|AF=u|SF=u|OF=u # COMIS instructions. COMIS : CF=m|PF=m|ZF=m # VPTEST instructions. VPTEST : CF=m|PF=0|AF=0|ZF=m|SF=0|OF=0 # UMWAIT, TPAUSE instructions. WAITPKG : CF=m|PF=0|AF=0|ZF=0|SF=0|OF=0 # ENQCMD instructions. ENQCMD : CF=0|PF=0|AF=0|ZF=m|SF=0|OF=0 # KORTEST instructions. KORTEST : CF=m|PF=0|AF=0|ZF=m|SF=0|OF=0 # Conditional codes. CO : OF=t CNO : OF=t CC : CF=t CNC : CF=t CZ : ZF=t CNZ : ZF=t CBE : CF=t|ZF=t CNBE : CF=t|ZF=t CS : SF=t CNS : SF=t CP : PF=t CNP : PF=t CL : SF=t|OF=t CNL : SF=t|OF=t CLE : SF=t|ZF=t|OF=t CNLE : SF=t|ZF=t|OF=t # AES Key Locker instructions. ZF set to 0 or 1, depending on success. All other flags are cleared to 0. AESKL : CF=0|PF=0|AF=0|ZF=m|SF=0|OF=0 # All flags are zeroed. ZERO : CF=0|PF=0|AF=0|ZF=0|SF=0|OF=0 # UINTR flags access, as done by TESTUI. UINTR : CF=m|PF=0|AF=0|ZF=0|SF=0|OF=0 # AVX 10.2 Compare Scalar FP With Enhanced EFLAGS CMPSFP : CF=m|PF=m|AF=0|ZF=m|SF=m|OF=m