Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

abs: Wasm-Text-Instruktion

Die abs-Instruktion, abgekürzt von absolute, wird verwendet, um den Absolutwert einer Zahl zu erhalten. 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 Wertetyp, auf dem die Instruktion angewendet wird. Die folgenden Typen unterstützen abs:

  • f32
  • f64
  • v128 Interpretationen:
    • i8x16
    • i16x8
    • i32x4
    • i64x2
    • f32x4
    • f64x2
abs

Die abs Instruktion. Muss immer nach dem value_type und einem Punkt (.) hinzugefügt werden.

Typ

[input] -> [output]
input

Der Eingabewert.

output

Der Ausgabewert.

Für ein nicht-SIMD abs sind der input und output einfache numerische Werte wie 3.5 oder 10.

Für ein SIMD abs sind der input und output v128 Wertinterpretationen, zum Beispiel i32x4 4 8 12 16. Jedes Element des zum Stack geschobenen Outputs ist der Absolutwert des entsprechenden Elements im Input.

Binärcodierung

Instruktion 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-Instruktion auf einem SIMD-Wert und zeigen einen der resultierenden Werte an.

JavaScript

In unserem Skript beziehen wir eine Referenz auf ein <p>-Element, in das wir unser Ergebnis ausgeben. Dann definieren wir ein Objekt, das in Wasm importiert wird und eine einzelne Funktion enthält, die einen Wert in das <p>-Element schreibt. Anschließend kompilieren und instanziieren wir unser Wasm-Modul mithilfe der Methode WebAssembly.instantiateStreaming() und importieren dabei das Objekt.

js
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 zunächst die JavaScript-Funktion output(), wobei wir sicherstellen, dass sie einen i32-Parameter hat. Dann deklarieren wir einen SIMD i32x4-Wert, führen dann i32x4.abs aus. Schließlich extrahieren wir den in Element 3 des Output-SIMD-Werts gespeicherten Wert mit der extract_lane Instruktion und geben ihn an das DOM aus, indem wir die importierte Funktion output() aufrufen.

wat
(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

Das Ergebnis ist wie folgt:

Das Ergebnis ist 12, weil der Wert, der in Element 3 des Input-Werts gespeichert ist, -12 ist, da wir den absoluten Äquivalent ausgeben.