test-vm.scm 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098
  1. ;;; WebAssembly virtual machine
  2. ;;; Copyright (C) 2023, 2024 David Thompson <dave@spritely.institute>
  3. ;;;
  4. ;;; Licensed under the Apache License, Version 2.0 (the "License");
  5. ;;; you may not use this file except in compliance with the License.
  6. ;;; You may obtain a copy of the License at
  7. ;;;
  8. ;;; http://www.apache.org/licenses/LICENSE-2.0
  9. ;;;
  10. ;;; Unless required by applicable law or agreed to in writing, software
  11. ;;; distributed under the License is distributed on an "AS IS" BASIS,
  12. ;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. ;;; See the License for the specific language governing permissions and
  14. ;;; limitations under the License.
  15. ;;; Commentary:
  16. ;;;
  17. ;;; Virtual machine tests.
  18. ;;;
  19. ;;; Code:
  20. (use-modules (ice-9 binary-ports)
  21. (ice-9 exceptions)
  22. (ice-9 popen)
  23. (ice-9 textual-ports)
  24. (srfi srfi-64)
  25. (test utils)
  26. (hoot config)
  27. (wasm wat)
  28. (wasm lower)
  29. (wasm assemble)
  30. (wasm vm))
  31. (define s32-overflow (@@ (wasm vm) s32-overflow))
  32. (define s64-overflow (@@ (wasm vm) s64-overflow))
  33. (define (run-d8 read args)
  34. (let* ((port (apply open-pipe* OPEN_READ
  35. %d8 "--experimental-wasm-stringref" args))
  36. (result (string-trim-both (get-string-all port))))
  37. (if (zero? (close-pipe port))
  38. (call-with-input-string result read)
  39. (throw 'd8-error result))))
  40. (define (run-wasm-in-d8 wasm func read args)
  41. (call-with-compiled-wasm-file
  42. wasm
  43. (lambda (wasm-file-name)
  44. (run-d8 read
  45. (cons* (in-vicinity %js-runner-dir "load-primitive.js")
  46. "--" wasm-file-name func
  47. (map (lambda (arg) (format #f "~a" arg)) args))))))
  48. (define (run-wasm-in-vm wasm func args imports)
  49. (let ((instance (instantiate-wasm (validate-wasm wasm) #:imports imports)))
  50. (apply (wasm-instance-export-ref instance func) args)))
  51. (define (wat->wasm* wat)
  52. (lower-wasm (wat->wasm wat) #:stringref-lowering 'stringref))
  53. (define (eval-wat wat func args imports d8? d8-read)
  54. (let* ((wasm (wat->wasm* wat))
  55. (our-result (run-wasm-in-vm wasm func args imports)))
  56. (when d8?
  57. (let ((d8-result (run-wasm-in-d8 wasm func d8-read args)))
  58. (unless (if (and (number? our-result) (number? d8-result))
  59. (= our-result d8-result)
  60. (equal? our-result d8-result))
  61. (error "our result differs from d8" our-result d8-result))))
  62. our-result))
  63. (define* (test-vm name expected wat #:key
  64. (func "main") (args '()) (imports '())
  65. (d8? (use-d8?)) (d8-read read))
  66. (test-equal name
  67. expected
  68. (eval-wat wat func args imports d8? d8-read)))
  69. (define (eval-wat/error wat func args imports d8? d8-read)
  70. (let ((wasm (wat->wasm* wat)))
  71. (define (handle-error e)
  72. (if d8?
  73. (with-exception-handler (lambda (e) #t)
  74. (lambda ()
  75. (let ((result (run-wasm-in-d8 wasm func d8-read args)))
  76. (error "d8 did not throw an error" result))
  77. #f)
  78. #:unwind? #t
  79. #:unwind-for-type 'd8-error)
  80. #t))
  81. (with-exception-handler handle-error
  82. (lambda ()
  83. (run-wasm-in-vm wasm func args imports)
  84. #f)
  85. #:unwind? #t
  86. #:unwind-for-type &wasm-error)))
  87. (define* (test-vm/error name wat #:key
  88. (func "main") (args '()) (imports '())
  89. (d8? #t) (d8-read read))
  90. (test-assert name
  91. (eval-wat/error wat func args imports d8? d8-read)))
  92. ;; For temporarily testing something that doesn't work in our VM yet.
  93. (define (eval-d8 wat func read args)
  94. (run-wasm-in-d8 (wat->wasm* wat) func read args))
  95. (define* (test-d8 name expected wat #:key (func "main") (args '()) (read read))
  96. (test-equal name
  97. expected
  98. (eval-d8 wat func read args)))
  99. (test-begin "test-vm")
  100. (test-vm "i32.eqz true"
  101. 1
  102. '(module
  103. (func (export "main") (result i32)
  104. (i32.eqz (i32.const 0)))))
  105. (test-vm "i32.eqz false"
  106. 0
  107. '(module
  108. (func (export "main") (result i32)
  109. (i32.eqz (i32.const 42)))))
  110. (test-vm "i32.eq true"
  111. 1
  112. '(module
  113. (func (export "main") (result i32)
  114. (i32.eq (i32.const 42) (i32.const 42)))))
  115. (test-vm "i32.eq false"
  116. 0
  117. '(module
  118. (func (export "main") (result i32)
  119. (i32.eq (i32.const 42) (i32.const 7)))))
  120. (test-vm "i32.ne true"
  121. 1
  122. '(module
  123. (func (export "main") (result i32)
  124. (i32.ne (i32.const 42) (i32.const 7)))))
  125. (test-vm "i32.ne false"
  126. 0
  127. '(module
  128. (func (export "main") (result i32)
  129. (i32.ne (i32.const 42) (i32.const 42)))))
  130. (test-vm "i32.lt_s true"
  131. 1
  132. '(module
  133. (func (export "main") (result i32)
  134. (i32.lt_s (i32.const -42) (i32.const 42)))))
  135. (test-vm "i32.lt_s false"
  136. 0
  137. '(module
  138. (func (export "main") (result i32)
  139. (i32.lt_s (i32.const 42) (i32.const -42)))))
  140. (test-vm "i32.lt_u true"
  141. 1
  142. '(module
  143. (func (export "main") (result i32)
  144. (i32.lt_s (i32.const 7) (i32.const 42)))))
  145. (test-vm "i32.lt_u false"
  146. 0
  147. '(module
  148. (func (export "main") (result i32)
  149. (i32.lt_s (i32.const 42) (i32.const 7)))))
  150. (test-vm "i32.le_s true"
  151. 1
  152. '(module
  153. (func (export "main") (result i32)
  154. (i32.le_s (i32.const 42) (i32.const 42)))))
  155. (test-vm "i32.le_s false"
  156. 0
  157. '(module
  158. (func (export "main") (result i32)
  159. (i32.le_s (i32.const 42) (i32.const -42)))))
  160. (test-vm "i32.le_u true"
  161. 1
  162. '(module
  163. (func (export "main") (result i32)
  164. (i32.le_s (i32.const 42) (i32.const 42)))))
  165. (test-vm "i32.le_u false"
  166. 0
  167. '(module
  168. (func (export "main") (result i32)
  169. (i32.le_s (i32.const 42) (i32.const 7)))))
  170. (test-vm "i32.gt_s true"
  171. 1
  172. '(module
  173. (func (export "main") (result i32)
  174. (i32.gt_s (i32.const 42) (i32.const -42)))))
  175. (test-vm "i32.gt_s false"
  176. 0
  177. '(module
  178. (func (export "main") (result i32)
  179. (i32.gt_s (i32.const -42) (i32.const 42)))))
  180. (test-vm "i32.gt_u true"
  181. 1
  182. '(module
  183. (func (export "main") (result i32)
  184. (i32.gt_s (i32.const 42) (i32.const 7)))))
  185. (test-vm "i32.gt_u false"
  186. 0
  187. '(module
  188. (func (export "main") (result i32)
  189. (i32.gt_s (i32.const 7) (i32.const 42)))))
  190. (test-vm "i32.ge_s true"
  191. 1
  192. '(module
  193. (func (export "main") (result i32)
  194. (i32.ge_s (i32.const 42) (i32.const 42)))))
  195. (test-vm "i32.ge_s false"
  196. 0
  197. '(module
  198. (func (export "main") (result i32)
  199. (i32.ge_s (i32.const -42) (i32.const 42)))))
  200. (test-vm "i32.ge_u true"
  201. 1
  202. '(module
  203. (func (export "main") (result i32)
  204. (i32.ge_s (i32.const 42) (i32.const 42)))))
  205. (test-vm "i32.ge_u false"
  206. 0
  207. '(module
  208. (func (export "main") (result i32)
  209. (i32.ge_s (i32.const 7) (i32.const 42)))))
  210. (test-vm "i32.add"
  211. 80
  212. '(module
  213. (func (export "main") (result i32)
  214. (i32.add (i32.const 42) (i32.const 38)))))
  215. (test-vm "i32.sub"
  216. 4
  217. '(module
  218. (func (export "main") (result i32)
  219. (i32.sub (i32.const 42) (i32.const 38)))))
  220. (test-vm "i32.mul"
  221. 42
  222. '(module
  223. (func (export "main") (result i32)
  224. (i32.mul (i32.const 7) (i32.const 6)))))
  225. (test-vm "i32.div_s"
  226. -6
  227. '(module
  228. (func (export "main") (result i32)
  229. (i32.div_s (i32.const -42) (i32.const 7)))))
  230. (test-vm "i32.div_u"
  231. 6
  232. '(module
  233. (func (export "main") (result i32)
  234. (i32.div_u (i32.const 42) (i32.const 7)))))
  235. (test-vm "i32.rem_s"
  236. -2
  237. '(module
  238. (func (export "main") (result i32)
  239. (i32.rem_s (i32.const -42) (i32.const 5)))))
  240. (test-vm "i32.rem_u"
  241. 2
  242. '(module
  243. (func (export "main") (result i32)
  244. (i32.rem_u (i32.const 42) (i32.const 5)))))
  245. (test-vm "i32.and"
  246. #b1010
  247. '(module
  248. (func (export "main") (result i32)
  249. (i32.and (i32.const #b1111) (i32.const #b1010)))))
  250. (test-vm "i32.or"
  251. #b1111
  252. '(module
  253. (func (export "main") (result i32)
  254. (i32.or (i32.const #b0101) (i32.const #b1010)))))
  255. (test-vm "i32.xor"
  256. #b1110
  257. '(module
  258. (func (export "main") (result i32)
  259. (i32.or (i32.const #b1010) (i32.const #b0100)))))
  260. (test-vm "i32.shl"
  261. #b1000
  262. '(module
  263. (func (export "main") (result i32)
  264. (i32.shl (i32.const #b0001) (i32.const 3)))))
  265. (test-vm "i32.shl - out of 32 bit range"
  266. 0
  267. `(module
  268. (func (export "main") (result i32)
  269. (i32.shl (i32.const ,(ash -1 31))
  270. (i32.const 2)))))
  271. (test-vm "i32.shl - more than 32 bits"
  272. #b1000
  273. '(module
  274. (func (export "main") (result i32)
  275. (i32.shl (i32.const #b0001) (i32.const 35)))))
  276. (test-vm "i32.shr_s"
  277. -2
  278. '(module
  279. (func (export "main") (result i32)
  280. (i32.shr_s (i32.const -16) (i32.const 3)))))
  281. (test-vm "i32.shr_u"
  282. #b0001
  283. '(module
  284. (func (export "main") (result i32)
  285. (i32.shr_u (i32.const #b1000) (i32.const 3)))))
  286. (test-vm "i32.shr_u - more than 32 bits"
  287. #b0001
  288. '(module
  289. (func (export "main") (result i32)
  290. (i32.shr_u (i32.const #b1000) (i32.const 35)))))
  291. (test-vm "i32.rotl"
  292. (s32-overflow #b11000011110000111100001111000011)
  293. `(module
  294. (func (export "main") (result i32)
  295. (i32.rotl (i32.const
  296. ,(s32-overflow #b11110000111100001111000011110000))
  297. (i32.const 2)))))
  298. (test-vm "i32.rotr"
  299. (s32-overflow #b00111100001111000011110000111100)
  300. `(module
  301. (func (export "main") (result i32)
  302. (i32.rotr (i32.const
  303. ,(s32-overflow #b11110000111100001111000011110000))
  304. (i32.const 2)))))
  305. (test-vm "i32.clz"
  306. 7
  307. `(module
  308. (func (export "main") (result i32)
  309. (i32.clz (i32.const ,(ash 1 24))))))
  310. (test-vm "i32.ctz"
  311. 24
  312. `(module
  313. (func (export "main") (result i32)
  314. (i32.ctz (i32.const ,(ash 1 24))))))
  315. (test-vm "i32.popcnt"
  316. 16
  317. `(module
  318. (func (export "main") (result i32)
  319. (i32.popcnt (i32.const ,(s32-overflow #xaaaaAAAA))))))
  320. (test-vm "i32.wrap_i64 positive"
  321. 3
  322. `(module
  323. (func (export "main") (result i32)
  324. (i32.wrap_i64 (i64.const ,(+ (ash 1 32) 3))))))
  325. (test-vm "i32.wrap_i64 negative"
  326. -3
  327. `(module
  328. (func (export "main") (result i32)
  329. (i32.wrap_i64 (i64.const ,(- (ash -1 32) 3))))))
  330. (test-vm "i32.trunc_f32_s"
  331. -1
  332. `(module
  333. (func (export "main") (result i32)
  334. (i32.trunc_f32_s (f32.const -1.2)))))
  335. (test-vm "i32.trunc_f32_u"
  336. 1
  337. `(module
  338. (func (export "main") (result i32)
  339. (i32.trunc_f32_u (f32.const 1.2)))))
  340. (test-vm "i32.trunc_f64_s"
  341. -1
  342. `(module
  343. (func (export "main") (result i32)
  344. (i32.trunc_f64_s (f64.const -1.2)))))
  345. (test-vm "i32.trunc_f64_u"
  346. 1
  347. `(module
  348. (func (export "main") (result i32)
  349. (i32.trunc_f64_u (f64.const 1.2)))))
  350. (test-vm "i32.reinterpret_f32"
  351. 1067030938
  352. `(module
  353. (func (export "main") (result i32)
  354. (i32.reinterpret_f32 (f32.const 1.2)))))
  355. (test-vm "i64.eqz true"
  356. 1
  357. '(module
  358. (func (export "main") (result i32)
  359. (i64.eqz (i64.const 0)))))
  360. (test-vm "i64.eqz false"
  361. 0
  362. '(module
  363. (func (export "main") (result i32)
  364. (i64.eqz (i64.const 42)))))
  365. (test-vm "i64.eq true"
  366. 1
  367. '(module
  368. (func (export "main") (result i32)
  369. (i64.eq (i64.const 42) (i64.const 42)))))
  370. (test-vm "i64.eq false"
  371. 0
  372. '(module
  373. (func (export "main") (result i32)
  374. (i64.eq (i64.const 42) (i64.const 7)))))
  375. (test-vm "i64.ne true"
  376. 1
  377. '(module
  378. (func (export "main") (result i32)
  379. (i64.ne (i64.const 42) (i64.const 7)))))
  380. (test-vm "i64.ne false"
  381. 0
  382. '(module
  383. (func (export "main") (result i32)
  384. (i64.ne (i64.const 42) (i64.const 42)))))
  385. (test-vm "i64.lt_s true"
  386. 1
  387. '(module
  388. (func (export "main") (result i32)
  389. (i64.lt_s (i64.const -42) (i64.const 42)))))
  390. (test-vm "i64.lt_s false"
  391. 0
  392. '(module
  393. (func (export "main") (result i32)
  394. (i64.lt_s (i64.const 42) (i64.const -42)))))
  395. (test-vm "i64.lt_u true"
  396. 1
  397. '(module
  398. (func (export "main") (result i32)
  399. (i64.lt_s (i64.const 7) (i64.const 42)))))
  400. (test-vm "i64.lt_u false"
  401. 0
  402. '(module
  403. (func (export "main") (result i32)
  404. (i64.lt_s (i64.const 42) (i64.const 7)))))
  405. (test-vm "i64.le_s true"
  406. 1
  407. '(module
  408. (func (export "main") (result i32)
  409. (i64.le_s (i64.const 42) (i64.const 42)))))
  410. (test-vm "i64.le_s false"
  411. 0
  412. '(module
  413. (func (export "main") (result i32)
  414. (i64.le_s (i64.const 42) (i64.const -42)))))
  415. (test-vm "i64.le_u true"
  416. 1
  417. '(module
  418. (func (export "main") (result i32)
  419. (i64.le_s (i64.const 42) (i64.const 42)))))
  420. (test-vm "i64.le_u false"
  421. 0
  422. '(module
  423. (func (export "main") (result i32)
  424. (i64.le_s (i64.const 42) (i64.const 7)))))
  425. (test-vm "i64.gt_s true"
  426. 1
  427. '(module
  428. (func (export "main") (result i32)
  429. (i64.gt_s (i64.const 42) (i64.const -42)))))
  430. (test-vm "i64.gt_s false"
  431. 0
  432. '(module
  433. (func (export "main") (result i32)
  434. (i64.gt_s (i64.const -42) (i64.const 42)))))
  435. (test-vm "i64.gt_u true"
  436. 1
  437. '(module
  438. (func (export "main") (result i32)
  439. (i64.gt_s (i64.const 42) (i64.const 7)))))
  440. (test-vm "i64.gt_u false"
  441. 0
  442. '(module
  443. (func (export "main") (result i32)
  444. (i64.gt_s (i64.const 7) (i64.const 42)))))
  445. (test-vm "i64.ge_s true"
  446. 1
  447. '(module
  448. (func (export "main") (result i32)
  449. (i64.ge_s (i64.const 42) (i64.const 42)))))
  450. (test-vm "i64.ge_s false"
  451. 0
  452. '(module
  453. (func (export "main") (result i32)
  454. (i64.ge_s (i64.const -42) (i64.const 42)))))
  455. (test-vm "i64.ge_u true"
  456. 1
  457. '(module
  458. (func (export "main") (result i32)
  459. (i64.ge_s (i64.const 42) (i64.const 42)))))
  460. (test-vm "i64.ge_u false"
  461. 0
  462. '(module
  463. (func (export "main") (result i32)
  464. (i64.ge_s (i64.const 7) (i64.const 42)))))
  465. (test-vm "i64.add"
  466. 80
  467. '(module
  468. (func (export "main") (result i64)
  469. (i64.add (i64.const 42) (i64.const 38)))))
  470. (test-vm "i64.sub"
  471. 4
  472. '(module
  473. (func (export "main") (result i64)
  474. (i64.sub (i64.const 42) (i64.const 38)))))
  475. (test-vm "i64.mul"
  476. 42
  477. '(module
  478. (func (export "main") (result i64)
  479. (i64.mul (i64.const 7) (i64.const 6)))))
  480. (test-vm "i64.div_s"
  481. -6
  482. '(module
  483. (func (export "main") (result i64)
  484. (i64.div_s (i64.const -42) (i64.const 7)))))
  485. (test-vm "i64.div_u"
  486. 6
  487. '(module
  488. (func (export "main") (result i64)
  489. (i64.div_u (i64.const 42) (i64.const 7)))))
  490. (test-vm "i64.rem_s"
  491. -2
  492. '(module
  493. (func (export "main") (result i64)
  494. (i64.rem_s (i64.const -42) (i64.const 5)))))
  495. (test-vm "i64.rem_u"
  496. 2
  497. '(module
  498. (func (export "main") (result i64)
  499. (i64.rem_u (i64.const 42) (i64.const 5)))))
  500. (test-vm "i64.and"
  501. #b1010
  502. '(module
  503. (func (export "main") (result i64)
  504. (i64.and (i64.const #b1111) (i64.const #b1010)))))
  505. (test-vm "i64.or"
  506. #b1111
  507. '(module
  508. (func (export "main") (result i64)
  509. (i64.or (i64.const #b0101) (i64.const #b1010)))))
  510. (test-vm "i64.xor"
  511. #b1110
  512. '(module
  513. (func (export "main") (result i64)
  514. (i64.or (i64.const #b1010) (i64.const #b0100)))))
  515. (test-vm "i64.shl"
  516. #b1000
  517. '(module
  518. (func (export "main") (result i64)
  519. (i64.shl (i64.const #b0001) (i64.const 3)))))
  520. (test-vm "i64.shr_s"
  521. -2
  522. '(module
  523. (func (export "main") (result i64)
  524. (i64.shr_s (i64.const -16) (i64.const 3)))))
  525. (test-vm "i64.shr_u"
  526. #b0001
  527. '(module
  528. (func (export "main") (result i64)
  529. (i64.shr_u (i64.const #b1000) (i64.const 3)))))
  530. (test-vm "i64.rotl"
  531. (s64-overflow #xfff0000ffff0000f)
  532. `(module
  533. (func (export "main") (result i64)
  534. (i64.rotl (i64.const
  535. ,(s64-overflow #xffff0000ffff0000))
  536. (i64.const 4)))))
  537. (test-vm "i64.rotr"
  538. (s64-overflow #xffff0000ffff0000)
  539. `(module
  540. (func (export "main") (result i64)
  541. (i64.rotr (i64.const
  542. ,(s64-overflow #xfff0000ffff0000f))
  543. (i64.const 4)))))
  544. (test-vm "i64.clz"
  545. 15
  546. `(module
  547. (func (export "main") (result i64)
  548. (i64.clz (i64.const ,(ash 1 48))))))
  549. (test-vm "i64.ctz"
  550. 48
  551. `(module
  552. (func (export "main") (result i64)
  553. (i64.ctz (i64.const ,(ash 1 48))))))
  554. (test-vm "i64.popcnt"
  555. 32
  556. `(module
  557. (func (export "main") (result i64)
  558. (i64.popcnt (i64.const ,(s64-overflow #xaaaaAAAAaaaaAAAA))))))
  559. (test-vm "i64.extend_i32_s"
  560. -42
  561. `(module
  562. (func (export "main") (result i64)
  563. (i64.extend_i32_s (i32.const -42)))))
  564. (test-vm "i64.extend_i32_u"
  565. 42
  566. `(module
  567. (func (export "main") (result i64)
  568. (i64.extend_i32_u (i32.const 42)))))
  569. (test-vm "i64.trunc_f32_s"
  570. -1
  571. `(module
  572. (func (export "main") (result i64)
  573. (i64.trunc_f32_s (f32.const -1.2)))))
  574. (test-vm "i64.trunc_f32_u"
  575. 1
  576. `(module
  577. (func (export "main") (result i64)
  578. (i64.trunc_f32_u (f32.const 1.2)))))
  579. (test-vm "i64.trunc_f64_s"
  580. -1
  581. `(module
  582. (func (export "main") (result i64)
  583. (i64.trunc_f64_s (f64.const -1.2)))))
  584. (test-vm "i64.trunc_f64_u"
  585. 1
  586. `(module
  587. (func (export "main") (result i64)
  588. (i64.trunc_f64_u (f64.const 1.2)))))
  589. (test-vm "i64.reinterpret_f64"
  590. 4608083138725491507
  591. `(module
  592. (func (export "main") (result i64)
  593. (i64.reinterpret_f64 (f64.const 1.2)))))
  594. (test-vm "f32.eq true"
  595. 1
  596. '(module
  597. (func (export "main") (result i32)
  598. (f32.eq (f32.const 42.0) (f32.const 42.0)))))
  599. (test-vm "f32.eq false"
  600. 0
  601. '(module
  602. (func (export "main") (result i32)
  603. (f32.eq (f32.const 42.0) (f32.const 7.0)))))
  604. (test-vm "f32.ne true"
  605. 1
  606. '(module
  607. (func (export "main") (result i32)
  608. (f32.ne (f32.const 42.0) (f32.const 7.0)))))
  609. (test-vm "f32.ne false"
  610. 0
  611. '(module
  612. (func (export "main") (result i32)
  613. (f32.ne (f32.const 42.0) (f32.const 42.0)))))
  614. (test-vm "f32.lt true"
  615. 1
  616. '(module
  617. (func (export "main") (result i32)
  618. (f32.lt (f32.const -42.0) (f32.const 42.0)))))
  619. (test-vm "f32.lt false"
  620. 0
  621. '(module
  622. (func (export "main") (result i32)
  623. (f32.lt (f32.const 42.0) (f32.const -42.0)))))
  624. (test-vm "f32.le true"
  625. 1
  626. '(module
  627. (func (export "main") (result i32)
  628. (f32.le (f32.const 42.0) (f32.const 42.0)))))
  629. (test-vm "f32.le false"
  630. 0
  631. '(module
  632. (func (export "main") (result i32)
  633. (f32.le (f32.const 42.0) (f32.const -42.0)))))
  634. (test-vm "f32.gt true"
  635. 1
  636. '(module
  637. (func (export "main") (result i32)
  638. (f32.gt (f32.const 42.0) (f32.const -42.0)))))
  639. (test-vm "f32.gt false"
  640. 0
  641. '(module
  642. (func (export "main") (result i32)
  643. (f32.gt (f32.const -42.0) (f32.const 42.0)))))
  644. (test-vm "f32.ge true"
  645. 1
  646. '(module
  647. (func (export "main") (result i32)
  648. (f32.ge (f32.const 42.0) (f32.const 42.0)))))
  649. (test-vm "f32.ge false"
  650. 0
  651. '(module
  652. (func (export "main") (result i32)
  653. (f32.ge (f32.const -42.0) (f32.const 42.0)))))
  654. (test-vm "f32.add"
  655. 3.5
  656. '(module
  657. (func (export "main") (result f32)
  658. (f32.add (f32.const 1.5) (f32.const 2.0)))))
  659. (test-vm "f32.sub"
  660. 2.5
  661. '(module
  662. (func (export "main") (result f32)
  663. (f32.sub (f32.const 3.0) (f32.const 0.5)))))
  664. (test-vm "f32.mul"
  665. 4.5
  666. '(module
  667. (func (export "main") (result f32)
  668. (f32.mul (f32.const 1.5) (f32.const 3.0)))))
  669. (test-vm "f32.div"
  670. 0.5
  671. '(module
  672. (func (export "main") (result f32)
  673. (f32.div (f32.const 1.0) (f32.const 2.0)))))
  674. (test-vm "f32.abs"
  675. 1.5
  676. '(module
  677. (func (export "main") (result f32)
  678. (f32.abs (f32.const -1.5)))))
  679. (test-vm "f32.neg"
  680. -1.5
  681. '(module
  682. (func (export "main") (result f32)
  683. (f32.neg (f32.const 1.5)))))
  684. (test-vm "f32.ceil"
  685. 2.0
  686. '(module
  687. (func (export "main") (result f32)
  688. (f32.ceil (f32.const 1.5)))))
  689. (test-vm "f32.floor"
  690. 1.0
  691. '(module
  692. (func (export "main") (result f32)
  693. (f32.floor (f32.const 1.5)))))
  694. (test-vm "f32.trunc"
  695. 1.0
  696. '(module
  697. (func (export "main") (result f32)
  698. (f32.trunc (f32.const 1.5)))))
  699. (test-vm "f32.nearest"
  700. 1.0
  701. '(module
  702. (func (export "main") (result f32)
  703. (f32.nearest (f32.const 1.4)))))
  704. (test-vm "f32.sqrt"
  705. 2.0
  706. '(module
  707. (func (export "main") (result f32)
  708. (f32.sqrt (f32.const 4.0)))))
  709. (test-vm "f32.min"
  710. 0.5
  711. '(module
  712. (func (export "main") (result f32)
  713. (f32.min (f32.const 0.5) (f32.const 1.5)))))
  714. (test-vm "f32.max"
  715. 1.5
  716. '(module
  717. (func (export "main") (result f32)
  718. (f32.max (f32.const 0.5) (f32.const 1.5)))))
  719. (test-vm "f32.copysign"
  720. -1.5
  721. '(module
  722. (func (export "main") (result f32)
  723. (f32.copysign (f32.const 1.5) (f32.const -2.0)))))
  724. (test-vm "f32.convert_i32_s"
  725. -42.0
  726. '(module
  727. (func (export "main") (result f32)
  728. (f32.convert_i32_s (i32.const -42)))))
  729. (test-vm "f32.convert_i32_u"
  730. 42.0
  731. '(module
  732. (func (export "main") (result f32)
  733. (f32.convert_i32_u (i32.const 42)))))
  734. (test-vm "f32.convert_i64_s"
  735. -42.0
  736. '(module
  737. (func (export "main") (result f32)
  738. (f32.convert_i64_s (i64.const -42)))))
  739. (test-vm "f32.convert_i64_u"
  740. 42.0
  741. '(module
  742. (func (export "main") (result f32)
  743. (f32.convert_i64_u (i64.const 42)))))
  744. (test-vm "f32.demote_f64"
  745. 42.0
  746. '(module
  747. (func (export "main") (result f32)
  748. (f32.demote_f64 (f64.const 42.0)))))
  749. (test-vm "f32.reinterpret_i32"
  750. 1.5
  751. '(module
  752. (func (export "main") (result f32)
  753. (f32.reinterpret_i32 (i32.const 1069547520)))))
  754. (test-vm "f64.eq true"
  755. 1
  756. '(module
  757. (func (export "main") (result i32)
  758. (f64.eq (f64.const 42.0) (f64.const 42.0)))))
  759. (test-vm "f64.eq false"
  760. 0
  761. '(module
  762. (func (export "main") (result i32)
  763. (f64.eq (f64.const 42.0) (f64.const 7.0)))))
  764. (test-vm "f64.ne true"
  765. 1
  766. '(module
  767. (func (export "main") (result i32)
  768. (f64.ne (f64.const 42.0) (f64.const 7.0)))))
  769. (test-vm "f64.ne false"
  770. 0
  771. '(module
  772. (func (export "main") (result i32)
  773. (f64.ne (f64.const 42.0) (f64.const 42.0)))))
  774. (test-vm "f64.lt true"
  775. 1
  776. '(module
  777. (func (export "main") (result i32)
  778. (f64.lt (f64.const -42.0) (f64.const 42.0)))))
  779. (test-vm "f64.lt false"
  780. 0
  781. '(module
  782. (func (export "main") (result i32)
  783. (f64.lt (f64.const 42.0) (f64.const -42.0)))))
  784. (test-vm "f64.le true"
  785. 1
  786. '(module
  787. (func (export "main") (result i32)
  788. (f64.le (f64.const 42.0) (f64.const 42.0)))))
  789. (test-vm "f64.le false"
  790. 0
  791. '(module
  792. (func (export "main") (result i32)
  793. (f64.le (f64.const 42.0) (f64.const -42.0)))))
  794. (test-vm "f64.gt true"
  795. 1
  796. '(module
  797. (func (export "main") (result i32)
  798. (f64.gt (f64.const 42.0) (f64.const -42.0)))))
  799. (test-vm "f64.gt false"
  800. 0
  801. '(module
  802. (func (export "main") (result i32)
  803. (f64.gt (f64.const -42.0) (f64.const 42.0)))))
  804. (test-vm "f64.ge true"
  805. 1
  806. '(module
  807. (func (export "main") (result i32)
  808. (f64.ge (f64.const 42.0) (f64.const 42.0)))))
  809. (test-vm "f64.ge false"
  810. 0
  811. '(module
  812. (func (export "main") (result i32)
  813. (f64.ge (f64.const -42.0) (f64.const 42.0)))))
  814. (test-vm "f64.add"
  815. 3.5
  816. '(module
  817. (func (export "main") (result f64)
  818. (f64.add (f64.const 1.5) (f64.const 2.0)))))
  819. (test-vm "f64.sub"
  820. 2.5
  821. '(module
  822. (func (export "main") (result f64)
  823. (f64.sub (f64.const 3.0) (f64.const 0.5)))))
  824. (test-vm "f64.mul"
  825. 4.5
  826. '(module
  827. (func (export "main") (result f64)
  828. (f64.mul (f64.const 1.5) (f64.const 3.0)))))
  829. (test-vm "f64.div"
  830. 0.5
  831. '(module
  832. (func (export "main") (result f64)
  833. (f64.div (f64.const 1.0) (f64.const 2.0)))))
  834. (test-vm "f64.abs"
  835. 1.5
  836. '(module
  837. (func (export "main") (result f64)
  838. (f64.abs (f64.const -1.5)))))
  839. (test-vm "f64.neg"
  840. -1.5
  841. '(module
  842. (func (export "main") (result f64)
  843. (f64.neg (f64.const 1.5)))))
  844. (test-vm "f64.ceil"
  845. 2.0
  846. '(module
  847. (func (export "main") (result f64)
  848. (f64.ceil (f64.const 1.5)))))
  849. (test-vm "f64.floor"
  850. 1.0
  851. '(module
  852. (func (export "main") (result f64)
  853. (f64.floor (f64.const 1.5)))))
  854. (test-vm "f64.trunc"
  855. 1.0
  856. '(module
  857. (func (export "main") (result f64)
  858. (f64.trunc (f64.const 1.5)))))
  859. (test-vm "f64.nearest"
  860. 1.0
  861. '(module
  862. (func (export "main") (result f64)
  863. (f64.nearest (f64.const 1.4)))))
  864. (test-vm "f64.sqrt"
  865. 2.0
  866. '(module
  867. (func (export "main") (result f64)
  868. (f64.sqrt (f64.const 4.0)))))
  869. (test-vm "f64.min"
  870. 0.5
  871. '(module
  872. (func (export "main") (result f64)
  873. (f64.min (f64.const 0.5) (f64.const 1.5)))))
  874. (test-vm "f64.max"
  875. 1.5
  876. '(module
  877. (func (export "main") (result f64)
  878. (f64.max (f64.const 0.5) (f64.const 1.5)))))
  879. (test-vm "f64.copysign"
  880. -1.5
  881. '(module
  882. (func (export "main") (result f64)
  883. (f64.copysign (f64.const 1.5) (f64.const -2.0)))))
  884. (test-vm "f64.convert_i32_s"
  885. -42.0
  886. '(module
  887. (func (export "main") (result f64)
  888. (f64.convert_i32_s (i32.const -42)))))
  889. (test-vm "f64.convert_i32_u"
  890. 42.0
  891. '(module
  892. (func (export "main") (result f64)
  893. (f64.convert_i32_u (i32.const 42)))))
  894. (test-vm "f64.convert_i64_s"
  895. -42.0
  896. '(module
  897. (func (export "main") (result f64)
  898. (f64.convert_i64_s (i64.const -42)))))
  899. (test-vm "f64.convert_i64_u"
  900. 42.0
  901. '(module
  902. (func (export "main") (result f64)
  903. (f64.convert_i64_u (i64.const 42)))))
  904. (test-vm "f64.promote_f32"
  905. 42.0
  906. '(module
  907. (func (export "main") (result f64)
  908. (f64.promote_f32 (f32.const 42.0)))))
  909. (test-vm "f64.reinterpret_i64"
  910. 1.5
  911. '(module
  912. (func (export "main") (result f64)
  913. (f64.reinterpret_i64 (i64.const 4609434218613702656)))))
  914. (test-vm "i32.store + i32.load"
  915. 42
  916. '(module
  917. (memory 1)
  918. (func (export "main") (result i32)
  919. (i32.store (i32.const 0) (i32.const 42))
  920. (i32.load (i32.const 0)))))
  921. (test-vm "i32.store16 + i32.load16_s"
  922. -42
  923. '(module
  924. (memory $memory 1)
  925. (func (export "main") (result i32)
  926. (i32.store16 (i32.const 0) (i32.const -42))
  927. (i32.load16_s (i32.const 0)))))
  928. (test-vm "i32.store16 + i32.load16_s wrap"
  929. -1
  930. '(module
  931. (memory $memory 1)
  932. (func (export "main") (result i32)
  933. (i32.store16 (i32.const 0) (i32.const -65537))
  934. (i32.load16_s (i32.const 0)))))
  935. (test-vm "i32.store16 + i32.load16_u"
  936. 65535
  937. '(module
  938. (memory $memory 1)
  939. (func (export "main") (result i32)
  940. (i32.store16 (i32.const 0) (i32.const 65535))
  941. (i32.load16_u (i32.const 0)))))
  942. (test-vm "i32.store16 + i32.load16_u wrap"
  943. 65535
  944. '(module
  945. (memory $memory 1)
  946. (func (export "main") (result i32)
  947. (i32.store16 (i32.const 0) (i32.const -65537))
  948. (i32.load16_u (i32.const 0)))))
  949. (test-vm "i32.store8 + i32.load8_s"
  950. -42
  951. '(module
  952. (memory $memory 1)
  953. (func (export "main") (result i32)
  954. (i32.store8 (i32.const 0) (i32.const -42))
  955. (i32.load8_s (i32.const 0)))))
  956. (test-vm "i32.store8 + i32.load8_s wrap"
  957. -1
  958. '(module
  959. (memory $memory 1)
  960. (func (export "main") (result i32)
  961. (i32.store8 (i32.const 0) (i32.const -257))
  962. (i32.load8_s (i32.const 0)))))
  963. (test-vm "i32.store8 + i32.load8_u"
  964. 255
  965. '(module
  966. (memory $memory 1)
  967. (func (export "main") (result i32)
  968. (i32.store8 (i32.const 0) (i32.const 255))
  969. (i32.load8_u (i32.const 0)))))
  970. (test-vm "i32.store8 + i32.load8_u wrap"
  971. 255
  972. '(module
  973. (memory $memory 1)
  974. (func (export "main") (result i32)
  975. (i32.store8 (i32.const 0) (i32.const -257))
  976. (i32.load8_u (i32.const 0)))))
  977. (test-vm "i64.store + i64.load"
  978. 42
  979. '(module
  980. (memory 1)
  981. (func (export "main") (result i64)
  982. (i64.store (i32.const 0) (i64.const 42))
  983. (i64.load (i32.const 0)))))
  984. (test-vm "i64.store32 + i64.load32_s"
  985. -42
  986. '(module
  987. (memory $memory 1)
  988. (func (export "main") (result i64)
  989. (i64.store32 (i32.const 0) (i64.const -42))
  990. (i64.load32_s (i32.const 0)))))
  991. (test-vm "i64.store32 + i64.load32_s wrap"
  992. -1
  993. `(module
  994. (memory $memory 1)
  995. (func (export "main") (result i64)
  996. (i64.store32 (i32.const 0) (i64.const ,(- (ash 1 32) 1)))
  997. (i64.load32_s (i32.const 0)))))
  998. (test-vm "i64.store32 + i64.load32_u"
  999. (- (ash 1 32) 1)
  1000. `(module
  1001. (memory $memory 1)
  1002. (func (export "main") (result i64)
  1003. (i64.store32 (i32.const 0) (i64.const ,(- (ash 1 32) 1)))
  1004. (i64.load32_u (i32.const 0)))))
  1005. (test-vm "i64.store32 + i64.load32_u wrap"
  1006. (- (ash 1 32) 1)
  1007. `(module
  1008. (memory $memory 1)
  1009. (func (export "main") (result i64)
  1010. (i64.store32 (i32.const 0) (i64.const ,(- (ash -1 32) 1)))
  1011. (i64.load32_u (i32.const 0)))))
  1012. (test-vm "i64.store16 + i64.load16_s"
  1013. -42
  1014. '(module
  1015. (memory $memory 1)
  1016. (func (export "main") (result i64)
  1017. (i64.store16 (i32.const 0) (i64.const -42))
  1018. (i64.load16_s (i32.const 0)))))
  1019. (test-vm "i64.store16 + i64.load16_s wrap"
  1020. -1
  1021. '(module
  1022. (memory $memory 1)
  1023. (func (export "main") (result i64)
  1024. (i64.store16 (i32.const 0) (i64.const -65537))
  1025. (i64.load16_s (i32.const 0)))))
  1026. (test-vm "i64.store16 + i64.load16_u"
  1027. 65535
  1028. '(module
  1029. (memory $memory 1)
  1030. (func (export "main") (result i64)
  1031. (i64.store16 (i32.const 0) (i64.const 65535))
  1032. (i64.load16_u (i32.const 0)))))
  1033. (test-vm "i64.store16 + i64.load16_u wrap"
  1034. 65535
  1035. '(module
  1036. (memory $memory 1)
  1037. (func (export "main") (result i64)
  1038. (i64.store16 (i32.const 0) (i64.const -65537))
  1039. (i64.load16_u (i32.const 0)))))
  1040. (test-vm "i64.store8 + i64.load8_s"
  1041. -42
  1042. '(module
  1043. (memory $memory 1)
  1044. (func (export "main") (result i64)
  1045. (i64.store8 (i32.const 0) (i64.const -42))
  1046. (i64.load8_s (i32.const 0)))))
  1047. (test-vm "i64.store8 + i64.load8_s wrap"
  1048. -1
  1049. '(module
  1050. (memory $memory 1)
  1051. (func (export "main") (result i64)
  1052. (i64.store8 (i32.const 0) (i64.const -257))
  1053. (i64.load8_s (i32.const 0)))))
  1054. (test-vm "i64.store8 + i64.load8_u"
  1055. 255
  1056. '(module
  1057. (memory $memory 1)
  1058. (func (export "main") (result i64)
  1059. (i64.store8 (i32.const 0) (i64.const 255))
  1060. (i64.load8_u (i32.const 0)))))
  1061. (test-vm "i64.store8 + i64.load8_u wrap"
  1062. 255
  1063. '(module
  1064. (memory $memory 1)
  1065. (func (export "main") (result i64)
  1066. (i64.store8 (i32.const 0) (i64.const -257))
  1067. (i64.load8_u (i32.const 0)))))
  1068. (test-vm "f32.store + f32.load"
  1069. 1.5
  1070. '(module
  1071. (memory 1)
  1072. (func (export "main") (result f32)
  1073. (f32.store (i32.const 0) (f32.const 1.5))
  1074. (f32.load (i32.const 0)))))
  1075. (test-vm "f64.store + f64.load"
  1076. 1.5
  1077. '(module
  1078. (memory 1)
  1079. (func (export "main") (result f64)
  1080. (f64.store (i32.const 0) (f64.const 1.5))
  1081. (f64.load (i32.const 0)))))
  1082. (test-vm "memory.size"
  1083. 1
  1084. '(module
  1085. (memory 1)
  1086. (func (export "main") (result i32)
  1087. (memory.size))))
  1088. (test-vm "memory.grow within limits"
  1089. 2
  1090. '(module
  1091. (memory 2 3)
  1092. (func (export "main") (result i32)
  1093. (i32.const 1)
  1094. (memory.grow))))
  1095. (test-vm "memory.grow outside limits"
  1096. -1
  1097. '(module
  1098. (memory 1 1)
  1099. (func (export "main") (result i32)
  1100. (i32.const 1)
  1101. (memory.grow))))
  1102. (test-vm "memory.grow no-op"
  1103. 1
  1104. '(module
  1105. (memory 1 1)
  1106. (func (export "main") (result i32)
  1107. (i32.const 0)
  1108. (memory.grow))))
  1109. (test-vm "if"
  1110. 37
  1111. '(module
  1112. (func (export "main") (result i32)
  1113. (if (result i32)
  1114. (i32.eq (i32.const 42) (i32.const 47))
  1115. (then (i32.const 13))
  1116. (else (i32.const 37))))))
  1117. (test-vm "branching in a block"
  1118. 42
  1119. '(module
  1120. (func (export "main") (result i32)
  1121. (block $foo
  1122. (br $foo)
  1123. (unreachable))
  1124. (i32.const 42))))
  1125. (test-vm "return"
  1126. 42
  1127. '(module
  1128. (func (export "main") (result i32)
  1129. (block $foo (result i32)
  1130. (i32.const 42)
  1131. (return)
  1132. (unreachable)))))
  1133. (test-vm "return via br"
  1134. 42
  1135. '(module
  1136. (func (export "main") (result i32)
  1137. (i32.const 42)
  1138. (br 0)
  1139. (unreachable))))
  1140. (test-vm "return_call"
  1141. 42
  1142. '(module
  1143. (func $count (param $i i32) (param $k i32) (result i32)
  1144. (if (result i32)
  1145. (i32.eq (local.get $i) (local.get $k))
  1146. (then (local.get $k))
  1147. (else (return_call $count
  1148. (i32.add (local.get $i) (i32.const 1))
  1149. (local.get $k)))))
  1150. (func $main (export "main") (param $k i32) (result i32)
  1151. (call $count (i32.const 0) (local.get $k))))
  1152. #:args '(42))
  1153. (test-vm "return with extra values on stack"
  1154. 42
  1155. '(module
  1156. (func (export "main") (result i32)
  1157. (block $foo (result i32)
  1158. (i32.const 13)
  1159. (i32.const 42)
  1160. (return)))))
  1161. (test-vm/error "fallthrough with too many values on stack"
  1162. '(module
  1163. (func (export "main") (result i32)
  1164. (i32.const 1)
  1165. (i32.const 2))))
  1166. (test-vm/error "fallthrough with too many values on invalid stack"
  1167. '(module
  1168. (func (export "main") (result i32)
  1169. (i32.const 1)
  1170. (return) ; stack is invalid after this
  1171. (i32.const 2)
  1172. (i32.const 3))))
  1173. (test-vm "branching in a loop"
  1174. 24
  1175. '(module
  1176. ;; Iterative factorial.
  1177. (func (export "main") (param $n i32) (result i32)
  1178. (local $result i32)
  1179. (local.set $result (i32.const 1))
  1180. (loop $loop (result i32)
  1181. (if (result i32)
  1182. (i32.eq (local.get $n) (i32.const 1))
  1183. (then (local.get $result))
  1184. (else (local.set $result (i32.mul (local.get $n)
  1185. (local.get $result)))
  1186. (local.set $n (i32.sub (local.get $n) (i32.const 1)))
  1187. (br $loop))))))
  1188. #:args '(4))
  1189. (test-vm "blocks with params and results"
  1190. 24
  1191. '(module
  1192. (func (export "main") (param $n i32) (result i32)
  1193. (local.get $n)
  1194. (block $block (param i32) (result i32)
  1195. (loop $loop (param i32) (result i32)
  1196. (i32.eq (local.get $n) (i32.const 1))
  1197. (br_if $block)
  1198. (local.tee $n (i32.sub (local.get $n) (i32.const 1)))
  1199. (i32.mul)
  1200. (br $loop)))))
  1201. #:args '(4))
  1202. (test-vm "br_table"
  1203. 42
  1204. '(module
  1205. (func (export "main") (result i32)
  1206. (block $foo (result i32)
  1207. (block $bar (result i32)
  1208. (i32.const 21)
  1209. (i32.const 0)
  1210. (br_table $foo $bar))
  1211. (unreachable))
  1212. (i32.const 21)
  1213. (i32.add))))
  1214. (test-vm "br_table with negative i"
  1215. 42
  1216. '(module
  1217. (func (export "main") (result i32)
  1218. (block $foo (result i32)
  1219. (block $bar (result i32)
  1220. (i32.const 21)
  1221. (i32.const -1)
  1222. (br_table $bar $foo))
  1223. (unreachable))
  1224. (i32.const 21)
  1225. (i32.add))))
  1226. (test-vm "inner function call"
  1227. 11
  1228. '(module
  1229. (func $y (param $m i32) (param $x i32) (param $b i32) (result i32)
  1230. (i32.add (i32.mul (local.get $m) (local.get $x)) (local.get $b)))
  1231. (func (export "main") (param $x i32) (result i32)
  1232. (call $y (i32.const 2) (local.get $x) (i32.const 3))))
  1233. #:args '(4))
  1234. (test-vm "imported function call"
  1235. 80
  1236. '(module
  1237. (func $add42 (import "lib" "add42")
  1238. (param i32) (result i32))
  1239. (func (export "main") (param $x i32) (result i32)
  1240. (call $add42 (local.get $x))))
  1241. #:imports `(("lib" . (("add42" . ,(lambda (x) (+ x 42))))))
  1242. #:args '(38)
  1243. #:d8? #f)
  1244. (test-vm "mutable globals"
  1245. 42
  1246. '(module
  1247. (global $foo (mut i32) (i32.const 30))
  1248. (func (export "main") (param $n i32) (result i32)
  1249. (global.set $foo (i32.add (local.get $n) (global.get $foo)))
  1250. (global.get $foo)))
  1251. #:args '(12))
  1252. (test-vm "imported globals"
  1253. 80
  1254. '(module
  1255. (global $foo i32 (i32.const 42))
  1256. (global $bar (import "globals" "bar") i32)
  1257. (func (export "main") (result i32)
  1258. (i32.add (global.get $foo) (global.get $bar))))
  1259. #:imports `(("globals" . (("bar" . ,(make-wasm-global 38 #f)))))
  1260. #:d8? #f)
  1261. (test-vm "immutable global reference in constant expression"
  1262. 42
  1263. '(module
  1264. (global $foo i32 (i32.const 42))
  1265. (global $bar i32 (global.get $foo))
  1266. (func (export "main") (result i32)
  1267. (global.get $bar))))
  1268. (test-vm/error "reference to mutable global in constant expression"
  1269. '(module
  1270. (global $foo (mut i32) (i32.const 42))
  1271. (global $bar i32 (global.get $foo))
  1272. (func (export "main") (result i32)
  1273. (global.get $bar))))
  1274. (test-vm/error "reference to subsequent global in constant expression"
  1275. '(module
  1276. (global $bar i32 (global.get $foo))
  1277. (global $foo i32 (i32.const 42))
  1278. (func (export "main") (result i32)
  1279. (global.get $bar))))
  1280. (test-vm "drop"
  1281. 42
  1282. '(module
  1283. (func (export "main") (result i32)
  1284. (i32.const 42)
  1285. (i32.const 13)
  1286. (drop))))
  1287. (test-vm "drop in unreachable code"
  1288. 42
  1289. '(module
  1290. (func (export "main") (result i32)
  1291. (i32.const 42)
  1292. (return)
  1293. (drop))))
  1294. (test-vm "select first"
  1295. 42
  1296. '(module
  1297. (func (export "main") (result i32)
  1298. (i32.const 42)
  1299. (i32.const 13)
  1300. (i32.const 1)
  1301. (select))))
  1302. (test-vm "select second"
  1303. 13
  1304. '(module
  1305. (func (export "main") (result i32)
  1306. (i32.const 42)
  1307. (i32.const 13)
  1308. (i32.const 0)
  1309. (select))))
  1310. (test-vm "select in unreachable code"
  1311. 42
  1312. '(module
  1313. (func (export "main") (result i32)
  1314. (i32.const 42)
  1315. (return)
  1316. (select))))
  1317. (test-vm "select in unreachable code with i32 on top"
  1318. 42
  1319. '(module
  1320. (func (export "main") (result i32)
  1321. (i32.const 42)
  1322. (return)
  1323. (i32.const 0)
  1324. (select))))
  1325. (test-vm "start function"
  1326. 42
  1327. '(module
  1328. (global $foo (mut i32) (i32.const 13))
  1329. (func $init
  1330. (global.set $foo (i32.const 42)))
  1331. (start $init)
  1332. (func (export "main") (result i32)
  1333. (global.get $foo))))
  1334. (test-vm "table.size"
  1335. 2
  1336. '(module
  1337. (table $funcs 2 funcref)
  1338. (func (export "main") (result i32)
  1339. (table.size $funcs))))
  1340. (test-vm "table.grow within limits"
  1341. 2
  1342. '(module
  1343. (table $funcs 2 3 funcref)
  1344. (func $main (export "main") (result i32)
  1345. (ref.func $main)
  1346. (i32.const 1)
  1347. (table.grow $funcs))))
  1348. (test-vm "table.grow outside limits"
  1349. -1
  1350. '(module
  1351. (table $funcs 1 1 funcref)
  1352. (func $main (export "main") (result i32)
  1353. (ref.func $main)
  1354. (i32.const 1)
  1355. (table.grow $funcs))))
  1356. (test-vm "table.grow no-op"
  1357. 1
  1358. '(module
  1359. (table $funcs 1 1 funcref)
  1360. (func $main (export "main") (result i32)
  1361. (ref.func $main)
  1362. (i32.const 0)
  1363. (table.grow $funcs))))
  1364. (test-vm "table.init with passive element segment"
  1365. 1
  1366. '(module
  1367. (table $a 1 funcref)
  1368. (elem $funcs funcref (ref.null func))
  1369. (func $main (export "main") (result i32)
  1370. (table.init $a $funcs
  1371. (i32.const 0)
  1372. (i32.const 0)
  1373. (i32.const 1))
  1374. (ref.is_null (table.get $a (i32.const 0))))))
  1375. (test-vm "table.fill"
  1376. 1
  1377. '(module
  1378. (table $funcs 3 funcref)
  1379. (elem $funcs (i32.const 0) $main)
  1380. (func $main (export "main") (result i32)
  1381. (i32.const 1)
  1382. (ref.func $main)
  1383. (i32.const 2)
  1384. (table.fill $funcs)
  1385. (i32.const 1))))
  1386. (test-vm "table.copy"
  1387. 1
  1388. '(module
  1389. (table $a 3 funcref)
  1390. (table $b 3 funcref)
  1391. (elem $funcs (i32.const 0) $main $main $main)
  1392. (func $main (export "main") (result i32)
  1393. (i32.const 3)
  1394. (i32.const 0)
  1395. (i32.const 0)
  1396. (table.copy $b $a)
  1397. (i32.const 1))))
  1398. (test-vm "elem.drop"
  1399. 1
  1400. '(module
  1401. (table $funcs 1 funcref)
  1402. (elem $foo (i32.const 0) $main)
  1403. (func $main (export "main") (result i32)
  1404. (elem.drop $foo)
  1405. (i32.const 1))))
  1406. (test-vm "call_indirect"
  1407. 42
  1408. '(module
  1409. (table $funcs 1 funcref)
  1410. (type $i32->i32 (func (param i32) (result i32)))
  1411. (func $inc (param $a i32) (result i32)
  1412. (i32.add (local.get $a) (i32.const 1)))
  1413. (elem $funcs (i32.const 0) $inc)
  1414. (func (export "main") (result i32)
  1415. (call_indirect $funcs (type $i32->i32)
  1416. (i32.const 41) (i32.const 0)))))
  1417. (test-vm "call_ref"
  1418. 42
  1419. '(module
  1420. (type $i32->i32 (func (param i32) (result i32)))
  1421. (func $sum-41 (param $x i32) (result i32)
  1422. (i32.add (local.get $x) (i32.const 41)))
  1423. (func (export "main") (result i32)
  1424. (call_ref $i32->i32 (i32.const 1) (ref.func $sum-41)))))
  1425. (test-vm "ref.null + ref.is_null"
  1426. 1
  1427. '(module
  1428. (func (export "main") (result i32)
  1429. (ref.null func)
  1430. (ref.is_null))))
  1431. (test-vm "ref.test true"
  1432. 1
  1433. '(module
  1434. (type $foo (struct (field $bar (ref eq))))
  1435. (func (export "main") (result i32)
  1436. (ref.test $foo (struct.new $foo (ref.i31 (i32.const 42)))))))
  1437. (test-vm "ref.test false"
  1438. 0
  1439. '(module
  1440. (type $foo (struct (field $bar (ref eq))))
  1441. (func (export "main") (result i32)
  1442. (ref.test $foo (ref.null $foo)))))
  1443. (test-vm "ref.as_non_null"
  1444. 42
  1445. '(module
  1446. (type $foo (struct (field $bar i32)))
  1447. (func (export "main") (result i32)
  1448. (struct.get $foo $bar
  1449. (ref.as_non_null
  1450. (struct.new $foo (i32.const 42)))))))
  1451. (test-vm "ref.cast identity non-null"
  1452. 42
  1453. '(module
  1454. (func (export "main") (result i32)
  1455. (ref.i31 (i32.const 42))
  1456. (ref.cast i31)
  1457. (i31.get_s))))
  1458. (test-vm "ref.cast identity null"
  1459. 42
  1460. '(module
  1461. (func (export "main") (result i32)
  1462. (ref.null i31)
  1463. (ref.cast null i31)
  1464. (drop)
  1465. (i32.const 42))))
  1466. (test-vm/error "ref.cast null"
  1467. '(module
  1468. (func (export "main") (result i32)
  1469. (ref.null i31)
  1470. (ref.cast i31)
  1471. (i31.get_s))))
  1472. (test-vm "external reference passthrough"
  1473. '(opaque to wasm)
  1474. '(module
  1475. (func (export "main") (param $foo externref) (result externref)
  1476. (local.get $foo)))
  1477. #:args '((opaque to wasm))
  1478. #:d8? #f)
  1479. (test-vm "i31.get_s"
  1480. -42
  1481. '(module
  1482. (func (export "main") (result i32)
  1483. (i31.get_s (ref.i31 (i32.const -42))))))
  1484. (test-vm "i31.get_u"
  1485. 2147483606
  1486. '(module
  1487. (func (export "main") (result i32)
  1488. (i31.get_u (ref.i31 (i32.const -42))))))
  1489. (test-vm "struct.get"
  1490. 5.0
  1491. '(module
  1492. (type $vec2 (struct (field $x f32) (field $y f32)))
  1493. (func (export "main") (result f32) (local $v (ref $vec2))
  1494. (local.set $v (struct.new $vec2 (f32.const 3.0) (f32.const 4.0)))
  1495. ;; Calculate vector magnitude, for fun.
  1496. (f32.sqrt
  1497. (f32.add (f32.mul (struct.get $vec2 $x (local.get $v))
  1498. (struct.get $vec2 $x (local.get $v)))
  1499. (f32.mul (struct.get $vec2 $y (local.get $v))
  1500. (struct.get $vec2 $y (local.get $v))))))))
  1501. (test-vm "struct.get_s"
  1502. -42
  1503. '(module
  1504. (type $foo (struct (field $bar i8)))
  1505. (func (export "main") (result i32)
  1506. (struct.get_s $foo $bar (struct.new $foo (i32.const -42))))))
  1507. (test-vm "struct.get_u"
  1508. 214
  1509. '(module
  1510. (type $foo (struct (field $bar i8)))
  1511. (func (export "main") (result i32)
  1512. (struct.get_u $foo $bar (struct.new $foo (i32.const -42))))))
  1513. (test-vm "struct.set"
  1514. 42
  1515. '(module
  1516. (type $foo (struct (field $bar (mut i32))))
  1517. (func (export "main") (result i32) (local $a (ref $foo))
  1518. (local.set $a (struct.new $foo (i32.const 0)))
  1519. (struct.set $foo $bar (local.get $a) (i32.const 42))
  1520. (struct.get $foo $bar (local.get $a)))))
  1521. (test-vm "struct subtyping"
  1522. 42
  1523. '(module
  1524. (type $heap-object
  1525. (sub
  1526. (struct
  1527. (field $hash (mut i32)))))
  1528. (type $pair
  1529. (sub $heap-object
  1530. (struct
  1531. (field $hash (mut i32))
  1532. (field $car (mut (ref eq)))
  1533. (field $cdr (mut (ref eq))))))
  1534. (func (export "main") (result i32) (local $a (ref $pair))
  1535. (local.set $a (struct.new $pair (i32.const 1)
  1536. (ref.i31 (i32.const 21))
  1537. (ref.i31 (i32.const 21))))
  1538. (i32.add (i31.get_s (ref.cast i31 (struct.get $pair $car (local.get $a))))
  1539. (i31.get_s (ref.cast i31 (struct.get $pair $cdr (local.get $a))))))))
  1540. (test-vm "struct.new_default"
  1541. 0
  1542. '(module
  1543. (type $foo (struct (field $bar i32)))
  1544. (func (export "main") (result i32)
  1545. (struct.get $foo $bar (struct.new_default $foo)))))
  1546. (test-vm "array.len"
  1547. 3
  1548. '(module
  1549. (type $foo (array i32))
  1550. (func (export "main") (result i32)
  1551. (array.len (array.new $foo (i32.const 0) (i32.const 3))))))
  1552. (test-vm "array.get"
  1553. 42
  1554. '(module
  1555. (type $foo (array i32))
  1556. (func (export "main") (result i32)
  1557. (array.get $foo (array.new $foo (i32.const 42) (i32.const 1)) (i32.const 0)))))
  1558. (test-vm "array.get_s"
  1559. -42
  1560. '(module
  1561. (type $foo (array i8))
  1562. (func (export "main") (result i32)
  1563. (array.get_s $foo (array.new_fixed $foo 1 (i32.const -42)) (i32.const 0)))))
  1564. (test-vm "array.get_u"
  1565. 214
  1566. '(module
  1567. (type $foo (array i8))
  1568. (func (export "main") (result i32)
  1569. (array.get_u $foo (array.new_fixed $foo 1 (i32.const -42)) (i32.const 0)))))
  1570. (test-vm "array.set"
  1571. 42
  1572. '(module
  1573. (type $foo (array (mut i32)))
  1574. (func (export "main") (result i32) (local $a (ref $foo))
  1575. (local.set $a (array.new $foo (i32.const 0) (i32.const 1)))
  1576. (array.set $foo (local.get $a) (i32.const 0) (i32.const 42))
  1577. (array.get $foo (local.get $a) (i32.const 0)))))
  1578. (test-vm "array.new_fixed"
  1579. 42
  1580. '(module
  1581. (type $foo (array i32))
  1582. (func (export "main") (result i32)
  1583. (array.get $foo (array.new_fixed $foo 1 (i32.const 42)) (i32.const 0)))))
  1584. (test-vm "array.new_default"
  1585. 0
  1586. '(module
  1587. (type $foo (array i32))
  1588. (func (export "main") (result i32)
  1589. (array.get $foo (array.new_default $foo (i32.const 1)) (i32.const 0)))))
  1590. (test-vm "array.new_data"
  1591. 4
  1592. '(module
  1593. (type $foo (array i32))
  1594. (data $init #s32(1 2 3 4))
  1595. (func (export "main") (result i32)
  1596. (array.get $foo (array.new_data $foo $init
  1597. (i32.const 0)
  1598. (i32.const 4))
  1599. (i32.const 3)))))
  1600. (test-vm "array.new_elem"
  1601. 4
  1602. '(module
  1603. (type $foo (array (ref i31)))
  1604. (elem $init (ref i31)
  1605. (item (ref.i31 (i32.const 1)))
  1606. (item (ref.i31 (i32.const 2)))
  1607. (item (ref.i31 (i32.const 3)))
  1608. (item (ref.i31 (i32.const 4))))
  1609. (func (export "main") (result i32)
  1610. (i31.get_s
  1611. (array.get $foo (array.new_elem $foo $init
  1612. (i32.const 0)
  1613. (i32.const 4))
  1614. (i32.const 3))))))
  1615. (test-vm "array.init_data"
  1616. 4
  1617. '(module
  1618. (type $foo (array (mut i32)))
  1619. (data $init #s32(1 2 3 4))
  1620. (func (export "main") (result i32)
  1621. (local $a (ref $foo))
  1622. (local.set $a (array.new $foo
  1623. (i32.const 0)
  1624. (i32.const 4)))
  1625. (array.init_data $foo $init
  1626. (local.get $a)
  1627. (i32.const 0)
  1628. (i32.const 0)
  1629. (i32.const 4))
  1630. (array.get $foo (local.get $a) (i32.const 3)))))
  1631. (test-vm "array.init_elem"
  1632. 4
  1633. '(module
  1634. (type $foo (array (mut (ref i31))))
  1635. (elem $init (ref i31)
  1636. (item (ref.i31 (i32.const 1)))
  1637. (item (ref.i31 (i32.const 2)))
  1638. (item (ref.i31 (i32.const 3)))
  1639. (item (ref.i31 (i32.const 4))))
  1640. (func (export "main") (result i32)
  1641. (local $a (ref $foo))
  1642. (local.set $a (array.new $foo
  1643. (ref.i31 (i32.const 0))
  1644. (i32.const 4)))
  1645. (array.init_elem $foo $init
  1646. (local.get $a)
  1647. (i32.const 0)
  1648. (i32.const 0)
  1649. (i32.const 4))
  1650. (i31.get_s
  1651. (array.get $foo (local.get $a) (i32.const 3))))))
  1652. (test-vm "array.fill"
  1653. 42
  1654. '(module
  1655. (type $foo (array (mut i32)))
  1656. (func (export "main") (result i32) (local $a (ref $foo))
  1657. (local.set $a (array.new_default $foo (i32.const 1)))
  1658. (array.fill $foo
  1659. (local.get $a)
  1660. (i32.const 0)
  1661. (i32.const 42)
  1662. (i32.const 1))
  1663. (array.get $foo (local.get $a) (i32.const 0)))))
  1664. (test-vm "array.copy"
  1665. 42
  1666. '(module
  1667. (type $foo (array (mut i32)))
  1668. (func (export "main") (result i32) (local $a (ref $foo))
  1669. (local.set $a (array.new_default $foo (i32.const 1)))
  1670. (array.copy $foo $foo
  1671. (local.get $a)
  1672. (i32.const 0)
  1673. (array.new_fixed $foo 1 (i32.const 42))
  1674. (i32.const 0)
  1675. (i32.const 1))
  1676. (array.get $foo (local.get $a) (i32.const 0)))))
  1677. (test-vm "reference type constants"
  1678. 42
  1679. '(module
  1680. (type $foo (array (ref i31)))
  1681. (global $bar (ref $foo)
  1682. (array.new $foo
  1683. (ref.i31 (i32.const 42))
  1684. (i32.const 1)))
  1685. (func (export "main") (result i32)
  1686. (i31.get_s
  1687. (array.get $foo
  1688. (global.get $bar)
  1689. (i32.const 0))))))
  1690. (test-vm "string.const"
  1691. "Hello, world!"
  1692. '(module
  1693. (func (export "main") (result (ref string))
  1694. (string.const "Hello, world!")))
  1695. #:d8-read get-line)
  1696. (test-vm "string.new_lossy_utf8_array"
  1697. "HELLO"
  1698. '(module
  1699. (type $utf8 (array (mut i8)))
  1700. (func (export "main") (result (ref string))
  1701. (string.new_lossy_utf8_array (array.new_fixed $utf8 5
  1702. (i32.const 72)
  1703. (i32.const 69)
  1704. (i32.const 76)
  1705. (i32.const 76)
  1706. (i32.const 79))
  1707. (i32.const 0)
  1708. (i32.const 5))))
  1709. #:d8-read get-line)
  1710. (test-vm "string.encode_wtf8_array"
  1711. 5
  1712. '(module
  1713. (type $utf8 (array (mut i8)))
  1714. (func (export "main") (result i32)
  1715. (string.encode_wtf8_array (string.const "HELLO")
  1716. (array.new $utf8
  1717. (i32.const 0)
  1718. (i32.const 5))
  1719. (i32.const 0)))))
  1720. (test-vm "string.measure_utf8"
  1721. 5
  1722. '(module
  1723. (func (export "main") (result i32)
  1724. (string.measure_utf8 (string.const "HELLO")))))
  1725. (test-vm "string.measure_wtf8"
  1726. 5
  1727. '(module
  1728. (func (export "main") (result i32)
  1729. (string.measure_wtf8 (string.const "HELLO")))))
  1730. (test-equal "inter-instance function calls"
  1731. 17
  1732. (let* ((wat-a '(module
  1733. (func (export "square") (param $x i32) (result i32)
  1734. (i32.mul (local.get $x) (local.get $x)))))
  1735. (wat-b '(module
  1736. (func $square (import "wasm" "square") (param i32) (result i32))
  1737. (func (export "main") (param $x i32) (result i32)
  1738. (i32.add (call $square (local.get $x)) (i32.const 1)))))
  1739. (wasm-a (wat->wasm* wat-a))
  1740. (wasm-b (wat->wasm* wat-b))
  1741. (inst-a (instantiate-wasm (validate-wasm wasm-a)))
  1742. (square (wasm-instance-export-ref inst-a "square"))
  1743. (inst-b (instantiate-wasm (validate-wasm wasm-b)
  1744. #:imports `(("wasm" .
  1745. (("square" . ,square)))))))
  1746. ((wasm-instance-export-ref inst-b "main") 4)))
  1747. (test-vm "try"
  1748. 111
  1749. '(module
  1750. (tag $foo (param i32))
  1751. (func (export "main") (result i32)
  1752. (try (result i32)
  1753. (do (i32.const 42)
  1754. (throw $foo))
  1755. (catch $foo
  1756. (i32.const 69)
  1757. (i32.add))
  1758. (catch_all
  1759. (unreachable))))))
  1760. (test-vm "try_delegate"
  1761. 111
  1762. '(module
  1763. (tag $foo (param i32))
  1764. (func (export "main") (result i32)
  1765. (try $bloop (result i32)
  1766. (do (try
  1767. (do (i32.const 69)
  1768. (throw $foo))
  1769. (delegate $bloop))
  1770. (unreachable))
  1771. (catch $foo
  1772. (i32.const 42)
  1773. (i32.add))
  1774. (catch_all (i32.const 77))))))
  1775. (test-vm "rethrow"
  1776. 42
  1777. '(module
  1778. (tag $foo)
  1779. (func (export "main") (result i32)
  1780. (try $l1 (result i32)
  1781. (do (try $l2 (result i32)
  1782. (do (throw $foo))
  1783. (catch $foo
  1784. (rethrow $l2))
  1785. (catch_all (unreachable))))
  1786. (catch $foo
  1787. (i32.const 42))
  1788. (catch_all (unreachable))))))
  1789. (test-equal "throw across instances"
  1790. 111
  1791. (let* ((wat-a '(module
  1792. (tag $err (export "err") (param i32))
  1793. (func (export "foo") (param $x i32)
  1794. (throw $err (local.get $x)))))
  1795. (wat-b '(module
  1796. (tag $err (import "other" "err") (param i32))
  1797. (func $foo (import "other" "foo") (param i32))
  1798. (func (export "main") (param $x i32) (result i32)
  1799. (try (result i32)
  1800. (do (call $foo (local.get $x))
  1801. (unreachable))
  1802. (catch $err
  1803. (i32.const 69)
  1804. (i32.add))
  1805. (catch_all (unreachable))))))
  1806. (wasm-a (wat->wasm* wat-a))
  1807. (wasm-b (wat->wasm* wat-b))
  1808. (inst-a (instantiate-wasm (validate-wasm wasm-a)))
  1809. (err (wasm-instance-export-ref inst-a "err"))
  1810. (foo (wasm-instance-export-ref inst-a "foo"))
  1811. (inst-b (instantiate-wasm (validate-wasm wasm-b)
  1812. #:imports `(("other" .
  1813. (("err" . ,err)
  1814. ("foo" . ,foo)))))))
  1815. ((wasm-instance-export-ref inst-b "main") 42)))
  1816. (test-end* "test-vm")