cranelift.rs 34 KB

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