ARMAssemblerProxy.h revision 2bc2b792782b304b15d8c48b54916a9b3fa3a7ac
14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* libs/pixelflinger/codeflinger/ARMAssemblerProxy.h 24f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** 34f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** Copyright 2006, The Android Open Source Project 44f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** 54f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 64f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** you may not use this file except in compliance with the License. 74f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** You may obtain a copy of the License at 84f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** 94f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** 114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** See the License for the specific language governing permissions and 154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project** limitations under the License. 164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project*/ 174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef ANDROID_ARMASSEMBLER_PROXY_H 204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define ANDROID_ARMASSEMBLER_PROXY_H 214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <stdint.h> 234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/types.h> 244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include "codeflinger/ARMAssemblerInterface.h" 264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectnamespace android { 284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ---------------------------------------------------------------------------- 304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectclass ARMAssemblerProxy : public ARMAssemblerInterface 324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{ 334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectpublic: 344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project // ARMAssemblerProxy take ownership of the target 354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ARMAssemblerProxy(); 374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ARMAssemblerProxy(ARMAssemblerInterface* target); 384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual ~ARMAssemblerProxy(); 394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project void setTarget(ARMAssemblerInterface* target); 414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void reset(); 434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual int generate(const char* name); 444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void disassemble(const char* name); 452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual int getCodegenArch(); 464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void prolog(); 484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void epilog(uint32_t touched); 494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void comment(const char* string); 504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ----------------------------------------------------------------------- 522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // shifters and addressing modes 532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ----------------------------------------------------------------------- 542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual bool isValidImmediate(uint32_t immed); 562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); 572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t imm(uint32_t immediate); 592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); 602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_rrx(int Rm); 612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_reg(int Rm, int type, int Rs); 622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // addressing modes... 642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // LDR(B)/STR(B)/PLD 652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // (immediate and Rm can be negative, which indicates U=0) 662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed12_pre(int32_t immed12, int W=0); 672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed12_post(int32_t immed12); 682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); 692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); 702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // LDRH/LDRSB/LDRSH/STRH 722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // (immediate and Rm can be negative, which indicates U=0) 732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed8_pre(int32_t immed8, int W=0); 742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed8_post(int32_t immed8); 752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_pre(int Rm, int W=0); 762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_post(int Rm); 772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void dataProcessing(int opcode, int cc, int s, 804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rn, 814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project uint32_t Op2); 824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void MLA(int cc, int s, 834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs, int Rn); 844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void MUL(int cc, int s, 854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs); 864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void UMULL(int cc, int s, 874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int RdLo, int RdHi, int Rm, int Rs); 884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void UMUAL(int cc, int s, 894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int RdLo, int RdHi, int Rm, int Rs); 904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMULL(int cc, int s, 914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int RdLo, int RdHi, int Rm, int Rs); 924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMUAL(int cc, int s, 934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int RdLo, int RdHi, int Rm, int Rs); 944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void B(int cc, uint32_t* pc); 964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void BL(int cc, uint32_t* pc); 974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void BX(int cc, int Rn); 984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void label(const char* theLabel); 994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void B(int cc, const char* label); 1004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void BL(int cc, const char* label); 1014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project uint32_t* pcForLabel(const char* label); 1034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDR (int cc, int Rd, 1052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed12_pre(0)); 1064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDRB(int cc, int Rd, 1072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed12_pre(0)); 1084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void STR (int cc, int Rd, 1092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed12_pre(0)); 1104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void STRB(int cc, int Rd, 1112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed12_pre(0)); 1124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDRH (int cc, int Rd, 1132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed8_pre(0)); 1144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDRSB(int cc, int Rd, 1152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed8_pre(0)); 1164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDRSH(int cc, int Rd, 1172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed8_pre(0)); 1184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void STRH (int cc, int Rd, 1192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = __immed8_pre(0)); 1204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void LDM(int cc, int dir, 1214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rn, int W, uint32_t reg_list); 1224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void STM(int cc, int dir, 1234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rn, int W, uint32_t reg_list); 1244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SWP(int cc, int Rn, int Rd, int Rm); 1264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SWPB(int cc, int Rn, int Rd, int Rm); 1274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SWI(int cc, uint32_t comment); 1284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void PLD(int Rn, uint32_t offset); 1304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void CLZ(int cc, int Rd, int Rm); 1314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void QADD(int cc, int Rd, int Rm, int Rn); 1324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void QDADD(int cc, int Rd, int Rm, int Rn); 1334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void QSUB(int cc, int Rd, int Rm, int Rn); 1344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void QDSUB(int cc, int Rd, int Rm, int Rn); 1354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMUL(int cc, int xy, 1364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs); 1374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMULW(int cc, int y, 1384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs); 1394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMLA(int cc, int xy, 1404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs, int Rn); 1414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMLAL(int cc, int xy, 1424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int RdHi, int RdLo, int Rs, int Rm); 1434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project virtual void SMLAW(int cc, int y, 1444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int Rd, int Rm, int Rs, int Rn); 1454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 14696dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell virtual void UXTB16(int cc, int Rd, int Rm, int rotate); 1474dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); 14896dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell 1494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectprivate: 1504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ARMAssemblerInterface* mTarget; 1514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}; 1524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}; // namespace android 1544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif //ANDROID_ARMASSEMBLER_PROXY_H 156