about summary refs log tree commit diff
path: root/src/etc
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2015-08-28 22:43:38 -0700
committerHuon Wilson <dbau.pp+github@gmail.com>2015-08-29 15:36:17 -0700
commit24416a21515c41d0e34a85535407663e635b76f3 (patch)
tree79028f1384e6b272a4cab5bac9d13d71321856cc /src/etc
parent5a167bdb4c47c867c07160f635c3b8e867ea8baa (diff)
Autogenerate most x86 platform intrinsics.
Diffstat (limited to 'src/etc')
-rw-r--r--src/etc/platform-intrinsics/x86/avx.json152
-rw-r--r--src/etc/platform-intrinsics/x86/avx2.json145
-rw-r--r--src/etc/platform-intrinsics/x86/info.json28
-rw-r--r--src/etc/platform-intrinsics/x86/sse.json40
-rw-r--r--src/etc/platform-intrinsics/x86/sse2.json110
-rw-r--r--src/etc/platform-intrinsics/x86/sse3.json26
-rw-r--r--src/etc/platform-intrinsics/x86/sse41.json75
-rw-r--r--src/etc/platform-intrinsics/x86/sse42.json103
-rw-r--r--src/etc/platform-intrinsics/x86/ssse3.json68
9 files changed, 747 insertions, 0 deletions
diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json
new file mode 100644
index 00000000000..7d6a07f7550
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/avx.json
@@ -0,0 +1,152 @@
+{
+    "llvm_prefix": "llvm.x86.avx.",
+    "intrinsics": [
+        {
+            "intrinsic": "256_addsub_{0.data_type}",
+            "width": [256],
+            "llvm": "addsub.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_dp_ps",
+            "width": [256],
+            "llvm": "dp.ps.256",
+            "ret": "f32",
+            "args": ["0", "0", "S32"]
+        },
+        {
+            "intrinsic": "256_hadd_{0.data_type}",
+            "width": [256],
+            "llvm": "hadd.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_hsub_{0.data_type}",
+            "width": [256],
+            "llvm": "hsub.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_max_{0.data_type}",
+            "width": [256],
+            "llvm": "max.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_min_{0.data_type}",
+            "width": [256],
+            "llvm": "min.{0.data_type}.256",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_movemask_ps",
+            "width": [256],
+            "llvm": "movmsk.ps.256",
+            "ret": "S32",
+            "args": ["f32"]
+        },
+        {
+            "intrinsic": "256_movemask_pd",
+            "width": [256],
+            "llvm": "movmsk.pd.256",
+            "ret": "S32",
+            "args": ["f64"]
+        },
+        {
+            "intrinsic": "{0.width_mm}_permutevar_{0.data_type}",
+            "width": [128, 256],
+            "llvm": "vpermilvar.{0.data_type}{0.width_suffix}",
+            "ret": "f(32-64)",
+            "args": ["0", "0s"]
+        },
+        {
+            "intrinsic": "256_rcp_ps",
+            "width": [256],
+            "llvm": "rcp.ps.256",
+            "ret": "f32",
+            "args": ["f32"]
+        },
+        {
+            "intrinsic": "256_rsqrt_ps",
+            "width": [256],
+            "llvm": "rsqrt.ps.256",
+            "ret": "f32",
+            "args": ["f32"]
+        },
+        {
+            "intrinsic": "256_sqrt_{0.data_type}",
+            "width": [256],
+            "llvm": "!llvm.sqrt.{0.llvm_name}",
+            "ret": "f(32-64)",
+            "args": ["0"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testc_ps",
+            "width": [128, 256],
+            "llvm": "vtestc.ps{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f32", "f32"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testc_pd",
+            "width": [128, 256],
+            "llvm": "vtestc.pd{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f64", "f64"]
+        },
+        {
+            "intrinsic": "256_testc_si256",
+            "width": [256],
+            "llvm": "ptestc.256",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testnzc_ps",
+            "width": [128, 256],
+            "llvm": "vtestnzc.ps{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f32", "f32"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testnzc_pd",
+            "width": [128, 256],
+            "llvm": "vtestnzc.pd{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f64", "f64"]
+        },
+        {
+            "intrinsic": "256_testnzc_si256",
+            "width": [256],
+            "llvm": "ptestnzc.256",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testz_ps",
+            "width": [128, 256],
+            "llvm": "vtestz.ps{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f32", "f32"]
+        },
+        {
+            "intrinsic": "{1.width_mm}_testz_pd",
+            "width": [128, 256],
+            "llvm": "vtestz.pd{1.width_suffix}",
+            "ret": "S32",
+            "args": ["f64", "f64"]
+        },
+        {
+            "intrinsic": "256_testz_si256",
+            "width": [256],
+            "llvm": "ptestz.256",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/avx2.json b/src/etc/platform-intrinsics/x86/avx2.json
new file mode 100644
index 00000000000..8b0e53e48cf
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/avx2.json
@@ -0,0 +1,145 @@
+{
+    "llvm_prefix": "llvm.x86.avx2.",
+    "intrinsics": [
+        {
+            "intrinsic": "256_abs_{0.data_type}",
+            "width": [256],
+            "llvm": "avx2.pabs.{0.data_type_short}",
+            "ret": "s(8-32)",
+            "args": ["0"]
+        },
+        {
+            "intrinsic": "256_adds_{0.data_type}",
+            "width": [256],
+            "llvm": "avx2.padd{0.kind_short}s.{0.data_type_short}",
+            "ret": "i(8-16)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_avg_{0.data_type}",
+            "width": [256],
+            "llvm": "avx2.pavg.{0.data_type_short}",
+            "ret": "u(8-16)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_hadd_{0.data_type}",
+            "width": [256],
+            "llvm": "phadd.{0.data_type_short}",
+            "ret": "s(16-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_hadds_epi16",
+            "width": [256],
+            "llvm": "phadd.sw",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_hsub_{0.data_type}",
+            "width": [256],
+            "llvm": "phsub.{0.data_type_short}",
+            "ret": "s(16-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_hsubs_epi16",
+            "width": [256],
+            "llvm": "phsub.sw",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_madd_epi16",
+            "width": [256],
+            "llvm": "pmadd.wd",
+            "ret": "s32",
+            "args": ["s16", "s16"]
+        },
+        {
+            "intrinsic": "256_maddubs_epi16",
+            "width": [256],
+            "llvm": "pmadd.ub.sw",
+            "ret": "s16",
+            "args": ["s8", "s8"]
+        },
+        {
+            "intrinsic": "256_max_{0.data_type}",
+            "width": [256],
+            "llvm": "pmax{0.kind}.{0.data_type_short}",
+            "ret": "i(8-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_min_{0.data_type}",
+            "width": [256],
+            "llvm": "pmin{0.kind}.{0.data_type_short}",
+            "ret": "i(8-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_mul_{0.data_type}",
+            "width": [256],
+            "llvm": "pmul{0.data_type_short}.dq",
+            "ret": "i64",
+            "args": ["0dn", "0dn"]
+        },
+        {
+            "intrinsic": "256_mulhi_{0.data_type}",
+            "width": [256],
+            "llvm": "pmulh{0.data_type_short}.w",
+            "ret": "i16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_mulhrs_epi16",
+            "width": [256],
+            "llvm": "pmul.hr.sw",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_pack{0.kind_short}s_{1.data_type}",
+            "width": [256],
+            "llvm": "pack{0.kind}s{1.data_type_short}{0.data_type_short}",
+            "ret": "i(8-16)",
+            "args": ["0hws", "0hws"]
+        },
+        {
+            "intrinsic": "256_permutevar8x32_{0.data_type}",
+            "width": [256],
+            "llvm": "perm{0.data_type_short}",
+            "ret": ["s32", "f32"],
+            "args": ["0", "0s"]
+        },
+        {
+            "intrinsic": "256_sad_epu8",
+            "width": [256],
+            "llvm": "psad.bw",
+            "ret": "u8",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_shuffle_epi8",
+            "width": [256],
+            "llvm": "pshuf.b",
+            "ret": "s8",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_sign_{0.data_type}",
+            "width": [256],
+            "llvm": "psign.{0.data_type_short}",
+            "ret": "s(8-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "256_subs_{0.data_type}",
+            "width": [256],
+            "llvm": "psub{0.kind_short}s.{0.data_type_short}",
+            "ret": "i(8-16)",
+            "args": ["0", "0"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/info.json b/src/etc/platform-intrinsics/x86/info.json
new file mode 100644
index 00000000000..d48bcd268a0
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/info.json
@@ -0,0 +1,28 @@
+{
+    "platform": "x86",
+    "intrinsic_prefix": "x86_mm",
+    "number_info": {
+        "signed": {
+            "kind": "s",
+            "kind_short": "",
+            "data_type": { "pattern": "epi{bitwidth}" },
+            "data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
+        },
+        "unsigned": {
+            "kind": "u",
+            "kind_short": "u",
+            "data_type": { "pattern": "epu{bitwidth}" },
+            "data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
+        },
+        "float": {
+            "kind": "f",
+            "data_type": { "32": "ps", "64": "pd" },
+            "data_type_short": { "32": "ps", "64": "pd" }
+        }
+    },
+    "width_info": {
+        "128": { "width_mm": "", "width_suffix": "" },
+        "256": { "width_mm": "256", "width_suffix": ".256" },
+        "512": { "width_mm": "512", "width_suffix": ".512" }
+    }
+}
diff --git a/src/etc/platform-intrinsics/x86/sse.json b/src/etc/platform-intrinsics/x86/sse.json
new file mode 100644
index 00000000000..144d326ffd0
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/sse.json
@@ -0,0 +1,40 @@
+{
+    "llvm_prefix": "llvm.x86.sse.",
+    "intrinsics": [
+        {
+            "intrinsic": "_movemask_ps",
+            "width": [128],
+            "llvm": "movmsk.ps",
+            "ret": "S32",
+            "args": ["f32"]
+        },
+        {
+            "intrinsic": "_max_ps",
+            "width": [128],
+            "llvm": "max.ps",
+            "ret": "f32",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_min_ps",
+            "width": [128],
+            "llvm": "min.ps",
+            "ret": "f32",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_rsqrt_ps",
+            "width": [128],
+            "llvm": "rsqrt.ps",
+            "ret": "f32",
+            "args": ["0"]
+        },
+        {
+            "intrinsic": "_rcp_ps",
+            "width": [128],
+            "llvm": "rcp.ps",
+            "ret": "f32",
+            "args": ["0"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/sse2.json b/src/etc/platform-intrinsics/x86/sse2.json
new file mode 100644
index 00000000000..2a3db561097
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/sse2.json
@@ -0,0 +1,110 @@
+{
+    "llvm_prefix": "llvm.x86.sse2.",
+    "intrinsics": [
+        {
+            "intrinsic": "_adds_{0.data_type}",
+            "width": [128],
+            "llvm": "padd{0.kind_short}s.{0.data_type_short}",
+            "ret": "i(8-16)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_avg_{0.data_type}",
+            "width": [128],
+            "llvm": "pavg.{0.data_type_short}",
+            "ret": "u(8-16)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_madd_epi16",
+            "width": [128],
+            "llvm": "pmadd.wd",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_max_{0.data_type}",
+            "width": [128],
+            "llvm": "pmax{0.kind}.{0.data_type_short}",
+            "ret": ["s16", "u8"],
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_max_pd",
+            "width": [128],
+            "llvm": "max.pd",
+            "ret": "f64",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_min_{0.data_type}",
+            "width": [128],
+            "llvm": "pmin{0.kind}.{0.data_type_short}",
+            "ret": ["s16", "u8"],
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_min_pd",
+            "width": [128],
+            "llvm": "min.pd",
+            "ret": "f64",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_movemask_pd",
+            "width": [128],
+            "llvm": "movmsk.pd",
+            "ret": "S32",
+            "args": ["f64"]
+        },
+        {
+            "intrinsic": "_movemask_epi8",
+            "width": [128],
+            "llvm": "pmovmskb.128",
+            "ret": "S32",
+            "args": ["s8"]
+        },
+        {
+            "intrinsic": "_mul_epu32",
+            "width": [128],
+            "llvm": "pmulu.dq",
+            "ret": "s64",
+            "args": ["0dn", "0dn"]
+        },
+        {
+            "intrinsic": "_mulhi_ep{0.kind}16",
+            "width": [128],
+            "llvm": "pmulh{0.kind_short}.w",
+            "ret": "i16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_packs_{1.data_type}",
+            "width": [128],
+            "llvm": "packss{1.data_type_short}{0.data_type_short}.128",
+            "ret": "s(8-16)",
+            "args": ["0hw", "0hw"]
+        },
+        {
+            "intrinsic": "_packus_epi16",
+            "width": [128],
+            "llvm": "packuswb.128",
+            "ret": "u8",
+            "args": ["s16", "s16"]
+        },
+        {
+            "intrinsic": "_sad_epu8",
+            "width": [128],
+            "llvm": "psad.bw",
+            "ret": "u64",
+            "args": ["u8", "u8"]
+        },
+        {
+            "intrinsic": "_subs_{0.data_type}",
+            "width": [128],
+            "llvm": "psub{0.kind_short}s.{0.data_type_short}",
+            "ret": "i(8-16)",
+            "args": ["0", "0"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/sse3.json b/src/etc/platform-intrinsics/x86/sse3.json
new file mode 100644
index 00000000000..376e32fa915
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/sse3.json
@@ -0,0 +1,26 @@
+{
+    "llvm_prefix": "llvm.x86.sse3.",
+    "intrinsics": [
+        {
+            "intrinsic": "_addsub_{0.data_type}",
+            "width": [128],
+            "llvm": "addsub.{0.data_type}",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_hadd_{0.data_type}",
+            "width": [128],
+            "llvm": "hadd.{0.data_type}",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_hsub_{0.data_type}",
+            "width": [128],
+            "llvm": "hsub.{0.data_type}",
+            "ret": "f(32-64)",
+            "args": ["0", "0"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/sse41.json b/src/etc/platform-intrinsics/x86/sse41.json
new file mode 100644
index 00000000000..8610dc83bd6
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/sse41.json
@@ -0,0 +1,75 @@
+{
+    "llvm_prefix": "llvm.x86.sse41.",
+    "intrinsics": [
+        {
+            "intrinsic": "_dp_{0.data_type}",
+            "width": [128],
+            "llvm": "dp{0.data_type}",
+            "ret": "f(32-64)",
+            "args": ["0", "0", "S32"]
+        },
+        {
+            "intrinsic": "_max_{0.data_type}",
+            "width": [128],
+            "llvm": "pmax{0.kind}{0.data_type_short}",
+            "ret": ["s8", "u16", "i32"],
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_min_{0.data_type}",
+            "width": [128],
+            "llvm": "pmin{0.kind}{0.data_type_short}",
+            "ret": ["s8", "u16", "i32"],
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_minpos_epu16",
+            "width": [128],
+            "llvm": "phminposuw",
+            "ret": "u16",
+            "args": ["0"]
+        },
+        {
+            "intrinsic": "_mpsadbw_epu8",
+            "width": [128],
+            "llvm": "mpsadbw",
+            "ret": "u16",
+            "args": ["u8", "u8", "S32"]
+        },
+        {
+            "intrinsic": "_mul_epi32",
+            "width": [128],
+            "llvm": "muldq",
+            "ret": "s64",
+            "args": ["s32", "s32"]
+        },
+        {
+            "intrinsic": "_packus_epi32",
+            "width": [128],
+            "llvm": "packusdw",
+            "ret": "u16",
+            "args": ["s32", "s32"]
+        },
+        {
+            "intrinsic": "_testc_si128",
+            "width": [128],
+            "llvm": "ptestc",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        },
+        {
+            "intrinsic": "_testncz_si128",
+            "width": [128],
+            "llvm": "ptest.nzc",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        },
+        {
+            "intrinsic": "_testz_si128",
+            "width": [128],
+            "llvm": "ptestz",
+            "ret": "S32",
+            "args": ["u64", "u64"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/sse42.json b/src/etc/platform-intrinsics/x86/sse42.json
new file mode 100644
index 00000000000..2961405a055
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/sse42.json
@@ -0,0 +1,103 @@
+{
+    "llvm_prefix": "llvm.x86.sse42.",
+    "intrinsics": [
+        {
+            "intrinsic": "_cmpestra",
+            "width": [128],
+            "llvm": "pcmpestria128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestrc",
+            "width": [128],
+            "llvm": "pcmpestric128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestri",
+            "width": [128],
+            "llvm": "pcmpestri128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestrm",
+            "width": [128],
+            "llvm": "pcmpestrim128",
+            "ret": "s8",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestro",
+            "width": [128],
+            "llvm": "pcmpestrio128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestrs",
+            "width": [128],
+            "llvm": "pcmpestris128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpestrz",
+            "width": [128],
+            "llvm": "pcmpestriz128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistra",
+            "width": [128],
+            "llvm": "pcmpistria128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistrc",
+            "width": [128],
+            "llvm": "pcmpistric128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistri",
+            "width": [128],
+            "llvm": "pcmpistrii128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistrm",
+            "width": [128],
+            "llvm": "pcmpistrim128",
+            "ret": "s8",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistro",
+            "width": [128],
+            "llvm": "pcmpistrio128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistrs",
+            "width": [128],
+            "llvm": "pcmpistris128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        },
+        {
+            "intrinsic": "_cmpistrz",
+            "width": [128],
+            "llvm": "pcmpistriz128",
+            "ret": "S32",
+            "args": ["s8", "S32", "s8", "S32", "S32"]
+        }
+    ]
+}
diff --git a/src/etc/platform-intrinsics/x86/ssse3.json b/src/etc/platform-intrinsics/x86/ssse3.json
new file mode 100644
index 00000000000..bbe11380ff8
--- /dev/null
+++ b/src/etc/platform-intrinsics/x86/ssse3.json
@@ -0,0 +1,68 @@
+{
+    "llvm_prefix": "llvm.x86.ssse3.",
+    "intrinsics": [
+        {
+            "intrinsic": "_abs_{0.data_type}",
+            "width": [128],
+            "llvm": "pabs.{0.data_type_short}",
+            "ret": "s(8-32)",
+            "args": ["0"]
+        },
+        {
+            "intrinsic": "_hadd_{0.data_type}",
+            "width": [128],
+            "llvm": "phadd.{0.data_type_short}.128",
+            "ret": "s(16-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_hadds_epi16",
+            "width": [128],
+            "llvm": "phadd.sw.128",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_hsub_{0.data_type}",
+            "width": [128],
+            "llvm": "phsub.{0.data_type_short}.128",
+            "ret": "s(16-32)",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_hsubs_epi16",
+            "width": [128],
+            "llvm": "phsub.sw.128",
+            "ret": "s16",
+            "args": ["0", "0"]
+        },
+        {
+            "intrinsic": "_maddubs_epi16",
+            "width": [128],
+            "llvm": "pmadd.ub.sw.128",
+            "ret": "s16",
+            "args": ["s8", "s8"]
+        },
+        {
+            "intrinsic": "_mulhrs_epi16",
+            "width": [128],
+            "llvm": "pmul.hr.sw.128",
+            "ret": "s16",
+            "args": ["s16", "s16"]
+        },
+        {
+            "intrinsic": "_shuffle_epi8",
+            "width": [128],
+            "llvm": "pshuf.b.128",
+            "ret": "s8",
+            "args": ["s8", "s8"]
+        },
+        {
+            "intrinsic": "_sign_{0.data_type}",
+            "width": [128],
+            "llvm": "psign.{0.data_type_short}.128",
+            "ret": "s(8-16)",
+            "args": ["0", "0"]
+        }
+    ]
+}