about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-03-14 00:30:53 -0700
committerbors <bors@rust-lang.org>2016-03-14 00:30:53 -0700
commit170f4708bb48234a2f1a089342b31a424ac94fa9 (patch)
tree0f8f20a165984d541ded4539a52c60f23b8ac578 /src
parent211296ddabb6a307a0f60af1cb93f39b85ba5bbd (diff)
parenta394d50490bc1f73afeed1d408f6153d267851b2 (diff)
downloadrust-170f4708bb48234a2f1a089342b31a424ac94fa9.tar.gz
rust-170f4708bb48234a2f1a089342b31a424ac94fa9.zip
Auto merge of #32231 - ruud-v-a:avx-cmp-blend, r=alexcrichton
Define AVX compare and blend intrinsics

This defines the following intrinsics:

 * `_mm256_blendv_pd`
 * `_mm256_blendv_ps`
 * `_mm256_cmp_pd`
 * `_mm256_cmp_ps`

I verified these locally.
Diffstat (limited to 'src')
-rw-r--r--src/etc/platform-intrinsics/x86/avx.json14
-rw-r--r--src/librustc_platform_intrinsics/x86.rs20
2 files changed, 34 insertions, 0 deletions
diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json
index 08524fbd6dd..05a4721aed8 100644
--- a/src/etc/platform-intrinsics/x86/avx.json
+++ b/src/etc/platform-intrinsics/x86/avx.json
@@ -9,6 +9,13 @@
             "args": ["0", "0"]
         },
         {
+            "intrinsic": "256_blendv_{0.data_type}",
+            "width": [256],
+            "llvm": "blendv.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0", "0"]
+        },
+        {
             "intrinsic": "256_broadcast_{0.data_type}",
             "width": [256],
             "llvm": "vbroadcastf128.{0.data_type}.256",
@@ -16,6 +23,13 @@
             "args": ["s8SPc"]
         },
         {
+            "intrinsic": "256_cmp_{0.data_type}",
+            "width": [256],
+            "llvm": "cmp.{1.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0", "s8S"]
+        },
+        {
             "intrinsic": "256_cvtepi32_pd",
             "width": [256],
             "llvm": "cvtdq2.pd.256",
diff --git a/src/librustc_platform_intrinsics/x86.rs b/src/librustc_platform_intrinsics/x86.rs
index d8aaf151267..c5d3e414c7c 100644
--- a/src/librustc_platform_intrinsics/x86.rs
+++ b/src/librustc_platform_intrinsics/x86.rs
@@ -498,6 +498,16 @@ pub fn find<'tcx>(_tcx: &TyCtxt<'tcx>, name: &str) -> Option<Intrinsic> {
             output: v(f(64), 4),
             definition: Named("llvm.x86.avx.addsub.pd.256")
         },
+        "256_blendv_ps" => Intrinsic {
+            inputs: vec![v(f(32), 8), v(f(32), 8), v(f(32), 8)],
+            output: v(f(32), 8),
+            definition: Named("llvm.x86.avx.blendv.ps.256")
+        },
+        "256_blendv_pd" => Intrinsic {
+            inputs: vec![v(f(64), 4), v(f(64), 4), v(f(64), 4)],
+            output: v(f(64), 4),
+            definition: Named("llvm.x86.avx.blendv.pd.256")
+        },
         "256_broadcast_ps" => Intrinsic {
             inputs: vec![p(true, i(8), None)],
             output: v(f(32), 8),
@@ -508,6 +518,16 @@ pub fn find<'tcx>(_tcx: &TyCtxt<'tcx>, name: &str) -> Option<Intrinsic> {
             output: v(f(64), 4),
             definition: Named("llvm.x86.avx.vbroadcastf128.pd.256")
         },
+        "256_cmp_ps" => Intrinsic {
+            inputs: vec![v(f(32), 8), v(f(32), 8), i(8)],
+            output: v(f(32), 8),
+            definition: Named("llvm.x86.avx.cmp.ps.256")
+        },
+        "256_cmp_pd" => Intrinsic {
+            inputs: vec![v(f(64), 4), v(f(64), 4), i(8)],
+            output: v(f(64), 4),
+            definition: Named("llvm.x86.avx.cmp.pd.256")
+        },
         "256_cvtepi32_pd" => Intrinsic {
             inputs: vec![v(i(32), 4)],
             output: v(f(64), 4),