3131 (i64.const -1 ) (i64.const -1 ))
3232 (i64.const 0 ) (i64.const 1 ))
3333
34+ ;; simple subtraction
35+ (assert_return (invoke " i64.sub128"
36+ (i64.const 0 ) (i64.const 0 )
37+ (i64.const 0 ) (i64.const 0 ))
38+ (i64.const 0 ) (i64.const 0 ))
39+ (assert_return (invoke " i64.sub128"
40+ (i64.const 0 ) (i64.const 0 )
41+ (i64.const 1 ) (i64.const 0 ))
42+ (i64.const -1 ) (i64.const -1 ))
43+ (assert_return (invoke " i64.sub128"
44+ (i64.const 0 ) (i64.const 1 )
45+ (i64.const 1 ) (i64.const 1 ))
46+ (i64.const -1 ) (i64.const -1 ))
47+ (assert_return (invoke " i64.sub128"
48+ (i64.const 0 ) (i64.const 0 )
49+ (i64.const 1 ) (i64.const 1 ))
50+ (i64.const -1 ) (i64.const -2 ))
51+
3452;; 20 randomly generated test cases for i64.add128
3553(assert_return (invoke " i64.add128"
3654 (i64.const -2418420703207364752 ) (i64.const -1 )
113131 (i64.const 1 ) (i64.const 0 ))
114132 (i64.const 414720966820876429 ) (i64.const -1 ))
115133
116- ;; simple subtraction
134+
135+ ;; 20 randomly generated test cases for i64.sub128
117136(assert_return (invoke " i64.sub128"
118- (i64.const 0 ) (i64.const 0 )
119- (i64.const 0 ) (i64.const 0 ))
120- (i64.const 0 ) (i64.const 0 ))
137+ (i64.const 0 ) (i64.const -2459085471354756766 )
138+ (i64.const -9151153060221070927 ) (i64.const -1 ))
139+ (i64.const 9151153060221070927 ) (i64.const -2459085471354756766 ))
121140(assert_return (invoke " i64.sub128"
122- (i64.const 1 ) (i64.const 0 )
123- (i64.const 1 ) (i64.const 0 ))
141+ (i64.const 4566502638724063423 ) (i64.const -4282658540409485563 )
142+ (i64.const -6884077310018979971 ) (i64.const -1 ))
143+ (i64.const -6996164124966508222 ) (i64.const -4282658540409485563 ))
144+ (assert_return (invoke " i64.sub128"
145+ (i64.const 1 ) (i64.const 3118380319444903041 )
146+ (i64.const 0 ) (i64.const 3283115686417695443 ))
147+ (i64.const 1 ) (i64.const -164735366972792402 ))
148+ (assert_return (invoke " i64.sub128"
149+ (i64.const -7208415241680161810 ) (i64.const -1 )
150+ (i64.const 1 ) (i64.const 0 ))
151+ (i64.const -7208415241680161811 ) (i64.const -1 ))
152+ (assert_return (invoke " i64.sub128"
153+ (i64.const 0 ) (i64.const 3944850126731328706 )
154+ (i64.const 1 ) (i64.const 1 ))
155+ (i64.const -1 ) (i64.const 3944850126731328704 ))
156+ (assert_return (invoke " i64.sub128"
157+ (i64.const 1 ) (i64.const -1 )
158+ (i64.const -1 ) (i64.const -1 ))
159+ (i64.const 2 ) (i64.const -1 ))
160+ (assert_return (invoke " i64.sub128"
161+ (i64.const -1 ) (i64.const -1 )
162+ (i64.const 4855833073346115923 ) (i64.const -6826437637438999645 ))
163+ (i64.const -4855833073346115924 ) (i64.const 6826437637438999644 ))
164+ (assert_return (invoke " i64.sub128"
165+ (i64.const 1 ) (i64.const 0 )
166+ (i64.const -1 ) (i64.const -1 ))
167+ (i64.const 2 ) (i64.const 0 ))
168+ (assert_return (invoke " i64.sub128"
169+ (i64.const 1 ) (i64.const 0 )
170+ (i64.const 1 ) (i64.const 0 ))
124171 (i64.const 0 ) (i64.const 0 ))
125172(assert_return (invoke " i64.sub128"
126- (i64.const 0 ) (i64.const 0 )
127- (i64.const 1 ) (i64.const 0 ))
128- (i64.const 0xffffffffffffffff ) (i64.const 0xffffffffffffffff ))
173+ (i64.const -1 ) (i64.const -1 )
174+ (i64.const 0 ) (i64.const 0 ))
175+ (i64.const -1 ) (i64.const -1 ))
129176(assert_return (invoke " i64.sub128"
130- (i64.const 0 ) (i64.const 1 )
131- (i64.const 1 ) (i64.const 0 ))
132- (i64.const 0xffffffffffffffff ) (i64.const 0 ))
177+ (i64.const 1 ) (i64.const - 1 )
178+ (i64.const -6365475388498096428 ) (i64.const -1 ))
179+ (i64.const 6365475388498096429 ) (i64.const -1 ))
133180(assert_return (invoke " i64.sub128"
134- (i64.const 1 ) (i64.const 2 )
135- (i64.const 3 ) (i64.const 4 ))
136- (i64.const 0xfffffffffffffffe ) (i64.const 0xfffffffffffffffd ))
181+ (i64.const 6804238617560992346 ) (i64.const -1 )
182+ (i64.const 0 ) (i64.const -1 ))
183+ (i64.const 6804238617560992346 ) (i64.const 0 ))
184+ (assert_return (invoke " i64.sub128"
185+ (i64.const 0 ) (i64.const 1 )
186+ (i64.const 1 ) (i64.const -7756145513466453619 ))
187+ (i64.const -1 ) (i64.const 7756145513466453619 ))
188+ (assert_return (invoke " i64.sub128"
189+ (i64.const 1 ) (i64.const -1 )
190+ (i64.const 1 ) (i64.const 1 ))
191+ (i64.const 0 ) (i64.const -2 ))
192+ (assert_return (invoke " i64.sub128"
193+ (i64.const 0 ) (i64.const 1 )
194+ (i64.const 1 ) (i64.const 0 ))
195+ (i64.const -1 ) (i64.const 0 ))
196+ (assert_return (invoke " i64.sub128"
197+ (i64.const 1 ) (i64.const 5602881641763648953 )
198+ (i64.const -2110589244314239080 ) (i64.const -1 ))
199+ (i64.const 2110589244314239081 ) (i64.const 5602881641763648953 ))
200+ (assert_return (invoke " i64.sub128"
201+ (i64.const 0 ) (i64.const 1 )
202+ (i64.const -1 ) (i64.const -1 ))
203+ (i64.const 1 ) (i64.const 1 ))
204+ (assert_return (invoke " i64.sub128"
205+ (i64.const 0 ) (i64.const -1 )
206+ (i64.const 3553816990259121806 ) (i64.const -2105235417856431622 ))
207+ (i64.const -3553816990259121806 ) (i64.const 2105235417856431620 ))
208+ (assert_return (invoke " i64.sub128"
209+ (i64.const 1861102705894987245 ) (i64.const 1 )
210+ (i64.const 3713781778534059871 ) (i64.const 1 ))
211+ (i64.const -1852679072639072626 ) (i64.const -1 ))
212+ (assert_return (invoke " i64.sub128"
213+ (i64.const 0 ) (i64.const -1 )
214+ (i64.const 1 ) (i64.const 1832524486821761762 ))
215+ (i64.const -1 ) (i64.const -1832524486821761764 ))
137216
138217;; assert overlong encodings for each instruction's binary encoding are accepted
139218(module binary
145224 " \04\7e\7e\7e\7e " ;; 4 params - all i64
146225 " \02\7e\7e " ;; 2 results - both i64
147226
148- " \03\02 " ;; function section, 2 byte
149- " \01 " ;; 1 count
150- " \00 " ;; types of each function (0)
227+ " \03\03 " ;; function section, 3 bytes
228+ " \02 " ;; 2 count
229+ " \00\00 " ;; types of each function (0, 0)
151230
152- " \07\0e " ;; export section 0x0e bytes
153- " \01 " ;; 1 count
231+ " \07\1b " ;; export section 0x1b bytes
232+ " \02 " ;; 2 count
154233 " \0a i64.add128\00\00 " ;; "i64.add128" which is function 0
234+ " \0a i64.sub128\00\01 " ;; "i64.sub128" which is function 1
155235
156- " \0a\10 " ;; code section, 16 bytes
157- " \01 " ;; 1 count
236+ " \0a\1e " ;; code section + byte length (30 bytes = 0x1e)
237+ " \02 " ;; 2 count
158238
159239 " \0e " ;; byte length
160240 " \00 " ;; no locals
164244 " \20\03 " ;; local.get 3
165245 " \fc\93\80\00 " ;; i64.add128 (overlong)
166246 " \0b " ;; end
247+
248+ " \0d " ;; byte length
249+ " \00 " ;; no locals
250+ " \20\00 " ;; local.get 0
251+ " \20\01 " ;; local.get 1
252+ " \20\02 " ;; local.get 2
253+ " \20\03 " ;; local.get 3
254+ " \fc\94\00 " ;; i64.sub128 (overlong)
255+ " \0b " ;; end
167256)
168257
169258(assert_return (invoke " i64.add128"
170259 (i64.const 1 ) (i64.const 2 )
171260 (i64.const 3 ) (i64.const 4 ))
172261 (i64.const 4 ) (i64.const 6 ))
262+ (assert_return (invoke " i64.sub128"
263+ (i64.const 2 ) (i64.const 5 )
264+ (i64.const 1 ) (i64.const 2 ))
265+ (i64.const 1 ) (i64.const 3 ))
173266
174267;; some invalid types for these instructions
175268
211304 local.get 2
212305 i64.sub128)
213306 )
214- " type mismatch" )
215-
216- (module binary
217- " \00 asm" " \01\00\00\00 "
218-
219- " \01\0a " ;; type section, 10 bytes
220- " \01 " ;; 1 count
221- " \60 " ;; type0 = function
222- " \04\7e\7e\7e\7e " ;; 4 params - all i64
223- " \02\7e\7e " ;; 2 results - both i64
224-
225- " \03\03 " ;; function section, 3 byte
226- " \02 " ;; 2 count
227- " \00\00 " ;; types of each function (0, 0)
228-
229- " \07\1b " ;; export section 0x1b bytes
230- " \02 " ;; 2 count
231- " \0a i64.add128\00\00 " ;; "i64.add128" which is function 0
232- " \0a i64.sub128\00\01 " ;; "i64.sub128" which is function 1
233-
234- " \0a\1e " ;; code section + byte length
235- " \02 " ;; 2 count
236-
237- " \0e " ;; byte length
238- " \00 " ;; no locals
239- " \20\00 " ;; local.get 0
240- " \20\01 " ;; local.get 1
241- " \20\02 " ;; local.get 2
242- " \20\03 " ;; local.get 3
243- " \fc\93\80\00 " ;; i64.add128 (overlong)
244- " \0b " ;; end
245-
246- " \0d " ;; byte length
247- " \00 " ;; no locals
248- " \20\00 " ;; local.get 0
249- " \20\01 " ;; local.get 1
250- " \20\02 " ;; local.get 2
251- " \20\03 " ;; local.get 3
252- " \fc\94\00 " ;; i64.sub128 (overlong)
253- " \0b " ;; end
254- )
255-
256- (assert_return (invoke " i64.add128"
257- (i64.const 1 ) (i64.const 2 )
258- (i64.const 3 ) (i64.const 4 ))
259- (i64.const 4 ) (i64.const 6 ))
260- (assert_return (invoke " i64.sub128"
261- (i64.const 2 ) (i64.const 5 )
262- (i64.const 1 ) (i64.const 2 ))
263- (i64.const 1 ) (i64.const 3 ))
307+ " type mismatch" )
0 commit comments