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 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
6 | 6 |
7 #include "src/crankshaft/x87/lithium-codegen-x87.h" | 7 #include "src/crankshaft/x87/lithium-codegen-x87.h" |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 3848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3859 X87Register input_reg = ToX87Register(instr->value()); | 3859 X87Register input_reg = ToX87Register(instr->value()); |
3860 X87Fxch(input_reg); | 3860 X87Fxch(input_reg); |
3861 __ sub(esp, Immediate(kPointerSize)); | 3861 __ sub(esp, Immediate(kPointerSize)); |
3862 __ fstp_s(MemOperand(esp, 0)); | 3862 __ fstp_s(MemOperand(esp, 0)); |
3863 X87Fld(MemOperand(esp, 0), kX87FloatOperand); | 3863 X87Fld(MemOperand(esp, 0), kX87FloatOperand); |
3864 __ add(esp, Immediate(kPointerSize)); | 3864 __ add(esp, Immediate(kPointerSize)); |
3865 } | 3865 } |
3866 | 3866 |
3867 | 3867 |
3868 void LCodeGen::DoMathSqrt(LMathSqrt* instr) { | 3868 void LCodeGen::DoMathSqrt(LMathSqrt* instr) { |
3869 X87Register input = ToX87Register(instr->value()); | 3869 X87Register input_reg = ToX87Register(instr->value()); |
3870 X87Register result_reg = ToX87Register(instr->result()); | 3870 __ X87SetFPUCW(0x027F); |
3871 Register temp_result = ToRegister(instr->temp1()); | 3871 X87Fxch(input_reg); |
3872 Register temp = ToRegister(instr->temp2()); | 3872 __ fsqrt(); |
3873 Label slow, done, smi, finish; | 3873 __ X87SetFPUCW(0x037F); |
3874 DCHECK(result_reg.is(input)); | |
3875 | |
3876 // Store input into Heap number and call runtime function kMathExpRT. | |
3877 if (FLAG_inline_new) { | |
3878 __ AllocateHeapNumber(temp_result, temp, no_reg, &slow); | |
3879 __ jmp(&done, Label::kNear); | |
3880 } | |
3881 | |
3882 // Slow case: Call the runtime system to do the number allocation. | |
3883 __ bind(&slow); | |
3884 { | |
3885 // TODO(3095996): Put a valid pointer value in the stack slot where the | |
3886 // result register is stored, as this register is in the pointer map, but | |
3887 // contains an integer value. | |
3888 __ Move(temp_result, Immediate(0)); | |
3889 | |
3890 // Preserve the value of all registers. | |
3891 PushSafepointRegistersScope scope(this); | |
3892 | |
3893 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | |
3894 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | |
3895 RecordSafepointWithRegisters( | |
3896 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | |
3897 __ StoreToSafepointRegisterSlot(temp_result, eax); | |
3898 } | |
3899 __ bind(&done); | |
3900 X87LoadForUsage(input); | |
3901 __ fstp_d(FieldOperand(temp_result, HeapNumber::kValueOffset)); | |
3902 | |
3903 { | |
3904 // Preserve the value of all registers. | |
3905 PushSafepointRegistersScope scope(this); | |
3906 | |
3907 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | |
3908 __ push(temp_result); | |
3909 __ CallRuntimeSaveDoubles(Runtime::kMathSqrt); | |
3910 RecordSafepointWithRegisters(instr->pointer_map(), 1, | |
3911 Safepoint::kNoLazyDeopt); | |
3912 __ StoreToSafepointRegisterSlot(temp_result, eax); | |
3913 } | |
3914 X87PrepareToWrite(result_reg); | |
3915 // return value of MathExpRT is Smi or Heap Number. | |
3916 __ JumpIfSmi(temp_result, &smi); | |
3917 // Heap number(double) | |
3918 __ fld_d(FieldOperand(temp_result, HeapNumber::kValueOffset)); | |
3919 __ jmp(&finish); | |
3920 // SMI | |
3921 __ bind(&smi); | |
3922 __ SmiUntag(temp_result); | |
3923 __ push(temp_result); | |
3924 __ fild_s(MemOperand(esp, 0)); | |
3925 __ pop(temp_result); | |
3926 __ bind(&finish); | |
3927 X87CommitWrite(result_reg); | |
3928 } | 3874 } |
3929 | 3875 |
3930 | 3876 |
3931 void LCodeGen::DoMathPowHalf(LMathPowHalf* instr) { | 3877 void LCodeGen::DoMathPowHalf(LMathPowHalf* instr) { |
3932 X87Register input_reg = ToX87Register(instr->value()); | 3878 X87Register input_reg = ToX87Register(instr->value()); |
3933 DCHECK(ToX87Register(instr->result()).is(input_reg)); | 3879 DCHECK(ToX87Register(instr->result()).is(input_reg)); |
3934 X87Fxch(input_reg); | 3880 X87Fxch(input_reg); |
3935 // Note that according to ECMA-262 15.8.2.13: | 3881 // Note that according to ECMA-262 15.8.2.13: |
3936 // Math.pow(-Infinity, 0.5) == Infinity | 3882 // Math.pow(-Infinity, 0.5) == Infinity |
3937 // Math.sqrt(-Infinity) == NaN | 3883 // Math.sqrt(-Infinity) == NaN |
(...skipping 2331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6269 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6215 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6270 } | 6216 } |
6271 | 6217 |
6272 | 6218 |
6273 #undef __ | 6219 #undef __ |
6274 | 6220 |
6275 } // namespace internal | 6221 } // namespace internal |
6276 } // namespace v8 | 6222 } // namespace v8 |
6277 | 6223 |
6278 #endif // V8_TARGET_ARCH_X87 | 6224 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |