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