diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2021-05-16 10:46:34 +0200 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2021-05-16 10:46:37 +0200 |
| commit | a9d033d0e5e29551fc578e8ea4eb3d5f43166b94 (patch) | |
| tree | d837054276dae436e8e3f0c2413e6f890b7266a1 | |
| parent | 328f06718a71e786e463ae6a5d1874bd13061cde (diff) | |
| download | rust-a9d033d0e5e29551fc578e8ea4eb3d5f43166b94.tar.gz rust-a9d033d0e5e29551fc578e8ea4eb3d5f43166b94.zip | |
Return 0 from cpuid for all subleaves of leaf 7
This is necessary to support the cpufeatures crate Fixes #1173
| -rw-r--r-- | src/intrinsics/cpuid.rs | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/intrinsics/cpuid.rs b/src/intrinsics/cpuid.rs index 9de12e759bc..d02dfd93c3e 100644 --- a/src/intrinsics/cpuid.rs +++ b/src/intrinsics/cpuid.rs @@ -12,6 +12,7 @@ pub(crate) fn codegen_cpuid_call<'tcx>( ) -> (Value, Value, Value, Value) { let leaf_0 = fx.bcx.create_block(); let leaf_1 = fx.bcx.create_block(); + let leaf_7 = fx.bcx.create_block(); let leaf_8000_0000 = fx.bcx.create_block(); let leaf_8000_0001 = fx.bcx.create_block(); let unsupported_leaf = fx.bcx.create_block(); @@ -25,6 +26,7 @@ pub(crate) fn codegen_cpuid_call<'tcx>( let mut switch = cranelift_frontend::Switch::new(); switch.set_entry(0, leaf_0); switch.set_entry(1, leaf_1); + switch.set_entry(7, leaf_7); switch.set_entry(0x8000_0000, leaf_8000_0000); switch.set_entry(0x8000_0001, leaf_8000_0001); switch.emit(&mut fx.bcx, leaf, unsupported_leaf); @@ -43,6 +45,11 @@ pub(crate) fn codegen_cpuid_call<'tcx>( let edx_features = fx.bcx.ins().iconst(types::I32, 1 << 25 /* sse */ | 1 << 26 /* sse2 */); fx.bcx.ins().jump(dest, &[cpu_signature, additional_information, ecx_features, edx_features]); + fx.bcx.switch_to_block(leaf_7); + // This leaf technically has subleaves, but we just return zero for all subleaves. + let zero = fx.bcx.ins().iconst(types::I32, 0); + fx.bcx.ins().jump(dest, &[zero, zero, zero, zero]); + fx.bcx.switch_to_block(leaf_8000_0000); let extended_max_basic_leaf = fx.bcx.ins().iconst(types::I32, 0); let zero = fx.bcx.ins().iconst(types::I32, 0); |
