about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/etc/platform-intrinsics/x86/rdrand.json27
-rw-r--r--src/etc/platform-intrinsics/x86/rdseed.json27
-rw-r--r--src/librustc_driver/target_features.rs2
-rw-r--r--src/librustc_platform_intrinsics/x86.rs30
4 files changed, 85 insertions, 1 deletions
diff --git a/src/etc/platform-intrinsics/x86/rdrand.json b/src/etc/platform-intrinsics/x86/rdrand.json
new file mode 100644
index 00000000000..fa2feb4224b
--- /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 00000000000..7be64b583e0
--- /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 124e7aafcc5..0744fbbd4e9 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 91ecad8402f..acb69423ffe 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<Intrinsic> {
             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,