/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_COMPILER_COMPILER_CODEGEN_X86_X86LIR_H_
#define ART_COMPILER_COMPILER_CODEGEN_X86_X86LIR_H_

#include "../../Dalvik.h"
#include "../../CompilerInternals.h"

namespace art {

// Set to 1 to measure cost of suspend check
#define NO_SUSPEND 0

/*
 * Runtime register conventions. We consider both x86, x86-64 and x32 (32bit mode x86-64), although
 * we currently only target x86. The ABI has different conventions and we hope to have a single
 * convention to simplify code generation. Changing something that is callee save and making it
 * caller save places a burden on up-calls to save/restore the callee save register, however, there
 * are few registers that are callee save in the ABI. Changing something that is caller save and
 * making it callee save places a burden on down-calls to save/restore the callee save register.
 * For these reasons we aim to match native conventions for caller and callee save
 *
 * General Purpose Register:
 *  Native: x86         | x86-64 / x32      | ART
 *  r0/eax: caller save | caller save       | caller, Method*, scratch, return value
 *  r1/ecx: caller save | caller save, arg4 | caller, arg2, scratch
 *  r2/edx: caller save | caller save, arg3 | caller, arg1, scratch, high half of long return
 *  r3/ebx: callee save | callee save       | callee, available for dalvik register promotion
 *  r4/esp: stack pointer
 *  r5/ebp: callee save | callee save       | callee, available for dalvik register promotion
 *  r6/esi: callEE save | callER save, arg2 | callee, available for dalvik register promotion
 *  r7/edi: callEE save | callER save, arg1 | callee, available for dalvik register promotion
 *  ---  x86-64/x32 registers
 *  Native: x86-64 / x32      | ART
 *  r8:     caller save, arg5 | caller, scratch
 *  r9:     caller save, arg6 | caller, scratch
 *  r10:    caller save       | caller, scratch
 *  r11:    caller save       | caller, scratch
 *  r12:    callee save       | callee, available for dalvik register promotion
 *  r13:    callee save       | callee, available for dalvik register promotion
 *  r14:    callee save       | callee, available for dalvik register promotion
 *  r15:    callee save       | callee, available for dalvik register promotion
 *
 * There is no rSELF, instead on x86 fs: has a base address of Thread::Current, whereas on
 * x86-64/x32 gs: holds it.
 *
 * For floating point we don't support CPUs without SSE2 support (ie newer than PIII):
 *  Native: x86       | x86-64 / x32     | ART
 *  XMM0: caller save |caller save, arg1 | caller, float/double return value (except for native x86 code)
 *  XMM1: caller save |caller save, arg2 | caller, scratch
 *  XMM2: caller save |caller save, arg3 | caller, scratch
 *  XMM3: caller save |caller save, arg4 | caller, scratch
 *  XMM4: caller save |caller save, arg5 | caller, scratch
 *  XMM5: caller save |caller save, arg6 | caller, scratch
 *  XMM6: caller save |caller save, arg7 | caller, scratch
 *  XMM7: caller save |caller save, arg8 | caller, scratch
 *  ---  x86-64/x32 registers
 *  XMM8 .. 15: caller save
 *
 * X87 is a necessary evil outside of ART code:
 *  ST0:  x86 float/double native return value, caller save
 *  ST1 .. ST7: caller save
 *
 *  Stack frame diagram (stack grows down, higher addresses at top):
 *
 * +------------------------+
 * | IN[ins-1]              |  {Note: resides in caller's frame}
 * |       .                |
 * | IN[0]                  |
 * | caller's Method*       |
 * +========================+  {Note: start of callee's frame}
 * | return address         |  {pushed by call}
 * | spill region           |  {variable sized}
 * +------------------------+
 * | ...filler word...      |  {Note: used as 2nd word of V[locals-1] if long]
 * +------------------------+
 * | V[locals-1]            |
 * | V[locals-2]            |
 * |      .                 |
 * |      .                 |
 * | V[1]                   |
 * | V[0]                   |
 * +------------------------+
 * |  0 to 3 words padding  |
 * +------------------------+
 * | OUT[outs-1]            |
 * | OUT[outs-2]            |
 * |       .                |
 * | OUT[0]                 |
 * | curMethod*             | <<== sp w/ 16-byte alignment
 * +========================+
 */

/* Offset to distingish FP regs */
#define FP_REG_OFFSET 16
/* Offset to distinguish DP FP regs */
#define FP_DOUBLE 32
/* Offset to distingish the extra regs */
#define EXTRA_REG_OFFSET 64
/* Reg types */
#define REGTYPE(x) (x & (FP_REG_OFFSET | FP_DOUBLE))
#define FPREG(x) ((x & FP_REG_OFFSET) == FP_REG_OFFSET)
#define EXTRAREG(x) ((x & EXTRA_REG_OFFSET) == EXTRA_REG_OFFSET)
#define LOWREG(x) ((x & 0x1f) == x)
#define DOUBLEREG(x) ((x & FP_DOUBLE) == FP_DOUBLE)
#define SINGLEREG(x) (FPREG(x) && !DOUBLEREG(x))

/*
 * Note: the low register of a floating point pair is sufficient to
 * create the name of a double, but require both names to be passed to
 * allow for asserts to verify that the pair is consecutive if significant
 * rework is done in this area.  Also, it is a good reminder in the calling
 * code that reg locations always describe doubles as a pair of singles.
 */
#define S2D(x,y) ((x) | FP_DOUBLE)
/* Mask to strip off fp flags */
#define FP_REG_MASK (FP_REG_OFFSET-1)
/* non-existent Dalvik register */
#define vNone   (-1)
/* non-existant physical register */
#define rNone   (-1)

/* RegisterLocation templates return values (rAX, or rAX/rDX) */
#define LOC_C_RETURN      {kLocPhysReg, 0, 0, 0, 0, 0, 1, rAX, INVALID_REG, INVALID_SREG}
#define LOC_C_RETURN_WIDE {kLocPhysReg, 1, 0, 0, 0, 0, 1, rAX, rDX,         INVALID_SREG}

enum ResourceEncodingPos {
    kGPReg0     = 0,
    kRegSP      = 4,
    kRegLR      = -1,
    kFPReg0     = 16,  // xmm0 .. xmm7/xmm15
    kFPRegEnd   = 32,
    kRegEnd     = kFPRegEnd,
    kCCode      = kRegEnd,
    // The following four bits are for memory disambiguation
    kDalvikReg,         // 1 Dalvik Frame (can be fully disambiguated)
    kLiteral,           // 2 Literal pool (can be fully disambiguated)
    kHeapRef,           // 3 Somewhere on the heap (alias with any other heap)
    kMustNotAlias,      // 4 Guaranteed to be non-alias (eg *(r6+x))
};

#define ENCODE_REG_LIST(N)      ((u8) N)
#define ENCODE_REG_SP           (1ULL << kRegSP)
#define ENCODE_CCODE            (1ULL << kCCode)
#define ENCODE_FP_STATUS        (1ULL << kFPStatus)

/* Abstract memory locations */
#define ENCODE_DALVIK_REG       (1ULL << kDalvikReg)
#define ENCODE_LITERAL          (1ULL << kLiteral)
#define ENCODE_HEAP_REF         (1ULL << kHeapRef)
#define ENCODE_MUST_NOT_ALIAS   (1ULL << kMustNotAlias)

#define ENCODE_ALL              (~0ULL)
#define ENCODE_MEM              (ENCODE_DALVIK_REG | ENCODE_LITERAL | \
                                 ENCODE_HEAP_REF | ENCODE_MUST_NOT_ALIAS)

#define DECODE_ALIAS_INFO_REG(X)        (X & 0xffff)
#define DECODE_ALIAS_INFO_WIDE(X)       ((X & 0x80000000) ? 1 : 0)

/*
 * Annotate special-purpose core registers:
 */

enum NativeRegisterPool {
  r0     = 0,
  rAX    = r0,
  r1     = 1,
  rCX    = r1,
  r2     = 2,
  rDX    = r2,
  r3     = 3,
  rBX    = r3,
  r4sp   = 4,
  rSP    = r4sp,
  r4sib_no_index = r4sp,
  r5     = 5,
  rBP    = r5,
  r6     = 6,
  rSI    = r6,
  r7     = 7,
  rDI    = r7,
  r8     = 8,
  r9     = 9,
  r10    = 10,
  r11    = 11,
  r12    = 12,
  r13    = 13,
  r14    = 14,
  r15    = 15,
  fr0  =  0 + FP_REG_OFFSET,
  fr1  =  1 + FP_REG_OFFSET,
  fr2  =  2 + FP_REG_OFFSET,
  fr3  =  3 + FP_REG_OFFSET,
  fr4  =  4 + FP_REG_OFFSET,
  fr5  =  5 + FP_REG_OFFSET,
  fr6  =  6 + FP_REG_OFFSET,
  fr7  =  7 + FP_REG_OFFSET,
  fr8  =  8 + FP_REG_OFFSET,
  fr9  =  9 + FP_REG_OFFSET,
  fr10 = 10 + FP_REG_OFFSET,
  fr11 = 11 + FP_REG_OFFSET,
  fr12 = 12 + FP_REG_OFFSET,
  fr13 = 13 + FP_REG_OFFSET,
  fr14 = 14 + FP_REG_OFFSET,
  fr15 = 15 + FP_REG_OFFSET,
};

/*
 * Target-independent aliases
 */

#define rARG0 rAX
#define rARG1 rDX
#define rARG2 rCX
#define rRET0 rAX
#define rRET1 rDX

#define isPseudoOpcode(opCode) ((int)(opCode) < 0)

/* X86 condition encodings */
enum X86ConditionCode {
    kX86CondO   = 0x0,        // overflow
    kX86CondNo  = 0x1,        // not overflow

    kX86CondB   = 0x2,        // below
    kX86CondNae = kX86CondB,  // not-above-equal
    kX86CondC   = kX86CondB,  // carry

    kX86CondNb  = 0x3,        // not-below
    kX86CondAe  = kX86CondNb, // above-equal
    kX86CondNc  = kX86CondNb, // not-carry

    kX86CondZ   = 0x4,        // zero
    kX86CondEq  = kX86CondZ,  // equal

    kX86CondNz  = 0x5,        // not-zero
    kX86CondNe  = kX86CondNz, // not-equal

    kX86CondBe  = 0x6,        // below-equal
    kX86CondNa  = kX86CondBe, // not-above

    kX86CondNbe = 0x7,        // not-below-equal
    kX86CondA   = kX86CondNbe,// above

    kX86CondS   = 0x8,        // sign
    kX86CondNs  = 0x9,        // not-sign

    kX86CondP   = 0xA,        // 8-bit parity even
    kX86CondPE  = kX86CondP,

    kX86CondNp  = 0xB,        // 8-bit parity odd
    kX86CondPo  = kX86CondNp,

    kX86CondL   = 0xC,        // less-than
    kX86CondNge = kX86CondL,  // not-greater-equal

    kX86CondNl  = 0xD,        // not-less-than
    kX86CondGe  = kX86CondL,  // not-greater-equal

    kX86CondLe  = 0xE,        // less-than-equal
    kX86CondNg  = kX86CondLe, // not-greater

    kX86CondNle = 0xF,        // not-less-than
    kX86CondG   = kX86CondNle,// greater
};

/*
 * The following enum defines the list of supported X86 instructions by the
 * assembler. Their corresponding EncodingMap positions will be defined in
 * Assemble.cc.
 */
enum X86OpCode {
    kPseudoSuspendTarget = -15,
    kPseudoThrowTarget = -14,
    kPseudoCaseLabel = -13,
    kPseudoMethodEntry = -12,
    kPseudoMethodExit = -11,
    kPseudoBarrier = -10,
    kPseudoExtended = -9,
    kPseudoSSARep = -8,
    kPseudoEntryBlock = -7,
    kPseudoExitBlock = -6,
    kPseudoTargetLabel = -5,
    kPseudoDalvikByteCodeBoundary = -4,
    kPseudoPseudoAlign4 = -3,
    kPseudoEHBlockLabel = -2,
    kPseudoNormalBlockLabel = -1,
    kX86First,
    kX8632BitData = kX86First, /* data [31..0] */
    kX86Bkpt,
    kX86Nop,
    // Define groups of binary operations
    // MR - Memory Register    - opcode [base + disp], reg
    //                         - lir operands - 0: base, 1: disp, 2: reg
    // AR - Array Register     - opcode [base + index * scale + disp], reg
    //                         - lir operands - 0: base, 1: index, 2: scale, 3: disp, 4: reg
    // TR - Thread Register    - opcode fs:[disp], reg - where fs: is equal to Thread::Current()
    //                         - lir operands - 0: disp, 1: reg
    // RR - Register Register  - opcode reg1, reg2
    //                         - lir operands - 0: reg1, 1: reg2
    // RM - Register Memory    - opcode reg, [base + disp]
    //                         - lir operands - 0: reg, 1: base, 2: disp
    // RA - Register Array     - opcode reg, [base + index * scale + disp]
    //                         - lir operands - 0: reg, 1: base, 2: index, 3: scale, 4: disp
    // RT - Register Thread    - opcode reg, fs:[disp] - where fs: is equal to Thread::Current()
    //                         - lir operands - 0: reg, 1: disp
    // RI - Register Immediate - opcode reg, #immediate
    //                         - lir operands - 0: reg, 1: immediate
    // MI - Memory Immediate   - opcode [base + disp], #immediate
    //                         - lir operands - 0: base, 1: disp, 2: immediate
    // AI - Array Immediate    - opcode [base + index * scale + disp], #immediate
    //                         - lir operands - 0: base, 1: index, 2: scale, 3: disp 4: immediate
    // TI - Thread Register    - opcode fs:[disp], imm - where fs: is equal to Thread::Current()
    //                         - lir operands - 0: disp, 1: imm
#define BinaryOpCode(opcode) \
  opcode ## 8MR, opcode ## 8AR, opcode ## 8TR, \
  opcode ## 8RR, opcode ## 8RM, opcode ## 8RA, opcode ## 8RT, \
  opcode ## 8RI, opcode ## 8MI, opcode ## 8AI, opcode ## 8TI, \
  opcode ## 16MR, opcode ## 16AR, opcode ## 16TR, \
  opcode ## 16RR, opcode ## 16RM, opcode ## 16RA, opcode ## 16RT, \
  opcode ## 16RI, opcode ## 16MI, opcode ## 16AI, opcode ## 16TI, \
  opcode ## 16RI8, opcode ## 16MI8, opcode ## 16AI8, opcode ## 16TI8, \
  opcode ## 32MR, opcode ## 32AR, opcode ## 32TR,  \
  opcode ## 32RR, opcode ## 32RM, opcode ## 32RA, opcode ## 32RT, \
  opcode ## 32RI, opcode ## 32MI, opcode ## 32AI, opcode ## 32TI, \
  opcode ## 32RI8, opcode ## 32MI8, opcode ## 32AI8, opcode ## 32TI8
    BinaryOpCode(kX86Add),
    BinaryOpCode(kX86Or),
    BinaryOpCode(kX86Adc),
    BinaryOpCode(kX86Sbb),
    BinaryOpCode(kX86And),
    BinaryOpCode(kX86Sub),
    BinaryOpCode(kX86Xor),
    BinaryOpCode(kX86Cmp),
#undef BinaryOpCode
    kX86Imul16RRI, kX86Imul16RMI, kX86Imul16RAI,
    kX86Imul32RRI, kX86Imul32RMI, kX86Imul32RAI,
    kX86Imul32RRI8, kX86Imul32RMI8, kX86Imul32RAI8,
    kX86Mov8MR, kX86Mov8AR, kX86Mov8TR,
    kX86Mov8RR, kX86Mov8RM, kX86Mov8RA, kX86Mov8RT,
    kX86Mov8RI, kX86Mov8MI, kX86Mov8AI, kX86Mov8TI,
    kX86Mov16MR, kX86Mov16AR, kX86Mov16TR,
    kX86Mov16RR, kX86Mov16RM, kX86Mov16RA, kX86Mov16RT,
    kX86Mov16RI, kX86Mov16MI, kX86Mov16AI, kX86Mov16TI,
    kX86Mov32MR, kX86Mov32AR, kX86Mov32TR,
    kX86Mov32RR, kX86Mov32RM, kX86Mov32RA, kX86Mov32RT,
    kX86Mov32RI, kX86Mov32MI, kX86Mov32AI, kX86Mov32TI,
    kX86Lea32RA,
    // RC - Register CL - opcode reg, CL
    //                  - lir operands - 0: reg, 1: CL
    // MC - Memory CL   - opcode [base + disp], CL
    //                  - lir operands - 0: base, 1: disp, 2: CL
    // AC - Array CL    - opcode [base + index * scale + disp], CL
    //                  - lir operands - 0: base, 1: index, 2: scale, 3: disp, 4: CL
#define BinaryShiftOpCode(opcode) \
    opcode ## 8RI, opcode ## 8MI, opcode ## 8AI, \
    opcode ## 8RC, opcode ## 8MC, opcode ## 8AC, \
    opcode ## 16RI, opcode ## 16MI, opcode ## 16AI, \
    opcode ## 16RC, opcode ## 16MC, opcode ## 16AC, \
    opcode ## 32RI, opcode ## 32MI, opcode ## 32AI, \
    opcode ## 32RC, opcode ## 32MC, opcode ## 32AC
    BinaryShiftOpCode(kX86Rol),
    BinaryShiftOpCode(kX86Ror),
    BinaryShiftOpCode(kX86Rcl),
    BinaryShiftOpCode(kX86Rcr),
    BinaryShiftOpCode(kX86Sal),
    BinaryShiftOpCode(kX86Shl),
    BinaryShiftOpCode(kX86Shr),
    BinaryShiftOpCode(kX86Sar),
#undef BinaryShiftOpcode
#define UnaryOpcode(opcode, reg, mem, array) \
    opcode ## 8 ## reg, opcode ## 8 ## mem, opcode ## 8 ## array, \
    opcode ## 16 ## reg, opcode ## 16 ## mem, opcode ## 16 ## array, \
    opcode ## 32 ## reg, opcode ## 32 ## mem, opcode ## 32 ## array
    UnaryOpcode(kX86Test, RI, MI, AI),
    UnaryOpcode(kX86Not, R, M, A),
    UnaryOpcode(kX86Neg, R, M, A),
    UnaryOpcode(kX86Mul,  DaR, DaM, DaA),
    UnaryOpcode(kX86Imul, DaR, DaM, DaA),
    UnaryOpcode(kX86Divmod,  DaR, DaM, DaA),
    UnaryOpcode(kX86Idivmod, DaR, DaM, DaA),
#undef UnaryOpcode
#define Binary0fOpCode(opcode) \
  opcode ## RR, opcode ## RM, opcode ## RA
    Binary0fOpCode(kX86Movsd),
    kX86MovsdMR,
    kX86MovsdAR,
    Binary0fOpCode(kX86Movss),
    kX86MovssMR,
    kX86MovssAR,
    Binary0fOpCode(kX86Cvtsi2sd),   // int to double
    Binary0fOpCode(kX86Cvtsi2ss),   // int to float
    Binary0fOpCode(kX86Cvttsd2si),  // truncating double to int
    Binary0fOpCode(kX86Cvttss2si),  // truncating float to int
    Binary0fOpCode(kX86Cvtsd2si),   // rounding double to int
    Binary0fOpCode(kX86Cvtss2si),   // rounding float to int
    Binary0fOpCode(kX86Ucomisd),    // unordered double compare
    Binary0fOpCode(kX86Ucomiss),    // unordered float compare
    Binary0fOpCode(kX86Comisd),     // double compare
    Binary0fOpCode(kX86Comiss),     // float compare
    Binary0fOpCode(kX86Addsd),      // double add
    Binary0fOpCode(kX86Addss),      // float add
    Binary0fOpCode(kX86Mulsd),      // double multiply
    Binary0fOpCode(kX86Mulss),      // float multiply
    Binary0fOpCode(kX86Cvtss2sd),   // float to double
    Binary0fOpCode(kX86Cvtsd2ss),   // double to float
    Binary0fOpCode(kX86Subsd),      // double subtract
    Binary0fOpCode(kX86Subss),      // float subtract
    Binary0fOpCode(kX86Divsd),      // double subtract
    Binary0fOpCode(kX86Divss),      // float subtract
    Binary0fOpCode(kX86Movdxr),     // move into xmm from gpr
    Binary0fOpCode(kX86Movdrx),     // move into reg from xmm
    kX86Set8R, kX86Set8M, kX86Set8A,// set byte depending on condition operand
    Binary0fOpCode(kX86Imul16),     // 16bit multiply
    Binary0fOpCode(kX86Imul32),     // 32bit multiply
    Binary0fOpCode(kX86Movzx8),     // zero-extend 8-bit value
    Binary0fOpCode(kX86Movzx16),    // zero-extend 16-bit value
    Binary0fOpCode(kX86Movsx8),     // sign-extend 8-bit value
    Binary0fOpCode(kX86Movsx16),    // sign-extend 16-bit value
#undef Binary0fOpCode
    kX86Jcc,    // jCC rel; lir operands - 0: rel, 1: CC, target assigned
    kX86Jmp,    // jmp rel; lir operands - 0: rel, target assigned
    kX86CallR,  // call reg; lir operands - 0: reg
    kX86CallM,  // call [base + disp]; lir operands - 0: base, 1: disp
    kX86CallA,  // call [base + index * scale + disp]
                // lir operands - 0: base, 1: index, 2: scale, 3: disp
    kX86Ret,    // ret; no lir operands
    kX86Last
};

/* Instruction assembly fieldLoc kind */
enum X86EncodingKind {
  kData,                                   // Special case for raw data.
  kNop,                                    // Special case for variable length nop.
  kNullary,                                // Opcode that takes no arguments.
  kReg, kMem, kArray,                      // R, M and A instruction kinds.
  kMemReg, kArrayReg, kThreadReg,          // MR, AR and TR instruction kinds.
  kRegReg, kRegMem, kRegArray, kRegThread, // RR, RM, RA and RT instruction kinds.
  kRegImm, kMemImm, kArrayImm, kThreadImm, // RI, MI, AI and TI instruction kinds.
  kRegRegImm, kRegMemImm, kRegArrayImm,    // RRI, RMI and RAI instruction kinds.
  kMovRegImm,                              // Shorter form move RI.
  kShiftRegImm, kShiftMemImm, kShiftArrayImm,  // Shift opcode with immediate.
  kShiftRegCl, kShiftMemCl, kShiftArrayCl,     // Shift opcode with register CL.
  kRegRegReg, kRegRegMem, kRegRegArray,    // RRR, RRM, RRA instruction kinds.
  kRegCond, kMemCond, kArrayCond,          // R, M, A instruction kinds following by a condition.
  kJmp, kJcc, kCall,           // Branch instruction kinds.
  kUnimplemented               // Encoding used when an instruction isn't yet implemented.
};

/* Struct used to define the EncodingMap positions for each X86 opcode */
struct X86EncodingMap {
  X86OpCode opcode;      // e.g. kOpAddRI
  X86EncodingKind kind;  // Used to discriminate in the union below
  int flags;
  struct {
    uint8_t prefix1;     // non-zero => a prefix byte
    uint8_t prefix2;     // non-zero => a second prefix byte
    uint8_t opcode;      // 1 byte opcode
    uint8_t extra_opcode1;  // possible extra opcode byte
    uint8_t extra_opcode2;  // possible second extra opcode byte
    // 3bit opcode that gets encoded in the register bits of the modrm byte, use determined by the
    // encoding kind
    uint8_t modrm_opcode;
    uint8_t ax_opcode;  // non-zero => shorter encoding for AX as a destination
    uint8_t immediate_bytes; // number of bytes of immediate
  } skeleton;
  const char *name;
  const char* fmt;
};

extern X86EncodingMap EncodingMap[kX86Last];

// FIXME: mem barrier type - what do we do for x86?
#define kSY 0
#define kST 0

/* Bit flags describing the behavior of each native opcode */
enum X86OpFeatureFlags {
    kIsBranch = 0,
    kRegDef0,
    kRegDef1,
    kRegDefSP,
    kRegDefList0,
    kRegDefList1,
    kRegUse0,
    kRegUse1,
    kRegUse2,
    kRegUse3,
    kRegUseSP,
    kRegUseList0,
    kRegUseList1,
    kNoOperand,
    kIsUnaryOp,
    kIsBinaryOp,
    kIsTertiaryOp,
    kIsQuadOp,
    kIsQuinOp,
    kIsSextupleOp,
    kIsIT,
    kSetsCCodes,
    kUsesCCodes,
    kMemLoad,
    kMemStore,
    kPCRelFixup,
// FIXME: add NEEDS_FIXUP to instruction attributes
};

#define IS_LOAD         (1 << kMemLoad)
#define IS_STORE        (1 << kMemStore)
#define IS_BRANCH       (1 << kIsBranch)
#define REG_DEF0        (1 << kRegDef0)
#define REG_DEF1        (1 << kRegDef1)
#define REG_DEF_SP      (1 << kRegDefSP)
#define REG_DEF_LR      (1 << kRegDefLR)
#define REG_DEF_LIST0   (1 << kRegDefList0)
#define REG_DEF_LIST1   (1 << kRegDefList1)
#define REG_USE0        (1 << kRegUse0)
#define REG_USE1        (1 << kRegUse1)
#define REG_USE2        (1 << kRegUse2)
#define REG_USE3        (1 << kRegUse3)
#define REG_USE_SP      (1 << kRegUseSP)
#define REG_USE_PC      (1 << kRegUsePC)
#define REG_USE_LIST0   (1 << kRegUseList0)
#define REG_USE_LIST1   (1 << kRegUseList1)
#define NO_OPERAND      (1 << kNoOperand)
#define IS_UNARY_OP     (1 << kIsUnaryOp)
#define IS_BINARY_OP    (1 << kIsBinaryOp)
#define IS_TERTIARY_OP  (1 << kIsTertiaryOp)
#define IS_QUAD_OP      (1 << kIsQuadOp)
#define IS_QUIN_OP      (1 << kIsQuinOp)
#define IS_SEXTUPLE_OP  (1 << kIsSextupleOp)
#define IS_IT           (1 << kIsIT)
#define SETS_CCODES     (1 << kSetsCCodes)
#define USES_CCODES     (1 << kUsesCCodes)
#define NEEDS_FIXUP     (1 << kPCRelFixup)

/*  attributes, included for compatibility */
#define REG_DEF_FPCS_LIST0   (0)
#define REG_DEF_FPCS_LIST2   (0)


/* Common combo register usage patterns */
#define REG_USE01       (REG_USE0 | REG_USE1)
#define REG_USE02       (REG_USE0 | REG_USE2)
#define REG_USE012      (REG_USE01 | REG_USE2)
#define REG_USE12       (REG_USE1 | REG_USE2)
#define REG_USE23       (REG_USE2 | REG_USE3)
#define REG_DEF01       (REG_DEF0 | REG_DEF1)
#define REG_DEF0_USE0   (REG_DEF0 | REG_USE0)
#define REG_DEF0_USE1   (REG_DEF0 | REG_USE1)
#define REG_DEF0_USE2   (REG_DEF0 | REG_USE2)
#define REG_DEF0_USE01  (REG_DEF0 | REG_USE01)
#define REG_DEF0_USE12  (REG_DEF0 | REG_USE12)
#define REG_DEF01_USE2  (REG_DEF0 | REG_DEF1 | REG_USE2)

/* Keys for target-specific scheduling and other optimization hints */
enum X86TargetOptHints {
    kMaxHoistDistance,
};

/* Offsets of high and low halves of a 64bit value */
#define LOWORD_OFFSET 0
#define HIWORD_OFFSET 4

/* Segment override instruction prefix used for quick TLS access to Thread::Current() */
#define THREAD_PREFIX 0x64

#define IS_SIMM8(v) ((-128 <= (v)) && ((v) <= 127))
#define IS_SIMM16(v) ((-32768 <= (v)) && ((v) <= 32767))

}  // namespace art

#endif  // ART_COMPILER_COMPILER_CODEGEN_X86_X86LIR_H_
