diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2015-08-28 22:43:38 -0700 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2015-08-29 15:36:17 -0700 |
| commit | 24416a21515c41d0e34a85535407663e635b76f3 (patch) | |
| tree | 79028f1384e6b272a4cab5bac9d13d71321856cc /src/etc | |
| parent | 5a167bdb4c47c867c07160f635c3b8e867ea8baa (diff) | |
Autogenerate most x86 platform intrinsics.
Diffstat (limited to 'src/etc')
| -rw-r--r-- | src/etc/platform-intrinsics/x86/avx.json | 152 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/avx2.json | 145 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/info.json | 28 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/sse.json | 40 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/sse2.json | 110 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/sse3.json | 26 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/sse41.json | 75 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/sse42.json | 103 | ||||
| -rw-r--r-- | src/etc/platform-intrinsics/x86/ssse3.json | 68 |
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"] + } + ] +} |
