projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added comments
[libfirm]
/
ir
/
stat
/
counter.h
diff --git
a/ir/stat/counter.h
b/ir/stat/counter.h
index
c327b46
..
6d251b2
100644
(file)
--- a/
ir/stat/counter.h
+++ b/
ir/stat/counter.h
@@
-12,40
+12,46
@@
#define _COUNTER_H_
#include <string.h>
#define _COUNTER_H_
#include <string.h>
+#include <limits.h>
/*
/*
- * 32 bit should be enough for
now
+ * 32 bit should be enough for
most cases
*/
*/
+#ifndef STAT_CNT_NUM
#define STAT_CNT_NUM 1
#define STAT_CNT_NUM 1
+#endif
typedef struct _counter_t {
typedef struct _counter_t {
- unsigned cnt[STAT_CNT_NUM];
+
unsigned cnt[STAT_CNT_NUM];
} counter_t;
} counter_t;
+/** initializes a counter with zero */
+#define ZERO_CNT { { 0 } }
+
/**
* increase a counter
*/
static INLINE void cnt_inc(counter_t *cnt)
{
/**
* increase a counter
*/
static INLINE void cnt_inc(counter_t *cnt)
{
- int i;
+
int i;
- for (i = 0; i < STAT_CNT_NUM; ++i) {
- if (++cnt->cnt[i])
- break;
- }
+
for (i = 0; i < STAT_CNT_NUM; ++i) {
+
if (++cnt->cnt[i])
+
break;
+
}
}
/**
}
/**
- * decrea
c
e a counter
+ * decrea
s
e a counter
*/
static INLINE void cnt_dec(counter_t *cnt)
{
*/
static INLINE void cnt_dec(counter_t *cnt)
{
- int i;
+
int i;
- for (i = 0; i < STAT_CNT_NUM; ++i) {
- if (--cnt->cnt[i] != -1)
- break;
- }
+
for (i = 0; i < STAT_CNT_NUM; ++i) {
+
if (--cnt->cnt[i] != -1)
+
break;
+
}
}
/**
}
/**
@@
-53,7
+59,7
@@
static INLINE void cnt_dec(counter_t *cnt)
*/
static INLINE void cnt_clr(counter_t *cnt)
{
*/
static INLINE void cnt_clr(counter_t *cnt)
{
- memset(cnt->cnt, 0, sizeof(cnt->cnt));
+
memset(cnt->cnt, 0, sizeof(cnt->cnt));
}
/**
}
/**
@@
-61,46
+67,37
@@
static INLINE void cnt_clr(counter_t *cnt)
*/
static INLINE void cnt_add(counter_t *dst, const counter_t *src)
{
*/
static INLINE void cnt_add(counter_t *dst, const counter_t *src)
{
- int i, carry = 0;
-
- for (i = 0; i < STAT_CNT_NUM; ++i) {
- unsigned a = dst->cnt[i] + src->cnt[i] + carry;
+ int i, carry = 0;
- if (carry)
-
carry = a <
= dst->cnt[i];
- else
-
carry = a < dst->cnt[i]
;
+ for (i = 0; i < STAT_CNT_NUM; ++i) {
+
unsigned x
= dst->cnt[i];
+ unsigned y = src->cnt[i];
+
unsigned a = x + y + carry
;
-
dst->cnt[i] = a
;
+
carry = (int)((x & y) | ((x | y) & ~a)) < 0 ? 1 : 0
;
- if (! carry)
- break;
- }
+ dst->cnt[i] = a;
+ }
}
/**
}
/**
- * add an integer to an counter
+ * add an
(positive)
integer to an counter
*/
static INLINE void cnt_add_i(counter_t *dst, int src)
{
*/
static INLINE void cnt_add_i(counter_t *dst, int src)
{
- int i;
- unsigned a = dst->cnt[0] + src;
- unsigned carry = a < dst->cnt[0];
-
- dst->cnt[0] = a;
- if (! carry)
- return;
+ int i;
+ unsigned carry = src;
-
for (i = 1
; i < STAT_CNT_NUM; ++i) {
- unsigned a = dst->cnt[i] + carry;
+
for (i = 0
; i < STAT_CNT_NUM; ++i) {
+
unsigned a = dst->cnt[i] + carry;
- carry = a < dst->cnt[i];
+
carry = a < dst->cnt[i];
- dst->cnt[i] = a;
+
dst->cnt[i] = a;
- if (! carry)
- break;
- }
+
if (! carry)
+
break;
+
}
}
/**
}
/**
@@
-108,20
+105,20
@@
static INLINE void cnt_add_i(counter_t *dst, int src)
*/
static INLINE int cnt_cmp(const counter_t *a, const counter_t *b)
{
*/
static INLINE int cnt_cmp(const counter_t *a, const counter_t *b)
{
- int i;
- unsigned va, vb;
+
int i;
+
unsigned va, vb;
- for (i = STAT_CNT_NUM - 1 ; i >= 0; --i) {
- va = a->cnt[i];
- vb = b->cnt[i];
+
for (i = STAT_CNT_NUM - 1 ; i >= 0; --i) {
+
va = a->cnt[i];
+
vb = b->cnt[i];
- if (va != vb)
- break;
- }
+
if (va != vb)
+
break;
+
}
- if (va != vb)
- return va < vb ? -1 : 1;
- return 0;
+
if (va != vb)
+
return va < vb ? -1 : 1;
+
return 0;
}
/**
}
/**
@@
-129,18
+126,32
@@
static INLINE int cnt_cmp(const counter_t *a, const counter_t *b)
*/
static INLINE double cnt_to_dbl(const counter_t *a)
{
*/
static INLINE double cnt_to_dbl(const counter_t *a)
{
- int i;
- double res = 0.0, scale = 1.0, tmp;
+
int i;
+
double res = 0.0, scale = 1.0, tmp;
-
i = (1 << (sizeof(a->cnt[i
]) * 4));
- tmp = ((double)i) * ((double)i);
+
i = (1 << (sizeof(a->cnt[0
]) * 4));
+
tmp = ((double)i) * ((double)i);
- for (i = 0; i < STAT_CNT_NUM; ++i) {
- res += scale * (double)a->cnt[i];
+
for (i = 0; i < STAT_CNT_NUM; ++i) {
+
res += scale * (double)a->cnt[i];
- scale *= tmp;
- }
- return res;
+ scale *= tmp;
+ }
+ return res;
+}
+
+/**
+ * convert a counter into an unsigned
+ */
+static INLINE unsigned cnt_to_uint(const counter_t *a)
+{
+ int i;
+
+ for (i = 1; i < STAT_CNT_NUM; ++i)
+ if (a->cnt[i])
+ return UINT_MAX;
+
+ return a->cnt[0];
}
/**
}
/**
@@
-148,13
+159,13
@@
static INLINE double cnt_to_dbl(const counter_t *a)
*/
static INLINE int cnt_eq(const counter_t *a, unsigned value)
{
*/
static INLINE int cnt_eq(const counter_t *a, unsigned value)
{
- int i;
+
int i;
- for (i = 1; i < STAT_CNT_NUM; ++i)
- if (a->cnt[i])
- return 0;
+
for (i = 1; i < STAT_CNT_NUM; ++i)
+
if (a->cnt[i])
+
return 0;
- return a->cnt[0] == value;
+
return a->cnt[0] == value;
}
/**
}
/**
@@
-162,14
+173,13
@@
static INLINE int cnt_eq(const counter_t *a, unsigned value)
*/
static INLINE int cnt_gt(const counter_t *a, unsigned value)
{
*/
static INLINE int cnt_gt(const counter_t *a, unsigned value)
{
- int i;
+
int i;
- for (i = 1; i < STAT_CNT_NUM; ++i)
- if (a->cnt[i])
- return 1;
+
for (i = 1; i < STAT_CNT_NUM; ++i)
+
if (a->cnt[i])
+
return 1;
- return a->cnt[0] > value;
+
return a->cnt[0] > value;
}
}
-
#endif /* _COUNTER_H_ */
#endif /* _COUNTER_H_ */