Changeset 44526 in webkit for trunk/JavaScriptCore/assembler
- Timestamp:
- Jun 9, 2009, 1:14:09 AM (16 years ago)
- Location:
- trunk/JavaScriptCore/assembler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r44525 r44526 440 440 // Floating-point operations: 441 441 442 bool supportsFloatingPoint() const { return false; } 443 444 void loadDouble(ImplicitAddress, FPRegisterID) 445 { 446 ASSERT_NOT_REACHED(); 447 } 448 449 void storeDouble(FPRegisterID, ImplicitAddress) 450 { 451 ASSERT_NOT_REACHED(); 452 } 453 454 void addDouble(FPRegisterID, FPRegisterID) 455 { 456 ASSERT_NOT_REACHED(); 457 } 458 459 void addDouble(Address, FPRegisterID) 460 { 461 ASSERT_NOT_REACHED(); 462 } 463 464 void subDouble(FPRegisterID, FPRegisterID) 465 { 466 ASSERT_NOT_REACHED(); 467 } 468 469 void subDouble(Address, FPRegisterID) 470 { 471 ASSERT_NOT_REACHED(); 472 } 473 474 void mulDouble(FPRegisterID, FPRegisterID) 475 { 476 ASSERT_NOT_REACHED(); 477 } 478 479 void mulDouble(Address, FPRegisterID) 480 { 481 ASSERT_NOT_REACHED(); 482 } 483 484 void convertInt32ToDouble(RegisterID, FPRegisterID) 485 { 486 ASSERT_NOT_REACHED(); 487 } 488 489 Jump branchDouble(DoubleCondition, FPRegisterID, FPRegisterID) 490 { 491 ASSERT_NOT_REACHED(); 442 bool supportsFloatingPoint() const { return true; } 443 // On x86(_64) the MacroAssembler provides an interface to truncate a double to an integer. 444 // If a value is not representable as an integer, and possibly for some values that are, 445 // (on x86 INT_MIN, since this is indistinguishable from results for out-of-range/NaN input) 446 // a branch will be taken. It is not clear whether this interface will be well suited to 447 // other platforms. On ARMv7 the hardware truncation operation produces multiple possible 448 // failure values (saturates to INT_MIN & INT_MAX, NaN reulsts in a value of 0). This is a 449 // temporary solution while we work out what this interface should be. Either we need to 450 // decide to make this interface work on all platforms, rework the interface to make it more 451 // generic, or decide that the MacroAssembler cannot practically be used to abstracted these 452 // operations, and make clients go directly to the m_assembler to plant truncation instructions. 453 // In short, FIXME:. 454 bool supportsFloatingPointTruncate() const { return false; } 455 456 void loadDouble(ImplicitAddress address, FPRegisterID dest) 457 { 458 RegisterID base = address.base; 459 int32_t offset = address.offset; 460 461 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 462 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 463 add32(Imm32(offset), base, addressTempRegister); 464 base = addressTempRegister; 465 offset = 0; 466 } 467 468 m_assembler.vldr(dest, base, offset); 469 } 470 471 void storeDouble(FPRegisterID src, ImplicitAddress address) 472 { 473 RegisterID base = address.base; 474 int32_t offset = address.offset; 475 476 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 477 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 478 add32(Imm32(offset), base, addressTempRegister); 479 base = addressTempRegister; 480 offset = 0; 481 } 482 483 m_assembler.vstr(src, base, offset); 484 } 485 486 void addDouble(FPRegisterID src, FPRegisterID dest) 487 { 488 m_assembler.vadd_F64(dest, dest, src); 489 } 490 491 void addDouble(Address src, FPRegisterID dest) 492 { 493 loadDouble(src, fpTempRegister); 494 addDouble(fpTempRegister, dest); 495 } 496 497 void subDouble(FPRegisterID src, FPRegisterID dest) 498 { 499 m_assembler.vsub_F64(dest, dest, src); 500 } 501 502 void subDouble(Address src, FPRegisterID dest) 503 { 504 loadDouble(src, fpTempRegister); 505 subDouble(fpTempRegister, dest); 506 } 507 508 void mulDouble(FPRegisterID src, FPRegisterID dest) 509 { 510 m_assembler.vmul_F64(dest, dest, src); 511 } 512 513 void mulDouble(Address src, FPRegisterID dest) 514 { 515 loadDouble(src, fpTempRegister); 516 mulDouble(fpTempRegister, dest); 517 } 518 519 void convertInt32ToDouble(RegisterID src, FPRegisterID dest) 520 { 521 m_assembler.vmov(fpTempRegister, src); 522 m_assembler.vcvt_F64_S32(dest, fpTempRegister); 523 } 524 525 Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) 526 { 527 m_assembler.vcmp_F64(left, right); 528 m_assembler.vmrs_APSR_nzcv_FPSCR(); 529 return makeBranch(cond); 492 530 } 493 531 -
trunk/JavaScriptCore/assembler/MacroAssemblerX86.h
r44525 r44526 160 160 161 161 bool supportsFloatingPoint() const { return m_isSSE2Present; } 162 // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() 163 bool supportsFloatingPointTruncate() const { return m_isSSE2Present; } 162 164 163 165 private: -
trunk/JavaScriptCore/assembler/MacroAssemblerX86_64.h
r44525 r44526 445 445 446 446 bool supportsFloatingPoint() const { return true; } 447 // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() 448 bool supportsFloatingPointTruncate() const { return true; } 447 449 }; 448 450
Note:
See TracChangeset
for help on using the changeset viewer.