7c6f2cba36
This adds a separate test module and output expectation for Wasm GC. This covers the new types and instructions from https://github.com/WebAssembly/gc/blob/main/proposals/gc/MVP.md Unlike the previous disassembler tests, one cannot easily create the module bytes with WABT's `wat2wasm` from the expected text output (at least right now), so I used Binaryen's `wasm-as` instead to generate the module from a separate input file (not included here, because it uses folded expressions, which the debugger doesn't.) Change-Id: Id0205b2788fd7be5ea7696242cbe8a74a4bca892 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4013265 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Commit-Queue: Jakob Kummerow <jkummerow@chromium.org> Auto-Submit: Daniel Lehmann <dlehmann@chromium.org> Cr-Commit-Position: refs/heads/main@{#84264}
489 lines
8.5 KiB
C++
489 lines
8.5 KiB
C++
;; expected = R"---(;; This is a polyglot C++/WAT file.
|
|
;; Comment lines are ignored and not expected in the disassembler output.
|
|
(module
|
|
;; Imports.
|
|
(global $env.imported_global (;0;) (import "env" "imported_global") i32)
|
|
(func $env.imported_function (;0;) (import "env" "imported_function"))
|
|
;; Table and memory sections.
|
|
(table $table0 4 funcref)
|
|
(memory $memory0 0 1)
|
|
;; Non-imported globals: mutable, non-mutable, exported.
|
|
(global $global1 (mut i32) (i32.const 0))
|
|
(global $global2 i32 (global.get $env.imported_global))
|
|
(global $exported_global (;3;) (export "exported_global") i64 (i64.const 0))
|
|
;; Element section for table initialization.
|
|
(elem $elem0 (i32.const 0) funcref (ref.func $env.imported_function) (ref.func $func1) (ref.func $func1) (ref.func $func3))
|
|
;; Instructions on globals, locals, parameters.
|
|
(func $func1 (param $var0 i32)
|
|
(local $var1 i64)
|
|
local.get $var0
|
|
local.tee $var0
|
|
local.set $var0
|
|
local.get $var1
|
|
local.tee $var1
|
|
local.set $var1
|
|
global.get $global1
|
|
global.set $global1
|
|
)
|
|
;; i32 operations.
|
|
(func $func2 (result i32)
|
|
;; Comparisons and constant literals.
|
|
i32.const 0
|
|
i32.eqz
|
|
i32.const 1
|
|
i32.eq
|
|
i32.const -1
|
|
i32.ne
|
|
i32.const 2147483647
|
|
i32.lt_s
|
|
i32.const -2147483648
|
|
i32.lt_u
|
|
i32.const 0
|
|
i32.gt_s
|
|
i32.const 0
|
|
i32.gt_u
|
|
i32.const 0
|
|
i32.le_s
|
|
i32.const 0
|
|
i32.le_u
|
|
i32.const 0
|
|
i32.ge_s
|
|
i32.const 0
|
|
i32.ge_u
|
|
;; Bitcounting.
|
|
i32.clz
|
|
i32.ctz
|
|
i32.popcnt
|
|
;; Arithmetic and logic.
|
|
i32.const 0
|
|
i32.add
|
|
i32.const 0
|
|
i32.sub
|
|
i32.const 0
|
|
i32.mul
|
|
i32.const 0
|
|
i32.div_s
|
|
i32.const 0
|
|
i32.div_u
|
|
i32.const 0
|
|
i32.rem_s
|
|
i32.const 0
|
|
i32.rem_u
|
|
i32.const 0
|
|
i32.and
|
|
i32.const 0
|
|
i32.or
|
|
i32.const 0
|
|
i32.xor
|
|
i32.const 0
|
|
i32.shl
|
|
i32.const 0
|
|
i32.shr_s
|
|
i32.const 0
|
|
i32.shr_u
|
|
i32.const 0
|
|
i32.rotl
|
|
i32.const 0
|
|
i32.rotr
|
|
drop
|
|
;; Conversions.
|
|
i64.const 0
|
|
i32.wrap_i64
|
|
drop
|
|
f32.const 0.0
|
|
i32.trunc_f32_s
|
|
drop
|
|
f32.const 0.0
|
|
i32.trunc_f32_u
|
|
drop
|
|
f64.const 0.0
|
|
i32.trunc_f64_s
|
|
drop
|
|
f64.const 0.0
|
|
i32.trunc_f64_u
|
|
drop
|
|
f32.const 0.0
|
|
i32.reinterpret_f32
|
|
i32.extend8_s
|
|
i32.extend16_s
|
|
)
|
|
;; i64 operations.
|
|
(func $func3 (result i64)
|
|
;; Comparisons and constant literals.
|
|
i64.const 0
|
|
i64.eqz
|
|
drop
|
|
i64.const 1
|
|
i64.const -1
|
|
i64.eq
|
|
drop
|
|
i64.const -9223372036854775808
|
|
i64.const 9223372036854775807
|
|
i64.ne
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.lt_s
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.lt_u
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.gt_s
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.gt_u
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.le_s
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.le_u
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.ge_s
|
|
drop
|
|
i64.const 0
|
|
i64.const 0
|
|
i64.ge_u
|
|
drop
|
|
;; Bitcounting.
|
|
i64.const 0
|
|
i64.clz
|
|
i64.ctz
|
|
i64.popcnt
|
|
;; Arithmetic and logic.
|
|
i64.const 0
|
|
i64.add
|
|
i64.const 0
|
|
i64.sub
|
|
i64.const 0
|
|
i64.mul
|
|
i64.const 0
|
|
i64.div_s
|
|
i64.const 0
|
|
i64.div_u
|
|
i64.const 0
|
|
i64.rem_s
|
|
i64.const 0
|
|
i64.rem_u
|
|
i64.const 0
|
|
i64.and
|
|
i64.const 0
|
|
i64.or
|
|
i64.const 0
|
|
i64.xor
|
|
i64.const 0
|
|
i64.shl
|
|
i64.const 0
|
|
i64.shr_s
|
|
i64.const 0
|
|
i64.shr_u
|
|
i64.const 0
|
|
i64.rotl
|
|
i64.const 0
|
|
i64.rotr
|
|
drop
|
|
;; Conversions.
|
|
i32.const 0
|
|
i64.extend_i32_s
|
|
drop
|
|
i32.const 0
|
|
i64.extend_i32_u
|
|
drop
|
|
f32.const 0.0
|
|
i64.trunc_f32_s
|
|
drop
|
|
f32.const 0.0
|
|
i64.trunc_f32_u
|
|
drop
|
|
f64.const 0.0
|
|
i64.trunc_f64_s
|
|
drop
|
|
f64.const 0.0
|
|
i64.trunc_f64_u
|
|
drop
|
|
f64.const 0.0
|
|
i64.reinterpret_f64
|
|
i64.extend8_s
|
|
i64.extend16_s
|
|
i64.extend32_s
|
|
)
|
|
;; f32 operations.
|
|
(func $func4 (result f32)
|
|
;; Comparisons and constant literals.
|
|
f32.const 0.0
|
|
f32.const -0.0
|
|
f32.eq
|
|
drop
|
|
f32.const 1
|
|
f32.const -1
|
|
f32.ne
|
|
drop
|
|
f32.const inf
|
|
f32.const -inf
|
|
f32.lt
|
|
drop
|
|
f32.const nan
|
|
f32.const -nan
|
|
f32.gt
|
|
drop
|
|
;; Non-canonical NaN encodings.
|
|
f32.const +nan:0x1
|
|
f32.const +nan:0xfffff
|
|
f32.le
|
|
drop
|
|
;; TODO(dlehmann): Change to `0.1`, once `ImmediatesPrinter` is improved to
|
|
;; print floats as shortest round-trippable decimal representation.
|
|
f32.const 0.100000001
|
|
f32.const 1234567.5
|
|
f32.ge
|
|
drop
|
|
;; Arithmetic.
|
|
f32.const 0.0
|
|
f32.abs
|
|
f32.neg
|
|
f32.ceil
|
|
f32.floor
|
|
f32.trunc
|
|
f32.nearest
|
|
f32.sqrt
|
|
f32.const 0.0
|
|
f32.add
|
|
f32.const 0.0
|
|
f32.sub
|
|
f32.const 0.0
|
|
f32.mul
|
|
f32.const 0.0
|
|
f32.div
|
|
f32.const 0.0
|
|
f32.min
|
|
f32.const 0.0
|
|
f32.max
|
|
f32.const 0.0
|
|
f32.copysign
|
|
drop
|
|
;; Conversions.
|
|
i32.const 0
|
|
f32.convert_i32_s
|
|
drop
|
|
i32.const 0
|
|
f32.convert_i32_u
|
|
drop
|
|
i64.const 0
|
|
f32.convert_i64_s
|
|
drop
|
|
i64.const 0
|
|
f32.convert_i64_u
|
|
drop
|
|
f64.const 0.0
|
|
f32.demote_f64
|
|
drop
|
|
i32.const 0
|
|
f32.reinterpret_i32
|
|
)
|
|
;; f64 operations.
|
|
(func $func5 (result f64)
|
|
;; Comparisons and constant literals.
|
|
f64.const 0.0
|
|
f64.const -0.0
|
|
f64.eq
|
|
drop
|
|
f64.const 1
|
|
f64.const -1
|
|
f64.ne
|
|
drop
|
|
f64.const inf
|
|
f64.const -inf
|
|
f64.lt
|
|
drop
|
|
f64.const nan
|
|
f64.const -nan
|
|
f64.gt
|
|
drop
|
|
;; Non-canonical NaN encodings.
|
|
f64.const +nan:0x1
|
|
f64.const +nan:0xfffffffffffff
|
|
f64.le
|
|
drop
|
|
f64.const 0.1
|
|
f64.const 1234567.5
|
|
f64.ge
|
|
drop
|
|
;; Arithmetic.
|
|
f64.const 0.0
|
|
f64.abs
|
|
f64.neg
|
|
f64.ceil
|
|
f64.floor
|
|
f64.trunc
|
|
f64.nearest
|
|
f64.sqrt
|
|
f64.const 0.0
|
|
f64.add
|
|
f64.const 0.0
|
|
f64.sub
|
|
f64.const 0.0
|
|
f64.mul
|
|
f64.const 0.0
|
|
f64.div
|
|
f64.const 0.0
|
|
f64.min
|
|
f64.const 0.0
|
|
f64.max
|
|
f64.const 0.0
|
|
f64.copysign
|
|
drop
|
|
;; Conversions.
|
|
i32.const 0
|
|
f64.convert_i32_s
|
|
drop
|
|
i32.const 0
|
|
f64.convert_i32_u
|
|
drop
|
|
i64.const 0
|
|
f64.convert_i64_s
|
|
drop
|
|
i64.const 0
|
|
f64.convert_i64_u
|
|
drop
|
|
f32.const 0.0
|
|
f64.promote_f32
|
|
drop
|
|
i64.const 0
|
|
f64.reinterpret_i64
|
|
)
|
|
;; Control-flow.
|
|
(func $func6
|
|
;; Calls and return.
|
|
call $func7
|
|
i64.const 0
|
|
i32.const 0
|
|
call_indirect (param i64) (result f64)
|
|
return
|
|
;; Blocks and loops, with and without block type.
|
|
block $label0
|
|
loop $label1
|
|
block (result i64)
|
|
loop $label2 (result i64)
|
|
;; Branches
|
|
br $label0
|
|
i32.const 0
|
|
br_if $label1
|
|
i32.const 0
|
|
br_table $label0 $label1 $label1 $label2
|
|
i64.const 0
|
|
end $label2
|
|
end
|
|
drop
|
|
end $label1
|
|
end $label0
|
|
;; Select and if.
|
|
i64.const 0
|
|
i64.const 1
|
|
i32.const 0
|
|
select
|
|
drop
|
|
i32.const 0
|
|
if (result i64)
|
|
i64.const 0
|
|
else
|
|
i64.const 1
|
|
end
|
|
drop
|
|
)
|
|
;; Memory operations.
|
|
(func $func7
|
|
;; Loads.
|
|
i32.const 0
|
|
i32.load
|
|
drop
|
|
i32.const 0
|
|
;; Non-default memargs.
|
|
i64.load offset=3
|
|
drop
|
|
i32.const 0
|
|
f32.load align=2
|
|
drop
|
|
i32.const 0
|
|
f64.load offset=3 align=4
|
|
drop
|
|
i32.const 0
|
|
i32.load8_s
|
|
drop
|
|
i32.const 0
|
|
i32.load8_u
|
|
drop
|
|
i32.const 0
|
|
i32.load16_s
|
|
drop
|
|
i32.const 0
|
|
i32.load16_u
|
|
drop
|
|
i32.const 0
|
|
i64.load8_s
|
|
drop
|
|
i32.const 0
|
|
i64.load8_u
|
|
drop
|
|
i32.const 0
|
|
i64.load16_s
|
|
drop
|
|
i32.const 0
|
|
i64.load16_u
|
|
drop
|
|
i32.const 0
|
|
i64.load32_s
|
|
drop
|
|
i32.const 0
|
|
i64.load32_u
|
|
drop
|
|
;; Stores.
|
|
i32.const 0
|
|
i32.const 0
|
|
i32.store
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.store
|
|
i32.const 0
|
|
f32.const 0.0
|
|
f32.store
|
|
i32.const 0
|
|
f64.const 0.0
|
|
f64.store
|
|
i32.const 0
|
|
i32.const 0
|
|
i32.store8
|
|
i32.const 0
|
|
i32.const 0
|
|
i32.store16
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.store8
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.store16
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.store32
|
|
;; Other memory instructions.
|
|
memory.size
|
|
memory.grow
|
|
drop
|
|
)
|
|
;; Other instructions. (Also an exported function.)
|
|
(func $exported_function (;8;) (export "exported_function")
|
|
nop
|
|
unreachable
|
|
)
|
|
;; Data and element sections.
|
|
(data (global.get $env.imported_global) "foo\0a\00")
|
|
)
|
|
;;)---";
|