mul: Wasm Textanweisung
Die mul-Anweisung, kurz für Multiplikation, wird verwendet, um eine Zahl mit einer anderen Zahl 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 Werts, 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 (.) 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.
Für ein SIMD-mul sind dies v128-Wertinterpretationen, zum Beispiel f32x4 0x9 0xa 0xb 0xc. Jeder "Lane" des ausgegebenen Werts, der in den Stack geschoben wird, ist das Produkt der beiden korrespondierenden "Lane"-Werte der Eingaben, die miteinander multipliziert werden.
Binäre Kodierung
| Anweisung | Binäres Format | 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-Werts mit einem anderen und geben einen der "Lane"-Werte des resultierenden Produkts aus.
JavaScript
In unserem Skript greifen wir auf ein <p>-Element zu, in das wir unser Ergebnis ausgeben werden. Dann definieren wir ein Objekt zum Import in Wasm, das eine einzelne Funktion enthält, die einen Wert in das <p> ausgibt. Wir kompilieren und instanziieren unser Wasm-Modul mit der WebAssembly.instantiateStreaming()-Methode, 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-output()-Funktion und stellen sicher, dass sie einen i32-Parameter hat. Dann deklarieren wir zwei SIMD-i16x8-Werte und multiplizieren den ersten mit dem zweiten unter Verwendung von i16x8.mul. Schließlich extrahieren wir den Wert, der in "Lane" 7 des Ausgangswerts 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 Wert, der in "Lane" 3 des Ausgangswerts gespeichert ist, das Ergebnis von 12 * 9 ist.