ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/video_blit.h
(Generate patch)

Comparing BasiliskII/src/Unix/video_blit.h (file contents):
Revision 1.4 by gbeauche, 2001-01-28T14:05:19Z vs.
Revision 1.5 by gbeauche, 2001-08-19T17:38:11Z

# Line 30 | Line 30
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
# Line 54 | Line 59 | static void FB_FUNC_NAME(uint8 * dest, c
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) {
# Line 107 | Line 121 | static void FB_FUNC_NAME(uint8 * dest, c
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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines