projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: x86 and s390: uatomic __hp() macro C++ support
[urcu.git]
/
include
/
urcu
/
uatomic
/
x86.h
diff --git
a/include/urcu/uatomic/x86.h
b/include/urcu/uatomic/x86.h
index 03a0b2f06afef335822dbf3009233c19461edc55..efc67bb62af9689cdf23e219c7e7ccabaadc23a2 100644
(file)
--- a/
include/urcu/uatomic/x86.h
+++ b/
include/urcu/uatomic/x86.h
@@
-36,13
+36,20
@@
extern "C" {
*/
/*
*/
/*
- * The __hp() macro casts the void pointer
"x"
to a pointer to a structure
+ * The __hp() macro casts the void pointer
@x
to a pointer to a structure
* containing an array of char of the specified size. This allows passing the
* @addr arguments of the following inline functions as "m" and "+m" operands
* containing an array of char of the specified size. This allows passing the
* @addr arguments of the following inline functions as "m" and "+m" operands
- * to the assembly.
+ * to the assembly. The @size parameter should be a constant to support
+ * compilers such as clang which do not support VLA. Create typedefs because
+ * C++ does not allow types be defined in casts.
*/
*/
-#define __hp(size, x) ((struct { char v[size]; } *)(x))
+typedef struct { char v[1]; } __hp_1;
+typedef struct { char v[2]; } __hp_2;
+typedef struct { char v[4]; } __hp_4;
+typedef struct { char v[8]; } __hp_8;
+
+#define __hp(size, x) ((__hp_##size *)(x))
#define _uatomic_set(addr, v) ((void) CMM_STORE_SHARED(*(addr), (v)))
#define _uatomic_set(addr, v) ((void) CMM_STORE_SHARED(*(addr), (v)))
@@
-59,7
+66,7
@@
unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
__asm__ __volatile__(
"lock; cmpxchgb %2, %1"
__asm__ __volatile__(
"lock; cmpxchgb %2, %1"
- : "+a"(result), "+m"(*__hp(
len
, addr))
+ : "+a"(result), "+m"(*__hp(
1
, addr))
: "q"((unsigned char)_new)
: "memory");
return result;
: "q"((unsigned char)_new)
: "memory");
return result;
@@
-70,7
+77,7
@@
unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
__asm__ __volatile__(
"lock; cmpxchgw %2, %1"
__asm__ __volatile__(
"lock; cmpxchgw %2, %1"
- : "+a"(result), "+m"(*__hp(
len
, addr))
+ : "+a"(result), "+m"(*__hp(
2
, addr))
: "r"((unsigned short)_new)
: "memory");
return result;
: "r"((unsigned short)_new)
: "memory");
return result;
@@
-81,7
+88,7
@@
unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
__asm__ __volatile__(
"lock; cmpxchgl %2, %1"
__asm__ __volatile__(
"lock; cmpxchgl %2, %1"
- : "+a"(result), "+m"(*__hp(
len
, addr))
+ : "+a"(result), "+m"(*__hp(
4
, addr))
: "r"((unsigned int)_new)
: "memory");
return result;
: "r"((unsigned int)_new)
: "memory");
return result;
@@
-93,7
+100,7
@@
unsigned long __uatomic_cmpxchg(void *addr, unsigned long old,
__asm__ __volatile__(
"lock; cmpxchgq %2, %1"
__asm__ __volatile__(
"lock; cmpxchgq %2, %1"
- : "+a"(result), "+m"(*__hp(
len
, addr))
+ : "+a"(result), "+m"(*__hp(
8
, addr))
: "r"((unsigned long)_new)
: "memory");
return result;
: "r"((unsigned long)_new)
: "memory");
return result;
@@
-126,7
+133,7
@@
unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
unsigned char result;
__asm__ __volatile__(
"xchgb %0, %1"
unsigned char result;
__asm__ __volatile__(
"xchgb %0, %1"
- : "=q"(result), "+m"(*__hp(
len
, addr))
+ : "=q"(result), "+m"(*__hp(
1
, addr))
: "0" ((unsigned char)val)
: "memory");
return result;
: "0" ((unsigned char)val)
: "memory");
return result;
@@
-136,7
+143,7
@@
unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
unsigned short result;
__asm__ __volatile__(
"xchgw %0, %1"
unsigned short result;
__asm__ __volatile__(
"xchgw %0, %1"
- : "=r"(result), "+m"(*__hp(
len
, addr))
+ : "=r"(result), "+m"(*__hp(
2
, addr))
: "0" ((unsigned short)val)
: "memory");
return result;
: "0" ((unsigned short)val)
: "memory");
return result;
@@
-146,7
+153,7
@@
unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
unsigned int result;
__asm__ __volatile__(
"xchgl %0, %1"
unsigned int result;
__asm__ __volatile__(
"xchgl %0, %1"
- : "=r"(result), "+m"(*__hp(
len
, addr))
+ : "=r"(result), "+m"(*__hp(
4
, addr))
: "0" ((unsigned int)val)
: "memory");
return result;
: "0" ((unsigned int)val)
: "memory");
return result;
@@
-157,7
+164,7
@@
unsigned long __uatomic_exchange(void *addr, unsigned long val, int len)
unsigned long result;
__asm__ __volatile__(
"xchgq %0, %1"
unsigned long result;
__asm__ __volatile__(
"xchgq %0, %1"
- : "=r"(result), "+m"(*__hp(
len
, addr))
+ : "=r"(result), "+m"(*__hp(
8
, addr))
: "0" ((unsigned long)val)
: "memory");
return result;
: "0" ((unsigned long)val)
: "memory");
return result;
@@
-190,7
+197,7
@@
unsigned long __uatomic_add_return(void *addr, unsigned long val,
__asm__ __volatile__(
"lock; xaddb %1, %0"
__asm__ __volatile__(
"lock; xaddb %1, %0"
- : "+m"(*__hp(
len
, addr)), "+q" (result)
+ : "+m"(*__hp(
1
, addr)), "+q" (result)
:
: "memory");
return result + (unsigned char)val;
:
: "memory");
return result + (unsigned char)val;
@@
-201,7
+208,7
@@
unsigned long __uatomic_add_return(void *addr, unsigned long val,
__asm__ __volatile__(
"lock; xaddw %1, %0"
__asm__ __volatile__(
"lock; xaddw %1, %0"
- : "+m"(*__hp(
len
, addr)), "+r" (result)
+ : "+m"(*__hp(
2
, addr)), "+r" (result)
:
: "memory");
return result + (unsigned short)val;
:
: "memory");
return result + (unsigned short)val;
@@
-212,7
+219,7
@@
unsigned long __uatomic_add_return(void *addr, unsigned long val,
__asm__ __volatile__(
"lock; xaddl %1, %0"
__asm__ __volatile__(
"lock; xaddl %1, %0"
- : "+m"(*__hp(
len
, addr)), "+r" (result)
+ : "+m"(*__hp(
4
, addr)), "+r" (result)
:
: "memory");
return result + (unsigned int)val;
:
: "memory");
return result + (unsigned int)val;
@@
-224,7
+231,7
@@
unsigned long __uatomic_add_return(void *addr, unsigned long val,
__asm__ __volatile__(
"lock; xaddq %1, %0"
__asm__ __volatile__(
"lock; xaddq %1, %0"
- : "+m"(*__hp(
len
, addr)), "+r" (result)
+ : "+m"(*__hp(
8
, addr)), "+r" (result)
:
: "memory");
return result + (unsigned long)val;
:
: "memory");
return result + (unsigned long)val;
@@
-254,7
+261,7
@@
void __uatomic_and(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; andb %1, %0"
{
__asm__ __volatile__(
"lock; andb %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
1
, addr))
: "iq" ((unsigned char)val)
: "memory");
return;
: "iq" ((unsigned char)val)
: "memory");
return;
@@
-263,7
+270,7
@@
void __uatomic_and(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; andw %1, %0"
{
__asm__ __volatile__(
"lock; andw %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
2
, addr))
: "ir" ((unsigned short)val)
: "memory");
return;
: "ir" ((unsigned short)val)
: "memory");
return;
@@
-272,7
+279,7
@@
void __uatomic_and(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; andl %1, %0"
{
__asm__ __volatile__(
"lock; andl %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
4
, addr))
: "ir" ((unsigned int)val)
: "memory");
return;
: "ir" ((unsigned int)val)
: "memory");
return;
@@
-282,7
+289,7
@@
void __uatomic_and(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; andq %1, %0"
{
__asm__ __volatile__(
"lock; andq %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
8
, addr))
: "er" ((unsigned long)val)
: "memory");
return;
: "er" ((unsigned long)val)
: "memory");
return;
@@
-310,7
+317,7
@@
void __uatomic_or(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; orb %1, %0"
{
__asm__ __volatile__(
"lock; orb %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
1
, addr))
: "iq" ((unsigned char)val)
: "memory");
return;
: "iq" ((unsigned char)val)
: "memory");
return;
@@
-319,7
+326,7
@@
void __uatomic_or(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; orw %1, %0"
{
__asm__ __volatile__(
"lock; orw %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
2
, addr))
: "ir" ((unsigned short)val)
: "memory");
return;
: "ir" ((unsigned short)val)
: "memory");
return;
@@
-328,7
+335,7
@@
void __uatomic_or(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; orl %1, %0"
{
__asm__ __volatile__(
"lock; orl %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
4
, addr))
: "ir" ((unsigned int)val)
: "memory");
return;
: "ir" ((unsigned int)val)
: "memory");
return;
@@
-338,7
+345,7
@@
void __uatomic_or(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; orq %1, %0"
{
__asm__ __volatile__(
"lock; orq %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
8
, addr))
: "er" ((unsigned long)val)
: "memory");
return;
: "er" ((unsigned long)val)
: "memory");
return;
@@
-366,7
+373,7
@@
void __uatomic_add(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; addb %1, %0"
{
__asm__ __volatile__(
"lock; addb %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
1
, addr))
: "iq" ((unsigned char)val)
: "memory");
return;
: "iq" ((unsigned char)val)
: "memory");
return;
@@
-375,7
+382,7
@@
void __uatomic_add(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; addw %1, %0"
{
__asm__ __volatile__(
"lock; addw %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
2
, addr))
: "ir" ((unsigned short)val)
: "memory");
return;
: "ir" ((unsigned short)val)
: "memory");
return;
@@
-384,7
+391,7
@@
void __uatomic_add(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; addl %1, %0"
{
__asm__ __volatile__(
"lock; addl %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
4
, addr))
: "ir" ((unsigned int)val)
: "memory");
return;
: "ir" ((unsigned int)val)
: "memory");
return;
@@
-394,7
+401,7
@@
void __uatomic_add(void *addr, unsigned long val, int len)
{
__asm__ __volatile__(
"lock; addq %1, %0"
{
__asm__ __volatile__(
"lock; addq %1, %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
8
, addr))
: "er" ((unsigned long)val)
: "memory");
return;
: "er" ((unsigned long)val)
: "memory");
return;
@@
-423,7
+430,7
@@
void __uatomic_inc(void *addr, int len)
{
__asm__ __volatile__(
"lock; incb %0"
{
__asm__ __volatile__(
"lock; incb %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
1
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-432,7
+439,7
@@
void __uatomic_inc(void *addr, int len)
{
__asm__ __volatile__(
"lock; incw %0"
{
__asm__ __volatile__(
"lock; incw %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
2
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-441,7
+448,7
@@
void __uatomic_inc(void *addr, int len)
{
__asm__ __volatile__(
"lock; incl %0"
{
__asm__ __volatile__(
"lock; incl %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
4
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-451,7
+458,7
@@
void __uatomic_inc(void *addr, int len)
{
__asm__ __volatile__(
"lock; incq %0"
{
__asm__ __volatile__(
"lock; incq %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
8
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-476,7
+483,7
@@
void __uatomic_dec(void *addr, int len)
{
__asm__ __volatile__(
"lock; decb %0"
{
__asm__ __volatile__(
"lock; decb %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
1
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-485,7
+492,7
@@
void __uatomic_dec(void *addr, int len)
{
__asm__ __volatile__(
"lock; decw %0"
{
__asm__ __volatile__(
"lock; decw %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
2
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-494,7
+501,7
@@
void __uatomic_dec(void *addr, int len)
{
__asm__ __volatile__(
"lock; decl %0"
{
__asm__ __volatile__(
"lock; decl %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
4
, addr))
:
: "memory");
return;
:
: "memory");
return;
@@
-504,7
+511,7
@@
void __uatomic_dec(void *addr, int len)
{
__asm__ __volatile__(
"lock; decq %0"
{
__asm__ __volatile__(
"lock; decq %0"
- : "=m"(*__hp(
len
, addr))
+ : "=m"(*__hp(
8
, addr))
:
: "memory");
return;
:
: "memory");
return;
This page took
0.029612 seconds
and
4
git commands to generate.