Changeset 46832 in webkit for trunk/JavaScriptCore/assembler
- Timestamp:
- Aug 5, 2009, 10:33:27 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/assembler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/ARMAssembler.cpp
r46831 r46832 335 335 } 336 336 337 void ARMAssembler::doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset) 338 { 339 if (offset & 0x3) { 340 if (offset <= 0x3ff && offset >= 0) { 341 fdtr_u(isLoad, srcDst, base, offset >> 2); 342 return; 343 } 344 if (offset <= 0x3ffff && offset >= 0) { 345 add_r(ARM::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); 346 fdtr_u(isLoad, srcDst, ARM::S0, (offset >> 2) & 0xff); 347 return; 348 } 349 offset = -offset; 350 351 if (offset <= 0x3ff && offset >= 0) { 352 fdtr_d(isLoad, srcDst, base, offset >> 2); 353 return; 354 } 355 if (offset <= 0x3ffff && offset >= 0) { 356 sub_r(ARM::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); 357 fdtr_d(isLoad, srcDst, ARM::S0, (offset >> 2) & 0xff); 358 return; 359 } 360 offset = -offset; 361 } 362 363 ldr_un_imm(ARM::S0, offset); 364 add_r(ARM::S0, ARM::S0, base); 365 fdtr_u(isLoad, srcDst, ARM::S0, 0); 366 } 367 337 368 void* ARMAssembler::executableCopy(ExecutablePool* allocator) 338 369 { -
trunk/JavaScriptCore/assembler/ARMAssembler.h
r46247 r46832 64 64 65 65 typedef enum { 66 fp0 //FIXME 66 d0, 67 d1, 68 d2, 69 d3, 70 SD0 = d3 67 71 } FPRegisterID; 72 68 73 } // namespace ARM 69 74 … … 116 121 MUL = 0x00000090, 117 122 MULL = 0x00c00090, 123 FADDD = 0x0e300b00, 124 FSUBD = 0x0e300b40, 125 FMULD = 0x0e200b00, 126 FCMPD = 0x0eb40b40, 118 127 DTR = 0x05000000, 119 128 LDRH = 0x00100090, … … 121 130 STMDB = 0x09200000, 122 131 LDMIA = 0x08b00000, 132 FDTR = 0x0d000b00, 123 133 B = 0x0a000000, 124 134 BL = 0x0b000000, 135 FMSR = 0x0e000a10, 136 FSITOD = 0x0eb80bc0, 137 FMSTAT = 0x0ef1fa10, 125 138 #if ARM_ARCH_VERSION >= 5 126 139 CLZ = 0x016f0f10, … … 365 378 } 366 379 380 void faddd_r(int dd, int dn, int dm, Condition cc = AL) 381 { 382 emitInst(static_cast<ARMWord>(cc) | FADDD, dd, dn, dm); 383 } 384 385 void fsubd_r(int dd, int dn, int dm, Condition cc = AL) 386 { 387 emitInst(static_cast<ARMWord>(cc) | FSUBD, dd, dn, dm); 388 } 389 390 void fmuld_r(int dd, int dn, int dm, Condition cc = AL) 391 { 392 emitInst(static_cast<ARMWord>(cc) | FMULD, dd, dn, dm); 393 } 394 395 void fcmpd_r(int dd, int dm, Condition cc = AL) 396 { 397 emitInst(static_cast<ARMWord>(cc) | FCMPD, dd, 0, dm); 398 } 399 367 400 void ldr_imm(int rd, ARMWord imm, Condition cc = AL) 368 401 { … … 413 446 { 414 447 emitInst(static_cast<ARMWord>(cc) | STRH | HDT_UH | DT_UP | DT_PRE, rd, rn, rm); 448 } 449 450 void fdtr_u(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) 451 { 452 ASSERT(op2 <= 0xff); 453 emitInst(static_cast<ARMWord>(cc) | FDTR | DT_UP | (isLoad ? DT_LOAD : 0), rd, rb, op2); 454 } 455 456 void fdtr_d(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) 457 { 458 ASSERT(op2 <= 0xff); 459 emitInst(static_cast<ARMWord>(cc) | FDTR | (isLoad ? DT_LOAD : 0), rd, rb, op2); 415 460 } 416 461 … … 435 480 { 436 481 dtr_u(true, reg, ARM::sp, 0, cc); 482 } 483 484 void fmsr_r(int dd, int rn, Condition cc = AL) 485 { 486 emitInst(static_cast<ARMWord>(cc) | FMSR, rn, dd, 0); 487 } 488 489 void fsitod_r(int dd, int dm, Condition cc = AL) 490 { 491 emitInst(static_cast<ARMWord>(cc) | FSITOD, dd, 0, dm); 492 } 493 494 void fmstat(Condition cc = AL) 495 { 496 m_buffer.putInt(static_cast<ARMWord>(cc) | FMSTAT); 437 497 } 438 498 … … 654 714 void dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset); 655 715 void baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset); 716 void doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset); 656 717 657 718 // Constant pool hnadlers -
trunk/JavaScriptCore/assembler/MacroAssemblerARM.h
r46831 r46832 58 58 59 59 enum DoubleCondition { 60 DoubleEqual, //FIXME 61 DoubleNotEqual, //FIXME 62 DoubleGreaterThan, //FIXME 63 DoubleGreaterThanOrEqual, //FIXME 64 DoubleLessThan, //FIXME 65 DoubleLessThanOrEqual, //FIXME 60 DoubleEqual = ARMAssembler::EQ, 61 DoubleGreaterThan = ARMAssembler::GT, 62 DoubleGreaterThanOrEqual = ARMAssembler::GE, 63 DoubleLessThan = ARMAssembler::LT, 64 DoubleLessThanOrEqual = ARMAssembler::LE, 66 65 }; 67 66 … … 641 640 bool supportsFloatingPoint() const 642 641 { 642 // FIXME: should be a dynamic test: VFP, FPA, or nothing 643 643 return false; 644 644 } … … 651 651 void loadDouble(ImplicitAddress address, FPRegisterID dest) 652 652 { 653 UNUSED_PARAM(address); 654 UNUSED_PARAM(dest); 655 ASSERT_NOT_REACHED(); 653 m_assembler.doubleTransfer(true, dest, address.base, address.offset); 656 654 } 657 655 658 656 void storeDouble(FPRegisterID src, ImplicitAddress address) 659 657 { 660 UNUSED_PARAM(src); 661 UNUSED_PARAM(address); 662 ASSERT_NOT_REACHED(); 658 m_assembler.doubleTransfer(false, src, address.base, address.offset); 663 659 } 664 660 665 661 void addDouble(FPRegisterID src, FPRegisterID dest) 666 662 { 667 UNUSED_PARAM(src); 668 UNUSED_PARAM(dest); 669 ASSERT_NOT_REACHED(); 663 m_assembler.faddd_r(dest, dest, src); 670 664 } 671 665 672 666 void addDouble(Address src, FPRegisterID dest) 673 667 { 674 UNUSED_PARAM(src); 675 UNUSED_PARAM(dest); 676 ASSERT_NOT_REACHED(); 668 loadDouble(src, ARM::SD0); 669 addDouble(ARM::SD0, dest); 677 670 } 678 671 679 672 void subDouble(FPRegisterID src, FPRegisterID dest) 680 673 { 681 UNUSED_PARAM(src); 682 UNUSED_PARAM(dest); 683 ASSERT_NOT_REACHED(); 674 m_assembler.fsubd_r(dest, dest, src); 684 675 } 685 676 686 677 void subDouble(Address src, FPRegisterID dest) 687 678 { 688 UNUSED_PARAM(src); 689 UNUSED_PARAM(dest); 690 ASSERT_NOT_REACHED(); 679 loadDouble(src, ARM::SD0); 680 subDouble(ARM::SD0, dest); 691 681 } 692 682 693 683 void mulDouble(FPRegisterID src, FPRegisterID dest) 694 684 { 695 UNUSED_PARAM(src); 696 UNUSED_PARAM(dest); 697 ASSERT_NOT_REACHED(); 685 m_assembler.fmuld_r(dest, dest, src); 698 686 } 699 687 700 688 void mulDouble(Address src, FPRegisterID dest) 701 689 { 702 UNUSED_PARAM(src); 703 UNUSED_PARAM(dest); 704 ASSERT_NOT_REACHED(); 690 loadDouble(src, ARM::SD0); 691 mulDouble(ARM::SD0, dest); 705 692 } 706 693 707 694 void convertInt32ToDouble(RegisterID src, FPRegisterID dest) 708 695 { 709 UNUSED_PARAM(src); 710 UNUSED_PARAM(dest); 711 ASSERT_NOT_REACHED(); 696 m_assembler.fmsr_r(dest, src); 697 m_assembler.fsitod_r(dest, dest); 712 698 } 713 699 714 700 Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) 715 701 { 716 UNUSED_PARAM(cond); 717 UNUSED_PARAM(left); 718 UNUSED_PARAM(right); 719 ASSERT_NOT_REACHED(); 720 return jump(); 702 m_assembler.fcmpd_r(left, right); 703 m_assembler.fmstat(); 704 return Jump(m_assembler.jmp(static_cast<ARMAssembler::Condition>(cond))); 721 705 } 722 706
Note:
See TracChangeset
for help on using the changeset viewer.