Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C with Coccinelle
C++ with Coccinelle
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Mojo
Nim
Numba
Nix
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
PTX
Python
Racket
Raku
Ruby
Rust
Sail
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
Triton
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
sway
rust source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
mrustc (master)
rustc 1.0.0
rustc 1.1.0
rustc 1.10.0
rustc 1.11.0
rustc 1.12.0
rustc 1.13.0
rustc 1.14.0
rustc 1.15.1
rustc 1.16.0
rustc 1.17.0
rustc 1.18.0
rustc 1.19.0
rustc 1.2.0
rustc 1.20.0
rustc 1.21.0
rustc 1.22.0
rustc 1.23.0
rustc 1.24.0
rustc 1.25.0
rustc 1.26.0
rustc 1.27.0
rustc 1.27.1
rustc 1.28.0
rustc 1.29.0
rustc 1.3.0
rustc 1.30.0
rustc 1.31.0
rustc 1.32.0
rustc 1.33.0
rustc 1.34.0
rustc 1.35.0
rustc 1.36.0
rustc 1.37.0
rustc 1.38.0
rustc 1.39.0
rustc 1.4.0
rustc 1.40.0
rustc 1.41.0
rustc 1.42.0
rustc 1.43.0
rustc 1.44.0
rustc 1.45.0
rustc 1.45.2
rustc 1.46.0
rustc 1.47.0
rustc 1.48.0
rustc 1.49.0
rustc 1.5.0
rustc 1.50.0
rustc 1.51.0
rustc 1.52.0
rustc 1.53.0
rustc 1.54.0
rustc 1.55.0
rustc 1.56.0
rustc 1.57.0
rustc 1.58.0
rustc 1.59.0
rustc 1.6.0
rustc 1.60.0
rustc 1.61.0
rustc 1.62.0
rustc 1.63.0
rustc 1.64.0
rustc 1.65.0
rustc 1.66.0
rustc 1.67.0
rustc 1.68.0
rustc 1.69.0
rustc 1.7.0
rustc 1.70.0
rustc 1.71.0
rustc 1.72.0
rustc 1.73.0
rustc 1.74.0
rustc 1.75.0
rustc 1.76.0
rustc 1.77.0
rustc 1.78.0
rustc 1.79.0
rustc 1.8.0
rustc 1.80.0
rustc 1.81.0
rustc 1.82.0
rustc 1.83.0
rustc 1.84.0
rustc 1.85.0
rustc 1.86.0
rustc 1.87.0
rustc 1.88.0
rustc 1.89.0
rustc 1.9.0
rustc 1.90.0
rustc beta
rustc nightly
rustc-cg-gcc (master)
x86-64 GCCRS (GCC master)
x86-64 GCCRS (GCCRS master)
x86-64 GCCRS 14.1 (GCC assertions)
x86-64 GCCRS 14.1 (GCC)
x86-64 GCCRS 14.2 (GCC assertions)
x86-64 GCCRS 14.2 (GCC)
x86-64 GCCRS 14.3 (GCC assertions)
x86-64 GCCRS 14.3 (GCC)
x86-64 GCCRS 15.1 (GCC assertions)
x86-64 GCCRS 15.1 (GCC)
x86-64 GCCRS 15.2 (GCC assertions)
x86-64 GCCRS 15.2 (GCC)
Options
Source code
// SPDX-License-Identifier: MIT #[unsafe(no_mangle)] pub fn get_range_reference(v: u128, len: i32, start: i32) -> u64 { return ((v >> start) as u64) & if len == 64 { u64::MAX } else { (((1u64).wrapping_shl(len as u32).wrapping_sub(1)) as u64) }; } #[unsafe(naked)] #[unsafe(no_mangle)] extern "sysv64" fn get_range_opt(v: u128, len: i32, start: i32) -> u64 { core::arch::naked_asm!( "test cl, 64", "cmovnz rdi, rsi", "shrd rdi, rsi, cl", "bzhi rax, rdi, rdx", "ret" ) } /// NB: Everything past here is vibe coded /// A simple pseudo-random number generator using the xoroshiro128+ algorithm. struct SimplePrng { s0: u64, s1: u64, } impl SimplePrng { /// Creates a new PRNG with a given 128-bit seed. fn new(seed: u128) -> Self { // A non-zero seed is required. let seed = if seed == 0 { u128::MAX } else { seed }; Self { s0: (seed >> 64) as u64, s1: seed as u64, } } /// Generates the next 128-bit pseudo-random number. fn next_u128(&mut self) -> u128 { // Call the 64-bit generator twice to produce a 128-bit number. let hi = self.next_u64(); let lo = self.next_u64(); ((hi as u128) << 64) | (lo as u128) } /// Generates a pseudo-random i32 within a specified range (inclusive). /// Note: This uses the modulo operator, which introduces a slight bias, /// but is simple and sufficient for testing purposes. fn gen_range(&mut self, start_inclusive: i32, end_inclusive: i32) -> i32 { let range = (end_inclusive as u64) - (start_inclusive as u64) + 1; if range == 0 { return start_inclusive; } // Use the lower 64 bits of a random u128 for simplicity. let random_u64 = self.next_u128() as u64; start_inclusive + (random_u64 % range) as i32 } // Private helper for the 64-bit state transition (xoroshiro128+). fn next_u64(&mut self) -> u64 { let s0 = self.s0; let mut s1 = self.s1; let result = s0.wrapping_add(s1); s1 ^= s0; self.s0 = s0.rotate_left(24) ^ s1 ^ (s1 << 16); self.s1 = s1.rotate_left(37); result } } fn main() { // Initialize the PRNG with a fixed seed for reproducible test runs. let mut prng = SimplePrng::new(0x853409618721e25501827a73819301ab); const ITERATIONS: u32 = 5_000_000; println!("Running {ITERATIONS} pseudo-random tests..."); for i in 0..ITERATIONS { // 1. Generate a valid length: 0 <= len <= 64 let len: i32 = prng.gen_range(0, 64); // 2. Generate a valid start position: 0 <= start <= 128 - len let start: i32 = prng.gen_range(0, 127 - len); // 3. Generate a random value let v: u128 = prng.next_u128(); // 4. Get results from both functions let reference_result = get_range_reference(v, len, start); let opt_result = get_range_opt(v, len, start); // 5. Check that they are the same assert_eq!( reference_result, opt_result, "\n\nMismatch on iteration {i}!\n\ Inputs: v=0x{v:032x}, len={len}, start={start}\n\ Reference output: 0x{reference_result:016x}\n\ Optimized output: 0x{opt_result:016x}\n" ); } println!("✅ Success! All {ITERATIONS} tests passed."); }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Compiler Explorer Shop
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
Statistics
Changelog
Version tree