5 * Architecture dependent types. These types have to be redefined
6 * for every architecture
8 typedef signed char rint8;
9 typedef unsigned char ruint8;
10 typedef signed short rint16;
11 typedef unsigned short ruint16;
12 typedef signed int rint32;
13 typedef unsigned int ruint32;
14 typedef signed long rint64;
15 typedef unsigned long ruint64;
16 typedef unsigned long rword;
18 typedef unsigned int ratomic_t;
20 #ifndef _RSIZE_T_DEFINED
21 typedef unsigned long rsize_t;
22 #define _RSIZE_T_DEFINED
25 #ifndef _RSSIZE_T_DEFINED
26 typedef signed long rssize_t;
27 #define _RSSIZE_T_DEFINED
32 * Common types. These types should be the same for most of the architectures.
35 typedef void *rpointer;
36 typedef const void *rconstpointer;
37 typedef struct {ruint32 p1; ruint32 p2;} rpair_t;
40 * Atomic operations (Architecture Dependent)
42 #define R_ATOMIC_CMPXCHG(ptr, oldval, newval, resptr) \
43 do { __asm__ __volatile__ ("lock; cmpxchgl %2, %1" \
44 : "=a" (*(resptr)), "=m" (*ptr) \
45 : "r" (newval), "m" (*ptr), "0" (oldval)); } while (0)
47 #define R_ATOMIC_XCHG(ptr, val) \
48 do { __asm__ __volatile__("lock; xchgl %0,%1" \
49 :"=r" ((ruint32) val) \
50 :"m" (*(volatile ruint32 *)ptr), "0" (val) \
51 :"memory"); } while (0)
53 #define R_ATOMIC_ADD(ptr, val) \
54 do { __asm__ __volatile__ ("addl %1,%0" \
56 : "ir" (val), "m" (*ptr)); } while (0)
58 #define R_ATOMIC_SUB(ptr, val) \
59 do { __asm__ __volatile__ ("subl %1,%0" \
61 : "ir" (val), "m" (*ptr)); } while (0)
64 #define R_DEBUG_BRAKE __asm__ ("int $3")
65 #define R_ASSERT(__a__) do {if (!(__a__)) R_DEBUG_BRAKE; } while (0)
66 #define R_SIZE_ALIGN(s, n) ((((s) + (n) - 1) / (n)) * (n))
67 #define R_MIN(a, b) ((a) < (b) ? (a): (b))
68 #define R_MAX(a, b) ((a) > (b) ? (a): (b))
74 #define NULL ((rpointer)0)
79 #define TRUE ((rboolean)1)
83 #define FALSE ((rboolean)0)