Changeset 62306 in webkit for trunk/JavaScriptCore/assembler/MacroAssemblerARMv7.h
- Timestamp:
- Jul 1, 2010, 3:56:58 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r60577 r62306 39 39 // - dTR is likely used more than aTR, and we'll get better instruction 40 40 // encoding if it's in the low 8 registers. 41 static const ARMRegisters::RegisterID dataTempRegister = ARMRegisters::ip;41 static const RegisterID dataTempRegister = ARMRegisters::ip; 42 42 static const RegisterID addressTempRegister = ARMRegisters::r3; 43 static const FPRegisterID fpTempRegister = ARMRegisters::d7; 44 43 44 static const ARMRegisters::FPDoubleRegisterID fpTempRegister = ARMRegisters::d7; 45 inline ARMRegisters::FPSingleRegisterID fpTempRegisterAsSingle() { return ARMRegisters::asSingle(fpTempRegister); } 46 47 public: 45 48 struct ArmAddress { 46 49 enum AddressType { … … 74 77 75 78 public: 79 typedef ARMRegisters::FPDoubleRegisterID FPRegisterID; 76 80 77 81 static const Scale ScalePtr = TimesFour; … … 223 227 } 224 228 229 void neg32(RegisterID srcDest) 230 { 231 m_assembler.neg(srcDest, srcDest); 232 } 233 225 234 void not32(RegisterID srcDest) 226 235 { … … 541 550 } 542 551 552 void loadDouble(const void* address, FPRegisterID dest) 553 { 554 move(ImmPtr(address), addressTempRegister); 555 m_assembler.vldr(dest, addressTempRegister, 0); 556 } 557 543 558 void storeDouble(FPRegisterID src, ImplicitAddress address) 544 559 { … … 567 582 } 568 583 584 void divDouble(FPRegisterID src, FPRegisterID dest) 585 { 586 m_assembler.vdiv_F64(dest, dest, src); 587 } 588 569 589 void subDouble(FPRegisterID src, FPRegisterID dest) 570 590 { … … 596 616 void convertInt32ToDouble(RegisterID src, FPRegisterID dest) 597 617 { 598 m_assembler.vmov(fpTempRegister, src); 599 m_assembler.vcvt_F64_S32(dest, fpTempRegister); 618 m_assembler.vmov(fpTempRegisterAsSingle(), src); 619 m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle()); 620 } 621 622 void convertInt32ToDouble(Address address, FPRegisterID dest) 623 { 624 // Fixme: load directly into the fpr! 625 load32(address, dataTempRegister); 626 m_assembler.vmov(fpTempRegisterAsSingle(), dataTempRegister); 627 m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle()); 628 } 629 630 void convertInt32ToDouble(AbsoluteAddress address, FPRegisterID dest) 631 { 632 // Fixme: load directly into the fpr! 633 load32(address.m_ptr, dataTempRegister); 634 m_assembler.vmov(fpTempRegisterAsSingle(), dataTempRegister); 635 m_assembler.vcvt_F64_S32(dest, fpTempRegisterAsSingle()); 600 636 } 601 637 … … 630 666 } 631 667 668 // Convert 'src' to an integer, and places the resulting 'dest'. 669 // If the result is not representable as a 32 bit value, branch. 670 // May also branch for some values that are representable in 32 bits 671 // (specifically, in this case, 0). 672 void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID) 673 { 674 m_assembler.vcvtr_S32_F64(fpTempRegisterAsSingle(), src); 675 m_assembler.vmov(dest, fpTempRegisterAsSingle()); 676 677 // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump. 678 m_assembler.vcvt_F64_S32(fpTempRegister, fpTempRegisterAsSingle()); 679 failureCases.append(branchDouble(DoubleNotEqualOrUnordered, src, fpTempRegister)); 680 681 // If the result is zero, it might have been -0.0, and the double comparison won't catch this! 682 failureCases.append(branchTest32(Zero, dest)); 683 } 684 685 void zeroDouble(FPRegisterID dest) 686 { 687 m_assembler.vmov_F64_0(dest); 688 } 632 689 633 690 // Stack manipulation operations: … … 971 1028 } 972 1029 1030 Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) 1031 { 1032 ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); 1033 m_assembler.orr_S(dest, dest, src); 1034 return Jump(makeBranch(cond)); 1035 } 1036 973 1037 Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) 974 1038 { … … 1035 1099 } 1036 1100 1101 void set32(Condition cond, Address left, RegisterID right, RegisterID dest) 1102 { 1103 load32(left, dataTempRegister); 1104 set32(cond, dataTempRegister, right, dest); 1105 } 1106 1037 1107 void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) 1038 1108 { … … 1041 1111 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); 1042 1112 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); 1113 } 1114 1115 void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest) 1116 { 1117 set32(cond, left, right, dest); 1118 } 1119 1120 void set8(Condition cond, Address left, RegisterID right, RegisterID dest) 1121 { 1122 set32(cond, left, right, dest); 1123 } 1124 1125 void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest) 1126 { 1127 set32(cond, left, right, dest); 1043 1128 } 1044 1129
Note:
See TracChangeset
for help on using the changeset viewer.