projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
1.0.27.8: slightly faster x86oid pseudo atomic with {e,r}bp
[sbcl.git]
/
src
/
runtime
/
pseudo-atomic.h
diff --git
a/src/runtime/pseudo-atomic.h
b/src/runtime/pseudo-atomic.h
index
9636e5b
..
40898c7
100644
(file)
--- a/
src/runtime/pseudo-atomic.h
+++ b/
src/runtime/pseudo-atomic.h
@@
-34,18
+34,19
@@
static inline int
get_pseudo_atomic_atomic(struct thread *thread)
{
static inline int
get_pseudo_atomic_atomic(struct thread *thread)
{
- return fixnum_value(SymbolValue(PSEUDO_ATOMIC_BITS, thread) &
- make_fixnum(1));
+ return SymbolValue(PSEUDO_ATOMIC_BITS, thread) & (~1);
}
static inline void
set_pseudo_atomic_atomic(struct thread *thread)
{
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
}
static inline void
set_pseudo_atomic_atomic(struct thread *thread)
{
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
+ if (*p)
+ lose("set_pseudo_atomic_atomic: pseudo atomic bits is %d.", *p);
__asm__ __volatile__
("or" LISPOBJ_ASM_SUFFIX " %0,%1"
:
__asm__ __volatile__
("or" LISPOBJ_ASM_SUFFIX " %0,%1"
:
- : "g" (make_fixnum(1)), "m" (*p)
+ : "g" (~1), "m" (*p)
: "memory");
}
: "memory");
}
@@
-56,36
+57,39
@@
clear_pseudo_atomic_atomic(struct thread *thread)
__asm__ __volatile__
("and" LISPOBJ_ASM_SUFFIX " %0,%1"
:
__asm__ __volatile__
("and" LISPOBJ_ASM_SUFFIX " %0,%1"
:
- : "g" (~make_fixnum(1)), "m" (*p)
+ : "g" (1), "m" (*p)
: "memory");
}
static inline int
get_pseudo_atomic_interrupted(struct thread *thread)
{
: "memory");
}
static inline int
get_pseudo_atomic_interrupted(struct thread *thread)
{
- return fixnum_value(SymbolValue(PSEUDO_ATOMIC_BITS, thread) &
- make_fixnum(2));
+ return SymbolValue(PSEUDO_ATOMIC_BITS, thread) & 1;
}
static inline void
set_pseudo_atomic_interrupted(struct thread *thread)
{
}
static inline void
set_pseudo_atomic_interrupted(struct thread *thread)
{
+ if (!get_pseudo_atomic_atomic(thread))
+ lose("set_pseudo_atomic_interrupted not in pseudo atomic");
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
__asm__ __volatile__
("or" LISPOBJ_ASM_SUFFIX " %0,%1"
:
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
__asm__ __volatile__
("or" LISPOBJ_ASM_SUFFIX " %0,%1"
:
- : "g" (make_fixnum(2)), "m" (*p)
+ : "g" (1), "m" (*p)
: "memory");
}
static inline void
clear_pseudo_atomic_interrupted(struct thread *thread)
{
: "memory");
}
static inline void
clear_pseudo_atomic_interrupted(struct thread *thread)
{
+ if (get_pseudo_atomic_atomic(thread))
+ lose("clear_pseudo_atomic_interrupted in pseudo atomic");
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
__asm__ __volatile__
("and" LISPOBJ_ASM_SUFFIX " %0,%1"
:
lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
__asm__ __volatile__
("and" LISPOBJ_ASM_SUFFIX " %0,%1"
:
- : "g" (~make_fixnum(2)), "m" (*p)
+ : "g" (~1), "m" (*p)
: "memory");
}
: "memory");
}