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 3435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3446 Counters* counters = masm->isolate()->counters(); | 3446 Counters* counters = masm->isolate()->counters(); |
3447 __ IncrementCounter( | 3447 __ IncrementCounter( |
3448 counters->transcendental_cache_miss(), 1, scratch0, scratch1); | 3448 counters->transcendental_cache_miss(), 1, scratch0, scratch1); |
3449 if (tagged) { | 3449 if (tagged) { |
3450 __ bind(&invalid_cache); | 3450 __ bind(&invalid_cache); |
3451 __ TailCallExternalReference(ExternalReference(RuntimeFunction(), | 3451 __ TailCallExternalReference(ExternalReference(RuntimeFunction(), |
3452 masm->isolate()), | 3452 masm->isolate()), |
3453 1, | 3453 1, |
3454 1); | 3454 1); |
3455 } else { | 3455 } else { |
3456 if (!CpuFeatures::IsSupported(FPU)) UNREACHABLE(); | 3456 ASSERT(CpuFeatures::IsSupported(FPU)); |
3457 CpuFeatures::Scope scope(FPU); | 3457 CpuFeatures::Scope scope(FPU); |
3458 | 3458 |
3459 Label no_update; | 3459 Label no_update; |
3460 Label skip_cache; | 3460 Label skip_cache; |
3461 | 3461 |
3462 // Call C function to calculate the result and update the cache. | 3462 // Call C function to calculate the result and update the cache. |
3463 // Register a0 holds precalculated cache entry address; preserve | 3463 // a0: precalculated cache entry address. |
3464 // it on the stack and pop it into register cache_entry after the | 3464 // a2 and a3: parts of the double value. |
3465 // call. | 3465 // Store a0, a2 and a3 on stack for later before calling C function. |
3466 __ Push(cache_entry, a2, a3); | 3466 __ Push(a3, a2, cache_entry); |
3467 GenerateCallCFunction(masm, scratch0); | 3467 GenerateCallCFunction(masm, scratch0); |
3468 __ GetCFunctionDoubleResult(f4); | 3468 __ GetCFunctionDoubleResult(f4); |
3469 | 3469 |
3470 // Try to update the cache. If we cannot allocate a | 3470 // Try to update the cache. If we cannot allocate a |
3471 // heap number, we return the result without updating. | 3471 // heap number, we return the result without updating. |
3472 __ Pop(cache_entry, a2, a3); | 3472 __ Pop(a3, a2, cache_entry); |
3473 __ LoadRoot(t1, Heap::kHeapNumberMapRootIndex); | 3473 __ LoadRoot(t1, Heap::kHeapNumberMapRootIndex); |
3474 __ AllocateHeapNumber(t2, scratch0, scratch1, t1, &no_update); | 3474 __ AllocateHeapNumber(t2, scratch0, scratch1, t1, &no_update); |
3475 __ sdc1(f4, FieldMemOperand(t2, HeapNumber::kValueOffset)); | 3475 __ sdc1(f4, FieldMemOperand(t2, HeapNumber::kValueOffset)); |
3476 | 3476 |
3477 __ sw(a2, MemOperand(cache_entry, 0 * kPointerSize)); | 3477 __ sw(a2, MemOperand(cache_entry, 0 * kPointerSize)); |
3478 __ sw(a3, MemOperand(cache_entry, 1 * kPointerSize)); | 3478 __ sw(a3, MemOperand(cache_entry, 1 * kPointerSize)); |
3479 __ sw(t2, MemOperand(cache_entry, 2 * kPointerSize)); | 3479 __ sw(t2, MemOperand(cache_entry, 2 * kPointerSize)); |
3480 | 3480 |
3481 __ Ret(USE_DELAY_SLOT); | 3481 __ Ret(USE_DELAY_SLOT); |
3482 __ mov(v0, cache_entry); | 3482 __ mov(v0, cache_entry); |
(...skipping 4199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7682 __ Ret(USE_DELAY_SLOT); | 7682 __ Ret(USE_DELAY_SLOT); |
7683 __ mov(v0, a0); | 7683 __ mov(v0, a0); |
7684 } | 7684 } |
7685 | 7685 |
7686 | 7686 |
7687 #undef __ | 7687 #undef __ |
7688 | 7688 |
7689 } } // namespace v8::internal | 7689 } } // namespace v8::internal |
7690 | 7690 |
7691 #endif // V8_TARGET_ARCH_MIPS | 7691 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |