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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 CodeDesc desc; | 92 CodeDesc desc; |
93 masm.GetCode(&desc); | 93 masm.GetCode(&desc); |
94 ASSERT(desc.reloc_size == 0); | 94 ASSERT(desc.reloc_size == 0); |
95 | 95 |
96 CPU::FlushICache(buffer, actual_size); | 96 CPU::FlushICache(buffer, actual_size); |
97 OS::ProtectCode(buffer, actual_size); | 97 OS::ProtectCode(buffer, actual_size); |
98 return FUNCTION_CAST<UnaryMathFunction>(buffer); | 98 return FUNCTION_CAST<UnaryMathFunction>(buffer); |
99 } | 99 } |
100 | 100 |
101 | 101 |
| 102 UnaryMathFunction CreateExpFunction() { |
| 103 if (!FLAG_fast_math) return &exp; |
| 104 size_t actual_size; |
| 105 byte* buffer = static_cast<byte*>(OS::Allocate(1 * KB, &actual_size, true)); |
| 106 if (buffer == NULL) return &exp; |
| 107 ExternalReference::InitializeMathExpData(); |
| 108 |
| 109 MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size)); |
| 110 // xmm0: raw double input. |
| 111 XMMRegister input = xmm0; |
| 112 XMMRegister result = xmm1; |
| 113 __ push(rax); |
| 114 __ push(rbx); |
| 115 |
| 116 MathExpGenerator::EmitMathExp(&masm, input, result, xmm2, rax, rbx); |
| 117 |
| 118 __ pop(rbx); |
| 119 __ pop(rax); |
| 120 __ movsd(xmm0, result); |
| 121 __ Ret(); |
| 122 |
| 123 CodeDesc desc; |
| 124 masm.GetCode(&desc); |
| 125 |
| 126 CPU::FlushICache(buffer, actual_size); |
| 127 OS::ProtectCode(buffer, actual_size); |
| 128 return FUNCTION_CAST<UnaryMathFunction>(buffer); |
| 129 } |
| 130 |
| 131 |
102 UnaryMathFunction CreateSqrtFunction() { | 132 UnaryMathFunction CreateSqrtFunction() { |
103 size_t actual_size; | 133 size_t actual_size; |
104 // Allocate buffer in executable space. | 134 // Allocate buffer in executable space. |
105 byte* buffer = static_cast<byte*>(OS::Allocate(1 * KB, | 135 byte* buffer = static_cast<byte*>(OS::Allocate(1 * KB, |
106 &actual_size, | 136 &actual_size, |
107 true)); | 137 true)); |
108 if (buffer == NULL) return &sqrt; | 138 if (buffer == NULL) return &sqrt; |
109 | 139 |
110 MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size)); | 140 MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size)); |
111 // xmm0: raw double input. | 141 // xmm0: raw double input. |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 // ASCII string. | 598 // ASCII string. |
569 // Load the byte into the result register. | 599 // Load the byte into the result register. |
570 __ bind(&ascii); | 600 __ bind(&ascii); |
571 __ movzxbl(result, FieldOperand(string, | 601 __ movzxbl(result, FieldOperand(string, |
572 index, | 602 index, |
573 times_1, | 603 times_1, |
574 SeqOneByteString::kHeaderSize)); | 604 SeqOneByteString::kHeaderSize)); |
575 __ bind(&done); | 605 __ bind(&done); |
576 } | 606 } |
577 | 607 |
| 608 |
| 609 void MathExpGenerator::EmitMathExp(MacroAssembler* masm, |
| 610 XMMRegister input, |
| 611 XMMRegister result, |
| 612 XMMRegister double_scratch, |
| 613 Register temp1, |
| 614 Register temp2) { |
| 615 ASSERT(!input.is(result)); |
| 616 ASSERT(!input.is(double_scratch)); |
| 617 ASSERT(!result.is(double_scratch)); |
| 618 ASSERT(!temp1.is(temp2)); |
| 619 ASSERT(ExternalReference::math_exp_constants(0).address() != NULL); |
| 620 |
| 621 Label done; |
| 622 |
| 623 __ movq(kScratchRegister, ExternalReference::math_exp_constants(0)); |
| 624 __ movsd(double_scratch, Operand(kScratchRegister, 0 * kDoubleSize)); |
| 625 __ xorpd(result, result); |
| 626 __ ucomisd(double_scratch, input); |
| 627 __ j(above_equal, &done); |
| 628 __ ucomisd(input, Operand(kScratchRegister, 1 * kDoubleSize)); |
| 629 __ movsd(result, Operand(kScratchRegister, 2 * kDoubleSize)); |
| 630 __ j(above_equal, &done); |
| 631 __ movsd(double_scratch, Operand(kScratchRegister, 3 * kDoubleSize)); |
| 632 __ movsd(result, Operand(kScratchRegister, 4 * kDoubleSize)); |
| 633 __ mulsd(double_scratch, input); |
| 634 __ addsd(double_scratch, result); |
| 635 __ movq(temp2, double_scratch); |
| 636 __ subsd(double_scratch, result); |
| 637 __ movsd(result, Operand(kScratchRegister, 6 * kDoubleSize)); |
| 638 __ lea(temp1, Operand(temp2, 0x1ff800)); |
| 639 __ and_(temp2, Immediate(0x7ff)); |
| 640 __ shr(temp1, Immediate(11)); |
| 641 __ mulsd(double_scratch, Operand(kScratchRegister, 5 * kDoubleSize)); |
| 642 __ movq(kScratchRegister, ExternalReference::math_exp_log_table()); |
| 643 __ shl(temp1, Immediate(52)); |
| 644 __ or_(temp1, Operand(kScratchRegister, temp2, times_8, 0)); |
| 645 __ movq(kScratchRegister, ExternalReference::math_exp_constants(0)); |
| 646 __ subsd(double_scratch, input); |
| 647 __ movsd(input, double_scratch); |
| 648 __ subsd(result, double_scratch); |
| 649 __ mulsd(input, double_scratch); |
| 650 __ mulsd(result, input); |
| 651 __ movq(input, temp1); |
| 652 __ mulsd(result, Operand(kScratchRegister, 7 * kDoubleSize)); |
| 653 __ subsd(result, double_scratch); |
| 654 __ addsd(result, Operand(kScratchRegister, 8 * kDoubleSize)); |
| 655 __ mulsd(result, input); |
| 656 |
| 657 __ bind(&done); |
| 658 } |
| 659 |
578 #undef __ | 660 #undef __ |
579 | 661 |
580 | 662 |
581 static const int kNoCodeAgeSequenceLength = 6; | 663 static const int kNoCodeAgeSequenceLength = 6; |
582 | 664 |
583 static byte* GetNoCodeAgeSequence(uint32_t* length) { | 665 static byte* GetNoCodeAgeSequence(uint32_t* length) { |
584 static bool initialized = false; | 666 static bool initialized = false; |
585 static byte sequence[kNoCodeAgeSequenceLength]; | 667 static byte sequence[kNoCodeAgeSequenceLength]; |
586 *length = kNoCodeAgeSequenceLength; | 668 *length = kNoCodeAgeSequenceLength; |
587 if (!initialized) { | 669 if (!initialized) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 CodePatcher patcher(sequence, young_length); | 740 CodePatcher patcher(sequence, young_length); |
659 patcher.masm()->call(stub->instruction_start()); | 741 patcher.masm()->call(stub->instruction_start()); |
660 patcher.masm()->nop(); | 742 patcher.masm()->nop(); |
661 } | 743 } |
662 } | 744 } |
663 | 745 |
664 | 746 |
665 } } // namespace v8::internal | 747 } } // namespace v8::internal |
666 | 748 |
667 #endif // V8_TARGET_ARCH_X64 | 749 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |