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

https://gitlab.com/rust-lang/rust · Rust · 208 lines · 80 code · 32 blank · 96 comment · 8 complexity · 7a5dcb6d40405fda376b30f58fba552a MD5 · raw file

  1. // min-llvm-version: 12.0.1
  2. // revisions: powerpc powerpc64
  3. // assembly-output: emit-asm
  4. //[powerpc] compile-flags: --target powerpc-unknown-linux-gnu
  5. //[powerpc] needs-llvm-components: powerpc
  6. //[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu
  7. //[powerpc64] needs-llvm-components: powerpc
  8. #![feature(no_core, lang_items, rustc_attrs, repr_simd, asm_sym, asm_experimental_arch)]
  9. #![crate_type = "rlib"]
  10. #![no_core]
  11. #![allow(asm_sub_register, non_camel_case_types)]
  12. #[rustc_builtin_macro]
  13. macro_rules! asm {
  14. () => {};
  15. }
  16. #[rustc_builtin_macro]
  17. macro_rules! concat {
  18. () => {};
  19. }
  20. #[rustc_builtin_macro]
  21. macro_rules! stringify {
  22. () => {};
  23. }
  24. #[lang = "sized"]
  25. trait Sized {}
  26. #[lang = "copy"]
  27. trait Copy {}
  28. type ptr = *const i32;
  29. impl Copy for i8 {}
  30. impl Copy for u8 {}
  31. impl Copy for i16 {}
  32. impl Copy for i32 {}
  33. impl Copy for i64 {}
  34. impl Copy for f32 {}
  35. impl Copy for f64 {}
  36. impl Copy for ptr {}
  37. extern "C" {
  38. fn extern_func();
  39. static extern_static: u8;
  40. }
  41. // Hack to avoid function merging
  42. extern "Rust" {
  43. fn dont_merge(s: &str);
  44. }
  45. macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
  46. #[no_mangle]
  47. pub unsafe fn $func(x: $ty) -> $ty {
  48. dont_merge(stringify!($func));
  49. let y;
  50. asm!(concat!($mov," {}, {}"), out($class) y, in($class) x);
  51. y
  52. }
  53. };}
  54. macro_rules! check_reg { ($func:ident, $ty:ty, $rego:tt, $regc:tt, $mov:literal) => {
  55. #[no_mangle]
  56. pub unsafe fn $func(x: $ty) -> $ty {
  57. dont_merge(stringify!($func));
  58. let y;
  59. asm!(concat!($mov, " ", $rego, ", ", $rego), lateout($regc) y, in($regc) x);
  60. y
  61. }
  62. };}
  63. // CHECK-LABEL: reg_i8:
  64. // CHECK: #APP
  65. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  66. // CHECK: #NO_APP
  67. check!(reg_i8, i8, reg, "mr");
  68. // CHECK-LABEL: reg_i16:
  69. // CHECK: #APP
  70. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  71. // CHECK: #NO_APP
  72. check!(reg_i16, i16, reg, "mr");
  73. // CHECK-LABEL: reg_i32:
  74. // CHECK: #APP
  75. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  76. // CHECK: #NO_APP
  77. check!(reg_i32, i32, reg, "mr");
  78. // powerpc64-LABEL: reg_i64:
  79. // powerpc64: #APP
  80. // powerpc64: mr {{[0-9]+}}, {{[0-9]+}}
  81. // powerpc64: #NO_APP
  82. #[cfg(powerpc64)]
  83. check!(reg_i64, i64, reg, "mr");
  84. // CHECK-LABEL: reg_i8_nz:
  85. // CHECK: #APP
  86. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  87. // CHECK: #NO_APP
  88. check!(reg_i8_nz, i8, reg_nonzero, "mr");
  89. // CHECK-LABEL: reg_i16_nz:
  90. // CHECK: #APP
  91. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  92. // CHECK: #NO_APP
  93. check!(reg_i16_nz, i16, reg_nonzero, "mr");
  94. // CHECK-LABEL: reg_i32_nz:
  95. // CHECK: #APP
  96. // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
  97. // CHECK: #NO_APP
  98. check!(reg_i32_nz, i32, reg_nonzero, "mr");
  99. // powerpc64-LABEL: reg_i64_nz:
  100. // powerpc64: #APP
  101. // powerpc64: mr {{[0-9]+}}, {{[0-9]+}}
  102. // powerpc64: #NO_APP
  103. #[cfg(powerpc64)]
  104. check!(reg_i64_nz, i64, reg_nonzero, "mr");
  105. // CHECK-LABEL: reg_f32:
  106. // CHECK: #APP
  107. // CHECK: fmr {{[0-9]+}}, {{[0-9]+}}
  108. // CHECK: #NO_APP
  109. check!(reg_f32, f32, freg, "fmr");
  110. // CHECK-LABEL: reg_f64:
  111. // CHECK: #APP
  112. // CHECK: fmr {{[0-9]+}}, {{[0-9]+}}
  113. // CHECK: #NO_APP
  114. check!(reg_f64, f64, freg, "fmr");
  115. // CHECK-LABEL: reg_i8_r0:
  116. // CHECK: #APP
  117. // CHECK: mr 0, 0
  118. // CHECK: #NO_APP
  119. check_reg!(reg_i8_r0, i8, "0", "0", "mr");
  120. // CHECK-LABEL: reg_i16_r0:
  121. // CHECK: #APP
  122. // CHECK: mr 0, 0
  123. // CHECK: #NO_APP
  124. check_reg!(reg_i16_r0, i16, "0", "0", "mr");
  125. // CHECK-LABEL: reg_i32_r0:
  126. // CHECK: #APP
  127. // CHECK: mr 0, 0
  128. // CHECK: #NO_APP
  129. check_reg!(reg_i32_r0, i32, "0", "0", "mr");
  130. // powerpc64-LABEL: reg_i64_r0:
  131. // powerpc64: #APP
  132. // powerpc64: mr 0, 0
  133. // powerpc64: #NO_APP
  134. #[cfg(powerpc64)]
  135. check_reg!(reg_i64_r0, i64, "0", "0", "mr");
  136. // CHECK-LABEL: reg_i8_r18:
  137. // CHECK: #APP
  138. // CHECK: mr 18, 18
  139. // CHECK: #NO_APP
  140. check_reg!(reg_i8_r18, i8, "18", "18", "mr");
  141. // CHECK-LABEL: reg_i16_r18:
  142. // CHECK: #APP
  143. // CHECK: mr 18, 18
  144. // CHECK: #NO_APP
  145. check_reg!(reg_i16_r18, i16, "18", "18", "mr");
  146. // CHECK-LABEL: reg_i32_r18:
  147. // CHECK: #APP
  148. // CHECK: mr 18, 18
  149. // CHECK: #NO_APP
  150. check_reg!(reg_i32_r18, i32, "18", "18", "mr");
  151. // powerpc64-LABEL: reg_i64_r18:
  152. // powerpc64: #APP
  153. // powerpc64: mr 18, 18
  154. // powerpc64: #NO_APP
  155. #[cfg(powerpc64)]
  156. check_reg!(reg_i64_r18, i64, "18", "18", "mr");
  157. // CHECK-LABEL: reg_f32_f0:
  158. // CHECK: #APP
  159. // CHECK: fmr 0, 0
  160. // CHECK: #NO_APP
  161. check_reg!(reg_f32_f0, f32, "0", "f0", "fmr");
  162. // CHECK-LABEL: reg_f64_f0:
  163. // CHECK: #APP
  164. // CHECK: fmr 0, 0
  165. // CHECK: #NO_APP
  166. check_reg!(reg_f64_f0, f64, "0", "f0", "fmr");
  167. // CHECK-LABEL: reg_f32_f18:
  168. // CHECK: #APP
  169. // CHECK: fmr 18, 18
  170. // CHECK: #NO_APP
  171. check_reg!(reg_f32_f18, f32, "18", "f18", "fmr");
  172. // CHECK-LABEL: reg_f64_f18:
  173. // CHECK: #APP
  174. // CHECK: fmr 18, 18
  175. // CHECK: #NO_APP
  176. check_reg!(reg_f64_f18, f64, "18", "f18", "fmr");