sim-bits.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /* The common simulator framework for GDB, the GNU Debugger.
  2. Copyright 2002-2015 Free Software Foundation, Inc.
  3. Contributed by Andrew Cagney and Red Hat.
  4. This file is part of GDB.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  15. #ifndef _SIM_BITS_C_
  16. #define _SIM_BITS_C_
  17. #include "sim-basics.h"
  18. #include "sim-assert.h"
  19. #include "sim-io.h"
  20. INLINE_SIM_BITS\
  21. (unsigned_word)
  22. LSMASKED (unsigned_word val,
  23. int start,
  24. int stop)
  25. {
  26. /* NOTE - start, stop can wrap */
  27. val &= LSMASK (start, stop);
  28. return val;
  29. }
  30. INLINE_SIM_BITS\
  31. (unsigned_word)
  32. MSMASKED (unsigned_word val,
  33. int start,
  34. int stop)
  35. {
  36. /* NOTE - start, stop can wrap */
  37. val &= MSMASK (start, stop);
  38. return val;
  39. }
  40. INLINE_SIM_BITS\
  41. (unsigned_word)
  42. LSEXTRACTED (unsigned_word val,
  43. int start,
  44. int stop)
  45. {
  46. ASSERT (start >= stop);
  47. #if (WITH_TARGET_WORD_BITSIZE == 64)
  48. return LSEXTRACTED64 (val, start, stop);
  49. #endif
  50. #if (WITH_TARGET_WORD_BITSIZE == 32)
  51. if (stop >= 32)
  52. return 0;
  53. else
  54. {
  55. if (start < 32)
  56. val &= LSMASK (start, 0);
  57. val >>= stop;
  58. return val;
  59. }
  60. #endif
  61. #if (WITH_TARGET_WORD_BITSIZE == 16)
  62. if (stop >= 16)
  63. return 0;
  64. else
  65. {
  66. if (start < 16)
  67. val &= LSMASK (start, 0);
  68. val >>= stop;
  69. return val;
  70. }
  71. #endif
  72. }
  73. INLINE_SIM_BITS\
  74. (unsigned_word)
  75. MSEXTRACTED (unsigned_word val,
  76. int start,
  77. int stop)
  78. {
  79. ASSERT (start <= stop);
  80. #if (WITH_TARGET_WORD_BITSIZE == 64)
  81. return MSEXTRACTED64 (val, start, stop);
  82. #endif
  83. #if (WITH_TARGET_WORD_BITSIZE == 32)
  84. if (stop < 32)
  85. return 0;
  86. else
  87. {
  88. if (start >= 32)
  89. val &= MSMASK (start, 64 - 1);
  90. val >>= (64 - stop - 1);
  91. return val;
  92. }
  93. #endif
  94. #if (WITH_TARGET_WORD_BITSIZE == 16)
  95. if (stop < 16)
  96. return 0;
  97. else
  98. {
  99. if (start >= 16)
  100. val &= MSMASK (start, 64 - 1);
  101. val >>= (64 - stop - 1);
  102. return val;
  103. }
  104. #endif
  105. }
  106. INLINE_SIM_BITS\
  107. (unsigned_word)
  108. LSINSERTED (unsigned_word val,
  109. int start,
  110. int stop)
  111. {
  112. ASSERT (start >= stop);
  113. #if (WITH_TARGET_WORD_BITSIZE == 64)
  114. return LSINSERTED64 (val, start, stop);
  115. #endif
  116. #if (WITH_TARGET_WORD_BITSIZE == 32)
  117. /* Bit numbers are 63..0, even for 32 bit targets.
  118. On 32 bit targets we ignore 63..32 */
  119. if (stop >= 32)
  120. return 0;
  121. else
  122. {
  123. val <<= stop;
  124. val &= LSMASK (start, stop);
  125. return val;
  126. }
  127. #endif
  128. #if (WITH_TARGET_WORD_BITSIZE == 16)
  129. /* Bit numbers are 63..0, even for 16 bit targets.
  130. On 16 bit targets we ignore 63..16 */
  131. if (stop >= 16)
  132. return 0;
  133. else
  134. {
  135. val <<= stop;
  136. val &= LSMASK (start, stop);
  137. return val;
  138. }
  139. #endif
  140. }
  141. INLINE_SIM_BITS\
  142. (unsigned_word)
  143. MSINSERTED (unsigned_word val,
  144. int start,
  145. int stop)
  146. {
  147. ASSERT (start <= stop);
  148. #if (WITH_TARGET_WORD_BITSIZE == 64)
  149. return MSINSERTED64 (val, start, stop);
  150. #endif
  151. #if (WITH_TARGET_WORD_BITSIZE == 32)
  152. /* Bit numbers are 0..63, even for 32 bit targets.
  153. On 32 bit targets we ignore 0..31. */
  154. if (stop < 32)
  155. return 0;
  156. else
  157. {
  158. val <<= ((64 - 1) - stop);
  159. val &= MSMASK (start, stop);
  160. return val;
  161. }
  162. #endif
  163. #if (WITH_TARGET_WORD_BITSIZE == 16)
  164. /* Bit numbers are 0..63, even for 16 bit targets.
  165. On 16 bit targets we ignore 0..47. */
  166. if (stop < 32 + 16)
  167. return 0;
  168. else
  169. {
  170. val <<= ((64 - 1) - stop);
  171. val &= MSMASK (start, stop);
  172. return val;
  173. }
  174. #endif
  175. }
  176. INLINE_SIM_BITS\
  177. (unsigned_word)
  178. LSSEXT (signed_word val,
  179. int sign_bit)
  180. {
  181. ASSERT (sign_bit < 64);
  182. #if (WITH_TARGET_WORD_BITSIZE == 64)
  183. return LSSEXT64 (val, sign_bit);
  184. #endif
  185. #if (WITH_TARGET_WORD_BITSIZE == 32)
  186. if (sign_bit >= 32)
  187. return val;
  188. else {
  189. val = LSSEXT32 (val, sign_bit);
  190. return val;
  191. }
  192. #endif
  193. #if (WITH_TARGET_WORD_BITSIZE == 16)
  194. if (sign_bit >= 16)
  195. return val;
  196. else {
  197. val = LSSEXT16 (val, sign_bit);
  198. return val;
  199. }
  200. #endif
  201. }
  202. INLINE_SIM_BITS\
  203. (unsigned_word)
  204. MSSEXT (signed_word val,
  205. int sign_bit)
  206. {
  207. ASSERT (sign_bit < 64);
  208. #if (WITH_TARGET_WORD_BITSIZE == 64)
  209. return MSSEXT64 (val, sign_bit);
  210. #endif
  211. #if (WITH_TARGET_WORD_BITSIZE == 32)
  212. if (sign_bit < 32)
  213. return val;
  214. else {
  215. val = MSSEXT32 (val, sign_bit - 32);
  216. return val;
  217. }
  218. #endif
  219. #if (WITH_TARGET_WORD_BITSIZE == 16)
  220. if (sign_bit < 32 + 16)
  221. return val;
  222. else {
  223. val = MSSEXT16 (val, sign_bit - 32 - 16);
  224. return val;
  225. }
  226. #endif
  227. }
  228. #define N 8
  229. #include "sim-n-bits.h"
  230. #undef N
  231. #define N 16
  232. #include "sim-n-bits.h"
  233. #undef N
  234. #define N 32
  235. #include "sim-n-bits.h"
  236. #undef N
  237. #define N 64
  238. #include "sim-n-bits.h"
  239. #undef N
  240. #endif /* _SIM_BITS_C_ */