| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
| 8 | 8 |
| 9 #include "src/base/bits.h" |
| 9 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 11 #include "src/codegen.h" |
| 11 #include "src/cpu-profiler.h" | 12 #include "src/cpu-profiler.h" |
| 12 #include "src/debug.h" | 13 #include "src/debug.h" |
| 13 #include "src/isolate-inl.h" | 14 #include "src/isolate-inl.h" |
| 14 #include "src/runtime.h" | 15 #include "src/runtime.h" |
| 15 #include "src/serialize.h" | 16 #include "src/serialize.h" |
| 16 | 17 |
| 17 namespace v8 { | 18 namespace v8 { |
| 18 namespace internal { | 19 namespace internal { |
| (...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 mov(Operand::StaticVariable(context_address), esi); | 889 mov(Operand::StaticVariable(context_address), esi); |
| 889 } | 890 } |
| 890 | 891 |
| 891 | 892 |
| 892 void MacroAssembler::EnterExitFrameEpilogue(int argc) { | 893 void MacroAssembler::EnterExitFrameEpilogue(int argc) { |
| 893 sub(esp, Immediate(argc * kPointerSize)); | 894 sub(esp, Immediate(argc * kPointerSize)); |
| 894 | 895 |
| 895 // Get the required frame alignment for the OS. | 896 // Get the required frame alignment for the OS. |
| 896 const int kFrameAlignment = base::OS::ActivationFrameAlignment(); | 897 const int kFrameAlignment = base::OS::ActivationFrameAlignment(); |
| 897 if (kFrameAlignment > 0) { | 898 if (kFrameAlignment > 0) { |
| 898 DCHECK(IsPowerOf2(kFrameAlignment)); | 899 DCHECK(base::bits::IsPowerOfTwo32(kFrameAlignment)); |
| 899 and_(esp, -kFrameAlignment); | 900 and_(esp, -kFrameAlignment); |
| 900 } | 901 } |
| 901 | 902 |
| 902 // Patch the saved entry sp. | 903 // Patch the saved entry sp. |
| 903 mov(Operand(ebp, ExitFrameConstants::kSPOffset), esp); | 904 mov(Operand(ebp, ExitFrameConstants::kSPOffset), esp); |
| 904 } | 905 } |
| 905 | 906 |
| 906 | 907 |
| 907 void MacroAssembler::EnterExitFrame() { | 908 void MacroAssembler::EnterExitFrame() { |
| 908 EnterExitFramePrologue(); | 909 EnterExitFramePrologue(); |
| (...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 bind(&entry); | 1821 bind(&entry); |
| 1821 cmp(start_offset, end_offset); | 1822 cmp(start_offset, end_offset); |
| 1822 j(less, &loop); | 1823 j(less, &loop); |
| 1823 } | 1824 } |
| 1824 | 1825 |
| 1825 | 1826 |
| 1826 void MacroAssembler::BooleanBitTest(Register object, | 1827 void MacroAssembler::BooleanBitTest(Register object, |
| 1827 int field_offset, | 1828 int field_offset, |
| 1828 int bit_index) { | 1829 int bit_index) { |
| 1829 bit_index += kSmiTagSize + kSmiShiftSize; | 1830 bit_index += kSmiTagSize + kSmiShiftSize; |
| 1830 DCHECK(IsPowerOf2(kBitsPerByte)); | 1831 DCHECK(base::bits::IsPowerOfTwo32(kBitsPerByte)); |
| 1831 int byte_index = bit_index / kBitsPerByte; | 1832 int byte_index = bit_index / kBitsPerByte; |
| 1832 int byte_bit_index = bit_index & (kBitsPerByte - 1); | 1833 int byte_bit_index = bit_index & (kBitsPerByte - 1); |
| 1833 test_b(FieldOperand(object, field_offset + byte_index), | 1834 test_b(FieldOperand(object, field_offset + byte_index), |
| 1834 static_cast<byte>(1 << byte_bit_index)); | 1835 static_cast<byte>(1 << byte_bit_index)); |
| 1835 } | 1836 } |
| 1836 | 1837 |
| 1837 | 1838 |
| 1838 | 1839 |
| 1839 void MacroAssembler::NegativeZeroTest(Register result, | 1840 void MacroAssembler::NegativeZeroTest(Register result, |
| 1840 Register op, | 1841 Register op, |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2661 Abort(reason); | 2662 Abort(reason); |
| 2662 // will not return here | 2663 // will not return here |
| 2663 bind(&L); | 2664 bind(&L); |
| 2664 } | 2665 } |
| 2665 | 2666 |
| 2666 | 2667 |
| 2667 void MacroAssembler::CheckStackAlignment() { | 2668 void MacroAssembler::CheckStackAlignment() { |
| 2668 int frame_alignment = base::OS::ActivationFrameAlignment(); | 2669 int frame_alignment = base::OS::ActivationFrameAlignment(); |
| 2669 int frame_alignment_mask = frame_alignment - 1; | 2670 int frame_alignment_mask = frame_alignment - 1; |
| 2670 if (frame_alignment > kPointerSize) { | 2671 if (frame_alignment > kPointerSize) { |
| 2671 DCHECK(IsPowerOf2(frame_alignment)); | 2672 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment)); |
| 2672 Label alignment_as_expected; | 2673 Label alignment_as_expected; |
| 2673 test(esp, Immediate(frame_alignment_mask)); | 2674 test(esp, Immediate(frame_alignment_mask)); |
| 2674 j(zero, &alignment_as_expected); | 2675 j(zero, &alignment_as_expected); |
| 2675 // Abort if stack is not aligned. | 2676 // Abort if stack is not aligned. |
| 2676 int3(); | 2677 int3(); |
| 2677 bind(&alignment_as_expected); | 2678 bind(&alignment_as_expected); |
| 2678 } | 2679 } |
| 2679 } | 2680 } |
| 2680 | 2681 |
| 2681 | 2682 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2891 } | 2892 } |
| 2892 | 2893 |
| 2893 | 2894 |
| 2894 void MacroAssembler::PrepareCallCFunction(int num_arguments, Register scratch) { | 2895 void MacroAssembler::PrepareCallCFunction(int num_arguments, Register scratch) { |
| 2895 int frame_alignment = base::OS::ActivationFrameAlignment(); | 2896 int frame_alignment = base::OS::ActivationFrameAlignment(); |
| 2896 if (frame_alignment != 0) { | 2897 if (frame_alignment != 0) { |
| 2897 // Make stack end at alignment and make room for num_arguments words | 2898 // Make stack end at alignment and make room for num_arguments words |
| 2898 // and the original value of esp. | 2899 // and the original value of esp. |
| 2899 mov(scratch, esp); | 2900 mov(scratch, esp); |
| 2900 sub(esp, Immediate((num_arguments + 1) * kPointerSize)); | 2901 sub(esp, Immediate((num_arguments + 1) * kPointerSize)); |
| 2901 DCHECK(IsPowerOf2(frame_alignment)); | 2902 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment)); |
| 2902 and_(esp, -frame_alignment); | 2903 and_(esp, -frame_alignment); |
| 2903 mov(Operand(esp, num_arguments * kPointerSize), scratch); | 2904 mov(Operand(esp, num_arguments * kPointerSize), scratch); |
| 2904 } else { | 2905 } else { |
| 2905 sub(esp, Immediate(num_arguments * kPointerSize)); | 2906 sub(esp, Immediate(num_arguments * kPointerSize)); |
| 2906 } | 2907 } |
| 2907 } | 2908 } |
| 2908 | 2909 |
| 2909 | 2910 |
| 2910 void MacroAssembler::CallCFunction(ExternalReference function, | 2911 void MacroAssembler::CallCFunction(ExternalReference function, |
| 2911 int num_arguments) { | 2912 int num_arguments) { |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3317 if (ms.shift() > 0) sar(edx, ms.shift()); | 3318 if (ms.shift() > 0) sar(edx, ms.shift()); |
| 3318 mov(eax, dividend); | 3319 mov(eax, dividend); |
| 3319 shr(eax, 31); | 3320 shr(eax, 31); |
| 3320 add(edx, eax); | 3321 add(edx, eax); |
| 3321 } | 3322 } |
| 3322 | 3323 |
| 3323 | 3324 |
| 3324 } } // namespace v8::internal | 3325 } } // namespace v8::internal |
| 3325 | 3326 |
| 3326 #endif // V8_TARGET_ARCH_X87 | 3327 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |