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

https://gitlab.com/rust-lang/rust · Rust · 144 lines · 55 code · 22 blank · 67 comment · 4 complexity · 430f97a4e0eb7227f716882f4ad298b9 MD5 · raw file

  1. // assembly-output: emit-asm
  2. // compile-flags: -O
  3. // compile-flags: --target armv7-unknown-linux-gnueabihf
  4. // compile-flags: -C target-feature=+neon
  5. // needs-llvm-components: arm
  6. #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
  7. #![crate_type = "rlib"]
  8. #![no_core]
  9. #![allow(asm_sub_register, non_camel_case_types)]
  10. #[rustc_builtin_macro]
  11. macro_rules! asm {
  12. () => {};
  13. }
  14. #[rustc_builtin_macro]
  15. macro_rules! concat {
  16. () => {};
  17. }
  18. #[rustc_builtin_macro]
  19. macro_rules! stringify {
  20. () => {};
  21. }
  22. #[lang = "sized"]
  23. trait Sized {}
  24. #[lang = "copy"]
  25. trait Copy {}
  26. #[repr(simd)]
  27. pub struct f32x4(f32, f32, f32, f32);
  28. impl Copy for i32 {}
  29. impl Copy for f32 {}
  30. impl Copy for f64 {}
  31. impl Copy for f32x4 {}
  32. macro_rules! check {
  33. ($func:ident $modifier:literal $reg:ident $ty:ident $mov:literal) => {
  34. // -O and extern "C" guarantee that the selected register is always r0/s0/d0/q0
  35. #[no_mangle]
  36. pub unsafe extern "C" fn $func() -> $ty {
  37. // Hack to avoid function merging
  38. extern "Rust" {
  39. fn dont_merge(s: &str);
  40. }
  41. dont_merge(stringify!($func));
  42. let y;
  43. asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
  44. y
  45. }
  46. };
  47. }
  48. // CHECK-LABEL: reg:
  49. // CHECK: @APP
  50. // CHECK: mov r0, r0
  51. // CHECK: @NO_APP
  52. check!(reg "" reg i32 "mov");
  53. // CHECK-LABEL: sreg:
  54. // CHECK: @APP
  55. // CHECK: vmov.f32 s0, s0
  56. // CHECK: @NO_APP
  57. check!(sreg "" sreg f32 "vmov.f32");
  58. // CHECK-LABEL: sreg_low16:
  59. // CHECK: @APP
  60. // CHECK: vmov.f32 s0, s0
  61. // CHECK: @NO_APP
  62. check!(sreg_low16 "" sreg_low16 f32 "vmov.f32");
  63. // CHECK-LABEL: dreg:
  64. // CHECK: @APP
  65. // CHECK: vmov.f64 d0, d0
  66. // CHECK: @NO_APP
  67. check!(dreg "" dreg f64 "vmov.f64");
  68. // CHECK-LABEL: dreg_low16:
  69. // CHECK: @APP
  70. // CHECK: vmov.f64 d0, d0
  71. // CHECK: @NO_APP
  72. check!(dreg_low16 "" dreg_low16 f64 "vmov.f64");
  73. // CHECK-LABEL: dreg_low8:
  74. // CHECK: @APP
  75. // CHECK: vmov.f64 d0, d0
  76. // CHECK: @NO_APP
  77. check!(dreg_low8 "" dreg_low8 f64 "vmov.f64");
  78. // CHECK-LABEL: qreg:
  79. // CHECK: @APP
  80. // CHECK: vorr q0, q0, q0
  81. // CHECK: @NO_APP
  82. check!(qreg "" qreg f32x4 "vmov");
  83. // CHECK-LABEL: qreg_e:
  84. // CHECK: @APP
  85. // CHECK: vmov.f64 d0, d0
  86. // CHECK: @NO_APP
  87. check!(qreg_e "e" qreg f32x4 "vmov.f64");
  88. // CHECK-LABEL: qreg_f:
  89. // CHECK: @APP
  90. // CHECK: vmov.f64 d1, d1
  91. // CHECK: @NO_APP
  92. check!(qreg_f "f" qreg f32x4 "vmov.f64");
  93. // CHECK-LABEL: qreg_low8:
  94. // CHECK: @APP
  95. // CHECK: vorr q0, q0, q0
  96. // CHECK: @NO_APP
  97. check!(qreg_low8 "" qreg_low8 f32x4 "vmov");
  98. // CHECK-LABEL: qreg_low8_e:
  99. // CHECK: @APP
  100. // CHECK: vmov.f64 d0, d0
  101. // CHECK: @NO_APP
  102. check!(qreg_low8_e "e" qreg_low8 f32x4 "vmov.f64");
  103. // CHECK-LABEL: qreg_low8_f:
  104. // CHECK: @APP
  105. // CHECK: vmov.f64 d1, d1
  106. // CHECK: @NO_APP
  107. check!(qreg_low8_f "f" qreg_low8 f32x4 "vmov.f64");
  108. // CHECK-LABEL: qreg_low4:
  109. // CHECK: @APP
  110. // CHECK: vorr q0, q0, q0
  111. // CHECK: @NO_APP
  112. check!(qreg_low4 "" qreg_low4 f32x4 "vmov");
  113. // CHECK-LABEL: qreg_low4_e:
  114. // CHECK: @APP
  115. // CHECK: vmov.f64 d0, d0
  116. // CHECK: @NO_APP
  117. check!(qreg_low4_e "e" qreg_low4 f32x4 "vmov.f64");
  118. // CHECK-LABEL: qreg_low4_f:
  119. // CHECK: @APP
  120. // CHECK: vmov.f64 d1, d1
  121. // CHECK: @NO_APP
  122. check!(qreg_low4_f "f" qreg_low4 f32x4 "vmov.f64");