|
|
1.1.1.2 root 1: ; Copyright 1992 Eric R. Smith
2:
1.1.1.3 root 3: ; Copyright 1993 Atari Corporation
4:
1.1.1.2 root 5: ; All rights reserved.
6:
1.1 root 7: ;
8:
9: ; quickmove(char *dst, char *src, long nbytes):
10:
11: ; quickly copy "nbytes" bytes from src to dst. Assumes that both
12:
13: ; src and dst are word aligned.
14:
15: ;
16:
1.1.1.4 ! root 17: ; quickmovb(char *dst, char *src, long nbytes):
! 18:
! 19: ; like memcpy, does unaligned too... does not check for overlap (memmove).
! 20:
! 21: ;
! 22:
1.1 root 23: TEXT
24:
25:
26:
27: XDEF _quickmove
28:
1.1.1.4 ! root 29: XDEF _quickmovb
! 30:
! 31:
! 32:
! 33: ;%ifdef OWN_LIB
! 34:
! 35: XDEF _bcopy
! 36:
! 37: XDEF __bcopy
! 38:
! 39: XDEF _memcpy
! 40:
! 41:
! 42:
! 43: _bcopy:
! 44:
! 45: __bcopy:
! 46:
! 47: move.l 8(sp),a0 ; get dst
! 48:
! 49: move.l 4(sp),a1 ; get src
! 50:
! 51: bra.s _quickmovb1
! 52:
! 53: ;%endif
! 54:
! 55:
! 56:
! 57: ; for gcc >= 2.5.8
! 58:
! 59: _memcpy:
! 60:
! 61:
! 62:
! 63: _quickmovb:
! 64:
! 65: move.l 4(sp),a0 ; get dst
! 66:
! 67: move.l 8(sp),a1 ; get src
! 68:
! 69: _quickmovb1:
! 70:
! 71: move.w a0,d0
! 72:
! 73: move.w a1,d1
! 74:
! 75: eor.w d1,d0 ; bit 0 == unaligned
! 76:
! 77: lsr.w #1,d0 ; ...now in x flag
! 78:
! 79: move.l 12(sp),d0 ; get nbytes
! 80:
! 81: beq Ldone
! 82:
! 83: roxr.w #1,d1 ; bit 0 == both odd, msb == unaligned
1.1 root 84:
1.1.1.4 ! root 85: bmi bytecopy ; unaligned, do the slow thing...
! 86:
! 87: bcc.s quickmov1 ; both even, ok
! 88:
! 89: subq.l #1,d0 ; both odd, can be fixed
! 90:
! 91: move.b (a1)+,(a0)+
! 92:
! 93: bra.s quickmov1
! 94:
! 95:
1.1 root 96:
97: _quickmove:
98:
99: move.l 4(sp),a0 ; get dst
100:
101: move.l 8(sp),a1 ; get src
102:
103: move.l 12(sp),d0 ; get nbytes
104:
1.1.1.4 ! root 105: quickmov1:
! 106:
! 107: move.w #$1ff,d1
! 108:
! 109: and.w d0,d1 ; d1 = nbytes % 512
! 110:
1.1 root 111: lsr.l #8,d0 ;
112:
113: lsr.l #1,d0 ; d0 = nbytes / 512
114:
1.1.1.4 ! root 115: ble.s Leftover ; if <= 0, skip
! 116:
1.1 root 117:
118:
119: movem.l d1-d7/a2-a6,-(sp) ; save regs
120:
121: L1:
122:
123: movem.l (a1)+,d1-d7/a2-a6 ; read 12*4 = 48 bytes
124:
125: movem.l d1-d7/a2-a6,(a0) ;
126:
127: movem.l (a1)+,d1-d7/a2-a6 ; 2nd read
128:
129: movem.l d1-d7/a2-a6,48(a0) ;
130:
131: movem.l (a1)+,d1-d7/a2-a6 ; 3rd read
132:
133: movem.l d1-d7/a2-a6,96(a0) ;
134:
135: movem.l (a1)+,d1-d7/a2-a6 ; 4th read
136:
137: movem.l d1-d7/a2-a6,144(a0) ;
138:
139: movem.l (a1)+,d1-d7/a2-a6 ; 5th
140:
141: movem.l d1-d7/a2-a6,192(a0) ;
142:
143: movem.l (a1)+,d1-d7/a2-a6 ; 6th
144:
145: movem.l d1-d7/a2-a6,240(a0) ;
146:
147: movem.l (a1)+,d1-d7/a2-a6 ; 7th
148:
149: movem.l d1-d7/a2-a6,288(a0) ;
150:
151: movem.l (a1)+,d1-d7/a2-a6 ; 8th
152:
153: movem.l d1-d7/a2-a6,336(a0) ;
154:
155: movem.l (a1)+,d1-d7/a2-a6 ; 9th
156:
157: movem.l d1-d7/a2-a6,384(a0) ;
158:
159: movem.l (a1)+,d1-d7/a2-a6 ; 10th
160:
161: movem.l d1-d7/a2-a6,432(a0) ; At this point, 480 bytes done
162:
163: movem.l (a1)+,d1-d7/a2 ; Only do 32 more bytes
164:
165: movem.l d1-d7/a2,480(a0) ; for a total of 512
166:
167:
168:
169: lea 512(a0),a0
170:
171: subq.l #1,d0
172:
1.1.1.4 ! root 173: bgt.s L1
1.1 root 174:
175:
176:
177: movem.l (sp)+,d1-d7/a2-a6 ; pop registers
178:
179:
180:
181: Leftover: ; do the remaining bytes
182:
1.1.1.4 ! root 183: moveq.l #3,d0
! 184:
! 185: and.w d1,d0
1.1 root 186:
1.1.1.4 ! root 187: lsr.w #2,d1
1.1 root 188:
1.1.1.3 root 189: subq.w #1,d1 ; prepare for dbra loop
1.1 root 190:
1.1.1.4 ! root 191: bmi.s L4done
! 192:
! 193: lsr.w #1,d1
! 194:
! 195: bcc.s L23
! 196:
! 197: L2l:
! 198:
! 199: move.l (a1)+,(a0)+
! 200:
! 201: L23:
! 202:
! 203: move.l (a1)+,(a0)+
! 204:
! 205: dbra d1,L2l
! 206:
! 207: L4done:
! 208:
! 209: subq.w #1,d0 ; prepare for dbra loop
! 210:
1.1 root 211: bmi.s Ldone
212:
213: L2:
214:
215: move.b (a1)+,(a0)+
216:
1.1.1.4 ! root 217: dbra d0,L2
1.1 root 218:
219: Ldone:
220:
221: rts ; return
222:
1.1.1.4 ! root 223:
! 224:
! 225: bytecopy:
! 226:
! 227: subq.l #1,d0 ; prepare for dbra loop
! 228:
! 229: move.l d0,d1
! 230:
! 231: swap d1
! 232:
! 233: L3:
! 234:
! 235: move.b (a1)+,(a0)+
! 236:
! 237: dbra d0,L3
! 238:
! 239: dbra d1,L3
! 240:
! 241: rts ; return
! 242:
1.1 root 243: END
244:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.