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

View in English Always switch to English

shr_u: Wasm Zahlenoperation

Die shr_u Zahlenoperation, kurz für shift-right unsigned, wird verwendet, um eine bitweise Rechtsverschiebung auf vorzeichenlose Ganzzahlen durchzuführen, ähnlich wie der >>> Operator in anderen Sprachen.

Probieren Sie es aus

(module

  (func (export "shift_right") (param $num i32) (param $by i32) (result i32)
    ;; load the number to shift and the by how many spots
    local.get $num
    local.get $by

    ;; shift and return the result
    i32.shr_u
  )

)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console }).then(
  (result) => {
    const shift_right = result.instance.exports.shift_right;

    const res = shift_right(0b00000000_00000000_00000000_00000111, 1);
    console.log(numToBin(res));
    // Expected output: "00000000_00000000_00000000_00000011"
  },
);

function numToBin(num) {
  return (num >>> 0)
    .toString(2)
    .padStart(32, "0")
    .match(/.{1,8}/g)
    .join("_");
}

Syntax

value_type.shr_u
value_type

Der Typ des Wertes, auf dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen shr_u:

  • i32
  • i64
  • v128 Interpretationen:
    • i8x16
    • i16x8
    • i32x4
    • i64x2
shr_u

Die shr_u Anweisung. Muss immer nach dem value_type und einem Punkt (.) stehen.

Typ

[input, shift_value] -> [output]
input

Der Eingabewert.

shift_value

Der Wert, um den Sie den Eingabewert verschieben möchten.

output

Der Ausgabewert.

Für ein nicht-SIMD shr_u sind input und output einfache Zahlenwerte wie 3 oder 12.

Für ein SIMD shr_u sind input und output Interpretationen von v128 Werten, zum Beispiel i32x4 2 30 86 120. Jede Spur des an den Stapel geschobenen Ausgabe enthält die entsprechende Spur des Eingabewerts, die um den angegebenen shift_value nach rechts verschoben wurde.

Binärcodierung

Anweisung Binärformat Beispieltext => Binär
i32.shr_u 0x76 i32.shr_u => 0x76
i64.shr_u 0x88 i64.shr_u => 0x88
i8x16.shr_u 0xfd 109:u32 i8x16.shr_u => 0xfd 0x6d
i16x8.shr_u 0xfd 141:u32 i16x8.shr_u => 0xfd 0x8d 0x01
i32x4.shr_u 0xfd 173:u32 i32x4.shr_u => 0xfd 0xad 0x01
i64x2.shr_u 0xfd 205:u32 i64x2.shr_u => 0xfd 0xcd 0x01

SIMD-Rechtsverschiebung

In diesem Beispiel demonstrieren wir die Durchführung einer Rechtsverschiebung auf einen SIMD-Wert und das Ausgeben eines der Spurwerte.

JavaScript

In unserem Skript greifen wir auf ein <p> Element zu, auf das wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt zum Import in Wasm, das eine einzelne Funktion enthält, die einen Wert an das Ausgabefeld <p> schreibt. Danach kompilieren und instanziieren wir unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming(), wobei wir das Objekt im Prozess importieren.

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 diese eine i32 Parameter hat. Dann deklarieren wir einen SIMD i16x8 Wert, verschieben ihn dann um 2 mit i16x8.shr_u. Schließlich extrahieren wir den in Spur 6 des Ausgabe-SIMD-Werts gespeicherten Wert mit der extract_lane_u Anweisung und geben ihn in das DOM aus, indem wir die importierte output() Funktion aufrufen.

wat
(module
  ;; Import output function
  (import "obj" "output" (func $output (param i32)))

  (func $main
    ;; load two SIMD values onto the stack
    v128.const i16x8 9 10 11 12 89 90 91 92
    i32.const 2

    i16x8.shr_u ;; shift-right by 2
    i16x8.extract_lane_u 6 ;; Extract a value from the result

    call $output
  )

  (start $main)
)

Ergebnis

Die Ausgabe ist wie folgt:

Das Ergebnis ist 22, da der in Spur 6 des Eingabewertes gespeicherte Wert 91 ist. Einmal um zwei Positionen nach rechts verschoben, enthält Spur 6 des Ausgabe-Werts den Wert 22.

Spezifikationen

Spezifikation
WebAssembly Core Specification
# numeric-instructions%E2%91%A8

Browser-Kompatibilität

Siehe auch