math.inc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. {
  2. Implementation of mathematical routines for x86_64
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2005 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. label
  12. FPC_ABSMASK_DOUBLE,
  13. FPC_ABSMASK_SINGLE;
  14. procedure dummyproc;assembler;nostackframe;
  15. asm
  16. .data
  17. .balign 16
  18. .globl FPC_ABSMASK_SINGLE
  19. FPC_ABSMASK_SINGLE:
  20. .quad 0x7FFFFFFF7FFFFFFF
  21. .quad 0x7FFFFFFF7FFFFFFF
  22. .globl FPC_ABSMASK_DOUBLE
  23. FPC_ABSMASK_DOUBLE:
  24. .quad 0x7FFFFFFFFFFFFFFF
  25. .quad 0x7FFFFFFFFFFFFFFF
  26. .text
  27. end;
  28. {****************************************************************************
  29. FPU Control word
  30. ****************************************************************************}
  31. procedure Set8087CW(cw:word);
  32. begin
  33. default8087cw:=cw;
  34. asm
  35. fnclex
  36. fldcw cw
  37. end;
  38. end;
  39. function Get8087CW:word;assembler;
  40. var
  41. tmp: word;
  42. asm
  43. fnstcw tmp
  44. movw tmp,%ax
  45. andl $0xffff,%eax { clears bits 32-63 }
  46. end;
  47. procedure SetSSECSR(w : dword);
  48. begin
  49. mxcsr:=w;
  50. asm
  51. ldmxcsr w
  52. end;
  53. end;
  54. function GetSSECSR : dword;assembler;
  55. var
  56. _w : dword;
  57. asm
  58. stmxcsr _w
  59. movl _w,%eax
  60. end;
  61. {****************************************************************************
  62. EXTENDED data type routines
  63. ****************************************************************************}
  64. {$ifndef FPC_SYSTEM_HAS_PI}
  65. {$define FPC_SYSTEM_HAS_PI}
  66. function fpc_pi_real : ValReal;compilerproc;
  67. begin
  68. { Function is handled internal in the compiler }
  69. runerror(207);
  70. result:=0;
  71. end;
  72. {$endif FPC_SYSTEM_HAS_PI}
  73. {$ifndef FPC_SYSTEM_HAS_ABS}
  74. {$define FPC_SYSTEM_HAS_ABS}
  75. function fpc_abs_real(d : ValReal) : ValReal;compilerproc;
  76. begin
  77. { Function is handled internal in the compiler }
  78. runerror(207);
  79. result:=0;
  80. end;
  81. {$endif FPC_SYSTEM_HAS_ABS}
  82. {$ifndef FPC_SYSTEM_HAS_SQR}
  83. {$define FPC_SYSTEM_HAS_SQR}
  84. function fpc_sqr_real(d : ValReal) : ValReal;compilerproc;
  85. begin
  86. { Function is handled internal in the compiler }
  87. runerror(207);
  88. result:=0;
  89. end;
  90. {$endif FPC_SYSTEM_HAS_SQR}
  91. {$ifndef FPC_SYSTEM_HAS_SQRT}
  92. {$define FPC_SYSTEM_HAS_SQRT}
  93. function fpc_sqrt_real(d : ValReal) : ValReal;compilerproc;
  94. begin
  95. { Function is handled internal in the compiler }
  96. runerror(207);
  97. result:=0;
  98. end;
  99. {$endif FPC_SYSTEM_HAS_SQRT}
  100. {$ifndef FPC_SYSTEM_HAS_ARCTAN}
  101. {$define FPC_SYSTEM_HAS_ARCTAN}
  102. function fpc_arctan_real(d : ValReal) : ValReal;compilerproc;
  103. begin
  104. { Function is handled internal in the compiler }
  105. runerror(207);
  106. result:=0;
  107. end;
  108. {$endif FPC_SYSTEM_HAS_ARCTAN}
  109. {$ifndef FPC_SYSTEM_HAS_LN}
  110. {$define FPC_SYSTEM_HAS_LN}
  111. function fpc_ln_real(d : ValReal) : ValReal;compilerproc;
  112. begin
  113. { Function is handled internal in the compiler }
  114. runerror(207);
  115. result:=0;
  116. end;
  117. {$endif FPC_SYSTEM_HAS_LN}
  118. {$ifndef FPC_SYSTEM_HAS_SIN}
  119. {$define FPC_SYSTEM_HAS_SIN}
  120. function fpc_sin_real(d : ValReal) : ValReal;compilerproc;
  121. begin
  122. { Function is handled internal in the compiler }
  123. runerror(207);
  124. result:=0;
  125. end;
  126. {$endif FPC_SYSTEM_HAS_SIN}
  127. {$ifndef FPC_SYSTEM_HAS_COS}
  128. {$define FPC_SYSTEM_HAS_COS}
  129. function fpc_cos_real(d : ValReal) : ValReal;compilerproc;
  130. begin
  131. { Function is handled internal in the compiler }
  132. runerror(207);
  133. result:=0;
  134. end;
  135. {$endif FPC_SYSTEM_HAS_COS}
  136. {$ifdef FPC_HAS_TYPE_EXTENDED}
  137. {$ifndef FPC_SYSTEM_HAS_EXP}
  138. {$define FPC_SYSTEM_HAS_EXP}
  139. function fpc_exp_real(d : ValReal) : ValReal;assembler;compilerproc;
  140. asm
  141. subq $16,%rsp
  142. // comes from DJ GPP
  143. fldt d
  144. fldl2e
  145. fmulp %st,%st(1)
  146. fstcw -2(%rbp)
  147. fstcw -4(%rbp)
  148. andw $0xf3ff,-4(%rbp)
  149. orw $0x0400,-4(%rbp)
  150. fldcw -4(%rbp)
  151. fld %st(0)
  152. frndint
  153. fldcw -2(%rbp)
  154. fxch %st(1)
  155. fsub %st(1),%st
  156. f2xm1
  157. fld1
  158. faddp %st,%st(1)
  159. fscale
  160. fstp %st(1)
  161. end;
  162. {$endif FPC_SYSTEM_HAS_EXP}
  163. {$ifndef FPC_SYSTEM_HAS_FRAC}
  164. {$define FPC_SYSTEM_HAS_FRAC}
  165. function fpc_frac_real(d : ValReal) : ValReal;assembler;compilerproc;
  166. asm
  167. subq $16,%rsp
  168. fnstcw -4(%rbp)
  169. fwait
  170. movw -4(%rbp),%cx
  171. orw $0x0c3f,%cx
  172. movw %cx,-8(%rbp)
  173. fldcw -8(%rbp)
  174. fwait
  175. fldt d
  176. frndint
  177. fldt d
  178. fsub %st(1),%st
  179. fstp %st(1)
  180. fnclex
  181. fldcw -4(%rbp)
  182. end;
  183. {$endif FPC_SYSTEM_HAS_FRAC}
  184. {$ifndef FPC_SYSTEM_HAS_INT}
  185. {$define FPC_SYSTEM_HAS_INT}
  186. function fpc_int_real(d : ValReal) : ValReal;assembler;compilerproc;
  187. asm
  188. subq $16,%rsp
  189. fnstcw -4(%rbp)
  190. fwait
  191. movw -4(%rbp),%cx
  192. orw $0x0c3f,%cx
  193. movw %cx,-8(%rbp)
  194. fldcw -8(%rbp)
  195. fwait
  196. fldt d
  197. frndint
  198. fwait
  199. fldcw -4(%rbp)
  200. end;
  201. {$endif FPC_SYSTEM_HAS_INT}
  202. {$ifndef FPC_SYSTEM_HAS_TRUNC}
  203. {$define FPC_SYSTEM_HAS_TRUNC}
  204. function fpc_trunc_real(d : ValReal) : int64;assembler;compilerproc;
  205. var
  206. oldcw,
  207. newcw : word;
  208. res : int64;
  209. asm
  210. fnstcw oldcw
  211. fwait
  212. movw oldcw,%cx
  213. orw $0x0c3f,%cx
  214. movw %cx,newcw
  215. fldcw newcw
  216. fldt d
  217. fistpq res
  218. fwait
  219. movq res,%rax
  220. fldcw oldcw
  221. end;
  222. {$endif FPC_SYSTEM_HAS_TRUNC}
  223. {$ifndef FPC_SYSTEM_HAS_ROUND}
  224. {$define FPC_SYSTEM_HAS_ROUND}
  225. function fpc_round_real(d : ValReal) : int64;assembler;compilerproc;
  226. var
  227. res : int64;
  228. asm
  229. fldt d
  230. fistpq res
  231. fwait
  232. movq res,%rax
  233. end;
  234. {$endif FPC_SYSTEM_HAS_ROUND}
  235. {$ifndef FPC_SYSTEM_HAS_POWER}
  236. {$define FPC_SYSTEM_HAS_POWER}
  237. function power(bas,expo : extended) : extended;
  238. begin
  239. if bas=0 then
  240. begin
  241. if expo<>0 then
  242. power:=0.0
  243. else
  244. HandleError(207);
  245. end
  246. else if expo=0 then
  247. power:=1
  248. else
  249. { bas < 0 is not allowed }
  250. if bas<0 then
  251. handleerror(207)
  252. else
  253. power:=exp(ln(bas)*expo);
  254. end;
  255. {$endif FPC_SYSTEM_HAS_POWER}
  256. {$endif FPC_HAS_TYPE_EXTENDED}