OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 5318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5329 if (value.is_number()) { | 5329 if (value.is_number()) { |
5330 // Fast case if TypeInfo indicates only numbers. | 5330 // Fast case if TypeInfo indicates only numbers. |
5331 if (FLAG_debug_code) { | 5331 if (FLAG_debug_code) { |
5332 __ AbortIfNotNumber(value.reg()); | 5332 __ AbortIfNotNumber(value.reg()); |
5333 } | 5333 } |
5334 // Smi => false iff zero. | 5334 // Smi => false iff zero. |
5335 __ SmiCompare(value.reg(), Smi::FromInt(0)); | 5335 __ SmiCompare(value.reg(), Smi::FromInt(0)); |
5336 dest->false_target()->Branch(equal); | 5336 dest->false_target()->Branch(equal); |
5337 Condition is_smi = masm_->CheckSmi(value.reg()); | 5337 Condition is_smi = masm_->CheckSmi(value.reg()); |
5338 dest->true_target()->Branch(is_smi); | 5338 dest->true_target()->Branch(is_smi); |
5339 __ fldz(); | 5339 __ xorpd(xmm0, xmm0); |
5340 __ fld_d(FieldOperand(value.reg(), HeapNumber::kValueOffset)); | 5340 __ ucomisd(xmm0, FieldOperand(value.reg(), HeapNumber::kValueOffset)); |
5341 __ FCmp(); | |
5342 value.Unuse(); | 5341 value.Unuse(); |
5343 dest->Split(not_zero); | 5342 dest->Split(not_zero); |
5344 } else { | 5343 } else { |
5345 // Fast case checks. | 5344 // Fast case checks. |
5346 // 'false' => false. | 5345 // 'false' => false. |
5347 __ CompareRoot(value.reg(), Heap::kFalseValueRootIndex); | 5346 __ CompareRoot(value.reg(), Heap::kFalseValueRootIndex); |
5348 dest->false_target()->Branch(equal); | 5347 dest->false_target()->Branch(equal); |
5349 | 5348 |
5350 // 'true' => true. | 5349 // 'true' => true. |
5351 __ CompareRoot(value.reg(), Heap::kTrueValueRootIndex); | 5350 __ CompareRoot(value.reg(), Heap::kTrueValueRootIndex); |
(...skipping 2641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7993 | 7992 |
7994 // String value => false iff empty. | 7993 // String value => false iff empty. |
7995 __ cmpq(rcx, Immediate(FIRST_NONSTRING_TYPE)); | 7994 __ cmpq(rcx, Immediate(FIRST_NONSTRING_TYPE)); |
7996 __ j(above_equal, ¬_string); | 7995 __ j(above_equal, ¬_string); |
7997 __ movq(rdx, FieldOperand(rax, String::kLengthOffset)); | 7996 __ movq(rdx, FieldOperand(rax, String::kLengthOffset)); |
7998 __ SmiTest(rdx); | 7997 __ SmiTest(rdx); |
7999 __ j(zero, &false_result); | 7998 __ j(zero, &false_result); |
8000 __ jmp(&true_result); | 7999 __ jmp(&true_result); |
8001 | 8000 |
8002 __ bind(¬_string); | 8001 __ bind(¬_string); |
8003 // HeapNumber => false iff +0, -0, or NaN. | |
8004 // These three cases set C3 when compared to zero in the FPU. | |
8005 __ CompareRoot(rdx, Heap::kHeapNumberMapRootIndex); | 8002 __ CompareRoot(rdx, Heap::kHeapNumberMapRootIndex); |
8006 __ j(not_equal, &true_result); | 8003 __ j(not_equal, &true_result); |
8007 __ fldz(); // Load zero onto fp stack | 8004 // HeapNumber => false iff +0, -0, or NaN. |
8008 // Load heap-number double value onto fp stack | 8005 // These three cases set the zero flag when compared to zero using ucomisd. |
8009 __ fld_d(FieldOperand(rax, HeapNumber::kValueOffset)); | 8006 __ xorpd(xmm0, xmm0); |
8010 __ FCmp(); | 8007 __ ucomisd(xmm0, FieldOperand(rax, HeapNumber::kValueOffset)); |
8011 __ j(zero, &false_result); | 8008 __ j(zero, &false_result); |
8012 // Fall through to |true_result|. | 8009 // Fall through to |true_result|. |
8013 | 8010 |
8014 // Return 1/0 for true/false in rax. | 8011 // Return 1/0 for true/false in rax. |
8015 __ bind(&true_result); | 8012 __ bind(&true_result); |
8016 __ movq(rax, Immediate(1)); | 8013 __ movq(rax, Immediate(1)); |
8017 __ ret(1 * kPointerSize); | 8014 __ ret(1 * kPointerSize); |
8018 __ bind(&false_result); | 8015 __ bind(&false_result); |
8019 __ xor_(rax, rax); | 8016 __ xor_(rax, rax); |
8020 __ ret(1 * kPointerSize); | 8017 __ ret(1 * kPointerSize); |
(...skipping 3873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11894 } | 11891 } |
11895 | 11892 |
11896 #endif | 11893 #endif |
11897 | 11894 |
11898 | 11895 |
11899 #undef __ | 11896 #undef __ |
11900 | 11897 |
11901 } } // namespace v8::internal | 11898 } } // namespace v8::internal |
11902 | 11899 |
11903 #endif // V8_TARGET_ARCH_X64 | 11900 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |