summaryrefslogtreecommitdiff
path: root/security/gostsum/files/patch-gosthash.c
blob: 211dab17ad2847484d681c596fcd84c824a656b6 (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
--- gosthash.c.orig	2022-12-13 13:51:25 UTC
+++ gosthash.c
@@ -26,9 +26,8 @@ echo -n "8JaanTcVv6ndF8Xp/N011Lp46e68LjaUT9FhnEyQGs8="
 #if defined(__sun__) || defined(__linux__) || defined(__FreeBSD__)
 #define _aligned_malloc(size, align) memalign(align, size)
 #define _aligned_free(ptr) free(ptr)
-#else
-#include <malloc.h>
 #endif // __sun__ __linux__ __FreeBSD__
+#include <malloc.h>
 
 typedef char v16qi __attribute__((__vector_size__(16)));
 //typedef uint8_t v4qi __attribute__((__vector_size__(4)));
@@ -141,7 +140,53 @@ static inline void XOR(v256 *x, const v256 *a)
     x->q[1] ^= a->q[1];
 }
 #if defined(__arm__)
-extern void UADD(v256 *a, v256 *b);
+static inline
+void UADD(v256 *a, v256 *b)
+{
+    __asm volatile (
+    "   ldmia %0, {r0, r1, r2, r3}\n"
+    "   ldmia %1!, {r4, r5, r6, r7}\n"
+    "   adds  r0, r0, r4\n"
+    "   adcs  r1, r1, r5\n"
+    "   adcs  r2, r2, r6\n"
+    "   adcs  r3, r3, r7\n"
+    "   stmia %0!, {r0, r1, r2, r3}\n"
+
+    "   ldmia %0, {r0, r1, r2, r3}\n"
+    "   ldmia %1!, {r4, r5, r6, r7}\n"
+    "   adcs  r0, r0, r4\n"
+    "   adcs  r1, r1, r5\n"
+    "   adcs  r2, r2, r6\n"
+    "   adcs  r3, r3, r7\n"
+    "   stmia %0!, {r0, r1, r2, r3}\n"
+
+    "   sub   %0, %0, #64\n"
+    "   sub   %1, %1, #64\n"
+
+    :: "r"(a), "r"(b) : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "memory");
+}
+#elif defined(__aarch64__)
+static inline
+void UADD(v256 *a, v256 *b)
+{
+    uint64_t a0, a1, b0, b1;
+
+    __asm volatile (
+    "   ldp   %0, %1, [%4, #0]\n"
+    "   ldp   %2, %3, [%5, #0]\n"
+    "   adds  %0, %0, %2\n"
+    "   adcs  %1, %1, %3\n"
+    "   stp   %0, %1, [%4, #0]\n"
+
+    "   ldp   %0, %1, [%4, #16]\n"
+    "   ldp   %2, %3, [%5, #16]\n"
+    "   adcs  %0, %0, %2\n"
+    "   adcs  %1, %1, %3\n"
+    "   stp   %0, %1, [%4, #16]\n"
+
+    : "=r"(a0), "=r"(a1), "=r"(b0), "=r"(b1)
+    : "r"(a), "r"(b) : "memory");
+}
 
 #elif defined(__x86_64__)//0
 static inline