about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRuud van Asseldonk <ruuda@google.com>2016-03-08 21:41:18 +0100
committerRuud van Asseldonk <ruuda@google.com>2016-03-09 01:18:46 +0100
commit37efeae8866c3c4d9827d0ca271b8e27f731c3e1 (patch)
tree09f10eaabf92db271df0b618cad0af4b26051541
parent8f0479b2a5fc16814b68efe9e87dddf231b8941d (diff)
Define AVX broadcast intrinsics
This defines `_mm256_broadcast_ps` and `_mm256_broadcast_pd`. The `_ss`
and `_sd` variants are not supported by LLVM. In Clang these intrinsics
are implemented as inline functions in C++.

Intel reference: https://software.intel.com/en-us/node/514144.

Note: the argument type should really be "0hPc" (a pointer to a vector
of half the width), but internally the LLVM intrinsic takes a pointer to
a signed integer, and for any other type LLVM will complain. This means
that a transmute is required to call these intrinsics.

The AVX2 broadcast intrinsics `_mm256_broadcastss_ps` and
`_mm256_broadcastsd_pd` are not available as LLVM intrinsics. In Clang
they are implemented using the shufflevector builtin.
-rw-r--r--src/etc/platform-intrinsics/x86/avx.json7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json
index 2c1492c2954..981838536b2 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_broadcast_{0.data_type}",
+            "width": [256],
+            "llvm": "vbroadcastf128.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["s8SPc"]
+        },
+        {
             "intrinsic": "256_dp_ps",
             "width": [256],
             "llvm": "dp.ps.256",