abs: Wasm-Zahlenanweisung
Die abs Zahlenanweisung, kurz für absolut, wird verwendet, um den Absolutwert einer Zahl zu ermitteln. Das heißt, sie gibt x zurück, wenn x positiv ist, und die Negation von x, wenn x negativ ist.
Probieren Sie es aus
(module
(import "console" "log" (func $log (param f32)))
(func $main
f32.const -10 ;; load a number onto the stack
f32.abs ;; calculate the absolute value
call $log ;; log the result
)
(start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });
Syntax
value_type.abs
value_type-
Der Typ des Wertes, auf dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen
abs:f32f64v128Interpretationen:i8x16i16x8i32x4i64x2f32x4f64x2
abs-
Die
abs-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) angegeben werden.
Typ
[input] -> [output]
Für ein nicht-SIMD-abs werden input und output einfache numerische Werte wie 3.5 oder 10 sein.
Für ein SIMD-abs werden input und output v128-Wertinterpretationen sein, zum Beispiel i32x4 4 8 12 16. Jedes Lane des Ausgabewertes, der auf den Stack geschoben wird, ist der Absolutwert des entsprechenden Lanes im Eingabewert.
Binärcodierung
| Anweisung | Binärformat | Beispieltext => binär |
|---|---|---|
f32.abs |
0x8b |
f32.abs => 0x8b |
f64.abs |
0x99 |
f64.abs => 0x99 |
i8x16.abs |
0xfd 96:u32 |
i8x16.abs => 0xfd 0x60 |
i16x8.abs |
0xfd 128:u32 |
i16x8.abs => 0xfd 0x80 0x01 |
i32x4.abs |
0xfd 160:u32 |
i32x4.abs => 0xfd 0xa0 0x01 |
i64x2.abs |
0xfd 192:u32 |
i64x2.abs => 0xfd 0xc0 0x01 |
f32x4.abs |
0xfd 224:u32 |
f32x4.abs => 0xfd 0xe0 0x01 |
f64x2.abs |
0xfd 236:u32 |
f64x2.abs => 0xfd 0xec 0x01 |
Beispiele
>SIMD abs
In diesem Beispiel demonstrieren wir die Ausführung der abs-Anweisung auf einem SIMD-Wert und die Ausgabe eines der resultierenden Lane-Werte.
JavaScript
In unserem Skript greifen wir auf eine Referenz zu einem <p>-Element zu, in das wir unser Ergebnis ausgeben werden. Dann definieren wir ein Objekt zum Importieren in Wasm, das eine einzelne 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() 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-output() Funktion, wobei wir sicherstellen, dass wir deklarieren, dass sie einen i32-Parameter hat. Dann deklarieren wir einen SIMD-i32x4-Wert und führen i32x4.abs aus. Schließlich extrahieren wir den Wert, der im Lane 3 des Ausgabewertes gespeichert ist, mit der extract_lane-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 i32x4 -9 -10 -11 -12
i32x4.abs
i32x4.extract_lane 3 ;; Extract a value from the result
call $output
)
(start $main)
)
Ergebnis
Die Ausgabe ist wie folgt:
Das Ergebnis ist 12, da der Wert, der im Lane 3 des Eingabewertes gespeichert ist, -12 ist und wir das absolute Äquivalent ausgeben.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # numeric-instructions%E2%91%A8> |