cranelift.rs 39 KB

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