FastLED 3.9.15
Loading...
Searching...
No Matches
bitswap.h
Go to the documentation of this file.
1#pragma once
2
3#ifndef __INC_BITSWAP_H
4#define __INC_BITSWAP_H
5
6#include "FastLED.h"
7#include "fl/force_inline.h"
8#include "fl/int.h"
9
12
14
15
16#if defined(FASTLED_ARM) || defined(FASTLED_ESP8266) || defined(FASTLED_DOXYGEN)
18typedef union {
20 struct {
21 fl::u32 a0:1;
22 fl::u32 a1:1;
23 fl::u32 a2:1;
24 fl::u32 a3:1;
25 fl::u32 a4:1;
26 fl::u32 a5:1;
27 fl::u32 a6:1;
28 fl::u32 a7:1;
29 };
30} just8bits;
31
33typedef struct {
34 fl::u32 a0:1;
35 fl::u32 a1:1;
36 fl::u32 a2:1;
37 fl::u32 a3:1;
38 fl::u32 a4:1;
39 fl::u32 a5:1;
40 fl::u32 a6:1;
41 fl::u32 a7:1;
42 fl::u32 b0:1;
43 fl::u32 b1:1;
44 fl::u32 b2:1;
45 fl::u32 b3:1;
46 fl::u32 b4:1;
47 fl::u32 b5:1;
48 fl::u32 b6:1;
49 fl::u32 b7:1;
50 fl::u32 c0:1;
51 fl::u32 c1:1;
52 fl::u32 c2:1;
53 fl::u32 c3:1;
54 fl::u32 c4:1;
55 fl::u32 c5:1;
56 fl::u32 c6:1;
57 fl::u32 c7:1;
58 fl::u32 d0:1;
59 fl::u32 d1:1;
60 fl::u32 d2:1;
61 fl::u32 d3:1;
62 fl::u32 d4:1;
63 fl::u32 d5:1;
64 fl::u32 d6:1;
65 fl::u32 d7:1;
66} sub4;
67
69typedef union {
70 fl::u32 word[2];
72 struct {
73 sub4 a;
74 sub4 b;
75 };
77
78
84#define SWAPSA(X,N) out. X ## 0 = in.a.a ## N; \
85 out. X ## 1 = in.a.b ## N; \
86 out. X ## 2 = in.a.c ## N; \
87 out. X ## 3 = in.a.d ## N;
88
94#define SWAPSB(X,N) out. X ## 0 = in.b.a ## N; \
95 out. X ## 1 = in.b.b ## N; \
96 out. X ## 2 = in.b.c ## N; \
97 out. X ## 3 = in.b.d ## N;
98
104#define SWAPS(X,N) out. X ## 0 = in.a.a ## N; \
105 out. X ## 1 = in.a.b ## N; \
106 out. X ## 2 = in.a.c ## N; \
107 out. X ## 3 = in.a.d ## N; \
108 out. X ## 4 = in.b.a ## N; \
109 out. X ## 5 = in.b.b ## N; \
110 out. X ## 6 = in.b.c ## N; \
111 out. X ## 7 = in.b.d ## N;
112
113
116
117 // SWAPS(a.a,7);
118 // SWAPS(a.b,6);
119 // SWAPS(a.c,5);
120 // SWAPS(a.d,4);
121 // SWAPS(b.a,3);
122 // SWAPS(b.b,2);
123 // SWAPS(b.c,1);
124 // SWAPS(b.d,0);
125
126 // SWAPSA(a.a,7);
127 // SWAPSA(a.b,6);
128 // SWAPSA(a.c,5);
129 // SWAPSA(a.d,4);
130 //
131 // SWAPSB(a.a,7);
132 // SWAPSB(a.b,6);
133 // SWAPSB(a.c,5);
134 // SWAPSB(a.d,4);
135 //
136 // SWAPSA(b.a,3);
137 // SWAPSA(b.b,2);
138 // SWAPSA(b.c,1);
139 // SWAPSA(b.d,0);
140 // //
141 // SWAPSB(b.a,3);
142 // SWAPSB(b.b,2);
143 // SWAPSB(b.c,1);
144 // SWAPSB(b.d,0);
145
146 for(int i = 0; i < 8; ++i) {
147 just8bits work;
148 work.a3 = in.word[0] >> 31;
149 work.a2 = in.word[0] >> 23;
150 work.a1 = in.word[0] >> 15;
151 work.a0 = in.word[0] >> 7;
152 in.word[0] <<= 1;
153 work.a7 = in.word[1] >> 31;
154 work.a6 = in.word[1] >> 23;
155 work.a5 = in.word[1] >> 15;
156 work.a4 = in.word[1] >> 7;
157 in.word[1] <<= 1;
158 out.bytes[i] = work.raw;
159 }
160}
161
163FASTLED_FORCE_INLINE void slowswap(unsigned char *A, unsigned char *B) {
164
165 for(int row = 0; row < 7; ++row) {
166 fl::u8 x = A[row];
167
168 fl::u8 bit = (1<<row);
169 unsigned char *p = B;
170 for(fl::u32 mask = 1<<7 ; mask ; mask >>= 1) {
171 if(x & mask) {
172 *p++ |= bit;
173 } else {
174 *p++ &= ~bit;
175 }
176 }
177 // B[7] |= (x & 0x01) << row; x >>= 1;
178 // B[6] |= (x & 0x01) << row; x >>= 1;
179 // B[5] |= (x & 0x01) << row; x >>= 1;
180 // B[4] |= (x & 0x01) << row; x >>= 1;
181 // B[3] |= (x & 0x01) << row; x >>= 1;
182 // B[2] |= (x & 0x01) << row; x >>= 1;
183 // B[1] |= (x & 0x01) << row; x >>= 1;
184 // B[0] |= (x & 0x01) << row; x >>= 1;
185 }
186}
187
191void transpose8x1_noinline(unsigned char *A, unsigned char *B);
192
194FASTLED_FORCE_INLINE void transpose8x1(unsigned char *A, unsigned char *B) {
195 fl::u32 x, y, t;
196
197 // Load the array and pack it into x and y.
198 y = *(unsigned int*)(A);
199 x = *(unsigned int*)(A+4);
200
201 // pre-transform x
202 t = (x ^ (x >> 7)) & 0x00AA00AA; x = x ^ t ^ (t << 7);
203 t = (x ^ (x >>14)) & 0x0000CCCC; x = x ^ t ^ (t <<14);
204
205 // pre-transform y
206 t = (y ^ (y >> 7)) & 0x00AA00AA; y = y ^ t ^ (t << 7);
207 t = (y ^ (y >>14)) & 0x0000CCCC; y = y ^ t ^ (t <<14);
208
209 // final transform
210 t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
211 y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
212 x = t;
213
214 *((uint32_t*)B) = y;
215 *((uint32_t*)(B+4)) = x;
216}
217
220FASTLED_FORCE_INLINE void transpose8x1_MSB(unsigned char *A, unsigned char *B) {
221 fl::u32 x, y, t;
222
223 // Load the array and pack it into x and y.
224 y = *(unsigned int*)(A);
225 x = *(unsigned int*)(A+4);
226
227 // pre-transform x
228 t = (x ^ (x >> 7)) & 0x00AA00AA; x = x ^ t ^ (t << 7);
229 t = (x ^ (x >>14)) & 0x0000CCCC; x = x ^ t ^ (t <<14);
230
231 // pre-transform y
232 t = (y ^ (y >> 7)) & 0x00AA00AA; y = y ^ t ^ (t << 7);
233 t = (y ^ (y >>14)) & 0x0000CCCC; y = y ^ t ^ (t <<14);
234
235 // final transform
236 t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
237 y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
238 x = t;
239
240 B[7] = y; y >>= 8;
241 B[6] = y; y >>= 8;
242 B[5] = y; y >>= 8;
243 B[4] = y;
244
245 B[3] = x; x >>= 8;
246 B[2] = x; x >>= 8;
247 B[1] = x; x >>= 8;
248 B[0] = x; /* */
249}
250
253template<int m, int n>
254FASTLED_FORCE_INLINE void transpose8(unsigned char *A, unsigned char *B) {
255 fl::u32 x, y, t;
256
257 // Load the array and pack it into x and y.
258 if(m == 1) {
259 y = *(unsigned int*)(A);
260 x = *(unsigned int*)(A+4);
261 } else {
262 x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
263 y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
264 }
265
266 // pre-transform x
267 t = (x ^ (x >> 7)) & 0x00AA00AA; x = x ^ t ^ (t << 7);
268 t = (x ^ (x >>14)) & 0x0000CCCC; x = x ^ t ^ (t <<14);
269
270 // pre-transform y
271 t = (y ^ (y >> 7)) & 0x00AA00AA; y = y ^ t ^ (t << 7);
272 t = (y ^ (y >>14)) & 0x0000CCCC; y = y ^ t ^ (t <<14);
273
274 // final transform
275 t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
276 y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
277 x = t;
278
279 B[7*n] = y; y >>= 8;
280 B[6*n] = y; y >>= 8;
281 B[5*n] = y; y >>= 8;
282 B[4*n] = y;
283
284 B[3*n] = x; x >>= 8;
285 B[2*n] = x; x >>= 8;
286 B[n] = x; x >>= 8;
287 B[0] = x;
288 // B[0]=x>>24; B[n]=x>>16; B[2*n]=x>>8; B[3*n]=x>>0;
289 // B[4*n]=y>>24; B[5*n]=y>>16; B[6*n]=y>>8; B[7*n]=y>>0;
290}
291
292#endif
293
295
296#endif
int y
Definition simple.h:93
int x
Definition simple.h:92
central include file for FastLED, defines the CFastLED class/object
FASTLED_FORCE_INLINE void swapbits8(bitswap_type in, bitswap_type &out)
Do an 8-byte by 8-bit rotation.
Definition bitswap.h:115
FASTLED_FORCE_INLINE void transpose8x1_MSB(unsigned char *A, unsigned char *B)
Simplified form of bits rotating function.
Definition bitswap.h:220
FASTLED_FORCE_INLINE void transpose8x1(unsigned char *A, unsigned char *B)
Simplified form of bits rotating function.
Definition bitswap.h:194
FASTLED_FORCE_INLINE void slowswap(unsigned char *A, unsigned char *B)
Slow version of the 8 byte by 8 bit rotation.
Definition bitswap.h:163
void transpose8x1_noinline(unsigned char *A, unsigned char *B)
Simplified form of bits rotating function.
FASTLED_FORCE_INLINE void transpose8(unsigned char *A, unsigned char *B)
Templated bit-rotating function.
Definition bitswap.h:254
fl::u32 a6
byte 'a', bit 6 (0x00000040)
Definition bitswap.h:40
sub4 a
32-bit access struct for bit swapping, upper four bytes (word[0] or bytes[0-3])
fl::u32 c7
byte 'c', bit 7 (0x00800000)
Definition bitswap.h:57
fl::u32 b4
byte 'b', bit 4 (0x00001000)
Definition bitswap.h:46
fl::u32 d6
byte 'd', bit 6 (0x40000000)
Definition bitswap.h:64
fl::u8 bytes[8]
eight 8-bit values to load for swapping
Definition bitswap.h:71
fl::u32 a5
bit 5 (0x20)
fl::u32 b3
byte 'b', bit 3 (0x00000800)
Definition bitswap.h:45
fl::u8 raw
the entire byte
Definition bitswap.h:19
fl::u32 a0
bit 0 (0x01)
fl::u32 c5
byte 'c', bit 5 (0x00200000)
Definition bitswap.h:55
fl::u32 c6
byte 'c', bit 6 (0x00400000)
Definition bitswap.h:56
fl::u32 c2
byte 'c', bit 2 (0x00040000)
Definition bitswap.h:52
fl::u32 c3
byte 'c', bit 3 (0x00080000)
Definition bitswap.h:53
fl::u32 a2
bit 2 (0x04)
fl::u32 a1
byte 'a', bit 1 (0x00000002)
Definition bitswap.h:35
fl::u32 d5
byte 'd', bit 5 (0x20000000)
Definition bitswap.h:63
fl::u32 d2
byte 'd', bit 2 (0x04000000)
Definition bitswap.h:60
fl::u32 b6
byte 'b', bit 6 (0x00004000)
Definition bitswap.h:48
fl::u32 a4
bit 4 (0x10)
fl::u32 b1
byte 'b', bit 1 (0x00000200)
Definition bitswap.h:43
fl::u32 a1
bit 1 (0x02)
fl::u32 b7
byte 'b', bit 7 (0x00008000)
Definition bitswap.h:49
fl::u32 a7
byte 'a', bit 7 (0x00000080)
Definition bitswap.h:41
sub4 b
32-bit access struct for bit swapping, lower four bytes (word[1] or bytes[4-7])
fl::u32 word[2]
two 32-bit values to load for swapping
Definition bitswap.h:70
fl::u32 b2
byte 'b', bit 2 (0x00000400)
Definition bitswap.h:44
fl::u32 d3
byte 'd', bit 3 (0x08000000)
Definition bitswap.h:61
fl::u32 d4
byte 'd', bit 4 (0x10000000)
Definition bitswap.h:62
fl::u32 c4
byte 'c', bit 4 (0x00100000)
Definition bitswap.h:54
fl::u32 a3
bit 3 (0x08)
fl::u32 c0
byte 'c', bit 0 (0x00010000)
Definition bitswap.h:50
fl::u32 a5
byte 'a', bit 5 (0x00000020)
Definition bitswap.h:39
fl::u32 a7
bit 7 (0x80)
fl::u32 c1
byte 'c', bit 1 (0x00020000)
Definition bitswap.h:51
fl::u32 a2
byte 'a', bit 2 (0x00000004)
Definition bitswap.h:36
fl::u32 d0
byte 'd', bit 0 (0x01000000)
Definition bitswap.h:58
fl::u32 d7
byte 'd', bit 7 (0x80000000)
Definition bitswap.h:65
fl::u32 a0
byte 'a', bit 0 (0x00000000)
Definition bitswap.h:34
fl::u32 b5
byte 'b', bit 5 (0x00002000)
Definition bitswap.h:47
fl::u32 a4
byte 'a', bit 4 (0x00000010)
Definition bitswap.h:38
fl::u32 a3
byte 'a', bit 3 (0x00000008)
Definition bitswap.h:37
fl::u32 d1
byte 'd', bit 1 (0x02000000)
Definition bitswap.h:59
fl::u32 a6
bit 6 (0x40)
fl::u32 b0
byte 'b', bit 0 (0x00000100)
Definition bitswap.h:42
Structure representing 8 bits of access.
Definition bitswap.h:18
Union containing a full 8 bytes to swap the bit orientation on.
Definition bitswap.h:69
Structure representing 32 bits of access.
Definition bitswap.h:33
static uint32_t t
Definition Luminova.h:54
#define FASTLED_FORCE_INLINE
Definition force_inline.h:6
#define FASTLED_NAMESPACE_END
Definition namespace.h:23
#define FASTLED_NAMESPACE_BEGIN
Definition namespace.h:22
unsigned char u8
Definition int.h:17