MemoryUtil.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #pragma once
  2. #include "InterpreterDefs.h"
  3. namespace hybridclr
  4. {
  5. namespace interpreter
  6. {
  7. inline void Copy1(void* dst, void* src)
  8. {
  9. *(uint8_t*)dst = *(uint8_t*)src;
  10. }
  11. inline void Copy2(void* dst, void* src)
  12. {
  13. *(uint16_t*)dst = *(uint16_t*)src;
  14. }
  15. inline void Copy4(void* dst, void* src)
  16. {
  17. *(uint32_t*)dst = *(uint32_t*)src;
  18. }
  19. inline void Copy8(void* dst, void* src)
  20. {
  21. *(uint64_t*)dst = *(uint64_t*)src;
  22. }
  23. inline void Copy12(void* dst, void* src)
  24. {
  25. if (dst <= src)
  26. {
  27. *(uint64_t*)dst = *(uint64_t*)src;
  28. *(uint32_t*)((byte*)dst + 8) = *(uint32_t*)((byte*)src + 8);
  29. }
  30. else
  31. {
  32. *(uint32_t*)((byte*)dst + 8) = *(uint32_t*)((byte*)src + 8);
  33. *(uint64_t*)dst = *(uint64_t*)src;
  34. }
  35. }
  36. inline void Copy16(void* dst, void* src)
  37. {
  38. if (dst <= src)
  39. {
  40. *(uint64_t*)dst = *(uint64_t*)src;
  41. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  42. }
  43. else
  44. {
  45. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  46. *(uint64_t*)dst = *(uint64_t*)src;
  47. }
  48. }
  49. inline void Copy20(void* dst, void* src)
  50. {
  51. if (dst <= src)
  52. {
  53. *(uint64_t*)dst = *(uint64_t*)src;
  54. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  55. *(uint32_t*)((byte*)dst + 16) = *(uint32_t*)((byte*)src + 16);
  56. }
  57. else
  58. {
  59. *(uint32_t*)((byte*)dst + 16) = *(uint32_t*)((byte*)src + 16);
  60. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  61. *(uint64_t*)dst = *(uint64_t*)src;
  62. }
  63. }
  64. inline void Copy24(void* dst, void* src)
  65. {
  66. if (dst <= src)
  67. {
  68. *(uint64_t*)dst = *(uint64_t*)src;
  69. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  70. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  71. }
  72. else
  73. {
  74. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  75. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  76. *(uint64_t*)dst = *(uint64_t*)src;
  77. }
  78. }
  79. inline void Copy28(void* dst, void* src)
  80. {
  81. if (dst <= src)
  82. {
  83. *(uint64_t*)dst = *(uint64_t*)src;
  84. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  85. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  86. *(uint32_t*)((byte*)dst + 24) = *(uint32_t*)((byte*)src + 24);
  87. }
  88. else
  89. {
  90. *(uint32_t*)((byte*)dst + 24) = *(uint32_t*)((byte*)src + 24);
  91. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  92. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  93. *(uint64_t*)dst = *(uint64_t*)src;
  94. }
  95. }
  96. inline void Copy32(void* dst, void* src)
  97. {
  98. if (dst <= src)
  99. {
  100. *(uint64_t*)dst = *(uint64_t*)src;
  101. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  102. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  103. *(uint64_t*)((byte*)dst + 24) = *(uint64_t*)((byte*)src + 24);
  104. }
  105. else
  106. {
  107. *(uint64_t*)((byte*)dst + 24) = *(uint64_t*)((byte*)src + 24);
  108. *(uint64_t*)((byte*)dst + 16) = *(uint64_t*)((byte*)src + 16);
  109. *(uint64_t*)((byte*)dst + 8) = *(uint64_t*)((byte*)src + 8);
  110. *(uint64_t*)dst = *(uint64_t*)src;
  111. }
  112. }
  113. inline void CopyStackObject(StackObject* dst, void* vsrc, uint32_t count)
  114. {
  115. StackObject* src = (StackObject*)vsrc;
  116. IL2CPP_ASSERT(dst + count <= src || src + count <= dst);
  117. switch (count)
  118. {
  119. case 8: dst[7] = src[7];
  120. case 7: dst[6] = src[6];
  121. case 6: dst[5] = src[5];
  122. case 5: dst[4] = src[4];
  123. case 4: dst[3] = src[3];
  124. case 3: dst[2] = src[2];
  125. case 2: dst[1] = src[1];
  126. case 1: *dst = *src; break;
  127. case 0: break;
  128. default: std::memcpy(dst, src, count * sizeof(StackObject));
  129. }
  130. }
  131. inline void CopyBySize(void* dst, void* src, uint32_t size)
  132. {
  133. switch (size)
  134. {
  135. case 1: Copy1(dst, src); break;
  136. default: std::memmove(dst, src, size); break;
  137. }
  138. }
  139. inline void InitDefault1(void* dst)
  140. {
  141. *(uint8_t*)dst = 0;
  142. }
  143. inline void InitDefault2(void* dst)
  144. {
  145. *(uint16_t*)dst = 0;
  146. }
  147. inline void InitDefault4(void* dst)
  148. {
  149. *(uint32_t*)dst = 0;
  150. }
  151. inline void InitDefault8(void* dst)
  152. {
  153. *(uint64_t*)dst = 0;
  154. }
  155. inline void InitDefault12(void* dst)
  156. {
  157. int32_t* p = (int32_t*)dst;
  158. p[0] = 0;
  159. p[1] = 0;
  160. p[2] = 0;
  161. }
  162. inline void InitDefault16(void* dst)
  163. {
  164. *(uint64_t*)dst = 0;
  165. *(uint64_t*)((byte*)dst + 8) = 0;
  166. }
  167. inline void InitDefault20(void* dst)
  168. {
  169. int32_t* p = (int32_t*)dst;
  170. p[0] = 0;
  171. p[1] = 0;
  172. p[2] = 0;
  173. p[3] = 0;
  174. p[4] = 0;
  175. }
  176. inline void InitDefault24(void* dst)
  177. {
  178. *(uint64_t*)dst = 0;
  179. *(uint64_t*)((byte*)dst + 8) = 0;
  180. *(uint64_t*)((byte*)dst + 16) = 0;
  181. }
  182. inline void InitDefault28(void* dst)
  183. {
  184. int32_t* p = (int32_t*)dst;
  185. p[0] = 0;
  186. p[1] = 0;
  187. p[2] = 0;
  188. p[3] = 0;
  189. p[4] = 0;
  190. p[5] = 0;
  191. p[6] = 0;
  192. }
  193. inline void InitDefault32(void* dst)
  194. {
  195. *(uint64_t*)dst = 0;
  196. *(uint64_t*)((byte*)dst + 8) = 0;
  197. *(uint64_t*)((byte*)dst + 16) = 0;
  198. *(uint64_t*)((byte*)dst + 24) = 0;
  199. }
  200. inline void InitDefaultN(void* dst, size_t size)
  201. {
  202. std::memset(dst, 0, size);
  203. }
  204. }
  205. }