| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 ASSERT(!input.is(double_scratch1)); | 533 ASSERT(!input.is(double_scratch1)); |
| 534 ASSERT(!input.is(double_scratch2)); | 534 ASSERT(!input.is(double_scratch2)); |
| 535 ASSERT(!result.is(double_scratch1)); | 535 ASSERT(!result.is(double_scratch1)); |
| 536 ASSERT(!result.is(double_scratch2)); | 536 ASSERT(!result.is(double_scratch2)); |
| 537 ASSERT(!double_scratch1.is(double_scratch2)); | 537 ASSERT(!double_scratch1.is(double_scratch2)); |
| 538 ASSERT(!temp1.is(temp2)); | 538 ASSERT(!temp1.is(temp2)); |
| 539 ASSERT(!temp1.is(temp3)); | 539 ASSERT(!temp1.is(temp3)); |
| 540 ASSERT(!temp2.is(temp3)); | 540 ASSERT(!temp2.is(temp3)); |
| 541 ASSERT(ExternalReference::math_exp_constants(0).address() != NULL); | 541 ASSERT(ExternalReference::math_exp_constants(0).address() != NULL); |
| 542 | 542 |
| 543 Label done; | 543 Label zero, infinity, done; |
| 544 | 544 |
| 545 __ li(temp3, Operand(ExternalReference::math_exp_constants(0))); | 545 __ li(temp3, Operand(ExternalReference::math_exp_constants(0))); |
| 546 | 546 |
| 547 __ ldc1(double_scratch1, ExpConstant(0, temp3)); | 547 __ ldc1(double_scratch1, ExpConstant(0, temp3)); |
| 548 __ Move(result, kDoubleRegZero); | 548 __ BranchF(&zero, NULL, ge, double_scratch1, input); |
| 549 __ BranchF(&done, NULL, ge, double_scratch1, input); | 549 |
| 550 __ ldc1(double_scratch2, ExpConstant(1, temp3)); | 550 __ ldc1(double_scratch2, ExpConstant(1, temp3)); |
| 551 __ ldc1(result, ExpConstant(2, temp3)); | 551 __ BranchF(&infinity, NULL, ge, input, double_scratch2); |
| 552 __ BranchF(&done, NULL, ge, input, double_scratch2); | 552 |
| 553 __ ldc1(double_scratch1, ExpConstant(3, temp3)); | 553 __ ldc1(double_scratch1, ExpConstant(3, temp3)); |
| 554 __ ldc1(result, ExpConstant(4, temp3)); | 554 __ ldc1(result, ExpConstant(4, temp3)); |
| 555 __ mul_d(double_scratch1, double_scratch1, input); | 555 __ mul_d(double_scratch1, double_scratch1, input); |
| 556 __ add_d(double_scratch1, double_scratch1, result); | 556 __ add_d(double_scratch1, double_scratch1, result); |
| 557 __ Move(temp2, temp1, double_scratch1); | 557 __ FmoveLow(temp2, double_scratch1); |
| 558 __ sub_d(double_scratch1, double_scratch1, result); | 558 __ sub_d(double_scratch1, double_scratch1, result); |
| 559 __ ldc1(result, ExpConstant(6, temp3)); | 559 __ ldc1(result, ExpConstant(6, temp3)); |
| 560 __ ldc1(double_scratch2, ExpConstant(5, temp3)); | 560 __ ldc1(double_scratch2, ExpConstant(5, temp3)); |
| 561 __ mul_d(double_scratch1, double_scratch1, double_scratch2); | 561 __ mul_d(double_scratch1, double_scratch1, double_scratch2); |
| 562 __ sub_d(double_scratch1, double_scratch1, input); | 562 __ sub_d(double_scratch1, double_scratch1, input); |
| 563 __ sub_d(result, result, double_scratch1); | 563 __ sub_d(result, result, double_scratch1); |
| 564 __ mul_d(input, double_scratch1, double_scratch1); | 564 __ mul_d(double_scratch2, double_scratch1, double_scratch1); |
| 565 __ mul_d(result, result, input); | 565 __ mul_d(result, result, double_scratch2); |
| 566 __ srl(temp1, temp2, 11); | |
| 567 __ ldc1(double_scratch2, ExpConstant(7, temp3)); | 566 __ ldc1(double_scratch2, ExpConstant(7, temp3)); |
| 568 __ mul_d(result, result, double_scratch2); | 567 __ mul_d(result, result, double_scratch2); |
| 569 __ sub_d(result, result, double_scratch1); | 568 __ sub_d(result, result, double_scratch1); |
| 570 __ ldc1(double_scratch2, ExpConstant(8, temp3)); | 569 // Mov 1 in double_scratch2 as math_exp_constants_array[8] == 1. |
| 570 ASSERT(*reinterpret_cast<double*> |
| 571 (ExternalReference::math_exp_constants(8).address()) == 1); |
| 572 __ Move(double_scratch2, 1); |
| 571 __ add_d(result, result, double_scratch2); | 573 __ add_d(result, result, double_scratch2); |
| 572 __ li(at, 0x7ff); | 574 __ srl(temp1, temp2, 11); |
| 573 __ And(temp2, temp2, at); | 575 __ Ext(temp2, temp2, 0, 11); |
| 574 __ Addu(temp1, temp1, Operand(0x3ff)); | 576 __ Addu(temp1, temp1, Operand(0x3ff)); |
| 575 __ sll(temp1, temp1, 20); | |
| 576 | 577 |
| 577 // Must not call ExpConstant() after overwriting temp3! | 578 // Must not call ExpConstant() after overwriting temp3! |
| 578 __ li(temp3, Operand(ExternalReference::math_exp_log_table())); | 579 __ li(temp3, Operand(ExternalReference::math_exp_log_table())); |
| 579 __ sll(at, temp2, 3); | 580 __ sll(at, temp2, 3); |
| 580 __ addu(at, at, temp3); | 581 __ Addu(temp3, temp3, Operand(at)); |
| 581 __ lw(at, MemOperand(at)); | 582 __ lw(temp2, MemOperand(temp3, 0)); |
| 582 __ Addu(temp3, temp3, Operand(kPointerSize)); | 583 __ lw(temp3, MemOperand(temp3, kPointerSize)); |
| 583 __ sll(temp2, temp2, 3); | 584 // The first word is loaded is the lower number register. |
| 584 __ addu(temp2, temp2, temp3); | 585 if (temp2.code() < temp3.code()) { |
| 585 __ lw(temp2, MemOperand(temp2)); | 586 __ sll(at, temp1, 20); |
| 586 __ Or(temp1, temp1, temp2); | 587 __ Or(temp1, temp3, at); |
| 587 __ Move(input, at, temp1); | 588 __ Move(double_scratch1, temp2, temp1); |
| 588 __ mul_d(result, result, input); | 589 } else { |
| 590 __ sll(at, temp1, 20); |
| 591 __ Or(temp1, temp2, at); |
| 592 __ Move(double_scratch1, temp3, temp1); |
| 593 } |
| 594 __ mul_d(result, result, double_scratch1); |
| 595 __ Branch(&done); |
| 596 |
| 597 __ bind(&zero); |
| 598 __ Move(result, kDoubleRegZero); |
| 599 __ Branch(&done); |
| 600 |
| 601 __ bind(&infinity); |
| 602 __ ldc1(result, ExpConstant(2, temp3)); |
| 603 |
| 589 __ bind(&done); | 604 __ bind(&done); |
| 590 } | 605 } |
| 591 | 606 |
| 592 | 607 |
| 593 // nop(CODE_AGE_MARKER_NOP) | 608 // nop(CODE_AGE_MARKER_NOP) |
| 594 static const uint32_t kCodeAgePatchFirstInstruction = 0x00010180; | 609 static const uint32_t kCodeAgePatchFirstInstruction = 0x00010180; |
| 595 | 610 |
| 596 static byte* GetNoCodeAgeSequence(uint32_t* length) { | 611 static byte* GetNoCodeAgeSequence(uint32_t* length) { |
| 597 // The sequence of instructions that is patched out for aging code is the | 612 // The sequence of instructions that is patched out for aging code is the |
| 598 // following boilerplate stack-building prologue that is found in FUNCTIONS | 613 // following boilerplate stack-building prologue that is found in FUNCTIONS |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 patcher.masm()->dd(reinterpret_cast<uint32_t>(stub->instruction_start())); | 675 patcher.masm()->dd(reinterpret_cast<uint32_t>(stub->instruction_start())); |
| 661 } | 676 } |
| 662 } | 677 } |
| 663 | 678 |
| 664 | 679 |
| 665 #undef __ | 680 #undef __ |
| 666 | 681 |
| 667 } } // namespace v8::internal | 682 } } // namespace v8::internal |
| 668 | 683 |
| 669 #endif // V8_TARGET_ARCH_MIPS | 684 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |