| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2011 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 |  | 
| Brian Carlstrom | fc0e321 | 2013-07-17 14:40:12 -0700 | [diff] [blame] | 17 | #ifndef ART_COMPILER_DEX_QUICK_ARM_CODEGEN_ARM_H_ | 
 | 18 | #define ART_COMPILER_DEX_QUICK_ARM_CODEGEN_ARM_H_ | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 19 |  | 
| Ian Rogers | 107c31e | 2014-01-23 20:55:29 -0800 | [diff] [blame] | 20 | #include "arm_lir.h" | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 21 | #include "dex/compiler_internals.h" | 
 | 22 |  | 
 | 23 | namespace art { | 
 | 24 |  | 
| Ian Rogers | e2143c0 | 2014-03-28 08:47:16 -0700 | [diff] [blame] | 25 | class ArmMir2Lir FINAL : public Mir2Lir { | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 26 |   public: | 
 | 27 |     ArmMir2Lir(CompilationUnit* cu, MIRGraph* mir_graph, ArenaAllocator* arena); | 
 | 28 |  | 
 | 29 |     // Required for target - codegen helpers. | 
| buzbee | 11b63d1 | 2013-08-27 07:34:17 -0700 | [diff] [blame] | 30 |     bool SmallLiteralDivRem(Instruction::Code dalvik_opcode, bool is_div, RegLocation rl_src, | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 31 |                             RegLocation rl_dest, int lit); | 
| Ian Rogers | e2143c0 | 2014-03-28 08:47:16 -0700 | [diff] [blame] | 32 |     bool EasyMultiply(RegLocation rl_src, RegLocation rl_dest, int lit) OVERRIDE; | 
| Dave Allison | b373e09 | 2014-02-20 16:06:36 -0800 | [diff] [blame] | 33 |     LIR* CheckSuspendUsingLoad() OVERRIDE; | 
| Andreas Gampe | 9843059 | 2014-07-27 19:44:50 -0700 | [diff] [blame] | 34 |     RegStorage LoadHelper(QuickEntrypointEnum trampoline) OVERRIDE; | 
| Vladimir Marko | 3bf7c60 | 2014-05-07 14:55:43 +0100 | [diff] [blame] | 35 |     LIR* LoadBaseDisp(RegStorage r_base, int displacement, RegStorage r_dest, | 
| Andreas Gampe | 3c12c51 | 2014-06-24 18:46:29 +0000 | [diff] [blame] | 36 |                       OpSize size, VolatileKind is_volatile) OVERRIDE; | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 37 |     LIR* LoadBaseIndexed(RegStorage r_base, RegStorage r_index, RegStorage r_dest, int scale, | 
| Vladimir Marko | 3bf7c60 | 2014-05-07 14:55:43 +0100 | [diff] [blame] | 38 |                          OpSize size) OVERRIDE; | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 39 |     LIR* LoadConstantNoClobber(RegStorage r_dest, int value); | 
 | 40 |     LIR* LoadConstantWide(RegStorage r_dest, int64_t value); | 
| Vladimir Marko | 3bf7c60 | 2014-05-07 14:55:43 +0100 | [diff] [blame] | 41 |     LIR* StoreBaseDisp(RegStorage r_base, int displacement, RegStorage r_src, | 
| Andreas Gampe | 3c12c51 | 2014-06-24 18:46:29 +0000 | [diff] [blame] | 42 |                        OpSize size, VolatileKind is_volatile) OVERRIDE; | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 43 |     LIR* StoreBaseIndexed(RegStorage r_base, RegStorage r_index, RegStorage r_src, int scale, | 
| Vladimir Marko | 3bf7c60 | 2014-05-07 14:55:43 +0100 | [diff] [blame] | 44 |                           OpSize size) OVERRIDE; | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 45 |     void MarkGCCard(RegStorage val_reg, RegStorage tgt_addr_reg); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 46 |  | 
 | 47 |     // Required for target - register utilities. | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 48 |     RegStorage TargetReg(SpecialTargetRegister reg); | 
 | 49 |     RegStorage GetArgMappingToPhysicalReg(int arg_num); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 50 |     RegLocation GetReturnAlt(); | 
 | 51 |     RegLocation GetReturnWideAlt(); | 
 | 52 |     RegLocation LocCReturn(); | 
| buzbee | a0cd2d7 | 2014-06-01 09:33:49 -0700 | [diff] [blame] | 53 |     RegLocation LocCReturnRef(); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 54 |     RegLocation LocCReturnDouble(); | 
 | 55 |     RegLocation LocCReturnFloat(); | 
 | 56 |     RegLocation LocCReturnWide(); | 
| Vladimir Marko | 8dea81c | 2014-06-06 14:50:36 +0100 | [diff] [blame] | 57 |     ResourceMask GetRegMaskCommon(const RegStorage& reg) const OVERRIDE; | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 58 |     void AdjustSpillMask(); | 
| Vladimir Marko | 31c2aac | 2013-12-09 16:31:19 +0000 | [diff] [blame] | 59 |     void ClobberCallerSave(); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 60 |     void FreeCallTemps(); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 61 |     void LockCallTemps(); | 
| buzbee | 091cc40 | 2014-03-31 10:14:40 -0700 | [diff] [blame] | 62 |     void MarkPreservedSingle(int v_reg, RegStorage reg); | 
 | 63 |     void MarkPreservedDouble(int v_reg, RegStorage reg); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 64 |     void CompilerInitializeRegAlloc(); | 
 | 65 |  | 
 | 66 |     // Required for target - miscellaneous. | 
| buzbee | b48819d | 2013-09-14 16:15:25 -0700 | [diff] [blame] | 67 |     void AssembleLIR(); | 
| Vladimir Marko | 306f017 | 2014-01-07 18:21:20 +0000 | [diff] [blame] | 68 |     uint32_t LinkFixupInsns(LIR* head_lir, LIR* tail_lir, CodeOffset offset); | 
| buzbee | b48819d | 2013-09-14 16:15:25 -0700 | [diff] [blame] | 69 |     int AssignInsnOffsets(); | 
 | 70 |     void AssignOffsets(); | 
| Vladimir Marko | 306f017 | 2014-01-07 18:21:20 +0000 | [diff] [blame] | 71 |     static uint8_t* EncodeLIRs(uint8_t* write_pos, LIR* lir); | 
| Vladimir Marko | 8dea81c | 2014-06-06 14:50:36 +0100 | [diff] [blame] | 72 |     void DumpResourceMask(LIR* lir, const ResourceMask& mask, const char* prefix) OVERRIDE; | 
 | 73 |     void SetupTargetResourceMasks(LIR* lir, uint64_t flags, | 
 | 74 |                                   ResourceMask* use_mask, ResourceMask* def_mask) OVERRIDE; | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 75 |     const char* GetTargetInstFmt(int opcode); | 
 | 76 |     const char* GetTargetInstName(int opcode); | 
 | 77 |     std::string BuildInsnString(const char* fmt, LIR* lir, unsigned char* base_addr); | 
| Vladimir Marko | 8dea81c | 2014-06-06 14:50:36 +0100 | [diff] [blame] | 78 |     ResourceMask GetPCUseDefEncoding() const OVERRIDE; | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 79 |     uint64_t GetTargetInstFlags(int opcode); | 
| Ian Rogers | 5aa6e04 | 2014-06-13 16:38:24 -0700 | [diff] [blame] | 80 |     size_t GetInsnSize(LIR* lir) OVERRIDE; | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 81 |     bool IsUnconditionalBranch(LIR* lir); | 
 | 82 |  | 
| Vladimir Marko | 674744e | 2014-04-24 15:18:26 +0100 | [diff] [blame] | 83 |     // Get the register class for load/store of a field. | 
 | 84 |     RegisterClass RegClassForFieldLoadStore(OpSize size, bool is_volatile) OVERRIDE; | 
 | 85 |  | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 86 |     // Required for target - Dalvik-level generators. | 
| Andreas Gampe | c76c614 | 2014-08-04 16:30:03 -0700 | [diff] [blame^] | 87 |     void GenArithOpLong(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1, | 
 | 88 |                         RegLocation rl_src2) OVERRIDE; | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 89 |     void GenArithImmOpLong(Instruction::Code opcode, RegLocation rl_dest, | 
 | 90 |                            RegLocation rl_src1, RegLocation rl_src2); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 91 |     void GenArrayGet(int opt_flags, OpSize size, RegLocation rl_array, | 
 | 92 |                      RegLocation rl_index, RegLocation rl_dest, int scale); | 
| Ian Rogers | a9a8254 | 2013-10-04 11:17:26 -0700 | [diff] [blame] | 93 |     void GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array, RegLocation rl_index, | 
 | 94 |                      RegLocation rl_src, int scale, bool card_mark); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 95 |     void GenShiftImmOpLong(Instruction::Code opcode, RegLocation rl_dest, | 
 | 96 |                            RegLocation rl_src1, RegLocation rl_shift); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 97 |     void GenArithOpDouble(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1, | 
 | 98 |                           RegLocation rl_src2); | 
 | 99 |     void GenArithOpFloat(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1, | 
 | 100 |                          RegLocation rl_src2); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 101 |     void GenCmpFP(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1, | 
 | 102 |                   RegLocation rl_src2); | 
 | 103 |     void GenConversion(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src); | 
| Vladimir Marko | 5030d3e | 2014-07-17 10:43:08 +0100 | [diff] [blame] | 104 |     bool GenInlinedAbsFloat(CallInfo* info) OVERRIDE; | 
 | 105 |     bool GenInlinedAbsDouble(CallInfo* info) OVERRIDE; | 
| Vladimir Marko | 1c282e2 | 2013-11-21 14:49:47 +0000 | [diff] [blame] | 106 |     bool GenInlinedCas(CallInfo* info, bool is_long, bool is_object); | 
| Serban Constantinescu | 23abec9 | 2014-07-02 16:13:38 +0100 | [diff] [blame] | 107 |     bool GenInlinedMinMax(CallInfo* info, bool is_min, bool is_long); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 108 |     bool GenInlinedSqrt(CallInfo* info); | 
| Vladimir Marko | e508a20 | 2013-11-04 15:24:22 +0000 | [diff] [blame] | 109 |     bool GenInlinedPeek(CallInfo* info, OpSize size); | 
 | 110 |     bool GenInlinedPoke(CallInfo* info, OpSize size); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 111 |     RegLocation GenDivRem(RegLocation rl_dest, RegStorage reg_lo, RegStorage reg_hi, bool is_div); | 
 | 112 |     RegLocation GenDivRemLit(RegLocation rl_dest, RegStorage reg_lo, int lit, bool is_div); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 113 |     void GenCmpLong(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2); | 
| Mingyao Yang | e643a17 | 2014-04-08 11:02:52 -0700 | [diff] [blame] | 114 |     void GenDivZeroCheckWide(RegStorage reg); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 115 |     void GenEntrySequence(RegLocation* ArgLocs, RegLocation rl_method); | 
 | 116 |     void GenExitSequence(); | 
| Razvan A Lupusoru | 3bc0174 | 2014-02-06 13:18:43 -0800 | [diff] [blame] | 117 |     void GenSpecialExitSequence(); | 
| buzbee | 0d82948 | 2013-10-11 15:24:55 -0700 | [diff] [blame] | 118 |     void GenFillArrayData(DexOffset table_offset, RegLocation rl_src); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 119 |     void GenFusedFPCmpBranch(BasicBlock* bb, MIR* mir, bool gt_bias, bool is_double); | 
 | 120 |     void GenFusedLongCmpBranch(BasicBlock* bb, MIR* mir); | 
 | 121 |     void GenSelect(BasicBlock* bb, MIR* mir); | 
| Andreas Gampe | 90969af | 2014-07-15 23:02:11 -0700 | [diff] [blame] | 122 |     void GenSelectConst32(RegStorage left_op, RegStorage right_op, ConditionCode code, | 
 | 123 |                           int32_t true_val, int32_t false_val, RegStorage rs_dest, | 
 | 124 |                           int dest_reg_class) OVERRIDE; | 
| Andreas Gampe | b14329f | 2014-05-15 11:16:06 -0700 | [diff] [blame] | 125 |     bool GenMemBarrier(MemBarrierKind barrier_kind); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 126 |     void GenMonitorEnter(int opt_flags, RegLocation rl_src); | 
 | 127 |     void GenMonitorExit(int opt_flags, RegLocation rl_src); | 
 | 128 |     void GenMoveException(RegLocation rl_dest); | 
 | 129 |     void GenMultiplyByTwoBitMultiplier(RegLocation rl_src, RegLocation rl_result, int lit, | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 130 |                                        int first_bit, int second_bit); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 131 |     void GenNegDouble(RegLocation rl_dest, RegLocation rl_src); | 
 | 132 |     void GenNegFloat(RegLocation rl_dest, RegLocation rl_src); | 
| buzbee | 0d82948 | 2013-10-11 15:24:55 -0700 | [diff] [blame] | 133 |     void GenPackedSwitch(MIR* mir, DexOffset table_offset, RegLocation rl_src); | 
 | 134 |     void GenSparseSwitch(MIR* mir, DexOffset table_offset, RegLocation rl_src); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 135 |  | 
 | 136 |     // Required for target - single operation generators. | 
 | 137 |     LIR* OpUnconditionalBranch(LIR* target); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 138 |     LIR* OpCmpBranch(ConditionCode cond, RegStorage src1, RegStorage src2, LIR* target); | 
 | 139 |     LIR* OpCmpImmBranch(ConditionCode cond, RegStorage reg, int check_value, LIR* target); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 140 |     LIR* OpCondBranch(ConditionCode cc, LIR* target); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 141 |     LIR* OpDecAndBranch(ConditionCode c_code, RegStorage reg, LIR* target); | 
 | 142 |     LIR* OpFpRegCopy(RegStorage r_dest, RegStorage r_src); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 143 |     LIR* OpIT(ConditionCode cond, const char* guide); | 
| Andreas Gampe | b14329f | 2014-05-15 11:16:06 -0700 | [diff] [blame] | 144 |     void UpdateIT(LIR* it, const char* new_guide); | 
| Dave Allison | 3da67a5 | 2014-04-02 17:03:45 -0700 | [diff] [blame] | 145 |     void OpEndIT(LIR* it); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 146 |     LIR* OpMem(OpKind op, RegStorage r_base, int disp); | 
 | 147 |     LIR* OpPcRelLoad(RegStorage reg, LIR* target); | 
 | 148 |     LIR* OpReg(OpKind op, RegStorage r_dest_src); | 
| buzbee | 7a11ab0 | 2014-04-28 20:02:38 -0700 | [diff] [blame] | 149 |     void OpRegCopy(RegStorage r_dest, RegStorage r_src); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 150 |     LIR* OpRegCopyNoInsert(RegStorage r_dest, RegStorage r_src); | 
 | 151 |     LIR* OpRegImm(OpKind op, RegStorage r_dest_src1, int value); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 152 |     LIR* OpRegReg(OpKind op, RegStorage r_dest_src1, RegStorage r_src2); | 
 | 153 |     LIR* OpMovRegMem(RegStorage r_dest, RegStorage r_base, int offset, MoveType move_type); | 
 | 154 |     LIR* OpMovMemReg(RegStorage r_base, int offset, RegStorage r_src, MoveType move_type); | 
 | 155 |     LIR* OpCondRegReg(OpKind op, ConditionCode cc, RegStorage r_dest, RegStorage r_src); | 
 | 156 |     LIR* OpRegRegImm(OpKind op, RegStorage r_dest, RegStorage r_src1, int value); | 
 | 157 |     LIR* OpRegRegReg(OpKind op, RegStorage r_dest, RegStorage r_src1, RegStorage r_src2); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 158 |     LIR* OpTestSuspend(LIR* target); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 159 |     LIR* OpVldm(RegStorage r_base, int count); | 
 | 160 |     LIR* OpVstm(RegStorage r_base, int count); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 161 |     void OpRegCopyWide(RegStorage dest, RegStorage src); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 162 |  | 
| Vladimir Marko | 3bf7c60 | 2014-05-07 14:55:43 +0100 | [diff] [blame] | 163 |     LIR* LoadBaseDispBody(RegStorage r_base, int displacement, RegStorage r_dest, OpSize size); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 164 |     LIR* StoreBaseDispBody(RegStorage r_base, int displacement, RegStorage r_src, OpSize size); | 
| Ian Rogers | e2143c0 | 2014-03-28 08:47:16 -0700 | [diff] [blame] | 165 |     LIR* OpRegRegRegShift(OpKind op, RegStorage r_dest, RegStorage r_src1, RegStorage r_src2, | 
 | 166 |                           int shift); | 
 | 167 |     LIR* OpRegRegShift(OpKind op, RegStorage r_dest_src1, RegStorage r_src2, int shift); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 168 |     static const ArmEncodingMap EncodingMap[kArmLast]; | 
 | 169 |     int EncodeShift(int code, int amount); | 
 | 170 |     int ModifiedImmediate(uint32_t value); | 
 | 171 |     ArmConditionCode ArmConditionEncoding(ConditionCode code); | 
 | 172 |     bool InexpensiveConstantInt(int32_t value); | 
 | 173 |     bool InexpensiveConstantFloat(int32_t value); | 
 | 174 |     bool InexpensiveConstantLong(int64_t value); | 
 | 175 |     bool InexpensiveConstantDouble(int64_t value); | 
| buzbee | b5860fb | 2014-06-21 15:31:01 -0700 | [diff] [blame] | 176 |     RegStorage AllocPreservedDouble(int s_reg); | 
 | 177 |     RegStorage AllocPreservedSingle(int s_reg); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 178 |  | 
| Serguei Katkov | 59a42af | 2014-07-05 00:55:46 +0700 | [diff] [blame] | 179 |     bool WideGPRsAreAliases() OVERRIDE { | 
 | 180 |       return false;  // Wide GPRs are formed by pairing. | 
 | 181 |     } | 
 | 182 |     bool WideFPRsAreAliases() OVERRIDE { | 
 | 183 |       return false;  // Wide FPRs are formed by pairing. | 
 | 184 |     } | 
 | 185 |  | 
| Andreas Gampe | 9843059 | 2014-07-27 19:44:50 -0700 | [diff] [blame] | 186 |     LIR* InvokeTrampoline(OpKind op, RegStorage r_tgt, QuickEntrypointEnum trampoline) OVERRIDE; | 
| Serban Constantinescu | 6399968 | 2014-07-15 17:44:21 +0100 | [diff] [blame] | 187 |     size_t GetInstructionOffset(LIR* lir); | 
| Andreas Gampe | 9843059 | 2014-07-27 19:44:50 -0700 | [diff] [blame] | 188 |  | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 189 |   private: | 
| Andreas Gampe | c76c614 | 2014-08-04 16:30:03 -0700 | [diff] [blame^] | 190 |     void GenNegLong(RegLocation rl_dest, RegLocation rl_src); | 
 | 191 |     void GenMulLong(Instruction::Code opcode, RegLocation rl_dest, RegLocation rl_src1, | 
 | 192 |                     RegLocation rl_src2); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 193 |     void GenFusedLongCmpImmBranch(BasicBlock* bb, RegLocation rl_src1, int64_t val, | 
 | 194 |                                   ConditionCode ccode); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 195 |     LIR* LoadFPConstantValue(int r_dest, int value); | 
| Vladimir Marko | 3757397 | 2014-06-16 10:32:25 +0100 | [diff] [blame] | 196 |     LIR* LoadStoreUsingInsnWithOffsetImm8Shl2(ArmOpcode opcode, RegStorage r_base, | 
 | 197 |                                               int displacement, RegStorage r_src_dest, | 
 | 198 |                                               RegStorage r_work = RegStorage::InvalidReg()); | 
| buzbee | b48819d | 2013-09-14 16:15:25 -0700 | [diff] [blame] | 199 |     void ReplaceFixup(LIR* prev_lir, LIR* orig_lir, LIR* new_lir); | 
 | 200 |     void InsertFixupBefore(LIR* prev_lir, LIR* orig_lir, LIR* new_lir); | 
 | 201 |     void AssignDataOffsets(); | 
| buzbee | 2700f7e | 2014-03-07 09:46:20 -0800 | [diff] [blame] | 202 |     RegLocation GenDivRem(RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2, | 
 | 203 |                           bool is_div, bool check_zero); | 
| Mark Mendell | 2bf31e6 | 2014-01-23 12:13:40 -0800 | [diff] [blame] | 204 |     RegLocation GenDivRemLit(RegLocation rl_dest, RegLocation rl_src1, int lit, bool is_div); | 
| Ian Rogers | e2143c0 | 2014-03-28 08:47:16 -0700 | [diff] [blame] | 205 |     typedef struct { | 
 | 206 |       OpKind op; | 
 | 207 |       uint32_t shift; | 
 | 208 |     } EasyMultiplyOp; | 
 | 209 |     bool GetEasyMultiplyOp(int lit, EasyMultiplyOp* op); | 
 | 210 |     bool GetEasyMultiplyTwoOps(int lit, EasyMultiplyOp* ops); | 
 | 211 |     void GenEasyMultiplyTwoOps(RegStorage r_dest, RegStorage r_src, EasyMultiplyOp* ops); | 
| Vladimir Marko | 8dea81c | 2014-06-06 14:50:36 +0100 | [diff] [blame] | 212 |  | 
 | 213 |     static constexpr ResourceMask GetRegMaskArm(RegStorage reg); | 
 | 214 |     static constexpr ResourceMask EncodeArmRegList(int reg_list); | 
 | 215 |     static constexpr ResourceMask EncodeArmRegFpcsList(int reg_list); | 
| Brian Carlstrom | 7940e44 | 2013-07-12 13:46:57 -0700 | [diff] [blame] | 216 | }; | 
 | 217 |  | 
 | 218 | }  // namespace art | 
 | 219 |  | 
| Brian Carlstrom | fc0e321 | 2013-07-17 14:40:12 -0700 | [diff] [blame] | 220 | #endif  // ART_COMPILER_DEX_QUICK_ARM_CODEGEN_ARM_H_ |