eq: Wasm numerische Anweisung
Die eq numerische Anweisung, kurz für gleich, prüft, ob zwei Zahlen gleich sind.
Probieren Sie es aus
(module
(import "env" "log_bool" (func $log_bool (param i32)))
(func $main
;; load `10` and `2` onto the stack
i32.const 10
i32.const 2
i32.eq ;; check if `10` is equal to `2`
call $log_bool ;; log the result
)
(start $main)
)
const url = "{%wasm-url%}";
function log_bool(value) {
console.log(Boolean(value));
// Expected output: false
}
await WebAssembly.instantiateStreaming(fetch(url), {
env: { log_bool },
});
Syntax
value_type.eq
value_type-
Der Typ des Werts, auf dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen
eq:i32i64f32f64v128Interpretationen:i8x16i16x8i32x4i64x2f32x4f64x2
eq-
Die
eqAnweisung. Muss immer nach demvalue_typeund einem Punkt (.) eingefügt werden.
Typ
[input1, input2] -> [output]
input1-
Der erste Eingabewert.
input2-
Der zweite Eingabewert.
output-
Der Ausgabewert, der ein Integer-Typ sein wird.
Für ein nicht-SIMD eq sind die Eingaben grundlegende numerische Werte wie 1 oder 3.5. Wenn die Eingabewerte gleich sind, wird 1 als Ausgabe auf den Stack geschoben, andernfalls wird 0 auf den Stack geschoben.
Für ein SIMD eq sind die Eingaben v128 Wertinterpretationen, zum Beispiel f32x4 0x9 0xa 0xb 0xc. Jeder Lane der Ausgabe, die auf den Stack geschoben wird, ist 1 oder 0, was die Gleichheit der entsprechenden Lanes in den Eingabewerten anzeigt.
Binäre Kodierung
| Anweisung | Binärformat | Beispieltext => binär |
|---|---|---|
i32.eq |
0x46 |
i32.eq => 0x46 |
i64.eq |
0x51 |
i64.eq => 0x51 |
f32.eq |
0x5b |
f32.eq => 0x5b |
f64.eq |
0x61 |
f64.eq => 0x61 |
i8x16.eq |
0xfd 35:u32 |
i8x16.eq => 0xfd 0x23 |
i16x8.eq |
0xfd 45:u32 |
i16x8.eq => 0xfd 0x2d |
i32x4.eq |
0xfd 55:u32 |
i32x4.eq => 0xfd 0x37 |
i64x2.eq |
0xfd 214:u32 |
i64x2.eq => 0xfd 0xd6 0x01 |
f32x4.eq |
0xfd 65:u32 |
f32x4.eq => 0xfd 0x41 |
f64x2.eq |
0xfd 71:u32 |
f64x2.eq => 0xfd 0x47 |
Beispiele
>SIMD-eq-Beispiel
In diesem Beispiel demonstrieren wir die Verwendung von eq, um zu testen, ob ein Lane-Wert aus zwei separaten SIMD-Werten gleich ist.
JavaScript
In unserem Skript holen wir eine Referenz zu einem <p> Element, zu dem 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 Ausgabeelement <p> schreibt. Anschließend kompilieren und instanziieren wir unser Wasm-Modul mithilfe der WebAssembly.instantiateStreaming() Methode, wobei wir das Objekt 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 prüfen, ob sie mit i16x8.eq gleich sind. Schließlich extrahieren wir den Wert, der in Lane 7 des Ausgabewerts 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 100 9 8 -7 8
v128.const i16x8 20 12 15 100 9 8 -7 4
i16x8.eq ;; check whether the values are equal
i16x8.extract_lane_s 7 ;; Extract a value from the result
call $output
)
(start $main)
)
Ergebnis
Die Ausgabe ist wie folgt:
Das Ergebnis ist 0, weil die Werte, die in Lane 7 der beiden Eingabewerte gespeichert sind, nicht gleich sind.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # numeric-instructions%E2%91%A8> |