17fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 27fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Copyright (C) 2011 The Android Open Source Project 37fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 47fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 57fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * you may not use this file except in compliance with the License. 67fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * You may obtain a copy of the License at 77fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 87fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * http://www.apache.org/licenses/LICENSE-2.0 97fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Unless required by applicable law or agreed to in writing, software 117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * distributed under the License is distributed on an "AS IS" BASIS, 127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * See the License for the specific language governing permissions and 147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * limitations under the License. 157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao */ 167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_COMPILER_UTILS_MIPS_ASSEMBLER_MIPS_H_ 18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_COMPILER_UTILS_MIPS_ASSEMBLER_MIPS_H_ 197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include <vector> 21761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes 22761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "constants_mips.h" 247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "globals.h" 257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "managed_register_mips.h" 26166db04e259ca51838c311891598664deeed85adIan Rogers#include "utils/assembler.h" 277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "offsets.h" 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "utils.h" 297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace art { 317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace mips { 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#if 0 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass Operand { 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao uint8_t mod() const { 367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (encoding_at(0) >> 6) & 3; 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register rm() const { 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<Register>(encoding_at(0) & 7); 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ScaleFactor scale() const { 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<ScaleFactor>((encoding_at(1) >> 6) & 3); 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register index() const { 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<Register>((encoding_at(1) >> 3) & 7); 497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register base() const { 527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<Register>(encoding_at(1) & 7); 537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int8_t disp8() const { 567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_GE(length_, 2); 577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<int8_t>(encoding_[length_ - 1]); 587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t disp32() const { 617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_GE(length_, 5); 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t value; 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao memcpy(&value, &encoding_[length_ - 4], sizeof(value)); 647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return value; 657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsRegister(Register reg) const { 687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return ((encoding_[0] & 0xF8) == 0xC0) // Addressing mode is register only. 697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao && ((encoding_[0] & 0x07) == reg); // Register codes match. 707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao protected: 737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Operand can be sub classed (e.g: Address). 747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Operand() : length_(0) { } 757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SetModRM(int mod, Register rm) { 777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_EQ(mod & ~3, 0); 787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao encoding_[0] = (mod << 6) | rm; 797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao length_ = 1; 807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SetSIB(ScaleFactor scale, Register index, Register base) { 837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_EQ(length_, 1); 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_EQ(scale & ~3, 0); 857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao encoding_[1] = (scale << 6) | (index << 3) | base; 867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao length_ = 2; 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SetDisp8(int8_t disp) { 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(length_ == 1 || length_ == 2); 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao encoding_[length_++] = static_cast<uint8_t>(disp); 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SetDisp32(int32_t disp) { 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(length_ == 1 || length_ == 2); 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int disp_size = sizeof(disp); 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao memmove(&encoding_[length_], &disp, disp_size); 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao length_ += disp_size; 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 1027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao byte length_; 1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao byte encoding_[6]; 1047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao byte padding_; 1057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao explicit Operand(Register reg) { SetModRM(3, reg); } 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Get the operand encoding byte at the given index. 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao uint8_t encoding_at(int index) const { 1107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_GE(index, 0); 1117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_LT(index, length_); 1127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return encoding_[index]; 1137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao friend class MipsAssembler; 1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DISALLOW_COPY_AND_ASSIGN(Operand); 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 1197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass Address : public Operand { 1227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 1237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register base, int32_t disp) { 1247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Init(base, disp); 1257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register base, Offset disp) { 1287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Init(base, disp.Int32Value()); 1297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register base, FrameOffset disp) { 1327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_EQ(base, ESP); 1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Init(ESP, disp.Int32Value()); 1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register base, MemberOffset disp) { 1377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Init(base, disp.Int32Value()); 1387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Init(Register base, int32_t disp) { 1417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (disp == 0 && base != EBP) { 1427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(0, base); 1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (base == ESP) SetSIB(TIMES_1, ESP, base); 1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (disp >= -128 && disp <= 127) { 1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(1, base); 1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (base == ESP) SetSIB(TIMES_1, ESP, base); 1477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetDisp8(disp); 1487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 1497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(2, base); 1507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (base == ESP) SetSIB(TIMES_1, ESP, base); 1517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetDisp32(disp); 1527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register index, ScaleFactor scale, int32_t disp) { 1577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(index, ESP); // Illegal addressing mode. 1587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(0, ESP); 1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetSIB(scale, index, EBP); 1607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetDisp32(disp); 1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address(Register base, Register index, ScaleFactor scale, int32_t disp) { 1647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(index, ESP); // Illegal addressing mode. 1657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (disp == 0 && base != EBP) { 1667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(0, ESP); 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetSIB(scale, index, base); 1687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (disp >= -128 && disp <= 127) { 1697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(1, ESP); 1707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetSIB(scale, index, base); 1717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetDisp8(disp); 1727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 1737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetModRM(2, ESP); 1747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetSIB(scale, index, base); 1757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SetDisp32(disp); 1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static Address Absolute(uword addr) { 1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address result; 1817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao result.SetModRM(0, EBP); 1827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao result.SetDisp32(addr); 1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return result; 1847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static Address Absolute(ThreadOffset addr) { 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return Absolute(addr.Int32Value()); 1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 1917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Address() {} 1927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DISALLOW_COPY_AND_ASSIGN(Address); 1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 1957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#endif 1977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoenum LoadOperandType { 1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadSignedByte, 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadUnsignedByte, 2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadSignedHalfword, 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadUnsignedHalfword, 2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadWord, 2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadWordPair, 2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadSWord, 2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kLoadDWord 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoenum StoreOperandType { 2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreByte, 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreHalfword, 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreWord, 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreWordPair, 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreSWord, 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kStoreDWord 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass MipsAssembler : public Assembler { 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsAssembler() {} 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual ~MipsAssembler() {} 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Emit Machine Instructions. 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Add(Register rd, Register rs, Register rt); 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Addu(Register rd, Register rs, Register rt); 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Addi(Register rt, Register rs, uint16_t imm16); 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Addiu(Register rt, Register rs, uint16_t imm16); 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sub(Register rd, Register rs, Register rt); 2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Subu(Register rd, Register rs, Register rt); 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mult(Register rs, Register rt); 2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Multu(Register rs, Register rt); 2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Div(Register rs, Register rt); 2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Divu(Register rs, Register rt); 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void And(Register rd, Register rs, Register rt); 2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Andi(Register rt, Register rs, uint16_t imm16); 2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Or(Register rd, Register rs, Register rt); 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Ori(Register rt, Register rs, uint16_t imm16); 2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Xor(Register rd, Register rs, Register rt); 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Xori(Register rt, Register rs, uint16_t imm16); 2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Nor(Register rd, Register rs, Register rt); 2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sll(Register rd, Register rs, int shamt); 2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Srl(Register rd, Register rs, int shamt); 2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sra(Register rd, Register rs, int shamt); 2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sllv(Register rd, Register rs, Register rt); 2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Srlv(Register rd, Register rs, Register rt); 2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Srav(Register rd, Register rs, Register rt); 2497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lb(Register rt, Register rs, uint16_t imm16); 2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lh(Register rt, Register rs, uint16_t imm16); 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lw(Register rt, Register rs, uint16_t imm16); 2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lbu(Register rt, Register rs, uint16_t imm16); 2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lhu(Register rt, Register rs, uint16_t imm16); 2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lui(Register rt, uint16_t imm16); 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mfhi(Register rd); 2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mflo(Register rd); 2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sb(Register rt, Register rs, uint16_t imm16); 2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sh(Register rt, Register rs, uint16_t imm16); 2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sw(Register rt, Register rs, uint16_t imm16); 2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Slt(Register rd, Register rs, Register rt); 2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sltu(Register rd, Register rs, Register rt); 2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Slti(Register rt, Register rs, uint16_t imm16); 2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sltiu(Register rt, Register rs, uint16_t imm16); 2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Beq(Register rt, Register rs, uint16_t imm16); 2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Bne(Register rt, Register rs, uint16_t imm16); 2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void J(uint32_t address); 2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Jal(uint32_t address); 2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Jr(Register rs); 2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Jalr(Register rs); 2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void AddS(FRegister fd, FRegister fs, FRegister ft); 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SubS(FRegister fd, FRegister fs, FRegister ft); 2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void MulS(FRegister fd, FRegister fs, FRegister ft); 2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void DivS(FRegister fd, FRegister fs, FRegister ft); 2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void AddD(DRegister fd, DRegister fs, DRegister ft); 2807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void SubD(DRegister fd, DRegister fs, DRegister ft); 2817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void MulD(DRegister fd, DRegister fs, DRegister ft); 2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void DivD(DRegister fd, DRegister fs, DRegister ft); 2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void MovS(FRegister fd, FRegister fs); 2847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void MovD(DRegister fd, DRegister fs); 2857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mfc1(Register rt, FRegister fs); 2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mtc1(FRegister ft, Register rs); 2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Lwc1(FRegister ft, Register rs, uint16_t imm16); 2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Ldc1(DRegister ft, Register rs, uint16_t imm16); 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Swc1(FRegister ft, Register rs, uint16_t imm16); 2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Sdc1(DRegister ft, Register rs, uint16_t imm16); 2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Break(); 2940703060875166106af3d490c6c264611aea67ec8jeffhao void Nop(); 2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Move(Register rt, Register rs); 2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Clear(Register rt); 2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Not(Register rt, Register rs); 2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Mul(Register rd, Register rs, Register rt); 2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Div(Register rd, Register rs, Register rt); 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Rem(Register rd, Register rs, Register rt); 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void AddConstant(Register rt, Register rs, int32_t value); 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LoadImmediate(Register rt, int32_t value); 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitLoad(ManagedRegister m_dst, Register src_register, int32_t src_offset, size_t size); 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LoadFromOffset(LoadOperandType type, Register reg, Register base, int32_t offset); 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LoadSFromOffset(FRegister reg, Register base, int32_t offset); 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LoadDFromOffset(DRegister reg, Register base, int32_t offset); 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void StoreToOffset(StoreOperandType type, Register reg, Register base, int32_t offset); 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void StoreFToOffset(FRegister reg, Register base, int32_t offset); 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void StoreDToOffset(DRegister reg, Register base, int32_t offset); 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#if 0 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsAssembler* lock(); 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void mfence(); 3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsAssembler* fs(); 3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Macros for High-level operations. 3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void AddImmediate(Register reg, const Immediate& imm); 3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LoadDoubleConstant(XmmRegister dst, double value); 3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void DoubleNegate(XmmRegister d); 3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void FloatNegate(XmmRegister f); 3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void DoubleAbs(XmmRegister reg); 3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void LockCmpxchgl(const Address& address, Register reg) { 3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lock()->cmpxchgl(address, reg); 3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Misc. functionality 3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int PreferredLoopAlignment() { return 16; } 3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Align(int alignment, int offset); 3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Debugging and bringup support. 3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Stop(const char* message); 3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#endif 3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Emit data (e.g. encoded instruction or immediate) to the instruction stream. 3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Emit(int32_t value); 3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitBranch(Register rt, Register rs, Label* label, bool equal); 3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitJump(Label* label, bool link); 3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Bind(Label* label, bool is_jump); 3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Overridden common assembler high-level functionality 3557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // 3567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Emit code that will create an activation on the stack 3587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void BuildFrame(size_t frame_size, ManagedRegister method_reg, 3597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const std::vector<ManagedRegister>& callee_save_regs, 3607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const std::vector<ManagedRegister>& entry_spills); 3617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Emit code that will remove an activation from the stack 3637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void RemoveFrame(size_t frame_size, 3647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const std::vector<ManagedRegister>& callee_save_regs); 3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void IncreaseFrameSize(size_t adjust); 3677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void DecreaseFrameSize(size_t adjust); 3687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Store routines 3707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Store(FrameOffset offs, ManagedRegister msrc, size_t size); 3717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreRef(FrameOffset dest, ManagedRegister msrc); 3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreRawPtr(FrameOffset dest, ManagedRegister msrc); 3737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 3757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 3767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreImmediateToThread(ThreadOffset dest, uint32_t imm, 3787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 3797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreStackOffsetToThread(ThreadOffset thr_offs, 3817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FrameOffset fr_offs, 3827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 3837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreStackPointerToThread(ThreadOffset thr_offs); 3857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void StoreSpanning(FrameOffset dest, ManagedRegister msrc, 3877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FrameOffset in_off, ManagedRegister mscratch); 3887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Load routines 3907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Load(ManagedRegister mdest, FrameOffset src, size_t size); 3917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Load(ManagedRegister mdest, ThreadOffset src, size_t size); 3937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void LoadRef(ManagedRegister dest, FrameOffset src); 3957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void LoadRef(ManagedRegister mdest, ManagedRegister base, 3977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MemberOffset offs); 3987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 3997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 4007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Offset offs); 4017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void LoadRawPtrFromThread(ManagedRegister mdest, 4037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ThreadOffset offs); 4047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Copying routines 4067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Move(ManagedRegister mdest, ManagedRegister msrc, size_t size); 4077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void CopyRawPtrFromThread(FrameOffset fr_offs, ThreadOffset thr_offs, 4097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void CopyRawPtrToThread(ThreadOffset thr_offs, FrameOffset fr_offs, 4127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void CopyRef(FrameOffset dest, FrameOffset src, 4157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(FrameOffset dest, FrameOffset src, ManagedRegister mscratch, size_t size); 4187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(FrameOffset dest, ManagedRegister src_base, Offset src_offset, 4207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, size_t size); 4217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 4237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, size_t size); 4247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, size_t size); 4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(ManagedRegister dest, Offset dest_offset, 4297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister src, Offset src_offset, 4307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, size_t size); 4317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 4337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, size_t size); 4347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void MemoryBarrier(ManagedRegister); 4367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Sign extension 4387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void SignExtend(ManagedRegister mreg, size_t size); 4397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Zero extension 4417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void ZeroExtend(ManagedRegister mreg, size_t size); 4427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Exploit fast access in managed code to Thread::Current() 4447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void GetCurrentThread(ManagedRegister tr); 4457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void GetCurrentThread(FrameOffset dest_offset, 4467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Set up out_reg to hold a Object** into the SIRT, or to be NULL if the 4497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // value is null and null_allowed. in_reg holds a possibly stale reference 4507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // that can be used to avoid loading the SIRT entry to see if the value is 4517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // NULL. 4527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void CreateSirtEntry(ManagedRegister out_reg, FrameOffset sirt_offset, 4537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister in_reg, bool null_allowed); 4547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Set up out_off to hold a Object** into the SIRT, or to be NULL if the 4567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // value is null and null_allowed. 4577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void CreateSirtEntry(FrameOffset out_off, FrameOffset sirt_offset, 4587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch, bool null_allowed); 4597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // src holds a SIRT entry (Object**) load this into dst 4617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void LoadReferenceFromSirt(ManagedRegister dst, 4627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister src); 4637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Heap::VerifyObject on src. In some cases (such as a reference to this) we 4657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // know that src may not be null. 4667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void VerifyObject(ManagedRegister src, bool could_be_null); 4677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void VerifyObject(FrameOffset src, bool could_be_null); 4687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Call to address held at [base+offset] 4707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Call(ManagedRegister base, Offset offset, 4717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Call(FrameOffset base, Offset offset, 4737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ManagedRegister mscratch); 4747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Call(ThreadOffset offset, ManagedRegister mscratch); 4757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Generate code to check if Thread::Current()->exception_ is non-null 4777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // and branch to a ExceptionSlowPath if it is. 4787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void ExceptionPoll(ManagedRegister mscratch, size_t stack_adjust); 4797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 4817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitR(int opcode, Register rs, Register rt, Register rd, int shamt, int funct); 4827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitI(int opcode, Register rs, Register rt, uint16_t imm); 4837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitJ(int opcode, int address); 4847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitFR(int opcode, int fmt, FRegister ft, FRegister fs, FRegister fd, int funct); 4857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void EmitFI(int opcode, int fmt, FRegister rt, uint16_t imm); 4867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t EncodeBranchOffset(int offset, int32_t inst, bool is_jump); 4887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int DecodeBranchOffset(int32_t inst, bool is_jump); 4897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DISALLOW_COPY_AND_ASSIGN(MipsAssembler); 4917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 4927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// Slowpath entered when Thread::Current()->_exception is non-null 4947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass MipsExceptionSlowPath : public SlowPath { 4957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 4967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao explicit MipsExceptionSlowPath(MipsManagedRegister scratch, size_t stack_adjust) 4977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao : scratch_(scratch), stack_adjust_(stack_adjust) {} 4987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao virtual void Emit(Assembler *sp_asm); 4997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 5007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const MipsManagedRegister scratch_; 5017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const size_t stack_adjust_; 5027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 5037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 5047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 5057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 5067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 507166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_COMPILER_UTILS_MIPS_ASSEMBLER_MIPS_H_ 508