2
0

riscv64.inc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by the Free Pascal development team.
  4. Processor dependent implementation for the system unit for
  5. RiscV64
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. { Common RiscV stuff }
  13. {$I ../riscv/riscv.inc}
  14. {****************************************************************************
  15. stack frame related stuff
  16. ****************************************************************************}
  17. {$IFNDEF INTERNAL_BACKTRACE}
  18. {$define FPC_SYSTEM_HAS_GET_FRAME}
  19. function get_frame:pointer;assembler;nostackframe;
  20. asm
  21. addi a0, fp, 0
  22. end;
  23. {$ENDIF not INTERNAL_BACKTRACE}
  24. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  25. function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler;
  26. asm
  27. ld a0, -8*1(a0)
  28. end;
  29. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  30. function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;
  31. asm
  32. ld a0, -8*2(a0)
  33. end;
  34. {$define FPC_SYSTEM_HAS_SPTR}
  35. Function Sptr : pointer;assembler;nostackframe;
  36. asm
  37. addi a0, sp, 0
  38. end;
  39. function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
  40. asm
  41. {$ifdef CPURV_HAS_ATOMIC}
  42. addi a1, x0, -1
  43. amoadd.w a0, a1, (a0)
  44. addw a0, a0, a1
  45. {$else CPURV_HAS_ATOMIC}
  46. lw a1, 0(a0)
  47. addiw a1, a1, -1
  48. sw a1, 0(a0)
  49. addi a0, a1, 0
  50. {$endif CPURV_HAS_ATOMIC}
  51. end;
  52. function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
  53. asm
  54. {$ifdef CPURV_HAS_ATOMIC}
  55. addi a1, x0, 1
  56. amoadd.w a0, a1, (a0)
  57. addw a0, a0, a1
  58. {$else CPURV_HAS_ATOMIC}
  59. lw a1, 0(a0)
  60. addiw a1, a1, 1
  61. sw a1, 0(a0)
  62. addi a0, a1, 0
  63. {$endif CPURV_HAS_ATOMIC}
  64. end;
  65. function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
  66. asm
  67. {$ifdef CPURV_HAS_ATOMIC}
  68. amoswap.w a0, a1, (a0)
  69. {$else CPURV_HAS_ATOMIC}
  70. lw a2, 0(a0)
  71. sw a1, 0(a0)
  72. addi a0, a2, 0
  73. {$endif CPURV_HAS_ATOMIC}
  74. end;
  75. function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
  76. asm
  77. {$ifdef CPURV_HAS_ATOMIC}
  78. .LLoop:
  79. lr.w a3, 0(a0)
  80. bne a3, a2, .LFail
  81. sc.w a4, a1, 0(a0)
  82. bne a4, x0, .LLoop
  83. .LFail:
  84. addi a0, a3, 0
  85. {$else CPURV_HAS_ATOMIC}
  86. lw a3, 0(a0)
  87. bne a3, a2, .LFail
  88. sw a1, 0(a0)
  89. .LFail:
  90. addi a0, a3, 0
  91. {$endif CPURV_HAS_ATOMIC}
  92. end;
  93. function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
  94. asm
  95. {$ifdef CPURV_HAS_ATOMIC}
  96. amoadd.w a0, a1, (a0)
  97. {$else CPURV_HAS_ATOMIC}
  98. lw a2, 0(a0)
  99. addw a2, a2, a1
  100. sw a2, 0(a0)
  101. addi a0, a2, 0
  102. {$endif CPURV_HAS_ATOMIC}
  103. end;
  104. function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
  105. asm
  106. {$ifdef CPURV_HAS_ATOMIC}
  107. addi a1, x0, -1
  108. amoadd.d a0, a1, (a0)
  109. add a0, a0, a1
  110. {$else CPURV_HAS_ATOMIC}
  111. ld a1, 0(a0)
  112. addi a1, a1, -1
  113. sd a1, 0(a0)
  114. addi a0, a1, 0
  115. {$endif CPURV_HAS_ATOMIC}
  116. end;
  117. function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
  118. asm
  119. {$ifdef CPURV_HAS_ATOMIC}
  120. addi a1, x0, 1
  121. amoadd.d a0, a1, (a0)
  122. add a0, a0, a1
  123. {$else CPURV_HAS_ATOMIC}
  124. ld a1, 0(a0)
  125. addi a1, a1, 1
  126. sd a1, 0(a0)
  127. addi a0, a1, 0
  128. {$endif CPURV_HAS_ATOMIC}
  129. end;
  130. function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
  131. asm
  132. {$ifdef CPURV_HAS_ATOMIC}
  133. amoswap.d a0, a1, (a0)
  134. {$else CPURV_HAS_ATOMIC}
  135. ld a2, 0(a0)
  136. sd a1, 0(a0)
  137. addi a0, a2, 0
  138. {$endif CPURV_HAS_ATOMIC}
  139. end;
  140. function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
  141. asm
  142. {$ifdef CPURV_HAS_ATOMIC}
  143. .LLoop:
  144. lr.d a3, 0(a0)
  145. bne a3, a2, .LFail
  146. sc.d a4, a1, 0(a0)
  147. bne a4, x0, .LLoop
  148. .LFail:
  149. addi a0, a3, 0
  150. {$else CPURV_HAS_ATOMIC}
  151. ld a3, 0(a0)
  152. bne a3, a2, .LFail
  153. sd a1, 0(a0)
  154. .LFail:
  155. addi a0, a3, 0
  156. {$endif CPURV_HAS_ATOMIC}
  157. end;
  158. function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
  159. asm
  160. {$ifdef CPURV_HAS_ATOMIC}
  161. amoadd.d a0, a1, (a0)
  162. {$else CPURV_HAS_ATOMIC}
  163. ld a2, 0(a0)
  164. add a2, a2, a1
  165. sd a2, 0(a0)
  166. addi a0, a2, 0
  167. {$endif CPURV_HAS_ATOMIC}
  168. end;
  169. {$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
  170. function declocked(var l: longint) : boolean; inline;
  171. begin
  172. Result:=InterLockedDecrement(l) = 0;
  173. end;
  174. {$define FPC_SYSTEM_HAS_INCLOCKED_LONGINT}
  175. procedure inclocked(var l: longint); inline;
  176. begin
  177. InterLockedIncrement(l);
  178. end;
  179. {$define FPC_SYSTEM_HAS_DECLOCKED_INT64}
  180. function declocked(var l:int64):boolean;
  181. begin
  182. Result:=InterLockedDecrement64(l) = 0;
  183. end;
  184. {$define FPC_SYSTEM_HAS_INCLOCKED_INT64}
  185. procedure inclocked(var l:int64);
  186. begin
  187. InterLockedIncrement64(l);
  188. end;
  189. {$define FPC_SYSTEM_HAS_MEM_BARRIER}
  190. procedure ReadBarrier; assembler; nostackframe;
  191. asm
  192. fence ir, ir
  193. end;
  194. procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
  195. begin
  196. end;
  197. procedure ReadWriteBarrier; assembler; nostackframe;
  198. asm
  199. fence iorw, iorw
  200. end;
  201. procedure WriteBarrier; assembler; nostackframe;
  202. asm
  203. fence ow, ow
  204. end;