From b2cf6df8756c1b504f0b27b0fa6eb807d27cc53d Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Thu, 22 Dec 2016 23:53:30 +0200 Subject: [PATCH] Add intrinsics & target features for rd{rand,seed} --- src/etc/platform-intrinsics/x86/rdrand.json | 27 +++++++++++++++++++ src/etc/platform-intrinsics/x86/rdseed.json | 27 +++++++++++++++++++ src/librustc_driver/target_features.rs | 2 +- src/librustc_platform_intrinsics/x86.rs | 30 +++++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/etc/platform-intrinsics/x86/rdrand.json create mode 100644 src/etc/platform-intrinsics/x86/rdseed.json diff --git a/src/etc/platform-intrinsics/x86/rdrand.json b/src/etc/platform-intrinsics/x86/rdrand.json new file mode 100644 index 0000000000000..fa2feb4224b9f --- /dev/null +++ b/src/etc/platform-intrinsics/x86/rdrand.json @@ -0,0 +1,27 @@ +{ + "intrinsic_prefix": "_rdrand", + "llvm_prefix": "llvm.x86.rdrand.", + "intrinsics": [ + { + "intrinsic": "16_step", + "width": ["0"], + "llvm": "16", + "ret": "(U16,S32)", + "args": [] + }, + { + "intrinsic": "32_step", + "width": ["0"], + "llvm": "32", + "ret": "(U32,S32)", + "args": [] + }, + { + "intrinsic": "64_step", + "width": ["0"], + "llvm": "64", + "ret": "(U64,S32)", + "args": [] + } + ] +} diff --git a/src/etc/platform-intrinsics/x86/rdseed.json b/src/etc/platform-intrinsics/x86/rdseed.json new file mode 100644 index 0000000000000..7be64b583e0ac --- /dev/null +++ b/src/etc/platform-intrinsics/x86/rdseed.json @@ -0,0 +1,27 @@ +{ + "intrinsic_prefix": "_rdseed", + "llvm_prefix": "llvm.x86.rdseed.", + "intrinsics": [ + { + "intrinsic": "16_step", + "width": ["0"], + "llvm": "16", + "ret": "(U16,S32)", + "args": [] + }, + { + "intrinsic": "32_step", + "width": ["0"], + "llvm": "32", + "ret": "(U32,S32)", + "args": [] + }, + { + "intrinsic": "64_step", + "width": ["0"], + "llvm": "64", + "ret": "(U64,S32)", + "args": [] + } + ] +} diff --git a/src/librustc_driver/target_features.rs b/src/librustc_driver/target_features.rs index 124e7aafcc515..0744fbbd4e925 100644 --- a/src/librustc_driver/target_features.rs +++ b/src/librustc_driver/target_features.rs @@ -25,7 +25,7 @@ const ARM_WHITELIST: &'static [&'static str] = &["neon\0", "vfp2\0", "vfp3\0", " const X86_WHITELIST: &'static [&'static str] = &["avx\0", "avx2\0", "bmi\0", "bmi2\0", "sse\0", "sse2\0", "sse3\0", "sse4.1\0", "sse4.2\0", "ssse3\0", "tbm\0", "lzcnt\0", "popcnt\0", - "sse4a\0"]; + "sse4a\0", "rdrnd\0", "rdseed\0"]; /// Add `target_feature = "..."` cfgs for a variety of platform /// specific features (SSE, NEON etc.). diff --git a/src/librustc_platform_intrinsics/x86.rs b/src/librustc_platform_intrinsics/x86.rs index 91ecad8402fd4..acb69423ffee3 100644 --- a/src/librustc_platform_intrinsics/x86.rs +++ b/src/librustc_platform_intrinsics/x86.rs @@ -872,6 +872,36 @@ pub fn find(name: &str) -> Option { output: &::F64x4, definition: Named("llvm.x86.fma.vfnmsub.pd.256") }, + "_rdrand16_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdrand.16") + }, + "_rdrand32_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdrand.32") + }, + "_rdrand64_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdrand.64") + }, + "_rdseed16_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdseed.16") + }, + "_rdseed32_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdseed.32") + }, + "_rdseed64_step" => Intrinsic { + inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS }, + output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64, &::I32]; &PARTS }); &AGG }, + definition: Named("llvm.x86.rdseed.64") + }, "_mm_adds_epi8" => Intrinsic { inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS }, output: &::I8x16,