Commit | Line | Data |
---|---|---|
cffb78b0 KL |
1 | /* |
2 | * lz4defs.h -- architecture specific defines | |
3 | * | |
4 | * Copyright (C) 2013, LG Electronics, Kyungsik Lee <kyungsik.lee@lge.com> | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 as | |
8 | * published by the Free Software Foundation. | |
9 | */ | |
10 | ||
11 | /* | |
12 | * Detects 64 bits mode | |
13 | */ | |
3e26a691 | 14 | #if defined(CONFIG_64BIT) |
cffb78b0 KL |
15 | #define LZ4_ARCH64 1 |
16 | #else | |
17 | #define LZ4_ARCH64 0 | |
18 | #endif | |
19 | ||
20 | /* | |
21 | * Architecture-specific macros | |
22 | */ | |
23 | #define BYTE u8 | |
c72ac7a1 CM |
24 | typedef struct _U16_S { u16 v; } U16_S; |
25 | typedef struct _U32_S { u32 v; } U32_S; | |
26 | typedef struct _U64_S { u64 v; } U64_S; | |
dea5c24a | 27 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) |
cffb78b0 | 28 | |
c72ac7a1 | 29 | #define A16(x) (((U16_S *)(x))->v) |
cffb78b0 KL |
30 | #define A32(x) (((U32_S *)(x))->v) |
31 | #define A64(x) (((U64_S *)(x))->v) | |
32 | ||
33 | #define PUT4(s, d) (A32(d) = A32(s)) | |
34 | #define PUT8(s, d) (A64(d) = A64(s)) | |
3e26a691 RS |
35 | |
36 | #define LZ4_READ_LITTLEENDIAN_16(d, s, p) \ | |
37 | (d = s - A16(p)) | |
38 | ||
c72ac7a1 CM |
39 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ |
40 | do { \ | |
41 | A16(p) = v; \ | |
42 | p += 2; \ | |
43 | } while (0) | |
cffb78b0 KL |
44 | #else /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */ |
45 | ||
c72ac7a1 CM |
46 | #define A64(x) get_unaligned((u64 *)&(((U16_S *)(x))->v)) |
47 | #define A32(x) get_unaligned((u32 *)&(((U16_S *)(x))->v)) | |
48 | #define A16(x) get_unaligned((u16 *)&(((U16_S *)(x))->v)) | |
49 | ||
cffb78b0 KL |
50 | #define PUT4(s, d) \ |
51 | put_unaligned(get_unaligned((const u32 *) s), (u32 *) d) | |
52 | #define PUT8(s, d) \ | |
53 | put_unaligned(get_unaligned((const u64 *) s), (u64 *) d) | |
c72ac7a1 | 54 | |
3e26a691 RS |
55 | #define LZ4_READ_LITTLEENDIAN_16(d, s, p) \ |
56 | (d = s - get_unaligned_le16(p)) | |
57 | ||
58 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ | |
59 | do { \ | |
60 | put_unaligned_le16(v, (u16 *)(p)); \ | |
61 | p += 2; \ | |
c72ac7a1 | 62 | } while (0) |
cffb78b0 KL |
63 | #endif |
64 | ||
65 | #define COPYLENGTH 8 | |
66 | #define ML_BITS 4 | |
67 | #define ML_MASK ((1U << ML_BITS) - 1) | |
68 | #define RUN_BITS (8 - ML_BITS) | |
69 | #define RUN_MASK ((1U << RUN_BITS) - 1) | |
c72ac7a1 CM |
70 | #define MEMORY_USAGE 14 |
71 | #define MINMATCH 4 | |
72 | #define SKIPSTRENGTH 6 | |
73 | #define LASTLITERALS 5 | |
74 | #define MFLIMIT (COPYLENGTH + MINMATCH) | |
75 | #define MINLENGTH (MFLIMIT + 1) | |
76 | #define MAXD_LOG 16 | |
77 | #define MAXD (1 << MAXD_LOG) | |
78 | #define MAXD_MASK (u32)(MAXD - 1) | |
79 | #define MAX_DISTANCE (MAXD - 1) | |
80 | #define HASH_LOG (MAXD_LOG - 1) | |
81 | #define HASHTABLESIZE (1 << HASH_LOG) | |
82 | #define MAX_NB_ATTEMPTS 256 | |
83 | #define OPTIMAL_ML (int)((ML_MASK-1)+MINMATCH) | |
84 | #define LZ4_64KLIMIT ((1<<16) + (MFLIMIT - 1)) | |
85 | #define HASHLOG64K ((MEMORY_USAGE - 2) + 1) | |
86 | #define HASH64KTABLESIZE (1U << HASHLOG64K) | |
87 | #define LZ4_HASH_VALUE(p) (((A32(p)) * 2654435761U) >> \ | |
88 | ((MINMATCH * 8) - (MEMORY_USAGE-2))) | |
89 | #define LZ4_HASH64K_VALUE(p) (((A32(p)) * 2654435761U) >> \ | |
90 | ((MINMATCH * 8) - HASHLOG64K)) | |
91 | #define HASH_VALUE(p) (((A32(p)) * 2654435761U) >> \ | |
92 | ((MINMATCH * 8) - HASH_LOG)) | |
cffb78b0 KL |
93 | |
94 | #if LZ4_ARCH64/* 64-bit */ | |
95 | #define STEPSIZE 8 | |
96 | ||
97 | #define LZ4_COPYSTEP(s, d) \ | |
98 | do { \ | |
99 | PUT8(s, d); \ | |
100 | d += 8; \ | |
101 | s += 8; \ | |
102 | } while (0) | |
103 | ||
104 | #define LZ4_COPYPACKET(s, d) LZ4_COPYSTEP(s, d) | |
105 | ||
106 | #define LZ4_SECURECOPY(s, d, e) \ | |
107 | do { \ | |
108 | if (d < e) { \ | |
109 | LZ4_WILDCOPY(s, d, e); \ | |
110 | } \ | |
111 | } while (0) | |
c72ac7a1 CM |
112 | #define HTYPE u32 |
113 | ||
114 | #ifdef __BIG_ENDIAN | |
115 | #define LZ4_NBCOMMONBYTES(val) (__builtin_clzll(val) >> 3) | |
116 | #else | |
117 | #define LZ4_NBCOMMONBYTES(val) (__builtin_ctzll(val) >> 3) | |
118 | #endif | |
cffb78b0 KL |
119 | |
120 | #else /* 32-bit */ | |
121 | #define STEPSIZE 4 | |
122 | ||
123 | #define LZ4_COPYSTEP(s, d) \ | |
124 | do { \ | |
125 | PUT4(s, d); \ | |
126 | d += 4; \ | |
127 | s += 4; \ | |
128 | } while (0) | |
129 | ||
130 | #define LZ4_COPYPACKET(s, d) \ | |
131 | do { \ | |
132 | LZ4_COPYSTEP(s, d); \ | |
133 | LZ4_COPYSTEP(s, d); \ | |
134 | } while (0) | |
135 | ||
136 | #define LZ4_SECURECOPY LZ4_WILDCOPY | |
c72ac7a1 CM |
137 | #define HTYPE const u8* |
138 | ||
139 | #ifdef __BIG_ENDIAN | |
140 | #define LZ4_NBCOMMONBYTES(val) (__builtin_clz(val) >> 3) | |
141 | #else | |
142 | #define LZ4_NBCOMMONBYTES(val) (__builtin_ctz(val) >> 3) | |
143 | #endif | |
144 | ||
cffb78b0 KL |
145 | #endif |
146 | ||
cffb78b0 KL |
147 | #define LZ4_WILDCOPY(s, d, e) \ |
148 | do { \ | |
149 | LZ4_COPYPACKET(s, d); \ | |
150 | } while (d < e) | |
c72ac7a1 CM |
151 | |
152 | #define LZ4_BLINDCOPY(s, d, l) \ | |
153 | do { \ | |
154 | u8 *e = (d) + l; \ | |
155 | LZ4_WILDCOPY(s, d, e); \ | |
156 | d = e; \ | |
157 | } while (0) |