home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / machines / amigappc / libsrc / string / memcpy.s < prev    next >
Encoding:
Text File  |  1998-06-24  |  891 b   |  56 lines

  1. ##
  2. ## vbcc-PowerPC libvc.a
  3. ##
  4. ## void *memcpy(void *s1,const void *s2,size_t n)
  5. ## r3           r3       r4             r5
  6. ##
  7. ## v0.2 23.12.97 phx
  8. ##      check n=0
  9. ## v0.1 23.11.97 phx
  10. ##
  11.  
  12. .set    BYTECPY,16            # do byte-copy for n < 16
  13.  
  14.     .text
  15.     .global    memcpy
  16. memcpy:
  17.     cmpwi    r5,0
  18.     beqlr
  19.     mr    r6,r3
  20.     cmplwi    r5,BYTECPY
  21.     blt    .bytecpy
  22.     extrwi    r7,r6,2,30
  23.     extrwi.    r8,r4,2,30
  24.     cmpw    cr1,r7,r8        # same alignment?
  25.     bne    cr1,.1
  26.     beq    .1            # 32-bit alignment
  27.     li    r7,4
  28.     sub    r7,r7,r8
  29.     lwz    r0,0(r4)
  30.     sub    r5,r5,r7
  31.     add    r4,r4,r7
  32.     stw    r0,0(r6)        # store first bytes unaligned
  33.     add    r6,r6,r7
  34. .1:    srwi    r7,r5,2
  35.     mtctr    r7
  36.     subi    r4,r4,4
  37.     subi    r6,r6,4
  38. .2:    lwzu    r0,4(r4)        # word-copy
  39.     stwu    r0,4(r6)
  40.     bdnz    .2
  41.     andi.    r5,r5,3            # remaining bytes?
  42.     beqlr
  43.     addi    r4,r4,4
  44.     addi    r6,r6,4
  45. .bytecpy:
  46.     mtctr    r5
  47.     subi    r6,r6,1
  48.     subi    r4,r4,1
  49. .3:    lbzu    r0,1(r4)
  50.     stbu    r0,1(r6)
  51.     bdnz    .3
  52.     blr
  53.  
  54.     .type    memcpy,@function
  55.     .size    memcpy,$-memcpy
  56.