diff options
| author | Piotr Czarnecki <pioczarn@gmail.com> | 2014-03-09 23:41:18 +0100 |
|---|---|---|
| committer | Piotr Czarnecki <pioczarn@gmail.com> | 2014-03-13 22:38:15 +0100 |
| commit | 2a1bd2ff9f9039df4b3c0158eac3589a222a2833 (patch) | |
| tree | e69d5539a60fe03034586b75ca55f9825cf520fc /src/test | |
| parent | 3316a0e6b2ad9352bab58e7c046ef3d212411d82 (diff) | |
| download | rust-2a1bd2ff9f9039df4b3c0158eac3589a222a2833.tar.gz rust-2a1bd2ff9f9039df4b3c0158eac3589a222a2833.zip | |
Fix and improve inline assembly.
Read+write modifier Some documentation in asm.rs rpass and cfail tests
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/compile-fail/asm-misplaced-option.rs | 41 | ||||
| -rw-r--r-- | src/test/run-pass/asm-in-out-operand.rs | 67 |
2 files changed, 108 insertions, 0 deletions
diff --git a/src/test/compile-fail/asm-misplaced-option.rs b/src/test/compile-fail/asm-misplaced-option.rs new file mode 100644 index 00000000000..595247143ed --- /dev/null +++ b/src/test/compile-fail/asm-misplaced-option.rs @@ -0,0 +1,41 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// ignore-fast #[feature] doesn't work with check-fast +#[feature(asm)]; + +#[allow(dead_code)]; + +#[cfg(target_arch = "x86")] +#[cfg(target_arch = "x86_64")] +pub fn main() { + // assignment not dead + let mut x: int = 0; + unsafe { + // extra colon + asm!("mov $1, $0" : "=r"(x) : "r"(5u), "0"(x) : : "cc"); + //~^ WARNING unrecognized option + } + assert_eq!(x, 5); + + unsafe { + // comma in place of a colon + asm!("add $2, $1; mov $1, $0" : "=r"(x) : "r"(x), "r"(8u) : "cc", "volatile"); + //~^ WARNING expected a clobber, but found an option + } + assert_eq!(x, 13); +} + +// #[cfg(not(target_arch = "x86"), not(target_arch = "x86_64"))] +// pub fn main() {} + +// At least one error is needed so that compilation fails +#[static_assert] +static b: bool = false; //~ ERROR static assertion failed diff --git a/src/test/run-pass/asm-in-out-operand.rs b/src/test/run-pass/asm-in-out-operand.rs new file mode 100644 index 00000000000..11d4321b3e9 --- /dev/null +++ b/src/test/run-pass/asm-in-out-operand.rs @@ -0,0 +1,67 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// ignore-fast #[feature] doesn't work with check-fast +#[feature(asm)]; + +#[cfg(target_arch = "x86")] +#[cfg(target_arch = "x86_64")] +unsafe fn next_power_of_2(n: u32) -> u32 { + let mut tmp = n; + asm!("dec $0" : "+rm"(tmp) :: "cc"); + let mut shift = 1u; + while shift <= 16 { + asm!( + "shr %cl, $2 + or $2, $0 + shl $$1, $1" + : "+&rm"(tmp), "+{ecx}"(shift) : "r"(tmp) : "cc" + ); + } + asm!("inc $0" : "+rm"(tmp) :: "cc"); + return tmp; +} + +#[cfg(target_arch = "x86")] +#[cfg(target_arch = "x86_64")] +pub fn main() { + unsafe { + assert_eq!(64, next_power_of_2(37)); + assert_eq!(2147483648, next_power_of_2(2147483647)); + } + + let mut y: int = 5; + let x: int; + unsafe { + // Treat the output as initialization. + asm!( + "shl $2, $1 + add $3, $1 + mov $1, $0" + : "=r"(x), "+r"(y) : "i"(3u), "ir"(7u) : "cc" + ); + } + assert_eq!(x, 47); + assert_eq!(y, 47); + + let mut x = x + 1; + assert_eq!(x, 48); + + unsafe { + // Assignment to mutable. + // Early clobber "&": + // Forbids the use of a single register by both operands. + asm!("shr $$2, $1; add $1, $0" : "+&r"(x) : "r"(x) : "cc"); + } + assert_eq!(x, 60); +} + +#[cfg(not(target_arch = "x86"), not(target_arch = "x86_64"))] +pub fn main() {} |
