183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 47516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 57516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#ifndef V8_MIPS_CODE_STUBS_ARM_H_ 67516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define V8_MIPS_CODE_STUBS_ARM_H_ 77516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 87516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace v8 { 97516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace internal { 107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 12ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgvoid ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code); 13ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 14ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 152c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgclass StringHelper : public AllStatic { 162c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org public: 172c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // Generate code for copying a large number of characters. This function 182c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // is allowed to spend extra time setting up conditions to make copying 192c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // faster. Copying of overlapping regions is not supported. 202c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // Dest register ends at the position after the last character written. 218ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org static void GenerateCopyCharacters(MacroAssembler* masm, 228ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org Register dest, 238ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org Register src, 248ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org Register count, 258ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org Register scratch, 268ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org String::Encoding encoding); 272c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Compares two flat one-byte strings and returns result in v0. 292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static void GenerateCompareFlatOneByteStrings( 302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org MacroAssembler* masm, Register left, Register right, Register scratch1, 312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Register scratch2, Register scratch3, Register scratch4); 322c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Compares two flat one-byte strings for equality and returns result in v0. 342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static void GenerateFlatOneByteStringEquals(MacroAssembler* masm, 352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Register left, Register right, 369aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register scratch1, 379aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register scratch2, 382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Register scratch3); 397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org private: 412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org static void GenerateOneByteCharsCompareLoop( 422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org MacroAssembler* masm, Register left, Register right, Register length, 432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Register scratch1, Register scratch2, Register scratch3, 442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org Label* chars_not_equal); 457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 469aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper); 477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}; 487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 49d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 504954674151afa960af66efb4831df06bde727333yangguo@chromium.orgclass StoreRegistersStateStub: public PlatformCodeStub { 514954674151afa960af66efb4831df06bde727333yangguo@chromium.org public: 5251e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org explicit StoreRegistersStateStub(Isolate* isolate) 5351e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org : PlatformCodeStub(isolate) {} 544954674151afa960af66efb4831df06bde727333yangguo@chromium.org 554954674151afa960af66efb4831df06bde727333yangguo@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 564954674151afa960af66efb4831df06bde727333yangguo@chromium.org 5742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org private: 586313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 5942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org DEFINE_PLATFORM_CODE_STUB(StoreRegistersState, PlatformCodeStub); 604954674151afa960af66efb4831df06bde727333yangguo@chromium.org}; 614954674151afa960af66efb4831df06bde727333yangguo@chromium.org 6242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org 634954674151afa960af66efb4831df06bde727333yangguo@chromium.orgclass RestoreRegistersStateStub: public PlatformCodeStub { 644954674151afa960af66efb4831df06bde727333yangguo@chromium.org public: 6551e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org explicit RestoreRegistersStateStub(Isolate* isolate) 6651e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org : PlatformCodeStub(isolate) {} 674954674151afa960af66efb4831df06bde727333yangguo@chromium.org 684954674151afa960af66efb4831df06bde727333yangguo@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 694954674151afa960af66efb4831df06bde727333yangguo@chromium.org 7042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org private: 716313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 7242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org DEFINE_PLATFORM_CODE_STUB(RestoreRegistersState, PlatformCodeStub); 734954674151afa960af66efb4831df06bde727333yangguo@chromium.org}; 747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// This stub can convert a signed int32 to a heap number (double). It does 777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// not work for int32s that are in Smi range! No GC occurs during this stub 787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// so you don't have to set up the frame. 7959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgclass WriteInt32ToHeapNumberStub : public PlatformCodeStub { 807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public: 819aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org WriteInt32ToHeapNumberStub(Isolate* isolate, Register the_int, 829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register the_heap_number, Register scratch, 837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org Register scratch2) 849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org : PlatformCodeStub(isolate) { 859aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org minor_key_ = IntRegisterBits::encode(the_int.code()) | 869aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org HeapNumberRegisterBits::encode(the_heap_number.code()) | 879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ScratchRegisterBits::encode(scratch.code()) | 889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org SignRegisterBits::encode(scratch2.code()); 899aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(IntRegisterBits::is_valid(the_int.code())); 909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(HeapNumberRegisterBits::is_valid(the_heap_number.code())); 919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(ScratchRegisterBits::is_valid(scratch.code())); 929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(SignRegisterBits::is_valid(scratch2.code())); 93b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 94b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 958432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); 967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org private: 989aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register the_int() const { 999aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(IntRegisterBits::decode(minor_key_)); 1009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 1019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 1029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register the_heap_number() const { 1039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(HeapNumberRegisterBits::decode(minor_key_)); 1049aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 1059aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 1069aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register scratch() const { 1079aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(ScratchRegisterBits::decode(minor_key_)); 1089aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 1099aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 1109aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register sign() const { 1119aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(SignRegisterBits::decode(minor_key_)); 1129aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 1137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // Minor key encoding in 16 bits. 1157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org class IntRegisterBits: public BitField<int, 0, 4> {}; 1167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org class HeapNumberRegisterBits: public BitField<int, 4, 4> {}; 1177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org class ScratchRegisterBits: public BitField<int, 8, 4> {}; 118b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class SignRegisterBits: public BitField<int, 12, 4> {}; 1197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 12142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org DEFINE_PLATFORM_CODE_STUB(WriteInt32ToHeapNumber, PlatformCodeStub); 1227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}; 1237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 1247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 12559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgclass RecordWriteStub: public PlatformCodeStub { 126b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org public: 127f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org RecordWriteStub(Isolate* isolate, 128f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org Register object, 129b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register value, 130b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register address, 131b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org RememberedSetAction remembered_set_action, 132b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org SaveFPRegsMode fp_mode) 133f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org : PlatformCodeStub(isolate), 134b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org regs_(object, // An input reg. 135b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org address, // An input reg. 136b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org value) { // One scratch reg. 1379aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org minor_key_ = ObjectBits::encode(object.code()) | 1389aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ValueBits::encode(value.code()) | 1399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org AddressBits::encode(address.code()) | 1409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org RememberedSetActionBits::encode(remembered_set_action) | 1419aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org SaveFPRegsModeBits::encode(fp_mode); 142b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 143b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 14442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org RecordWriteStub(uint32_t key, Isolate* isolate) 14542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} 14642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org 147b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org enum Mode { 148b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org STORE_BUFFER_ONLY, 149b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org INCREMENTAL, 150b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org INCREMENTAL_COMPACTION 151b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org }; 152b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 153b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org virtual bool SometimesSetsUpAFrame() { return false; } 154b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 155b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org static void PatchBranchIntoNop(MacroAssembler* masm, int pos) { 156b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org const unsigned offset = masm->instr_at(pos) & kImm16Mask; 157b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->instr_at_put(pos, BNE | (zero_reg.code() << kRsShift) | 158b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org (zero_reg.code() << kRtShift) | (offset & kImm16Mask)); 159e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Assembler::IsBne(masm->instr_at(pos))); 160b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 161b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 162b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org static void PatchNopIntoBranch(MacroAssembler* masm, int pos) { 163b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org const unsigned offset = masm->instr_at(pos) & kImm16Mask; 164b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->instr_at_put(pos, BEQ | (zero_reg.code() << kRsShift) | 165b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org (zero_reg.code() << kRtShift) | (offset & kImm16Mask)); 166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Assembler::IsBeq(masm->instr_at(pos))); 167b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 168b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 169b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org static Mode GetMode(Code* stub) { 170b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Instr first_instruction = Assembler::instr_at(stub->instruction_start()); 171b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Instr second_instruction = Assembler::instr_at(stub->instruction_start() + 172b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 2 * Assembler::kInstrSize); 173b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 174b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (Assembler::IsBeq(first_instruction)) { 175b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org return INCREMENTAL; 176b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 177b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 178e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Assembler::IsBne(first_instruction)); 179b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 180b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (Assembler::IsBeq(second_instruction)) { 181b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org return INCREMENTAL_COMPACTION; 182b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 183b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 184e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Assembler::IsBne(second_instruction)); 185b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 186b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org return STORE_BUFFER_ONLY; 187b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 188b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 189b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org static void Patch(Code* stub, Mode mode) { 190b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org MacroAssembler masm(NULL, 191b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org stub->instruction_start(), 192b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org stub->instruction_size()); 193b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org switch (mode) { 194b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org case STORE_BUFFER_ONLY: 195e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(GetMode(stub) == INCREMENTAL || 196b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org GetMode(stub) == INCREMENTAL_COMPACTION); 197b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org PatchBranchIntoNop(&masm, 0); 198b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org PatchBranchIntoNop(&masm, 2 * Assembler::kInstrSize); 199b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org break; 200b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org case INCREMENTAL: 201e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(GetMode(stub) == STORE_BUFFER_ONLY); 202b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org PatchNopIntoBranch(&masm, 0); 203b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org break; 204b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org case INCREMENTAL_COMPACTION: 205e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(GetMode(stub) == STORE_BUFFER_ONLY); 206b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org PatchNopIntoBranch(&masm, 2 * Assembler::kInstrSize); 207b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org break; 208b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(GetMode(stub) == mode); 2105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CpuFeatures::FlushICache(stub->instruction_start(), 2115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 4 * Assembler::kInstrSize); 212b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 213b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 2146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 2156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org 216b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org private: 217b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // This is a helper class for freeing up 3 scratch registers. The input is 218b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // two registers that must be preserved and one scratch register provided by 219b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // the caller. 220b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class RegisterAllocation { 221b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org public: 222b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org RegisterAllocation(Register object, 223b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register address, 224b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register scratch0) 225b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org : object_(object), 226b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org address_(address), 227b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org scratch0_(scratch0) { 228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!AreAliased(scratch0, object, address, no_reg)); 2298fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org scratch1_ = GetRegisterThatIsNotOneOf(object_, address_, scratch0_); 230b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 231b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 232b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org void Save(MacroAssembler* masm) { 233e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!AreAliased(object_, address_, scratch1_, scratch0_)); 234b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // We don't have to save scratch0_ because it was given to us as 235b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // a scratch register. 236b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->push(scratch1_); 237b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 238b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 239b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org void Restore(MacroAssembler* masm) { 240b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->pop(scratch1_); 241b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 242b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 243b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // If we have to call into C then we need to save and restore all caller- 244b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // saved registers that were not already preserved. The scratch registers 245b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // will be restored by other means so we don't bother pushing them here. 246b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) { 247b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->MultiPush((kJSCallerSaved | ra.bit()) & ~scratch1_.bit()); 248b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (mode == kSaveFPRegs) { 249b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->MultiPushFPU(kCallerSavedFPU); 250b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 251b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 252b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 253b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org inline void RestoreCallerSaveRegisters(MacroAssembler*masm, 254b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org SaveFPRegsMode mode) { 255b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org if (mode == kSaveFPRegs) { 256b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->MultiPopFPU(kCallerSavedFPU); 257b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 258b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org masm->MultiPop((kJSCallerSaved | ra.bit()) & ~scratch1_.bit()); 259b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 260b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 261b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org inline Register object() { return object_; } 262b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org inline Register address() { return address_; } 263b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org inline Register scratch0() { return scratch0_; } 264b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org inline Register scratch1() { return scratch1_; } 265b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 266b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org private: 267b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register object_; 268b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register address_; 269b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register scratch0_; 270b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Register scratch1_; 271b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 272b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org friend class RecordWriteStub; 273b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org }; 274b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 275b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org enum OnNoNeedToInformIncrementalMarker { 276b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org kReturnOnNoNeedToInformIncrementalMarker, 277b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org kUpdateRememberedSetOnNoNeedToInformIncrementalMarker 278b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org }; 279b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 28042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org virtual inline Major MajorKey() const FINAL OVERRIDE { return RecordWrite; } 2819aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 28242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org virtual void Generate(MacroAssembler* masm) OVERRIDE; 283b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org void GenerateIncremental(MacroAssembler* masm, Mode mode); 284b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org void CheckNeedsToInformIncrementalMarker( 285b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org MacroAssembler* masm, 286b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org OnNoNeedToInformIncrementalMarker on_no_need, 287b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Mode mode); 288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void InformIncrementalMarker(MacroAssembler* masm); 289b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 2909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org void Activate(Code* code) { 2919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); 2929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 293b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 2949aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register object() const { 2959aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(ObjectBits::decode(minor_key_)); 296b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 297b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 2989aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register value() const { 2999aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(ValueBits::decode(minor_key_)); 3009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 3019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org Register address() const { 3039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return Register::from_code(AddressBits::decode(minor_key_)); 3049aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 3059aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3069aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org RememberedSetAction remembered_set_action() const { 3079aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return RememberedSetActionBits::decode(minor_key_); 3089aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 3099aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3109aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org SaveFPRegsMode save_fp_regs_mode() const { 3119aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return SaveFPRegsModeBits::decode(minor_key_); 312b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org } 313b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 314b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class ObjectBits: public BitField<int, 0, 5> {}; 315b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class ValueBits: public BitField<int, 5, 5> {}; 316b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class AddressBits: public BitField<int, 10, 5> {}; 317b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class RememberedSetActionBits: public BitField<RememberedSetAction, 15, 1> {}; 318b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 16, 1> {}; 319b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 320b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org Label slow_; 321b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org RegisterAllocation regs_; 3229aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3239aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DISALLOW_COPY_AND_ASSIGN(RecordWriteStub); 324b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org}; 325b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 326b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 3277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// Trampoline stub to call into native code. To call safely into native code 3287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// in the presence of compacting GC (which can move code objects) we need to 3297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// keep the code which called into native pinned in the memory. Currently the 3307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// simplest approach is to generate such stub early enough so it can never be 3317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// moved by GC 33259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgclass DirectCEntryStub: public PlatformCodeStub { 3337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org public: 334f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org explicit DirectCEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 3357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org void GenerateCall(MacroAssembler* masm, Register target); 3367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 3377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org private: 3387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool NeedsImmovableCode() { return true; } 3399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org 3406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 34142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org DEFINE_PLATFORM_CODE_STUB(DirectCEntry, PlatformCodeStub); 3427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}; 3437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 34483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 3459faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.orgclass NameDictionaryLookupStub: public PlatformCodeStub { 34683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org public: 34783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; 34883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 349f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org NameDictionaryLookupStub(Isolate* isolate, LookupMode mode) 3509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org : PlatformCodeStub(isolate) { 3519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org minor_key_ = LookupModeBits::encode(mode); 3529aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 35383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 354394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static void GenerateNegativeLookup(MacroAssembler* masm, 355394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Label* miss, 356394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Label* done, 357394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Register receiver, 358394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Register properties, 3599faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org Handle<Name> name, 360394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Register scratch0); 361394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 36283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static void GeneratePositiveLookup(MacroAssembler* masm, 36383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Label* miss, 36483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Label* done, 36583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Register elements, 36683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Register name, 36783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Register r0, 36883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Register r1); 36983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 370c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com virtual bool SometimesSetsUpAFrame() { return false; } 371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 37283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org private: 37383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static const int kInlinedProbes = 4; 37483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static const int kTotalProbes = 20; 37583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 37683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static const int kCapacityOffset = 3779faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org NameDictionary::kHeaderSize + 3789faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org NameDictionary::kCapacityIndex * kPointerSize; 37983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 38083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static const int kElementsStartOffset = 3819faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org NameDictionary::kHeaderSize + 3829faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org NameDictionary::kElementsStartIndex * kPointerSize; 38383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 3849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LookupMode mode() const { return LookupModeBits::decode(minor_key_); } 38583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 38683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org class LookupModeBits: public BitField<LookupMode, 0, 1> {}; 38783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 3886313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 38942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org DEFINE_PLATFORM_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); 39083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}; 3917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} } // namespace v8::internal 3947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 3957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif // V8_MIPS_CODE_STUBS_ARM_H_ 396