Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Read+write modifier Some documentation in asm.rs rpass and cfail tests
- Loading branch information
Showing
4 changed files
with
182 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() {} |
2a1bd2f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
saw approval from alexcrichton
at pczarn@2a1bd2f
2a1bd2f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
merging pczarn/rust/inline-asm = 2a1bd2f into auto
2a1bd2f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pczarn/rust/inline-asm = 2a1bd2f merged ok, testing candidate = 98fa0f8
2a1bd2f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all tests pass:
success: http://buildbot.rust-lang.org/builders/auto-linux-32-opt/builds/4739
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-c/builds/3827
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-t/builds/3833
success: http://buildbot.rust-lang.org/builders/auto-linux-64-opt/builds/4741
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-c/builds/3827
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-t/builds/3832
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android/builds/3900
success: http://buildbot.rust-lang.org/builders/auto-win-32-opt/builds/4737
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-c/builds/3839
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-t/builds/3845
success: http://buildbot.rust-lang.org/builders/auto-bsd-64-opt/builds/4500
2a1bd2f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fast-forwarding master to auto = 98fa0f8