nodejs/deps/v8/test/mjsunit/compiler/dataview-float16.js
Michaël Zasso 918fe04351
deps: update V8 to 13.6.233.8
PR-URL: https://github.com/nodejs/node/pull/58070
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
2025-05-02 15:06:53 +02:00

82 lines
3.1 KiB
JavaScript

// Copyright 2025 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: --no-always-turbofan --turbofan --js-staging
// Flags: --allow-natives-syntax
var buffer = new ArrayBuffer(64);
var dataview = new DataView(buffer, 8, 24);
function readFloat16(offset, littleEndian) {
return dataview.getFloat16(offset, littleEndian);
}
function writeFloat16(offset, val, littleEndian) {
dataview.setFloat16(offset, val, littleEndian);
}
function warmup(f, ...args) {
%PrepareFunctionForOptimization(f);
f(0, ...args);
f(1, ...args);
%OptimizeFunctionOnNextCall(f);
f(2, ...args);
f(3, ...args);
}
const cases = [
{ input: 1.1, expected: Math.f16round(1.1) },
{ input: -1.1, expected: Math.f16round(-1.1) },
// an integer which rounds down under ties-to-even when cast to float16
{ input: 2049, expected: 2048 },
// an integer which rounds up under ties-to-even when cast to float16
{ input: 2051, expected: 2052 },
// smallest normal float16
{ input: 0.00006103515625, expected: 0.00006103515625 },
// largest subnormal float16
{ input: 0.00006097555160522461, expected: 0.00006097555160522461 },
// smallest float16
{ input: 5.960464477539063e-8, expected: 5.960464477539063e-8 },
// largest double which rounds to 0 when cast to float16
{ input: 2.9802322387695312e-8, expected: 0 },
// smallest double which does not round to 0 when cast to float16
{ input: 2.980232238769532e-8, expected: 5.960464477539063e-8 },
// a double which rounds up to a subnormal under ties-to-even when cast to float16
{ input: 8.940696716308594e-8, expected: 1.1920928955078125e-7 },
// a double which rounds down to a subnormal under ties-to-even when cast to float16
{ input: 1.4901161193847656e-7, expected: 1.1920928955078125e-7 },
// the next double above the one on the previous line one
{ input: 1.490116119384766e-7, expected: 1.7881393432617188e-7 },
// max finite float16
{ input: 65504, expected: 65504 },
// largest double which does not round to infinity when cast to float16
{ input: 65519.99999999999, expected: 65504 },
// lowest negative double which does not round to infinity when cast to float16
{ input: -65519.99999999999, expected: -65504 },
// smallest double which rounds to a non-subnormal when cast to float16
{ input: 0.000061005353927612305, expected: 0.00006103515625 },
// largest double which rounds to a subnormal when cast to float16
{ input: 0.0000610053539276123, expected: 0.00006097555160522461 },
{ input: NaN, expected: NaN },
{ input: Infinity, expected: Infinity },
{ input: -Infinity, expected: -Infinity },
// smallest double which rounds to infinity when cast to float16
{ input: 65520, expected: Infinity },
{ input: -65520, expected: - Infinity },
];
warmup(writeFloat16, 1.1);
warmup(readFloat16);
for (let {input, expected} of cases) {
for (let lilEndian of [true, false]) {
writeFloat16(0, input, lilEndian);
assertOptimized(writeFloat16);
assertEquals(expected, readFloat16(0, lilEndian));
assertOptimized(writeFloat16);
}
}