30 |
|
# error "Undefined 32-bit word blit function" |
31 |
|
#endif |
32 |
|
|
33 |
+ |
#if !defined(FB_BLIT_4) |
34 |
+ |
# error "Undefined 64-bit word blit function" |
35 |
+ |
#endif |
36 |
+ |
|
37 |
|
static void FB_FUNC_NAME(uint8 * dest, const uint8 * source, uint32 length) |
38 |
|
{ |
35 |
– |
#define DEREF_LONG_PTR(ptr, ofs) (((uint32 *)(ptr))[(ofs)]) |
39 |
|
#define DEREF_WORD_PTR(ptr, ofs) (((uint16 *)(ptr))[(ofs)]) |
40 |
+ |
#define DEREF_LONG_PTR(ptr, ofs) (((uint32 *)(ptr))[(ofs)]) |
41 |
+ |
#define DEREF_QUAD_PTR(ptr, ofs) (((uint64 *)(ptr))[(ofs)]) |
42 |
|
|
43 |
|
#ifndef UNALIGNED_PROFITABLE |
44 |
|
#if FB_DEPTH <= 8 |
59 |
|
#endif |
60 |
|
#endif |
61 |
|
|
62 |
< |
// Blit 4-byte words |
63 |
< |
if (length >= 4) { |
64 |
< |
const int remainder = (length / 4) % 8; |
65 |
< |
source += remainder * 4; |
66 |
< |
dest += remainder * 4; |
62 |
> |
// Blit 8-byte words |
63 |
> |
if (length >= 8) { |
64 |
> |
const int remainder = (length / 8) % 8; |
65 |
> |
source += remainder * 8; |
66 |
> |
dest += remainder * 8; |
67 |
|
|
68 |
< |
int n = ((length / 4) + 7) / 8; |
68 |
> |
int n = ((length / 8) + 7) / 8; |
69 |
|
switch (remainder) { |
70 |
|
case 0: do { |
71 |
< |
dest += 32; source += 32; |
72 |
< |
FB_BLIT_2(DEREF_LONG_PTR(dest, -8), DEREF_LONG_PTR(source, -8)); |
73 |
< |
case 7: FB_BLIT_2(DEREF_LONG_PTR(dest, -7), DEREF_LONG_PTR(source, -7)); |
74 |
< |
case 6: FB_BLIT_2(DEREF_LONG_PTR(dest, -6), DEREF_LONG_PTR(source, -6)); |
75 |
< |
case 5: FB_BLIT_2(DEREF_LONG_PTR(dest, -5), DEREF_LONG_PTR(source, -5)); |
76 |
< |
case 4: FB_BLIT_2(DEREF_LONG_PTR(dest, -4), DEREF_LONG_PTR(source, -4)); |
77 |
< |
case 3: FB_BLIT_2(DEREF_LONG_PTR(dest, -3), DEREF_LONG_PTR(source, -3)); |
78 |
< |
case 2: FB_BLIT_2(DEREF_LONG_PTR(dest, -2), DEREF_LONG_PTR(source, -2)); |
79 |
< |
case 1: FB_BLIT_2(DEREF_LONG_PTR(dest, -1), DEREF_LONG_PTR(source, -1)); |
71 |
> |
dest += 64; source += 64; |
72 |
> |
FB_BLIT_4(DEREF_QUAD_PTR(dest, -8), DEREF_QUAD_PTR(source, -8)); |
73 |
> |
case 7: FB_BLIT_4(DEREF_QUAD_PTR(dest, -7), DEREF_QUAD_PTR(source, -7)); |
74 |
> |
case 6: FB_BLIT_4(DEREF_QUAD_PTR(dest, -6), DEREF_QUAD_PTR(source, -6)); |
75 |
> |
case 5: FB_BLIT_4(DEREF_QUAD_PTR(dest, -5), DEREF_QUAD_PTR(source, -5)); |
76 |
> |
case 4: FB_BLIT_4(DEREF_QUAD_PTR(dest, -4), DEREF_QUAD_PTR(source, -4)); |
77 |
> |
case 3: FB_BLIT_4(DEREF_QUAD_PTR(dest, -3), DEREF_QUAD_PTR(source, -3)); |
78 |
> |
case 2: FB_BLIT_4(DEREF_QUAD_PTR(dest, -2), DEREF_QUAD_PTR(source, -2)); |
79 |
> |
case 1: FB_BLIT_4(DEREF_QUAD_PTR(dest, -1), DEREF_QUAD_PTR(source, -1)); |
80 |
|
} while (--n > 0); |
81 |
|
} |
82 |
|
} |
83 |
|
|
84 |
+ |
// There could be one long left to blit |
85 |
+ |
if (length & 4) { |
86 |
+ |
FB_BLIT_2(DEREF_LONG_PTR(dest, 0), DEREF_LONG_PTR(source, 0)); |
87 |
+ |
#if FB_DEPTH <= 16 |
88 |
+ |
dest += 4; |
89 |
+ |
source += 4; |
90 |
+ |
#endif |
91 |
+ |
} |
92 |
+ |
|
93 |
|
#if FB_DEPTH <= 16 |
94 |
|
// There could be one word left to blit |
95 |
|
if (length & 2) { |
121 |
|
#undef FB_BLIT_2 |
122 |
|
#endif |
123 |
|
|
124 |
+ |
#ifdef FB_BLIT_4 |
125 |
+ |
#undef FB_BLIT_4 |
126 |
+ |
#endif |
127 |
+ |
|
128 |
|
#ifdef FB_DEPTH |
129 |
|
#undef FB_DEPTH |
130 |
|
#endif |