--- deliantra/server/include/devel.h 2008/12/30 07:24:16 1.2
+++ deliantra/server/include/devel.h 2018/11/17 23:40:00 1.11
@@ -1,21 +1,23 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2008 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.
- *
+ *
+ * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
+ * Copyright (©) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 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 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,16 +29,53 @@
#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 ()
+{
+ uint32_t l, h;
+
+ asm volatile ("rdtsc" : "=a" (l), "=d" (h));
+
+#ifdef DEVEL64
+ return ((cstamp)h << 32) | l;
+#else
+ return l;
+#endif
+}
+
+#elif defined(__powerpc__)
static inline cstamp
-stamp (void)
+stamp ()
{
- cstamp tsc;
- asm volatile ("rdtsc" : "=a" (tsc) : : "edx");
- return tsc;
+ 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
+
static inline cstamp
measure (cstamp t)
{