summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/fuzz_opt.py60
-rwxr-xr-xscripts/gen-s-parser.py289
-rw-r--r--scripts/strip_local_names.py2
3 files changed, 260 insertions, 91 deletions
diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py
index 3330000c9..49a2c3f73 100644
--- a/scripts/fuzz_opt.py
+++ b/scripts/fuzz_opt.py
@@ -14,19 +14,29 @@ script covers different options being passed)
'''
import os
-import sys
import difflib
import subprocess
import random
import shutil
import time
+from test.shared import options
+
+
# parameters
+
LOG_LIMIT = 125
INPUT_SIZE_LIMIT = 250 * 1024
+# utilities
+
+
+def in_bin(tool):
+ return os.path.join(options.binaryen_root, 'bin', tool)
+
+
def random_size():
return random.randint(1, INPUT_SIZE_LIMIT)
@@ -50,9 +60,13 @@ def randomize_pass_debug():
del os.environ['BINARYEN_PASS_DEBUG']
+# Test outputs we want to ignore are marked this way.
+IGNORE = '[binaryen-fuzzer-ignore]'
+
+
def test_one(infile, opts):
def compare(x, y, comment):
- if x != y:
+ if x != y and x != IGNORE and y != IGNORE:
message = ''.join([a.rstrip() + '\n' for a in difflib.unified_diff(x.split('\n'), y.split('\n'), fromfile='expected', tofile='actual')])
raise Exception(str(comment) + ": Expected to have '%s' == '%s', diff:\n\n%s" % (
x, y,
@@ -88,9 +102,27 @@ def test_one(infile, opts):
out = '\n'.join(map(lambda x: x if 'f32' not in x and 'f64' not in x else '', out.split('\n')))
return out
+ def run_vm(cmd):
+ # ignore some vm assertions, if bugs have already been filed
+ known_issues = [
+ 'local count too large', # ignore this; can be caused by flatten, ssa, etc. passes
+ 'liftoff-assembler.cc, line 239\n', # https://bugs.chromium.org/p/v8/issues/detail?id=8631
+ 'liftoff-register.h, line 86\n', # https://bugs.chromium.org/p/v8/issues/detail?id=8632
+ ]
+ try:
+ return run(cmd)
+ except:
+ output = run_unchecked(cmd)
+ for issue in known_issues:
+ if issue in output:
+ return IGNORE
+ raise
+
results = []
# append to this list to add results from VMs
- # results += [fix_output(run([os.path.expanduser('d8'), '--', prefix + 'js', prefix + 'wasm']))]
+ results += [fix_output(run_vm([os.path.expanduser('d8'), prefix + 'js', '--', prefix + 'wasm']))]
+ results += [fix_output(run_vm([os.path.expanduser('d8-debug'), '--wasm-tier-up', prefix + 'js', '--', prefix + 'wasm']))]
+ results += [fix_output(run_vm([os.path.expanduser('d8-debug'), '--no-wasm-tier-up', prefix + 'js', '--', prefix + 'wasm']))]
# spec has no mechanism to not halt on a trap. so we just check until the first trap, basically
# run(['../spec/interpreter/wasm', prefix + 'wasm'])
# results += [fix_spec_output(run_unchecked(['../spec/interpreter/wasm', prefix + 'wasm', '-e', open(prefix + 'wat').read()]))]
@@ -110,14 +142,14 @@ def test_one(infile, opts):
# fuzz vms
# gather VM outputs on input file
- run(['bin/wasm-opt', infile, '-ttf', '--emit-js-wrapper=a.js', '--emit-spec-wrapper=a.wat', '-o', 'a.wasm'])
+ run([in_bin('wasm-opt'), infile, '-ttf', '--emit-js-wrapper=a.js', '--emit-spec-wrapper=a.wat', '-o', 'a.wasm', '--mvp-features'])
wasm_size = os.stat('a.wasm').st_size
bytes += wasm_size
print('pre js size :', os.stat('a.js').st_size, ' wasm size:', wasm_size)
before = run_vms('a.')
print('----------------')
# gather VM outputs on processed file
- run(['bin/wasm-opt', 'a.wasm', '-o', 'b.wasm'] + opts)
+ run([in_bin('wasm-opt'), 'a.wasm', '-o', 'b.wasm'] + opts)
wasm_size = os.stat('b.wasm').st_size
bytes += wasm_size
print('post js size:', os.stat('a.js').st_size, ' wasm size:', wasm_size)
@@ -126,7 +158,11 @@ def test_one(infile, opts):
for i in range(len(before)):
compare(before[i], after[i], 'comparing between builds at ' + str(i))
# fuzz binaryen interpreter itself. separate invocation so result is easily fuzzable
- run(['bin/wasm-opt', 'a.wasm', '--fuzz-exec', '--fuzz-binary'] + opts)
+ run([in_bin('wasm-opt'), 'a.wasm', '--fuzz-exec', '--fuzz-binary'] + opts)
+ # check for determinism
+ run([in_bin('wasm-opt'), 'a.wasm', '-o', 'b.wasm'] + opts)
+ run([in_bin('wasm-opt'), 'a.wasm', '-o', 'c.wasm'] + opts)
+ assert open('b.wasm').read() == open('c.wasm').read(), 'output must be deterministic'
return bytes
@@ -198,17 +234,9 @@ def get_multiple_opt_choices():
# main
-if len(sys.argv) >= 2:
- print('checking given input')
- if len(sys.argv) >= 3:
- test_one(sys.argv[1], sys.argv[2:])
- else:
- for opts in opt_choices:
- print(opts)
- test_one(sys.argv[1], opts)
-else:
+if __name__ == '__main__':
print('checking infinite random inputs')
- random.seed(time.time())
+ random.seed(time.time() * os.getpid())
temp = 'input.dat'
counter = 0
bytes = 0 # wasm bytes tested
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index f33107ea6..7e9e70a7c 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -30,11 +30,11 @@ instructions = [
("call_indirect", "makeCallIndirect(s)"),
("drop", "makeDrop(s)"),
("select", "makeSelect(s)"),
- ("get_local", "makeGetLocal(s)"),
- ("set_local", "makeSetLocal(s)"),
- ("tee_local", "makeTeeLocal(s)"),
- ("get_global", "makeGetGlobal(s)"),
- ("set_global", "makeSetGlobal(s)"),
+ ("local.get", "makeGetLocal(s)"),
+ ("local.set", "makeSetLocal(s)"),
+ ("local.tee", "makeTeeLocal(s)"),
+ ("global.get", "makeGetGlobal(s)"),
+ ("global.set", "makeSetGlobal(s)"),
("i32.load", "makeLoad(s, i32, /*isAtomic=*/false)"),
("i64.load", "makeLoad(s, i64, /*isAtomic=*/false)"),
("f32.load", "makeLoad(s, f32, /*isAtomic=*/false)"),
@@ -162,31 +162,31 @@ instructions = [
("f64.min", "makeBinary(s, BinaryOp::MinFloat64)"),
("f64.max", "makeBinary(s, BinaryOp::MaxFloat64)"),
("f64.copysign", "makeBinary(s, BinaryOp::CopySignFloat64)"),
- ("i32.wrap/i64", "makeUnary(s, UnaryOp::WrapInt64)"),
- ("i32.trunc_s/f32", "makeUnary(s, UnaryOp::TruncSFloat32ToInt32)"),
- ("i32.trunc_u/f32", "makeUnary(s, UnaryOp::TruncUFloat32ToInt32)"),
- ("i32.trunc_s/f64", "makeUnary(s, UnaryOp::TruncSFloat64ToInt32)"),
- ("i32.trunc_u/f64", "makeUnary(s, UnaryOp::TruncUFloat64ToInt32)"),
- ("i64.extend_s/i32", "makeUnary(s, UnaryOp::ExtendSInt32)"),
- ("i64.extend_u/i32", "makeUnary(s, UnaryOp::ExtendUInt32)"),
- ("i64.trunc_s/f32", "makeUnary(s, UnaryOp::TruncSFloat32ToInt64)"),
- ("i64.trunc_u/f32", "makeUnary(s, UnaryOp::TruncUFloat32ToInt64)"),
- ("i64.trunc_s/f64", "makeUnary(s, UnaryOp::TruncSFloat64ToInt64)"),
- ("i64.trunc_u/f64", "makeUnary(s, UnaryOp::TruncUFloat64ToInt64)"),
- ("f32.convert_s/i32", "makeUnary(s, UnaryOp::ConvertSInt32ToFloat32)"),
- ("f32.convert_u/i32", "makeUnary(s, UnaryOp::ConvertUInt32ToFloat32)"),
- ("f32.convert_s/i64", "makeUnary(s, UnaryOp::ConvertSInt64ToFloat32)"),
- ("f32.convert_u/i64", "makeUnary(s, UnaryOp::ConvertUInt64ToFloat32)"),
- ("f32.demote/f64", "makeUnary(s, UnaryOp::DemoteFloat64)"),
- ("f64.convert_s/i32", "makeUnary(s, UnaryOp::ConvertSInt32ToFloat64)"),
- ("f64.convert_u/i32", "makeUnary(s, UnaryOp::ConvertUInt32ToFloat64)"),
- ("f64.convert_s/i64", "makeUnary(s, UnaryOp::ConvertSInt64ToFloat64)"),
- ("f64.convert_u/i64", "makeUnary(s, UnaryOp::ConvertUInt64ToFloat64)"),
- ("f64.promote/f32", "makeUnary(s, UnaryOp::PromoteFloat32)"),
- ("i32.reinterpret/f32", "makeUnary(s, UnaryOp::ReinterpretFloat32)"),
- ("i64.reinterpret/f64", "makeUnary(s, UnaryOp::ReinterpretFloat64)"),
- ("f32.reinterpret/i32", "makeUnary(s, UnaryOp::ReinterpretInt32)"),
- ("f64.reinterpret/i64", "makeUnary(s, UnaryOp::ReinterpretInt64)"),
+ ("i32.wrap_i64", "makeUnary(s, UnaryOp::WrapInt64)"),
+ ("i32.trunc_f32_s", "makeUnary(s, UnaryOp::TruncSFloat32ToInt32)"),
+ ("i32.trunc_f32_u", "makeUnary(s, UnaryOp::TruncUFloat32ToInt32)"),
+ ("i32.trunc_f64_s", "makeUnary(s, UnaryOp::TruncSFloat64ToInt32)"),
+ ("i32.trunc_f64_u", "makeUnary(s, UnaryOp::TruncUFloat64ToInt32)"),
+ ("i64.extend_i32_s", "makeUnary(s, UnaryOp::ExtendSInt32)"),
+ ("i64.extend_i32_u", "makeUnary(s, UnaryOp::ExtendUInt32)"),
+ ("i64.trunc_f32_s", "makeUnary(s, UnaryOp::TruncSFloat32ToInt64)"),
+ ("i64.trunc_f32_u", "makeUnary(s, UnaryOp::TruncUFloat32ToInt64)"),
+ ("i64.trunc_f64_s", "makeUnary(s, UnaryOp::TruncSFloat64ToInt64)"),
+ ("i64.trunc_f64_u", "makeUnary(s, UnaryOp::TruncUFloat64ToInt64)"),
+ ("f32.convert_i32_s", "makeUnary(s, UnaryOp::ConvertSInt32ToFloat32)"),
+ ("f32.convert_i32_u", "makeUnary(s, UnaryOp::ConvertUInt32ToFloat32)"),
+ ("f32.convert_i64_s", "makeUnary(s, UnaryOp::ConvertSInt64ToFloat32)"),
+ ("f32.convert_i64_u", "makeUnary(s, UnaryOp::ConvertUInt64ToFloat32)"),
+ ("f32.demote_f64", "makeUnary(s, UnaryOp::DemoteFloat64)"),
+ ("f64.convert_i32_s", "makeUnary(s, UnaryOp::ConvertSInt32ToFloat64)"),
+ ("f64.convert_i32_u", "makeUnary(s, UnaryOp::ConvertUInt32ToFloat64)"),
+ ("f64.convert_i64_s", "makeUnary(s, UnaryOp::ConvertSInt64ToFloat64)"),
+ ("f64.convert_i64_u", "makeUnary(s, UnaryOp::ConvertUInt64ToFloat64)"),
+ ("f64.promote_f32", "makeUnary(s, UnaryOp::PromoteFloat32)"),
+ ("i32.reinterpret_f32", "makeUnary(s, UnaryOp::ReinterpretFloat32)"),
+ ("i64.reinterpret_f64", "makeUnary(s, UnaryOp::ReinterpretFloat64)"),
+ ("f32.reinterpret_i32", "makeUnary(s, UnaryOp::ReinterpretInt32)"),
+ ("f64.reinterpret_i64", "makeUnary(s, UnaryOp::ReinterpretInt64)"),
("i32.extend8_s", "makeUnary(s, UnaryOp::ExtendS8Int32)"),
("i32.extend16_s", "makeUnary(s, UnaryOp::ExtendS16Int32)"),
("i64.extend8_s", "makeUnary(s, UnaryOp::ExtendS8Int64)"),
@@ -210,64 +210,205 @@ instructions = [
("i64.atomic.store16", "makeStore(s, i64, /*isAtomic=*/true)"),
("i64.atomic.store32", "makeStore(s, i64, /*isAtomic=*/true)"),
("i64.atomic.store", "makeStore(s, i64, /*isAtomic=*/true)"),
- ("i32.atomic.rmw8_u.add", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.add", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.add_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.add_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.add", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.add", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.add", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.add", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.add_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.add_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.add_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.add", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.sub", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.sub", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.sub_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.sub_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.sub", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.sub", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.sub", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.sub", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.sub_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.sub_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.sub_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.sub", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.and", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.and", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.and_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.and_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.and", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.and", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.and", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.and", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.and_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.and_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.and_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.and", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.or", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.or", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.or_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.or_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.or", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.or", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.or", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.or", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.or_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.or_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.or_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.or", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.xor", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.xor", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.xor_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.xor_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.xor", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.xor", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.xor", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.xor", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.xor_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.xor_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.xor_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.xor", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.xchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.xchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.xchg_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.xchg_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.xchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.xchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.xchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.xchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.xchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.xchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.xchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.xchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i32.atomic.rmw8_u.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i32.atomic.rmw16_u.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw8.cmpxchg_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
+ ("i32.atomic.rmw16.cmpxchg_u", "makeAtomicRMWOrCmpxchg(s, i32)"),
("i32.atomic.rmw.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i32)"),
- ("i64.atomic.rmw8_u.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw16_u.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
- ("i64.atomic.rmw32_u.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw8.cmpxchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw16.cmpxchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
+ ("i64.atomic.rmw32.cmpxchg_u", "makeAtomicRMWOrCmpxchg(s, i64)"),
("i64.atomic.rmw.cmpxchg", "makeAtomicRMWOrCmpxchg(s, i64)"),
# nontrapping float-to-int instructions
- ("i32.trunc_s:sat/f32", "makeUnary(s, UnaryOp::TruncSatSFloat32ToInt32)"),
- ("i32.trunc_u:sat/f32", "makeUnary(s, UnaryOp::TruncSatUFloat32ToInt32)"),
- ("i32.trunc_s:sat/f64", "makeUnary(s, UnaryOp::TruncSatSFloat64ToInt32)"),
- ("i32.trunc_u:sat/f64", "makeUnary(s, UnaryOp::TruncSatUFloat64ToInt32)"),
- ("i64.trunc_s:sat/f32", "makeUnary(s, UnaryOp::TruncSatSFloat32ToInt64)"),
- ("i64.trunc_u:sat/f32", "makeUnary(s, UnaryOp::TruncSatUFloat32ToInt64)"),
- ("i64.trunc_s:sat/f64", "makeUnary(s, UnaryOp::TruncSatSFloat64ToInt64)"),
- ("i64.trunc_u:sat/f64", "makeUnary(s, UnaryOp::TruncSatUFloat64ToInt64)"),
+ ("i32.trunc_sat_f32_s", "makeUnary(s, UnaryOp::TruncSatSFloat32ToInt32)"),
+ ("i32.trunc_sat_f32_u", "makeUnary(s, UnaryOp::TruncSatUFloat32ToInt32)"),
+ ("i32.trunc_sat_f64_s", "makeUnary(s, UnaryOp::TruncSatSFloat64ToInt32)"),
+ ("i32.trunc_sat_f64_u", "makeUnary(s, UnaryOp::TruncSatUFloat64ToInt32)"),
+ ("i64.trunc_sat_f32_s", "makeUnary(s, UnaryOp::TruncSatSFloat32ToInt64)"),
+ ("i64.trunc_sat_f32_u", "makeUnary(s, UnaryOp::TruncSatUFloat32ToInt64)"),
+ ("i64.trunc_sat_f64_s", "makeUnary(s, UnaryOp::TruncSatSFloat64ToInt64)"),
+ ("i64.trunc_sat_f64_u", "makeUnary(s, UnaryOp::TruncSatUFloat64ToInt64)"),
+ # SIMD ops
+ ("v128.load", "makeLoad(s, v128, /*isAtomic=*/false)"),
+ ("v128.store", "makeStore(s, v128, /*isAtomic=*/false)"),
+ ("v128.const", "makeConst(s, v128)"),
+ ("v8x16.shuffle", "makeSIMDShuffle(s)"),
+ ("i8x16.splat", "makeUnary(s, UnaryOp::SplatVecI8x16)"),
+ ("i8x16.extract_lane_s", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI8x16, 16)"),
+ ("i8x16.extract_lane_u", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI8x16, 16)"),
+ ("i8x16.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI8x16, 16)"),
+ ("i16x8.splat", "makeUnary(s, UnaryOp::SplatVecI16x8)"),
+ ("i16x8.extract_lane_s", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI16x8, 8)"),
+ ("i16x8.extract_lane_u", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI16x8, 8)"),
+ ("i16x8.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI16x8, 8)"),
+ ("i32x4.splat", "makeUnary(s, UnaryOp::SplatVecI32x4)"),
+ ("i32x4.extract_lane", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI32x4, 4)"),
+ ("i32x4.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI32x4, 4)"),
+ ("i64x2.splat", "makeUnary(s, UnaryOp::SplatVecI64x2)"),
+ ("i64x2.extract_lane", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI64x2, 2)"),
+ ("i64x2.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI64x2, 2)"),
+ ("f32x4.splat", "makeUnary(s, UnaryOp::SplatVecF32x4)"),
+ ("f32x4.extract_lane", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecF32x4, 4)"),
+ ("f32x4.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecF32x4, 4)"),
+ ("f64x2.splat", "makeUnary(s, UnaryOp::SplatVecF64x2)"),
+ ("f64x2.extract_lane", "makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecF64x2, 2)"),
+ ("f64x2.replace_lane", "makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecF64x2, 2)"),
+ ("i8x16.eq", "makeBinary(s, BinaryOp::EqVecI8x16)"),
+ ("i8x16.ne", "makeBinary(s, BinaryOp::NeVecI8x16)"),
+ ("i8x16.lt_s", "makeBinary(s, BinaryOp::LtSVecI8x16)"),
+ ("i8x16.lt_u", "makeBinary(s, BinaryOp::LtUVecI8x16)"),
+ ("i8x16.gt_s", "makeBinary(s, BinaryOp::GtSVecI8x16)"),
+ ("i8x16.gt_u", "makeBinary(s, BinaryOp::GtUVecI8x16)"),
+ ("i8x16.le_s", "makeBinary(s, BinaryOp::LeSVecI8x16)"),
+ ("i8x16.le_u", "makeBinary(s, BinaryOp::LeUVecI8x16)"),
+ ("i8x16.ge_s", "makeBinary(s, BinaryOp::GeSVecI8x16)"),
+ ("i8x16.ge_u", "makeBinary(s, BinaryOp::GeUVecI8x16)"),
+ ("i16x8.eq", "makeBinary(s, BinaryOp::EqVecI16x8)"),
+ ("i16x8.ne", "makeBinary(s, BinaryOp::NeVecI16x8)"),
+ ("i16x8.lt_s", "makeBinary(s, BinaryOp::LtSVecI16x8)"),
+ ("i16x8.lt_u", "makeBinary(s, BinaryOp::LtUVecI16x8)"),
+ ("i16x8.gt_s", "makeBinary(s, BinaryOp::GtSVecI16x8)"),
+ ("i16x8.gt_u", "makeBinary(s, BinaryOp::GtUVecI16x8)"),
+ ("i16x8.le_s", "makeBinary(s, BinaryOp::LeSVecI16x8)"),
+ ("i16x8.le_u", "makeBinary(s, BinaryOp::LeUVecI16x8)"),
+ ("i16x8.ge_s", "makeBinary(s, BinaryOp::GeSVecI16x8)"),
+ ("i16x8.ge_u", "makeBinary(s, BinaryOp::GeUVecI16x8)"),
+ ("i32x4.eq", "makeBinary(s, BinaryOp::EqVecI32x4)"),
+ ("i32x4.ne", "makeBinary(s, BinaryOp::NeVecI32x4)"),
+ ("i32x4.lt_s", "makeBinary(s, BinaryOp::LtSVecI32x4)"),
+ ("i32x4.lt_u", "makeBinary(s, BinaryOp::LtUVecI32x4)"),
+ ("i32x4.gt_s", "makeBinary(s, BinaryOp::GtSVecI32x4)"),
+ ("i32x4.gt_u", "makeBinary(s, BinaryOp::GtUVecI32x4)"),
+ ("i32x4.le_s", "makeBinary(s, BinaryOp::LeSVecI32x4)"),
+ ("i32x4.le_u", "makeBinary(s, BinaryOp::LeUVecI32x4)"),
+ ("i32x4.ge_s", "makeBinary(s, BinaryOp::GeSVecI32x4)"),
+ ("i32x4.ge_u", "makeBinary(s, BinaryOp::GeUVecI32x4)"),
+ ("f32x4.eq", "makeBinary(s, BinaryOp::EqVecF32x4)"),
+ ("f32x4.ne", "makeBinary(s, BinaryOp::NeVecF32x4)"),
+ ("f32x4.lt", "makeBinary(s, BinaryOp::LtVecF32x4)"),
+ ("f32x4.gt", "makeBinary(s, BinaryOp::GtVecF32x4)"),
+ ("f32x4.le", "makeBinary(s, BinaryOp::LeVecF32x4)"),
+ ("f32x4.ge", "makeBinary(s, BinaryOp::GeVecF32x4)"),
+ ("f64x2.eq", "makeBinary(s, BinaryOp::EqVecF64x2)"),
+ ("f64x2.ne", "makeBinary(s, BinaryOp::NeVecF64x2)"),
+ ("f64x2.lt", "makeBinary(s, BinaryOp::LtVecF64x2)"),
+ ("f64x2.gt", "makeBinary(s, BinaryOp::GtVecF64x2)"),
+ ("f64x2.le", "makeBinary(s, BinaryOp::LeVecF64x2)"),
+ ("f64x2.ge", "makeBinary(s, BinaryOp::GeVecF64x2)"),
+ ("v128.not", "makeUnary(s, UnaryOp::NotVec128)"),
+ ("v128.and", "makeBinary(s, BinaryOp::AndVec128)"),
+ ("v128.or", "makeBinary(s, BinaryOp::OrVec128)"),
+ ("v128.xor", "makeBinary(s, BinaryOp::XorVec128)"),
+ ("v128.bitselect", "makeSIMDBitselect(s)"),
+ ("i8x16.neg", "makeUnary(s, UnaryOp::NegVecI8x16)"),
+ ("i8x16.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI8x16)"),
+ ("i8x16.all_true", "makeUnary(s, UnaryOp::AllTrueVecI8x16)"),
+ ("i8x16.shl", "makeSIMDShift(s, SIMDShiftOp::ShlVecI8x16)"),
+ ("i8x16.shr_s", "makeSIMDShift(s, SIMDShiftOp::ShrSVecI8x16)"),
+ ("i8x16.shr_u", "makeSIMDShift(s, SIMDShiftOp::ShrUVecI8x16)"),
+ ("i8x16.add", "makeBinary(s, BinaryOp::AddVecI8x16)"),
+ ("i8x16.add_saturate_s", "makeBinary(s, BinaryOp::AddSatSVecI8x16)"),
+ ("i8x16.add_saturate_u", "makeBinary(s, BinaryOp::AddSatUVecI8x16)"),
+ ("i8x16.sub", "makeBinary(s, BinaryOp::SubVecI8x16)"),
+ ("i8x16.sub_saturate_s", "makeBinary(s, BinaryOp::SubSatSVecI8x16)"),
+ ("i8x16.sub_saturate_u", "makeBinary(s, BinaryOp::SubSatUVecI8x16)"),
+ ("i8x16.mul", "makeBinary(s, BinaryOp::MulVecI8x16)"),
+ ("i16x8.neg", "makeUnary(s, UnaryOp::NegVecI16x8)"),
+ ("i16x8.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI16x8)"),
+ ("i16x8.all_true", "makeUnary(s, UnaryOp::AllTrueVecI16x8)"),
+ ("i16x8.shl", "makeSIMDShift(s, SIMDShiftOp::ShlVecI16x8)"),
+ ("i16x8.shr_s", "makeSIMDShift(s, SIMDShiftOp::ShrSVecI16x8)"),
+ ("i16x8.shr_u", "makeSIMDShift(s, SIMDShiftOp::ShrUVecI16x8)"),
+ ("i16x8.add", "makeBinary(s, BinaryOp::AddVecI16x8)"),
+ ("i16x8.add_saturate_s", "makeBinary(s, BinaryOp::AddSatSVecI16x8)"),
+ ("i16x8.add_saturate_u", "makeBinary(s, BinaryOp::AddSatUVecI16x8)"),
+ ("i16x8.sub", "makeBinary(s, BinaryOp::SubVecI16x8)"),
+ ("i16x8.sub_saturate_s", "makeBinary(s, BinaryOp::SubSatSVecI16x8)"),
+ ("i16x8.sub_saturate_u", "makeBinary(s, BinaryOp::SubSatUVecI16x8)"),
+ ("i16x8.mul", "makeBinary(s, BinaryOp::MulVecI16x8)"),
+ ("i32x4.neg", "makeUnary(s, UnaryOp::NegVecI32x4)"),
+ ("i32x4.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI32x4)"),
+ ("i32x4.all_true", "makeUnary(s, UnaryOp::AllTrueVecI32x4)"),
+ ("i32x4.shl", "makeSIMDShift(s, SIMDShiftOp::ShlVecI32x4)"),
+ ("i32x4.shr_s", "makeSIMDShift(s, SIMDShiftOp::ShrSVecI32x4)"),
+ ("i32x4.shr_u", "makeSIMDShift(s, SIMDShiftOp::ShrUVecI32x4)"),
+ ("i32x4.add", "makeBinary(s, BinaryOp::AddVecI32x4)"),
+ ("i32x4.sub", "makeBinary(s, BinaryOp::SubVecI32x4)"),
+ ("i32x4.mul", "makeBinary(s, BinaryOp::MulVecI32x4)"),
+ ("i64x2.neg", "makeUnary(s, UnaryOp::NegVecI64x2)"),
+ ("i64x2.any_true", "makeUnary(s, UnaryOp::AnyTrueVecI64x2)"),
+ ("i64x2.all_true", "makeUnary(s, UnaryOp::AllTrueVecI64x2)"),
+ ("i64x2.shl", "makeSIMDShift(s, SIMDShiftOp::ShlVecI64x2)"),
+ ("i64x2.shr_s", "makeSIMDShift(s, SIMDShiftOp::ShrSVecI64x2)"),
+ ("i64x2.shr_u", "makeSIMDShift(s, SIMDShiftOp::ShrUVecI64x2)"),
+ ("i64x2.add", "makeBinary(s, BinaryOp::AddVecI64x2)"),
+ ("i64x2.sub", "makeBinary(s, BinaryOp::SubVecI64x2)"),
+ ("f32x4.abs", "makeUnary(s, UnaryOp::AbsVecF32x4)"),
+ ("f32x4.neg", "makeUnary(s, UnaryOp::NegVecF32x4)"),
+ ("f32x4.sqrt", "makeUnary(s, UnaryOp::SqrtVecF32x4)"),
+ ("f32x4.add", "makeBinary(s, BinaryOp::AddVecF32x4)"),
+ ("f32x4.sub", "makeBinary(s, BinaryOp::SubVecF32x4)"),
+ ("f32x4.mul", "makeBinary(s, BinaryOp::MulVecF32x4)"),
+ ("f32x4.div", "makeBinary(s, BinaryOp::DivVecF32x4)"),
+ ("f32x4.min", "makeBinary(s, BinaryOp::MinVecF32x4)"),
+ ("f32x4.max", "makeBinary(s, BinaryOp::MaxVecF32x4)"),
+ ("f64x2.abs", "makeUnary(s, UnaryOp::AbsVecF64x2)"),
+ ("f64x2.neg", "makeUnary(s, UnaryOp::NegVecF64x2)"),
+ ("f64x2.sqrt", "makeUnary(s, UnaryOp::SqrtVecF64x2)"),
+ ("f64x2.add", "makeBinary(s, BinaryOp::AddVecF64x2)"),
+ ("f64x2.sub", "makeBinary(s, BinaryOp::SubVecF64x2)"),
+ ("f64x2.mul", "makeBinary(s, BinaryOp::MulVecF64x2)"),
+ ("f64x2.div", "makeBinary(s, BinaryOp::DivVecF64x2)"),
+ ("f64x2.min", "makeBinary(s, BinaryOp::MinVecF64x2)"),
+ ("f64x2.max", "makeBinary(s, BinaryOp::MaxVecF64x2)"),
+ ("i32x4.trunc_sat_f32x4_s", "makeUnary(s, UnaryOp::TruncSatSVecF32x4ToVecI32x4)"),
+ ("i32x4.trunc_sat_f32x4_u", "makeUnary(s, UnaryOp::TruncSatUVecF32x4ToVecI32x4)"),
+ ("i64x2.trunc_sat_f64x2_s", "makeUnary(s, UnaryOp::TruncSatSVecF64x2ToVecI64x2)"),
+ ("i64x2.trunc_sat_f64x2_u", "makeUnary(s, UnaryOp::TruncSatUVecF64x2ToVecI64x2)"),
+ ("f32x4.convert_i32x4_s", "makeUnary(s, UnaryOp::ConvertSVecI32x4ToVecF32x4)"),
+ ("f32x4.convert_i32x4_u", "makeUnary(s, UnaryOp::ConvertUVecI32x4ToVecF32x4)"),
+ ("f64x2.convert_i64x2_s", "makeUnary(s, UnaryOp::ConvertSVecI64x2ToVecF64x2)"),
+ ("f64x2.convert_i64x2_u", "makeUnary(s, UnaryOp::ConvertUVecI64x2ToVecF64x2)")
]
@@ -308,7 +449,7 @@ class Node:
def do_insert(self, full_inst, inst, expr):
if inst is "":
- assert self.expr is None, "Repeated instruction"
+ assert self.expr is None, "Repeated instruction " + full_inst
self.expr = expr
self.inst = full_inst
return
diff --git a/scripts/strip_local_names.py b/scripts/strip_local_names.py
index d617766bc..2e14b8e2b 100644
--- a/scripts/strip_local_names.py
+++ b/scripts/strip_local_names.py
@@ -7,7 +7,7 @@ to diff for structural changes, this can help.
import sys
for line in open(sys.argv[1]).readlines():
- if '(tee_local ' in line or '(set_local ' in line or '(get_local ' in line:
+ if '(local.tee ' in line or '(local.set ' in line or '(local.get ' in line:
print line[:line.find('$')]
else:
print line,