MiniStdLib.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/StdLib.h>
  7. extern "C" {
  8. void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)
  9. {
  10. size_t dest = (size_t)dest_ptr;
  11. size_t src = (size_t)src_ptr;
  12. // FIXME: Support starting at an unaligned address.
  13. if (!(dest & 0x3) && !(src & 0x3) && n >= 12) {
  14. size_t size_ts = n / sizeof(size_t);
  15. #if ARCH(I386)
  16. asm volatile(
  17. "rep movsl\n"
  18. : "=S"(src), "=D"(dest)
  19. : "S"(src), "D"(dest), "c"(size_ts)
  20. : "memory");
  21. #else
  22. asm volatile(
  23. "rep movsq\n"
  24. : "=S"(src), "=D"(dest)
  25. : "S"(src), "D"(dest), "c"(size_ts)
  26. : "memory");
  27. #endif
  28. n -= size_ts * sizeof(size_t);
  29. if (n == 0)
  30. return dest_ptr;
  31. }
  32. asm volatile(
  33. "rep movsb\n" ::"S"(src), "D"(dest), "c"(n)
  34. : "memory");
  35. return dest_ptr;
  36. }
  37. void* memmove(void* dest, const void* src, size_t n)
  38. {
  39. if (dest < src)
  40. return memcpy(dest, src, n);
  41. u8* pd = (u8*)dest;
  42. const u8* ps = (const u8*)src;
  43. for (pd += n, ps += n; n--;)
  44. *--pd = *--ps;
  45. return dest;
  46. }
  47. void* memset(void* dest_ptr, int c, size_t n)
  48. {
  49. size_t dest = (size_t)dest_ptr;
  50. // FIXME: Support starting at an unaligned address.
  51. if (!(dest & 0x3) && n >= 12) {
  52. size_t size_ts = n / sizeof(size_t);
  53. size_t expanded_c = explode_byte((u8)c);
  54. #if ARCH(I386)
  55. asm volatile(
  56. "rep stosl\n"
  57. : "=D"(dest)
  58. : "D"(dest), "c"(size_ts), "a"(expanded_c)
  59. : "memory");
  60. #else
  61. asm volatile(
  62. "rep stosq\n"
  63. : "=D"(dest)
  64. : "D"(dest), "c"(size_ts), "a"(expanded_c)
  65. : "memory");
  66. #endif
  67. n -= size_ts * sizeof(size_t);
  68. if (n == 0)
  69. return dest_ptr;
  70. }
  71. asm volatile(
  72. "rep stosb\n"
  73. : "=D"(dest), "=c"(n)
  74. : "0"(dest), "1"(n), "a"(c)
  75. : "memory");
  76. return dest_ptr;
  77. }
  78. size_t strlen(const char* str)
  79. {
  80. size_t len = 0;
  81. while (*(str++))
  82. ++len;
  83. return len;
  84. }
  85. }