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