| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 | 76 |
| 77 void MacroAssembler::StoreRoot(Register source, | 77 void MacroAssembler::StoreRoot(Register source, |
| 78 Heap::RootListIndex index, | 78 Heap::RootListIndex index, |
| 79 Condition cond, | 79 Condition cond, |
| 80 Register src1, const Operand& src2) { | 80 Register src1, const Operand& src2) { |
| 81 Branch(2, NegateCondition(cond), src1, src2); | 81 Branch(2, NegateCondition(cond), src1, src2); |
| 82 sw(source, MemOperand(s6, index << kPointerSizeLog2)); | 82 sw(source, MemOperand(s6, index << kPointerSizeLog2)); |
| 83 } | 83 } |
| 84 | 84 |
| 85 | 85 |
| 86 void MacroAssembler::LoadHeapObject(Register result, | |
| 87 Handle<HeapObject> object) { | |
| 88 AllowDeferredHandleDereference using_raw_address; | |
| 89 if (isolate()->heap()->InNewSpace(*object)) { | |
| 90 Handle<Cell> cell = isolate()->factory()->NewCell(object); | |
| 91 li(result, Operand(cell)); | |
| 92 lw(result, FieldMemOperand(result, Cell::kValueOffset)); | |
| 93 } else { | |
| 94 li(result, Operand(object)); | |
| 95 } | |
| 96 } | |
| 97 | |
| 98 | |
| 99 // Push and pop all registers that can hold pointers. | 86 // Push and pop all registers that can hold pointers. |
| 100 void MacroAssembler::PushSafepointRegisters() { | 87 void MacroAssembler::PushSafepointRegisters() { |
| 101 // Safepoints expect a block of kNumSafepointRegisters values on the | 88 // Safepoints expect a block of kNumSafepointRegisters values on the |
| 102 // stack, so adjust the stack for unsaved registers. | 89 // stack, so adjust the stack for unsaved registers. |
| 103 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; | 90 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
| 104 ASSERT(num_unsaved >= 0); | 91 ASSERT(num_unsaved >= 0); |
| 105 if (num_unsaved > 0) { | 92 if (num_unsaved > 0) { |
| 106 Subu(sp, sp, Operand(num_unsaved * kPointerSize)); | 93 Subu(sp, sp, Operand(num_unsaved * kPointerSize)); |
| 107 } | 94 } |
| 108 MultiPush(kSafepointSavedRegisters); | 95 MultiPush(kSafepointSavedRegisters); |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 sll(rd, rs, (0x20 - rt.imm32_) & 0x1f); | 748 sll(rd, rs, (0x20 - rt.imm32_) & 0x1f); |
| 762 or_(rd, rd, at); | 749 or_(rd, rd, at); |
| 763 } | 750 } |
| 764 } | 751 } |
| 765 } | 752 } |
| 766 } | 753 } |
| 767 | 754 |
| 768 | 755 |
| 769 //------------Pseudo-instructions------------- | 756 //------------Pseudo-instructions------------- |
| 770 | 757 |
| 758 void MacroAssembler::li(Register dst, Handle<Object> value, LiFlags mode) { |
| 759 AllowDeferredHandleDereference smi_check; |
| 760 if (value->IsSmi()) { |
| 761 li(dst, Operand(value), mode); |
| 762 } else { |
| 763 ASSERT(value->IsHeapObject()); |
| 764 if (isolate()->heap()->InNewSpace(*value)) { |
| 765 Handle<Cell> cell = isolate()->factory()->NewCell(value); |
| 766 li(dst, Operand(cell)); |
| 767 lw(dst, FieldMemOperand(dst, Cell::kValueOffset)); |
| 768 } else { |
| 769 li(dst, Operand(value)); |
| 770 } |
| 771 } |
| 772 } |
| 773 |
| 774 |
| 771 void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { | 775 void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
| 772 ASSERT(!j.is_reg()); | 776 ASSERT(!j.is_reg()); |
| 773 BlockTrampolinePoolScope block_trampoline_pool(this); | 777 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 774 if (!MustUseReg(j.rmode_) && mode == OPTIMIZE_SIZE) { | 778 if (!MustUseReg(j.rmode_) && mode == OPTIMIZE_SIZE) { |
| 775 // Normal load of an immediate value which does not need Relocation Info. | 779 // Normal load of an immediate value which does not need Relocation Info. |
| 776 if (is_int16(j.imm32_)) { | 780 if (is_int16(j.imm32_)) { |
| 777 addiu(rd, zero_reg, j.imm32_); | 781 addiu(rd, zero_reg, j.imm32_); |
| 778 } else if (!(j.imm32_ & kHiMask)) { | 782 } else if (!(j.imm32_ & kHiMask)) { |
| 779 ori(rd, zero_reg, j.imm32_); | 783 ori(rd, zero_reg, j.imm32_); |
| 780 } else if (!(j.imm32_ & kImm16Mask)) { | 784 } else if (!(j.imm32_ & kImm16Mask)) { |
| (...skipping 2909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3690 void MacroAssembler::InvokeFunction(Handle<JSFunction> function, | 3694 void MacroAssembler::InvokeFunction(Handle<JSFunction> function, |
| 3691 const ParameterCount& expected, | 3695 const ParameterCount& expected, |
| 3692 const ParameterCount& actual, | 3696 const ParameterCount& actual, |
| 3693 InvokeFlag flag, | 3697 InvokeFlag flag, |
| 3694 const CallWrapper& call_wrapper, | 3698 const CallWrapper& call_wrapper, |
| 3695 CallKind call_kind) { | 3699 CallKind call_kind) { |
| 3696 // You can't call a function without a valid frame. | 3700 // You can't call a function without a valid frame. |
| 3697 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 3701 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
| 3698 | 3702 |
| 3699 // Get the function and setup the context. | 3703 // Get the function and setup the context. |
| 3700 LoadHeapObject(a1, function); | 3704 li(a1, function); |
| 3701 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 3705 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 3702 | 3706 |
| 3703 // We call indirectly through the code field in the function to | 3707 // We call indirectly through the code field in the function to |
| 3704 // allow recompilation to take effect without changing any of the | 3708 // allow recompilation to take effect without changing any of the |
| 3705 // call sites. | 3709 // call sites. |
| 3706 lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); | 3710 lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
| 3707 InvokeCode(a3, expected, actual, flag, call_wrapper, call_kind); | 3711 InvokeCode(a3, expected, actual, flag, call_wrapper, call_kind); |
| 3708 } | 3712 } |
| 3709 | 3713 |
| 3710 | 3714 |
| (...skipping 1999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5710 opcode == BGTZL); | 5714 opcode == BGTZL); |
| 5711 opcode = (cond == eq) ? BEQ : BNE; | 5715 opcode = (cond == eq) ? BEQ : BNE; |
| 5712 instr = (instr & ~kOpcodeMask) | opcode; | 5716 instr = (instr & ~kOpcodeMask) | opcode; |
| 5713 masm_.emit(instr); | 5717 masm_.emit(instr); |
| 5714 } | 5718 } |
| 5715 | 5719 |
| 5716 | 5720 |
| 5717 } } // namespace v8::internal | 5721 } } // namespace v8::internal |
| 5718 | 5722 |
| 5719 #endif // V8_TARGET_ARCH_MIPS | 5723 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |