aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Gerd Zellweger <mail@gerdzellweger.com> 2019-07-26 16:06:47 -0700
committerGravatar GitHub <noreply@github.com> 2019-07-26 16:06:47 -0700
commit604d259b367fcd9e1752d9e46a047fea455d7b59 (patch)
tree90b095f86f5d8e9d88683d81f08eaaa719c7b605
parentc5af691304d11b6b1a3df5dae6c546bd2a7fac4a (diff)
parent3c33d6c29bb546d8774d03825c10a28038c7f7e4 (diff)
downloadrust-x86-604d259b367fcd9e1752d9e46a047fea455d7b59.tar.gz
rust-x86-604d259b367fcd9e1752d9e46a047fea455d7b59.tar.zst
rust-x86-604d259b367fcd9e1752d9e46a047fea455d7b59.zip
Merge pull request #50 from edigaryev/always-inline-flags
Always inline functions that operate on FLAGS register
-rw-r--r--src/bits32/eflags.rs4
-rw-r--r--src/bits64/rflags.rs2
2 files changed, 6 insertions, 0 deletions
diff --git a/src/bits32/eflags.rs b/src/bits32/eflags.rs
index 10ed325..aa4d23e 100644
--- a/src/bits32/eflags.rs
+++ b/src/bits32/eflags.rs
@@ -67,6 +67,7 @@ impl EFlags {
}
#[cfg(target_arch = "x86")]
+#[inline(always)]
pub unsafe fn read() -> EFlags {
let r: u32;
asm!("pushfl; popl $0" : "=r"(r) :: "memory");
@@ -74,6 +75,7 @@ pub unsafe fn read() -> EFlags {
}
#[cfg(target_arch = "x86")]
+#[inline(always)]
pub unsafe fn set(val: EFlags) {
asm!("pushl $0; popfl" :: "r"(val.bits()) : "memory" "flags");
}
@@ -88,6 +90,7 @@ pub unsafe fn set(val: EFlags) {
///
/// This instruction is only valid in Ring 0 and requires
/// that the CPU supports the instruction (check CPUID).
+#[inline(always)]
pub unsafe fn clac() {
asm!("clac" ::: "memory" "flags" : "volatile");
}
@@ -102,6 +105,7 @@ pub unsafe fn clac() {
///
/// This instruction is only valid in Ring 0 and requires
/// that the CPU supports the instruction (check CPUID).
+#[inline(always)]
pub unsafe fn stac() {
asm!("stac" ::: "memory" "flags" : "volatile");
}
diff --git a/src/bits64/rflags.rs b/src/bits64/rflags.rs
index 5f6fa11..970e19a 100644
--- a/src/bits64/rflags.rs
+++ b/src/bits64/rflags.rs
@@ -76,6 +76,7 @@ impl RFlags {
}
#[cfg(target_arch = "x86_64")]
+#[inline(always)]
pub unsafe fn read() -> RFlags {
let r: u64;
asm!("pushfq; popq $0" : "=r"(r) :: "memory");
@@ -83,6 +84,7 @@ pub unsafe fn read() -> RFlags {
}
#[cfg(target_arch = "x86_64")]
+#[inline(always)]
pub unsafe fn set(val: RFlags) {
asm!("pushq $0; popfq" :: "r"(val.bits()) : "memory" "flags");
}