1#include <stdint.h>
2#include <assert.h>
3
4asm(".arch armv8.4-a");
5
6void do_test(uint64_t value)
7{
8 uint64_t salt1, salt2;
9 uint64_t encode, decode;
10
11
12
13
14
15
16
17 for (salt1 = 1; ; salt1++) {
18 asm volatile("pacda %0, %2" : "=r"(encode) : "0"(value), "r"(salt1));
19 if (encode != value) {
20 break;
21 }
22 }
23
24
25 asm volatile("autda %0, %2" : "=r"(decode) : "0"(encode), "r"(salt1));
26 assert(decode == value);
27
28
29
30
31
32
33 for (salt2 = salt1 + 1; ; salt2++) {
34 asm volatile("autda %0, %2" : "=r"(decode) : "0"(encode), "r"(salt2));
35 if (decode != value) {
36 break;
37 }
38 }
39
40
41 assert(((decode ^ value) & 0xff80ffffffffffffull) == 0);
42
43
44
45
46
47
48 if ((value >> 55) & 1) {
49 assert(((decode >> 48) & 0xff) == 0b10111111);
50 } else {
51 assert(((decode >> 48) & 0xff) == 0b00100000);
52 }
53}
54
55int main()
56{
57 do_test(0);
58 do_test(-1);
59 do_test(0xda004acedeadbeefull);
60 return 0;
61}
62