memcpy.S 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * linux/arch/m32r/lib/memcpy.S
  3. *
  4. * Copyright (C) 2001 Hiroyuki Kondo, and Hirokazu Takata
  5. * Copyright (C) 2004 Hirokazu Takata
  6. *
  7. * void *memcopy(void *dst, const void *src, int n);
  8. *
  9. * dst: r0
  10. * src: r1
  11. * n : r2
  12. */
  13. /* $Id$ */
  14. .text
  15. #include <linux/config.h>
  16. #include <linux/linkage.h>
  17. #include <asm/assembler.h>
  18. #ifdef CONFIG_ISA_DUAL_ISSUE
  19. .text
  20. ENTRY(memcpy)
  21. memcopy:
  22. mv r4, r0 || mv r7, r0
  23. or r7, r1 || cmpz r2
  24. jc r14 || cmpeq r0, r1 ; return if r2=0
  25. jc r14 ; return if r0=r1
  26. and3 r7, r7, #3
  27. bnez r7, byte_copy
  28. srl3 r3, r2, #2
  29. and3 r2, r2, #3
  30. beqz r3, byte_copy
  31. addi r4, #-4
  32. word_copy:
  33. ld r7, @r1+ || addi r3, #-1
  34. st r7, @+r4 || cmpz r2
  35. bnez r3, word_copy
  36. addi r4, #4 || jc r14 ; return if r2=0
  37. #if defined(CONFIG_ISA_M32R2)
  38. byte_copy:
  39. ldb r7, @r1 || addi r1, #1
  40. addi r2, #-1 || stb r7, @r4+
  41. bnez r2, byte_copy
  42. #elif defined(CONFIG_ISA_M32R)
  43. byte_copy:
  44. ldb r7, @r1 || addi r1, #1
  45. addi r2, #-1 || stb r7, @r4
  46. addi r4, #1
  47. bnez r2, byte_copy
  48. #else
  49. #error unknown isa configuration
  50. #endif
  51. end_memcopy:
  52. jmp r14
  53. #else /* not CONFIG_ISA_DUAL_ISSUE */
  54. .text
  55. ENTRY(memcpy)
  56. memcopy:
  57. mv r4, r0
  58. mv r7, r0
  59. or r7, r1
  60. beq r0, r1, end_memcopy
  61. beqz r2, end_memcopy
  62. and3 r7, r7, #3
  63. bnez r7, byte_copy
  64. srl3 r3, r2, #2
  65. and3 r2, r2, #3
  66. beqz r3, byte_copy
  67. addi r4, #-4
  68. word_copy:
  69. ld r7, @r1+
  70. addi r3, #-1
  71. st r7, @+r4
  72. bnez r3, word_copy
  73. beqz r2, end_memcopy
  74. addi r4, #4
  75. byte_copy:
  76. ldb r7, @r1
  77. addi r1, #1
  78. addi r2, #-1
  79. stb r7, @r4
  80. addi r4, #1
  81. bnez r2, byte_copy
  82. end_memcopy:
  83. jmp r14
  84. #endif /* not CONFIG_ISA_DUAL_ISSUE */
  85. .end