ARMAssemblerInterface.h revision 2bc2b792782b304b15d8c48b54916a9b3fa3a7ac
14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* libs/pixelflinger/codeflinger/ARMAssemblerInterface.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_INTERFACE_H
204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define ANDROID_ARMASSEMBLER_INTERFACE_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 Projectnamespace android {
264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ----------------------------------------------------------------------------
284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectclass ARMAssemblerInterface
304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectpublic:
324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual ~ARMAssemblerInterface();
334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV,
364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        HS = CS,
374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LO = CC
384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        S = 1
414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LSL, LSR, ASR, ROR
444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        ED, FD, EA, FA,
474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        IB, IA, DB, DA
484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15,
514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SP = R13,
524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LR = R14,
534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        PC = R15
544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        #define LIST(rr) L##rr=1<<rr
574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LIST(R0), LIST(R1), LIST(R2), LIST(R3), LIST(R4), LIST(R5), LIST(R6),
584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LIST(R7), LIST(R8), LIST(R9), LIST(R10), LIST(R11), LIST(R12),
594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LIST(R13), LIST(R14), LIST(R15),
604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LIST(SP), LIST(LR), LIST(PC),
614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        #undef LIST
624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        LSAVED = LR4|LR5|LR6|LR7|LR8|LR9|LR10|LR11 | LLR
634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    enum {
662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        CODEGEN_ARCH_ARM = 1, CODEGEN_ARCH_MIPS
672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    };
682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // shifters and addressing modes
714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    // these static versions are used for initializers on LDxx/STxx below
742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    static uint32_t    __immed12_pre(int32_t immed12, int W=0);
752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    static uint32_t    __immed8_pre(int32_t immed12, int W=0);
762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual bool        isValidImmediate(uint32_t immed) = 0;
782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual int         buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm) = 0;
794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    imm(uint32_t immediate) = 0;
812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_imm(int Rm, int type, uint32_t shift) = 0;
822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_rrx(int Rm) = 0;
832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_reg(int Rm, int type, int Rs) = 0;
844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // addressing modes...
864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // LDR(B)/STR(B)/PLD
874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // (immediate and Rm can be negative, which indicates U=0)
882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    immed12_pre(int32_t immed12, int W=0) = 0;
892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    immed12_post(int32_t immed12) = 0;
902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0) = 0;
912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_scale_post(int Rm, int type=0, uint32_t shift=0) = 0;
924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // LDRH/LDRSB/LDRSH/STRH
944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // (immediate and Rm can be negative, which indicates U=0)
952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    immed8_pre(int32_t immed8, int W=0) = 0;
962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    immed8_post(int32_t immed8) = 0;
972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_pre(int Rm, int W=0) = 0;
982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual uint32_t    reg_post(int Rm) = 0;
994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
1014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // basic instructions & code generation
1024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
1034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // generate the code
1054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void reset() = 0;
1064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual int  generate(const char* name) = 0;
1074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void disassemble(const char* name) = 0;
1082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    virtual int  getCodegenArch() = 0;
1094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // construct prolog and epilog
1114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void prolog() = 0;
1124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void epilog(uint32_t touched) = 0;
1134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void comment(const char* string) = 0;
1144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // data processing...
1164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
1174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        opAND, opEOR, opSUB, opRSB, opADD, opADC, opSBC, opRSC,
1184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        opTST, opTEQ, opCMP, opCMN, opORR, opMOV, opBIC, opMVN
1194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
1204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void
1224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            dataProcessing( int opcode, int cc, int s,
1234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                            int Rd, int Rn,
1244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                            uint32_t Op2) = 0;
1254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // multiply...
1274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void MLA(int cc, int s,
1284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs, int Rn) = 0;
1294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void MUL(int cc, int s,
1304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs) = 0;
1314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void UMULL(int cc, int s,
1324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int RdLo, int RdHi, int Rm, int Rs) = 0;
1334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void UMUAL(int cc, int s,
1344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int RdLo, int RdHi, int Rm, int Rs) = 0;
1354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMULL(int cc, int s,
1364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int RdLo, int RdHi, int Rm, int Rs) = 0;
1374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMUAL(int cc, int s,
1384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int RdLo, int RdHi, int Rm, int Rs) = 0;
1394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // branches...
1414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void B(int cc, uint32_t* pc) = 0;
1424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void BL(int cc, uint32_t* pc) = 0;
1434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void BX(int cc, int Rn) = 0;
1444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void label(const char* theLabel) = 0;
1464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void B(int cc, const char* label) = 0;
1474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void BL(int cc, const char* label) = 0;
1484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // valid only after generate() has been called
1504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual uint32_t* pcForLabel(const char* label) = 0;
1514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // data transfer...
1534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDR (int cc, int Rd,
1542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed12_pre(0)) = 0;
1554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDRB(int cc, int Rd,
1562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed12_pre(0)) = 0;
1574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void STR (int cc, int Rd,
1582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed12_pre(0)) = 0;
1594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void STRB(int cc, int Rd,
1602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed12_pre(0)) = 0;
1614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDRH (int cc, int Rd,
1632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed8_pre(0)) = 0;
1644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDRSB(int cc, int Rd,
1652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed8_pre(0)) = 0;
1664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDRSH(int cc, int Rd,
1672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed8_pre(0)) = 0;
1684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void STRH (int cc, int Rd,
1692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                int Rn, uint32_t offset = __immed8_pre(0)) = 0;
1704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // block data transfer...
1724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void LDM(int cc, int dir,
1734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rn, int W, uint32_t reg_list) = 0;
1744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void STM(int cc, int dir,
1754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rn, int W, uint32_t reg_list) = 0;
1764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // special...
1784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SWP(int cc, int Rn, int Rd, int Rm) = 0;
1794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SWPB(int cc, int Rn, int Rd, int Rm) = 0;
1804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SWI(int cc, uint32_t comment) = 0;
1814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // DSP instructions...
1834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    enum {
1844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        // B=0, T=1
1854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        //     yx
1864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        xyBB = 0, // 0000,
1874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        xyTB = 2, // 0010,
1884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        xyBT = 4, // 0100,
1894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        xyTT = 6, // 0110,
1904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        yB   = 0, // 0000,
1914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        yT   = 4, // 0100
1924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    };
1934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void PLD(int Rn, uint32_t offset) = 0;
1954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void CLZ(int cc, int Rd, int Rm) = 0;
1974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void QADD(int cc, int Rd, int Rm, int Rn) = 0;
1994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void QDADD(int cc, int Rd, int Rm, int Rn) = 0;
2004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void QSUB(int cc, int Rd, int Rm, int Rn) = 0;
2014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void QDSUB(int cc, int Rd, int Rm, int Rn) = 0;
2024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMUL(int cc, int xy,
2044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs) = 0;
2054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMULW(int cc, int y,
2064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs) = 0;
2074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMLA(int cc, int xy,
2084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs, int Rn) = 0;
2094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMLAL(int cc, int xy,
2104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int RdHi, int RdLo, int Rs, int Rm) = 0;
2114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    virtual void SMLAW(int cc, int y,
2124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int Rd, int Rm, int Rs, int Rn) = 0;
2134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
21496dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell    // byte/half word extract...
21596dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell    virtual void UXTB16(int cc, int Rd, int Rm, int rotate) = 0;
21696dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell
2174dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell    // bit manipulation...
2184dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell    virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width) = 0;
2194dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell
2204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
2214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // convenience...
2224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // -----------------------------------------------------------------------
2234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ADC(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opADC, cc, s, Rd, Rn, Op2);
2264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ADD(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opADD, cc, s, Rd, Rn, Op2);
2304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    AND(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opAND, cc, s, Rd, Rn, Op2);
2344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    BIC(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opBIC, cc, s, Rd, Rn, Op2);
2384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    EOR(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opEOR, cc, s, Rd, Rn, Op2);
2424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    MOV(int cc, int s, int Rd, uint32_t Op2) {
2454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opMOV, cc, s, Rd, 0, Op2);
2464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    MVN(int cc, int s, int Rd, uint32_t Op2) {
2494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opMVN, cc, s, Rd, 0, Op2);
2504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ORR(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opORR, cc, s, Rd, Rn, Op2);
2544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    RSB(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opRSB, cc, s, Rd, Rn, Op2);
2584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    RSC(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opRSC, cc, s, Rd, Rn, Op2);
2624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SBC(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opSBC, cc, s, Rd, Rn, Op2);
2664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SUB(int cc, int s, int Rd, int Rn, uint32_t Op2) {
2694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opSUB, cc, s, Rd, Rn, Op2);
2704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    TEQ(int cc, int Rn, uint32_t Op2) {
2734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opTEQ, cc, 1, 0, Rn, Op2);
2744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    TST(int cc, int Rn, uint32_t Op2) {
2774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opTST, cc, 1, 0, Rn, Op2);
2784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    CMP(int cc, int Rn, uint32_t Op2) {
2814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opCMP, cc, 1, 0, Rn, Op2);
2824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
2844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    CMN(int cc, int Rn, uint32_t Op2) {
2854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        dataProcessing(opCMN, cc, 1, 0, Rn, Op2);
2864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULBB(int cc, int Rd, int Rm, int Rs) {
2894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMUL(cc, xyBB, Rd, Rm, Rs);    }
2904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULTB(int cc, int Rd, int Rm, int Rs) {
2914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMUL(cc, xyTB, Rd, Rm, Rs);    }
2924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULBT(int cc, int Rd, int Rm, int Rs) {
2934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMUL(cc, xyBT, Rd, Rm, Rs);    }
2944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULTT(int cc, int Rd, int Rm, int Rs) {
2954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMUL(cc, xyTT, Rd, Rm, Rs);    }
2964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULWB(int cc, int Rd, int Rm, int Rs) {
2984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMULW(cc, yB, Rd, Rm, Rs);    }
2994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void SMULWT(int cc, int Rd, int Rm, int Rs) {
3004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMULW(cc, yT, Rd, Rm, Rs);    }
3014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLABB(int cc, int Rd, int Rm, int Rs, int Rn) {
3044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLA(cc, xyBB, Rd, Rm, Rs, Rn);    }
3054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLATB(int cc, int Rd, int Rm, int Rs, int Rn) {
3074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLA(cc, xyTB, Rd, Rm, Rs, Rn);    }
3084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLABT(int cc, int Rd, int Rm, int Rs, int Rn) {
3104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLA(cc, xyBT, Rd, Rm, Rs, Rn);    }
3114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLATT(int cc, int Rd, int Rm, int Rs, int Rn) {
3134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLA(cc, xyTT, Rd, Rm, Rs, Rn);    }
3144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLALBB(int cc, int RdHi, int RdLo, int Rs, int Rm) {
3174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAL(cc, xyBB, RdHi, RdLo, Rs, Rm);    }
3184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLALTB(int cc, int RdHi, int RdLo, int Rs, int Rm) {
3204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAL(cc, xyTB, RdHi, RdLo, Rs, Rm);    }
3214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLALBT(int cc, int RdHi, int RdLo, int Rs, int Rm) {
3234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAL(cc, xyBT, RdHi, RdLo, Rs, Rm);    }
3244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLALTT(int cc, int RdHi, int RdLo, int Rs, int Rm) {
3264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAL(cc, xyTT, RdHi, RdLo, Rs, Rm);    }
3274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLAWB(int cc, int Rd, int Rm, int Rs, int Rn) {
3304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAW(cc, yB, Rd, Rm, Rs, Rn);    }
3314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    inline void
3324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    SMLAWT(int cc, int Rd, int Rm, int Rs, int Rn) {
3334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        SMLAW(cc, yT, Rd, Rm, Rs, Rn);    }
3344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
3354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}; // namespace android
3374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif //ANDROID_ARMASSEMBLER_INTERFACE_H
339