102031b185b4653e6c72e21f7a51238b903f6d638buzbee/*
202031b185b4653e6c72e21f7a51238b903f6d638buzbee * Copyright (C) 2011 The Android Open Source Project
302031b185b4653e6c72e21f7a51238b903f6d638buzbee *
402031b185b4653e6c72e21f7a51238b903f6d638buzbee * Licensed under the Apache License, Version 2.0 (the "License");
502031b185b4653e6c72e21f7a51238b903f6d638buzbee * you may not use this file except in compliance with the License.
602031b185b4653e6c72e21f7a51238b903f6d638buzbee * You may obtain a copy of the License at
702031b185b4653e6c72e21f7a51238b903f6d638buzbee *
802031b185b4653e6c72e21f7a51238b903f6d638buzbee *      http://www.apache.org/licenses/LICENSE-2.0
902031b185b4653e6c72e21f7a51238b903f6d638buzbee *
1002031b185b4653e6c72e21f7a51238b903f6d638buzbee * Unless required by applicable law or agreed to in writing, software
1102031b185b4653e6c72e21f7a51238b903f6d638buzbee * distributed under the License is distributed on an "AS IS" BASIS,
1202031b185b4653e6c72e21f7a51238b903f6d638buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1302031b185b4653e6c72e21f7a51238b903f6d638buzbee * See the License for the specific language governing permissions and
1402031b185b4653e6c72e21f7a51238b903f6d638buzbee * limitations under the License.
1502031b185b4653e6c72e21f7a51238b903f6d638buzbee */
1602031b185b4653e6c72e21f7a51238b903f6d638buzbee
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_DEX_QUICK_X86_CODEGEN_X86_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_DEX_QUICK_X86_CODEGEN_X86_H_
1902031b185b4653e6c72e21f7a51238b903f6d638buzbee
207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/compiler_internals.h"
2107ec8e17c978e3bda0202693e6432b56349a5867Ian Rogers#include "x86_lir.h"
2202031b185b4653e6c72e21f7a51238b903f6d638buzbee
2302031b185b4653e6c72e21f7a51238b903f6d638buzbeenamespace art {
2402031b185b4653e6c72e21f7a51238b903f6d638buzbee
251fd3346740dfb7f47be9922312b68a4227fada96buzbeeclass X86Mir2Lir : public Mir2Lir {
2602031b185b4653e6c72e21f7a51238b903f6d638buzbee  public:
27862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee    X86Mir2Lir(CompilationUnit* cu, MIRGraph* mir_graph, ArenaAllocator* arena);
281fd3346740dfb7f47be9922312b68a4227fada96buzbee
2902031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Required for target - codegen helpers.
3011b63d13f0a3be0f74390b66b58614a37f9aa6c1buzbee    bool SmallLiteralDivRem(Instruction::Code dalvik_opcode, bool is_div, RegLocation rl_src,
311fd3346740dfb7f47be9922312b68a4227fada96buzbee                                    RegLocation rl_dest, int lit);
32468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    int LoadHelper(ThreadOffset offset);
338d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadBaseDisp(int rBase, int displacement, int r_dest, OpSize size, int s_reg);
348d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadBaseDispWide(int rBase, int displacement, int r_dest_lo, int r_dest_hi,
351fd3346740dfb7f47be9922312b68a4227fada96buzbee                                  int s_reg);
368d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadBaseIndexed(int rBase, int r_index, int r_dest, int scale, OpSize size);
378d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadBaseIndexedDisp(int rBase, int r_index, int scale, int displacement,
381fd3346740dfb7f47be9922312b68a4227fada96buzbee                                     int r_dest, int r_dest_hi, OpSize size, int s_reg);
398d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadConstantNoClobber(int r_dest, int value);
408d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* LoadConstantWide(int r_dest_lo, int r_dest_hi, int64_t value);
418d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* StoreBaseDisp(int rBase, int displacement, int r_src, OpSize size);
428d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* StoreBaseDispWide(int rBase, int displacement, int r_src_lo, int r_src_hi);
438d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* StoreBaseIndexed(int rBase, int r_index, int r_src, int scale, OpSize size);
448d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* StoreBaseIndexedDisp(int rBase, int r_index, int scale, int displacement,
451fd3346740dfb7f47be9922312b68a4227fada96buzbee                                      int r_src, int r_src_hi, OpSize size, int s_reg);
468d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void MarkGCCard(int val_reg, int tgt_addr_reg);
4702031b185b4653e6c72e21f7a51238b903f6d638buzbee
4802031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Required for target - register utilities.
498d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool IsFpReg(int reg);
508d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool SameRegType(int reg1, int reg2);
518d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    int AllocTypedTemp(bool fp_hint, int reg_class);
528d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    int AllocTypedTempPair(bool fp_hint, int reg_class);
538d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    int S2d(int low_reg, int high_reg);
548d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    int TargetReg(SpecialTargetRegister reg);
558d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegisterInfo* GetRegInfo(int reg);
568d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation GetReturnAlt();
578d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation GetReturnWideAlt();
588d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation LocCReturn();
598d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation LocCReturnDouble();
608d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation LocCReturnFloat();
618d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation LocCReturnWide();
628d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    uint32_t FpRegMask();
638d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    uint64_t GetRegMaskCommon(int reg);
648d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void AdjustSpillMask();
658d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void ClobberCalleeSave();
668d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void FlushReg(int reg);
678d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void FlushRegWide(int reg1, int reg2);
688d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void FreeCallTemps();
698d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void FreeRegLocTemps(RegLocation rl_keep, RegLocation rl_free);
708d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void LockCallTemps();
718d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void MarkPreservedSingle(int v_reg, int reg);
728d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void CompilerInitializeRegAlloc();
7302031b185b4653e6c72e21f7a51238b903f6d638buzbee
7402031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Required for target - miscellaneous.
758d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    AssemblerStatus AssembleInstructions(uintptr_t start_addr);
768d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void DumpResourceMask(LIR* lir, uint64_t mask, const char* prefix);
778d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void SetupTargetResourceMasks(LIR* lir);
788d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    const char* GetTargetInstFmt(int opcode);
798d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    const char* GetTargetInstName(int opcode);
808d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    std::string BuildInsnString(const char* fmt, LIR* lir, unsigned char* base_addr);
818d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    uint64_t GetPCUseDefEncoding();
828d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    uint64_t GetTargetInstFlags(int opcode);
838d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    int GetInsnSize(LIR* lir);
848d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool IsUnconditionalBranch(LIR* lir);
8502031b185b4653e6c72e21f7a51238b903f6d638buzbee
8602031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Required for target - Dalvik-level generators.
878d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArithImmOpLong(Instruction::Code opcode, RegLocation rl_dest,
884ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                                   RegLocation rl_src1, RegLocation rl_src2);
898d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArrayObjPut(int opt_flags, RegLocation rl_array,
90e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee                                RegLocation rl_index, RegLocation rl_src, int scale);
918d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArrayGet(int opt_flags, OpSize size, RegLocation rl_array,
92e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee                             RegLocation rl_index, RegLocation rl_dest, int scale);
938d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array,
94e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee                             RegLocation rl_index, RegLocation rl_src, int scale);
958d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenShiftImmOpLong(Instruction::Code opcode, RegLocation rl_dest,
961fd3346740dfb7f47be9922312b68a4227fada96buzbee                                   RegLocation rl_src1, RegLocation rl_shift);
978d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMulLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
988d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenAddLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
998d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenAndLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
1008d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArithOpDouble(Instruction::Code opcode, RegLocation rl_dest,
1011fd3346740dfb7f47be9922312b68a4227fada96buzbee                                  RegLocation rl_src1, RegLocation rl_src2);
1028d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenArithOpFloat(Instruction::Code opcode, RegLocation rl_dest,
10302031b185b4653e6c72e21f7a51238b903f6d638buzbee                                 RegLocation rl_src1, RegLocation rl_src2);
1048d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenCmpFP(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1,
1051fd3346740dfb7f47be9922312b68a4227fada96buzbee                          RegLocation rl_src2);
1068d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenConversion(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src);
1078d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool GenInlinedCas32(CallInfo* info, bool need_write_barrier);
1088d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool GenInlinedMinMaxInt(CallInfo* info, bool is_min);
1098d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    bool GenInlinedSqrt(CallInfo* info);
1108d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenNegLong(RegLocation rl_dest, RegLocation rl_src);
1118d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenOrLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
1128d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenSubLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
1138d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenXorLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
1148d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* GenRegMemCheck(ConditionCode c_code, int reg1, int base, int offset,
1151fd3346740dfb7f47be9922312b68a4227fada96buzbee                                ThrowKind kind);
1168d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation GenDivRem(RegLocation rl_dest, int reg_lo, int reg_hi, bool is_div);
1178d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    RegLocation GenDivRemLit(RegLocation rl_dest, int reg_lo, int lit, bool is_div);
1188d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenCmpLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2);
1198d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenDivZeroCheck(int reg_lo, int reg_hi);
1208d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenEntrySequence(RegLocation* ArgLocs, RegLocation rl_method);
1218d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenExitSequence();
1228d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenFillArrayData(uint32_t table_offset, RegLocation rl_src);
1238d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenFusedFPCmpBranch(BasicBlock* bb, MIR* mir, bool gt_bias, bool is_double);
1248d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenFusedLongCmpBranch(BasicBlock* bb, MIR* mir);
1258d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenSelect(BasicBlock* bb, MIR* mir);
1268d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMemBarrier(MemBarrierKind barrier_kind);
1278d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMonitorEnter(int opt_flags, RegLocation rl_src);
1288d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMonitorExit(int opt_flags, RegLocation rl_src);
1298d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMoveException(RegLocation rl_dest);
1308d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenMultiplyByTwoBitMultiplier(RegLocation rl_src, RegLocation rl_result,
1311fd3346740dfb7f47be9922312b68a4227fada96buzbee                                               int lit, int first_bit, int second_bit);
1328d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenNegDouble(RegLocation rl_dest, RegLocation rl_src);
1338d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenNegFloat(RegLocation rl_dest, RegLocation rl_src);
1348d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenPackedSwitch(MIR* mir, uint32_t table_offset, RegLocation rl_src);
1358d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenSparseSwitch(MIR* mir, uint32_t table_offset, RegLocation rl_src);
1368d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void GenSpecialCase(BasicBlock* bb, MIR* mir, SpecialCaseHandler special_case);
13702031b185b4653e6c72e21f7a51238b903f6d638buzbee
13802031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Single operation generators.
1398d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpUnconditionalBranch(LIR* target);
1408d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpCmpBranch(ConditionCode cond, int src1, int src2, LIR* target);
1418d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpCmpImmBranch(ConditionCode cond, int reg, int check_value, LIR* target);
1428d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpCondBranch(ConditionCode cc, LIR* target);
1438d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpDecAndBranch(ConditionCode c_code, int reg, LIR* target);
1448d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpFpRegCopy(int r_dest, int r_src);
1458d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpIT(ConditionCode cond, const char* guide);
1468d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpMem(OpKind op, int rBase, int disp);
1478d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpPcRelLoad(int reg, LIR* target);
1488d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpReg(OpKind op, int r_dest_src);
1498d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegCopy(int r_dest, int r_src);
1508d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegCopyNoInsert(int r_dest, int r_src);
1518d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegImm(OpKind op, int r_dest_src1, int value);
1528d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegMem(OpKind op, int r_dest, int rBase, int offset);
1538d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegReg(OpKind op, int r_dest_src1, int r_src2);
1548d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegRegImm(OpKind op, int r_dest, int r_src1, int value);
1558d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpRegRegReg(OpKind op, int r_dest, int r_src1, int r_src2);
1568d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpTestSuspend(LIR* target);
157468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    LIR* OpThreadMem(OpKind op, ThreadOffset thread_offset);
1588d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpVldm(int rBase, int count);
1598d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    LIR* OpVstm(int rBase, int count);
1608d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void OpLea(int rBase, int reg1, int reg2, int scale, int offset);
1618d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers    void OpRegCopyWide(int dest_lo, int dest_hi, int src_lo, int src_hi);
162468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    void OpTlsCmp(ThreadOffset offset, int val);
16302031b185b4653e6c72e21f7a51238b903f6d638buzbee
164468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    void OpRegThreadMem(OpKind op, int r_dest, ThreadOffset thread_offset);
1651fd3346740dfb7f47be9922312b68a4227fada96buzbee    void SpillCoreRegs();
1661fd3346740dfb7f47be9922312b68a4227fada96buzbee    void UnSpillCoreRegs();
16702031b185b4653e6c72e21f7a51238b903f6d638buzbee    static const X86EncodingMap EncodingMap[kX86Last];
1684ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    bool InexpensiveConstantInt(int32_t value);
1694ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    bool InexpensiveConstantFloat(int32_t value);
1704ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    bool InexpensiveConstantLong(int64_t value);
1714ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    bool InexpensiveConstantDouble(int64_t value);
1721fd3346740dfb7f47be9922312b68a4227fada96buzbee
1731fd3346740dfb7f47be9922312b68a4227fada96buzbee  private:
1741fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitDisp(int base, int disp);
1751fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitOpReg(const X86EncodingMap* entry, uint8_t reg);
1761fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitOpMem(const X86EncodingMap* entry, uint8_t base, int disp);
1771fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitMemReg(const X86EncodingMap* entry, uint8_t base, int disp, uint8_t reg);
1781fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegMem(const X86EncodingMap* entry, uint8_t reg, uint8_t base, int disp);
1791fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegArray(const X86EncodingMap* entry, uint8_t reg, uint8_t base, uint8_t index,
1801fd3346740dfb7f47be9922312b68a4227fada96buzbee                      int scale, int disp);
1811fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitArrayReg(const X86EncodingMap* entry, uint8_t base, uint8_t index, int scale, int disp,
1821fd3346740dfb7f47be9922312b68a4227fada96buzbee                      uint8_t reg);
1831fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegThread(const X86EncodingMap* entry, uint8_t reg, int disp);
1841fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegReg(const X86EncodingMap* entry, uint8_t reg1, uint8_t reg2);
1851fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegRegImm(const X86EncodingMap* entry, uint8_t reg1, uint8_t reg2, int32_t imm);
1861fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegImm(const X86EncodingMap* entry, uint8_t reg, int imm);
1871fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitThreadImm(const X86EncodingMap* entry, int disp, int imm);
1881fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitMovRegImm(const X86EncodingMap* entry, uint8_t reg, int imm);
1891fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitShiftRegImm(const X86EncodingMap* entry, uint8_t reg, int imm);
1901fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitShiftRegCl(const X86EncodingMap* entry, uint8_t reg, uint8_t cl);
1911fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitRegCond(const X86EncodingMap* entry, uint8_t reg, uint8_t condition);
1921fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitJmp(const X86EncodingMap* entry, int rel);
1931fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitJcc(const X86EncodingMap* entry, int rel, uint8_t cc);
1941fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitCallMem(const X86EncodingMap* entry, uint8_t base, int disp);
1951fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitCallThread(const X86EncodingMap* entry, int disp);
1961fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitPcRel(const X86EncodingMap* entry, uint8_t reg, int base_or_table, uint8_t index,
1971fd3346740dfb7f47be9922312b68a4227fada96buzbee                   int scale, int table_or_disp);
1981fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitMacro(const X86EncodingMap* entry, uint8_t reg, int offset);
1991fd3346740dfb7f47be9922312b68a4227fada96buzbee    void EmitUnimplemented(const X86EncodingMap* entry, LIR* lir);
20002031b185b4653e6c72e21f7a51238b903f6d638buzbee};
20102031b185b4653e6c72e21f7a51238b903f6d638buzbee
20202031b185b4653e6c72e21f7a51238b903f6d638buzbee}  // namespace art
20302031b185b4653e6c72e21f7a51238b903f6d638buzbee
204fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_COMPILER_DEX_QUICK_X86_CODEGEN_X86_H_
205