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