Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: src/ia32/codegen-ia32.cc

Issue 339002: Change NaN-test to only check for QNaNs, and API to only introduce QNaNs. (Closed)
Patch Set: Addressed review comments. Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/globals.h ('k') | src/platform-win32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 7382 matching lines...) Expand 10 before | Expand all | Expand 10 after
7393 __ j(equal, &heap_number); 7393 __ j(equal, &heap_number);
7394 __ bind(&return_equal); 7394 __ bind(&return_equal);
7395 __ Set(eax, Immediate(0)); 7395 __ Set(eax, Immediate(0));
7396 __ ret(0); 7396 __ ret(0);
7397 7397
7398 __ bind(&heap_number); 7398 __ bind(&heap_number);
7399 // It is a heap number, so return non-equal if it's NaN and equal if it's 7399 // It is a heap number, so return non-equal if it's NaN and equal if it's
7400 // not NaN. 7400 // not NaN.
7401 // The representation of NaN values has all exponent bits (52..62) set, 7401 // The representation of NaN values has all exponent bits (52..62) set,
7402 // and not all mantissa bits (0..51) clear. 7402 // and not all mantissa bits (0..51) clear.
7403 // We only accept QNaNs, which have bit 51 set.
7403 // Read top bits of double representation (second word of value). 7404 // Read top bits of double representation (second word of value).
7404 __ mov(eax, FieldOperand(edx, HeapNumber::kExponentOffset));
7405 // Test that exponent bits are all set.
7406 __ not_(eax);
7407 __ test(eax, Immediate(0x7ff00000));
7408 __ j(not_zero, &return_equal);
7409 __ not_(eax);
7410 7405
7411 // Shift out flag and all exponent bits, retaining only mantissa. 7406 // Value is a QNaN if value & kQuietNaNMask == kQuietNaNMask, i.e.,
7412 __ shl(eax, 12); 7407 // all bits in the mask are set. We only need to check the word
7413 // Or with all low-bits of mantissa. 7408 // that contains the exponent and high bit of the mantissa.
7414 __ or_(eax, FieldOperand(edx, HeapNumber::kMantissaOffset)); 7409 ASSERT_NE(0, (kQuietNaNHighBitsMask << 1) & 0x80000000u);
7415 // Return zero equal if all bits in mantissa is zero (it's an Infinity) 7410 __ mov(edx, FieldOperand(edx, HeapNumber::kExponentOffset));
7416 // and non-zero if not (it's a NaN). 7411 __ xor_(eax, Operand(eax));
7412 // Shift value and mask so kQuietNaNHighBitsMask applies to topmost bits.
7413 __ add(edx, Operand(edx));
7414 __ cmp(edx, kQuietNaNHighBitsMask << 1);
7415 __ setcc(above_equal, eax);
7417 __ ret(0); 7416 __ ret(0);
7418 7417
7419 __ bind(&not_identical); 7418 __ bind(&not_identical);
7420 } 7419 }
7421 7420
7422 // If we're doing a strict equality comparison, we don't have to do 7421 // If we're doing a strict equality comparison, we don't have to do
7423 // type conversion, so we generate code to do fast comparison for objects 7422 // type conversion, so we generate code to do fast comparison for objects
7424 // and oddballs. Non-smi numbers and strings still go through the usual 7423 // and oddballs. Non-smi numbers and strings still go through the usual
7425 // slow-case code. 7424 // slow-case code.
7426 if (strict_) { 7425 if (strict_) {
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
8068 8067
8069 int CompareStub::MinorKey() { 8068 int CompareStub::MinorKey() {
8070 // Encode the two parameters in a unique 16 bit value. 8069 // Encode the two parameters in a unique 16 bit value.
8071 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); 8070 ASSERT(static_cast<unsigned>(cc_) < (1 << 15));
8072 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); 8071 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0);
8073 } 8072 }
8074 8073
8075 #undef __ 8074 #undef __
8076 8075
8077 } } // namespace v8::internal 8076 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/globals.h ('k') | src/platform-win32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698