home *** CD-ROM | disk | FTP | other *** search
- ##
- ## vbcc-PowerPC libvc.a
- ##
- ## void *memmove(void *s1,const void *s2,size_t n)
- ## r3 r3 r4 r5
- ##
- ## v0.2 23.12.97 phx
- ## check n=0
- ## v0.1 23.11.97 phx
- ##
-
- .set BYTECPY,16 # do byte-copy for n < 16
-
- .text
- .extern memcpy
-
- .global memmove
- memmove:
- cmpwi r5,0
- beqlr
- cmplw r3,r4
- blt .memcpy # copy ascending? -> memcpy()
- add r6,r3,r5
- add r4,r4,r5
- cmplwi r5,BYTECPY
- blt .bytecpy
- extrwi r7,r6,2,30
- extrwi. r8,r4,2,30
- cmpw cr1,r7,r8 # same alignment?
- bne cr1,.2
- beq .2 # 32-bit alignment
- sub r5,r5,r7
- mtctr r7
- .1: lbzu r0,-1(r4) # copy 1-3 bytes to achieve alignment
- stbu r0,-1(r6)
- bdnz .1
- .2: srwi r7,r5,2
- mtctr r7
- .3: lwzu r0,-4(r4) # word-copy
- stwu r0,-4(r6)
- bdnz .3
- andi. r5,r5,3 # remaining bytes?
- beqlr
- .bytecpy:
- mtctr r5
- .4: lbzu r0,-1(r4)
- stbu r0,-1(r6)
- bdnz .4
- blr
- .memcpy:
- b memcpy
-
- .type memmove,@function
- .size memmove,$-memmove
-