// Bug 2042331: v128.any_true on arm64 incorrectly used ADDP to reduce the two // 64-bit halves; additive inverses (e.g. 0x80…00 + 0x80…00 ≡ 0 mod 2^64) // could yield a false zero result. Fixed by using UMAXV instead.
let bin = wasmTextToBinary(`
(module
(memory (export "mem") 11)
(func (export "anytrue") (result i32)
(v128.any_true (v128.load (i32.const0))))
(func (export "anytrue_if") (result i32)
(if (result i32) (v128.any_true (v128.load (i32.const0)))
(then (i32.const111)) (else (i32.const222)))))`);
let ins = new WebAssembly.Instance(new WebAssembly.Module(bin));
let mem = new Uint8Array(ins.exports.mem.buffer);
function setBytes(b) { for (let i = 0; i < 16; i++) mem[i] = b[i]; }
// i64x2 = [0x8000000000000000, 0x8000000000000000]: sum ≡ 0 mod 2^64.
setBytes([0,0,0,0,0,0,0,0x80, 0,0,0,0,0,0,0,0x80]);
assertEq(ins.exports.anytrue(), 1);
assertEq(ins.exports.anytrue_if(), 111);
// i64x2 = [1, -1]: sum ≡ 0 mod 2^64.
setBytes([1,0,0,0,0,0,0,0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff]);
assertEq(ins.exports.anytrue(), 1);
assertEq(ins.exports.anytrue_if(), 111);
// Control: no cancellation.
setBytes([1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0]);
assertEq(ins.exports.anytrue(), 1);
assertEq(ins.exports.anytrue_if(), 111);
// Zero vector: any_true must return 0.
setBytes([0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0]);
assertEq(ins.exports.anytrue(), 0);
assertEq(ins.exports.anytrue_if(), 222);
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-08-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.