diff options
| author | bors <bors@rust-lang.org> | 2016-03-12 16:18:34 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-12 16:18:34 -0800 |
| commit | 531b928ea65270a47aeb91c33a4ede447f152103 (patch) | |
| tree | 271fd3d4aa59b41b8edb7035daa012a1e077fc46 | |
| parent | a2c56de7643c3b989c703758f0fb9f426403bca2 (diff) | |
| parent | c306853edafb8b740c3e224ce4fa1842a6924dc5 (diff) | |
| download | rust-531b928ea65270a47aeb91c33a4ede447f152103.tar.gz rust-531b928ea65270a47aeb91c33a4ede447f152103.zip | |
Auto merge of #32140 - ruud-v-a:avx-intrinsics, r=alexcrichton
Add AVX broadcast and conversion intrinsics This adds the following intrinsics: * `_mm256_broadcast_pd` * `_mm256_broadcast_ps` * `_mm256_cvtepi32_pd` * `_mm256_cvtepi32_ps` * `_mm256_cvtpd_epi32` * `_mm256_cvtpd_ps` * `_mm256_cvtps_epi32` * `_mm256_cvtps_pd` * `_mm256_cvttpd_epi32` * `_mm256_cvttps_epi32` The "avx" codegen feature must be enabled to use these.
| -rw-r--r-- | src/etc/platform-intrinsics/x86/avx.json | 63 | ||||
| -rw-r--r-- | src/librustc_platform_intrinsics/x86.rs | 50 |
2 files changed, 113 insertions, 0 deletions
diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json index 2c1492c2954..08524fbd6dd 100644 --- a/src/etc/platform-intrinsics/x86/avx.json +++ b/src/etc/platform-intrinsics/x86/avx.json @@ -9,6 +9,69 @@ "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_cvtepi32_pd", + "width": [256], + "llvm": "cvtdq2.pd.256", + "ret": "f64", + "args": ["s32h"] + }, + { + "intrinsic": "256_cvtepi32_ps", + "width": [256], + "llvm": "cvtdq2.ps.256", + "ret": "f32", + "args": ["s32"] + }, + { + "intrinsic": "256_cvtpd_epi32", + "width": [256], + "llvm": "cvt.pd2dq.256", + "ret": "s32h", + "args": ["f64"] + }, + { + "intrinsic": "256_cvtpd_ps", + "width": [256], + "llvm": "cvt.pd2.ps.256", + "ret": "f32h", + "args": ["f64"] + }, + { + "intrinsic": "256_cvtps_epi32", + "width": [256], + "llvm": "cvt.ps2dq.256", + "ret": "s32", + "args": ["f32"] + }, + { + "intrinsic": "256_cvtps_pd", + "width": [256], + "llvm": "cvt.ps2.pd.256", + "ret": "f64", + "args": ["f32h"] + }, + { + "intrinsic": "256_cvttpd_epi32", + "width": [256], + "llvm": "cvtt.pd2dq.256", + "ret": "s32h", + "args": ["f64"] + }, + { + "intrinsic": "256_cvttps_epi32", + "width": [256], + "llvm": "cvtt.ps2dq.256", + "ret": "s32", + "args": ["f32"] + }, + { "intrinsic": "256_dp_ps", "width": [256], "llvm": "dp.ps.256", diff --git a/src/librustc_platform_intrinsics/x86.rs b/src/librustc_platform_intrinsics/x86.rs index 168ae79ab74..d8aaf151267 100644 --- a/src/librustc_platform_intrinsics/x86.rs +++ b/src/librustc_platform_intrinsics/x86.rs @@ -498,6 +498,56 @@ 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_broadcast_ps" => Intrinsic { + inputs: vec![p(true, i(8), None)], + output: v(f(32), 8), + definition: Named("llvm.x86.avx.vbroadcastf128.ps.256") + }, + "256_broadcast_pd" => Intrinsic { + inputs: vec![p(true, i(8), None)], + output: v(f(64), 4), + definition: Named("llvm.x86.avx.vbroadcastf128.pd.256") + }, + "256_cvtepi32_pd" => Intrinsic { + inputs: vec![v(i(32), 4)], + output: v(f(64), 4), + definition: Named("llvm.x86.avx.cvtdq2.pd.256") + }, + "256_cvtepi32_ps" => Intrinsic { + inputs: vec![v(i(32), 8)], + output: v(f(32), 8), + definition: Named("llvm.x86.avx.cvtdq2.ps.256") + }, + "256_cvtpd_epi32" => Intrinsic { + inputs: vec![v(f(64), 4)], + output: v(i(32), 4), + definition: Named("llvm.x86.avx.cvt.pd2dq.256") + }, + "256_cvtpd_ps" => Intrinsic { + inputs: vec![v(f(64), 4)], + output: v(f(32), 4), + definition: Named("llvm.x86.avx.cvt.pd2.ps.256") + }, + "256_cvtps_epi32" => Intrinsic { + inputs: vec![v(f(32), 8)], + output: v(i(32), 8), + definition: Named("llvm.x86.avx.cvt.ps2dq.256") + }, + "256_cvtps_pd" => Intrinsic { + inputs: vec![v(f(32), 4)], + output: v(f(64), 4), + definition: Named("llvm.x86.avx.cvt.ps2.pd.256") + }, + "256_cvttpd_epi32" => Intrinsic { + inputs: vec![v(f(64), 4)], + output: v(i(32), 4), + definition: Named("llvm.x86.avx.cvtt.pd2dq.256") + }, + "256_cvttps_epi32" => Intrinsic { + inputs: vec![v(f(32), 8)], + output: v(i(32), 8), + definition: Named("llvm.x86.avx.cvtt.ps2dq.256") + }, "256_dp_ps" => Intrinsic { inputs: vec![v(f(32), 8), v(f(32), 8), i_(32, 8)], output: v(f(32), 8), |
