--- deliantra/server/include/devel.h 2008/12/26 10:36:42 1.1
+++ deliantra/server/include/devel.h 2009/10/12 14:00:58 1.4
@@ -1,20 +1,21 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ * Copyright (©) 2008,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
*
- * Deliantra is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * Deliantra is free software: you can redistribute it and/or modify it under
+ * the terms of the Affero GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * You should have received a copy of the Affero GNU General Public License
+ * and the GNU General Public License along with this program. If not, see
+ * .
*
* The authors can be reached via e-mail to
*/
@@ -27,27 +28,57 @@
#define DEVEL_H
// used for benchmarking (x86/amd64-specific)
-typedef unsigned int cstamp;
+#ifdef DEVEL64
+typedef uint64_t cstamp;
+#else
+typedef uint32_t cstamp;
+#endif
+
+#if defined(__i386__) || defined(__x86_64__)
static inline cstamp
stamp (void)
{
- cstamp tsc;
- asm volatile ("rdtsc":"=a" (tsc)::"edx");
+ uint32_t l, h;
+
+ asm volatile ("rdtsc" : "=a" (l), "=d" (h));
- return tsc;
+#ifdef DEVEL64
+ return ((cstamp)h << 32) | l;
+#else
+ return l;
+#endif
}
+#elif defined(__powerpc__)
static inline cstamp
-measure (cstamp t)
+stamp (void)
{
- cstamp tsc;
- asm volatile ("rdtsc":"=a" (tsc)::"edx");
+ unsigned uint32_t u, l, tmp;
+
+ asm volatile (
+ "0: \n"
+ "\tmftbu %0 \n"
+ "\tmftb %1 \n"
+ "\tmftbu %2 \n"
+ "\tcmpw %2,%0\n"
+ "\tbne 0b \n"
+ : "=r" (h), "=r" (l), "=r" (tmp)
+ );
+
+#ifdef DEVEL64
+ return ((cstamp)h << 32) | l;
+#else
+ return l;
+#endif
+}
+
+#endif
- if (tsc > t)
- return tsc - t;
- else
- return t - tsc;
+static inline cstamp
+measure (cstamp t)
+{
+ return stamp () - t;
}
// cstamp s = stamp ();