cranelift.rs 39 KB

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