12bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind/* libs/pixelflinger/codeflinger/MIPSAssembler.h 22bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** 32bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** Copyright 2012, The Android Open Source Project 42bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** 52bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** Licensed under the Apache License, Version 2.0 (the "License"); 62bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** you may not use this file except in compliance with the License. 72bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** You may obtain a copy of the License at 82bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** 92bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** http://www.apache.org/licenses/LICENSE-2.0 102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** 112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** Unless required by applicable law or agreed to in writing, software 122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** distributed under the License is distributed on an "AS IS" BASIS, 132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** See the License for the specific language governing permissions and 152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind** limitations under the License. 162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind*/ 172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#ifndef ANDROID_MIPSASSEMBLER_H 192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#define ANDROID_MIPSASSEMBLER_H 202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <stdint.h> 222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <sys/types.h> 232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <utils/Vector.h> 252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <utils/KeyedVector.h> 262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include "tinyutils/smartpointer.h" 282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include "codeflinger/ARMAssemblerInterface.h" 292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include "codeflinger/CodeCache.h" 302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindnamespace android { 322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindclass MIPSAssembler; // forward reference 342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// this class mimics ARMAssembler interface 362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// intent is to translate each ARM instruction to 1 or more MIPS instr 372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// implementation calls MIPSAssembler class to generate mips code 382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindclass ArmToMipsAssembler : public ARMAssemblerInterface 392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{ 402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindpublic: 412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ArmToMipsAssembler(const sp<Assembly>& assembly, 422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind char *abuf = 0, int linesz = 0, int instr_count = 0); 432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual ~ArmToMipsAssembler(); 442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* base() const; 462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* pc() const; 472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void disassemble(const char* name); 482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void reset(); 502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual int generate(const char* name); 522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual int getCodegenArch(); 532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void prolog(); 552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void epilog(uint32_t touched); 562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void comment(const char* string); 572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ----------------------------------------------------------------------- 602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // shifters and addressing modes 612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ----------------------------------------------------------------------- 622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // shifters... 642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual bool isValidImmediate(uint32_t immed); 652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); 662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t imm(uint32_t immediate); 682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); 692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_rrx(int Rm); 702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_reg(int Rm, int type, int Rs); 712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // addressing modes... 732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // LDR(B)/STR(B)/PLD 742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // (immediate and Rm can be negative, which indicates U=0) 752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed12_pre(int32_t immed12, int W=0); 762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed12_post(int32_t immed12); 772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); 782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); 792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // LDRH/LDRSB/LDRSH/STRH 812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // (immediate and Rm can be negative, which indicates U=0) 822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed8_pre(int32_t immed8, int W=0); 832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t immed8_post(int32_t immed8); 842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_pre(int Rm, int W=0); 852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t reg_post(int Rm); 862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void dataProcessing(int opcode, int cc, int s, 912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rn, 922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t Op2); 932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void MLA(int cc, int s, 942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs, int Rn); 952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void MUL(int cc, int s, 962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs); 972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void UMULL(int cc, int s, 982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int RdLo, int RdHi, int Rm, int Rs); 992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void UMUAL(int cc, int s, 1002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int RdLo, int RdHi, int Rm, int Rs); 1012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMULL(int cc, int s, 1022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int RdLo, int RdHi, int Rm, int Rs); 1032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMUAL(int cc, int s, 1042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int RdLo, int RdHi, int Rm, int Rs); 1052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void B(int cc, uint32_t* pc); 1072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void BL(int cc, uint32_t* pc); 1082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void BX(int cc, int Rn); 1092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void label(const char* theLabel); 1102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void B(int cc, const char* label); 1112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void BL(int cc, const char* label); 1122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual uint32_t* pcForLabel(const char* label); 1142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDR (int cc, int Rd, 1162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDRB(int cc, int Rd, 1182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void STR (int cc, int Rd, 1202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void STRB(int cc, int Rd, 1222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDRH (int cc, int Rd, 1242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDRSB(int cc, int Rd, 1262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDRSH(int cc, int Rd, 1282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void STRH (int cc, int Rd, 1302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, uint32_t offset = 0); 1312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void LDM(int cc, int dir, 1332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, int W, uint32_t reg_list); 1342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void STM(int cc, int dir, 1352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rn, int W, uint32_t reg_list); 1362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SWP(int cc, int Rn, int Rd, int Rm); 1382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SWPB(int cc, int Rn, int Rd, int Rm); 1392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SWI(int cc, uint32_t comment); 1402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void PLD(int Rn, uint32_t offset); 1422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void CLZ(int cc, int Rd, int Rm); 1432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void QADD(int cc, int Rd, int Rm, int Rn); 1442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void QDADD(int cc, int Rd, int Rm, int Rn); 1452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void QSUB(int cc, int Rd, int Rm, int Rn); 1462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void QDSUB(int cc, int Rd, int Rm, int Rn); 1472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMUL(int cc, int xy, 1482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs); 1492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMULW(int cc, int y, 1502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs); 1512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMLA(int cc, int xy, 1522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs, int Rn); 1532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMLAL(int cc, int xy, 1542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int RdHi, int RdLo, int Rs, int Rm); 1552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void SMLAW(int cc, int y, 1562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int Rd, int Rm, int Rs, int Rn); 1572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // byte/half word extract... 1592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void UXTB16(int cc, int Rd, int Rm, int rotate); 1602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // bit manipulation... 1622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); 1632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // this is some crap to share is MIPSAssembler class for debug 1652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind char * mArmDisassemblyBuffer; 1662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int mArmLineLength; 1672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int mArmInstrCount; 1682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int mInum; // current arm instuction number (0..n) 1702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t** mArmPC; // array: PC for 1st mips instr of 1712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // each translated ARM instr 1722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindprivate: 1752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ArmToMipsAssembler(const ArmToMipsAssembler& rhs); 1762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ArmToMipsAssembler& operator = (const ArmToMipsAssembler& rhs); 1772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void init_conditional_labels(void); 1792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void protectConditionalOperands(int Rd); 1812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // reg__tmp set to MIPS AT, reg 1 1832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int dataProcAdrModes(int op, int& source, bool sign = false, int reg_tmp = 1); 1842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sp<Assembly> mAssembly; 1862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind MIPSAssembler* mMips; 1872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum misc_constants_t { 1902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ARM_MAX_INSTUCTIONS = 512 // based on ASSEMBLY_SCRATCH_SIZE 1912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 1922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum { 1942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind SRC_REG = 0, 1952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind SRC_IMM, 1962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind SRC_ERROR = -1 1972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 1982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 1992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum addr_modes { 2002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // start above the range of legal mips reg #'s (0-31) 2012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_REG = 0x20, 2022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_IMM, AMODE_REG_IMM, // for data processing 2032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_IMM_12_PRE, AMODE_IMM_12_POST, // for load/store 2042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_REG_SCALE_PRE, AMODE_IMM_8_PRE, 2052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_IMM_8_POST, AMODE_REG_PRE, 2062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind AMODE_UNSUPPORTED 2072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 2082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind struct addr_mode_t { // address modes for current ARM instruction 2102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int reg; 2112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int stype; 2122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t value; 2132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bool writeback; // writeback the adr reg after modification 2142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind } amode; 2152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum cond_types { 2172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind CMP_COND = 1, 2182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind SBIT_COND 2192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 2202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind struct cond_mode_t { // conditional-execution info for current ARM instruction 2222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind cond_types type; 2232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int r1; 2242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int r2; 2252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int labelnum; 2262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind char label[100][10]; 2272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind } cond; 2282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}; 2302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// ---------------------------------------------------------------------------- 2352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// ---------------------------------------------------------------------------- 2362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// ---------------------------------------------------------------------------- 2372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// This is the basic MIPS assembler, which just creates the opcodes in memory. 2392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// All the more complicated work is done in ArmToMipsAssember above. 2402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindclass MIPSAssembler 2422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind{ 2432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindpublic: 2442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind MIPSAssembler(const sp<Assembly>& assembly, ArmToMipsAssembler *parent); 2452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind virtual ~MIPSAssembler(); 2462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* base() const; 2482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* pc() const; 2492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void reset(); 2502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void disassemble(const char* name); 2522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void prolog(); 2542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void epilog(uint32_t touched); 2552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int generate(const char* name); 2562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void comment(const char* string); 2572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void label(const char* string); 2582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // valid only after generate() has been called 2602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* pcForLabel(const char* label); 2612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ------------------------------------------------------------------------ 2642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // MIPSAssemblerInterface... 2652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // ------------------------------------------------------------------------ 2662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 2682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 2692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Arithmetic... 2702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 2712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ADDU(int Rd, int Rs, int Rt); 2732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ADDIU(int Rt, int Rs, int16_t imm); 2742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SUBU(int Rd, int Rs, int Rt); 2752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SUBIU(int Rt, int Rs, int16_t imm); 2762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void NEGU(int Rd, int Rs); 2772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MUL(int Rd, int Rs, int Rt); 2782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MULT(int Rs, int Rt); // dest is hi,lo 2792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MULTU(int Rs, int Rt); // dest is hi,lo 2802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MADD(int Rs, int Rt); // hi,lo = hi,lo + Rs * Rt 2812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MADDU(int Rs, int Rt); // hi,lo = hi,lo + Rs * Rt 2822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MSUB(int Rs, int Rt); // hi,lo = hi,lo - Rs * Rt 2832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MSUBU(int Rs, int Rt); // hi,lo = hi,lo - Rs * Rt 2842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SEB(int Rd, int Rt); // sign-extend byte (mips32r2) 2852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SEH(int Rd, int Rt); // sign-extend half-word (mips32r2) 2862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 2892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 2902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Comparisons... 2912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 2922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLT(int Rd, int Rs, int Rt); 2942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLTI(int Rt, int Rs, int16_t imm); 2952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLTU(int Rd, int Rs, int Rt); 2962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLTIU(int Rt, int Rs, int16_t imm); 2972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 2992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Logical... 3022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void AND(int Rd, int Rs, int Rt); 3052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ANDI(int Rd, int Rs, uint16_t imm); 3062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void OR(int Rd, int Rs, int Rt); 3072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ORI(int Rt, int Rs, uint16_t imm); 3082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void NOR(int Rd, int Rs, int Rt); 3092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void NOT(int Rd, int Rs); 3102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void XOR(int Rd, int Rs, int Rt); 3112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void XORI(int Rt, int Rs, uint16_t imm); 3122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLL(int Rd, int Rt, int shft); 3142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SLLV(int Rd, int Rt, int Rs); 3152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SRL(int Rd, int Rt, int shft); 3162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SRLV(int Rd, int Rt, int Rs); 3172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SRA(int Rd, int Rt, int shft); 3182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SRAV(int Rd, int Rt, int Rs); 3192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ROTR(int Rd, int Rt, int shft); // mips32r2 3202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void ROTRV(int Rd, int Rt, int Rs); // mips32r2 3212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void RORsyn(int Rd, int Rs, int Rt); // synthetic: d = s rotated by t 3222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void RORIsyn(int Rd, int Rt, int rot); // synthetic: d = s rotated by immed 3232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void CLO(int Rd, int Rs); 3252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void CLZ(int Rd, int Rs); 3262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void WSBH(int Rd, int Rt); 3272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Load/store... 3322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LW(int Rt, int Rbase, int16_t offset); 3352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SW(int Rt, int Rbase, int16_t offset); 3362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LB(int Rt, int Rbase, int16_t offset); 3372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LBU(int Rt, int Rbase, int16_t offset); 3382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SB(int Rt, int Rbase, int16_t offset); 3392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LH(int Rt, int Rbase, int16_t offset); 3402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LHU(int Rt, int Rbase, int16_t offset); 3412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void SH(int Rt, int Rbase, int16_t offset); 3422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void LUI(int Rt, int16_t offset); 3432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Register moves... 3472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MOVE(int Rd, int Rs); 3502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MOVN(int Rd, int Rs, int Rt); 3512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MOVZ(int Rd, int Rs, int Rt); 3522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MFHI(int Rd); 3532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MFLO(int Rd); 3542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MTHI(int Rs); 3552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void MTLO(int Rs); 3562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Branch... 3602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void B(const char* label); 3632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BEQ(int Rs, int Rt, const char* label); 3642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BNE(int Rs, int Rt, const char* label); 3652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGEZ(int Rs, const char* label); 3662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGTZ(int Rs, const char* label); 3672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLEZ(int Rs, const char* label); 3682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLTZ(int Rs, const char* label); 3692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void JR(int Rs); 3702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Synthesized Branch... 3752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // synthetic variants of above (using slt & friends) 3782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BEQZ(int Rs, const char* label); 3792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BNEZ(int Rs, const char* label); 3802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGE(int Rs, int Rt, const char* label); 3812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGEU(int Rs, int Rt, const char* label); 3822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGT(int Rs, int Rt, const char* label); 3832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BGTU(int Rs, int Rt, const char* label); 3842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLE(int Rs, int Rt, const char* label); 3852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLEU(int Rs, int Rt, const char* label); 3862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLT(int Rs, int Rt, const char* label); 3872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void BLTU(int Rs, int Rt, const char* label); 3882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if 0 3902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark - 3912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#pragma mark Misc... 3922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 3932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void NOP(void); 3952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void NOP2(void); 3962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void UNIMPL(void); 3972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 3992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindprivate: 4032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void string_detab(char *s); 4042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind void string_pad(char *s, int padded_len); 4052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ArmToMipsAssembler *mParent; 4072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sp<Assembly> mAssembly; 4082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* mBase; 4092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* mPC; 4102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* mPrologPC; 4112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind int64_t mDuration; 4122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if defined(WITH_LIB_HARDWARE) 4132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bool mQemuTracing; 4142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 4152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind struct branch_target_t { 4172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind inline branch_target_t() : label(0), pc(0) { } 4182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind inline branch_target_t(const char* l, uint32_t* p) 4192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind : label(l), pc(p) { } 4202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind const char* label; 4212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind uint32_t* pc; 4222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind Vector<branch_target_t> mBranchTargets; 4252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind KeyedVector< const char*, uint32_t* > mLabels; 4262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind KeyedVector< uint32_t*, const char* > mLabelsInverseMapping; 4272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind KeyedVector< uint32_t*, const char* > mComments; 4282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // opcode field of all instructions 4332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum opcode_field { 4342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind spec_op, regimm_op, j_op, jal_op, // 00 4352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind beq_op, bne_op, blez_op, bgtz_op, 4362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind addi_op, addiu_op, slti_op, sltiu_op, // 08 4372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind andi_op, ori_op, xori_op, lui_op, 4382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind cop0_op, cop1_op, cop2_op, cop1x_op, // 10 4392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind beql_op, bnel_op, blezl_op, bgtzl_op, 4402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind daddi_op, daddiu_op, ldl_op, ldr_op, // 18 4412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind spec2_op, jalx_op, mdmx_op, spec3_op, 4422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind lb_op, lh_op, lwl_op, lw_op, // 20 4432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind lbu_op, lhu_op, lwr_op, lwu_op, 4442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sb_op, sh_op, swl_op, sw_op, // 28 4452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sdl_op, sdr_op, swr_op, cache_op, 4462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ll_op, lwc1_op, lwc2_op, pref_op, // 30 4472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind lld_op, ldc1_op, ldc2_op, ld_op, 4482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sc_op, swc1_op, swc2_op, rsrv_3b_op, // 38 4492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind scd_op, sdc1_op, sdc2_op, sd_op 4502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // func field for special opcode 4542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum func_spec_op { 4552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sll_fn, movc_fn, srl_fn, sra_fn, // 00 4562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sllv_fn, pmon_fn, srlv_fn, srav_fn, 4572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind jr_fn, jalr_fn, movz_fn, movn_fn, // 08 4582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind syscall_fn, break_fn, spim_fn, sync_fn, 4592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind mfhi_fn, mthi_fn, mflo_fn, mtlo_fn, // 10 4602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dsllv_fn, rsrv_spec_2, dsrlv_fn, dsrav_fn, 4612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind mult_fn, multu_fn, div_fn, divu_fn, // 18 4622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dmult_fn, dmultu_fn, ddiv_fn, ddivu_fn, 4632bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind add_fn, addu_fn, sub_fn, subu_fn, // 20 4642bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind and_fn, or_fn, xor_fn, nor_fn, 4652bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind rsrv_spec_3, rsrv_spec_4, slt_fn, sltu_fn, // 28 4662bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dadd_fn, daddu_fn, dsub_fn, dsubu_fn, 4672bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind tge_fn, tgeu_fn, tlt_fn, tltu_fn, // 30 4682bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind teq_fn, rsrv_spec_5, tne_fn, rsrv_spec_6, 4692bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dsll_fn, rsrv_spec_7, dsrl_fn, dsra_fn, // 38 4702bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dsll32_fn, rsrv_spec_8, dsrl32_fn, dsra32_fn 4712bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4722bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // func field for spec2 opcode 4742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum func_spec2_op { 4752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind madd_fn, maddu_fn, mul_fn, rsrv_spec2_3, 4762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind msub_fn, msubu_fn, 4772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind clz_fn = 0x20, clo_fn, 4782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dclz_fn = 0x24, dclo_fn, 4792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind sdbbp_fn = 0x3f 4802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // func field for spec3 opcode 4832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum func_spec3_op { 4842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ext_fn, dextm_fn, dextu_fn, dext_fn, 4852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind ins_fn, dinsm_fn, dinsu_fn, dins_fn, 4862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bshfl_fn = 0x20, 4872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind dbshfl_fn = 0x24, 4882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind rdhwr_fn = 0x3b 4892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // sa field for spec3 opcodes, with BSHFL function 4922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum func_spec3_bshfl { 4932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind wsbh_fn = 0x02, 4942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind seb_fn = 0x10, 4952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind seh_fn = 0x18 4962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 4972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 4982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // rt field of regimm opcodes. 4992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum regimm_fn { 5002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bltz_fn, bgez_fn, bltzl_fn, bgezl_fn, 5012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind rsrv_ri_fn4, rsrv_ri_fn5, rsrv_ri_fn6, rsrv_ri_fn7, 5022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind tgei_fn, tgeiu_fn, tlti_fn, tltiu_fn, 5032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind teqi_fn, rsrv_ri_fn_0d, tnei_fn, rsrv_ri_fn0f, 5042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bltzal_fn, bgezal_fn, bltzall_fn, bgezall_fn, 5052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind bposge32_fn= 0x1c, 5062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind synci_fn = 0x1f 5072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 5082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // func field for mad opcodes (MIPS IV). 5112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum mad_func { 5122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind madd_fp_op = 0x08, msub_fp_op = 0x0a, 5132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind nmadd_fp_op = 0x0c, nmsub_fp_op = 0x0e 5142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 5152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind enum mips_inst_shifts { 5182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind OP_SHF = 26, 5192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind JTARGET_SHF = 0, 5202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind RS_SHF = 21, 5212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind RT_SHF = 16, 5222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind RD_SHF = 11, 5232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind RE_SHF = 6, 5242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind SA_SHF = RE_SHF, // synonym 5252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind IMM_SHF = 0, 5262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind FUNC_SHF = 0, 5272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // mask values 5292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind MSK_16 = 0xffff, 5302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind CACHEOP_SHF = 18, 5332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind CACHESEL_SHF = 16, 5342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind }; 5352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}; 5362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lindenum mips_regnames { 5382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_zero = 0, 5392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_at, R_v0, R_v1, R_a0, R_a1, R_a2, R_a3, 5402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_t0, R_t1, R_t2, R_t3, R_t4, R_t5, R_t6, R_t7, 5412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_s0, R_s1, R_s2, R_s3, R_s4, R_s5, R_s6, R_s7, 5422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_t8, R_t9, R_k0, R_k1, R_gp, R_sp, R_s8, R_ra, 5432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_lr = R_s8, 5442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind // arm regs 0-15 are mips regs 2-17 (meaning s0 & s1 are used) 5462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_at2 = R_s2, // R_at2 = 18 = s2 5472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_cmp = R_s3, // R_cmp = 19 = s3 5482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind R_cmp2 = R_s4 // R_cmp2 = 20 = s4 5492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}; 5502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind}; // namespace android 5542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 5552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif //ANDROID_MIPSASSEMBLER_H 556