mul: Wasm numerische Anweisung
Die mul numerische Anweisung, kurz für Multiplikation, wird verwendet, um eine Zahl mit einer anderen zu multiplizieren, ähnlich dem * Operator in anderen Sprachen.
Probieren Sie es aus
(module
(import "console" "log" (func $log (param i32)))
(func $main
;; load `10` and `3` onto the stack
i32.const 10
i32.const 3
i32.mul ;; multiply one number by the other
call $log ;; log the result
)
(start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });
Syntax
value_type.mul
value_type-
Der Typ des Wertes, auf den die Anweisung angewendet wird. Die folgenden Typen unterstützen
mul:i32i64f32f64v128Interpretationen:i16x8i32x4i64x2f32x4f64x2
mul-
Die
mul-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) eingefügt werden.
Typ
[input1, input2] -> [output]
input1-
Der erste Eingabewert.
input2-
Der zweite Eingabewert.
output-
Das Produkt der beiden Eingabewerte.
Für ein nicht-SIMD-mul sind dies grundlegende numerische Werte wie 3 oder 3.5.
Bei einem SIMD mul sind dies v128 Wertinterpretationen, z.B. f32x4 0x9 0xa 0xb 0xc. Jede Lane des Ergebnisses, die auf den Stack geschoben wird, ist das Produkt der entsprechenden Lane-Werte der zwei Eingaben, die miteinander multipliziert werden.
Binärkodierung
| Anweisung | Binärformat | Beispieltext => binär |
|---|---|---|
i32.mul |
0x6c |
i32.mul => 0x6c |
i64.mul |
0x7e |
i64.mul => 0x7e |
f32.mul |
0x94 |
f32.mul => 0x94 |
f64.mul |
0xa2 |
f64.mul => 0xa2 |
i16x8.mul |
0xfd 149:u32 |
i16x8.mul => 0xfd 0x95 0x01 |
i32x4.mul |
0xfd 181:u32 |
i32x4.mul => 0xfd 0xb5 0x01 |
i64x2.mul |
0xfd 213:u32 |
i64x2.mul => 0xfd 0xd5 0x01 |
f32x4.mul |
0xfd 230:u32 |
f32x4.mul => 0xfd 0xe6 0x01 |
f64x2.mul |
0xfd 242:u32 |
f64x2.mul => 0xfd 0xf2 0x01 |
Beispiele
>SIMD-Multiplikation
In diesem Beispiel demonstrieren wir die Multiplikation eines SIMD-Wertes mit einem anderen und geben einen der Lane-Werte des resultierenden Produktes aus.
JavaScript
In unserem Skript holen wir eine Referenz zu einem <p>-Element, in das wir unser Ergebnis ausgeben werden, dann definieren wir ein Objekt für den Import in Wasm, das eine einzige Funktion enthält, die einen Wert an das Ausgabe-<p> schreibt. Anschließend kompilieren und instanziieren wir unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming(), wobei wir das Objekt im Prozess importieren.
const outputElem = document.querySelector("p");
const obj = {
output(val) {
outputElem.textContent += val;
},
};
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), {
obj,
});
Wasm
In unserem Wasm-Modul importieren wir zuerst die JavaScript-Funktion output(), wobei wir sicherstellen, dass sie einen i32-Parameter hat. Dann deklarieren wir zwei SIMD i16x8 Werte, multiplizieren den ersten mit dem zweiten mittels i16x8.mul. Schließlich extrahieren wir den Wert, der in Lane 7 des Ausgabewertes gespeichert ist, mit der extract_lane_s-Anweisung und geben ihn an das DOM aus, indem wir die importierte output()-Funktion aufrufen.
(module
;; Import output function
(import "obj" "output" (func $output (param i32)))
(func $main
;; load two SIMD values onto the stack
v128.const i16x8 20 12 15 2 400 2 1 12
v128.const i16x8 18 34 3 5 9 20 21 9
i16x8.mul ;; multiply the two values
i16x8.extract_lane_s 7 ;; Extract a value from the result
call $output
)
(start $main)
)
Ergebnis
Die Ausgabe ist wie folgt:
Das Ergebnis ist 108, da der in Lane 3 gespeicherte Wert des Ausgabewertes das Resultat von 12 * 9 ist.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # numeric-instructions%E2%91%A8> |