mul: Wasm-Textanweisung
Die mul-Anweisung, Kurzform 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 dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen
mul:i32i64f32f64v128-Interpretationen:i16x8i32x4i64x2f32x4f64x2
mul-
Die
mul-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) angegeben werden.
Typ
[input1, input2] -> [output]
input1-
Der erste Eingabewert.
input2-
Der zweite Eingabewert.
output-
Das Produkt der beiden Eingabewerte.
Bei einem non-SIMD mul sind dies einfache numerische Werte wie 3 oder 3.5.
Bei einem SIMD mul sind dies v128-Wertinterpretationen, zum Beispiel f32x4 0x9 0xa 0xb 0xc. Jede Bahn des aus dem Stapel geschobenen Outputs ist das Produkt der zwei Eingabewerte, deren entsprechende Bahnwahrte multipliziert wurden.
Binäre Codierung
| Anweisung | Binärformat | Beispiel Text => 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 zeigen wir, wie ein SIMD-Wert mit einem anderen multipliziert wird und wie einer der Bahnwerte des resultierenden Produkts ausgegeben wird.
JavaScript
In unserem Skript holen wir eine Referenz zu einem <p>-Element, zu dem wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt zur Importierung in Wasm, das eine einzelne Funktion enthält, die einen Wert in das Ausgabe-<p> schreibt. Wir kompilieren und installieren anschließend unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming() und importieren dabei das Objekt.
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 und extrahieren schließlich den in Bahn 7 gespeicherten Wert des Ausgabe-Wertes mit der Anweisung extract_lane_s 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
Das Ergebnis sieht wie folgt aus:
Das Ergebnis ist 108, weil der in Bahn 3 des Ausgabewertes gespeicherte Wert das Ergebnis von 12 * 9 ist.