Home | History | Annotate | Download | only in libenc
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef _ENCODER_DEFS_EXT_H_
     18 #define _ENCODER_DEFS_EXT_H_
     19 
     20 
     21 // Used to isolate experimental or being tuned encoder into a separate
     22 // namespace so it can coexist with a stable one in the same bundle.
     23 #ifdef ENCODER_ISOLATE
     24     #define ENCODER_NAMESPACE_START namespace enc_ia32 {
     25     #define ENCODER_NAMESPACE_END };
     26 #else
     27     #define ENCODER_NAMESPACE_START
     28     #define ENCODER_NAMESPACE_END
     29 #endif
     30 
     31 ENCODER_NAMESPACE_START
     32 typedef enum OpndSize {
     33     /**
     34      * A change must be balanced with at least the following places:
     35      *              Ia32IRConstants.h :: getByteSize() uses some presumptions about OpndSize_ values
     36      *              Ia32::Constraint-s use the OpndSize as a mask
     37      *              encoder.cpp & encoder_master_info.cpp uses OpndSize as an index for hashing
     38      *              - perhaps there are much more places
     39      */
     40     OpndSize_Null           = 0,
     41     OpndSize_8             = 0x01,
     42     OpndSize_16            = 0x02,
     43     OpndSize_32            = 0x04,
     44     OpndSize_64            = 0x08,
     45 #if !defined(TESTING_ENCODER)
     46     OpndSize_80            = 0x10,
     47     OpndSize_128           = 0x20,
     48 #endif
     49     OpndSize_Max,
     50     OpndSize_Any            = 0x3F,
     51     OpndSize_Default        = OpndSize_Any
     52 } OpndSize;
     53 
     54 /**
     55  * Conditional mnemonics.
     56  * The values match the 'real' (==processor's) values of the appropriate
     57  * condition values used in the opcodes.
     58  */
     59 typedef enum ConditionMnemonic {
     60 
     61     ConditionMnemonic_O=0,
     62     ConditionMnemonic_NO=1,
     63     ConditionMnemonic_B=2, ConditionMnemonic_NAE=ConditionMnemonic_B, ConditionMnemonic_C=ConditionMnemonic_B,
     64     ConditionMnemonic_NB=3, ConditionMnemonic_AE=ConditionMnemonic_NB, ConditionMnemonic_NC=ConditionMnemonic_NB,
     65     ConditionMnemonic_Z=4, ConditionMnemonic_E=ConditionMnemonic_Z,
     66     ConditionMnemonic_NZ=5, ConditionMnemonic_NE=ConditionMnemonic_NZ,
     67     ConditionMnemonic_BE=6, ConditionMnemonic_NA=ConditionMnemonic_BE,
     68     ConditionMnemonic_NBE=7, ConditionMnemonic_A=ConditionMnemonic_NBE,
     69 
     70     ConditionMnemonic_S=8,
     71     ConditionMnemonic_NS=9,
     72     ConditionMnemonic_P=10, ConditionMnemonic_PE=ConditionMnemonic_P,
     73     ConditionMnemonic_NP=11, ConditionMnemonic_PO=ConditionMnemonic_NP,
     74     ConditionMnemonic_L=12, ConditionMnemonic_NGE=ConditionMnemonic_L,
     75     ConditionMnemonic_NL=13, ConditionMnemonic_GE=ConditionMnemonic_NL,
     76     ConditionMnemonic_LE=14, ConditionMnemonic_NG=ConditionMnemonic_LE,
     77     ConditionMnemonic_NLE=15, ConditionMnemonic_G=ConditionMnemonic_NLE,
     78     ConditionMnemonic_Count=16
     79 } ConditionMnemonic;
     80 
     81 
     82 #define CCM(prefix,cond) Mnemonic_##prefix##cond=Mnemonic_##prefix##cc+ConditionMnemonic_##cond
     83 
     84 //=========================================================================================================
     85 typedef enum Mnemonic {
     86 
     87 Mnemonic_NULL=0, Mnemonic_Null=Mnemonic_NULL,
     88 Mnemonic_ADC,                           // Add with Carry
     89 Mnemonic_ADD,                           // Add
     90 Mnemonic_ADDSD,                         // Add Scalar Double-Precision Floating-Point Values
     91 Mnemonic_ADDSS,                         // Add Scalar Single-Precision Floating-Point Values
     92 Mnemonic_AND,                           // Logical AND
     93 
     94 Mnemonic_BSF,                           // Bit scan forward
     95 Mnemonic_BSR,                           // Bit scan reverse
     96 
     97 Mnemonic_CALL,                          // Call Procedure
     98 Mnemonic_CMC,                           // Complement Carry Flag
     99 Mnemonic_CWD, Mnemonic_CDQ=Mnemonic_CWD,// Convert Word to Doubleword/Convert Doubleword to Qua T dword
    100 Mnemonic_CMOVcc,                        // Conditional Move
    101     CCM(CMOV,O),
    102     CCM(CMOV,NO),
    103     CCM(CMOV,B), CCM(CMOV,NAE), CCM(CMOV,C),
    104     CCM(CMOV,NB), CCM(CMOV,AE), CCM(CMOV,NC),
    105     CCM(CMOV,Z), CCM(CMOV,E),
    106     CCM(CMOV,NZ), CCM(CMOV,NE),
    107     CCM(CMOV,BE), CCM(CMOV,NA),
    108     CCM(CMOV,NBE), CCM(CMOV,A),
    109 
    110     CCM(CMOV,S),
    111     CCM(CMOV,NS),
    112     CCM(CMOV,P), CCM(CMOV,PE),
    113     CCM(CMOV,NP), CCM(CMOV,PO),
    114     CCM(CMOV,L), CCM(CMOV,NGE),
    115     CCM(CMOV,NL), CCM(CMOV,GE),
    116     CCM(CMOV,LE), CCM(CMOV,NG),
    117     CCM(CMOV,NLE), CCM(CMOV,G),
    118 
    119 Mnemonic_CMP,                           // Compare Two Operands
    120 Mnemonic_CMPXCHG,                       // Compare and exchange
    121 Mnemonic_CMPXCHG8B,                     // Compare and Exchange 8 Bytes
    122 Mnemonic_CMPSB,                         // Compare Two Bytes at DS:ESI and ES:EDI
    123 Mnemonic_CMPSW,                         // Compare Two Words at DS:ESI and ES:EDI
    124 Mnemonic_CMPSD,                         // Compare Two Doublewords at DS:ESI and ES:EDI
    125 //
    126 // double -> float
    127 Mnemonic_CVTSD2SS,                      // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value
    128 // double -> I_32
    129 Mnemonic_CVTSD2SI,                      // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer
    130 // double [truncated] -> I_32
    131 Mnemonic_CVTTSD2SI,                     // Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer
    132 //
    133 // float -> double
    134 Mnemonic_CVTSS2SD,                      // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value
    135 // float -> I_32
    136 Mnemonic_CVTSS2SI,                      // Convert Scalar Single-Precision Floating-Point Value to Doubleword Integer
    137 // float [truncated] -> I_32
    138 Mnemonic_CVTTSS2SI,                     // Convert with Truncation Scalar Single-Precision Floating-Point Value to Doubleword Integer
    139 //
    140 // I_32 -> double
    141 Mnemonic_CVTSI2SD,                      // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value
    142 // I_32 -> float
    143 Mnemonic_CVTSI2SS,                      // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
    144 
    145 Mnemonic_COMISD,                        // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS
    146 Mnemonic_COMISS,                        // Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS
    147 Mnemonic_DEC,                           // Decrement by 1
    148 //Mnemonic_DIV,                         // Unsigned Divide
    149 Mnemonic_DIVSD,                         // Divide Scalar Double-Precision Floating-Point Values
    150 Mnemonic_DIVSS,                         // Divide Scalar Single-Precision Floating-Point Values
    151 
    152 #ifdef _HAVE_MMX_
    153 Mnemonic_EMMS,                          // Empty MMX Technology State
    154 #endif
    155 
    156 Mnemonic_ENTER,                         // ENTER-Make Stack Frame for Procedure Parameters
    157 Mnemonic_FLDCW,                         // Load FPU control word
    158 Mnemonic_FADDP,
    159 Mnemonic_FLDZ,
    160 Mnemonic_FADD,
    161 Mnemonic_FSUBP,
    162 Mnemonic_FSUB,
    163 Mnemonic_FISUB,
    164 Mnemonic_FMUL,
    165 Mnemonic_FMULP,
    166 Mnemonic_FDIVP,
    167 Mnemonic_FDIV,
    168 Mnemonic_FUCOM,
    169 Mnemonic_FUCOMI,
    170 Mnemonic_FUCOMP,
    171 Mnemonic_FUCOMIP,
    172 Mnemonic_FUCOMPP,
    173 Mnemonic_FRNDINT,
    174 Mnemonic_FNSTCW,                        // Store FPU control word
    175 Mnemonic_FSTSW,                         // Store FPU status word
    176 Mnemonic_FNSTSW,                         // Store FPU status word
    177 //Mnemonic_FDECSTP,                     // Decrement Stack-Top Pointer
    178 Mnemonic_FILD,                          // Load Integer
    179 Mnemonic_FLD,                           // Load Floating Point Value
    180 Mnemonic_FLDLG2,
    181 Mnemonic_FLDLN2,
    182 Mnemonic_FLD1,
    183 
    184 Mnemonic_FCLEX,                         // Clear Exceptions
    185 Mnemonic_FCHS,                          // Change sign of ST0
    186 Mnemonic_FNCLEX,                        // Clear Exceptions
    187 
    188 //Mnemonic_FINCSTP,                     // Increment Stack-Top Pointer
    189 Mnemonic_FIST,                          // Store Integer
    190 Mnemonic_FISTP,                         // Store Integer, pop FPU stack
    191 Mnemonic_FISTTP,                        // Store Integer with Truncation
    192 Mnemonic_FPREM,                         // Partial Remainder
    193 Mnemonic_FPREM1,                        // Partial Remainder
    194 Mnemonic_FST,                           // Store Floating Point Value
    195 Mnemonic_FSTP,                          // Store Floating Point Value and pop the FP stack
    196 Mnemonic_FSQRT,                         //Computes the square root of the source value in the stack and pop the FP stack
    197 Mnemonic_FABS,                          //Computes the absolute value of the source value in the stack and pop the FP stack
    198 Mnemonic_FSIN,                          //Computes the sine of the source value in the stack and pop the FP stack
    199 Mnemonic_FCOS,                          //Computes the cosine of the source value in the stack and pop the FP stack
    200 Mnemonic_FPTAN,                         //Computes the tangent of the source value in the stack and pop the FP stack
    201 Mnemonic_FYL2X,
    202 Mnemonic_FYL2XP1,
    203 Mnemonic_F2XM1,
    204 Mnemonic_FPATAN,
    205 Mnemonic_FXCH,
    206 Mnemonic_FSCALE,
    207 
    208 Mnemonic_XCHG,
    209 Mnemonic_DIV,                           // Unsigned Divide
    210 Mnemonic_IDIV,                          // Signed Divide
    211 Mnemonic_MUL,                           // Unsigned Multiply
    212 Mnemonic_IMUL,                          // Signed Multiply
    213 Mnemonic_INC,                           // Increment by 1
    214 Mnemonic_INT3,                          // Call break point
    215 Mnemonic_Jcc,                           // Jump if Condition Is Met
    216     CCM(J,O),
    217     CCM(J,NO),
    218     CCM(J,B), CCM(J,NAE), CCM(J,C),
    219     CCM(J,NB), CCM(J,AE), CCM(J,NC),
    220     CCM(J,Z), CCM(J,E),
    221     CCM(J,NZ), CCM(J,NE),
    222     CCM(J,BE), CCM(J,NA),
    223     CCM(J,NBE), CCM(J,A),
    224     CCM(J,S),
    225     CCM(J,NS),
    226     CCM(J,P), CCM(J,PE),
    227     CCM(J,NP), CCM(J,PO),
    228     CCM(J,L), CCM(J,NGE),
    229     CCM(J,NL), CCM(J,GE),
    230     CCM(J,LE), CCM(J,NG),
    231     CCM(J,NLE), CCM(J,G),
    232 Mnemonic_JMP,                           // Jump
    233 Mnemonic_LEA,                           // Load Effective Address
    234 Mnemonic_LEAVE,                         // High Level Procedure Exit
    235 Mnemonic_LOOP,                          // Loop according to ECX counter
    236 Mnemonic_LOOPE,                          // Loop according to ECX counter
    237 Mnemonic_LOOPNE, Mnemonic_LOOPNZ = Mnemonic_LOOPNE, // Loop according to ECX
    238 Mnemonic_LAHF,                          // Load Flags into AH
    239 Mnemonic_MOV,                           // Move
    240 Mnemonic_MOVD,                          // Move Double word
    241 Mnemonic_MOVQ,                          // Move Quadword
    242 /*Mnemonic_MOVS,                        // Move Data from String to String*/
    243 // MOVS is a special case: see encoding table for more details,
    244 Mnemonic_MOVS8, Mnemonic_MOVS16, Mnemonic_MOVS32, Mnemonic_MOVS64,
    245 //
    246 Mnemonic_MOVAPD,                         // Move Scalar Double-Precision Floating-Point Value
    247 Mnemonic_MOVSD,                         // Move Scalar Double-Precision Floating-Point Value
    248 Mnemonic_MOVSS,                         // Move Scalar Single-Precision Floating-Point Values
    249 Mnemonic_MOVSX,                         // Move with Sign-Extension
    250 Mnemonic_MOVZX,                         // Move with Zero-Extend
    251 //Mnemonic_MUL,                         // Unsigned Multiply
    252 Mnemonic_MULSD,                         // Multiply Scalar Double-Precision Floating-Point Values
    253 Mnemonic_MULSS,                         // Multiply Scalar Single-Precision Floating-Point Values
    254 Mnemonic_NEG,                           // Two's Complement Negation
    255 Mnemonic_NOP,                           // No Operation
    256 Mnemonic_NOT,                           // One's Complement Negation
    257 Mnemonic_OR,                            // Logical Inclusive OR
    258 Mnemonic_PREFETCH,                      // prefetch
    259 
    260 #if 1 //def _HAVE_MMX_
    261     Mnemonic_PADDQ,                     // Add Packed Quadword Integers
    262     Mnemonic_PAND,                      // Logical AND
    263     Mnemonic_POR,                       // Bitwise Logical OR
    264     Mnemonic_PSUBQ,                     // Subtract Packed Quadword Integers
    265 #endif
    266 Mnemonic_PANDN,
    267 Mnemonic_PSLLQ,
    268 Mnemonic_PSRLQ,
    269 Mnemonic_PXOR,                          // Logical Exclusive OR
    270 Mnemonic_POP,                           // Pop a Value from the Stack
    271 Mnemonic_POPFD,                         // Pop a Value of EFLAGS register from the Stack
    272 Mnemonic_PUSH,                          // Push Word or Doubleword Onto the Stack
    273 Mnemonic_PUSHFD,                        // Push EFLAGS Doubleword Onto the Stack
    274 Mnemonic_RET,                           // Return from Procedure
    275 
    276 Mnemonic_SETcc,                         // Set Byte on Condition
    277     CCM(SET,O),
    278     CCM(SET,NO),
    279     CCM(SET,B), CCM(SET,NAE), CCM(SET,C),
    280     CCM(SET,NB), CCM(SET,AE), CCM(SET,NC),
    281     CCM(SET,Z), CCM(SET,E),
    282     CCM(SET,NZ), CCM(SET,NE),
    283     CCM(SET,BE), CCM(SET,NA),
    284     CCM(SET,NBE), CCM(SET,A),
    285     CCM(SET,S),
    286     CCM(SET,NS),
    287     CCM(SET,P), CCM(SET,PE),
    288     CCM(SET,NP), CCM(SET,PO),
    289     CCM(SET,L), CCM(SET,NGE),
    290     CCM(SET,NL), CCM(SET,GE),
    291     CCM(SET,LE), CCM(SET,NG),
    292     CCM(SET,NLE), CCM(SET,G),
    293 
    294 Mnemonic_SAL, Mnemonic_SHL=Mnemonic_SAL,// Shift left
    295 Mnemonic_SAR,                           // Unsigned shift right
    296 Mnemonic_ROR,                           // Rotate right
    297 Mnemonic_RCR,                           // Rotate right through CARRY flag
    298 Mnemonic_ROL,                           // Rotate left
    299 Mnemonic_RCL,                           // Rotate left through CARRY flag
    300 Mnemonic_SHR,                           // Signed shift right
    301 Mnemonic_SHRD,                          // Double Precision Shift Right
    302 Mnemonic_SHLD,                          // Double Precision Shift Left
    303 
    304 Mnemonic_SBB,                           // Integer Subtraction with Borrow
    305 Mnemonic_SUB,                           // Subtract
    306 Mnemonic_SUBSD,                         // Subtract Scalar Double-Precision Floating-Point Values
    307 Mnemonic_SUBSS,                         // Subtract Scalar Single-Precision Floating-Point Values
    308 
    309 Mnemonic_TEST,                          // Logical Compare
    310 
    311 Mnemonic_UCOMISD,                       // Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS
    312 Mnemonic_UCOMISS,                       // Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS
    313 
    314 Mnemonic_XOR,                           // Logical Exclusive OR
    315 //
    316 // packed things,
    317 //
    318 Mnemonic_XORPD,                         // Bitwise Logical XOR for Double-Precision Floating-Point Values
    319 Mnemonic_XORPS,                         // Bitwise Logical XOR for Single-Precision Floating-Point Values
    320 
    321 Mnemonic_CVTDQ2PD,                      // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values
    322 Mnemonic_CVTTPD2DQ,                     // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers
    323 
    324 Mnemonic_CVTDQ2PS,                      // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values
    325 Mnemonic_CVTTPS2DQ,                     // Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers
    326 //
    327 // String operations
    328 //
    329 Mnemonic_STD,                           // Set direction flag
    330 Mnemonic_CLD,                           // Clear direction flag
    331 Mnemonic_SCAS,                          // Scan string
    332 Mnemonic_STOS,                          // Store string
    333 
    334 //
    335 Mnemonic_WAIT,                          // Check pending pending unmasked floating-point exception
    336 //
    337 Mnemonic_Count
    338 } Mnemonic;
    339 
    340 #undef CCM
    341 
    342 ENCODER_NAMESPACE_END
    343 
    344 #endif  // ifndef _ENCODER_DEFS_EXT_H_
    345