4
0

cranelift.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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;
  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 vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
  13. assert_eq!(vm.execute_cranelift().unwrap(), $expected);
  14. }
  15. };
  16. ($name:ident, $prog:expr, $mem:expr, $expected:expr) => {
  17. #[test]
  18. fn $name() {
  19. let prog = assemble($prog).unwrap();
  20. let mem = &mut $mem;
  21. let vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
  22. assert_eq!(vm.execute_cranelift(mem).unwrap(), $expected);
  23. }
  24. };
  25. }
  26. test_cranelift!(
  27. test_cranelift_add,
  28. "
  29. mov32 r0, 0
  30. mov32 r1, 2
  31. add32 r0, 1
  32. add32 r0, r1
  33. exit
  34. ",
  35. 0x3
  36. );
  37. test_cranelift!(
  38. test_cranelift_alu64_arith,
  39. "
  40. mov r0, 0
  41. mov r1, 1
  42. mov r2, 2
  43. mov r3, 3
  44. mov r4, 4
  45. mov r5, 5
  46. mov r6, 6
  47. mov r7, 7
  48. mov r8, 8
  49. mov r9, 9
  50. add r0, 23
  51. add r0, r7
  52. sub r0, 13
  53. sub r0, r1
  54. mul r0, 7
  55. mul r0, r3
  56. div r0, 2
  57. div r0, r4
  58. exit
  59. ",
  60. 0x2a
  61. );
  62. test_cranelift!(
  63. test_cranelift_alu64_bit,
  64. "
  65. mov r0, 0
  66. mov r1, 1
  67. mov r2, 2
  68. mov r3, 3
  69. mov r4, 4
  70. mov r5, 5
  71. mov r6, 6
  72. mov r7, 7
  73. mov r8, 8
  74. or r0, r5
  75. or r0, 0xa0
  76. and r0, 0xa3
  77. mov r9, 0x91
  78. and r0, r9
  79. lsh r0, 32
  80. lsh r0, 22
  81. lsh r0, r8
  82. rsh r0, 32
  83. rsh r0, 19
  84. rsh r0, r7
  85. xor r0, 0x03
  86. xor r0, r2
  87. exit
  88. ",
  89. 0x11
  90. );
  91. test_cranelift!(
  92. test_cranelift_alu_arith,
  93. "
  94. mov32 r0, 0
  95. mov32 r1, 1
  96. mov32 r2, 2
  97. mov32 r3, 3
  98. mov32 r4, 4
  99. mov32 r5, 5
  100. mov32 r6, 6
  101. mov32 r7, 7
  102. mov32 r8, 8
  103. mov32 r9, 9
  104. add32 r0, 23
  105. add32 r0, r7
  106. sub32 r0, 13
  107. sub32 r0, r1
  108. mul32 r0, 7
  109. mul32 r0, r3
  110. div32 r0, 2
  111. div32 r0, r4
  112. exit
  113. ",
  114. 0x2a
  115. );
  116. test_cranelift!(
  117. test_cranelift_alu_bit,
  118. "
  119. mov32 r0, 0
  120. mov32 r1, 1
  121. mov32 r2, 2
  122. mov32 r3, 3
  123. mov32 r4, 4
  124. mov32 r5, 5
  125. mov32 r6, 6
  126. mov32 r7, 7
  127. mov32 r8, 8
  128. or32 r0, r5
  129. or32 r0, 0xa0
  130. and32 r0, 0xa3
  131. mov32 r9, 0x91
  132. and32 r0, r9
  133. lsh32 r0, 22
  134. lsh32 r0, r8
  135. rsh32 r0, 19
  136. rsh32 r0, r7
  137. xor32 r0, 0x03
  138. xor32 r0, r2
  139. exit
  140. ",
  141. 0x11
  142. );
  143. test_cranelift!(
  144. test_cranelift_arsh32_high_shift,
  145. "
  146. mov r0, 8
  147. lddw r1, 0x100000001
  148. arsh32 r0, r1
  149. exit
  150. ",
  151. 0x4
  152. );
  153. test_cranelift!(
  154. test_cranelift_arsh,
  155. "
  156. mov32 r0, 0xf8
  157. lsh32 r0, 28
  158. arsh32 r0, 16
  159. exit
  160. ",
  161. 0xffff8000
  162. );
  163. test_cranelift!(
  164. test_cranelift_arsh64,
  165. "
  166. mov32 r0, 1
  167. lsh r0, 63
  168. arsh r0, 55
  169. mov32 r1, 5
  170. arsh r0, r1
  171. exit
  172. ",
  173. 0xfffffffffffffff8
  174. );
  175. test_cranelift!(
  176. test_cranelift_arsh_reg,
  177. "
  178. mov32 r0, 0xf8
  179. mov32 r1, 16
  180. lsh32 r0, 28
  181. arsh32 r0, r1
  182. exit
  183. ",
  184. 0xffff8000
  185. );
  186. test_cranelift!(
  187. test_cranelift_be16,
  188. "
  189. ldxh r0, [r1]
  190. be16 r0
  191. exit
  192. ",
  193. [0x11, 0x22],
  194. 0x1122
  195. );
  196. test_cranelift!(
  197. test_cranelift_be16_high,
  198. "
  199. ldxdw r0, [r1]
  200. be16 r0
  201. exit
  202. ",
  203. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  204. 0x1122
  205. );
  206. test_cranelift!(
  207. test_cranelift_be32,
  208. "
  209. ldxw r0, [r1]
  210. be32 r0
  211. exit
  212. ",
  213. [0x11, 0x22, 0x33, 0x44],
  214. 0x11223344
  215. );
  216. test_cranelift!(
  217. test_cranelift_be32_high,
  218. "
  219. ldxdw r0, [r1]
  220. be32 r0
  221. exit
  222. ",
  223. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  224. 0x11223344
  225. );
  226. test_cranelift!(
  227. test_cranelift_be64,
  228. "
  229. ldxdw r0, [r1]
  230. be64 r0
  231. exit
  232. ",
  233. [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
  234. 0x1122334455667788
  235. );