summary refs log tree commit diff
path: root/pkgs/applications/networking/p2p/mldonkey/gcc44mips64.patch
blob: 41449dcdd05c4142aa2ee504087b49d5db91a9ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Patch fixing CryptoPP so:
- it builds properly in mips64 with gcc 4.4 (gcc 4.4 does not have the 'h' asm constraint)
- it runs properly in mips64 (where lack of templated *Precision functions gave wrong numbers).
  An assertion check failed without this.

diff --git a/src/utils/lib/CryptoPP.cc b/src/utils/lib/CryptoPP.cc
index 9208e1c..6b12b0a 100644
--- a/src/utils/lib/CryptoPP.cc
+++ b/src/utils/lib/CryptoPP.cc
@@ -890,35 +890,6 @@ unsigned int Parity(unsigned long value)
 	return (unsigned int)value&1;
 }
 
-unsigned int BytePrecision(unsigned long value)
-{
-	unsigned int i;
-	for (i=sizeof(value); i; --i)
-		if (value >> (i-1)*8)
-			break;
-
-	return i;
-}
-
-unsigned int BitPrecision(unsigned long value)
-{
-	if (!value)
-		return 0;
-
-	unsigned int l=0, h=8*sizeof(value);
-
-	while (h-l > 1)
-	{
-		unsigned int t = (l+h)/2;
-		if (value >> t)
-			l = t;
-		else
-			h = t;
-	}
-
-	return h;
-}
-
 unsigned long Crop(unsigned long value, unsigned int size)
 {
 	if (size < 8*sizeof(value))
@@ -1880,7 +1851,10 @@ public:
 		#elif defined(__x86_64__)
 			__asm__("mulq %3" : "=d" (r.m_halfs.high), "=a" (r.m_halfs.low) : "a" (a), "rm" (b) : "cc");
 		#elif defined(__mips64)
-			__asm__("dmultu %2,%3" : "=h" (r.m_halfs.high), "=l" (r.m_halfs.low) : "r" (a), "r" (b));
+      //typedef unsigned int uint128_t __attribute__((mode(TI)));
+      __uint128_t tmp = (__uint128_t) a * b;
+      r.m_halfs.high = tmp >> 64;
+      r.m_halfs.low = tmp;
 		#elif defined(_M_IX86)
 			// for testing
 			word64 t = (word64)a * b;
diff --git a/src/utils/lib/CryptoPP.h b/src/utils/lib/CryptoPP.h
index d2ec1b2..775a898 100644
--- a/src/utils/lib/CryptoPP.h
+++ b/src/utils/lib/CryptoPP.h
@@ -1869,10 +1869,39 @@ template <class T> inline const T& STDMAX(const T& a, const T& b)
 // #define GETBYTE(x, y) (((byte *)&(x))[y])
 
 CRYPTOPP_DLL unsigned int Parity(unsigned long);
-CRYPTOPP_DLL unsigned int BytePrecision(unsigned long);
-CRYPTOPP_DLL unsigned int BitPrecision(unsigned long);
 CRYPTOPP_DLL unsigned long Crop(unsigned long, unsigned int size);
 
+template <typename T>
+unsigned int BitPrecision(const T &value)
+{
+	if (!value)
+		return 0;
+
+	unsigned int l=0, h=8*sizeof(value);
+
+	while (h-l > 1)
+	{
+		unsigned int t = (l+h)/2;
+		if (value >> t)
+			l = t;
+		else
+			h = t;
+	}
+
+	return h;
+}
+
+template <typename T>
+unsigned int BytePrecision(const T &value)
+{
+	unsigned int i;
+	for (i=sizeof(value); i; --i)
+		if (value >> (i-1)*8)
+			break;
+
+	return i;
+}
+
 inline unsigned int BitsToBytes(unsigned int bitCount)
 {
 	return ((bitCount+7)/(8));