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