| 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 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 if (destination == kCoreRegisters) { | 655 if (destination == kCoreRegisters) { |
| 656 __ Move(a2, a3, f14); | 656 __ Move(a2, a3, f14); |
| 657 __ Move(a0, a1, f12); | 657 __ Move(a0, a1, f12); |
| 658 } | 658 } |
| 659 } else { | 659 } else { |
| 660 ASSERT(destination == kCoreRegisters); | 660 ASSERT(destination == kCoreRegisters); |
| 661 // Write Smi from a0 to a3 and a2 in double format. | 661 // Write Smi from a0 to a3 and a2 in double format. |
| 662 __ mov(scratch1, a0); | 662 __ mov(scratch1, a0); |
| 663 ConvertToDoubleStub stub1(a3, a2, scratch1, scratch2); | 663 ConvertToDoubleStub stub1(a3, a2, scratch1, scratch2); |
| 664 __ push(ra); | 664 __ push(ra); |
| 665 __ Call(stub1.GetCode()); | 665 __ Call(stub1.GetCode(masm->isolate())); |
| 666 // Write Smi from a1 to a1 and a0 in double format. | 666 // Write Smi from a1 to a1 and a0 in double format. |
| 667 __ mov(scratch1, a1); | 667 __ mov(scratch1, a1); |
| 668 ConvertToDoubleStub stub2(a1, a0, scratch1, scratch2); | 668 ConvertToDoubleStub stub2(a1, a0, scratch1, scratch2); |
| 669 __ Call(stub2.GetCode()); | 669 __ Call(stub2.GetCode(masm->isolate())); |
| 670 __ pop(ra); | 670 __ pop(ra); |
| 671 } | 671 } |
| 672 } | 672 } |
| 673 | 673 |
| 674 | 674 |
| 675 void FloatingPointHelper::LoadNumber(MacroAssembler* masm, | 675 void FloatingPointHelper::LoadNumber(MacroAssembler* masm, |
| 676 Destination destination, | 676 Destination destination, |
| 677 Register object, | 677 Register object, |
| 678 FPURegister dst, | 678 FPURegister dst, |
| 679 Register dst1, | 679 Register dst1, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 if (destination == kCoreRegisters) { | 722 if (destination == kCoreRegisters) { |
| 723 // Load the converted smi to dst1 and dst2 in double format. | 723 // Load the converted smi to dst1 and dst2 in double format. |
| 724 __ Move(dst1, dst2, dst); | 724 __ Move(dst1, dst2, dst); |
| 725 } | 725 } |
| 726 } else { | 726 } else { |
| 727 ASSERT(destination == kCoreRegisters); | 727 ASSERT(destination == kCoreRegisters); |
| 728 // Write smi to dst1 and dst2 double format. | 728 // Write smi to dst1 and dst2 double format. |
| 729 __ mov(scratch1, object); | 729 __ mov(scratch1, object); |
| 730 ConvertToDoubleStub stub(dst2, dst1, scratch1, scratch2); | 730 ConvertToDoubleStub stub(dst2, dst1, scratch1, scratch2); |
| 731 __ push(ra); | 731 __ push(ra); |
| 732 __ Call(stub.GetCode()); | 732 __ Call(stub.GetCode(masm->isolate())); |
| 733 __ pop(ra); | 733 __ pop(ra); |
| 734 } | 734 } |
| 735 | 735 |
| 736 __ bind(&done); | 736 __ bind(&done); |
| 737 } | 737 } |
| 738 | 738 |
| 739 | 739 |
| 740 void FloatingPointHelper::ConvertNumberToInt32(MacroAssembler* masm, | 740 void FloatingPointHelper::ConvertNumberToInt32(MacroAssembler* masm, |
| 741 Register object, | 741 Register object, |
| 742 Register dst, | 742 Register dst, |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 sign_.is(a0)) { | 1173 sign_.is(a0)) { |
| 1174 return true; | 1174 return true; |
| 1175 } | 1175 } |
| 1176 // Other register combinations are generated as and when they are needed, | 1176 // Other register combinations are generated as and when they are needed, |
| 1177 // so it is unsafe to call them from stubs (we can't generate a stub while | 1177 // so it is unsafe to call them from stubs (we can't generate a stub while |
| 1178 // we are generating a stub). | 1178 // we are generating a stub). |
| 1179 return false; | 1179 return false; |
| 1180 } | 1180 } |
| 1181 | 1181 |
| 1182 | 1182 |
| 1183 void WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime() { | 1183 void WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime( |
| 1184 Isolate* isolate) { |
| 1184 WriteInt32ToHeapNumberStub stub1(a1, v0, a2, a3); | 1185 WriteInt32ToHeapNumberStub stub1(a1, v0, a2, a3); |
| 1185 WriteInt32ToHeapNumberStub stub2(a2, v0, a3, a0); | 1186 WriteInt32ToHeapNumberStub stub2(a2, v0, a3, a0); |
| 1186 stub1.GetCode()->set_is_pregenerated(true); | 1187 stub1.GetCode(isolate)->set_is_pregenerated(true); |
| 1187 stub2.GetCode()->set_is_pregenerated(true); | 1188 stub2.GetCode(isolate)->set_is_pregenerated(true); |
| 1188 } | 1189 } |
| 1189 | 1190 |
| 1190 | 1191 |
| 1191 // See comment for class, this does NOT work for int32's that are in Smi range. | 1192 // See comment for class, this does NOT work for int32's that are in Smi range. |
| 1192 void WriteInt32ToHeapNumberStub::Generate(MacroAssembler* masm) { | 1193 void WriteInt32ToHeapNumberStub::Generate(MacroAssembler* masm) { |
| 1193 Label max_negative_int; | 1194 Label max_negative_int; |
| 1194 // the_int_ has the answer which is a signed int32 but not a Smi. | 1195 // the_int_ has the answer which is a signed int32 but not a Smi. |
| 1195 // We test for the special value that has a different exponent. | 1196 // We test for the special value that has a different exponent. |
| 1196 STATIC_ASSERT(HeapNumber::kSignMask == 0x80000000u); | 1197 STATIC_ASSERT(HeapNumber::kSignMask == 0x80000000u); |
| 1197 // Test sign, and save for later conditionals. | 1198 // Test sign, and save for later conditionals. |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 __ ldc1(f12, FieldMemOperand(lhs, HeapNumber::kValueOffset)); | 1375 __ ldc1(f12, FieldMemOperand(lhs, HeapNumber::kValueOffset)); |
| 1375 } else { | 1376 } else { |
| 1376 // Load lhs to a double in a2, a3. | 1377 // Load lhs to a double in a2, a3. |
| 1377 __ lw(a3, FieldMemOperand(lhs, HeapNumber::kValueOffset + 4)); | 1378 __ lw(a3, FieldMemOperand(lhs, HeapNumber::kValueOffset + 4)); |
| 1378 __ lw(a2, FieldMemOperand(lhs, HeapNumber::kValueOffset)); | 1379 __ lw(a2, FieldMemOperand(lhs, HeapNumber::kValueOffset)); |
| 1379 | 1380 |
| 1380 // Write Smi from rhs to a1 and a0 in double format. t5 is scratch. | 1381 // Write Smi from rhs to a1 and a0 in double format. t5 is scratch. |
| 1381 __ mov(t6, rhs); | 1382 __ mov(t6, rhs); |
| 1382 ConvertToDoubleStub stub1(a1, a0, t6, t5); | 1383 ConvertToDoubleStub stub1(a1, a0, t6, t5); |
| 1383 __ push(ra); | 1384 __ push(ra); |
| 1384 __ Call(stub1.GetCode()); | 1385 __ Call(stub1.GetCode(masm->isolate())); |
| 1385 | 1386 |
| 1386 __ pop(ra); | 1387 __ pop(ra); |
| 1387 } | 1388 } |
| 1388 | 1389 |
| 1389 // We now have both loaded as doubles. | 1390 // We now have both loaded as doubles. |
| 1390 __ jmp(both_loaded_as_doubles); | 1391 __ jmp(both_loaded_as_doubles); |
| 1391 | 1392 |
| 1392 __ bind(&lhs_is_smi); | 1393 __ bind(&lhs_is_smi); |
| 1393 // Lhs is a Smi. Check whether the non-smi is a heap number. | 1394 // Lhs is a Smi. Check whether the non-smi is a heap number. |
| 1394 __ GetObjectType(rhs, t4, t4); | 1395 __ GetObjectType(rhs, t4, t4); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1409 CpuFeatures::Scope scope(FPU); | 1410 CpuFeatures::Scope scope(FPU); |
| 1410 __ sra(at, lhs, kSmiTagSize); | 1411 __ sra(at, lhs, kSmiTagSize); |
| 1411 __ mtc1(at, f12); | 1412 __ mtc1(at, f12); |
| 1412 __ cvt_d_w(f12, f12); | 1413 __ cvt_d_w(f12, f12); |
| 1413 __ ldc1(f14, FieldMemOperand(rhs, HeapNumber::kValueOffset)); | 1414 __ ldc1(f14, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
| 1414 } else { | 1415 } else { |
| 1415 // Convert lhs to a double format. t5 is scratch. | 1416 // Convert lhs to a double format. t5 is scratch. |
| 1416 __ mov(t6, lhs); | 1417 __ mov(t6, lhs); |
| 1417 ConvertToDoubleStub stub2(a3, a2, t6, t5); | 1418 ConvertToDoubleStub stub2(a3, a2, t6, t5); |
| 1418 __ push(ra); | 1419 __ push(ra); |
| 1419 __ Call(stub2.GetCode()); | 1420 __ Call(stub2.GetCode(masm->isolate())); |
| 1420 __ pop(ra); | 1421 __ pop(ra); |
| 1421 // Load rhs to a double in a1, a0. | 1422 // Load rhs to a double in a1, a0. |
| 1422 if (rhs.is(a0)) { | 1423 if (rhs.is(a0)) { |
| 1423 __ lw(a1, FieldMemOperand(rhs, HeapNumber::kValueOffset + 4)); | 1424 __ lw(a1, FieldMemOperand(rhs, HeapNumber::kValueOffset + 4)); |
| 1424 __ lw(a0, FieldMemOperand(rhs, HeapNumber::kValueOffset)); | 1425 __ lw(a0, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
| 1425 } else { | 1426 } else { |
| 1426 __ lw(a0, FieldMemOperand(rhs, HeapNumber::kValueOffset)); | 1427 __ lw(a0, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
| 1427 __ lw(a1, FieldMemOperand(rhs, HeapNumber::kValueOffset + 4)); | 1428 __ lw(a1, FieldMemOperand(rhs, HeapNumber::kValueOffset + 4)); |
| 1428 } | 1429 } |
| 1429 } | 1430 } |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2376 // Convert the int32 in a1 to the heap number in v0. a2 is corrupted. | 2377 // Convert the int32 in a1 to the heap number in v0. a2 is corrupted. |
| 2377 CpuFeatures::Scope scope(FPU); | 2378 CpuFeatures::Scope scope(FPU); |
| 2378 __ mtc1(a1, f0); | 2379 __ mtc1(a1, f0); |
| 2379 __ cvt_d_w(f0, f0); | 2380 __ cvt_d_w(f0, f0); |
| 2380 __ sdc1(f0, FieldMemOperand(v0, HeapNumber::kValueOffset)); | 2381 __ sdc1(f0, FieldMemOperand(v0, HeapNumber::kValueOffset)); |
| 2381 __ Ret(); | 2382 __ Ret(); |
| 2382 } else { | 2383 } else { |
| 2383 // WriteInt32ToHeapNumberStub does not trigger GC, so we do not | 2384 // WriteInt32ToHeapNumberStub does not trigger GC, so we do not |
| 2384 // have to set up a frame. | 2385 // have to set up a frame. |
| 2385 WriteInt32ToHeapNumberStub stub(a1, v0, a2, a3); | 2386 WriteInt32ToHeapNumberStub stub(a1, v0, a2, a3); |
| 2386 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 2387 __ Jump(stub.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
| 2387 } | 2388 } |
| 2388 | 2389 |
| 2389 __ bind(&impossible); | 2390 __ bind(&impossible); |
| 2390 if (FLAG_debug_code) { | 2391 if (FLAG_debug_code) { |
| 2391 __ stop("Incorrect assumption in bit-not stub"); | 2392 __ stop("Incorrect assumption in bit-not stub"); |
| 2392 } | 2393 } |
| 2393 } | 2394 } |
| 2394 | 2395 |
| 2395 | 2396 |
| 2396 // TODO(svenpanne): Use virtual functions instead of switch. | 2397 // TODO(svenpanne): Use virtual functions instead of switch. |
| (...skipping 1526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3923 return true; | 3924 return true; |
| 3924 } | 3925 } |
| 3925 | 3926 |
| 3926 | 3927 |
| 3927 bool CEntryStub::IsPregenerated() { | 3928 bool CEntryStub::IsPregenerated() { |
| 3928 return (!save_doubles_ || ISOLATE->fp_stubs_generated()) && | 3929 return (!save_doubles_ || ISOLATE->fp_stubs_generated()) && |
| 3929 result_size_ == 1; | 3930 result_size_ == 1; |
| 3930 } | 3931 } |
| 3931 | 3932 |
| 3932 | 3933 |
| 3933 void CodeStub::GenerateStubsAheadOfTime() { | 3934 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 3934 CEntryStub::GenerateAheadOfTime(); | 3935 CEntryStub::GenerateAheadOfTime(isolate); |
| 3935 WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime(); | 3936 WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 3936 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(); | 3937 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 3937 RecordWriteStub::GenerateFixedRegStubsAheadOfTime(); | 3938 RecordWriteStub::GenerateFixedRegStubsAheadOfTime(); |
| 3938 } | 3939 } |
| 3939 | 3940 |
| 3940 | 3941 |
| 3941 void CodeStub::GenerateFPStubs() { | 3942 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| 3942 SaveFPRegsMode mode = CpuFeatures::IsSupported(FPU) | 3943 SaveFPRegsMode mode = CpuFeatures::IsSupported(FPU) |
| 3943 ? kSaveFPRegs | 3944 ? kSaveFPRegs |
| 3944 : kDontSaveFPRegs; | 3945 : kDontSaveFPRegs; |
| 3945 CEntryStub save_doubles(1, mode); | 3946 CEntryStub save_doubles(1, mode); |
| 3946 StoreBufferOverflowStub stub(mode); | 3947 StoreBufferOverflowStub stub(mode); |
| 3947 // These stubs might already be in the snapshot, detect that and don't | 3948 // These stubs might already be in the snapshot, detect that and don't |
| 3948 // regenerate, which would lead to code stub initialization state being messed | 3949 // regenerate, which would lead to code stub initialization state being messed |
| 3949 // up. | 3950 // up. |
| 3950 Code* save_doubles_code = NULL; | 3951 Code* save_doubles_code = NULL; |
| 3951 Code* store_buffer_overflow_code = NULL; | 3952 Code* store_buffer_overflow_code = NULL; |
| 3952 if (!save_doubles.FindCodeInCache(&save_doubles_code, ISOLATE)) { | 3953 if (!save_doubles.FindCodeInCache(&save_doubles_code, ISOLATE)) { |
| 3953 if (CpuFeatures::IsSupported(FPU)) { | 3954 if (CpuFeatures::IsSupported(FPU)) { |
| 3954 CpuFeatures::Scope scope2(FPU); | 3955 CpuFeatures::Scope scope2(FPU); |
| 3955 save_doubles_code = *save_doubles.GetCode(); | 3956 save_doubles_code = *save_doubles.GetCode(isolate); |
| 3956 store_buffer_overflow_code = *stub.GetCode(); | 3957 store_buffer_overflow_code = *stub.GetCode(isolate); |
| 3957 } else { | 3958 } else { |
| 3958 save_doubles_code = *save_doubles.GetCode(); | 3959 save_doubles_code = *save_doubles.GetCode(isolate); |
| 3959 store_buffer_overflow_code = *stub.GetCode(); | 3960 store_buffer_overflow_code = *stub.GetCode(isolate); |
| 3960 } | 3961 } |
| 3961 save_doubles_code->set_is_pregenerated(true); | 3962 save_doubles_code->set_is_pregenerated(true); |
| 3962 store_buffer_overflow_code->set_is_pregenerated(true); | 3963 store_buffer_overflow_code->set_is_pregenerated(true); |
| 3963 } | 3964 } |
| 3964 ISOLATE->set_fp_stubs_generated(true); | 3965 ISOLATE->set_fp_stubs_generated(true); |
| 3965 } | 3966 } |
| 3966 | 3967 |
| 3967 | 3968 |
| 3968 void CEntryStub::GenerateAheadOfTime() { | 3969 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { |
| 3969 CEntryStub stub(1, kDontSaveFPRegs); | 3970 CEntryStub stub(1, kDontSaveFPRegs); |
| 3970 Handle<Code> code = stub.GetCode(); | 3971 Handle<Code> code = stub.GetCode(isolate); |
| 3971 code->set_is_pregenerated(true); | 3972 code->set_is_pregenerated(true); |
| 3972 } | 3973 } |
| 3973 | 3974 |
| 3974 | 3975 |
| 3975 static void JumpIfOOM(MacroAssembler* masm, | 3976 static void JumpIfOOM(MacroAssembler* masm, |
| 3976 Register value, | 3977 Register value, |
| 3977 Register scratch, | 3978 Register scratch, |
| 3978 Label* oom_label) { | 3979 Label* oom_label) { |
| 3979 STATIC_ASSERT(Failure::OUT_OF_MEMORY_EXCEPTION == 3); | 3980 STATIC_ASSERT(Failure::OUT_OF_MEMORY_EXCEPTION == 3); |
| 3980 STATIC_ASSERT(kFailureTag == 3); | 3981 STATIC_ASSERT(kFailureTag == 3); |
| (...skipping 3126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7107 | 7108 |
| 7108 __ bind(&fpu_lt); | 7109 __ bind(&fpu_lt); |
| 7109 __ li(v0, Operand(LESS)); | 7110 __ li(v0, Operand(LESS)); |
| 7110 __ Ret(); | 7111 __ Ret(); |
| 7111 } | 7112 } |
| 7112 | 7113 |
| 7113 __ bind(&unordered); | 7114 __ bind(&unordered); |
| 7114 __ bind(&generic_stub); | 7115 __ bind(&generic_stub); |
| 7115 ICCompareStub stub(op_, CompareIC::GENERIC, CompareIC::GENERIC, | 7116 ICCompareStub stub(op_, CompareIC::GENERIC, CompareIC::GENERIC, |
| 7116 CompareIC::GENERIC); | 7117 CompareIC::GENERIC); |
| 7117 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 7118 __ Jump(stub.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
| 7118 | 7119 |
| 7119 __ bind(&maybe_undefined1); | 7120 __ bind(&maybe_undefined1); |
| 7120 if (Token::IsOrderedRelationalCompareOp(op_)) { | 7121 if (Token::IsOrderedRelationalCompareOp(op_)) { |
| 7121 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | 7122 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 7122 __ Branch(&miss, ne, a0, Operand(at)); | 7123 __ Branch(&miss, ne, a0, Operand(at)); |
| 7123 __ JumpIfSmi(a1, &unordered); | 7124 __ JumpIfSmi(a1, &unordered); |
| 7124 __ GetObjectType(a1, a2, a2); | 7125 __ GetObjectType(a1, a2, a2); |
| 7125 __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE)); | 7126 __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE)); |
| 7126 __ jmp(&unordered); | 7127 __ jmp(&unordered); |
| 7127 } | 7128 } |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7358 Label find_ra; | 7359 Label find_ra; |
| 7359 masm->bal(&find_ra); // ra = pc + 8. | 7360 masm->bal(&find_ra); // ra = pc + 8. |
| 7360 masm->nop(); // Branch delay slot nop. | 7361 masm->nop(); // Branch delay slot nop. |
| 7361 masm->bind(&find_ra); | 7362 masm->bind(&find_ra); |
| 7362 | 7363 |
| 7363 const int kNumInstructionsToJump = 6; | 7364 const int kNumInstructionsToJump = 6; |
| 7364 masm->addiu(ra, ra, kNumInstructionsToJump * kPointerSize); | 7365 masm->addiu(ra, ra, kNumInstructionsToJump * kPointerSize); |
| 7365 // Push return address (accessible to GC through exit frame pc). | 7366 // Push return address (accessible to GC through exit frame pc). |
| 7366 // This spot for ra was reserved in EnterExitFrame. | 7367 // This spot for ra was reserved in EnterExitFrame. |
| 7367 masm->sw(ra, MemOperand(sp, kCArgsSlotsSize)); | 7368 masm->sw(ra, MemOperand(sp, kCArgsSlotsSize)); |
| 7368 masm->li(ra, | 7369 intptr_t loc = |
| 7369 Operand(reinterpret_cast<intptr_t>(GetCode().location()), | 7370 reinterpret_cast<intptr_t>(GetCode(masm->isolate()).location()); |
| 7370 RelocInfo::CODE_TARGET), | 7371 masm->li(ra, Operand(loc, RelocInfo::CODE_TARGET), CONSTANT_SIZE); |
| 7371 CONSTANT_SIZE); | |
| 7372 // Call the function. | 7372 // Call the function. |
| 7373 masm->Jump(t9); | 7373 masm->Jump(t9); |
| 7374 // Make sure the stored 'ra' points to this position. | 7374 // Make sure the stored 'ra' points to this position. |
| 7375 ASSERT_EQ(kNumInstructionsToJump, masm->InstructionsGeneratedSince(&find_ra)); | 7375 ASSERT_EQ(kNumInstructionsToJump, masm->InstructionsGeneratedSince(&find_ra)); |
| 7376 } | 7376 } |
| 7377 | 7377 |
| 7378 | 7378 |
| 7379 void StringDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm, | 7379 void StringDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm, |
| 7380 Label* miss, | 7380 Label* miss, |
| 7381 Label* done, | 7381 Label* done, |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7692 } | 7692 } |
| 7693 return false; | 7693 return false; |
| 7694 } | 7694 } |
| 7695 | 7695 |
| 7696 | 7696 |
| 7697 bool StoreBufferOverflowStub::IsPregenerated() { | 7697 bool StoreBufferOverflowStub::IsPregenerated() { |
| 7698 return save_doubles_ == kDontSaveFPRegs || ISOLATE->fp_stubs_generated(); | 7698 return save_doubles_ == kDontSaveFPRegs || ISOLATE->fp_stubs_generated(); |
| 7699 } | 7699 } |
| 7700 | 7700 |
| 7701 | 7701 |
| 7702 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime() { | 7702 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime( |
| 7703 Isolate* isolate) { |
| 7703 StoreBufferOverflowStub stub1(kDontSaveFPRegs); | 7704 StoreBufferOverflowStub stub1(kDontSaveFPRegs); |
| 7704 stub1.GetCode()->set_is_pregenerated(true); | 7705 stub1.GetCode(isolate)->set_is_pregenerated(true); |
| 7705 } | 7706 } |
| 7706 | 7707 |
| 7707 | 7708 |
| 7708 void RecordWriteStub::GenerateFixedRegStubsAheadOfTime() { | 7709 void RecordWriteStub::GenerateFixedRegStubsAheadOfTime(Isolate* isolate) { |
| 7709 for (const AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; | 7710 for (const AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; |
| 7710 !entry->object.is(no_reg); | 7711 !entry->object.is(no_reg); |
| 7711 entry++) { | 7712 entry++) { |
| 7712 RecordWriteStub stub(entry->object, | 7713 RecordWriteStub stub(entry->object, |
| 7713 entry->value, | 7714 entry->value, |
| 7714 entry->address, | 7715 entry->address, |
| 7715 entry->action, | 7716 entry->action, |
| 7716 kDontSaveFPRegs); | 7717 kDontSaveFPRegs); |
| 7717 stub.GetCode()->set_is_pregenerated(true); | 7718 stub.GetCode(isolate)->set_is_pregenerated(true); |
| 7718 } | 7719 } |
| 7719 } | 7720 } |
| 7720 | 7721 |
| 7721 | 7722 |
| 7722 bool CodeStub::CanUseFPRegisters() { | 7723 bool CodeStub::CanUseFPRegisters() { |
| 7723 return CpuFeatures::IsSupported(FPU); | 7724 return CpuFeatures::IsSupported(FPU); |
| 7724 } | 7725 } |
| 7725 | 7726 |
| 7726 | 7727 |
| 7727 // Takes the input in 3 registers: address_ value_ and object_. A pointer to | 7728 // Takes the input in 3 registers: address_ value_ and object_. A pointer to |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7984 &slow_elements); | 7985 &slow_elements); |
| 7985 __ Ret(USE_DELAY_SLOT); | 7986 __ Ret(USE_DELAY_SLOT); |
| 7986 __ mov(v0, a0); | 7987 __ mov(v0, a0); |
| 7987 } | 7988 } |
| 7988 | 7989 |
| 7989 | 7990 |
| 7990 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { | 7991 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { |
| 7991 ASSERT(!Serializer::enabled()); | 7992 ASSERT(!Serializer::enabled()); |
| 7992 bool save_fp_regs = CpuFeatures::IsSupported(FPU); | 7993 bool save_fp_regs = CpuFeatures::IsSupported(FPU); |
| 7993 CEntryStub ces(1, save_fp_regs ? kSaveFPRegs : kDontSaveFPRegs); | 7994 CEntryStub ces(1, save_fp_regs ? kSaveFPRegs : kDontSaveFPRegs); |
| 7994 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET); | 7995 __ Call(ces.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
| 7995 int parameter_count_offset = | 7996 int parameter_count_offset = |
| 7996 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; | 7997 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; |
| 7997 __ lw(a1, MemOperand(fp, parameter_count_offset)); | 7998 __ lw(a1, MemOperand(fp, parameter_count_offset)); |
| 7998 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); | 7999 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); |
| 7999 __ sll(a1, a1, kPointerSizeLog2); | 8000 __ sll(a1, a1, kPointerSizeLog2); |
| 8000 __ Addu(sp, sp, a1); | 8001 __ Addu(sp, sp, a1); |
| 8001 __ Ret(); | 8002 __ Ret(); |
| 8002 } | 8003 } |
| 8003 | 8004 |
| 8004 | 8005 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8060 __ Pop(ra, t1, a1); | 8061 __ Pop(ra, t1, a1); |
| 8061 __ Ret(); | 8062 __ Ret(); |
| 8062 } | 8063 } |
| 8063 | 8064 |
| 8064 | 8065 |
| 8065 #undef __ | 8066 #undef __ |
| 8066 | 8067 |
| 8067 } } // namespace v8::internal | 8068 } } // namespace v8::internal |
| 8068 | 8069 |
| 8069 #endif // V8_TARGET_ARCH_MIPS | 8070 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |