cranelift.rs 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098
  1. // SPDX-License-Identifier: (Apache-2.0 OR MIT)
  2. #![cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))]
  3. #![cfg(feature = "cranelift")]
  4. extern crate rbpf;
  5. mod common;
  6. use rbpf::{assembler::assemble, helpers};
  7. use crate::common::{TCP_SACK_ASM, TCP_SACK_MATCH, TCP_SACK_NOMATCH};
  8. macro_rules! test_cranelift {
  9. ($name:ident, $prog:expr, $expected:expr) => {
  10. #[test]
  11. fn $name() {
  12. let prog = assemble($prog).unwrap();
  13. let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  14. assert_eq!(vm.execute_cranelift().unwrap(), $expected);
  15. }
  16. };
  17. ($name:ident, $prog:expr, $mem:expr, $expected:expr) => {
  18. #[test]
  19. fn $name() {
  20. let prog = assemble($prog).unwrap();
  21. let mem = &mut $mem;
  22. let vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  23. assert_eq!(vm.execute_cranelift(mem).unwrap(), $expected);
  24. }
  25. };
  26. }
  27. test_cranelift!(
  28. test_cranelift_add,
  29. "
  30. mov32 r0, 0
  31. mov32 r1, 2
  32. add32 r0, 1
  33. add32 r0, r1
  34. exit
  35. ",
  36. 0x3
  37. );
  38. test_cranelift!(
  39. test_cranelift_alu64_arith,
  40. "
  41. mov r0, 0
  42. mov r1, 1
  43. mov r2, 2
  44. mov r3, 3
  45. mov r4, 4
  46. mov r5, 5
  47. mov r6, 6
  48. mov r7, 7
  49. mov r8, 8
  50. mov r9, 9
  51. add r0, 23
  52. add r0, r7
  53. sub r0, 13
  54. sub r0, r1
  55. mul r0, 7
  56. mul r0, r3
  57. div r0, 2
  58. div r0, r4
  59. exit
  60. ",
  61. 0x2a
  62. );
  63. test_cranelift!(
  64. test_cranelift_alu64_bit,
  65. "
  66. mov r0, 0
  67. mov r1, 1
  68. mov r2, 2
  69. mov r3, 3
  70. mov r4, 4
  71. mov r5, 5
  72. mov r6, 6
  73. mov r7, 7
  74. mov r8, 8
  75. or r0, r5
  76. or r0, 0xa0
  77. and r0, 0xa3
  78. mov r9, 0x91
  79. and r0, r9
  80. lsh r0, 32
  81. lsh r0, 22
  82. lsh r0, r8
  83. rsh r0, 32
  84. rsh r0, 19
  85. rsh r0, r7
  86. xor r0, 0x03
  87. xor r0, r2
  88. exit
  89. ",
  90. 0x11
  91. );
  92. test_cranelift!(
  93. test_cranelift_alu_arith,
  94. "
  95. mov32 r0, 0
  96. mov32 r1, 1
  97. mov32 r2, 2
  98. mov32 r3, 3
  99. mov32 r4, 4
  100. mov32 r5, 5
  101. mov32 r6, 6
  102. mov32 r7, 7
  103. mov32 r8, 8
  104. mov32 r9, 9
  105. add32 r0, 23
  106. add32 r0, r7
  107. sub32 r0, 13
  108. sub32 r0, r1
  109. mul32 r0, 7
  110. mul32 r0, r3
  111. div32 r0, 2
  112. div32 r0, r4
  113. exit
  114. ",
  115. 0x2a
  116. );
  117. test_cranelift!(
  118. test_cranelift_alu_bit,
  119. "
  120. mov32 r0, 0
  121. mov32 r1, 1
  122. mov32 r2, 2
  123. mov32 r3, 3
  124. mov32 r4, 4
  125. mov32 r5, 5
  126. mov32 r6, 6
  127. mov32 r7, 7
  128. mov32 r8, 8
  129. or32 r0, r5
  130. or32 r0, 0xa0
  131. and32 r0, 0xa3
  132. mov32 r9, 0x91
  133. and32 r0, r9
  134. lsh32 r0, 22
  135. lsh32 r0, r8
  136. rsh32 r0, 19
  137. rsh32 r0, r7
  138. xor32 r0, 0x03
  139. xor32 r0, r2
  140. exit
  141. ",
  142. 0x11
  143. );
  144. test_cranelift!(
  145. test_cranelift_arsh32_high_shift,
  146. "
  147. mov r0, 8
  148. lddw r1, 0x100000001
  149. arsh32 r0, r1
  150. exit
  151. ",
  152. 0x4
  153. );
  154. test_cranelift!(
  155. test_cranelift_arsh,
  156. "
  157. mov32 r0, 0xf8
  158. lsh32 r0, 28
  159. arsh32 r0, 16
  160. exit
  161. ",
  162. 0xffff8000
  163. );
  164. test_cranelift!(
  165. test_cranelift_arsh64,
  166. "
  167. mov32 r0, 1
  168. lsh r0, 63
  169. arsh r0, 55
  170. mov32 r1, 5
  171. arsh r0, r1
  172. exit
  173. ",
  174. 0xfffffffffffffff8
  175. );
  176. test_cranelift!(
  177. test_cranelift_arsh_reg,
  178. "
  179. mov32 r0, 0xf8
  180. mov32 r1, 16
  181. lsh32 r0, 28
  182. arsh32 r0, r1
  183. exit
  184. ",
  185. 0xffff8000
  186. );
  187. test_cranelift!(
  188. test_cranelift_be16,
  189. "
  190. ldxh r0, [r1]
  191. be16 r0
  192. exit
  193. ",
  194. [0x11, 0x22],
  195. 0x1122
  196. );
  197. test_cranelift!(
  198. test_cranelift_be16_high,
  199. "
  200. ldxdw r0, [r1]
  201. be16 r0
  202. exit
  203. ",
  204. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  205. 0x1122
  206. );
  207. test_cranelift!(
  208. test_cranelift_be32,
  209. "
  210. ldxw r0, [r1]
  211. be32 r0
  212. exit
  213. ",
  214. [0x11, 0x22, 0x33, 0x44],
  215. 0x11223344
  216. );
  217. test_cranelift!(
  218. test_cranelift_be32_high,
  219. "
  220. ldxdw r0, [r1]
  221. be32 r0
  222. exit
  223. ",
  224. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  225. 0x11223344
  226. );
  227. test_cranelift!(
  228. test_cranelift_be64,
  229. "
  230. ldxdw r0, [r1]
  231. be64 r0
  232. exit
  233. ",
  234. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  235. 0x1122334455667788
  236. );
  237. #[test]
  238. fn test_cranelift_call() {
  239. let prog = assemble(
  240. "
  241. mov r1, 1
  242. mov r2, 2
  243. mov r3, 3
  244. mov r4, 4
  245. mov r5, 5
  246. call 0
  247. exit",
  248. )
  249. .unwrap();
  250. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  251. vm.register_helper(0, helpers::gather_bytes).unwrap();
  252. assert_eq!(vm.execute_cranelift().unwrap(), 0x0102030405);
  253. }
  254. #[test]
  255. #[should_panic(expected = "[CRANELIFT] Error: unknown helper function (id: 0x3f)")]
  256. fn test_cranelift_err_call_unreg() {
  257. let prog = assemble("
  258. mov r1, 1
  259. mov r2, 2
  260. mov r3, 3
  261. mov r4, 4
  262. mov r5, 5
  263. call 63
  264. exit
  265. ").unwrap();
  266. let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  267. vm.execute_cranelift().unwrap();
  268. }
  269. #[test]
  270. fn test_cranelift_call_memfrob() {
  271. let prog = assemble(
  272. "
  273. mov r6, r1
  274. add r1, 2
  275. mov r2, 4
  276. call 1
  277. ldxdw r0, [r6]
  278. be64 r0
  279. exit",
  280. )
  281. .unwrap();
  282. let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  283. vm.register_helper(1, helpers::memfrob).unwrap();
  284. let mem = &mut [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08];
  285. assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x102292e2f2c0708);
  286. }
  287. test_cranelift!(
  288. test_cranelift_div32_high_divisor,
  289. "
  290. mov r0, 12
  291. lddw r1, 0x100000004
  292. div32 r0, r1
  293. exit
  294. ",
  295. 0x3
  296. );
  297. test_cranelift!(
  298. test_cranelift_div32_imm,
  299. "
  300. lddw r0, 0x10000000c
  301. div32 r0, 4
  302. exit
  303. ",
  304. 0x3
  305. );
  306. test_cranelift!(
  307. test_cranelift_div32_reg,
  308. "
  309. lddw r0, 0x10000000c
  310. mov r1, 4
  311. div32 r0, r1
  312. exit
  313. ",
  314. 0x3
  315. );
  316. test_cranelift!(
  317. test_cranelift_div64_imm,
  318. "
  319. mov r0, 0xc
  320. lsh r0, 32
  321. div r0, 4
  322. exit
  323. ",
  324. 0x300000000
  325. );
  326. test_cranelift!(
  327. test_cranelift_div64_reg,
  328. "
  329. mov r0, 0xc
  330. lsh r0, 32
  331. mov r1, 4
  332. div r0, r1
  333. exit
  334. ",
  335. 0x300000000
  336. );
  337. test_cranelift!(
  338. test_cranelift_early_exit,
  339. "
  340. mov r0, 3
  341. exit
  342. mov r0, 4
  343. exit
  344. ",
  345. 0x3
  346. );
  347. test_cranelift!(
  348. test_cranelift_div64_by_zero_imm,
  349. "
  350. mov32 r0, 1
  351. div r0, 0
  352. exit
  353. ",
  354. 0x0
  355. );
  356. test_cranelift!(
  357. test_cranelift_div_by_zero_imm,
  358. "
  359. mov32 r0, 1
  360. div32 r0, 0
  361. exit
  362. ",
  363. 0x0
  364. );
  365. test_cranelift!(
  366. test_cranelift_mod64_by_zero_imm,
  367. "
  368. mov32 r0, 1
  369. mod r0, 0
  370. exit
  371. ",
  372. 0x1
  373. );
  374. test_cranelift!(
  375. test_cranelift_mod_by_zero_imm,
  376. "
  377. mov32 r0, 1
  378. mod32 r0, 0
  379. exit
  380. ",
  381. 0x1
  382. );
  383. test_cranelift!(
  384. test_cranelift_div64_by_zero_reg,
  385. "
  386. mov32 r0, 1
  387. mov32 r1, 0
  388. div r0, r1
  389. exit
  390. ",
  391. 0x0
  392. );
  393. test_cranelift!(
  394. test_cranelift_div_by_zero_reg,
  395. "
  396. mov32 r0, 1
  397. mov32 r1, 0
  398. div32 r0, r1
  399. exit
  400. ",
  401. 0x0
  402. );
  403. test_cranelift!(
  404. test_cranelift_mod64_by_zero_reg,
  405. "
  406. mov32 r0, 1
  407. mov32 r1, 0
  408. mod r0, r1
  409. exit
  410. ",
  411. 0x1
  412. );
  413. test_cranelift!(
  414. test_cranelift_mod_by_zero_reg,
  415. "
  416. mov32 r0, 1
  417. mov32 r1, 0
  418. mod32 r0, r1
  419. exit
  420. ",
  421. 0x1
  422. );
  423. #[test]
  424. // #[should_panic(expected = "Error: out of bounds memory store (insn #1)")]
  425. #[ignore = "We have stack OOB checks, but we don't yet catch the trap code and convert it into a panic"]
  426. fn test_cranelift_err_stack_out_of_bound() {
  427. let prog = [
  428. 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  429. 0x00,
  430. ];
  431. let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  432. vm.execute_cranelift().unwrap();
  433. }
  434. test_cranelift!(
  435. test_cranelift_exit,
  436. "
  437. mov r0, 0
  438. exit
  439. ",
  440. 0x0
  441. );
  442. test_cranelift!(
  443. test_cranelift_ja,
  444. "
  445. mov r0, 1
  446. ja +1
  447. mov r0, 2
  448. exit
  449. ",
  450. 0x1
  451. );
  452. test_cranelift!(
  453. test_cranelift_jeq_imm,
  454. "
  455. mov32 r0, 0
  456. mov32 r1, 0xa
  457. jeq r1, 0xb, +4
  458. mov32 r0, 1
  459. mov32 r1, 0xb
  460. jeq r1, 0xb, +1
  461. mov32 r0, 2
  462. exit
  463. ",
  464. 0x1
  465. );
  466. test_cranelift!(
  467. test_cranelift_jeq_reg,
  468. "
  469. mov32 r0, 0
  470. mov32 r1, 0xa
  471. mov32 r2, 0xb
  472. jeq r1, r2, +4
  473. mov32 r0, 1
  474. mov32 r1, 0xb
  475. jeq r1, r2, +1
  476. mov32 r0, 2
  477. exit
  478. ",
  479. 0x1
  480. );
  481. test_cranelift!(
  482. test_cranelift_jge_imm,
  483. "
  484. mov32 r0, 0
  485. mov32 r1, 0xa
  486. jge r1, 0xb, +4
  487. mov32 r0, 1
  488. mov32 r1, 0xc
  489. jge r1, 0xb, +1
  490. mov32 r0, 2
  491. exit
  492. ",
  493. 0x1
  494. );
  495. test_cranelift!(
  496. test_cranelift_jle_imm,
  497. "
  498. mov32 r0, 0
  499. mov32 r1, 5
  500. jle r1, 4, +1
  501. jle r1, 6, +1
  502. exit
  503. jle r1, 5, +1
  504. exit
  505. mov32 r0, 1
  506. exit
  507. ",
  508. 0x1
  509. );
  510. test_cranelift!(
  511. test_cranelift_jle_reg,
  512. "
  513. mov r0, 0
  514. mov r1, 5
  515. mov r2, 4
  516. mov r3, 6
  517. jle r1, r2, +2
  518. jle r1, r1, +1
  519. exit
  520. jle r1, r3, +1
  521. exit
  522. mov r0, 1
  523. exit
  524. ",
  525. 0x1
  526. );
  527. test_cranelift!(
  528. test_cranelift_jgt_imm,
  529. "
  530. mov32 r0, 0
  531. mov32 r1, 5
  532. jgt r1, 6, +2
  533. jgt r1, 5, +1
  534. jgt r1, 4, +1
  535. exit
  536. mov32 r0, 1
  537. exit
  538. ",
  539. 0x1
  540. );
  541. test_cranelift!(
  542. test_cranelift_jgt_reg,
  543. "
  544. mov r0, 0
  545. mov r1, 5
  546. mov r2, 6
  547. mov r3, 4
  548. jgt r1, r2, +2
  549. jgt r1, r1, +1
  550. jgt r1, r3, +1
  551. exit
  552. mov r0, 1
  553. exit
  554. ",
  555. 0x1
  556. );
  557. test_cranelift!(
  558. test_cranelift_jlt_imm,
  559. "
  560. mov32 r0, 0
  561. mov32 r1, 5
  562. jlt r1, 4, +2
  563. jlt r1, 5, +1
  564. jlt r1, 6, +1
  565. exit
  566. mov32 r0, 1
  567. exit
  568. ",
  569. 0x1
  570. );
  571. test_cranelift!(
  572. test_cranelift_jlt_reg,
  573. "
  574. mov r0, 0
  575. mov r1, 5
  576. mov r2, 4
  577. mov r3, 6
  578. jlt r1, r2, +2
  579. jlt r1, r1, +1
  580. jlt r1, r3, +1
  581. exit
  582. mov r0, 1
  583. exit
  584. ",
  585. 0x1
  586. );
  587. test_cranelift!(
  588. test_cranelift_jit_bounce,
  589. "
  590. mov r0, 1
  591. mov r6, r0
  592. mov r7, r6
  593. mov r8, r7
  594. mov r9, r8
  595. mov r0, r9
  596. exit
  597. ",
  598. 0x1
  599. );
  600. test_cranelift!(
  601. test_cranelift_jne_reg,
  602. "
  603. mov32 r0, 0
  604. mov32 r1, 0xb
  605. mov32 r2, 0xb
  606. jne r1, r2, +4
  607. mov32 r0, 1
  608. mov32 r1, 0xa
  609. jne r1, r2, +1
  610. mov32 r0, 2
  611. exit
  612. ",
  613. 0x1
  614. );
  615. test_cranelift!(
  616. test_cranelift_jset_imm,
  617. "
  618. mov32 r0, 0
  619. mov32 r1, 0x7
  620. jset r1, 0x8, +4
  621. mov32 r0, 1
  622. mov32 r1, 0x9
  623. jset r1, 0x8, +1
  624. mov32 r0, 2
  625. exit
  626. ",
  627. 0x1
  628. );
  629. test_cranelift!(
  630. test_cranelift_jset_reg,
  631. "
  632. mov32 r0, 0
  633. mov32 r1, 0x7
  634. mov32 r2, 0x8
  635. jset r1, r2, +4
  636. mov32 r0, 1
  637. mov32 r1, 0x9
  638. jset r1, r2, +1
  639. mov32 r0, 2
  640. exit
  641. ",
  642. 0x1
  643. );
  644. test_cranelift!(
  645. test_cranelift_jsge_imm,
  646. "
  647. mov32 r0, 0
  648. mov r1, -2
  649. jsge r1, -1, +5
  650. jsge r1, 0, +4
  651. mov32 r0, 1
  652. mov r1, -1
  653. jsge r1, -1, +1
  654. mov32 r0, 2
  655. exit
  656. ",
  657. 0x1
  658. );
  659. test_cranelift!(
  660. test_cranelift_jsge_reg,
  661. "
  662. mov32 r0, 0
  663. mov r1, -2
  664. mov r2, -1
  665. mov32 r3, 0
  666. jsge r1, r2, +5
  667. jsge r1, r3, +4
  668. mov32 r0, 1
  669. mov r1, r2
  670. jsge r1, r2, +1
  671. mov32 r0, 2
  672. exit
  673. ",
  674. 0x1
  675. );
  676. test_cranelift!(
  677. test_cranelift_jsle_imm,
  678. "
  679. mov32 r0, 0
  680. mov r1, -2
  681. jsle r1, -3, +1
  682. jsle r1, -1, +1
  683. exit
  684. mov32 r0, 1
  685. jsle r1, -2, +1
  686. mov32 r0, 2
  687. exit
  688. ",
  689. 0x1
  690. );
  691. test_cranelift!(
  692. test_cranelift_jsle_reg,
  693. "
  694. mov32 r0, 0
  695. mov r1, -1
  696. mov r2, -2
  697. mov32 r3, 0
  698. jsle r1, r2, +1
  699. jsle r1, r3, +1
  700. exit
  701. mov32 r0, 1
  702. mov r1, r2
  703. jsle r1, r2, +1
  704. mov32 r0, 2
  705. exit
  706. ",
  707. 0x1
  708. );
  709. test_cranelift!(
  710. test_cranelift_jsgt_imm,
  711. "
  712. mov32 r0, 0
  713. mov r1, -2
  714. jsgt r1, -1, +4
  715. mov32 r0, 1
  716. mov32 r1, 0
  717. jsgt r1, -1, +1
  718. mov32 r0, 2
  719. exit
  720. ",
  721. 0x1
  722. );
  723. test_cranelift!(
  724. test_cranelift_jsgt_reg,
  725. "
  726. mov32 r0, 0
  727. mov r1, -2
  728. mov r2, -1
  729. jsgt r1, r2, +4
  730. mov32 r0, 1
  731. mov32 r1, 0
  732. jsgt r1, r2, +1
  733. mov32 r0, 2
  734. exit
  735. ",
  736. 0x1
  737. );
  738. test_cranelift!(
  739. test_cranelift_jslt_imm,
  740. "
  741. mov32 r0, 0
  742. mov r1, -2
  743. jslt r1, -3, +2
  744. jslt r1, -2, +1
  745. jslt r1, -1, +1
  746. exit
  747. mov32 r0, 1
  748. exit
  749. ",
  750. 0x1
  751. );
  752. test_cranelift!(
  753. test_cranelift_jslt_reg,
  754. "
  755. mov32 r0, 0
  756. mov r1, -2
  757. mov r2, -3
  758. mov r3, -1
  759. jslt r1, r1, +2
  760. jslt r1, r2, +1
  761. jslt r1, r3, +1
  762. exit
  763. mov32 r0, 1
  764. exit
  765. ",
  766. 0x1
  767. );
  768. test_cranelift!(
  769. test_cranelift_jeq32_imm,
  770. "
  771. mov r9, 1
  772. lsh r9, 32
  773. mov32 r0, 0x0
  774. mov32 r1, 0xa
  775. jeq32 r1, 0xb, +5
  776. mov32 r0, 1
  777. mov r1, 0xb
  778. or r1, r9
  779. jeq32 r1, 0xb, +1
  780. mov32 r0, 2
  781. exit
  782. ",
  783. 0x1
  784. );
  785. test_cranelift!(
  786. test_cranelift_jeq32_reg,
  787. "
  788. mov r9, 1
  789. lsh r9, 32
  790. mov32 r0, 0
  791. mov32 r1, 0xa
  792. mov32 r2, 0xb
  793. jeq32 r1, r2, +5
  794. mov32 r0, 1
  795. mov32 r1, 0xb
  796. or r1, r9
  797. jeq32 r1, r2, +1
  798. mov32 r0, 2
  799. exit
  800. ",
  801. 0x1
  802. );
  803. test_cranelift!(
  804. test_cranelift_jge32_imm,
  805. "
  806. mov r9, 1
  807. lsh r9, 32
  808. mov32 r0, 0
  809. mov32 r1, 0xa
  810. jge32 r1, 0xb, +5
  811. mov32 r0, 1
  812. or r1, r9
  813. mov32 r1, 0xc
  814. jge32 r1, 0xb, +1
  815. mov32 r0, 2
  816. exit
  817. ",
  818. 0x1
  819. );
  820. test_cranelift!(
  821. test_cranelift_jge32_reg,
  822. "
  823. mov r9, 1
  824. lsh r9, 32
  825. mov32 r0, 0
  826. mov32 r1, 0xa
  827. mov32 r2, 0xb
  828. jge32 r1, r2, +5
  829. mov32 r0, 1
  830. or r1, r9
  831. mov32 r1, 0xc
  832. jge32 r1, r2, +1
  833. mov32 r0, 2
  834. exit
  835. ",
  836. 0x1
  837. );
  838. test_cranelift!(
  839. test_cranelift_jgt32_imm,
  840. "
  841. mov r9, 1
  842. lsh r9, 32
  843. mov32 r0, 0
  844. mov32 r1, 5
  845. or r1, r9
  846. jgt32 r1, 6, +4
  847. jgt32 r1, 5, +3
  848. jgt32 r1, 4, +1
  849. exit
  850. mov32 r0, 1
  851. exit
  852. ",
  853. 0x1
  854. );
  855. test_cranelift!(
  856. test_cranelift_jgt32_reg,
  857. "
  858. mov r9, 1
  859. lsh r9, 32
  860. mov r0, 0
  861. mov r1, 5
  862. mov32 r1, 5
  863. or r1, r9
  864. mov r2, 6
  865. mov r3, 4
  866. jgt32 r1, r2, +4
  867. jgt32 r1, r1, +3
  868. jgt32 r1, r3, +1
  869. exit
  870. mov r0, 1
  871. exit
  872. ",
  873. 0x1
  874. );
  875. test_cranelift!(
  876. test_cranelift_jle32_imm,
  877. "
  878. mov r9, 1
  879. lsh r9, 32
  880. mov32 r0, 0
  881. mov32 r1, 5
  882. or r1, r9
  883. jle32 r1, 4, +5
  884. jle32 r1, 6, +1
  885. exit
  886. jle32 r1, 5, +1
  887. exit
  888. mov32 r0, 1
  889. exit
  890. ",
  891. 0x1
  892. );
  893. test_cranelift!(
  894. test_cranelift_jle32_reg,
  895. "
  896. mov r9, 1
  897. lsh r9, 32
  898. mov r0, 0
  899. mov r1, 5
  900. mov r2, 4
  901. mov r3, 6
  902. or r1, r9
  903. jle32 r1, r2, +5
  904. jle32 r1, r1, +1
  905. exit
  906. jle32 r1, r3, +1
  907. exit
  908. mov r0, 1
  909. exit
  910. ",
  911. 0x1
  912. );
  913. test_cranelift!(
  914. test_cranelift_jlt32_imm,
  915. "
  916. mov r9, 1
  917. lsh r9, 32
  918. mov32 r0, 0
  919. mov32 r1, 5
  920. or r1, r9
  921. jlt32 r1, 4, +4
  922. jlt32 r1, 5, +3
  923. jlt32 r1, 6, +1
  924. exit
  925. mov32 r0, 1
  926. exit
  927. ",
  928. 0x1
  929. );
  930. test_cranelift!(
  931. test_cranelift_jlt32_reg,
  932. "
  933. mov r9, 1
  934. lsh r9, 32
  935. mov r0, 0
  936. mov r1, 5
  937. mov r2, 4
  938. mov r3, 6
  939. or r1, r9
  940. jlt32 r1, r2, +4
  941. jlt32 r1, r1, +3
  942. jlt32 r1, r3, +1
  943. exit
  944. mov r0, 1
  945. exit
  946. ",
  947. 0x1
  948. );
  949. test_cranelift!(
  950. test_cranelift_jne32_imm,
  951. "
  952. mov r9, 1
  953. lsh r9, 32
  954. mov32 r0, 0
  955. mov32 r1, 0xb
  956. or r1, r9
  957. jne32 r1, 0xb, +4
  958. mov32 r0, 1
  959. mov32 r1, 0xa
  960. or r1, r9
  961. jne32 r1, 0xb, +1
  962. mov32 r0, 2
  963. exit
  964. ",
  965. 0x1
  966. );
  967. test_cranelift!(
  968. test_cranelift_jne32_reg,
  969. "
  970. mov r9, 1
  971. lsh r9, 32
  972. mov32 r0, 0
  973. mov32 r1, 0xb
  974. or r1, r9
  975. mov32 r2, 0xb
  976. jne32 r1, r2, +4
  977. mov32 r0, 1
  978. mov32 r1, 0xa
  979. or r1, r9
  980. jne32 r1, r2, +1
  981. mov32 r0, 2
  982. exit
  983. ",
  984. 0x1
  985. );
  986. test_cranelift!(
  987. test_cranelift_jset32_imm,
  988. "
  989. mov r9, 1
  990. lsh r9, 32
  991. mov32 r0, 0
  992. mov32 r1, 0x7
  993. or r1, r9
  994. jset32 r1, 0x8, +4
  995. mov32 r0, 1
  996. mov32 r1, 0x9
  997. jset32 r1, 0x8, +1
  998. mov32 r0, 2
  999. exit
  1000. ",
  1001. 0x1
  1002. );
  1003. test_cranelift!(
  1004. test_cranelift_jset32_reg,
  1005. "
  1006. mov r9, 1
  1007. lsh r9, 32
  1008. mov32 r0, 0
  1009. mov32 r1, 0x7
  1010. or r1, r9
  1011. mov32 r2, 0x8
  1012. jset32 r1, r2, +4
  1013. mov32 r0, 1
  1014. mov32 r1, 0x9
  1015. jset32 r1, r2, +1
  1016. mov32 r0, 2
  1017. exit
  1018. ",
  1019. 0x1
  1020. );
  1021. test_cranelift!(
  1022. test_cranelift_jsge32_imm,
  1023. "
  1024. mov r9, 1
  1025. lsh r9, 32
  1026. mov32 r0, 0
  1027. mov32 r1, -2
  1028. or r1, r9
  1029. jsge32 r1, -1, +5
  1030. jsge32 r1, 0, +4
  1031. mov32 r0, 1
  1032. mov r1, -1
  1033. jsge32 r1, -1, +1
  1034. mov32 r0, 2
  1035. exit
  1036. ",
  1037. 0x1
  1038. );
  1039. test_cranelift!(
  1040. test_cranelift_jsge32_reg,
  1041. "
  1042. mov r9, 1
  1043. lsh r9, 32
  1044. mov32 r0, 0
  1045. mov32 r1, -2
  1046. or r1, r9
  1047. mov r2, -1
  1048. mov32 r3, 0
  1049. jsge32 r1, r2, +5
  1050. jsge32 r1, r3, +4
  1051. mov32 r0, 1
  1052. mov r1, r2
  1053. jsge32 r1, r2, +1
  1054. mov32 r0, 2
  1055. exit
  1056. ",
  1057. 0x1
  1058. );
  1059. test_cranelift!(
  1060. test_cranelift_jsgt32_imm,
  1061. "
  1062. mov r9, 1
  1063. lsh r9, 32
  1064. mov32 r0, 0
  1065. mov32 r1, -2
  1066. or r1, r9
  1067. jsgt32 r1, -1, +4
  1068. mov32 r0, 1
  1069. mov32 r1, 0
  1070. jsgt32 r1, -1, +1
  1071. mov32 r0, 2
  1072. exit
  1073. ",
  1074. 0x1
  1075. );
  1076. test_cranelift!(
  1077. test_cranelift_jsgt32_reg,
  1078. "
  1079. mov r9, 1
  1080. lsh r9, 32
  1081. mov32 r0, 0
  1082. mov32 r1, -2
  1083. or r1, r9
  1084. mov r2, -1
  1085. jsgt32 r1, r2, +4
  1086. mov32 r0, 1
  1087. mov32 r1, 0
  1088. jsgt32 r1, r2, +1
  1089. mov32 r0, 2
  1090. exit
  1091. ",
  1092. 0x1
  1093. );
  1094. test_cranelift!(
  1095. test_cranelift_jsle32_imm,
  1096. "
  1097. mov r9, 1
  1098. lsh r9, 32
  1099. mov32 r0, 0
  1100. mov32 r1, -2
  1101. or r1, r9
  1102. jsle32 r1, -3, +5
  1103. jsle32 r1, -1, +1
  1104. exit
  1105. mov32 r0, 1
  1106. jsle32 r1, -2, +1
  1107. mov32 r0, 2
  1108. exit
  1109. ",
  1110. 0x1
  1111. );
  1112. test_cranelift!(
  1113. test_cranelift_jsle32_reg,
  1114. "
  1115. mov r9, 1
  1116. lsh r9, 32
  1117. mov32 r0, 0
  1118. mov32 r1, -2
  1119. or r1, r9
  1120. mov r2, -3
  1121. mov32 r3, 0
  1122. jsle32 r1, r2, +6
  1123. jsle32 r1, r3, +1
  1124. exit
  1125. mov32 r0, 1
  1126. mov r1, r2
  1127. jsle32 r1, r2, +1
  1128. mov32 r0, 2
  1129. exit
  1130. ",
  1131. 0x1
  1132. );
  1133. test_cranelift!(
  1134. test_cranelift_jslt32_imm,
  1135. "
  1136. mov r9, 1
  1137. lsh r9, 32
  1138. mov32 r0, 0
  1139. mov32 r1, -2
  1140. or r1, r9
  1141. jslt32 r1, -3, +4
  1142. jslt32 r1, -2, +3
  1143. jslt32 r1, -1, +1
  1144. exit
  1145. mov32 r0, 1
  1146. exit
  1147. ",
  1148. 0x1
  1149. );
  1150. test_cranelift!(
  1151. test_cranelift_jslt32_reg,
  1152. "
  1153. mov r9, 1
  1154. lsh r9, 32
  1155. mov32 r0, 0
  1156. mov32 r1, -2
  1157. or r1, r9
  1158. mov r2, -3
  1159. mov r3, -1
  1160. jslt32 r1, r1, +4
  1161. jslt32 r1, r2, +3
  1162. jslt32 r1, r3, +1
  1163. exit
  1164. mov32 r0, 1
  1165. exit
  1166. ",
  1167. 0x1
  1168. );
  1169. test_cranelift!(
  1170. test_cranelift_lddw,
  1171. "
  1172. lddw r0, 0x1122334455667788
  1173. exit
  1174. ",
  1175. 0x1122334455667788
  1176. );
  1177. test_cranelift!(
  1178. test_cranelift_lddw2,
  1179. "
  1180. lddw r0, 0x0000000080000000
  1181. exit
  1182. ",
  1183. 0x80000000
  1184. );
  1185. test_cranelift!(
  1186. test_cranelift_ldxb_all,
  1187. "
  1188. mov r0, r1
  1189. ldxb r9, [r0+0]
  1190. lsh r9, 0
  1191. ldxb r8, [r0+1]
  1192. lsh r8, 4
  1193. ldxb r7, [r0+2]
  1194. lsh r7, 8
  1195. ldxb r6, [r0+3]
  1196. lsh r6, 12
  1197. ldxb r5, [r0+4]
  1198. lsh r5, 16
  1199. ldxb r4, [r0+5]
  1200. lsh r4, 20
  1201. ldxb r3, [r0+6]
  1202. lsh r3, 24
  1203. ldxb r2, [r0+7]
  1204. lsh r2, 28
  1205. ldxb r1, [r0+8]
  1206. lsh r1, 32
  1207. ldxb r0, [r0+9]
  1208. lsh r0, 36
  1209. or r0, r1
  1210. or r0, r2
  1211. or r0, r3
  1212. or r0, r4
  1213. or r0, r5
  1214. or r0, r6
  1215. or r0, r7
  1216. or r0, r8
  1217. or r0, r9
  1218. exit
  1219. ",
  1220. [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09],
  1221. 0x9876543210
  1222. );
  1223. test_cranelift!(
  1224. test_cranelift_ldxb,
  1225. "
  1226. ldxb r0, [r1+2]
  1227. exit
  1228. ",
  1229. [0xaa, 0xbb, 0x11, 0xcc, 0xdd],
  1230. 0x11
  1231. );
  1232. test_cranelift!(
  1233. test_cranelift_ldxdw,
  1234. "
  1235. ldxdw r0, [r1+2]
  1236. exit
  1237. ",
  1238. [0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xcc, 0xdd],
  1239. 0x8877665544332211
  1240. );
  1241. test_cranelift!(
  1242. test_cranelift_ldxh_all,
  1243. "
  1244. mov r0, r1
  1245. ldxh r9, [r0+0]
  1246. be16 r9
  1247. lsh r9, 0
  1248. ldxh r8, [r0+2]
  1249. be16 r8
  1250. lsh r8, 4
  1251. ldxh r7, [r0+4]
  1252. be16 r7
  1253. lsh r7, 8
  1254. ldxh r6, [r0+6]
  1255. be16 r6
  1256. lsh r6, 12
  1257. ldxh r5, [r0+8]
  1258. be16 r5
  1259. lsh r5, 16
  1260. ldxh r4, [r0+10]
  1261. be16 r4
  1262. lsh r4, 20
  1263. ldxh r3, [r0+12]
  1264. be16 r3
  1265. lsh r3, 24
  1266. ldxh r2, [r0+14]
  1267. be16 r2
  1268. lsh r2, 28
  1269. ldxh r1, [r0+16]
  1270. be16 r1
  1271. lsh r1, 32
  1272. ldxh r0, [r0+18]
  1273. be16 r0
  1274. lsh r0, 36
  1275. or r0, r1
  1276. or r0, r2
  1277. or r0, r3
  1278. or r0, r4
  1279. or r0, r5
  1280. or r0, r6
  1281. or r0, r7
  1282. or r0, r8
  1283. or r0, r9
  1284. exit
  1285. ",
  1286. [
  1287. 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00,
  1288. 0x07, 0x00, 0x08, 0x00, 0x09
  1289. ],
  1290. 0x9876543210
  1291. );
  1292. test_cranelift!(
  1293. test_cranelift_ldxh_all2,
  1294. "
  1295. mov r0, r1
  1296. ldxh r9, [r0+0]
  1297. be16 r9
  1298. ldxh r8, [r0+2]
  1299. be16 r8
  1300. ldxh r7, [r0+4]
  1301. be16 r7
  1302. ldxh r6, [r0+6]
  1303. be16 r6
  1304. ldxh r5, [r0+8]
  1305. be16 r5
  1306. ldxh r4, [r0+10]
  1307. be16 r4
  1308. ldxh r3, [r0+12]
  1309. be16 r3
  1310. ldxh r2, [r0+14]
  1311. be16 r2
  1312. ldxh r1, [r0+16]
  1313. be16 r1
  1314. ldxh r0, [r0+18]
  1315. be16 r0
  1316. or r0, r1
  1317. or r0, r2
  1318. or r0, r3
  1319. or r0, r4
  1320. or r0, r5
  1321. or r0, r6
  1322. or r0, r7
  1323. or r0, r8
  1324. or r0, r9
  1325. exit
  1326. ",
  1327. [
  1328. 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00,
  1329. 0x80, 0x01, 0x00, 0x02, 0x00
  1330. ],
  1331. 0x3ff
  1332. );
  1333. test_cranelift!(
  1334. test_cranelift_ldxh,
  1335. "
  1336. ldxh r0, [r1+2]
  1337. exit
  1338. ",
  1339. [0xaa, 0xbb, 0x11, 0x22, 0xcc, 0xdd],
  1340. 0x2211
  1341. );
  1342. test_cranelift!(
  1343. test_cranelift_ldxh_same_reg,
  1344. "
  1345. mov r0, r1
  1346. sth [r0], 0x1234
  1347. ldxh r0, [r0]
  1348. exit
  1349. ",
  1350. [0xff, 0xff],
  1351. 0x1234
  1352. );
  1353. test_cranelift!(
  1354. test_cranelift_ldxw_all,
  1355. "
  1356. mov r0, r1
  1357. ldxw r9, [r0+0]
  1358. be32 r9
  1359. ldxw r8, [r0+4]
  1360. be32 r8
  1361. ldxw r7, [r0+8]
  1362. be32 r7
  1363. ldxw r6, [r0+12]
  1364. be32 r6
  1365. ldxw r5, [r0+16]
  1366. be32 r5
  1367. ldxw r4, [r0+20]
  1368. be32 r4
  1369. ldxw r3, [r0+24]
  1370. be32 r3
  1371. ldxw r2, [r0+28]
  1372. be32 r2
  1373. ldxw r1, [r0+32]
  1374. be32 r1
  1375. ldxw r0, [r0+36]
  1376. be32 r0
  1377. or r0, r1
  1378. or r0, r2
  1379. or r0, r3
  1380. or r0, r4
  1381. or r0, r5
  1382. or r0, r6
  1383. or r0, r7
  1384. or r0, r8
  1385. or r0, r9
  1386. exit
  1387. ",
  1388. [
  1389. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  1390. 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  1391. 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00
  1392. ],
  1393. 0x030f0f
  1394. );
  1395. test_cranelift!(
  1396. test_cranelift_ldxw,
  1397. "
  1398. ldxw r0, [r1+2]
  1399. exit
  1400. ",
  1401. [0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0xcc, 0xdd],
  1402. 0x44332211
  1403. );
  1404. test_cranelift!(
  1405. test_cranelift_le16,
  1406. "
  1407. ldxh r0, [r1]
  1408. le16 r0
  1409. exit
  1410. ",
  1411. [0x22, 0x11],
  1412. 0x1122
  1413. );
  1414. test_cranelift!(
  1415. test_cranelift_le32,
  1416. "
  1417. ldxw r0, [r1]
  1418. le32 r0
  1419. exit
  1420. ",
  1421. [0x44, 0x33, 0x22, 0x11],
  1422. 0x11223344
  1423. );
  1424. test_cranelift!(
  1425. test_cranelift_le64,
  1426. "
  1427. ldxdw r0, [r1]
  1428. le64 r0
  1429. exit
  1430. ",
  1431. [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11],
  1432. 0x1122334455667788
  1433. );
  1434. test_cranelift!(
  1435. test_cranelift_lsh_reg,
  1436. "
  1437. mov r0, 0x1
  1438. mov r7, 4
  1439. lsh r0, r7
  1440. exit
  1441. ",
  1442. 0x10
  1443. );
  1444. test_cranelift!(
  1445. test_cranelift_mod,
  1446. "
  1447. mov32 r0, 5748
  1448. mod32 r0, 92
  1449. mov32 r1, 13
  1450. mod32 r0, r1
  1451. exit
  1452. ",
  1453. 0x5
  1454. );
  1455. test_cranelift!(
  1456. test_cranelift_mod32,
  1457. "
  1458. lddw r0, 0x100000003
  1459. mod32 r0, 3
  1460. exit
  1461. ",
  1462. 0x0
  1463. );
  1464. test_cranelift!(
  1465. test_cranelift_mod64,
  1466. "
  1467. mov32 r0, -1316649930
  1468. lsh r0, 32
  1469. or r0, 0x100dc5c8
  1470. mov32 r1, 0xdde263e
  1471. lsh r1, 32
  1472. or r1, 0x3cbef7f3
  1473. mod r0, r1
  1474. mod r0, 0x658f1778
  1475. exit
  1476. ",
  1477. 0x30ba5a04
  1478. );
  1479. test_cranelift!(
  1480. test_cranelift_mov,
  1481. "
  1482. mov32 r1, 1
  1483. mov32 r0, r1
  1484. exit
  1485. ",
  1486. 0x1
  1487. );
  1488. test_cranelift!(
  1489. test_cranelift_mul32_imm,
  1490. "
  1491. mov r0, 3
  1492. mul32 r0, 4
  1493. exit
  1494. ",
  1495. 0xc
  1496. );
  1497. test_cranelift!(
  1498. test_cranelift_mul32_reg,
  1499. "
  1500. mov r0, 3
  1501. mov r1, 4
  1502. mul32 r0, r1
  1503. exit
  1504. ",
  1505. 0xc
  1506. );
  1507. test_cranelift!(
  1508. test_cranelift_mul32_reg_overflow,
  1509. "
  1510. mov r0, 0x40000001
  1511. mov r1, 4
  1512. mul32 r0, r1
  1513. exit
  1514. ",
  1515. 0x4
  1516. );
  1517. test_cranelift!(
  1518. test_cranelift_mul64_imm,
  1519. "
  1520. mov r0, 0x40000001
  1521. mul r0, 4
  1522. exit
  1523. ",
  1524. 0x100000004
  1525. );
  1526. test_cranelift!(
  1527. test_cranelift_mul64_reg,
  1528. "
  1529. mov r0, 0x40000001
  1530. mov r1, 4
  1531. mul r0, r1
  1532. exit
  1533. ",
  1534. 0x100000004
  1535. );
  1536. test_cranelift!(
  1537. test_cranelift_mul_loop,
  1538. "
  1539. mov r0, 0x7
  1540. add r1, 0xa
  1541. lsh r1, 0x20
  1542. rsh r1, 0x20
  1543. jeq r1, 0x0, +4
  1544. mov r0, 0x7
  1545. mul r0, 0x7
  1546. add r1, -1
  1547. jne r1, 0x0, -3
  1548. exit
  1549. ",
  1550. 0x75db9c97
  1551. );
  1552. test_cranelift!(
  1553. test_cranelift_neg64,
  1554. "
  1555. mov32 r0, 2
  1556. neg r0
  1557. exit
  1558. ",
  1559. 0xfffffffffffffffe
  1560. );
  1561. test_cranelift!(
  1562. test_cranelift_neg,
  1563. "
  1564. mov32 r0, 2
  1565. neg32 r0
  1566. exit
  1567. ",
  1568. 0xfffffffe
  1569. );
  1570. test_cranelift!(
  1571. test_cranelift_prime,
  1572. "
  1573. mov r1, 67
  1574. mov r0, 0x1
  1575. mov r2, 0x2
  1576. jgt r1, 0x2, +4
  1577. ja +10
  1578. add r2, 0x1
  1579. mov r0, 0x1
  1580. jge r2, r1, +7
  1581. mov r3, r1
  1582. div r3, r2
  1583. mul r3, r2
  1584. mov r4, r1
  1585. sub r4, r3
  1586. mov r0, 0x0
  1587. jne r4, 0x0, -10
  1588. exit
  1589. ",
  1590. 1
  1591. );
  1592. test_cranelift!(
  1593. test_cranelift_rhs32,
  1594. "
  1595. xor r0, r0
  1596. sub r0, 1
  1597. rsh32 r0, 8
  1598. exit
  1599. ",
  1600. 0x00ffffff
  1601. );
  1602. test_cranelift!(
  1603. test_cranelift_rsh_reg,
  1604. "
  1605. mov r0, 0x10
  1606. mov r7, 4
  1607. rsh r0, r7
  1608. exit
  1609. ",
  1610. 0x1
  1611. );
  1612. test_cranelift!(
  1613. test_cranelift_stack,
  1614. "
  1615. mov r1, 51
  1616. stdw [r10-16], 0xab
  1617. stdw [r10-8], 0xcd
  1618. and r1, 1
  1619. lsh r1, 3
  1620. mov r2, r10
  1621. add r2, r1
  1622. ldxdw r0, [r2-16]
  1623. exit
  1624. ",
  1625. 0xcd
  1626. );
  1627. #[test]
  1628. fn test_cranelift_stack2() {
  1629. let prog = assemble(
  1630. "
  1631. stb [r10-4], 0x01
  1632. stb [r10-3], 0x02
  1633. stb [r10-2], 0x03
  1634. stb [r10-1], 0x04
  1635. mov r1, r10
  1636. mov r2, 0x4
  1637. sub r1, r2
  1638. call 1
  1639. mov r1, 0
  1640. ldxb r2, [r10-4]
  1641. ldxb r3, [r10-3]
  1642. ldxb r4, [r10-2]
  1643. ldxb r5, [r10-1]
  1644. call 0
  1645. xor r0, 0x2a2a2a2a
  1646. exit",
  1647. )
  1648. .unwrap();
  1649. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1650. vm.register_helper(0, helpers::gather_bytes).unwrap();
  1651. vm.register_helper(1, helpers::memfrob).unwrap();
  1652. assert_eq!(vm.execute_cranelift().unwrap(), 0x01020304);
  1653. }
  1654. test_cranelift!(
  1655. test_cranelift_stb,
  1656. "
  1657. stb [r1+2], 0x11
  1658. ldxb r0, [r1+2]
  1659. exit
  1660. ",
  1661. [0xaa, 0xbb, 0xff, 0xcc, 0xdd],
  1662. 0x11
  1663. );
  1664. test_cranelift!(
  1665. test_cranelift_stdw,
  1666. "
  1667. stdw [r1+2], 0x44332211
  1668. ldxdw r0, [r1+2]
  1669. exit
  1670. ",
  1671. [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd],
  1672. 0x44332211
  1673. );
  1674. test_cranelift!(
  1675. test_cranelift_sth,
  1676. "
  1677. sth [r1+2], 0x2211
  1678. ldxh r0, [r1+2]
  1679. exit
  1680. ",
  1681. [0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd],
  1682. 0x2211
  1683. );
  1684. #[test]
  1685. #[ignore]
  1686. fn test_cranelift_string_stack() {
  1687. let prog = assemble(
  1688. "
  1689. mov r1, 0x78636261
  1690. stxw [r10-8], r1
  1691. mov r6, 0x0
  1692. stxb [r10-4], r6
  1693. stxb [r10-12], r6
  1694. mov r1, 0x79636261
  1695. stxw [r10-16], r1
  1696. mov r1, r10
  1697. add r1, -8
  1698. mov r2, r1
  1699. call 0x4
  1700. mov r1, r0
  1701. mov r0, 0x1
  1702. lsh r1, 0x20
  1703. rsh r1, 0x20
  1704. jne r1, 0x0, +11
  1705. mov r1, r10
  1706. add r1, -8
  1707. mov r2, r10
  1708. add r2, -16
  1709. call 0x4
  1710. mov r1, r0
  1711. lsh r1, 0x20
  1712. rsh r1, 0x20
  1713. mov r0, 0x1
  1714. jeq r1, r6, +1
  1715. mov r0, 0x0
  1716. exit",
  1717. )
  1718. .unwrap();
  1719. let mut vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  1720. vm.register_helper(4, helpers::strcmp).unwrap();
  1721. assert_eq!(vm.execute_cranelift().unwrap(), 0x0);
  1722. }
  1723. test_cranelift!(
  1724. test_cranelift_stw,
  1725. "
  1726. stw [r1+2], 0x44332211
  1727. ldxw r0, [r1+2]
  1728. exit
  1729. ",
  1730. [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd],
  1731. 0x44332211
  1732. );
  1733. test_cranelift!(
  1734. test_cranelift_stxb,
  1735. "
  1736. mov32 r2, 0x11
  1737. stxb [r1+2], r2
  1738. ldxb r0, [r1+2]
  1739. exit
  1740. ",
  1741. [0xaa, 0xbb, 0xff, 0xcc, 0xdd],
  1742. 0x11
  1743. );
  1744. test_cranelift!(
  1745. test_cranelift_stxb_all,
  1746. "
  1747. mov r0, 0xf0
  1748. mov r2, 0xf2
  1749. mov r3, 0xf3
  1750. mov r4, 0xf4
  1751. mov r5, 0xf5
  1752. mov r6, 0xf6
  1753. mov r7, 0xf7
  1754. mov r8, 0xf8
  1755. stxb [r1], r0
  1756. stxb [r1+1], r2
  1757. stxb [r1+2], r3
  1758. stxb [r1+3], r4
  1759. stxb [r1+4], r5
  1760. stxb [r1+5], r6
  1761. stxb [r1+6], r7
  1762. stxb [r1+7], r8
  1763. ldxdw r0, [r1]
  1764. be64 r0
  1765. exit
  1766. ",
  1767. [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
  1768. 0xf0f2f3f4f5f6f7f8
  1769. );
  1770. test_cranelift!(
  1771. test_cranelift_stxb_all2,
  1772. "
  1773. mov r0, r1
  1774. mov r1, 0xf1
  1775. mov r9, 0xf9
  1776. stxb [r0], r1
  1777. stxb [r0+1], r9
  1778. ldxh r0, [r0]
  1779. be16 r0
  1780. exit
  1781. ",
  1782. [0xff, 0xff],
  1783. 0xf1f9
  1784. );
  1785. test_cranelift!(
  1786. test_cranelift_stxb_chain,
  1787. "
  1788. mov r0, r1
  1789. ldxb r9, [r0+0]
  1790. stxb [r0+1], r9
  1791. ldxb r8, [r0+1]
  1792. stxb [r0+2], r8
  1793. ldxb r7, [r0+2]
  1794. stxb [r0+3], r7
  1795. ldxb r6, [r0+3]
  1796. stxb [r0+4], r6
  1797. ldxb r5, [r0+4]
  1798. stxb [r0+5], r5
  1799. ldxb r4, [r0+5]
  1800. stxb [r0+6], r4
  1801. ldxb r3, [r0+6]
  1802. stxb [r0+7], r3
  1803. ldxb r2, [r0+7]
  1804. stxb [r0+8], r2
  1805. ldxb r1, [r0+8]
  1806. stxb [r0+9], r1
  1807. ldxb r0, [r0+9]
  1808. exit
  1809. ",
  1810. [0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
  1811. 0x2a
  1812. );
  1813. test_cranelift!(
  1814. test_cranelift_stxdw,
  1815. "
  1816. mov r2, -2005440939
  1817. lsh r2, 32
  1818. or r2, 0x44332211
  1819. stxdw [r1+2], r2
  1820. ldxdw r0, [r1+2]
  1821. exit
  1822. ",
  1823. [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd],
  1824. 0x8877665544332211
  1825. );
  1826. test_cranelift!(
  1827. test_cranelift_stxh,
  1828. "
  1829. mov32 r2, 0x2211
  1830. stxh [r1+2], r2
  1831. ldxh r0, [r1+2]
  1832. exit
  1833. ",
  1834. [0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd],
  1835. 0x2211
  1836. );
  1837. test_cranelift!(
  1838. test_cranelift_stxw,
  1839. "
  1840. mov32 r2, 0x44332211
  1841. stxw [r1+2], r2
  1842. ldxw r0, [r1+2]
  1843. exit
  1844. ",
  1845. [0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd],
  1846. 0x44332211
  1847. );
  1848. test_cranelift!(
  1849. test_cranelift_subnet,
  1850. "
  1851. mov r2, 0xe
  1852. ldxh r3, [r1+12]
  1853. jne r3, 0x81, +2
  1854. mov r2, 0x12
  1855. ldxh r3, [r1+16]
  1856. and r3, 0xffff
  1857. jne r3, 0x8, +5
  1858. add r1, r2
  1859. mov r0, 0x1
  1860. ldxw r1, [r1+16]
  1861. and r1, 0xffffff
  1862. jeq r1, 0x1a8c0, +1
  1863. mov r0, 0x0
  1864. exit
  1865. ",
  1866. [
  1867. 0x00, 0x00, 0xc0, 0x9f, 0xa0, 0x97, 0x00, 0xa0, 0xcc, 0x3b, 0xbf, 0xfa, 0x08, 0x00, 0x45,
  1868. 0x10, 0x00, 0x3c, 0x46, 0x3c, 0x40, 0x00, 0x40, 0x06, 0x73, 0x1c, 0xc0, 0xa8, 0x01, 0x02,
  1869. 0xc0, 0xa8, 0x01, 0x01, 0x06, 0x0e, 0x00, 0x17, 0x99, 0xc5, 0xa0, 0xec, 0x00, 0x00, 0x00,
  1870. 0x00, 0xa0, 0x02, 0x7d, 0x78, 0xe0, 0xa3, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4, 0x04, 0x02,
  1871. 0x08, 0x0a, 0x00, 0x9c, 0x27, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00,
  1872. ],
  1873. 0x1
  1874. );
  1875. const PROG_TCP_PORT_80: [u8; 152] = [
  1876. 0x71, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x13, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
  1877. 0x67, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4f, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1878. 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00,
  1879. 0x71, 0x12, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x02, 0x0a, 0x00, 0x06, 0x00, 0x00, 0x00,
  1880. 0x71, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
  1881. 0x57, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  1882. 0x0f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
  1883. 0x15, 0x02, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x69, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1884. 0x55, 0x01, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  1885. 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1886. ];
  1887. #[test]
  1888. fn test_cranelift_tcp_port80_match() {
  1889. let mem = &mut [
  1890. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45,
  1891. 0x00, 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01,
  1892. 0xc0, 0xa8, 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1893. 0x00, 0x50, 0x02, 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1894. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1895. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1896. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1897. ];
  1898. let prog = &PROG_TCP_PORT_80;
  1899. let vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  1900. assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x1);
  1901. }
  1902. #[test]
  1903. fn test_cranelift_tcp_port80_nomatch() {
  1904. let mem = &mut [
  1905. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45,
  1906. 0x00, 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01,
  1907. 0xc0, 0xa8, 0x00, 0x02, 0x00, 0x16, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1908. 0x00, 0x51, 0x02, 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1909. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1910. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1911. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1912. ];
  1913. let prog = &PROG_TCP_PORT_80;
  1914. let vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  1915. assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x0);
  1916. }
  1917. #[test]
  1918. fn test_cranelift_tcp_port80_nomatch_ethertype() {
  1919. let mem = &mut [
  1920. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x08, 0x01, 0x45,
  1921. 0x00, 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01,
  1922. 0xc0, 0xa8, 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1923. 0x00, 0x50, 0x02, 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1924. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1925. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1926. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1927. ];
  1928. let prog = &PROG_TCP_PORT_80;
  1929. let vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  1930. assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x0);
  1931. }
  1932. #[test]
  1933. fn test_cranelift_tcp_port80_nomatch_proto() {
  1934. let mem = &mut [
  1935. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x08, 0x00, 0x45,
  1936. 0x00, 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 0xf9, 0x4d, 0xc0, 0xa8, 0x00, 0x01,
  1937. 0xc0, 0xa8, 0x00, 0x02, 0x27, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1938. 0x00, 0x50, 0x02, 0x20, 0x00, 0xc5, 0x18, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1939. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1940. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1941. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
  1942. ];
  1943. let prog = &PROG_TCP_PORT_80;
  1944. let vm = rbpf::EbpfVmRaw::new(Some(prog)).unwrap();
  1945. assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x0);
  1946. }
  1947. #[test]
  1948. fn test_cranelift_tcp_sack_match() {
  1949. let mut mem = TCP_SACK_MATCH.to_vec();
  1950. let prog = assemble(TCP_SACK_ASM).unwrap();
  1951. let vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1952. assert_eq!(vm.execute_cranelift(mem.as_mut_slice()).unwrap(), 0x1);
  1953. }
  1954. #[test]
  1955. fn test_cranelift_tcp_sack_nomatch() {
  1956. let mut mem = TCP_SACK_NOMATCH.to_vec();
  1957. let prog = assemble(TCP_SACK_ASM).unwrap();
  1958. let vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  1959. assert_eq!(vm.execute_cranelift(mem.as_mut_slice()).unwrap(), 0x0);
  1960. }