string_32.S 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * String handling functions for PowerPC32
  4. *
  5. * Copyright (C) 1996 Paul Mackerras.
  6. *
  7. */
  8. #include <asm/ppc_asm.h>
  9. #include <asm/export.h>
  10. #include <asm/cache.h>
  11. .text
  12. CACHELINE_BYTES = L1_CACHE_BYTES
  13. LG_CACHELINE_BYTES = L1_CACHE_SHIFT
  14. CACHELINE_MASK = (L1_CACHE_BYTES-1)
  15. _GLOBAL(__arch_clear_user)
  16. /*
  17. * Use dcbz on the complete cache lines in the destination
  18. * to set them to zero. This requires that the destination
  19. * area is cacheable.
  20. */
  21. cmplwi cr0, r4, 4
  22. mr r10, r3
  23. li r3, 0
  24. blt 7f
  25. 11: stw r3, 0(r10)
  26. beqlr
  27. andi. r0, r10, 3
  28. add r11, r0, r4
  29. subf r6, r0, r10
  30. clrlwi r7, r6, 32 - LG_CACHELINE_BYTES
  31. add r8, r7, r11
  32. srwi r9, r8, LG_CACHELINE_BYTES
  33. addic. r9, r9, -1 /* total number of complete cachelines */
  34. ble 2f
  35. xori r0, r7, CACHELINE_MASK & ~3
  36. srwi. r0, r0, 2
  37. beq 3f
  38. mtctr r0
  39. 4: stwu r3, 4(r6)
  40. bdnz 4b
  41. 3: mtctr r9
  42. li r7, 4
  43. 10: dcbz r7, r6
  44. addi r6, r6, CACHELINE_BYTES
  45. bdnz 10b
  46. clrlwi r11, r8, 32 - LG_CACHELINE_BYTES
  47. addi r11, r11, 4
  48. 2: srwi r0 ,r11 ,2
  49. mtctr r0
  50. bdz 6f
  51. 1: stwu r3, 4(r6)
  52. bdnz 1b
  53. 6: andi. r11, r11, 3
  54. beqlr
  55. mtctr r11
  56. addi r6, r6, 3
  57. 8: stbu r3, 1(r6)
  58. bdnz 8b
  59. blr
  60. 7: cmpwi cr0, r4, 0
  61. beqlr
  62. mtctr r4
  63. addi r6, r10, -1
  64. 9: stbu r3, 1(r6)
  65. bdnz 9b
  66. blr
  67. 90: mr r3, r4
  68. blr
  69. 91: add r3, r10, r4
  70. subf r3, r6, r3
  71. blr
  72. EX_TABLE(11b, 90b)
  73. EX_TABLE(4b, 91b)
  74. EX_TABLE(10b, 91b)
  75. EX_TABLE(1b, 91b)
  76. EX_TABLE(8b, 91b)
  77. EX_TABLE(9b, 91b)
  78. EXPORT_SYMBOL(__arch_clear_user)