File: memcpy_P.S

package info (click to toggle)
avr-libc 20020203-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,448 kB
  • ctags: 6,562
  • sloc: ansic: 7,631; asm: 4,424; sh: 2,703; makefile: 338; pascal: 289
file content (48 lines) | stat: -rw-r--r-- 872 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

#include "macros.inc"

#define dest_hi r25
#define dest_lo r24
#define src_hi r23
#define src_lo r22
#define len_hi r21
#define len_lo r20

; void *memcpy_P(void *dest, const void flash *src, size_t len)

	.text
	.global	_U(memcpy_P)
	.type	_U(memcpy_P), @function
_U(memcpy_P):
	LOAD_Z(src_lo, src_hi)
	LOAD_X(dest_lo, dest_hi)
#if OPTIMIZE_SPEED
; 17 words, (14 + len * 9 - (len & 1)) cycles
	sbrs	len_lo, 0
	rjmp	.memcpy_P_start
	rjmp	.memcpy_P_odd
.memcpy_P_loop:
	LPM_R0_ZP
	st	X+, r0
.memcpy_P_odd:
	LPM_R0_ZP
	st	X+, r0
.memcpy_P_start:
	subi	len_lo, lo8(2)
	sbci	len_hi, hi8(2)
#else
; 12 words, (13 + len * 11) cycles
	rjmp	.memcpy_P_start
.memcpy_P_loop:
	LPM_R0_ZP
	st	X+, r0
.memcpy_P_start:
	subi	len_lo, lo8(1)
	sbci	len_hi, hi8(1)
#endif
	brcc	.memcpy_P_loop
; return dest (unchanged)
	ret
.memcpy_P_end:
	.size	_U(memcpy_P), .memcpy_P_end - _U(memcpy_P)