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