OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 __ test(temp.reg(), Operand(temp.reg())); | 747 __ test(temp.reg(), Operand(temp.reg())); |
748 temp.Unuse(); | 748 temp.Unuse(); |
749 dest->Split(not_equal); | 749 dest->Split(not_equal); |
750 } | 750 } |
751 | 751 |
752 | 752 |
753 class FloatingPointHelper : public AllStatic { | 753 class FloatingPointHelper : public AllStatic { |
754 public: | 754 public: |
755 // Code pattern for loading a floating point value. Input value must | 755 // Code pattern for loading a floating point value. Input value must |
756 // be either a smi or a heap number object (fp value). Requirements: | 756 // be either a smi or a heap number object (fp value). Requirements: |
757 // operand on TOS+1. Returns operand as floating point number on FPU | 757 // operand in register number. Returns operand as floating point number |
758 // stack. | 758 // on FPU stack. |
759 static void LoadFloatOperand(MacroAssembler* masm, Register scratch); | 759 static void LoadFloatOperand(MacroAssembler* masm, Register number); |
760 // Code pattern for loading floating point values. Input values must | 760 // Code pattern for loading floating point values. Input values must |
761 // be either smi or heap number objects (fp values). Requirements: | 761 // be either smi or heap number objects (fp values). Requirements: |
762 // operand_1 on TOS+1 , operand_2 on TOS+2; Returns operands as | 762 // operand_1 on TOS+1 , operand_2 on TOS+2; Returns operands as |
763 // floating point numbers on FPU stack. | 763 // floating point numbers on FPU stack. |
764 static void LoadFloatOperands(MacroAssembler* masm, Register scratch); | 764 static void LoadFloatOperands(MacroAssembler* masm, Register scratch); |
765 // Test if operands are smi or number objects (fp). Requirements: | 765 // Test if operands are smi or number objects (fp). Requirements: |
766 // operand_1 in eax, operand_2 in edx; falls through on float | 766 // operand_1 in eax, operand_2 in edx; falls through on float |
767 // operands, jumps to the non_float label otherwise. | 767 // operands, jumps to the non_float label otherwise. |
768 static void CheckFloatOperands(MacroAssembler* masm, | 768 static void CheckFloatOperands(MacroAssembler* masm, |
769 Label* non_float, | 769 Label* non_float, |
(...skipping 4387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5157 switch (op) { | 5157 switch (op) { |
5158 case SIN: | 5158 case SIN: |
5159 __ fsin(); | 5159 __ fsin(); |
5160 break; | 5160 break; |
5161 case COS: | 5161 case COS: |
5162 __ fcos(); | 5162 __ fcos(); |
5163 break; | 5163 break; |
5164 } | 5164 } |
5165 | 5165 |
5166 // Go slow case if argument to operation is out of range. | 5166 // Go slow case if argument to operation is out of range. |
| 5167 Result eax_reg = allocator_->Allocate(eax); |
| 5168 ASSERT(eax_reg.is_valid()); |
5167 __ fnstsw_ax(); | 5169 __ fnstsw_ax(); |
5168 __ sahf(); | 5170 __ sahf(); |
| 5171 eax_reg.Unuse(); |
5169 call_runtime.Branch(parity_even, not_taken); | 5172 call_runtime.Branch(parity_even, not_taken); |
5170 | 5173 |
5171 // Allocate heap number for result if possible. | 5174 // Allocate heap number for result if possible. |
5172 Result scratch1 = allocator()->Allocate(); | 5175 Result scratch1 = allocator()->Allocate(); |
5173 Result scratch2 = allocator()->Allocate(); | 5176 Result scratch2 = allocator()->Allocate(); |
5174 Result heap_number = allocator()->Allocate(); | 5177 Result heap_number = allocator()->Allocate(); |
5175 FloatingPointHelper::AllocateHeapNumber(masm_, | 5178 FloatingPointHelper::AllocateHeapNumber(masm_, |
5176 call_runtime.entry_label(), | 5179 call_runtime.entry_label(), |
5177 scratch1.reg(), | 5180 scratch1.reg(), |
5178 scratch2.reg(), | 5181 scratch2.reg(), |
(...skipping 1778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6957 | 6960 |
6958 __ mov(Operand(scratch1, 0), scratch2); // store new top | 6961 __ mov(Operand(scratch1, 0), scratch2); // store new top |
6959 __ mov(Operand(result, HeapObject::kMapOffset), | 6962 __ mov(Operand(result, HeapObject::kMapOffset), |
6960 Immediate(Factory::heap_number_map())); | 6963 Immediate(Factory::heap_number_map())); |
6961 // Tag old top and use as result. | 6964 // Tag old top and use as result. |
6962 __ add(Operand(result), Immediate(kHeapObjectTag)); | 6965 __ add(Operand(result), Immediate(kHeapObjectTag)); |
6963 } | 6966 } |
6964 | 6967 |
6965 | 6968 |
6966 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, | 6969 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, |
6967 Register scratch) { | 6970 Register number) { |
6968 Label load_smi, done; | 6971 Label load_smi, done; |
6969 | 6972 |
6970 __ test(scratch, Immediate(kSmiTagMask)); | 6973 __ test(number, Immediate(kSmiTagMask)); |
6971 __ j(zero, &load_smi, not_taken); | 6974 __ j(zero, &load_smi, not_taken); |
6972 __ fld_d(FieldOperand(scratch, HeapNumber::kValueOffset)); | 6975 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); |
6973 __ jmp(&done); | 6976 __ jmp(&done); |
6974 | 6977 |
6975 __ bind(&load_smi); | 6978 __ bind(&load_smi); |
6976 __ sar(scratch, kSmiTagSize); | 6979 __ sar(number, kSmiTagSize); |
6977 __ push(scratch); | 6980 __ push(number); |
6978 __ fild_s(Operand(esp, 0)); | 6981 __ fild_s(Operand(esp, 0)); |
6979 __ pop(scratch); | 6982 __ pop(number); |
6980 | 6983 |
6981 __ bind(&done); | 6984 __ bind(&done); |
6982 } | 6985 } |
6983 | 6986 |
6984 | 6987 |
6985 void FloatingPointHelper::LoadFloatOperands(MacroAssembler* masm, | 6988 void FloatingPointHelper::LoadFloatOperands(MacroAssembler* masm, |
6986 Register scratch) { | 6989 Register scratch) { |
6987 Label load_smi_1, load_smi_2, done_load_1, done; | 6990 Label load_smi_1, load_smi_2, done_load_1, done; |
6988 __ mov(scratch, Operand(esp, 2 * kPointerSize)); | 6991 __ mov(scratch, Operand(esp, 2 * kPointerSize)); |
6989 __ test(scratch, Immediate(kSmiTagMask)); | 6992 __ test(scratch, Immediate(kSmiTagMask)); |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7865 | 7868 |
7866 int CompareStub::MinorKey() { | 7869 int CompareStub::MinorKey() { |
7867 // Encode the two parameters in a unique 16 bit value. | 7870 // Encode the two parameters in a unique 16 bit value. |
7868 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); | 7871 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); |
7869 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); | 7872 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); |
7870 } | 7873 } |
7871 | 7874 |
7872 #undef __ | 7875 #undef __ |
7873 | 7876 |
7874 } } // namespace v8::internal | 7877 } } // namespace v8::internal |
OLD | NEW |