1/* libs/pixelflinger/codeflinger/ARMAssembler.h 2** 3** Copyright 2006, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#ifndef ANDROID_ARMASSEMBLER_H 19#define ANDROID_ARMASSEMBLER_H 20 21#include <stdint.h> 22#include <sys/types.h> 23 24#include "tinyutils/Vector.h" 25#include "tinyutils/KeyedVector.h" 26#include "tinyutils/smartpointer.h" 27 28#include "tinyutils/smartpointer.h" 29#include "codeflinger/ARMAssemblerInterface.h" 30#include "codeflinger/CodeCache.h" 31 32namespace android { 33 34// ---------------------------------------------------------------------------- 35 36class ARMAssembler : public ARMAssemblerInterface 37{ 38public: 39 ARMAssembler(const sp<Assembly>& assembly); 40 virtual ~ARMAssembler(); 41 42 uint32_t* base() const; 43 uint32_t* pc() const; 44 45 46 void disassemble(const char* name); 47 48 // ------------------------------------------------------------------------ 49 // ARMAssemblerInterface... 50 // ------------------------------------------------------------------------ 51 52 virtual void reset(); 53 54 virtual int generate(const char* name); 55 virtual int getCodegenArch(); 56 57 virtual void prolog(); 58 virtual void epilog(uint32_t touched); 59 virtual void comment(const char* string); 60 61 62 // ----------------------------------------------------------------------- 63 // shifters and addressing modes 64 // ----------------------------------------------------------------------- 65 66 // shifters... 67 virtual bool isValidImmediate(uint32_t immed); 68 virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); 69 70 virtual uint32_t imm(uint32_t immediate); 71 virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); 72 virtual uint32_t reg_rrx(int Rm); 73 virtual uint32_t reg_reg(int Rm, int type, int Rs); 74 75 // addressing modes... 76 // LDR(B)/STR(B)/PLD 77 // (immediate and Rm can be negative, which indicates U=0) 78 virtual uint32_t immed12_pre(int32_t immed12, int W=0); 79 virtual uint32_t immed12_post(int32_t immed12); 80 virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); 81 virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); 82 83 // LDRH/LDRSB/LDRSH/STRH 84 // (immediate and Rm can be negative, which indicates U=0) 85 virtual uint32_t immed8_pre(int32_t immed8, int W=0); 86 virtual uint32_t immed8_post(int32_t immed8); 87 virtual uint32_t reg_pre(int Rm, int W=0); 88 virtual uint32_t reg_post(int Rm); 89 90 91 virtual void dataProcessing(int opcode, int cc, int s, 92 int Rd, int Rn, 93 uint32_t Op2); 94 virtual void MLA(int cc, int s, 95 int Rd, int Rm, int Rs, int Rn); 96 virtual void MUL(int cc, int s, 97 int Rd, int Rm, int Rs); 98 virtual void UMULL(int cc, int s, 99 int RdLo, int RdHi, int Rm, int Rs); 100 virtual void UMUAL(int cc, int s, 101 int RdLo, int RdHi, int Rm, int Rs); 102 virtual void SMULL(int cc, int s, 103 int RdLo, int RdHi, int Rm, int Rs); 104 virtual void SMUAL(int cc, int s, 105 int RdLo, int RdHi, int Rm, int Rs); 106 107 virtual void B(int cc, uint32_t* pc); 108 virtual void BL(int cc, uint32_t* pc); 109 virtual void BX(int cc, int Rn); 110 virtual void label(const char* theLabel); 111 virtual void B(int cc, const char* label); 112 virtual void BL(int cc, const char* label); 113 114 virtual uint32_t* pcForLabel(const char* label); 115 116 virtual void LDR (int cc, int Rd, 117 int Rn, uint32_t offset = __immed12_pre(0)); 118 virtual void LDRB(int cc, int Rd, 119 int Rn, uint32_t offset = __immed12_pre(0)); 120 virtual void STR (int cc, int Rd, 121 int Rn, uint32_t offset = __immed12_pre(0)); 122 virtual void STRB(int cc, int Rd, 123 int Rn, uint32_t offset = __immed12_pre(0)); 124 virtual void LDRH (int cc, int Rd, 125 int Rn, uint32_t offset = __immed8_pre(0)); 126 virtual void LDRSB(int cc, int Rd, 127 int Rn, uint32_t offset = __immed8_pre(0)); 128 virtual void LDRSH(int cc, int Rd, 129 int Rn, uint32_t offset = __immed8_pre(0)); 130 virtual void STRH (int cc, int Rd, 131 int Rn, uint32_t offset = __immed8_pre(0)); 132 133 134 virtual void LDM(int cc, int dir, 135 int Rn, int W, uint32_t reg_list); 136 virtual void STM(int cc, int dir, 137 int Rn, int W, uint32_t reg_list); 138 139 virtual void SWP(int cc, int Rn, int Rd, int Rm); 140 virtual void SWPB(int cc, int Rn, int Rd, int Rm); 141 virtual void SWI(int cc, uint32_t comment); 142 143 virtual void PLD(int Rn, uint32_t offset); 144 virtual void CLZ(int cc, int Rd, int Rm); 145 virtual void QADD(int cc, int Rd, int Rm, int Rn); 146 virtual void QDADD(int cc, int Rd, int Rm, int Rn); 147 virtual void QSUB(int cc, int Rd, int Rm, int Rn); 148 virtual void QDSUB(int cc, int Rd, int Rm, int Rn); 149 virtual void SMUL(int cc, int xy, 150 int Rd, int Rm, int Rs); 151 virtual void SMULW(int cc, int y, 152 int Rd, int Rm, int Rs); 153 virtual void SMLA(int cc, int xy, 154 int Rd, int Rm, int Rs, int Rn); 155 virtual void SMLAL(int cc, int xy, 156 int RdHi, int RdLo, int Rs, int Rm); 157 virtual void SMLAW(int cc, int y, 158 int Rd, int Rm, int Rs, int Rn); 159 virtual void UXTB16(int cc, int Rd, int Rm, int rotate); 160 virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); 161 162private: 163 ARMAssembler(const ARMAssembler& rhs); 164 ARMAssembler& operator = (const ARMAssembler& rhs); 165 166 sp<Assembly> mAssembly; 167 uint32_t* mBase; 168 uint32_t* mPC; 169 uint32_t* mPrologPC; 170 int64_t mDuration; 171#if defined(WITH_LIB_HARDWARE) 172 bool mQemuTracing; 173#endif 174 175 struct branch_target_t { 176 inline branch_target_t() : label(0), pc(0) { } 177 inline branch_target_t(const char* l, uint32_t* p) 178 : label(l), pc(p) { } 179 const char* label; 180 uint32_t* pc; 181 }; 182 183 Vector<branch_target_t> mBranchTargets; 184 KeyedVector< const char*, uint32_t* > mLabels; 185 KeyedVector< uint32_t*, const char* > mLabelsInverseMapping; 186 KeyedVector< uint32_t*, const char* > mComments; 187}; 188 189}; // namespace android 190 191#endif //ANDROID_ARMASSEMBLER_H 192