rotl.rs
#![feature(asm, macro_rules)] | |
use std::mem; | |
fn rotl(val: u64, shift: u8) -> u64 { | |
let sz = mem::size_of_val(&val); | |
(val << shift) | (val >> (sz * 8 - shift as uint)) | |
} | |
macro_rules! rotl( | |
($val: expr, $shift: expr) => ( | |
{ | |
let val = $val; | |
let shift = $shift; | |
let sz = mem::size_of_val(&val); | |
(val << shift) | (val >> (sz * 8 - shift as uint)) | |
} | |
); | |
) | |
fn asm_rotl(mut x: u64, a: u8) -> u64 { | |
unsafe { | |
asm!("rolq $2, $0" | |
: "=r"(x) | |
: "0"(x), "{cl}"(a)); | |
} | |
x | |
} | |
fn main() { | |
println!("rotl(32, 2) - {}", rotl(32, 2)); | |
println!("rotl!(32, 2) - {}", rotl!(32, 2)); | |
println!("asm_rotl(32, 2) - {}", asm_rotl(32, 2)); | |
} |