Double field values need sNaN -> qNaN canonicalization.
Also fix mjsunit/regress/regress-undefined-nan to ensure that we are testing transfer via xmm registers by forcing the transfer to be in an optimized function. BUG=v8:3839 LOG=n R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/863153002 Cr-Commit-Position: refs/heads/master@{#26213}
This commit is contained in:
parent
ebab2f12e9
commit
0381acf7b3
@ -4063,9 +4063,11 @@ bool HStoreKeyed::NeedsCanonicalization() {
|
||||
Representation from = HChange::cast(value())->from();
|
||||
return from.IsTagged() || from.IsHeapObject();
|
||||
}
|
||||
case kPhi:
|
||||
case kLoadNamedField:
|
||||
case kPhi: {
|
||||
// Better safe than sorry...
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -15,7 +15,17 @@ i_view[1] = 0xFFF7FFFF;
|
||||
var f_view = new Float64Array(ab);
|
||||
|
||||
var fixed_double_elements = new Float64Array(1);
|
||||
fixed_double_elements[0] = f_view[0];
|
||||
|
||||
function opt_store() { fixed_double_elements[0] = f_view[0]; }
|
||||
|
||||
opt_store();
|
||||
opt_store();
|
||||
%OptimizeFunctionOnNextCall(opt_store);
|
||||
opt_store();
|
||||
|
||||
var i32 = new Int32Array(fixed_double_elements.buffer);
|
||||
assertEquals(i_view[0], i32[0]);
|
||||
assertEquals(i_view[1], i32[1]);
|
||||
|
||||
var doubles = [0.5];
|
||||
loader(doubles, fixed_double_elements, 0);
|
||||
|
32
test/mjsunit/regress/regress-undefined-nan3.js
Normal file
32
test/mjsunit/regress/regress-undefined-nan3.js
Normal file
@ -0,0 +1,32 @@
|
||||
// Copyright 2015 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
var ab = new ArrayBuffer(8);
|
||||
var i_view = new Int32Array(ab);
|
||||
i_view[0] = 0xFFF7FFFF;
|
||||
i_view[1] = 0xFFF7FFFF;
|
||||
var f_view = new Float64Array(ab);
|
||||
|
||||
var fixed_double_elements = new Float64Array(1);
|
||||
fixed_double_elements[0] = f_view[0];
|
||||
|
||||
function A(src) { this.x = src[0]; }
|
||||
|
||||
new A(fixed_double_elements);
|
||||
new A(fixed_double_elements);
|
||||
|
||||
%OptimizeFunctionOnNextCall(A);
|
||||
|
||||
var obj = new A(fixed_double_elements);
|
||||
|
||||
function move_x(dst, obj) { dst[0] = obj.x; }
|
||||
|
||||
var doubles = [0.5];
|
||||
move_x(doubles, obj);
|
||||
move_x(doubles, obj);
|
||||
%OptimizeFunctionOnNextCall(move_x);
|
||||
move_x(doubles, obj);
|
||||
assertTrue(doubles[0] !== undefined);
|
Loading…
Reference in New Issue
Block a user