1 ;; Tests for the *_splat instructions
4 (func (export "i8x16.splat") (param i32) (result v128) (i8x16.splat (local.get 0)))
5 (func (export "i16x8.splat") (param i32) (result v128) (i16x8.splat (local.get 0)))
6 (func (export "i32x4.splat") (param i32) (result v128) (i32x4.splat (local.get 0)))
7 (func (export "f32x4.splat") (param f32) (result v128) (f32x4.splat (local.get 0)))
8 (func (export "i64x2.splat") (param i64) (result v128) (i64x2.splat (local.get 0)))
9 (func (export "f64x2.splat") (param f64) (result v128) (f64x2.splat (local.get 0)))
12 (assert_return (invoke "i8x16.splat" (i32.const 0)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
13 (assert_return (invoke "i8x16.splat" (i32.const 5)) (v128.const i8x16 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5))
14 (assert_return (invoke "i8x16.splat" (i32.const -5)) (v128.const i8x16 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5))
15 (assert_return (invoke "i8x16.splat" (i32.const 257)) (v128.const i8x16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1))
16 (assert_return (invoke "i8x16.splat" (i32.const 0xff)) (v128.const i8x16 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1))
17 (assert_return (invoke "i8x16.splat" (i32.const -128)) (v128.const i8x16 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128))
18 (assert_return (invoke "i8x16.splat" (i32.const 127)) (v128.const i8x16 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127))
19 (assert_return (invoke "i8x16.splat" (i32.const -129)) (v128.const i8x16 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127))
20 (assert_return (invoke "i8x16.splat" (i32.const 128)) (v128.const i8x16 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 -128))
21 (assert_return (invoke "i8x16.splat" (i32.const 0xff7f)) (v128.const i8x16 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f))
22 (assert_return (invoke "i8x16.splat" (i32.const 0x80)) (v128.const i8x16 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80))
23 (assert_return (invoke "i8x16.splat" (i32.const 0xAB)) (v128.const i32x4 0xABABABAB 0xABABABAB 0xABABABAB 0xABABABAB))
25 (assert_return (invoke "i16x8.splat" (i32.const 0)) (v128.const i16x8 0 0 0 0 0 0 0 0))
26 (assert_return (invoke "i16x8.splat" (i32.const 5)) (v128.const i16x8 5 5 5 5 5 5 5 5))
27 (assert_return (invoke "i16x8.splat" (i32.const -5)) (v128.const i16x8 -5 -5 -5 -5 -5 -5 -5 -5))
28 (assert_return (invoke "i16x8.splat" (i32.const 65537)) (v128.const i16x8 1 1 1 1 1 1 1 1))
29 (assert_return (invoke "i16x8.splat" (i32.const 0xffff)) (v128.const i16x8 -1 -1 -1 -1 -1 -1 -1 -1))
30 (assert_return (invoke "i16x8.splat" (i32.const -32768)) (v128.const i16x8 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768))
31 (assert_return (invoke "i16x8.splat" (i32.const 32767)) (v128.const i16x8 32767 32767 32767 32767 32767 32767 32767 32767))
32 (assert_return (invoke "i16x8.splat" (i32.const -32769)) (v128.const i16x8 32767 32767 32767 32767 32767 32767 32767 32767))
33 (assert_return (invoke "i16x8.splat" (i32.const 32768)) (v128.const i16x8 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768))
34 (assert_return (invoke "i16x8.splat" (i32.const 0xffff7fff)) (v128.const i16x8 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff))
35 (assert_return (invoke "i16x8.splat" (i32.const 0x8000)) (v128.const i16x8 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000 0x8000))
36 (assert_return (invoke "i16x8.splat" (i32.const 0xABCD)) (v128.const i32x4 0xABCDABCD 0xABCDABCD 0xABCDABCD 0xABCDABCD))
37 (assert_return (invoke "i16x8.splat" (i32.const 012345)) (v128.const i16x8 012_345 012_345 012_345 012_345 012_345 012_345 012_345 012_345))
38 (assert_return (invoke "i16x8.splat" (i32.const 0x01234)) (v128.const i16x8 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234 0x0_1234))
40 (assert_return (invoke "i32x4.splat" (i32.const 0)) (v128.const i32x4 0 0 0 0))
41 (assert_return (invoke "i32x4.splat" (i32.const 5)) (v128.const i32x4 5 5 5 5))
42 (assert_return (invoke "i32x4.splat" (i32.const -5)) (v128.const i32x4 -5 -5 -5 -5))
43 (assert_return (invoke "i32x4.splat" (i32.const 0xffffffff)) (v128.const i32x4 -1 -1 -1 -1))
44 (assert_return (invoke "i32x4.splat" (i32.const 4294967295)) (v128.const i32x4 -1 -1 -1 -1))
45 (assert_return (invoke "i32x4.splat" (i32.const -2147483648)) (v128.const i32x4 0x80000000 0x80000000 0x80000000 0x80000000))
46 (assert_return (invoke "i32x4.splat" (i32.const 2147483647)) (v128.const i32x4 0x7fffffff 0x7fffffff 0x7fffffff 0x7fffffff))
47 (assert_return (invoke "i32x4.splat" (i32.const 2147483648)) (v128.const i32x4 0x80000000 0x80000000 0x80000000 0x80000000))
48 (assert_return (invoke "i32x4.splat" (i32.const 01234567890)) (v128.const i32x4 012_3456_7890 012_3456_7890 012_3456_7890 012_3456_7890))
49 (assert_return (invoke "i32x4.splat" (i32.const 0x012345678)) (v128.const i32x4 0x0_1234_5678 0x0_1234_5678 0x0_1234_5678 0x0_1234_5678))
51 (assert_return (invoke "f32x4.splat" (f32.const 0.0)) (v128.const f32x4 0.0 0.0 0.0 0.0))
52 (assert_return (invoke "f32x4.splat" (f32.const 1.1)) (v128.const f32x4 1.1 1.1 1.1 1.1))
53 (assert_return (invoke "f32x4.splat" (f32.const -1.1)) (v128.const f32x4 -1.1 -1.1 -1.1 -1.1))
54 (assert_return (invoke "f32x4.splat" (f32.const 1e38)) (v128.const f32x4 1e38 1e38 1e38 1e38))
55 (assert_return (invoke "f32x4.splat" (f32.const -1e38)) (v128.const f32x4 -1e38 -1e38 -1e38 -1e38))
56 (assert_return (invoke "f32x4.splat" (f32.const 0x1.fffffep127)) (v128.const f32x4 0x1.fffffep127 0x1.fffffep127 0x1.fffffep127 0x1.fffffep127))
57 (assert_return (invoke "f32x4.splat" (f32.const -0x1.fffffep127)) (v128.const f32x4 -0x1.fffffep127 -0x1.fffffep127 -0x1.fffffep127 -0x1.fffffep127))
58 (assert_return (invoke "f32x4.splat" (f32.const 0x1p127)) (v128.const f32x4 0x1p127 0x1p127 0x1p127 0x1p127))
59 (assert_return (invoke "f32x4.splat" (f32.const -0x1p127)) (v128.const f32x4 -0x1p127 -0x1p127 -0x1p127 -0x1p127))
60 (assert_return (invoke "f32x4.splat" (f32.const inf)) (v128.const f32x4 inf inf inf inf))
61 (assert_return (invoke "f32x4.splat" (f32.const -inf)) (v128.const f32x4 -inf -inf -inf -inf))
62 (assert_return (invoke "f32x4.splat" (f32.const nan)) (v128.const f32x4 nan nan nan nan))
63 (assert_return (invoke "f32x4.splat" (f32.const nan:0x1)) (v128.const f32x4 nan:0x1 nan:0x1 nan:0x1 nan:0x1))
64 (assert_return (invoke "f32x4.splat" (f32.const nan:0x7f_ffff)) (v128.const f32x4 nan:0x7f_ffff nan:0x7f_ffff nan:0x7f_ffff nan:0x7f_ffff))
65 (assert_return (invoke "f32x4.splat" (f32.const 0123456789)) (v128.const f32x4 0123456789 0123456789 0123456789 0123456789))
66 (assert_return (invoke "f32x4.splat" (f32.const 0123456789.)) (v128.const f32x4 0123456789. 0123456789. 0123456789. 0123456789.))
67 (assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF)) (v128.const f32x4 0x0123456789ABCDEF 0x0123456789ABCDEF 0x0123456789ABCDEF 0x0123456789ABCDEF))
68 (assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF.)) (v128.const f32x4 0x0123456789ABCDEF. 0x0123456789ABCDEF. 0x0123456789ABCDEF. 0x0123456789ABCDEF.))
69 (assert_return (invoke "f32x4.splat" (f32.const 0123456789e019)) (v128.const f32x4 0123456789e019 0123456789e019 0123456789e019 0123456789e019))
70 (assert_return (invoke "f32x4.splat" (f32.const 0123456789.e+019)) (v128.const f32x4 0123456789.e+019 0123456789.e+019 0123456789.e+019 0123456789.e+019))
71 (assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEFp019)) (v128.const f32x4 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019 0x0123456789ABCDEFp019))
72 (assert_return (invoke "f32x4.splat" (f32.const 0x0123456789ABCDEF.p-019)) (v128.const f32x4 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019 0x0123456789ABCDEF.p-019))
74 (assert_return (invoke "i64x2.splat" (i64.const 0)) (v128.const i64x2 0 0))
75 (assert_return (invoke "i64x2.splat" (i64.const -0)) (v128.const i64x2 0 0))
76 (assert_return (invoke "i64x2.splat" (i64.const 1)) (v128.const i64x2 1 1))
77 (assert_return (invoke "i64x2.splat" (i64.const -1)) (v128.const i64x2 -1 -1))
78 (assert_return (invoke "i64x2.splat" (i64.const -9223372036854775808)) (v128.const i64x2 -9223372036854775808 -9223372036854775808))
79 (assert_return (invoke "i64x2.splat" (i64.const -9223372036854775808)) (v128.const i64x2 9223372036854775808 9223372036854775808))
80 (assert_return (invoke "i64x2.splat" (i64.const 9223372036854775807)) (v128.const i64x2 9223372036854775807 9223372036854775807))
81 (assert_return (invoke "i64x2.splat" (i64.const 18446744073709551615)) (v128.const i64x2 -1 -1))
82 (assert_return (invoke "i64x2.splat" (i64.const 0x7fffffffffffffff)) (v128.const i64x2 0x7fffffffffffffff 0x7fffffffffffffff))
83 (assert_return (invoke "i64x2.splat" (i64.const 0xffffffffffffffff)) (v128.const i64x2 -1 -1))
84 (assert_return (invoke "i64x2.splat" (i64.const -0x8000000000000000)) (v128.const i64x2 -0x8000000000000000 -0x8000000000000000))
85 (assert_return (invoke "i64x2.splat" (i64.const -0x8000000000000000)) (v128.const i64x2 0x8000000000000000 0x8000000000000000))
86 (assert_return (invoke "i64x2.splat" (i64.const 01234567890123456789)) (v128.const i64x2 01_234_567_890_123_456_789 01_234_567_890_123_456_789))
87 (assert_return (invoke "i64x2.splat" (i64.const 0x01234567890ABcdef)) (v128.const i64x2 0x0_1234_5678_90AB_cdef 0x0_1234_5678_90AB_cdef))
89 (assert_return (invoke "f64x2.splat" (f64.const 0.0)) (v128.const f64x2 0.0 0.0))
90 (assert_return (invoke "f64x2.splat" (f64.const -0.0)) (v128.const f64x2 -0.0 -0.0))
91 (assert_return (invoke "f64x2.splat" (f64.const 1.1)) (v128.const f64x2 1.1 1.1))
92 (assert_return (invoke "f64x2.splat" (f64.const -1.1)) (v128.const f64x2 -1.1 -1.1))
93 (assert_return (invoke "f64x2.splat" (f64.const 0x0.0000000000001p-1022)) (v128.const f64x2 0x0.0000000000001p-1022 0x0.0000000000001p-1022))
94 (assert_return (invoke "f64x2.splat" (f64.const -0x0.0000000000001p-1022)) (v128.const f64x2 -0x0.0000000000001p-1022 -0x0.0000000000001p-1022))
95 (assert_return (invoke "f64x2.splat" (f64.const 0x1p-1022)) (v128.const f64x2 0x1p-1022 0x1p-1022))
96 (assert_return (invoke "f64x2.splat" (f64.const -0x1p-1022)) (v128.const f64x2 -0x1p-1022 -0x1p-1022))
97 (assert_return (invoke "f64x2.splat" (f64.const 0x1p-1)) (v128.const f64x2 0x1p-1 0x1p-1))
98 (assert_return (invoke "f64x2.splat" (f64.const -0x1p-1)) (v128.const f64x2 -0x1p-1 -0x1p-1))
99 (assert_return (invoke "f64x2.splat" (f64.const 0x1p+0)) (v128.const f64x2 0x1p+0 0x1p+0))
100 (assert_return (invoke "f64x2.splat" (f64.const -0x1p+0)) (v128.const f64x2 -0x1p+0 -0x1p+0))
101 (assert_return (invoke "f64x2.splat" (f64.const 0x1.921fb54442d18p+2)) (v128.const f64x2 0x1.921fb54442d18p+2 0x1.921fb54442d18p+2))
102 (assert_return (invoke "f64x2.splat" (f64.const -0x1.921fb54442d18p+2)) (v128.const f64x2 -0x1.921fb54442d18p+2 -0x1.921fb54442d18p+2))
103 (assert_return (invoke "f64x2.splat" (f64.const 0x1.fffffffffffffp+1023)) (v128.const f64x2 0x1.fffffffffffffp+1023 0x1.fffffffffffffp+1023))
104 (assert_return (invoke "f64x2.splat" (f64.const -0x1.fffffffffffffp+1023)) (v128.const f64x2 -0x1.fffffffffffffp+1023 -0x1.fffffffffffffp+1023))
105 (assert_return (invoke "f64x2.splat" (f64.const inf)) (v128.const f64x2 inf inf))
106 (assert_return (invoke "f64x2.splat" (f64.const -inf)) (v128.const f64x2 -inf -inf))
107 (assert_return (invoke "f64x2.splat" (f64.const nan)) (v128.const f64x2 nan nan))
108 (assert_return (invoke "f64x2.splat" (f64.const -nan)) (v128.const f64x2 -nan -nan))
109 (assert_return (invoke "f64x2.splat" (f64.const nan:0x4000000000000)) (v128.const f64x2 nan:0x4000000000000 nan:0x4000000000000))
110 (assert_return (invoke "f64x2.splat" (f64.const -nan:0x4000000000000)) (v128.const f64x2 -nan:0x4000000000000 -nan:0x4000000000000))
111 (assert_return (invoke "f64x2.splat" (f64.const 0123456789)) (v128.const f64x2 0123456789 0123456789))
112 (assert_return (invoke "f64x2.splat" (f64.const 0123456789.)) (v128.const f64x2 0123456789. 0123456789.))
113 (assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef)) (v128.const f64x2 0x0123456789ABCDEFabcdef 0x0123456789ABCDEFabcdef))
114 (assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.)) (v128.const f64x2 0x0123456789ABCDEFabcdef. 0x0123456789ABCDEFabcdef.))
115 (assert_return (invoke "f64x2.splat" (f64.const 0123456789e019)) (v128.const f64x2 0123456789e019 0123456789e019))
116 (assert_return (invoke "f64x2.splat" (f64.const 0123456789e+019)) (v128.const f64x2 0123456789e+019 0123456789e+019))
117 (assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.p019)) (v128.const f64x2 0x0123456789ABCDEFabcdef.p019 0x0123456789ABCDEFabcdef.p019))
118 (assert_return (invoke "f64x2.splat" (f64.const 0x0123456789ABCDEFabcdef.p-019)) (v128.const f64x2 0x0123456789ABCDEFabcdef.p-019 0x0123456789ABCDEFabcdef.p-019))
122 (assert_malformed (module quote "(func (result v128) (v128.splat (i32.const 0)))") "unknown operator")
127 (assert_invalid (module (func (result v128) i8x16.splat (i64.const 0))) "type mismatch")
128 (assert_invalid (module (func (result v128) i8x16.splat (f32.const 0.0))) "type mismatch")
129 (assert_invalid (module (func (result v128) i8x16.splat (f64.const 0.0))) "type mismatch")
130 (assert_invalid (module (func (result v128) i16x8.splat (i64.const 1))) "type mismatch")
131 (assert_invalid (module (func (result v128) i16x8.splat (f32.const 1.0))) "type mismatch")
132 (assert_invalid (module (func (result v128) i16x8.splat (f64.const 1.0))) "type mismatch")
133 (assert_invalid (module (func (result v128) i32x4.splat (i64.const 2))) "type mismatch")
134 (assert_invalid (module (func (result v128) i32x4.splat (f32.const 2.0))) "type mismatch")
135 (assert_invalid (module (func (result v128) i32x4.splat (f64.const 2.0))) "type mismatch")
136 (assert_invalid (module (func (result v128) f32x4.splat (i32.const 4))) "type mismatch")
137 (assert_invalid (module (func (result v128) f32x4.splat (i64.const 4))) "type mismatch")
138 (assert_invalid (module (func (result v128) f32x4.splat (f64.const 4.0))) "type mismatch")
139 (assert_invalid (module (func (result v128) i64x2.splat (i32.const 0))) "type mismatch")
140 (assert_invalid (module (func (result v128) i64x2.splat (f64.const 0.0))) "type mismatch")
141 (assert_invalid (module (func (result v128) f64x2.splat (i32.const 0))) "type mismatch")
142 (assert_invalid (module (func (result v128) f64x2.splat (f32.const 0.0))) "type mismatch")
145 ;; V128 splat operators as the argument of other SIMD instructions
147 ;; v128.store and v128.load
149 (func (export "as-v128_store-operand-1") (param i32) (result v128)
150 (v128.store (i32.const 0) (i8x16.splat (local.get 0)))
151 (v128.load (i32.const 0)))
152 (func (export "as-v128_store-operand-2") (param i32) (result v128)
153 (v128.store (i32.const 0) (i16x8.splat (local.get 0)))
154 (v128.load (i32.const 0)))
155 (func (export "as-v128_store-operand-3") (param i32) (result v128)
156 (v128.store (i32.const 0) (i32x4.splat (local.get 0)))
157 (v128.load (i32.const 0)))
158 (func (export "as-v128_store-operand-4") (param i64) (result v128)
159 (v128.store (i32.const 0) (i64x2.splat (local.get 0)))
160 (v128.load (i32.const 0)))
161 (func (export "as-v128_store-operand-5") (param f64) (result v128)
162 (v128.store (i32.const 0) (f64x2.splat (local.get 0)))
163 (v128.load (i32.const 0)))
166 (assert_return (invoke "as-v128_store-operand-1" (i32.const 1)) (v128.const i8x16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1))
167 (assert_return (invoke "as-v128_store-operand-2" (i32.const 256)) (v128.const i16x8 0x100 0x100 0x100 0x100 0x100 0x100 0x100 0x100))
168 (assert_return (invoke "as-v128_store-operand-3" (i32.const 0xffffffff)) (v128.const i32x4 -1 -1 -1 -1))
169 (assert_return (invoke "as-v128_store-operand-4" (i64.const 1)) (v128.const i64x2 1 1))
170 (assert_return (invoke "as-v128_store-operand-5" (f64.const -0x1p+0)) (v128.const f64x2 -0x1p+0 -0x1p+0))
174 (func (export "as-i8x16_extract_lane_s-operand-first") (param i32) (result i32)
175 (i8x16.extract_lane_s 0 (i8x16.splat (local.get 0))))
176 (func (export "as-i8x16_extract_lane_s-operand-last") (param i32) (result i32)
177 (i8x16.extract_lane_s 15 (i8x16.splat (local.get 0))))
178 (func (export "as-i16x8_extract_lane_s-operand-first") (param i32) (result i32)
179 (i16x8.extract_lane_s 0 (i16x8.splat (local.get 0))))
180 (func (export "as-i16x8_extract_lane_s-operand-last") (param i32) (result i32)
181 (i16x8.extract_lane_s 7 (i16x8.splat (local.get 0))))
182 (func (export "as-i32x4_extract_lane_s-operand-first") (param i32) (result i32)
183 (i32x4.extract_lane 0 (i32x4.splat (local.get 0))))
184 (func (export "as-i32x4_extract_lane_s-operand-last") (param i32) (result i32)
185 (i32x4.extract_lane 3 (i32x4.splat (local.get 0))))
186 (func (export "as-f32x4_extract_lane_s-operand-first") (param f32) (result f32)
187 (f32x4.extract_lane 0 (f32x4.splat (local.get 0))))
188 (func (export "as-f32x4_extract_lane_s-operand-last") (param f32) (result f32)
189 (f32x4.extract_lane 3 (f32x4.splat (local.get 0))))
190 (func (export "as-v8x16_swizzle-operands") (param i32) (param i32) (result v128)
191 (i8x16.swizzle (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1))))
192 (func (export "as-i64x2_extract_lane-operand-first") (param i64) (result i64)
193 (i64x2.extract_lane 0 (i64x2.splat (local.get 0))))
194 (func (export "as-i64x2_extract_lane-operand-last") (param i64) (result i64)
195 (i64x2.extract_lane 1 (i64x2.splat (local.get 0))))
196 (func (export "as-f64x2_extract_lane-operand-first") (param f64) (result f64)
197 (f64x2.extract_lane 0 (f64x2.splat (local.get 0))))
198 (func (export "as-f64x2_extract_lane-operand-last") (param f64) (result f64)
199 (f64x2.extract_lane 1 (f64x2.splat (local.get 0))))
201 ;; Integer arithmetic
202 (func (export "as-i8x16_add_sub-operands") (param i32 i32 i32) (result v128)
203 (i8x16.add (i8x16.splat (local.get 0))
204 (i8x16.sub (i8x16.splat (local.get 1)) (i8x16.splat (local.get 2)))))
205 (func (export "as-i16x8_add_sub_mul-operands") (param i32 i32 i32 i32) (result v128)
206 (i16x8.add (i16x8.splat (local.get 0))
207 (i16x8.sub (i16x8.splat (local.get 1))
208 (i16x8.mul (i16x8.splat (local.get 2)) (i16x8.splat (local.get 3))))))
209 (func (export "as-i32x4_add_sub_mul-operands") (param i32 i32 i32 i32) (result v128)
210 (i32x4.add (i32x4.splat (local.get 0))
211 (i32x4.sub (i32x4.splat (local.get 1))
212 (i32x4.mul (i32x4.splat (local.get 2)) (i32x4.splat (local.get 3))))))
214 (func (export "as-i64x2_add_sub_mul-operands") (param i64 i64 i64 i64) (result v128)
215 (i64x2.add (i64x2.splat (local.get 0))
216 (i64x2.sub (i64x2.splat (local.get 1))
217 (i64x2.mul (i64x2.splat (local.get 2)) (i64x2.splat (local.get 3))))))
218 (func (export "as-f64x2_add_sub_mul-operands") (param f64 f64 f64 f64) (result v128)
219 (f64x2.add (f64x2.splat (local.get 0))
220 (f64x2.sub (f64x2.splat (local.get 1))
221 (f64x2.mul (f64x2.splat (local.get 2)) (f64x2.splat (local.get 3))))))
223 ;; Saturating integer arithmetic
224 (func (export "as-i8x16_add_sat_s-operands") (param i32 i32) (result v128)
225 (i8x16.add_sat_s (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1))))
226 (func (export "as-i16x8_add_sat_s-operands") (param i32 i32) (result v128)
227 (i16x8.add_sat_s (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1))))
228 (func (export "as-i8x16_sub_sat_u-operands") (param i32 i32) (result v128)
229 (i8x16.sub_sat_u (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1))))
230 (func (export "as-i16x8_sub_sat_u-operands") (param i32 i32) (result v128)
231 (i16x8.sub_sat_u (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1))))
234 (func (export "as-i8x16_shr_s-operand") (param i32 i32) (result v128)
235 (i8x16.shr_s (i8x16.splat (local.get 0)) (local.get 1)))
236 (func (export "as-i16x8_shr_s-operand") (param i32 i32) (result v128)
237 (i16x8.shr_s (i16x8.splat (local.get 0)) (local.get 1)))
238 (func (export "as-i32x4_shr_s-operand") (param i32 i32) (result v128)
239 (i32x4.shr_s (i32x4.splat (local.get 0)) (local.get 1)))
241 ;; Bitwise operantions
242 (func (export "as-v128_and-operands") (param i32 i32) (result v128)
243 (v128.and (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1))))
244 (func (export "as-v128_or-operands") (param i32 i32) (result v128)
245 (v128.or (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1))))
246 (func (export "as-v128_xor-operands") (param i32 i32) (result v128)
247 (v128.xor (i32x4.splat (local.get 0)) (i32x4.splat (local.get 1))))
249 ;; Boolean horizontal reductions
250 (func (export "as-i8x16_all_true-operand") (param i32) (result i32)
251 (i8x16.all_true (i8x16.splat (local.get 0))))
252 (func (export "as-i16x8_all_true-operand") (param i32) (result i32)
253 (i16x8.all_true (i16x8.splat (local.get 0))))
254 (func (export "as-i32x4_all_true-operand1") (param i32) (result i32)
255 (i32x4.all_true (i32x4.splat (local.get 0))))
256 (func (export "as-i32x4_all_true-operand2") (param i64) (result i32)
257 (i32x4.all_true (i64x2.splat (local.get 0))))
260 (func (export "as-i8x16_eq-operands") (param i32 i32) (result v128)
261 (i8x16.eq (i8x16.splat (local.get 0)) (i8x16.splat (local.get 1))))
262 (func (export "as-i16x8_eq-operands") (param i32 i32) (result v128)
263 (i16x8.eq (i16x8.splat (local.get 0)) (i16x8.splat (local.get 1))))
264 (func (export "as-i32x4_eq-operands1") (param i32 i32) (result v128)
265 (i32x4.eq (i32x4.splat (local.get 0)) (i32x4.splat (local.get 1))))
266 (func (export "as-i32x4_eq-operands2") (param i64 i64) (result v128)
267 (i32x4.eq (i64x2.splat (local.get 0)) (i64x2.splat (local.get 1))))
268 (func (export "as-f32x4_eq-operands") (param f32 f32) (result v128)
269 (f32x4.eq (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1))))
270 (func (export "as-f64x2_eq-operands") (param f64 f64) (result v128)
271 (f64x2.eq (f64x2.splat (local.get 0)) (f64x2.splat (local.get 1))))
273 ;; Floating-point sign bit operations
274 (func (export "as-f32x4_abs-operand") (param f32) (result v128)
275 (f32x4.abs (f32x4.splat (local.get 0))))
277 ;; Floating-point min
278 (func (export "as-f32x4_min-operands") (param f32 f32) (result v128)
279 (f32x4.min (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1))))
281 ;; Floating-point arithmetic
282 (func (export "as-f32x4_div-operands") (param f32 f32) (result v128)
283 (f32x4.div (f32x4.splat (local.get 0)) (f32x4.splat (local.get 1))))
286 (func (export "as-f32x4_convert_s_i32x4-operand") (param i32) (result v128)
287 (f32x4.convert_i32x4_s (i32x4.splat (local.get 0))))
288 (func (export "as-i32x4_trunc_s_f32x4_sat-operand") (param f32) (result v128)
289 (i32x4.trunc_sat_f32x4_s (f32x4.splat (local.get 0))))
292 (assert_return (invoke "as-i8x16_extract_lane_s-operand-first" (i32.const 42)) (i32.const 42))
293 (assert_return (invoke "as-i8x16_extract_lane_s-operand-last" (i32.const -42)) (i32.const -42))
294 (assert_return (invoke "as-i16x8_extract_lane_s-operand-first" (i32.const 0xffff7fff)) (i32.const 32767))
295 (assert_return (invoke "as-i16x8_extract_lane_s-operand-last" (i32.const 0x8000)) (i32.const -32768))
296 (assert_return (invoke "as-i32x4_extract_lane_s-operand-first" (i32.const 0x7fffffff)) (i32.const 2147483647))
297 (assert_return (invoke "as-i32x4_extract_lane_s-operand-last" (i32.const 0x80000000)) (i32.const -2147483648))
298 (assert_return (invoke "as-f32x4_extract_lane_s-operand-first" (f32.const 1.5)) (f32.const 1.5))
299 (assert_return (invoke "as-f32x4_extract_lane_s-operand-last" (f32.const -0.25)) (f32.const -0.25))
300 (assert_return (invoke "as-v8x16_swizzle-operands" (i32.const 1) (i32.const -1)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
301 (assert_return (invoke "as-i64x2_extract_lane-operand-last" (i64.const -42)) (i64.const -42))
302 (assert_return (invoke "as-i64x2_extract_lane-operand-first" (i64.const 42)) (i64.const 42))
303 (assert_return (invoke "as-f64x2_extract_lane-operand-first" (f64.const 1.5)) (f64.const 1.5))
304 (assert_return (invoke "as-f64x2_extract_lane-operand-last" (f64.const -0x1p+0)) (f64.const -0x1p+0))
306 (assert_return (invoke "as-i8x16_add_sub-operands" (i32.const 3) (i32.const 2) (i32.const 1)) (v128.const i8x16 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4))
307 (assert_return (invoke "as-i16x8_add_sub_mul-operands" (i32.const 257) (i32.const 128) (i32.const 16) (i32.const 16)) (v128.const i16x8 129 129 129 129 129 129 129 129))
308 (assert_return (invoke "as-i32x4_add_sub_mul-operands" (i32.const 65535) (i32.const 65537) (i32.const 256) (i32.const 256)) (v128.const i32x4 0x10000 0x10000 0x10000 0x10000))
309 (assert_return (invoke "as-i64x2_add_sub_mul-operands" (i64.const 0x7fffffff) (i64.const 0x1_0000_0001) (i64.const 65536) (i64.const 65536)) (v128.const i64x2 0x8000_0000 0x8000_0000))
310 (assert_return (invoke "as-f64x2_add_sub_mul-operands" (f64.const 0x1p-1) (f64.const 0.75) (f64.const 0x1p-1) (f64.const 0.5)) (v128.const f64x2 0x1p+0 0x1p+0))
312 (assert_return (invoke "as-i8x16_add_sat_s-operands" (i32.const 0x7f) (i32.const 1)) (v128.const i8x16 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f 0x7f))
313 (assert_return (invoke "as-i16x8_add_sat_s-operands" (i32.const 0x7fff) (i32.const 1)) (v128.const i16x8 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff 0x7fff))
314 (assert_return (invoke "as-i8x16_sub_sat_u-operands" (i32.const 0x7f) (i32.const 0xff)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
315 (assert_return (invoke "as-i16x8_sub_sat_u-operands" (i32.const 0x7fff) (i32.const 0xffff)) (v128.const i16x8 0 0 0 0 0 0 0 0))
317 (assert_return (invoke "as-i8x16_shr_s-operand" (i32.const 0xf0) (i32.const 3)) (v128.const i8x16 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2))
318 (assert_return (invoke "as-i16x8_shr_s-operand" (i32.const 0x100) (i32.const 4)) (v128.const i16x8 16 16 16 16 16 16 16 16))
319 (assert_return (invoke "as-i32x4_shr_s-operand" (i32.const -1) (i32.const 16)) (v128.const i32x4 -1 -1 -1 -1))
321 (assert_return (invoke "as-v128_and-operands" (i32.const 0x11) (i32.const 0xff)) (v128.const i8x16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17))
322 (assert_return (invoke "as-v128_or-operands" (i32.const 0) (i32.const 0xffff)) (v128.const i16x8 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff))
323 (assert_return (invoke "as-v128_xor-operands" (i32.const 0xf0f0f0f0) (i32.const 0xffffffff)) (v128.const i32x4 0xf0f0f0f 0xf0f0f0f 0xf0f0f0f 0xf0f0f0f))
325 (assert_return (invoke "as-i8x16_all_true-operand" (i32.const 0)) (i32.const 0))
326 (assert_return (invoke "as-i16x8_all_true-operand" (i32.const 0xffff)) (i32.const 1))
327 (assert_return (invoke "as-i32x4_all_true-operand1" (i32.const 0xf0f0f0f0)) (i32.const 1))
328 (assert_return (invoke "as-i32x4_all_true-operand2" (i64.const -1)) (i32.const 1))
330 (assert_return (invoke "as-i8x16_eq-operands" (i32.const 1) (i32.const 2)) (v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
331 (assert_return (invoke "as-i16x8_eq-operands" (i32.const -1) (i32.const 65535)) (v128.const i16x8 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff))
332 (assert_return (invoke "as-i32x4_eq-operands1" (i32.const -1) (i32.const 0xffffffff)) (v128.const i32x4 0xffffffff 0xffffffff 0xffffffff 0xffffffff))
333 (assert_return (invoke "as-f32x4_eq-operands" (f32.const +0.0) (f32.const -0.0)) (v128.const i32x4 0xffffffff 0xffffffff 0xffffffff 0xffffffff))
334 (assert_return (invoke "as-i32x4_eq-operands2" (i64.const 1) (i64.const 2)) (v128.const i64x2 0xffffffff00000000 0xffffffff00000000))
335 (assert_return (invoke "as-f64x2_eq-operands" (f64.const +0.0) (f64.const -0.0)) (v128.const i64x2 -1 -1))
337 (assert_return (invoke "as-f32x4_abs-operand" (f32.const -1.125)) (v128.const f32x4 1.125 1.125 1.125 1.125))
338 (assert_return (invoke "as-f32x4_min-operands" (f32.const 0.25) (f32.const 1e-38)) (v128.const f32x4 1e-38 1e-38 1e-38 1e-38))
339 (assert_return (invoke "as-f32x4_div-operands" (f32.const 1.0) (f32.const 8.0)) (v128.const f32x4 0.125 0.125 0.125 0.125))
341 (assert_return (invoke "as-f32x4_convert_s_i32x4-operand" (i32.const 12345)) (v128.const f32x4 12345.0 12345.0 12345.0 12345.0))
342 (assert_return (invoke "as-i32x4_trunc_s_f32x4_sat-operand" (f32.const 1.1)) (v128.const i32x4 1 1 1 1))
345 ;; As the argument of control constructs and WASM instructions
348 (global $g (mut v128) (v128.const f32x4 0.0 0.0 0.0 0.0))
349 (func (export "as-br-value1") (param i32) (result v128)
350 (block (result v128) (br 0 (i8x16.splat (local.get 0)))))
351 (func (export "as-return-value1") (param i32) (result v128)
352 (return (i16x8.splat (local.get 0))))
353 (func (export "as-local_set-value1") (param i32) (result v128) (local v128)
354 (local.set 1 (i32x4.splat (local.get 0)))
355 (return (local.get 1)))
356 (func (export "as-global_set-value1") (param f32) (result v128)
357 (global.set $g (f32x4.splat (local.get 0)))
358 (return (global.get $g)))
359 (func (export "as-br-value2") (param i64) (result v128)
360 (block (result v128) (br 0 (i64x2.splat (local.get 0)))))
361 (func (export "as-return-value2") (param i64) (result v128)
362 (return (i64x2.splat (local.get 0))))
363 (func (export "as-local_set-value2") (param i64) (result v128) (local v128)
364 (local.set 1 (i64x2.splat (local.get 0)))
365 (return (local.get 1)))
366 (func (export "as-global_set-value2") (param f64) (result v128)
367 (global.set $g (f64x2.splat (local.get 0)))
368 (return (global.get $g)))
371 (assert_return (invoke "as-br-value1" (i32.const 0xAB)) (v128.const i8x16 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB 0xAB))
372 (assert_return (invoke "as-return-value1" (i32.const 0xABCD)) (v128.const i16x8 0xABCD 0xABCD 0xABCD 0xABCD 0xABCD 0xABCD 0xABCD 0xABCD))
373 (assert_return (invoke "as-local_set-value1" (i32.const 0x10000)) (v128.const i32x4 0x10000 0x10000 0x10000 0x10000))
374 (assert_return (invoke "as-global_set-value1" (f32.const 1.0)) (v128.const f32x4 1.0 1.0 1.0 1.0))
375 (assert_return (invoke "as-br-value2" (i64.const 0xABCD)) (v128.const i64x2 0xABCD 0xABCD))
376 (assert_return (invoke "as-return-value2" (i64.const 0xABCD)) (v128.const i64x2 0xABCD 0xABCD))
377 (assert_return (invoke "as-local_set-value2" (i64.const 0x10000)) (v128.const i64x2 0x10000 0x10000))
378 (assert_return (invoke "as-global_set-value2" (f64.const 1.0)) (v128.const f64x2 1.0 1.0))
381 ;; Test operation with empty argument
385 (func $i8x16.splat-arg-empty (result v128)
393 (func $i16x8.splat-arg-empty (result v128)
401 (func $i32x4.splat-arg-empty (result v128)
409 (func $f32x4.splat-arg-empty (result v128)
417 (func $i64x2.splat-arg-empty (result v128)
425 (func $f64x2.splat-arg-empty (result v128)