/src/test/assembly/asm/arm-types.rs

https://gitlab.com/rust-lang/rust · Rust · 530 lines · 167 code · 80 blank · 283 comment · 17 complexity · 2faefada75daef4a33a1da3735f6af5c MD5 · raw file

  1. // assembly-output: emit-asm
  2. // compile-flags: --target armv7-unknown-linux-gnueabihf
  3. // compile-flags: -C target-feature=+neon
  4. // needs-llvm-components: arm
  5. #![feature(no_core, lang_items, rustc_attrs, repr_simd, asm_sym)]
  6. #![crate_type = "rlib"]
  7. #![no_core]
  8. #![allow(asm_sub_register, non_camel_case_types)]
  9. #[rustc_builtin_macro]
  10. macro_rules! asm {
  11. () => {};
  12. }
  13. #[rustc_builtin_macro]
  14. macro_rules! concat {
  15. () => {};
  16. }
  17. #[rustc_builtin_macro]
  18. macro_rules! stringify {
  19. () => {};
  20. }
  21. #[lang = "sized"]
  22. trait Sized {}
  23. #[lang = "copy"]
  24. trait Copy {}
  25. type ptr = *mut u8;
  26. #[repr(simd)]
  27. pub struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
  28. #[repr(simd)]
  29. pub struct i16x4(i16, i16, i16, i16);
  30. #[repr(simd)]
  31. pub struct i32x2(i32, i32);
  32. #[repr(simd)]
  33. pub struct i64x1(i64);
  34. #[repr(simd)]
  35. pub struct f32x2(f32, f32);
  36. #[repr(simd)]
  37. pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
  38. #[repr(simd)]
  39. pub struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
  40. #[repr(simd)]
  41. pub struct i32x4(i32, i32, i32, i32);
  42. #[repr(simd)]
  43. pub struct i64x2(i64, i64);
  44. #[repr(simd)]
  45. pub struct f32x4(f32, f32, f32, f32);
  46. impl Copy for i8 {}
  47. impl Copy for i16 {}
  48. impl Copy for i32 {}
  49. impl Copy for f32 {}
  50. impl Copy for i64 {}
  51. impl Copy for f64 {}
  52. impl Copy for ptr {}
  53. impl Copy for i8x8 {}
  54. impl Copy for i16x4 {}
  55. impl Copy for i32x2 {}
  56. impl Copy for i64x1 {}
  57. impl Copy for f32x2 {}
  58. impl Copy for i8x16 {}
  59. impl Copy for i16x8 {}
  60. impl Copy for i32x4 {}
  61. impl Copy for i64x2 {}
  62. impl Copy for f32x4 {}
  63. extern "C" {
  64. fn extern_func();
  65. static extern_static: u8;
  66. }
  67. // CHECK-LABEL: sym_fn:
  68. // CHECK: @APP
  69. // CHECK: bl extern_func
  70. // CHECK: @NO_APP
  71. #[no_mangle]
  72. pub unsafe fn sym_fn() {
  73. asm!("bl {}", sym extern_func);
  74. }
  75. // CHECK-LABEL: sym_static:
  76. // CHECK: @APP
  77. // CHECK: adr r0, extern_static
  78. // CHECK: @NO_APP
  79. #[no_mangle]
  80. pub unsafe fn sym_static() {
  81. asm!("adr r0, {}", sym extern_static);
  82. }
  83. // Regression test for #82052.
  84. // CHECK-LABEL: issue_82052
  85. // CHECK: push {{.*}}lr
  86. // CHECK: @APP
  87. // CHECK: @NO_APP
  88. pub unsafe fn issue_82052() {
  89. asm!("", out("r14") _);
  90. }
  91. macro_rules! check {
  92. ($func:ident $ty:ident $class:ident $mov:literal) => {
  93. #[no_mangle]
  94. pub unsafe fn $func(x: $ty) -> $ty {
  95. // Hack to avoid function merging
  96. extern "Rust" {
  97. fn dont_merge(s: &str);
  98. }
  99. dont_merge(stringify!($func));
  100. let y;
  101. asm!(concat!($mov, " {}, {}"), out($class) y, in($class) x);
  102. y
  103. }
  104. };
  105. }
  106. macro_rules! check_reg {
  107. ($func:ident $ty:ident $reg:tt $mov:literal) => {
  108. #[no_mangle]
  109. pub unsafe fn $func(x: $ty) -> $ty {
  110. // Hack to avoid function merging
  111. extern "Rust" {
  112. fn dont_merge(s: &str);
  113. }
  114. dont_merge(stringify!($func));
  115. let y;
  116. asm!(concat!($mov, " ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
  117. y
  118. }
  119. };
  120. }
  121. // CHECK-LABEL: reg_i8:
  122. // CHECK: @APP
  123. // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
  124. // CHECK: @NO_APP
  125. check!(reg_i8 i8 reg "mov");
  126. // CHECK-LABEL: reg_i16:
  127. // CHECK: @APP
  128. // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
  129. // CHECK: @NO_APP
  130. check!(reg_i16 i16 reg "mov");
  131. // CHECK-LABEL: reg_i32:
  132. // CHECK: @APP
  133. // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
  134. // CHECK: @NO_APP
  135. check!(reg_i32 i32 reg "mov");
  136. // CHECK-LABEL: reg_f32:
  137. // CHECK: @APP
  138. // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
  139. // CHECK: @NO_APP
  140. check!(reg_f32 f32 reg "mov");
  141. // CHECK-LABEL: reg_ptr:
  142. // CHECK: @APP
  143. // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
  144. // CHECK: @NO_APP
  145. check!(reg_ptr ptr reg "mov");
  146. // CHECK-LABEL: sreg_i32:
  147. // CHECK: @APP
  148. // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
  149. // CHECK: @NO_APP
  150. check!(sreg_i32 i32 sreg "vmov.f32");
  151. // CHECK-LABEL: sreg_f32:
  152. // CHECK: @APP
  153. // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
  154. // CHECK: @NO_APP
  155. check!(sreg_f32 f32 sreg "vmov.f32");
  156. // CHECK-LABEL: sreg_ptr:
  157. // CHECK: @APP
  158. // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
  159. // CHECK: @NO_APP
  160. check!(sreg_ptr ptr sreg "vmov.f32");
  161. // CHECK-LABEL: sreg_low16_i32:
  162. // CHECK: @APP
  163. // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
  164. // CHECK: @NO_APP
  165. check!(sreg_low16_i32 i32 sreg_low16 "vmov.f32");
  166. // CHECK-LABEL: sreg_low16_f32:
  167. // CHECK: @APP
  168. // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
  169. // CHECK: @NO_APP
  170. check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
  171. // CHECK-LABEL: dreg_i64:
  172. // CHECK: @APP
  173. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  174. // CHECK: @NO_APP
  175. check!(dreg_i64 i64 dreg "vmov.f64");
  176. // CHECK-LABEL: dreg_f64:
  177. // CHECK: @APP
  178. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  179. // CHECK: @NO_APP
  180. check!(dreg_f64 f64 dreg "vmov.f64");
  181. // CHECK-LABEL: dreg_i8x8:
  182. // CHECK: @APP
  183. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  184. // CHECK: @NO_APP
  185. check!(dreg_i8x8 i8x8 dreg "vmov.f64");
  186. // CHECK-LABEL: dreg_i16x4:
  187. // CHECK: @APP
  188. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  189. // CHECK: @NO_APP
  190. check!(dreg_i16x4 i16x4 dreg "vmov.f64");
  191. // CHECK-LABEL: dreg_i32x2:
  192. // CHECK: @APP
  193. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  194. // CHECK: @NO_APP
  195. check!(dreg_i32x2 i32x2 dreg "vmov.f64");
  196. // CHECK-LABEL: dreg_i64x1:
  197. // CHECK: @APP
  198. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  199. // CHECK: @NO_APP
  200. check!(dreg_i64x1 i64x1 dreg "vmov.f64");
  201. // CHECK-LABEL: dreg_f32x2:
  202. // CHECK: @APP
  203. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  204. // CHECK: @NO_APP
  205. check!(dreg_f32x2 f32x2 dreg "vmov.f64");
  206. // CHECK-LABEL: dreg_low16_i64:
  207. // CHECK: @APP
  208. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  209. // CHECK: @NO_APP
  210. check!(dreg_low16_i64 i64 dreg_low16 "vmov.f64");
  211. // CHECK-LABEL: dreg_low16_f64:
  212. // CHECK: @APP
  213. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  214. // CHECK: @NO_APP
  215. check!(dreg_low16_f64 f64 dreg_low16 "vmov.f64");
  216. // CHECK-LABEL: dreg_low16_i8x8:
  217. // CHECK: @APP
  218. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  219. // CHECK: @NO_APP
  220. check!(dreg_low16_i8x8 i8x8 dreg_low16 "vmov.f64");
  221. // CHECK-LABEL: dreg_low16_i16x4:
  222. // CHECK: @APP
  223. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  224. // CHECK: @NO_APP
  225. check!(dreg_low16_i16x4 i16x4 dreg_low16 "vmov.f64");
  226. // CHECK-LABEL: dreg_low16_i32x2:
  227. // CHECK: @APP
  228. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  229. // CHECK: @NO_APP
  230. check!(dreg_low16_i32x2 i32x2 dreg_low16 "vmov.f64");
  231. // CHECK-LABEL: dreg_low16_i64x1:
  232. // CHECK: @APP
  233. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  234. // CHECK: @NO_APP
  235. check!(dreg_low16_i64x1 i64x1 dreg_low16 "vmov.f64");
  236. // CHECK-LABEL: dreg_low16_f32x2:
  237. // CHECK: @APP
  238. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  239. // CHECK: @NO_APP
  240. check!(dreg_low16_f32x2 f32x2 dreg_low16 "vmov.f64");
  241. // CHECK-LABEL: dreg_low8_i64:
  242. // CHECK: @APP
  243. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  244. // CHECK: @NO_APP
  245. check!(dreg_low8_i64 i64 dreg_low8 "vmov.f64");
  246. // CHECK-LABEL: dreg_low8_f64:
  247. // CHECK: @APP
  248. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  249. // CHECK: @NO_APP
  250. check!(dreg_low8_f64 f64 dreg_low8 "vmov.f64");
  251. // CHECK-LABEL: dreg_low8_i8x8:
  252. // CHECK: @APP
  253. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  254. // CHECK: @NO_APP
  255. check!(dreg_low8_i8x8 i8x8 dreg_low8 "vmov.f64");
  256. // CHECK-LABEL: dreg_low8_i16x4:
  257. // CHECK: @APP
  258. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  259. // CHECK: @NO_APP
  260. check!(dreg_low8_i16x4 i16x4 dreg_low8 "vmov.f64");
  261. // CHECK-LABEL: dreg_low8_i32x2:
  262. // CHECK: @APP
  263. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  264. // CHECK: @NO_APP
  265. check!(dreg_low8_i32x2 i32x2 dreg_low8 "vmov.f64");
  266. // CHECK-LABEL: dreg_low8_i64x1:
  267. // CHECK: @APP
  268. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  269. // CHECK: @NO_APP
  270. check!(dreg_low8_i64x1 i64x1 dreg_low8 "vmov.f64");
  271. // CHECK-LABEL: dreg_low8_f32x2:
  272. // CHECK: @APP
  273. // CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
  274. // CHECK: @NO_APP
  275. check!(dreg_low8_f32x2 f32x2 dreg_low8 "vmov.f64");
  276. // CHECK-LABEL: qreg_i8x16:
  277. // CHECK: @APP
  278. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  279. // CHECK: @NO_APP
  280. check!(qreg_i8x16 i8x16 qreg "vmov");
  281. // CHECK-LABEL: qreg_i16x8:
  282. // CHECK: @APP
  283. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  284. // CHECK: @NO_APP
  285. check!(qreg_i16x8 i16x8 qreg "vmov");
  286. // CHECK-LABEL: qreg_i32x4:
  287. // CHECK: @APP
  288. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  289. // CHECK: @NO_APP
  290. check!(qreg_i32x4 i32x4 qreg "vmov");
  291. // CHECK-LABEL: qreg_i64x2:
  292. // CHECK: @APP
  293. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  294. // CHECK: @NO_APP
  295. check!(qreg_i64x2 i64x2 qreg "vmov");
  296. // CHECK-LABEL: qreg_f32x4:
  297. // CHECK: @APP
  298. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  299. // CHECK: @NO_APP
  300. check!(qreg_f32x4 f32x4 qreg "vmov");
  301. // CHECK-LABEL: qreg_low8_i8x16:
  302. // CHECK: @APP
  303. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  304. // CHECK: @NO_APP
  305. check!(qreg_low8_i8x16 i8x16 qreg_low8 "vmov");
  306. // CHECK-LABEL: qreg_low8_i16x8:
  307. // CHECK: @APP
  308. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  309. // CHECK: @NO_APP
  310. check!(qreg_low8_i16x8 i16x8 qreg_low8 "vmov");
  311. // CHECK-LABEL: qreg_low8_i32x4:
  312. // CHECK: @APP
  313. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  314. // CHECK: @NO_APP
  315. check!(qreg_low8_i32x4 i32x4 qreg_low8 "vmov");
  316. // CHECK-LABEL: qreg_low8_i64x2:
  317. // CHECK: @APP
  318. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  319. // CHECK: @NO_APP
  320. check!(qreg_low8_i64x2 i64x2 qreg_low8 "vmov");
  321. // CHECK-LABEL: qreg_low8_f32x4:
  322. // CHECK: @APP
  323. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  324. // CHECK: @NO_APP
  325. check!(qreg_low8_f32x4 f32x4 qreg_low8 "vmov");
  326. // CHECK-LABEL: qreg_low4_i8x16:
  327. // CHECK: @APP
  328. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  329. // CHECK: @NO_APP
  330. check!(qreg_low4_i8x16 i8x16 qreg_low4 "vmov");
  331. // CHECK-LABEL: qreg_low4_i16x8:
  332. // CHECK: @APP
  333. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  334. // CHECK: @NO_APP
  335. check!(qreg_low4_i16x8 i16x8 qreg_low4 "vmov");
  336. // CHECK-LABEL: qreg_low4_i32x4:
  337. // CHECK: @APP
  338. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  339. // CHECK: @NO_APP
  340. check!(qreg_low4_i32x4 i32x4 qreg_low4 "vmov");
  341. // CHECK-LABEL: qreg_low4_i64x2:
  342. // CHECK: @APP
  343. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  344. // CHECK: @NO_APP
  345. check!(qreg_low4_i64x2 i64x2 qreg_low4 "vmov");
  346. // CHECK-LABEL: qreg_low4_f32x4:
  347. // CHECK: @APP
  348. // CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
  349. // CHECK: @NO_APP
  350. check!(qreg_low4_f32x4 f32x4 qreg_low4 "vmov");
  351. // CHECK-LABEL: r0_i8:
  352. // CHECK: @APP
  353. // CHECK: mov r0, r0
  354. // CHECK: @NO_APP
  355. check_reg!(r0_i8 i8 "r0" "mov");
  356. // CHECK-LABEL: r0_i16:
  357. // CHECK: @APP
  358. // CHECK: mov r0, r0
  359. // CHECK: @NO_APP
  360. check_reg!(r0_i16 i16 "r0" "mov");
  361. // CHECK-LABEL: r0_i32:
  362. // CHECK: @APP
  363. // CHECK: mov r0, r0
  364. // CHECK: @NO_APP
  365. check_reg!(r0_i32 i32 "r0" "mov");
  366. // CHECK-LABEL: r0_f32:
  367. // CHECK: @APP
  368. // CHECK: mov r0, r0
  369. // CHECK: @NO_APP
  370. check_reg!(r0_f32 f32 "r0" "mov");
  371. // CHECK-LABEL: r0_ptr:
  372. // CHECK: @APP
  373. // CHECK: mov r0, r0
  374. // CHECK: @NO_APP
  375. check_reg!(r0_ptr ptr "r0" "mov");
  376. // CHECK-LABEL: s0_i32:
  377. // CHECK: @APP
  378. // CHECK: vmov.f32 s0, s0
  379. // CHECK: @NO_APP
  380. check_reg!(s0_i32 i32 "s0" "vmov.f32");
  381. // CHECK-LABEL: s0_f32:
  382. // CHECK: @APP
  383. // CHECK: vmov.f32 s0, s0
  384. // CHECK: @NO_APP
  385. check_reg!(s0_f32 f32 "s0" "vmov.f32");
  386. // CHECK-LABEL: s0_ptr:
  387. // CHECK: @APP
  388. // CHECK: vmov.f32 s0, s0
  389. // CHECK: @NO_APP
  390. check_reg!(s0_ptr ptr "s0" "vmov.f32");
  391. // CHECK-LABEL: d0_i64:
  392. // CHECK: @APP
  393. // CHECK: vmov.f64 d0, d0
  394. // CHECK: @NO_APP
  395. check_reg!(d0_i64 i64 "d0" "vmov.f64");
  396. // CHECK-LABEL: d0_f64:
  397. // CHECK: @APP
  398. // CHECK: vmov.f64 d0, d0
  399. // CHECK: @NO_APP
  400. check_reg!(d0_f64 f64 "d0" "vmov.f64");
  401. // CHECK-LABEL: d0_i8x8:
  402. // CHECK: @APP
  403. // CHECK: vmov.f64 d0, d0
  404. // CHECK: @NO_APP
  405. check_reg!(d0_i8x8 i8x8 "d0" "vmov.f64");
  406. // CHECK-LABEL: d0_i16x4:
  407. // CHECK: @APP
  408. // CHECK: vmov.f64 d0, d0
  409. // CHECK: @NO_APP
  410. check_reg!(d0_i16x4 i16x4 "d0" "vmov.f64");
  411. // CHECK-LABEL: d0_i32x2:
  412. // CHECK: @APP
  413. // CHECK: vmov.f64 d0, d0
  414. // CHECK: @NO_APP
  415. check_reg!(d0_i32x2 i32x2 "d0" "vmov.f64");
  416. // CHECK-LABEL: d0_i64x1:
  417. // CHECK: @APP
  418. // CHECK: vmov.f64 d0, d0
  419. // CHECK: @NO_APP
  420. check_reg!(d0_i64x1 i64x1 "d0" "vmov.f64");
  421. // CHECK-LABEL: d0_f32x2:
  422. // CHECK: @APP
  423. // CHECK: vmov.f64 d0, d0
  424. // CHECK: @NO_APP
  425. check_reg!(d0_f32x2 f32x2 "d0" "vmov.f64");
  426. // CHECK-LABEL: q0_i8x16:
  427. // CHECK: @APP
  428. // CHECK: vorr q0, q0, q0
  429. // CHECK: @NO_APP
  430. check_reg!(q0_i8x16 i8x16 "q0" "vmov");
  431. // CHECK-LABEL: q0_i16x8:
  432. // CHECK: @APP
  433. // CHECK: vorr q0, q0, q0
  434. // CHECK: @NO_APP
  435. check_reg!(q0_i16x8 i16x8 "q0" "vmov");
  436. // CHECK-LABEL: q0_i32x4:
  437. // CHECK: @APP
  438. // CHECK: vorr q0, q0, q0
  439. // CHECK: @NO_APP
  440. check_reg!(q0_i32x4 i32x4 "q0" "vmov");
  441. // CHECK-LABEL: q0_i64x2:
  442. // CHECK: @APP
  443. // CHECK: vorr q0, q0, q0
  444. // CHECK: @NO_APP
  445. check_reg!(q0_i64x2 i64x2 "q0" "vmov");
  446. // CHECK-LABEL: q0_f32x4:
  447. // CHECK: @APP
  448. // CHECK: vorr q0, q0, q0
  449. // CHECK: @NO_APP
  450. check_reg!(q0_f32x4 f32x4 "q0" "vmov");