Changeset 66846 in webkit for trunk/JavaScriptCore/assembler
- Timestamp:
- Sep 6, 2010, 1:29:01 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/assembler
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MIPSAssembler.h
r66524 r66846 530 530 } 531 531 532 void divd(FPRegisterID fd, FPRegisterID fs, FPRegisterID ft) 533 { 534 emitInst(0x46200003 | (fd << OP_SH_FD) | (fs << OP_SH_FS) 535 | (ft << OP_SH_FT)); 536 } 537 532 538 void lwc1(FPRegisterID ft, RegisterID rs, int offset) 533 539 { … … 561 567 } 562 568 569 void mthc1(RegisterID rt, FPRegisterID fs) 570 { 571 emitInst(0x44e00000 | (fs << OP_SH_FS) | (rt << OP_SH_RT)); 572 copDelayNop(); 573 } 574 563 575 void mfc1(RegisterID rt, FPRegisterID fs) 564 576 { … … 580 592 { 581 593 emitInst(0x46800021 | (fd << OP_SH_FD) | (fs << OP_SH_FS)); 594 } 595 596 void cvtwd(FPRegisterID fd, FPRegisterID fs) 597 { 598 emitInst(0x46200024 | (fd << OP_SH_FD) | (fs << OP_SH_FS)); 582 599 } 583 600 -
trunk/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r62306 r66846 282 282 } 283 283 284 void neg32(RegisterID srcDest) 285 { 286 m_assembler.subu(srcDest, MIPSRegisters::zero, srcDest); 287 } 288 284 289 void not32(RegisterID srcDest) 285 290 { … … 619 624 m_fixedWidth = false; 620 625 return label; 621 }622 623 Label loadPtrWithAddressOffsetPatch(Address address, RegisterID dest)624 {625 return loadPtrWithPatchToLEA(address, dest);626 626 } 627 627 … … 1303 1303 } 1304 1304 1305 Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) 1306 { 1307 ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); 1308 if (cond == Signed) { 1309 or32(src, dest); 1310 // Check if dest is negative. 1311 m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero); 1312 return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); 1313 } 1314 if (cond == Zero) { 1315 or32(src, dest); 1316 return branchEqual(dest, MIPSRegisters::zero); 1317 } 1318 if (cond == NonZero) { 1319 or32(src, dest); 1320 return branchNotEqual(dest, MIPSRegisters::zero); 1321 } 1322 ASSERT(0); 1323 return Jump(); 1324 } 1325 1305 1326 // Miscellaneous operations: 1306 1327 … … 1350 1371 m_assembler.jr(MIPSRegisters::ra); 1351 1372 m_assembler.nop(); 1373 } 1374 1375 void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest) 1376 { 1377 set32(cond, left, right, dest); 1378 } 1379 1380 void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest) 1381 { 1382 move(right, immTempRegister); 1383 set32(cond, left, immTempRegister, dest); 1352 1384 } 1353 1385 … … 1547 1579 } 1548 1580 1581 void loadDouble(const void* address, FPRegisterID dest) 1582 { 1583 #if WTF_MIPS_ISA(1) 1584 /* 1585 li addrTemp, address 1586 lwc1 dest, 0(addrTemp) 1587 lwc1 dest+1, 4(addrTemp) 1588 */ 1589 move(ImmPtr(address), addrTempRegister); 1590 m_assembler.lwc1(dest, addrTempRegister, 0); 1591 m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4); 1592 #else 1593 /* 1594 li addrTemp, address 1595 ldc1 dest, 0(addrTemp) 1596 */ 1597 move(ImmPtr(address), addrTempRegister); 1598 m_assembler.ldc1(dest, addrTempRegister, 0); 1599 #endif 1600 } 1601 1602 1549 1603 void storeDouble(FPRegisterID src, ImplicitAddress address) 1550 1604 { … … 1610 1664 } 1611 1665 1666 void divDouble(FPRegisterID src, FPRegisterID dest) 1667 { 1668 m_assembler.divd(dest, dest, src); 1669 } 1670 1612 1671 void convertInt32ToDouble(RegisterID src, FPRegisterID dest) 1613 1672 { 1614 1673 m_assembler.mtc1(src, fpTempRegister); 1674 m_assembler.cvtdw(dest, fpTempRegister); 1675 } 1676 1677 void convertInt32ToDouble(Address src, FPRegisterID dest) 1678 { 1679 load32(src, dataTempRegister); 1680 m_assembler.mtc1(dataTempRegister, fpTempRegister); 1681 m_assembler.cvtdw(dest, fpTempRegister); 1682 } 1683 1684 void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) 1685 { 1686 load32(src.m_ptr, dataTempRegister); 1687 m_assembler.mtc1(dataTempRegister, fpTempRegister); 1615 1688 m_assembler.cvtdw(dest, fpTempRegister); 1616 1689 } … … 1668 1741 } 1669 1742 if (cond == DoubleNotEqual) { 1670 m_assembler.c eqd(left, right);1743 m_assembler.cueqd(left, right); 1671 1744 return branchFalse(); // false 1672 1745 } … … 1690 1763 m_assembler.cueqd(left, right); 1691 1764 return branchTrue(); 1765 } 1766 if (cond == DoubleNotEqualOrUnordered) { 1767 m_assembler.ceqd(left, right); 1768 return branchFalse(); // false 1692 1769 } 1693 1770 if (cond == DoubleGreaterThanOrUnordered) { … … 1723 1800 } 1724 1801 1802 // Convert 'src' to an integer, and places the resulting 'dest'. 1803 // If the result is not representable as a 32 bit value, branch. 1804 // May also branch for some values that are representable in 32 bits 1805 // (specifically, in this case, 0). 1806 void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp) 1807 { 1808 m_assembler.cvtwd(fpTempRegister, src); 1809 m_assembler.mfc1(dest, fpTempRegister); 1810 1811 // If the result is zero, it might have been -0.0, and the double comparison won't catch this! 1812 failureCases.append(branch32(Equal, dest, MIPSRegisters::zero)); 1813 1814 // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump. 1815 convertInt32ToDouble(dest, fpTemp); 1816 failureCases.append(branchDouble(DoubleNotEqualOrUnordered, fpTemp, src)); 1817 } 1818 1819 void zeroDouble(FPRegisterID dest) 1820 { 1821 #if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64 1822 m_assembler.mtc1(MIPSRegisters::zero, dest); 1823 m_assembler.mthc1(MIPSRegisters::zero, dest); 1824 #else 1825 m_assembler.mtc1(MIPSRegisters::zero, dest); 1826 m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(dest + 1)); 1827 #endif 1828 } 1829 1725 1830 private: 1726 1831 // If m_fixedWidth is true, we will generate a fixed number of instructions.
Note:
See TracChangeset
for help on using the changeset viewer.