| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/utils.h" | 5 #include "src/utils.h" |
| 6 | 6 |
| 7 #include <stdarg.h> | 7 #include <stdarg.h> |
| 8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
| 9 | 9 |
| 10 #include "src/base/functional.h" | 10 #include "src/base/functional.h" |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 | 361 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 |
| 362 static void MemMoveWrapper(void* dest, const void* src, size_t size) { | 362 static void MemMoveWrapper(void* dest, const void* src, size_t size) { |
| 363 memmove(dest, src, size); | 363 memmove(dest, src, size); |
| 364 } | 364 } |
| 365 | 365 |
| 366 | 366 |
| 367 // Initialize to library version so we can call this at any time during startup. | 367 // Initialize to library version so we can call this at any time during startup. |
| 368 static MemMoveFunction memmove_function = &MemMoveWrapper; | 368 static MemMoveFunction memmove_function = &MemMoveWrapper; |
| 369 | 369 |
| 370 // Defined in codegen-ia32.cc. | 370 // Defined in codegen-ia32.cc. |
| 371 MemMoveFunction CreateMemMoveFunction(); | 371 MemMoveFunction CreateMemMoveFunction(Isolate* isolate); |
| 372 | 372 |
| 373 // Copy memory area to disjoint memory area. | 373 // Copy memory area to disjoint memory area. |
| 374 void MemMove(void* dest, const void* src, size_t size) { | 374 void MemMove(void* dest, const void* src, size_t size) { |
| 375 if (size == 0) return; | 375 if (size == 0) return; |
| 376 // Note: here we rely on dependent reads being ordered. This is true | 376 // Note: here we rely on dependent reads being ordered. This is true |
| 377 // on all architectures we currently support. | 377 // on all architectures we currently support. |
| 378 (*memmove_function)(dest, src, size); | 378 (*memmove_function)(dest, src, size); |
| 379 } | 379 } |
| 380 | 380 |
| 381 #elif V8_OS_POSIX && V8_HOST_ARCH_ARM | 381 #elif V8_OS_POSIX && V8_HOST_ARCH_ARM |
| 382 void MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src, | 382 void MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src, |
| 383 size_t chars) { | 383 size_t chars) { |
| 384 uint16_t* limit = dest + chars; | 384 uint16_t* limit = dest + chars; |
| 385 while (dest < limit) { | 385 while (dest < limit) { |
| 386 *dest++ = static_cast<uint16_t>(*src++); | 386 *dest++ = static_cast<uint16_t>(*src++); |
| 387 } | 387 } |
| 388 } | 388 } |
| 389 | 389 |
| 390 | 390 |
| 391 MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; | 391 MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; |
| 392 MemCopyUint16Uint8Function memcopy_uint16_uint8_function = | 392 MemCopyUint16Uint8Function memcopy_uint16_uint8_function = |
| 393 &MemCopyUint16Uint8Wrapper; | 393 &MemCopyUint16Uint8Wrapper; |
| 394 // Defined in codegen-arm.cc. | 394 // Defined in codegen-arm.cc. |
| 395 MemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub); | 395 MemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, |
| 396 MemCopyUint8Function stub); |
| 396 MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( | 397 MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( |
| 397 MemCopyUint16Uint8Function stub); | 398 Isolate* isolate, MemCopyUint16Uint8Function stub); |
| 398 | 399 |
| 399 #elif V8_OS_POSIX && V8_HOST_ARCH_MIPS | 400 #elif V8_OS_POSIX && V8_HOST_ARCH_MIPS |
| 400 MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; | 401 MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; |
| 401 // Defined in codegen-mips.cc. | 402 // Defined in codegen-mips.cc. |
| 402 MemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub); | 403 MemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, |
| 404 MemCopyUint8Function stub); |
| 403 #endif | 405 #endif |
| 404 | 406 |
| 405 | 407 |
| 406 void init_memcopy_functions() { | 408 static bool g_memcopy_functions_initialized = false; |
| 409 |
| 410 |
| 411 void init_memcopy_functions(Isolate* isolate) { |
| 412 if (g_memcopy_functions_initialized) return; |
| 413 g_memcopy_functions_initialized = true; |
| 407 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 | 414 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 |
| 408 MemMoveFunction generated_memmove = CreateMemMoveFunction(); | 415 MemMoveFunction generated_memmove = CreateMemMoveFunction(isolate); |
| 409 if (generated_memmove != NULL) { | 416 if (generated_memmove != NULL) { |
| 410 memmove_function = generated_memmove; | 417 memmove_function = generated_memmove; |
| 411 } | 418 } |
| 412 #elif V8_OS_POSIX && V8_HOST_ARCH_ARM | 419 #elif V8_OS_POSIX && V8_HOST_ARCH_ARM |
| 413 memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper); | 420 memcopy_uint8_function = |
| 421 CreateMemCopyUint8Function(isolate, &MemCopyUint8Wrapper); |
| 414 memcopy_uint16_uint8_function = | 422 memcopy_uint16_uint8_function = |
| 415 CreateMemCopyUint16Uint8Function(&MemCopyUint16Uint8Wrapper); | 423 CreateMemCopyUint16Uint8Function(isolate, &MemCopyUint16Uint8Wrapper); |
| 416 #elif V8_OS_POSIX && V8_HOST_ARCH_MIPS | 424 #elif V8_OS_POSIX && V8_HOST_ARCH_MIPS |
| 417 memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper); | 425 memcopy_uint8_function = |
| 426 CreateMemCopyUint8Function(isolate, &MemCopyUint8Wrapper); |
| 418 #endif | 427 #endif |
| 419 } | 428 } |
| 420 | 429 |
| 421 | 430 |
| 422 bool DoubleToBoolean(double d) { | 431 bool DoubleToBoolean(double d) { |
| 423 // NaN, +0, and -0 should return the false object | 432 // NaN, +0, and -0 should return the false object |
| 424 #if V8_TARGET_LITTLE_ENDIAN | 433 #if V8_TARGET_LITTLE_ENDIAN |
| 425 union IeeeDoubleLittleEndianArchType u; | 434 union IeeeDoubleLittleEndianArchType u; |
| 426 #else | 435 #else |
| 427 union IeeeDoubleBigEndianArchType u; | 436 union IeeeDoubleBigEndianArchType u; |
| 428 #endif | 437 #endif |
| 429 u.d = d; | 438 u.d = d; |
| 430 if (u.bits.exp == 2047) { | 439 if (u.bits.exp == 2047) { |
| 431 // Detect NaN for IEEE double precision floating point. | 440 // Detect NaN for IEEE double precision floating point. |
| 432 if ((u.bits.man_low | u.bits.man_high) != 0) return false; | 441 if ((u.bits.man_low | u.bits.man_high) != 0) return false; |
| 433 } | 442 } |
| 434 if (u.bits.exp == 0) { | 443 if (u.bits.exp == 0) { |
| 435 // Detect +0, and -0 for IEEE double precision floating point. | 444 // Detect +0, and -0 for IEEE double precision floating point. |
| 436 if ((u.bits.man_low | u.bits.man_high) == 0) return false; | 445 if ((u.bits.man_low | u.bits.man_high) == 0) return false; |
| 437 } | 446 } |
| 438 return true; | 447 return true; |
| 439 } | 448 } |
| 440 | 449 |
| 441 | 450 |
| 442 } // namespace internal | 451 } // namespace internal |
| 443 } // namespace v8 | 452 } // namespace v8 |
| OLD | NEW |