add128: Wasm numeric instruction
The add128 numeric instruction adds two 128-bit integers, represented by four 64-bit integers, to produce a 128-bit result represented by two 64-bit integers.
Try it
(module
(import "console" "log" (func $log (param i64)))
(func $main
i64.const 123456789012345
i64.const 123456789070
i64.const 98765432101
i64.const 9876543210123
i64.add128
call $log ;; log high 64 bits
call $log ;; log low 64 bits
)
(start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });
WAT syntax
i64.add128
i64.add128-
The
i64.add128instruction.
Immediates
None.
Operand stack
[low_left_input:i64 high_left_input:i64 low_right_input:i64 high_right_input:i64] -> [low_output:i64 high_output:i64]
low_left_input-
An
i64representing the low 64 bits of the left-hand-side 128-bit integer. high_left_input-
An
i64representing the high 64 bits of the left-hand-side 128-bit integer. low_right_input-
An
i64representing the low 64 bits of the right-hand-side 128-bit integer. high_right_input-
An
i64representing the high 64 bits of the right-hand-side 128-bit integer. low_output-
An
i64representing the low 64 bits of the result. high_output-
An
i64representing the high 64 bits of the result.
Binary encoding
| Instruction | Binary format | Example text => binary |
|---|---|---|
i64.add128 |
0xfc 19:u32 |
i64.add128 => 0xfc 0x13 |
Description
The add128 instruction adds two 128-bit integers — represented by four i64 values — together to produce a 128-bit result represented by two i64 values. Such operations are termed wide arithmetic, which is useful in any situation where larger-than-64-bit numbers are being used in source languages with Wasm as a compile target, for example cryptographic algorithms.
More importantly, it also allows engines to generate more efficient machine code for these operations than is possible with i64 arithmetic operations.