/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log2.rs

https://gitlab.com/rust-lang/rust · Rust · 92 lines · 60 code · 17 blank · 15 comment · 0 complexity · 385a42e3b7a0dd0bf63347e8090cfead MD5 · raw file

  1. // compile-flags: -C no-prepopulate-passes
  2. #![crate_type = "lib"]
  3. #![feature(repr_simd, platform_intrinsics)]
  4. #![allow(non_camel_case_types)]
  5. #[repr(simd)]
  6. #[derive(Copy, Clone, PartialEq, Debug)]
  7. pub struct f32x2(pub f32, pub f32);
  8. #[repr(simd)]
  9. #[derive(Copy, Clone, PartialEq, Debug)]
  10. pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
  11. #[repr(simd)]
  12. #[derive(Copy, Clone, PartialEq, Debug)]
  13. pub struct f32x8(pub f32, pub f32, pub f32, pub f32,
  14. pub f32, pub f32, pub f32, pub f32);
  15. #[repr(simd)]
  16. #[derive(Copy, Clone, PartialEq, Debug)]
  17. pub struct f32x16(pub f32, pub f32, pub f32, pub f32,
  18. pub f32, pub f32, pub f32, pub f32,
  19. pub f32, pub f32, pub f32, pub f32,
  20. pub f32, pub f32, pub f32, pub f32);
  21. extern "platform-intrinsic" {
  22. fn simd_flog2<T>(x: T) -> T;
  23. }
  24. // CHECK-LABEL: @log2_32x2
  25. #[no_mangle]
  26. pub unsafe fn log2_32x2(a: f32x2) -> f32x2 {
  27. // CHECK: call <2 x float> @llvm.log2.v2f32
  28. simd_flog2(a)
  29. }
  30. // CHECK-LABEL: @log2_32x4
  31. #[no_mangle]
  32. pub unsafe fn log2_32x4(a: f32x4) -> f32x4 {
  33. // CHECK: call <4 x float> @llvm.log2.v4f32
  34. simd_flog2(a)
  35. }
  36. // CHECK-LABEL: @log2_32x8
  37. #[no_mangle]
  38. pub unsafe fn log2_32x8(a: f32x8) -> f32x8 {
  39. // CHECK: call <8 x float> @llvm.log2.v8f32
  40. simd_flog2(a)
  41. }
  42. // CHECK-LABEL: @log2_32x16
  43. #[no_mangle]
  44. pub unsafe fn log2_32x16(a: f32x16) -> f32x16 {
  45. // CHECK: call <16 x float> @llvm.log2.v16f32
  46. simd_flog2(a)
  47. }
  48. #[repr(simd)]
  49. #[derive(Copy, Clone, PartialEq, Debug)]
  50. pub struct f64x2(pub f64, pub f64);
  51. #[repr(simd)]
  52. #[derive(Copy, Clone, PartialEq, Debug)]
  53. pub struct f64x4(pub f64, pub f64, pub f64, pub f64);
  54. #[repr(simd)]
  55. #[derive(Copy, Clone, PartialEq, Debug)]
  56. pub struct f64x8(pub f64, pub f64, pub f64, pub f64,
  57. pub f64, pub f64, pub f64, pub f64);
  58. // CHECK-LABEL: @log2_64x4
  59. #[no_mangle]
  60. pub unsafe fn log2_64x4(a: f64x4) -> f64x4 {
  61. // CHECK: call <4 x double> @llvm.log2.v4f64
  62. simd_flog2(a)
  63. }
  64. // CHECK-LABEL: @log2_64x2
  65. #[no_mangle]
  66. pub unsafe fn log2_64x2(a: f64x2) -> f64x2 {
  67. // CHECK: call <2 x double> @llvm.log2.v2f64
  68. simd_flog2(a)
  69. }
  70. // CHECK-LABEL: @log2_64x8
  71. #[no_mangle]
  72. pub unsafe fn log2_64x8(a: f64x8) -> f64x8 {
  73. // CHECK: call <8 x double> @llvm.log2.v8f64
  74. simd_flog2(a)
  75. }