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