memcpy.S 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/linkage.h>
  16. #include <asm/assembler.h>
  17. #ifdef CONFIG_ISA_DUAL_ISSUE
  18. .text
  19. ENTRY(memcpy)
  20. memcopy:
  21. mv r4, r0 || mv r7, r0
  22. or r7, r1 || cmpz r2
  23. jc r14 || cmpeq r0, r1 ; return if r2=0
  24. jc r14 ; return if r0=r1
  25. and3 r7, r7, #3
  26. bnez r7, byte_copy
  27. srl3 r3, r2, #2
  28. and3 r2, r2, #3
  29. beqz r3, byte_copy
  30. addi r4, #-4
  31. word_copy:
  32. ld r7, @r1+ || addi r3, #-1
  33. st r7, @+r4 || cmpz r2
  34. bnez r3, word_copy
  35. addi r4, #4 || jc r14 ; return if r2=0
  36. #if defined(CONFIG_ISA_M32R2)
  37. byte_copy:
  38. ldb r7, @r1 || addi r1, #1
  39. addi r2, #-1 || stb r7, @r4+
  40. bnez r2, byte_copy
  41. #elif defined(CONFIG_ISA_M32R)
  42. byte_copy:
  43. ldb r7, @r1 || addi r1, #1
  44. addi r2, #-1 || stb r7, @r4
  45. addi r4, #1
  46. bnez r2, byte_copy
  47. #else
  48. #error unknown isa configuration
  49. #endif
  50. end_memcopy:
  51. jmp r14
  52. #else /* not CONFIG_ISA_DUAL_ISSUE */
  53. .text
  54. ENTRY(memcpy)
  55. memcopy:
  56. mv r4, r0
  57. mv r7, r0
  58. or r7, r1
  59. beq r0, r1, end_memcopy
  60. beqz r2, end_memcopy
  61. and3 r7, r7, #3
  62. bnez r7, byte_copy
  63. srl3 r3, r2, #2
  64. and3 r2, r2, #3
  65. beqz r3, byte_copy
  66. addi r4, #-4
  67. word_copy:
  68. ld r7, @r1+
  69. addi r3, #-1
  70. st r7, @+r4
  71. bnez r3, word_copy
  72. beqz r2, end_memcopy
  73. addi r4, #4
  74. byte_copy:
  75. ldb r7, @r1
  76. addi r1, #1
  77. addi r2, #-1
  78. stb r7, @r4
  79. addi r4, #1
  80. bnez r2, byte_copy
  81. end_memcopy:
  82. jmp r14
  83. #endif /* not CONFIG_ISA_DUAL_ISSUE */
  84. .end